From 938929bfe75a53c07f707a8cc687522562ee8664 Mon Sep 17 00:00:00 2001 From: Yorgos Saslis Date: Thu, 28 Nov 2024 17:20:26 +0200 Subject: [PATCH 1/9] adds necessary sources from product build Signed-off-by: Yorgos Saslis --- .../gateway-rockspecs-native/.gitignore | 1 + .../gateway-rockspecs-native/Dockerfile | 16 + .../gateway-rockspecs-native/Makefile | 45 + .../gateway-rockspecs-native.spec | 172 + .../gateway-rockspecs-native/licenses.xml | 18 + .../rpm-specs/gateway-rockspecs/.gitignore | 3 + .../rpm-specs/gateway-rockspecs/Dockerfile | 22 + .../rpm-specs/gateway-rockspecs/Makefile | 55 + .../gateway-rockspecs/gateway-rockspecs.spec | 266 + .../rpm-specs/gateway-rockspecs/licenses.xml | 137 + .../rpm-specs/gateway-rockspecs/rockspecs | 17 + dependencies/rpm-specs/luarocks/luarocks.spec | 184 + .../openresty-pcre/openresty-pcre.spec | 136 + .../openresty-pcre/sources/pcre-8.44/132html | 313 + .../openresty-pcre/sources/pcre-8.44/AUTHORS | 45 + .../sources/pcre-8.44/CMakeLists.txt | 1012 + .../openresty-pcre/sources/pcre-8.44/COPYING | 5 + .../sources/pcre-8.44/ChangeLog | 6229 +++++ .../openresty-pcre/sources/pcre-8.44/CheckMan | 67 + .../openresty-pcre/sources/pcre-8.44/CleanTxt | 113 + .../openresty-pcre/sources/pcre-8.44/Detrail | 35 + .../openresty-pcre/sources/pcre-8.44/HACKING | 528 + .../openresty-pcre/sources/pcre-8.44/INSTALL | 368 + .../openresty-pcre/sources/pcre-8.44/LICENCE | 93 + .../sources/pcre-8.44/Makefile.am | 895 + .../sources/pcre-8.44/Makefile.in | 3546 +++ .../openresty-pcre/sources/pcre-8.44/NEWS | 759 + .../sources/pcre-8.44/NON-AUTOTOOLS-BUILD | 773 + .../sources/pcre-8.44/NON-UNIX-USE | 7 + .../sources/pcre-8.44/PrepareRelease | 258 + .../openresty-pcre/sources/pcre-8.44/README | 1003 + .../sources/pcre-8.44/RunGrepTest | 593 + .../openresty-pcre/sources/pcre-8.44/RunTest | 1014 + .../sources/pcre-8.44/RunTest.bat | 616 + .../sources/pcre-8.44/aclocal.m4 | 1546 ++ .../openresty-pcre/sources/pcre-8.44/ar-lib | 270 + .../pcre-8.44/cmake/COPYING-CMAKE-SCRIPTS | 22 + .../pcre-8.44/cmake/FindEditline.cmake | 17 + .../cmake/FindPackageHandleStandardArgs.cmake | 58 + .../pcre-8.44/cmake/FindReadline.cmake | 29 + .../openresty-pcre/sources/pcre-8.44/compile | 348 + .../sources/pcre-8.44/config-cmake.h.in | 57 + .../sources/pcre-8.44/config.guess | 1476 + .../sources/pcre-8.44/config.h.generic | 349 + .../sources/pcre-8.44/config.h.in | 347 + .../sources/pcre-8.44/config.sub | 1801 ++ .../sources/pcre-8.44/configure | 22875 ++++++++++++++++ .../sources/pcre-8.44/configure.ac | 1126 + .../openresty-pcre/sources/pcre-8.44/depcomp | 791 + .../sources/pcre-8.44/dftables.c | 212 + .../doc/html/NON-AUTOTOOLS-BUILD.txt | 773 + .../sources/pcre-8.44/doc/html/README.txt | 1003 + .../sources/pcre-8.44/doc/html/index.html | 185 + .../pcre-8.44/doc/html/pcre-config.html | 109 + .../sources/pcre-8.44/doc/html/pcre.html | 224 + .../sources/pcre-8.44/doc/html/pcre16.html | 384 + .../sources/pcre-8.44/doc/html/pcre32.html | 382 + .../doc/html/pcre_assign_jit_stack.html | 76 + .../pcre-8.44/doc/html/pcre_compile.html | 111 + .../pcre-8.44/doc/html/pcre_compile2.html | 115 + .../pcre-8.44/doc/html/pcre_config.html | 94 + .../doc/html/pcre_copy_named_substring.html | 65 + .../doc/html/pcre_copy_substring.html | 61 + .../pcre-8.44/doc/html/pcre_dfa_exec.html | 129 + .../sources/pcre-8.44/doc/html/pcre_exec.html | 111 + .../pcre-8.44/doc/html/pcre_free_study.html | 46 + .../doc/html/pcre_free_substring.html | 46 + .../doc/html/pcre_free_substring_list.html | 46 + .../pcre-8.44/doc/html/pcre_fullinfo.html | 118 + .../doc/html/pcre_get_named_substring.html | 68 + .../doc/html/pcre_get_stringnumber.html | 57 + .../html/pcre_get_stringtable_entries.html | 60 + .../doc/html/pcre_get_substring.html | 64 + .../doc/html/pcre_get_substring_list.html | 61 + .../pcre-8.44/doc/html/pcre_jit_exec.html | 108 + .../doc/html/pcre_jit_stack_alloc.html | 55 + .../doc/html/pcre_jit_stack_free.html | 48 + .../pcre-8.44/doc/html/pcre_maketables.html | 48 + .../html/pcre_pattern_to_host_byte_order.html | 58 + .../pcre-8.44/doc/html/pcre_refcount.html | 51 + .../pcre-8.44/doc/html/pcre_study.html | 68 + .../html/pcre_utf16_to_host_byte_order.html | 57 + .../html/pcre_utf32_to_host_byte_order.html | 57 + .../pcre-8.44/doc/html/pcre_version.html | 46 + .../sources/pcre-8.44/doc/html/pcreapi.html | 2921 ++ .../sources/pcre-8.44/doc/html/pcrebuild.html | 534 + .../pcre-8.44/doc/html/pcrecallout.html | 286 + .../pcre-8.44/doc/html/pcrecompat.html | 235 + .../sources/pcre-8.44/doc/html/pcrecpp.html | 368 + .../sources/pcre-8.44/doc/html/pcredemo.html | 426 + .../sources/pcre-8.44/doc/html/pcregrep.html | 759 + .../sources/pcre-8.44/doc/html/pcrejit.html | 499 + .../pcre-8.44/doc/html/pcrelimits.html | 90 + .../pcre-8.44/doc/html/pcrematching.html | 242 + .../pcre-8.44/doc/html/pcrepartial.html | 509 + .../pcre-8.44/doc/html/pcrepattern.html | 3276 +++ .../pcre-8.44/doc/html/pcreperform.html | 195 + .../sources/pcre-8.44/doc/html/pcreposix.html | 290 + .../pcre-8.44/doc/html/pcreprecompile.html | 163 + .../pcre-8.44/doc/html/pcresample.html | 110 + .../sources/pcre-8.44/doc/html/pcrestack.html | 225 + .../pcre-8.44/doc/html/pcresyntax.html | 561 + .../sources/pcre-8.44/doc/html/pcretest.html | 1161 + .../pcre-8.44/doc/html/pcreunicode.html | 262 + .../sources/pcre-8.44/doc/index.html.src | 185 + .../sources/pcre-8.44/doc/pcre-config.1 | 92 + .../sources/pcre-8.44/doc/pcre-config.txt | 86 + .../sources/pcre-8.44/doc/pcre.3 | 230 + .../sources/pcre-8.44/doc/pcre.txt | 10495 +++++++ .../sources/pcre-8.44/doc/pcre16.3 | 371 + .../sources/pcre-8.44/doc/pcre32.3 | 369 + .../pcre-8.44/doc/pcre_assign_jit_stack.3 | 59 + .../sources/pcre-8.44/doc/pcre_compile.3 | 96 + .../sources/pcre-8.44/doc/pcre_compile2.3 | 101 + .../sources/pcre-8.44/doc/pcre_config.3 | 79 + .../pcre-8.44/doc/pcre_copy_named_substring.3 | 51 + .../pcre-8.44/doc/pcre_copy_substring.3 | 47 + .../sources/pcre-8.44/doc/pcre_dfa_exec.3 | 118 + .../sources/pcre-8.44/doc/pcre_exec.3 | 99 + .../sources/pcre-8.44/doc/pcre_free_study.3 | 31 + .../pcre-8.44/doc/pcre_free_substring.3 | 31 + .../pcre-8.44/doc/pcre_free_substring_list.3 | 31 + .../sources/pcre-8.44/doc/pcre_fullinfo.3 | 103 + .../pcre-8.44/doc/pcre_get_named_substring.3 | 54 + .../pcre-8.44/doc/pcre_get_stringnumber.3 | 43 + .../doc/pcre_get_stringtable_entries.3 | 46 + .../pcre-8.44/doc/pcre_get_substring.3 | 50 + .../pcre-8.44/doc/pcre_get_substring_list.3 | 47 + .../sources/pcre-8.44/doc/pcre_jit_exec.3 | 96 + .../pcre-8.44/doc/pcre_jit_stack_alloc.3 | 43 + .../pcre-8.44/doc/pcre_jit_stack_free.3 | 35 + .../sources/pcre-8.44/doc/pcre_maketables.3 | 33 + .../doc/pcre_pattern_to_host_byte_order.3 | 44 + .../sources/pcre-8.44/doc/pcre_refcount.3 | 36 + .../sources/pcre-8.44/doc/pcre_study.3 | 54 + .../doc/pcre_utf16_to_host_byte_order.3 | 45 + .../doc/pcre_utf32_to_host_byte_order.3 | 45 + .../sources/pcre-8.44/doc/pcre_version.3 | 31 + .../sources/pcre-8.44/doc/pcreapi.3 | 2918 ++ .../sources/pcre-8.44/doc/pcrebuild.3 | 550 + .../sources/pcre-8.44/doc/pcrecallout.3 | 255 + .../sources/pcre-8.44/doc/pcrecompat.3 | 200 + .../sources/pcre-8.44/doc/pcrecpp.3 | 348 + .../sources/pcre-8.44/doc/pcredemo.3 | 424 + .../sources/pcre-8.44/doc/pcregrep.1 | 683 + .../sources/pcre-8.44/doc/pcregrep.txt | 741 + .../sources/pcre-8.44/doc/pcrejit.3 | 473 + .../sources/pcre-8.44/doc/pcrelimits.3 | 71 + .../sources/pcre-8.44/doc/pcrematching.3 | 214 + .../sources/pcre-8.44/doc/pcrepartial.3 | 476 + .../sources/pcre-8.44/doc/pcrepattern.3 | 3304 +++ .../sources/pcre-8.44/doc/pcreperform.3 | 177 + .../sources/pcre-8.44/doc/pcreposix.3 | 267 + .../sources/pcre-8.44/doc/pcreprecompile.3 | 155 + .../sources/pcre-8.44/doc/pcresample.3 | 99 + .../sources/pcre-8.44/doc/pcrestack.3 | 215 + .../sources/pcre-8.44/doc/pcresyntax.3 | 540 + .../sources/pcre-8.44/doc/pcretest.1 | 1158 + .../sources/pcre-8.44/doc/pcretest.txt | 1087 + .../sources/pcre-8.44/doc/pcreunicode.3 | 249 + .../sources/pcre-8.44/doc/perltest.txt | 42 + .../sources/pcre-8.44/install-sh | 518 + .../sources/pcre-8.44/libpcre.pc.in | 13 + .../sources/pcre-8.44/libpcre16.pc.in | 13 + .../sources/pcre-8.44/libpcre32.pc.in | 13 + .../sources/pcre-8.44/libpcrecpp.pc.in | 12 + .../sources/pcre-8.44/libpcreposix.pc.in | 13 + .../sources/pcre-8.44/ltmain.sh | 11369 ++++++++ .../sources/pcre-8.44/m4/ax_pthread.m4 | 309 + .../sources/pcre-8.44/m4/libtool.m4 | 8393 ++++++ .../sources/pcre-8.44/m4/ltoptions.m4 | 437 + .../sources/pcre-8.44/m4/ltsugar.m4 | 124 + .../sources/pcre-8.44/m4/ltversion.m4 | 23 + .../sources/pcre-8.44/m4/lt~obsolete.m4 | 99 + .../sources/pcre-8.44/m4/pcre_visibility.m4 | 89 + .../sources/pcre-8.44/makevp.bat | 66 + .../sources/pcre-8.44/makevp_c.txt | 21 + .../sources/pcre-8.44/makevp_l.txt | 21 + .../openresty-pcre/sources/pcre-8.44/missing | 215 + .../sources/pcre-8.44/pcre-config.in | 133 + .../sources/pcre-8.44/pcre.h.generic | 677 + .../sources/pcre-8.44/pcre.h.in | 677 + .../sources/pcre-8.44/pcre16_byte_order.c | 45 + .../sources/pcre-8.44/pcre16_chartables.c | 45 + .../sources/pcre-8.44/pcre16_compile.c | 45 + .../sources/pcre-8.44/pcre16_config.c | 45 + .../sources/pcre-8.44/pcre16_dfa_exec.c | 45 + .../sources/pcre-8.44/pcre16_exec.c | 45 + .../sources/pcre-8.44/pcre16_fullinfo.c | 45 + .../sources/pcre-8.44/pcre16_get.c | 45 + .../sources/pcre-8.44/pcre16_globals.c | 45 + .../sources/pcre-8.44/pcre16_jit_compile.c | 45 + .../sources/pcre-8.44/pcre16_maketables.c | 45 + .../sources/pcre-8.44/pcre16_newline.c | 45 + .../sources/pcre-8.44/pcre16_ord2utf16.c | 90 + .../sources/pcre-8.44/pcre16_printint.c | 45 + .../sources/pcre-8.44/pcre16_refcount.c | 45 + .../sources/pcre-8.44/pcre16_string_utils.c | 45 + .../sources/pcre-8.44/pcre16_study.c | 45 + .../sources/pcre-8.44/pcre16_tables.c | 45 + .../sources/pcre-8.44/pcre16_ucd.c | 45 + .../sources/pcre-8.44/pcre16_utf16_utils.c | 130 + .../sources/pcre-8.44/pcre16_valid_utf16.c | 137 + .../sources/pcre-8.44/pcre16_version.c | 45 + .../sources/pcre-8.44/pcre16_xclass.c | 45 + .../sources/pcre-8.44/pcre32_byte_order.c | 45 + .../sources/pcre-8.44/pcre32_chartables.c | 45 + .../sources/pcre-8.44/pcre32_compile.c | 45 + .../sources/pcre-8.44/pcre32_config.c | 45 + .../sources/pcre-8.44/pcre32_dfa_exec.c | 45 + .../sources/pcre-8.44/pcre32_exec.c | 45 + .../sources/pcre-8.44/pcre32_fullinfo.c | 45 + .../sources/pcre-8.44/pcre32_get.c | 45 + .../sources/pcre-8.44/pcre32_globals.c | 45 + .../sources/pcre-8.44/pcre32_jit_compile.c | 45 + .../sources/pcre-8.44/pcre32_maketables.c | 45 + .../sources/pcre-8.44/pcre32_newline.c | 45 + .../sources/pcre-8.44/pcre32_ord2utf32.c | 82 + .../sources/pcre-8.44/pcre32_printint.c | 45 + .../sources/pcre-8.44/pcre32_refcount.c | 45 + .../sources/pcre-8.44/pcre32_string_utils.c | 45 + .../sources/pcre-8.44/pcre32_study.c | 45 + .../sources/pcre-8.44/pcre32_tables.c | 45 + .../sources/pcre-8.44/pcre32_ucd.c | 45 + .../sources/pcre-8.44/pcre32_utf32_utils.c | 141 + .../sources/pcre-8.44/pcre32_valid_utf32.c | 124 + .../sources/pcre-8.44/pcre32_version.c | 45 + .../sources/pcre-8.44/pcre32_xclass.c | 45 + .../sources/pcre-8.44/pcre_byte_order.c | 319 + .../sources/pcre-8.44/pcre_chartables.c.dist | 198 + .../sources/pcre-8.44/pcre_compile.c | 9807 +++++++ .../sources/pcre-8.44/pcre_config.c | 190 + .../sources/pcre-8.44/pcre_dfa_exec.c | 3676 +++ .../sources/pcre-8.44/pcre_exec.c | 7173 +++++ .../sources/pcre-8.44/pcre_fullinfo.c | 245 + .../sources/pcre-8.44/pcre_get.c | 669 + .../sources/pcre-8.44/pcre_globals.c | 86 + .../sources/pcre-8.44/pcre_internal.h | 2807 ++ .../sources/pcre-8.44/pcre_jit_compile.c | 11913 ++++++++ .../sources/pcre-8.44/pcre_jit_test.c | 1765 ++ .../sources/pcre-8.44/pcre_maketables.c | 156 + .../sources/pcre-8.44/pcre_newline.c | 210 + .../sources/pcre-8.44/pcre_ord2utf8.c | 94 + .../sources/pcre-8.44/pcre_printint.c | 834 + .../sources/pcre-8.44/pcre_refcount.c | 92 + .../sources/pcre-8.44/pcre_scanner.cc | 199 + .../sources/pcre-8.44/pcre_scanner.h | 172 + .../pcre-8.44/pcre_scanner_unittest.cc | 162 + .../sources/pcre-8.44/pcre_string_utils.c | 211 + .../sources/pcre-8.44/pcre_stringpiece.cc | 43 + .../sources/pcre-8.44/pcre_stringpiece.h.in | 180 + .../pcre-8.44/pcre_stringpiece_unittest.cc | 153 + .../sources/pcre-8.44/pcre_study.c | 1686 ++ .../sources/pcre-8.44/pcre_tables.c | 727 + .../sources/pcre-8.44/pcre_ucd.c | 3644 +++ .../sources/pcre-8.44/pcre_valid_utf8.c | 301 + .../sources/pcre-8.44/pcre_version.c | 98 + .../sources/pcre-8.44/pcre_xclass.c | 268 + .../sources/pcre-8.44/pcrecpp.cc | 986 + .../sources/pcre-8.44/pcrecpp.h | 710 + .../sources/pcre-8.44/pcrecpp_internal.h | 71 + .../sources/pcre-8.44/pcrecpp_unittest.cc | 1316 + .../sources/pcre-8.44/pcrecpparg.h.in | 174 + .../sources/pcre-8.44/pcredemo.c | 406 + .../sources/pcre-8.44/pcregexp.pas | 845 + .../sources/pcre-8.44/pcregrep.c | 3365 +++ .../sources/pcre-8.44/pcreposix.c | 431 + .../sources/pcre-8.44/pcreposix.h | 146 + .../sources/pcre-8.44/pcretest.c | 5773 ++++ .../sources/pcre-8.44/perltest.pl | 242 + .../sources/pcre-8.44/sljit/sljitConfig.h | 147 + .../pcre-8.44/sljit/sljitConfigInternal.h | 745 + .../pcre-8.44/sljit/sljitExecAllocator.c | 379 + .../sources/pcre-8.44/sljit/sljitLir.c | 2667 ++ .../sources/pcre-8.44/sljit/sljitLir.h | 1493 + .../pcre-8.44/sljit/sljitNativeARM_32.c | 2734 ++ .../pcre-8.44/sljit/sljitNativeARM_64.c | 2035 ++ .../pcre-8.44/sljit/sljitNativeARM_T2_32.c | 2370 ++ .../pcre-8.44/sljit/sljitNativeMIPS_32.c | 673 + .../pcre-8.44/sljit/sljitNativeMIPS_64.c | 675 + .../pcre-8.44/sljit/sljitNativeMIPS_common.c | 2286 ++ .../pcre-8.44/sljit/sljitNativePPC_32.c | 278 + .../pcre-8.44/sljit/sljitNativePPC_64.c | 499 + .../pcre-8.44/sljit/sljitNativePPC_common.c | 2395 ++ .../pcre-8.44/sljit/sljitNativeSPARC_32.c | 286 + .../pcre-8.44/sljit/sljitNativeSPARC_common.c | 1536 ++ .../sljit/sljitNativeTILEGX-encoder.c | 10159 +++++++ .../pcre-8.44/sljit/sljitNativeTILEGX_64.c | 2555 ++ .../pcre-8.44/sljit/sljitNativeX86_32.c | 896 + .../pcre-8.44/sljit/sljitNativeX86_64.c | 900 + .../pcre-8.44/sljit/sljitNativeX86_common.c | 2940 ++ .../sources/pcre-8.44/sljit/sljitUtils.c | 339 + .../sources/pcre-8.44/test-driver | 148 + .../sources/pcre-8.44/testdata/grepbinary | Bin 0 -> 45 bytes .../sources/pcre-8.44/testdata/grepfilelist | 3 + .../sources/pcre-8.44/testdata/grepinput | 611 + .../sources/pcre-8.44/testdata/grepinput3 | 15 + .../sources/pcre-8.44/testdata/grepinput8 | 11 + .../sources/pcre-8.44/testdata/grepinputv | 4 + .../sources/pcre-8.44/testdata/grepinputx | 43 + .../sources/pcre-8.44/testdata/greplist | 7 + .../sources/pcre-8.44/testdata/grepoutput | 757 + .../sources/pcre-8.44/testdata/grepoutput8 | 12 + .../sources/pcre-8.44/testdata/grepoutputN | 16 + .../sources/pcre-8.44/testdata/greppatN4 | 2 + .../sources/pcre-8.44/testdata/saved16 | Bin 0 -> 86 bytes .../sources/pcre-8.44/testdata/saved16BE-1 | Bin 0 -> 418 bytes .../sources/pcre-8.44/testdata/saved16BE-2 | Bin 0 -> 344 bytes .../sources/pcre-8.44/testdata/saved16LE-1 | Bin 0 -> 418 bytes .../sources/pcre-8.44/testdata/saved16LE-2 | Bin 0 -> 344 bytes .../sources/pcre-8.44/testdata/saved32 | Bin 0 -> 108 bytes .../sources/pcre-8.44/testdata/saved32BE-1 | Bin 0 -> 560 bytes .../sources/pcre-8.44/testdata/saved32BE-2 | Bin 0 -> 456 bytes .../sources/pcre-8.44/testdata/saved32LE-1 | Bin 0 -> 560 bytes .../sources/pcre-8.44/testdata/saved32LE-2 | Bin 0 -> 456 bytes .../sources/pcre-8.44/testdata/saved8 | Bin 0 -> 77 bytes .../sources/pcre-8.44/testdata/testinput1 | 5760 ++++ .../sources/pcre-8.44/testdata/testinput10 | 1419 + .../sources/pcre-8.44/testdata/testinput11 | 143 + .../sources/pcre-8.44/testdata/testinput12 | 109 + .../sources/pcre-8.44/testdata/testinput13 | 9 + .../sources/pcre-8.44/testdata/testinput14 | 345 + .../sources/pcre-8.44/testdata/testinput15 | 369 + .../sources/pcre-8.44/testdata/testinput16 | 67 + .../sources/pcre-8.44/testdata/testinput17 | 309 + .../sources/pcre-8.44/testdata/testinput18 | 300 + .../sources/pcre-8.44/testdata/testinput19 | 45 + .../sources/pcre-8.44/testdata/testinput2 | 4263 +++ .../sources/pcre-8.44/testdata/testinput20 | 19 + .../sources/pcre-8.44/testdata/testinput21 | 26 + .../sources/pcre-8.44/testdata/testinput22 | 23 + .../sources/pcre-8.44/testdata/testinput23 | 20 + .../sources/pcre-8.44/testdata/testinput24 | 11 + .../sources/pcre-8.44/testdata/testinput25 | 44 + .../sources/pcre-8.44/testdata/testinput26 | 14 + .../sources/pcre-8.44/testdata/testinput3 | 100 + .../sources/pcre-8.44/testdata/testinput4 | 733 + .../sources/pcre-8.44/testdata/testinput5 | 807 + .../sources/pcre-8.44/testdata/testinput6 | 1571 ++ .../sources/pcre-8.44/testdata/testinput7 | 851 + .../sources/pcre-8.44/testdata/testinput8 | 4851 ++++ .../sources/pcre-8.44/testdata/testinput9 | 719 + .../sources/pcre-8.44/testdata/testinputEBC | 124 + .../sources/pcre-8.44/testdata/testoutput1 | 9473 +++++++ .../sources/pcre-8.44/testdata/testoutput10 | 2547 ++ .../pcre-8.44/testdata/testoutput11-16 | 771 + .../pcre-8.44/testdata/testoutput11-32 | 771 + .../sources/pcre-8.44/testdata/testoutput11-8 | 771 + .../sources/pcre-8.44/testdata/testoutput12 | 206 + .../sources/pcre-8.44/testdata/testoutput13 | 22 + .../sources/pcre-8.44/testdata/testoutput14 | 532 + .../sources/pcre-8.44/testdata/testoutput15 | 1144 + .../sources/pcre-8.44/testdata/testoutput16 | 193 + .../sources/pcre-8.44/testdata/testoutput17 | 560 + .../pcre-8.44/testdata/testoutput18-16 | 1026 + .../pcre-8.44/testdata/testoutput18-32 | 1023 + .../sources/pcre-8.44/testdata/testoutput19 | 134 + .../sources/pcre-8.44/testdata/testoutput2 | 14727 ++++++++++ .../sources/pcre-8.44/testdata/testoutput20 | 24 + .../pcre-8.44/testdata/testoutput21-16 | 100 + .../pcre-8.44/testdata/testoutput21-32 | 100 + .../pcre-8.44/testdata/testoutput22-16 | 81 + .../pcre-8.44/testdata/testoutput22-32 | 81 + .../sources/pcre-8.44/testdata/testoutput23 | 72 + .../sources/pcre-8.44/testdata/testoutput24 | 13 + .../sources/pcre-8.44/testdata/testoutput25 | 119 + .../sources/pcre-8.44/testdata/testoutput26 | 17 + .../sources/pcre-8.44/testdata/testoutput3 | 174 + .../sources/pcre-8.44/testdata/testoutput3A | 174 + .../sources/pcre-8.44/testdata/testoutput3B | 174 + .../sources/pcre-8.44/testdata/testoutput4 | 1284 + .../sources/pcre-8.44/testdata/testoutput5 | 1953 ++ .../sources/pcre-8.44/testdata/testoutput6 | 2584 ++ .../sources/pcre-8.44/testdata/testoutput7 | 2345 ++ .../sources/pcre-8.44/testdata/testoutput8 | 7808 ++++++ .../sources/pcre-8.44/testdata/testoutput9 | 1287 + .../sources/pcre-8.44/testdata/testoutputEBC | 188 + .../pcre-8.44/testdata/valgrind-jit.supp | 15 + .../sources/pcre-8.44/testdata/wintestinput3 | 91 + .../sources/pcre-8.44/testdata/wintestoutput3 | 166 + .../openresty-pcre/sources/pcre-8.44/ucp.h | 224 + .../openresty-zlib/openresty-zlib.spec | 140 + .../rpm-specs/openresty/openresty.spec | 590 + .../opentracing-cpp/opentracing-cpp.spec | 190 + 384 files changed, 302629 insertions(+) create mode 100644 dependencies/rpm-specs/gateway-rockspecs-native/.gitignore create mode 100644 dependencies/rpm-specs/gateway-rockspecs-native/Dockerfile create mode 100644 dependencies/rpm-specs/gateway-rockspecs-native/Makefile create mode 100644 dependencies/rpm-specs/gateway-rockspecs-native/gateway-rockspecs-native.spec create mode 100644 dependencies/rpm-specs/gateway-rockspecs-native/licenses.xml create mode 100644 dependencies/rpm-specs/gateway-rockspecs/.gitignore create mode 100644 dependencies/rpm-specs/gateway-rockspecs/Dockerfile create mode 100644 dependencies/rpm-specs/gateway-rockspecs/Makefile create mode 100644 dependencies/rpm-specs/gateway-rockspecs/gateway-rockspecs.spec create mode 100644 dependencies/rpm-specs/gateway-rockspecs/licenses.xml create mode 100644 dependencies/rpm-specs/gateway-rockspecs/rockspecs create mode 100644 dependencies/rpm-specs/luarocks/luarocks.spec create mode 100644 dependencies/rpm-specs/openresty-pcre/openresty-pcre.spec create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/132html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/AUTHORS create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/CMakeLists.txt create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/COPYING create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/ChangeLog create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/CheckMan create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/CleanTxt create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/Detrail create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/HACKING create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/INSTALL create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/LICENCE create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/Makefile.am create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/Makefile.in create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/NEWS create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/NON-AUTOTOOLS-BUILD create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/NON-UNIX-USE create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/PrepareRelease create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/README create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/RunGrepTest create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/RunTest create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/RunTest.bat create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/aclocal.m4 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/ar-lib create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/cmake/COPYING-CMAKE-SCRIPTS create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/cmake/FindEditline.cmake create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/cmake/FindPackageHandleStandardArgs.cmake create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/cmake/FindReadline.cmake create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/compile create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/config-cmake.h.in create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/config.guess create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/config.h.generic create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/config.h.in create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/config.sub create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/configure create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/configure.ac create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/depcomp create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/dftables.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/NON-AUTOTOOLS-BUILD.txt create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/README.txt create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/index.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre-config.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre16.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre32.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_assign_jit_stack.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_compile.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_compile2.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_config.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_copy_named_substring.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_copy_substring.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_dfa_exec.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_exec.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_free_study.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_free_substring.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_free_substring_list.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_fullinfo.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_get_named_substring.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_get_stringnumber.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_get_stringtable_entries.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_get_substring.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_get_substring_list.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_jit_exec.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_jit_stack_alloc.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_jit_stack_free.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_maketables.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_pattern_to_host_byte_order.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_refcount.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_study.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_utf16_to_host_byte_order.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_utf32_to_host_byte_order.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_version.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcreapi.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcrebuild.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcrecallout.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcrecompat.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcrecpp.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcredemo.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcregrep.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcrejit.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcrelimits.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcrematching.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcrepartial.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcrepattern.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcreperform.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcreposix.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcreprecompile.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcresample.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcrestack.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcresyntax.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcretest.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcreunicode.html create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/index.html.src create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre-config.1 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre-config.txt create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre.3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre.txt create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre16.3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre32.3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_assign_jit_stack.3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_compile.3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_compile2.3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_config.3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_copy_named_substring.3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_copy_substring.3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_dfa_exec.3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_exec.3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_free_study.3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_free_substring.3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_free_substring_list.3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_fullinfo.3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_get_named_substring.3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_get_stringnumber.3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_get_stringtable_entries.3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_get_substring.3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_get_substring_list.3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_jit_exec.3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_jit_stack_alloc.3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_jit_stack_free.3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_maketables.3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_pattern_to_host_byte_order.3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_refcount.3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_study.3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_utf16_to_host_byte_order.3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_utf32_to_host_byte_order.3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_version.3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcreapi.3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcrebuild.3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcrecallout.3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcrecompat.3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcrecpp.3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcredemo.3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcregrep.1 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcregrep.txt create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcrejit.3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcrelimits.3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcrematching.3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcrepartial.3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcrepattern.3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcreperform.3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcreposix.3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcreprecompile.3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcresample.3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcrestack.3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcresyntax.3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcretest.1 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcretest.txt create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcreunicode.3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/perltest.txt create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/install-sh create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/libpcre.pc.in create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/libpcre16.pc.in create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/libpcre32.pc.in create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/libpcrecpp.pc.in create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/libpcreposix.pc.in create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/ltmain.sh create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/m4/ax_pthread.m4 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/m4/libtool.m4 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/m4/ltoptions.m4 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/m4/ltsugar.m4 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/m4/ltversion.m4 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/m4/lt~obsolete.m4 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/m4/pcre_visibility.m4 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/makevp.bat create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/makevp_c.txt create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/makevp_l.txt create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/missing create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre-config.in create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre.h.generic create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre.h.in create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_byte_order.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_chartables.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_compile.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_config.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_dfa_exec.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_exec.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_fullinfo.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_get.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_globals.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_jit_compile.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_maketables.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_newline.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_ord2utf16.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_printint.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_refcount.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_string_utils.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_study.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_tables.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_ucd.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_utf16_utils.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_valid_utf16.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_version.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_xclass.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_byte_order.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_chartables.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_compile.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_config.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_dfa_exec.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_exec.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_fullinfo.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_get.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_globals.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_jit_compile.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_maketables.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_newline.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_ord2utf32.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_printint.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_refcount.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_string_utils.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_study.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_tables.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_ucd.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_utf32_utils.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_valid_utf32.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_version.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_xclass.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_byte_order.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_chartables.c.dist create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_compile.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_config.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_dfa_exec.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_exec.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_fullinfo.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_get.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_globals.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_internal.h create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_jit_compile.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_jit_test.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_maketables.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_newline.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_ord2utf8.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_printint.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_refcount.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_scanner.cc create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_scanner.h create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_scanner_unittest.cc create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_string_utils.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_stringpiece.cc create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_stringpiece.h.in create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_stringpiece_unittest.cc create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_study.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_tables.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_ucd.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_valid_utf8.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_version.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_xclass.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcrecpp.cc create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcrecpp.h create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcrecpp_internal.h create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcrecpp_unittest.cc create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcrecpparg.h.in create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcredemo.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcregexp.pas create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcregrep.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcreposix.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcreposix.h create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcretest.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/perltest.pl create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitConfig.h create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitConfigInternal.h create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitExecAllocator.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitLir.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitLir.h create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeARM_32.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeARM_64.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeARM_T2_32.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeMIPS_32.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeMIPS_64.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeMIPS_common.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativePPC_32.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativePPC_64.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativePPC_common.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeSPARC_32.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeSPARC_common.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeTILEGX-encoder.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeTILEGX_64.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeX86_32.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeX86_64.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeX86_common.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitUtils.c create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/test-driver create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/grepbinary create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/grepfilelist create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/grepinput create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/grepinput3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/grepinput8 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/grepinputv create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/grepinputx create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/greplist create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/grepoutput create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/grepoutput8 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/grepoutputN create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/greppatN4 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/saved16 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/saved16BE-1 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/saved16BE-2 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/saved16LE-1 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/saved16LE-2 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/saved32 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/saved32BE-1 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/saved32BE-2 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/saved32LE-1 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/saved32LE-2 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/saved8 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput1 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput10 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput11 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput12 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput13 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput14 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput15 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput16 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput17 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput18 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput19 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput2 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput20 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput21 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput22 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput23 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput24 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput25 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput26 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput4 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput5 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput6 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput7 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput8 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput9 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinputEBC create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput1 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput10 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput11-16 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput11-32 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput11-8 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput12 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput13 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput14 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput15 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput16 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput17 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput18-16 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput18-32 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput19 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput2 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput20 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput21-16 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput21-32 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput22-16 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput22-32 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput23 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput24 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput25 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput26 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput3A create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput3B create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput4 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput5 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput6 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput7 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput8 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput9 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutputEBC create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/valgrind-jit.supp create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/wintestinput3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/wintestoutput3 create mode 100755 dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/ucp.h create mode 100644 dependencies/rpm-specs/openresty-zlib/openresty-zlib.spec create mode 100644 dependencies/rpm-specs/openresty/openresty.spec create mode 100644 dependencies/rpm-specs/opentracing-cpp/opentracing-cpp.spec diff --git a/dependencies/rpm-specs/gateway-rockspecs-native/.gitignore b/dependencies/rpm-specs/gateway-rockspecs-native/.gitignore new file mode 100644 index 000000000..5210f55d6 --- /dev/null +++ b/dependencies/rpm-specs/gateway-rockspecs-native/.gitignore @@ -0,0 +1 @@ +/*.rock diff --git a/dependencies/rpm-specs/gateway-rockspecs-native/Dockerfile b/dependencies/rpm-specs/gateway-rockspecs-native/Dockerfile new file mode 100644 index 000000000..d19c4f615 --- /dev/null +++ b/dependencies/rpm-specs/gateway-rockspecs-native/Dockerfile @@ -0,0 +1,16 @@ +FROM centos:8 + +RUN yum upgrade -y \ + && dnf install -y 'dnf-command(config-manager)' +RUN yum install -y epel-release git make gcc cmake gcc-c++ which +RUN yum config-manager --add-repo http://packages.dev.3sca.net/dev_packages_3sca_net.repo +RUN dnf --enablerepo=PowerTools install -y libyaml-devel luarocks +RUN yum install -y rpm-build redhat-rpm-config rpmdevtools + +RUN mkdir -p /root/rpmbuild/SOURCES/ + + +COPY . /opt/data/ +RUN cp /opt/data/licenses.xml /root/rpmbuild/SOURCES/ +RUN spectool -g -R /opt/data/*.spec +RUN rpmbuild -ba /opt/data/*.spec diff --git a/dependencies/rpm-specs/gateway-rockspecs-native/Makefile b/dependencies/rpm-specs/gateway-rockspecs-native/Makefile new file mode 100644 index 000000000..d973b329e --- /dev/null +++ b/dependencies/rpm-specs/gateway-rockspecs-native/Makefile @@ -0,0 +1,45 @@ +.PHONY: build dependencies cache + +SPEC ?= $(wildcard *.spec) + +SOURCES ?= $(HOME)/rpmbuild/SOURCES +ROCKS ?= $(wildcard $(SOURCES)/*.rock) + +GIT_BRANCH = $(shell git symbolic-ref --short HEAD) +TARGET ?= $(GIT_BRANCH)-candidate + +dependencies: + yum-builddep $(SPEC) + +$(SOURCES): + mkdir -p $(SOURCES) + +download: $(SOURCES) + spectool -g -R $(SPEC) + cp licenses.xml $(SOURCES)/ + +$(ROCKS): $(SOURCES) download + +sources: download $(ROCKS) + @# just strip the directory by awk so it contains just the basename + @md5sum $(sort $(ROCKS)) | awk '{ "basename " $$2 | getline basename; close("basename"); print $$1, "", basename; }' > sources + +cache: $(ROCKS) sources + rhpkg new-sources $(ROCKS) + +build: sources + rpmbuild -ba $(SPEC) +clean: + rm -rf ~/rpmbuild/ sources $(ROCKS) *.src.rock + +test: cache + rhpkg --release rhel-7 prep --builddir=$(shell mktemp -d) + rhpkg --release rhel-7 scratch-build --target=$(TARGET) + +brew: +ifneq (,$(findstring private-,$(GIT_BRANCH))) + $(error can't build from private branch $(GIT_BRANCH)) +else + rhpkg build --target=$(TARGET) +endif + diff --git a/dependencies/rpm-specs/gateway-rockspecs-native/gateway-rockspecs-native.spec b/dependencies/rpm-specs/gateway-rockspecs-native/gateway-rockspecs-native.spec new file mode 100644 index 000000000..14cb7a7d3 --- /dev/null +++ b/dependencies/rpm-specs/gateway-rockspecs-native/gateway-rockspecs-native.spec @@ -0,0 +1,172 @@ +%global meadalpha %{nil} +%global meadrel %{nil} +%global version_major 1 +%global version_minor 0 +%global version_micro 0 + +%undefine _debugsource_packages + +Name: gateway-rockspecs-native +Version: %{version_major}.%{version_minor}.%{version_micro} +Release: 123%{?dist} +Summary: Native Dependencies for 3scale API gateway (APIcast). +License: MIT +URL: https://github.com/3scale/apicast + +Source0: licenses.xml +# Source1: https://luarocks.org/manifests/gvvaughan/lyaml-6.2.3-1.src.rock +Source1: lyaml-6.2.3-1.src.rock +Source2: luafilesystem-1.8.0-1.src.rock + + +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root + +BuildRequires: luarocks rpm-build redhat-rpm-config rpmdevtools libyaml-devel gcc +# Using requires so we can regenerate the manifest on installation. +Requires: luarocks libyaml glibc-devel + +%description +RPM to bundle required Native dependencies for AMP APIcast Gateway. + +%prep +%autosetup -T -c %{name}-%{version} + +%build +# To run debuginfo, if not does not work +ls + +%install +export LUA_PATH="./lua_modules/share/lua/5.1/?.lua;./lua_modules/share/lua/5.1/?/init.lua;/usr/lib64/lua/5.1/?.lua;" +for source in "%{_sourcedir}"/*.src.rock; do + luarocks install --deps-mode=none --tree %{buildroot}/usr/local "$source" \ + CFLAGS="-O2 -g -fpic -Wl,-z,now ${RPM_OPT_FLAGS}" +done +rm -f %{buildroot}/usr/local/%{_lib}/luarocks/rocks/manifest +cp "%{_sourcedir}"/licenses.xml . + +%post +export LUA_PATH="/usr/lib64/lua/5.1/?.lua" +luarocks-admin --tree=/usr/local make_manifest --local-tree + +%clean +rm -rf %{buildroot} + +%files +%defattr(-,root,root,-) +/usr/local/%{_lib}/luarocks/ +/usr/local/share/lua/ +/usr/local/%{_lib}/lua/5.1/ +%license licenses.xml + +%changelog +* Fri Dec 02 2022 CPaaS User - 1.0.0-23 +- Bump release + +* Mon Oct 03 2022 CPaaS User - 1.0.0-22 +- Bump release + +* Wed Feb 23 2022 CPaaS User - 1.0.0-21 +- Bump release + +* Wed Feb 23 2022 CPaaS User - 1.0.0-20 +- Bump release + +* Wed Feb 23 2022 CPaaS User - 1.0.0-19 +- Bump release + +* Wed Feb 09 2022 CPaaS User - 1.0.0-18 +- Bump release + +* Wed Feb 09 2022 CPaaS User - 1.0.0-17 +- Bump release + +* Wed Feb 09 2022 CPaaS User - 1.0.0-16 +- Bump release + +* Wed Feb 09 2022 CPaaS User - 1.0.0-15 +- Bump release + +* Wed Jan 26 2022 CPaaS User - 1.0.0-14 +- Bump release + +* Wed Jan 26 2022 CPaaS User - 1.0.0-13 +- Bump release + +* Mon Jan 24 2022 CPaaS User - 1.0.0-12.16 +- Bump release + +* Thu Jan 13 2022 CPaaS User - 1.0.0-12.15 +- Bump release + +* Wed Jan 12 2022 CPaaS User - 1.0.0-12.14 +- Bump release + +* Wed Jan 12 2022 CPaaS User - 1.0.0-12.13 +- Bump release + +* Wed Jan 12 2022 CPaaS User - 1.0.0-12.12 +- Bump release + +* Mon Jul 05 2021 CPaaS User - 1.0.0-12.11 +- Bump release + +* Mon Jul 05 2021 CPaaS User - 1.0.0-12.10 +- Bump release + +* Mon Jul 05 2021 CPaaS User - 1.0.0-12.9 +- Bump release + +* Mon Jul 05 2021 CPaaS User - 1.0.0-12.8 +- Bump release + +* Fri Jul 02 2021 CPaaS User - 1.0.0-12.7 +- Bump release + +* Fri Jul 02 2021 CPaaS User - 1.0.0-12.6 +- Bump release + +* Thu Jul 01 2021 CPaaS User - 1.0.0-12.5 +- Bump release + +* Thu Jul 01 2021 CPaaS User - 1.0.0-12.4 +- Bump release + +* Thu Jul 01 2021 CPaaS User - 1.0.0-12.3 +- Bump release + +* Thu May 06 2021 CPaaS User - 1.0.0-11.2 +- Bump release + +* Thu May 06 2021 CPaaS User - 1.0.0-11.1 +- Bump release + +* Mon Jan 20 2020 cpaas-ops - 1.0.0-8 +Built by CPaaS + +* Mon Jan 20 2020 cpaas-ops - 1.0.0-7 +Built by CPaaS + +* Mon Jan 20 2020 cpaas-ops - 1.0.0-6 +Built by CPaaS + +* Wed Jan 15 2020 cpaas-ops - 1.0.0-5 +Built by CPaaS + +* Wed Jan 15 2020 cpaas-ops - 1.0.0-4 +Built by CPaaS + +* Wed Jan 15 2020 Yorgos Saslis - 1.1.0-0 +- Use 5.1 path and Luajit from openresty to build it + +* Mon Mar 25 2019 Fernando Nasser - 1.0.0-3 +- Use the new license macro + +* Wed Mar 13 2019 David Ortiz - 1.0.0-2 +- - + +* Wed Mar 13 2019 David Ortiz - 1.0.0-1 +- First build + +* Wed Mar 13 2019 David Ortiz +- First version + diff --git a/dependencies/rpm-specs/gateway-rockspecs-native/licenses.xml b/dependencies/rpm-specs/gateway-rockspecs-native/licenses.xml new file mode 100644 index 000000000..02821c9d5 --- /dev/null +++ b/dependencies/rpm-specs/gateway-rockspecs-native/licenses.xml @@ -0,0 +1,18 @@ + + + + + + lyaml + 6.2.3-1 + + + MIT + https://opensource.org/licenses/mit-license + + + + + + + diff --git a/dependencies/rpm-specs/gateway-rockspecs/.gitignore b/dependencies/rpm-specs/gateway-rockspecs/.gitignore new file mode 100644 index 000000000..0ed30f876 --- /dev/null +++ b/dependencies/rpm-specs/gateway-rockspecs/.gitignore @@ -0,0 +1,3 @@ +/*.rock +!/*.src.rock +.*.sw? diff --git a/dependencies/rpm-specs/gateway-rockspecs/Dockerfile b/dependencies/rpm-specs/gateway-rockspecs/Dockerfile new file mode 100644 index 000000000..44a7f708a --- /dev/null +++ b/dependencies/rpm-specs/gateway-rockspecs/Dockerfile @@ -0,0 +1,22 @@ +FROM registry.access.redhat.com/ubi8:8.5 + +RUN sed -i s/enabled=./enabled=0/g /etc/yum/pluginconf.d/subscription-manager.conf + +RUN yum upgrade -y \ + && dnf install -y 'dnf-command(config-manager)' +RUN yum config-manager --add-repo http://packages.dev.3sca.net/dev_packages_3sca_net.repo +RUN dnf --disablerepo=epel install -y luarocks +RUN yum install -y rpm-build redhat-rpm-config + +RUN yum localinstall -y https://rpmfind.net/linux/centos/8-stream/AppStream/x86_64/os/Packages/rpmdevtools-8.10-8.el8.noarch.rpm + +RUN mkdir -p /root/rpmbuild/SOURCES/ + + +COPY . /opt/data/ +RUN cp /opt/data/licenses.xml /root/rpmbuild/SOURCES/ +RUN cp /opt/data/*.rock /root/rpmbuild/SOURCES/ +# RUN rm /root/rpmbuild/SOURCES/lua-rover-scm-1.src.rock +RUN spectool -g -R /opt/data/*.spec +RUN rpmbuild -ba /opt/data/*.spec +RUN rpm -i /root/rpmbuild/RPMS/noarch/*.rpm diff --git a/dependencies/rpm-specs/gateway-rockspecs/Makefile b/dependencies/rpm-specs/gateway-rockspecs/Makefile new file mode 100644 index 000000000..874c4b000 --- /dev/null +++ b/dependencies/rpm-specs/gateway-rockspecs/Makefile @@ -0,0 +1,55 @@ +MKFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST))) +PROJECT_PATH := $(patsubst %/,%,$(dir $(MKFILE_PATH))) + +.PHONY: build dependencies cache rockspecs + +SPEC ?= $(wildcard *.spec) + +SOURCES ?= $(HOME)/rpmbuild/SOURCES +ROCKS ?= $(wildcard $(SOURCES)/*.rock) +ROCKSPECS = `cat $(PROJECT_PATH)/rockspecs` + +GIT_BRANCH = $(shell git symbolic-ref --short HEAD) +TARGET ?= $(GIT_BRANCH)-candidate +dependencies: + yum-builddep $(SPEC) + +$(SOURCES): + mkdir -p $(SOURCES) + +rockspecs: $(SOURCES) + rm -rfv tmprocks; + mkdir -p tmprocks; + cd tmprocks; for rock in $(ROCKSPECS); do luarocks pack $$rock; done + cp tmprocks/*.rock $(SOURCES)/ + cp tmprocks/*.rock . + rm -rfv tmprocks; + +download: $(SOURCES) + spectool -g -R $(SPEC) + cp licenses.xml $(SOURCES)/ + +$(ROCKS): $(SOURCES) download + +sources: download rockspecs $(ROCKS) + @# just strip the directory by awk so it contains just the basename + @md5sum $(sort $(ROCKS)) | awk '{ "basename " $$2 | getline basename; close("basename"); print $$1, "", basename; }' > sources + +cache: $(ROCKS) sources + rhpkg new-sources $(ROCKS) + +build: sources + rpmbuild -ba $(SPEC) +clean: + rm -rf ~/rpmbuild/ sources $(ROCKS) *.src.rock + +test: + rhpkg --release rhel-7 prep --builddir=$(shell mktemp -d) + rhpkg --release rhel-7 scratch-build --target=$(TARGET) + +brew: +ifneq (,$(findstring private-,$(GIT_BRANCH))) + $(error can't build from private branch $(GIT_BRANCH)) +else + rhpkg build --target=$(TARGET) +endif diff --git a/dependencies/rpm-specs/gateway-rockspecs/gateway-rockspecs.spec b/dependencies/rpm-specs/gateway-rockspecs/gateway-rockspecs.spec new file mode 100644 index 000000000..4c898b649 --- /dev/null +++ b/dependencies/rpm-specs/gateway-rockspecs/gateway-rockspecs.spec @@ -0,0 +1,266 @@ +%global meadalpha %{nil} +%global meadrel %{nil} +%global version_major 2 +%global version_minor 10 +%global version_micro 0 +Name: gateway-rockspecs +Version: %{version_major}.%{version_minor}.%{version_micro} +Release: 102%{?dist} +Summary: Lua Dependencies for 3scale API gateway (APIcast). +# router and inspect are MIT, lua-resty is BSD, lua-resty-jwt is Apache. +License: MIT and BSD-2-Clause and Apache +URL: https://github.com/3scale/apicast +BuildArch: noarch + +Source0: licenses.xml +Source1: lua-resty-http-0.17.1-0.src.rock +Source2: router-2.1-0.src.rock +Source3: inspect-3.1.1-0.src.rock +Source4: lua-resty-jwt-0.2.0-0.src.rock +Source5: lua-resty-url-0.3.5-1.src.rock +Source6: lua-resty-env-0.4.0-1.src.rock +Source7: liquid-0.2.0-2.src.rock +Source8: penlight-1.13.1-1.src.rock +Source9: argparse-0.6.0-1.src.rock +Source10: lua-resty-execvp-0.1.1-1.src.rock +Source11: lua-resty-jit-uuid-0.0.7-1.src.rock +Source12: nginx-lua-prometheus-0.20181120-2.src.rock +Source13: lua-resty-iputils-0.3.0-1.src.rock +Source14: net-url-0.9-1.src.rock +Source15: jsonschema-0.8-0.src.rock +Source16: lua-rover-scm-1.src.rock +Source17: date-2.2-2.src.rock + + +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root + +BuildRequires: luarocks rpm-build redhat-rpm-config rpmdevtools +# Using requires so we can regenerate the manifest on installation. +Requires: luarocks +Requires: gateway-rockspecs-native + +%description +RPM to bundle required Lua dependencies for AMP APIcast Gateway. + +%prep +%autosetup -T -c %{name}-%{version} + +%install +mkdir -p %{buildroot}/etc/profile.d +echo 'export LUA_PATH="/usr/lib64/lua/5.1/?.lua;/usr/local/share/lua/5.1/?.lua"' > %{buildroot}/etc/profile.d/lua_path.sh + +export LUA_PATH="/usr/lib64/lua/5.1/?.lua;" +for source in "%{_sourcedir}"/*.src.rock; do + luarocks install --deps-mode=none --tree %{buildroot}/usr/local "$source" +done +# Remove manifest (will be re-created at post to avoid owning it +rm -f %{buildroot}/usr/local/lib64/luarocks/rocks/manifest + +# Install licenses in standard location +cp "%{_sourcedir}"/licenses.xml . + +# Fix issues on lua-rover bin +sed -i 's|%{buildroot}||g' %{buildroot}/usr/local/bin/rover + +%post +export LUA_PATH="/usr/lib64/lua/5.1/?.lua" +luarocks-admin --tree=/usr/local make_manifest --local-tree + +%clean +rm -rf %{buildroot} + +%files +%defattr(-,root,root,-) +/usr/local/lib64/luarocks/ +/usr/local/share/lua/ +/usr/local/bin/rover +/etc/profile.d/lua_path.sh +%license licenses.xml + +%changelog +* Fri Dec 02 2022 CPaaS User - 2.10.0-2 +- Bump release + +* Fri Dec 02 2022 Yorgos Saslis - 2.10.0-1 +- Minor version bump to clarify lua-liquid dependency bump that already happened in 2.9.6-12 + +* Mon Oct 03 2022 CPaaS User - 2.9.6-14 +- Bump release + +* Mon Oct 03 2022 CPaaS User - 2.9.6-13 +- Bump release + +* Fri Jul 15 2022 Eguzki Astiz Lezaun - 2.9.6-12 +- Updated lua-liquid dependency + +* Thu May 05 2022 CPaaS User - 2.9.6-11 +- Bump release + +* Wed Feb 23 2022 CPaaS User - 2.9.6-10 +- Bump release + +* Wed Feb 23 2022 CPaaS User - 2.9.6-9 +- Bump release + +* Tue Feb 22 2022 CPaaS User - 2.9.6-8 +- Bump release + +* Wed Feb 09 2022 CPaaS User - 2.9.6-7 +- Bump release + +* Wed Feb 09 2022 CPaaS User - 2.9.6-6 +- Bump release + +* Wed Feb 09 2022 CPaaS User - 2.9.6-5 +- Bump release + +* Wed Feb 09 2022 CPaaS User - 2.9.6-4 +- Bump release + +* Wed Jan 26 2022 CPaaS User - 2.9.6-3 +- Bump release + +* Wed Jan 26 2022 CPaaS User - 2.9.6-2 +- Bump release + +* Mon Jan 24 2022 CPaaS User - 2.9.6-0.7 +- Bump release + +* Fri Jan 21 2022 CPaaS User - 2.9.6-0.6 +- Bump release + +* Thu Jan 20 2022 CPaaS User - 2.9.6-0.1 +- Date filter support on liquid + +* Thu Jan 13 2022 CPaaS User - 2.9.5-0.5 +- Bump release + +* Wed Jan 12 2022 CPaaS User - 2.9.5-0.4 +- Bump release + +* Wed Jan 12 2022 CPaaS User - 2.9.5-0.3 +- Bump release + +* Wed Jan 12 2022 CPaaS User - 2.9.5-0.2 +- Bump release + +* Mon Sep 20 2021 Eloy Coto - 2.9.5-0.1 +- Updated luafilesystem-ffi + +* Mon Jul 05 2021 CPaaS User - 2.9.4-0.19 +- Bump release + +* Mon Jul 05 2021 CPaaS User - 2.9.4-0.18 +- Bump release + +* Mon Jul 05 2021 CPaaS User - 2.9.4-0.17 +- Bump release + +* Mon Jul 05 2021 CPaaS User - 2.9.4-0.16 +- Bump release + +* Mon Jul 05 2021 CPaaS User - 2.9.4-0.15 +- Bump release + +* Fri Jul 02 2021 CPaaS User - 2.9.4-0.14 +- Bump release + +* Thu Jul 01 2021 CPaaS User - 2.9.4-0.13 +- Bump release + +* Thu Jul 01 2021 CPaaS User - 2.9.4-0.12 +- Bump release + + +* Thu Jul 01 2021 Eloy Coto - 2.9.4-0.11 +- Added lua-rover and net-url and fix ENV variables + +* Wed Jun 30 2021 CPaaS User - 2.9.4-0.10 +- Bump release + +* Wed Jun 30 2021 CPaaS User - 2.9.4-0.9 +- Bump release + +* Wed Jun 30 2021 CPaaS User - 2.9.4-0.8 +- Bump release + +* Wed Jun 30 2021 CPaaS User - 2.9.4-0.7 +- Bump release + +* Wed Jun 30 2021 CPaaS User - 2.9.4-0.6 +- Bump release + +* Wed Jun 30 2021 CPaaS User - 2.9.4-0.5 +- Bump release + +* Wed Jun 30 2021 CPaaS User - 2.9.4-0.4 +- Bump release + +* Tue Jun 29 2021 CPaaS User - 2.9.4-0.3 +- Bump release + +* Thu Jun 17 2021 Eloy Coto - 2.9.3-0.2 +- Updated lua-liquid dependency + +* Thu May 06 2021 CPaaS User - 2.9.2-0.2 +- Bump release + +* Thu May 06 2021 CPaaS User - 2.9.2-0.1 +- Bump release + + +* Fri Jun 26 2020 Eloy Coto - 2.9.2-0 +- Update lua-liquid dependency + +* Tue Jan 21 2020 cpaas-ops - 2.8.1-8 +Built by CPaaS + +* Mon Jan 20 2020 cpaas-ops - 2.8.1-8 +Built by CPaaS + +* Mon Jan 20 2020 Eloy Coto - 2.8.1-0 +- Update lua-liquid dependency + +* Wed Jan 15 2020 cpaas-ops - 2.8.0-7 +Built by CPaaS + +* Wed Jan 15 2020 cpaas-ops - 2.8.0-6 +Built by CPaaS + +* Wed Jan 15 2020 cpaas-ops - 2.8.0-5 +Built by CPaaS + + +* Sat Jan 11 2020 Eloy Coto +- Update dependencies for APIcast AMP 2.8 + +* Tue Jun 18 2019 David Ortiz +- Update dependencies for APIcast AMP 2.6 + +* Mon Mar 25 2019 Fernando Nasser - 1.5.0-4 +- Use the new license macro + +* Wed Mar 13 2019 Fernando Nasser - 1.5.0-3 +- Remove manifest before installation + +* Wed Mar 13 2019 David Ortiz - 1.5.0-2 +- Rebuild without natives + +* Tue Mar 12 2019 David Ortiz +- Update dependencies for APIcast AMP 2.5 +* Wed Oct 24 2018 David Ortiz +- Update dependencies for APIcast AMP 2.4 +* Fri Aug 31 2018 Michal Cichra +- Update dependencies for APIcast AMP 2.3 +* Wed Feb 28 2018 Michal Cichra +- Update dependencies for APIcast AMP 2.2 +* Thu Aug 24 2017 Michal Cichra +- Fix invalid licenses.xml +* Thu Aug 24 2017 Michal Cichra +- Add licenses.xml +* Wed Jul 26 2017 Michal Cichra +- Update dependencies to match AMP APIcast 2.1.0 ER1 +* Thu Mar 23 2017 Nick Cross +- Add lua-resty-jwt-0.1.9-0.src.rock +* Wed Oct 12 2016 Nick Cross +- diff --git a/dependencies/rpm-specs/gateway-rockspecs/licenses.xml b/dependencies/rpm-specs/gateway-rockspecs/licenses.xml new file mode 100644 index 000000000..ee70df10e --- /dev/null +++ b/dependencies/rpm-specs/gateway-rockspecs/licenses.xml @@ -0,0 +1,137 @@ + + + + + + lua-resty-jwt + 0.2.0-0 + + + Apache-2.0 + https://opensource.org/licenses/Apache-2.0 + + + + + + router + 2.1-0 + + + MIT + https://opensource.org/licenses/mit-license + + + + + + inspect + 3.1.1-0 + + + MIT + https://opensource.org/licenses/mit-license + + + + + + lua-resty-env + 0.4.0-1 + + + Apache-2.0 + https://opensource.org/licenses/Apache-2.0 + + + + + + lua-resty-url + 0.3.5-1 + + + Apache-2.0 + https://opensource.org/licenses/Apache-2.0 + + + + + + lua-resty-http + 0.15-0 + + + BSD-2-Clause + https://opensource.org/licenses/BSD-2-Clause + + + + + + lua-resty-execvp + 0.1.0-1 + + + Apache-2.0 + https://opensource.org/licenses/Apache-2.0 + + + + + + liquid + 0.1.4-1 + + + BSD-2-Clause + https://opensource.org/licenses/BSD-2-Clause + + + + + + luafilesystem-ffi + 0.1.0-1 + + + MIT + https://opensource.org/licenses/mit-license + + + + + + argparse + 0.6.0-1 + + + MIT + https://opensource.org/licenses/mit-license + + + + + + penlight + 1.7.0-1 + + + MIT + https://opensource.org/licenses/mit-license + + + + + + lua-resty-iputils + 0.3.0-1 + + + MIT + https://opensource.org/licenses/mit-license + + + + + diff --git a/dependencies/rpm-specs/gateway-rockspecs/rockspecs b/dependencies/rpm-specs/gateway-rockspecs/rockspecs new file mode 100644 index 000000000..d4b04b97d --- /dev/null +++ b/dependencies/rpm-specs/gateway-rockspecs/rockspecs @@ -0,0 +1,17 @@ +https://luarocks.org/manifests/pintsized/lua-resty-http-0.17.1-0.rockspec +https://luarocks.org/manifests/kikito/router-2.1-0.rockspec +https://luarocks.org/manifests/kikito/inspect-3.1.1-0.rockspec +https://luarocks.org/manifests/cdbattags/lua-resty-jwt-0.2.0-0.rockspec +https://luarocks.org/manifests/3scale/lua-resty-url-0.3.5-1.rockspec +https://luarocks.org/manifests/3scale/lua-resty-env-0.4.0-1.rockspec +https://luarocks.org/manifests/3scale/liquid-0.2.0-2.rockspec +https://luarocks.org/manifests/tieske/penlight-1.7.0-1.rockspec +https://luarocks.org/manifests/mpeterv/argparse-0.6.0-1.rockspec +https://luarocks.org/manifests/3scale/lua-resty-execvp-0.1.1-1.rockspec +https://luarocks.org/manifests/3scale/lua-resty-jit-uuid-0.0.7-1.rockspec +https://luarocks.org/manifests/knyar/nginx-lua-prometheus-0.20181120-2.rockspec +https://luarocks.org/manifests/hamish/lua-resty-iputils-0.3.0-1.rockspec +https://luarocks.org/manifests/golgote/net-url-0.9-1.rockspec +https://luarocks.org/manifests/tieske/date-2.2-2.rockspec +https://luarocks.org/manifests/membphis/jsonschema-0.8-0.rockspec +https://luarocks.org/manifests/3scale/lua-rover-scm-1.rockspec diff --git a/dependencies/rpm-specs/luarocks/luarocks.spec b/dependencies/rpm-specs/luarocks/luarocks.spec new file mode 100644 index 000000000..4189bfbe9 --- /dev/null +++ b/dependencies/rpm-specs/luarocks/luarocks.spec @@ -0,0 +1,184 @@ +%global commitid f29297f6f3185158fc81d6137e21ea7e14e43b74 +%global meadalpha %{nil} +%global meadrel %{nil} +%global version_major 2 +%global version_minor 3 +%global version_micro 0 + +%define __debug_install_post : > %{_builddir}/%{?buildsubdir}/debugfiles.list +%define debug_package %{nil} + +%global luaver 5.1 + +%global luapkgdir %{_libdir}/lua/%{luaver} +#global prever rc2 + + +%if 0%{?el5} +# For some reason find-debuginfo.sh is still triggered on RHEL 5, despite +# BuildArch being noarch -- the script then fails. Explicitly disable it +%global debug_package %{nil} +%endif + +Name: luarocks +Version: %{version_major}.%{version_minor}.%{version_micro} +Release: 105%{?dist} +Summary: A deployment and management system for Lua modules +Source: luarocks-%{version}-%{release}.tar.gz +BuildRequires: openresty +Requires: openresty +Requires: unzip +Requires: zip +AutoReq: no + +License: MIT +%if 0%{?rhel} <= 6 +# RHEL 5's rpm requires this field +# RHEL 6's rpmlint warns if it is unspecified +Group: Development/Tools +%endif +URL: http://luarocks.org + +%if 0%{?el5} +BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX) +%endif + + +%if 0%{?fedora} +Recommends: lua-sec +Suggests: lua-devel +%endif + +%description +LuaRocks allows you to install Lua modules as self-contained packages +called "rocks", which also contain version dependency +information. This information is used both during installation, so +that when one rock is requested all rocks it depends on are installed +as well, and at run time, so that when a module is required, the +correct version is loaded. LuaRocks supports both local and remote +repositories, and multiple local rocks trees. + + +%prep +ls -la %{_sourcedir} +cp -R ../SOURCES/%{name}-%{version}-%{release} %{name}-%{version}-%{release} +%setup -q -T -D -n %{name}-%{version}-%{release} + +# Remove DOS line endings +for file in ; do + sed "s|\r||g" $file > $file.new && \ + touch -r $file $file.new && \ + mv $file.new $file +done + +sed -i 's|LUAROCKS_ROCKS_SUBDIR=/lib/luarocks/rocks|LUAROCKS_ROCKS_SUBDIR=/%{_lib}/luarocks/rocks|g' configure +sed -i 's|lib_modules_path = "/lib/lua/"..cfg.lua_version,|lib_modules_path = "/%{_lib}/lua/"..cfg.lua_version,|g' src/luarocks/cfg.lua + +%build +./configure \ + --lua-version=%{luaver} \ + --prefix=%{_prefix} \ + --with-lua=/usr/local/openresty/luajit \ + --lua-suffix=jit-2.1.0-beta3 \ + --with-lua-include=/usr/local/openresty/luajit/include/luajit-2.1 +make + + +%install +%if 0%{?el5} +rm -rf $RPM_BUILD_ROOT +%endif +make install DESTDIR=$RPM_BUILD_ROOT LUADIR=%{luapkgdir} +# fix symlinks to versioned binaries +#for f in luarocks{,-admin}; +#do +# mv -f $RPM_BUILD_ROOT%{_bindir}/$f{-%{luaver},} +#done + + +%check +# TODO - find how to run this without having to pre-download entire rocks tree +# ./test/run_tests.sh + + +%files +%license COPYING* +%doc README.md +%dir %{_sysconfdir}/luarocks +%config(noreplace) %{_sysconfdir}/luarocks/config-%{luaver}.lua +%{_bindir}/luarocks +%{_bindir}/luarocks-%{luaver} +%{_bindir}/luarocks-admin +%{_bindir}/luarocks-admin-%{luaver} +%{luapkgdir}/luarocks + + +%changelog +* Tue Jan 14 2020 Yorgos Saslis - 2.3.0-5 +- Uses openresty luajit version (lua 5.1) +- Has build dependency on openresty + +* Fri Apr 21 2017 Nick Cross - 2.3.0-2 +- Add with-lux configure flag. + +* Tue Jul 5 2016 Michel Alexandre Salim - 2.3.0-1 +- Update to 2.3.0 +- Use license macro +- On Fedora, add weak dependencies on lua-sec (recommended) + and lua-devel (suggested) + +* Thu Feb 04 2016 Fedora Release Engineering - 2.2.3-0.3.rc2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild + +* Thu Dec 10 2015 Tom Callaway - 2.2.3-0.2.rc2 +- update to 2.2.3-rc2 +- fix another case of /usr/lib pathing + +* Wed Jun 17 2015 Fedora Release Engineering - 2.2.2-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild + +* Tue Jun 2 2015 Michel Alexandre Salim - 2.2.2-1 +- Update to 2.2.2 +- Add runtime dependencies on unzip and zip (h/t Ignacio Burgueño) + +* Thu Jan 15 2015 Tom Callaway - 2.2.0-2 +- rebuild for lua 5.3 + +* Fri Oct 17 2014 Michel Alexandre Salim - 2.2.0-1 +- Update to 2.2.0 + +* Sat Jun 07 2014 Fedora Release Engineering - 2.1.2-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild + +* Thu Jan 16 2014 Michel Salim - 2.1.2-1 +- Update to 2.1.2 + +* Sat Aug 03 2013 Fedora Release Engineering - 2.0.13-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild + +* Sun May 12 2013 Tom Callaway - 2.0.13-2 +- rebuild for lua 5.2 + +* Mon Apr 22 2013 Michel Salim - 2.0.13-1 +- Update to 2.0.13 + +* Thu Feb 14 2013 Fedora Release Engineering - 2.0.12-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild + +* Mon Nov 5 2012 Michel Salim - 2.0.12-1.1 +- Fix macro problem affecting EPEL builds + +* Mon Nov 5 2012 Michel Salim - 2.0.12-1 +- Update to 2.0.12 + +* Fri Sep 28 2012 Michel Salim - 2.0.11-1 +- Update to 2.0.11 + +* Thu Jul 19 2012 Fedora Release Engineering - 2.0.8-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild + +* Fri May 11 2012 Michel Salim - 2.0.8-2 +- Add support for RHEL's older lua packaging + +* Tue May 8 2012 Michel Salim - 2.0.8-1 +- Initial package diff --git a/dependencies/rpm-specs/openresty-pcre/openresty-pcre.spec b/dependencies/rpm-specs/openresty-pcre/openresty-pcre.spec new file mode 100644 index 000000000..fc21ee88e --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/openresty-pcre.spec @@ -0,0 +1,136 @@ +Name: openresty-pcre +Version: 8.44 +Release: 126%{?dist} +Summary: Perl-compatible regular expression library for OpenResty + +Group: System Environment/Libraries + +License: BSD +URL: http://www.pcre.org/ +Source0: pcre-%{version} + +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) + +BuildRequires: libtool + +AutoReqProv: no + +%define pcre_prefix /usr/local/openresty/pcre + +%description +Perl-compatible regular expression library for use by OpenResty ONLY + + +%if 0%{?fedora} >= 27 +%undefine _debugsource_packages +%undefine _debuginfo_subpackages +%endif + +%if 0%{?rhel} >= 8 +%undefine _debugsource_packages +%undefine _debuginfo_subpackages +%endif + + +%package devel +Summary: Development files for %{name} +Group: Development/Libraries +Requires: %{name} = %{version}-%{release} + + +%description devel +Development files for Perl-compatible regular expression library for use by OpenResty ONLY + + +%prep +cp -R ../SOURCES/pcre-%{version} pcre-%{version} +%setup -q -T -D -n pcre-%{version} + + +%build + +export CC="gcc -fdiagnostics-color=always" +export CFLAGS="-Wl,-z,now %{optflags}" +./configure \ + --prefix=%{pcre_prefix} \ + --libdir=%{pcre_prefix}/lib \ + --disable-cpp \ +%ifarch s390x + --disable-jit \ +%else + --enable-jit \ +%endif + --enable-utf \ + --enable-unicode-properties +%{make_build} CFLAGS="${CFLAGS}" + + +%install +make install DESTDIR=%{buildroot} +rm -rf %{buildroot}/%{pcre_prefix}/bin +rm -rf %{buildroot}/%{pcre_prefix}/share +rm -f %{buildroot}/%{pcre_prefix}/lib/*.la +rm -f %{buildroot}/%{pcre_prefix}/lib/*pcrecpp* +rm -f %{buildroot}/%{pcre_prefix}/lib/*pcreposix* +rm -rf %{buildroot}/%{pcre_prefix}/lib/pkgconfig + + +%clean +rm -rf %{buildroot} + + +%files +%defattr(-,root,root,-) +%{pcre_prefix}/lib/*.so* + + +%files devel +%defattr(-,root,root,-) +%{pcre_prefix}/lib/*.a +%{pcre_prefix}/include/*.h + + +%changelog +* Fri May 06 2022 CPaaS User - 8.44-26 +- Bump release + +* Mon Feb 28 2022 CPaaS User - 8.44-25 +- Bump release + +* Mon Feb 28 2022 CPaaS User - 8.44-24 +- Bump release + +* Thu Feb 24 2022 CPaaS User - 8.44-23 +- Bump release + +* Wed Jan 12 2022 CPaaS User - 8.44-13 +- Bump release + +* Wed Jan 12 2022 CPaaS User - 8.44-12 +- Bump release + +* Mon Jul 05 2021 CPaaS User - 8.44-10 +- Bump release + +* Mon Jul 05 2021 CPaaS User - 8.44-9 +- Bump release + +* Thu Jul 01 2021 CPaaS User - 8.44-8 +- Bump release + +* Thu Jul 01 2021 CPaaS User - 8.44-7 +- Bump release + +* Thu Jul 01 2021 CPaaS User - 8.44-6 +- Bump release + +* Mon May 14 2018 Yichun Zhang (agentzh) 8.42-1 +- upgraded openresty-pcre to 8.42. +* Thu Nov 2 2017 Yichun Zhang (agentzh) +- upgraded PCRE to 8.41. +* Sun Mar 19 2017 Yichun Zhang (agentzh) +- upgraded PCRE to 8.40. +* Sat Sep 24 2016 Yichun Zhang +- disable the C++ support in build. thanks luto. +* Tue Aug 23 2016 zxcvbn4038 +- initial build for pcre 8.39. diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/132html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/132html new file mode 100755 index 000000000..e00024970 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/132html @@ -0,0 +1,313 @@ +#! /usr/bin/perl -w + +# Script to turn PCRE man pages into HTML + + +# Subroutine to handle font changes and other escapes + +sub do_line { +my($s) = $_[0]; + +$s =~ s/ +$s =~ s/>/>/g; +$s =~ s"\\fI(.*?)\\f[RP]"$1"g; +$s =~ s"\\fB(.*?)\\f[RP]"$1"g; +$s =~ s"\\e"\\"g; +$s =~ s/(?<=Copyright )\(c\)/©/g; +$s; +} + +# Subroutine to ensure not in a paragraph + +sub end_para { +if ($inpara) + { + print TEMP "\n" if ($inpre); + print TEMP "

\n"; + } +$inpara = $inpre = 0; +$wrotetext = 0; +} + +# Subroutine to start a new paragraph + +sub new_para { +&end_para(); +print TEMP "

\n"; +$inpara = 1; +} + + +# Main program + +$innf = 0; +$inpara = 0; +$inpre = 0; +$wrotetext = 0; +$toc = 0; +$ref = 1; + +while ($#ARGV >= 0 && $ARGV[0] =~ /^-/) + { + $toc = 1 if $ARGV[0] eq "-toc"; + shift; + } + +# Initial output to STDOUT + +print < + +$ARGV[0] specification + + +

$ARGV[0] man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+End + +print "

    \n" if ($toc); + +open(TEMP, ">/tmp/$$") || die "Can't open /tmp/$$ for output\n"; + +while () + { + # Handle lines beginning with a dot + + if (/^\./) + { + # Some of the PCRE man pages used to contain instances of .br. However, + # they should have all been removed because they cause trouble in some + # (other) automated systems that translate man pages to HTML. Complain if + # we find .br or .in (another macro that is deprecated). + + if (/^\.br/ || /^\.in/) + { + print STDERR "\n*** Deprecated macro encountered - rewrite needed\n"; + print STDERR "*** $_\n"; + die "*** Processing abandoned\n"; + } + + # Instead of .br, relevent "literal" sections are enclosed in .nf/.fi. + + elsif (/^\.nf/) + { + $innf = 1; + } + + elsif (/^\.fi/) + { + $innf = 0; + } + + # Handling .sp is subtle. If it is inside a literal section, do nothing if + # the next line is a non literal text line; similarly, if not inside a + # literal section, do nothing if a literal follows, unless we are inside + # a .nf/.ne section. The point being that the
     and 
    that delimit + # literal sections will do the spacing. Always skip if no previous output. + + elsif (/^\.sp/) + { + if ($wrotetext) + { + $_ = ; + if ($inpre) + { + print TEMP "\n" if (/^[\s.]/); + } + else + { + print TEMP "
    \n
    \n" if ($innf || !/^[\s.]/); + } + redo; # Now process the lookahead line we just read + } + } + elsif (/^\.TP/ || /^\.PP/ || /^\.P/) + { + &new_para(); + } + elsif (/^\.SH\s*("?)(.*)\1/) + { + # Ignore the NAME section + if ($2 =~ /^NAME\b/) + { + ; + next; + } + + &end_para(); + my($title) = &do_line($2); + if ($toc) + { + printf("
  • $title\n", + $ref, $ref); + printf TEMP ("
    $title
    \n", + $ref); + $ref++; + } + else + { + print TEMP "
    \n$title\n
    \n"; + } + } + elsif (/^\.SS\s*("?)(.*)\1/) + { + &end_para(); + my($title) = &do_line($2); + print TEMP "
    \n$title\n
    \n"; + } + elsif (/^\.B\s*(.*)/) + { + &new_para() if (!$inpara); + $_ = &do_line($1); + s/"(.*?)"/$1/g; + print TEMP "$_\n"; + $wrotetext = 1; + } + elsif (/^\.I\s*(.*)/) + { + &new_para() if (!$inpara); + $_ = &do_line($1); + s/"(.*?)"/$1/g; + print TEMP "$_\n"; + $wrotetext = 1; + } + + # A comment that starts "HREF" takes the next line as a name that + # is turned into a hyperlink, using the text given, which might be + # in a special font. If it ends in () or (digits) or punctuation, they + # aren't part of the link. + + elsif (/^\.\\"\s*HREF/) + { + $_=; + chomp; + $_ = &do_line($_); + $_ =~ s/\s+$//; + $_ =~ /^(?:<.>)?([^<(]+)(?:\(\))?(?:<\/.>)?(?:\(\d+\))?[.,;:]?$/; + print TEMP "$_\n"; + } + + # A comment that starts "HTML" inserts literal HTML + + elsif (/^\.\\"\s*HTML\s*(.*)/) + { + print TEMP $1; + } + + # A comment that starts < inserts that HTML at the end of the + # *next* input line - so as not to get a newline between them. + + elsif (/^\.\\"\s*(<.*>)/) + { + my($markup) = $1; + $_=; + chomp; + $_ = &do_line($_); + $_ =~ s/\s+$//; + print TEMP "$_$markup\n"; + } + + # A comment that starts JOIN joins the next two lines together, with one + # space between them. Then that line is processed. This is used in some + # displays where two lines are needed for the "man" version. JOINSH works + # the same, except that it assumes this is a shell command, so removes + # continuation backslashes. + + elsif (/^\.\\"\s*JOIN(SH)?/) + { + my($one,$two); + $one = ; + $two = ; + $one =~ s/\s*\\e\s*$// if (defined($1)); + chomp($one); + $two =~ s/^\s+//; + $_ = "$one $two"; + redo; # Process the joined lines + } + + # .EX/.EE are used in the pcredemo page to bracket the entire program, + # which is unmodified except for turning backslash into "\e". + + elsif (/^\.EX\s*$/) + { + print TEMP "
    \n";
    +      while ()
    +        {
    +        last if /^\.EE\s*$/;
    +        s/\\e/\\/g;
    +        s/&/&/g;
    +        s//>/g;
    +        print TEMP;
    +        }
    +      }
    +
    +    # Ignore anything not recognized
    +
    +    next;
    +    }
    +
    +  # Line does not begin with a dot. Replace blank lines with new paragraphs
    +
    +  if (/^\s*$/)
    +    {
    +    &end_para() if ($wrotetext);
    +    next;
    +    }
    +
    +  # Convert fonts changes and output an ordinary line. Ensure that indented
    +  # lines are marked as literal.
    +
    +  $_ = &do_line($_);
    +  &new_para() if (!$inpara);
    +
    +  if (/^\s/)
    +    {
    +    if (!$inpre)
    +      {
    +      print TEMP "
    \n";
    +      $inpre = 1;
    +      }
    +    }
    +  elsif ($inpre)
    +    {
    +    print TEMP "
    \n"; + $inpre = 0; + } + + # Add
    to the end of a non-literal line if we are within .nf/.fi + + $_ .= "
    \n" if (!$inpre && $innf); + + print TEMP; + $wrotetext = 1; + } + +# The TOC, if present, will have been written - terminate it + +print "
\n" if ($toc); + +# Copy the remainder to the standard output + +close(TEMP); +open(TEMP, "/tmp/$$") || die "Can't open /tmp/$$ for input\n"; + +print while (); + +print < +Return to the PCRE index page. +

+End + +close(TEMP); +unlink("/tmp/$$"); + +# End diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/AUTHORS b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/AUTHORS new file mode 100755 index 000000000..bb8b32835 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/AUTHORS @@ -0,0 +1,45 @@ +THE MAIN PCRE LIBRARY +--------------------- + +Written by: Philip Hazel +Email local part: ph10 +Email domain: cam.ac.uk + +University of Cambridge Computing Service, +Cambridge, England. + +Copyright (c) 1997-2020 University of Cambridge +All rights reserved + + +PCRE JUST-IN-TIME COMPILATION SUPPORT +------------------------------------- + +Written by: Zoltan Herczeg +Email local part: hzmester +Emain domain: freemail.hu + +Copyright(c) 2010-2020 Zoltan Herczeg +All rights reserved. + + +STACK-LESS JUST-IN-TIME COMPILER +-------------------------------- + +Written by: Zoltan Herczeg +Email local part: hzmester +Emain domain: freemail.hu + +Copyright(c) 2009-2020 Zoltan Herczeg +All rights reserved. + + +THE C++ WRAPPER LIBRARY +----------------------- + +Written by: Google Inc. + +Copyright (c) 2007-2012 Google Inc +All rights reserved + +#### diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/CMakeLists.txt b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/CMakeLists.txt new file mode 100755 index 000000000..858a34bd0 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/CMakeLists.txt @@ -0,0 +1,1012 @@ +# CMakeLists.txt +# +# +# This file allows building PCRE with the CMake configuration and build +# tool. Download CMake in source or binary form from http://www.cmake.org/ +# +# Original listfile by Christian Ehrlicher +# Refined and expanded by Daniel Richard G. +# 2007-09-14 mod by Sheri so 7.4 supported configuration options can be entered +# 2007-09-19 Adjusted by PH to retain previous default settings +# 2007-12-26 (a) On UNIX, use names libpcre instead of just pcre +# (b) Ensure pcretest and pcregrep link with the local library, +# not a previously-installed one. +# (c) Add PCRE_SUPPORT_LIBREADLINE, PCRE_SUPPORT_LIBZ, and +# PCRE_SUPPORT_LIBBZ2. +# 2008-01-20 Brought up to date to include several new features by Christian +# Ehrlicher. +# 2008-01-22 Sheri added options for backward compatibility of library names +# when building with minGW: +# if "ON", NON_STANDARD_LIB_PREFIX causes shared libraries to +# be built without "lib" as prefix. (The libraries will be named +# pcre.dll, pcreposix.dll and pcrecpp.dll). +# if "ON", NON_STANDARD_LIB_SUFFIX causes shared libraries to +# be built with suffix of "-0.dll". (The libraries will be named +# libpcre-0.dll, libpcreposix-0.dll and libpcrecpp-0.dll - same names +# built by default with Configure and Make. +# 2008-01-23 PH removed the automatic build of pcredemo. +# 2008-04-22 PH modified READLINE support so it finds NCURSES when needed. +# 2008-07-03 PH updated for revised UCP property support (change of files) +# 2009-03-23 PH applied Steven Van Ingelgem's patch to change the name +# CMAKE_BINARY_DIR to PROJECT_BINARY_DIR so that it works when PCRE +# is included within another project. +# 2009-03-23 PH applied a modified version of Steven Van Ingelgem's patches to +# add options to stop the building of pcregrep and the tests, and +# to disable the final configuration report. +# 2009-04-11 PH applied Christian Ehrlicher's patch to show compiler flags that +# are set by specifying a release type. +# 2010-01-02 PH added test for stdint.h +# 2010-03-02 PH added test for inttypes.h +# 2011-08-01 PH added PCREGREP_BUFSIZE +# 2011-08-22 PH added PCRE_SUPPORT_JIT +# 2011-09-06 PH modified WIN32 ADD_TEST line as suggested by Sergey Cherepanov +# 2011-09-06 PH added PCRE_SUPPORT_PCREGREP_JIT +# 2011-10-04 Sheri added support for including coff data in windows shared libraries +# compiled with MINGW if pcre.rc and/or pcreposix.rc are placed in +# the source dir by the user prior to building +# 2011-10-04 Sheri changed various add_test's to use exes' location built instead +# of DEBUG location only (likely only matters in MSVC) +# 2011-10-04 Sheri added scripts to provide needed variables to RunTest and +# RunGrepTest (used for UNIX and Msys) +# 2011-10-04 Sheri added scripts to provide needed variables and to execute +# RunTest.bat in Win32 (for effortless testing with "make test") +# 2011-10-04 Sheri Increased minimum required cmake version +# 2012-01-06 PH removed pcre_info.c and added pcre_string_utils.c +# 2012-01-10 Zoltan Herczeg added libpcre16 support +# 2012-01-13 Stephen Kelly added out of source build support +# 2012-01-17 PH applied Stephen Kelly's patch to parse the version data out +# of the configure.ac file +# 2012-02-26 PH added support for libedit +# 2012-09-06 PH added support for PCRE_EBCDIC_NL25 +# 2012-09-08 ChPe added PCRE32 support +# 2012-10-23 PH added support for VALGRIND and GCOV +# 2012-12-08 PH added patch from Daniel Richard G to quash some MSVC warnings +# 2013-07-01 PH realized that the "support" for GCOV was a total nonsense and +# so it has been removed. +# 2013-10-08 PH got rid of the "source" command, which is a bash-ism (use ".") +# 2013-11-05 PH added support for PARENS_NEST_LIMIT +# 2016-03-01 PH applied Chris Wilson's patch for MSVC static build +# 2016-06-24 PH applied Chris Wilson's revised patch (adds a separate option) + +PROJECT(PCRE C CXX) + +# Increased minimum to 2.8.0 to support newer add_test features. Set policy +# CMP0026 to avoid warnings for the use of LOCATION in GET_TARGET_PROPERTY. + +CMAKE_MINIMUM_REQUIRED(VERSION 2.8.0) +CMAKE_POLICY(SET CMP0026 OLD) + +SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) # for FindReadline.cmake + +# external packages +FIND_PACKAGE( BZip2 ) +FIND_PACKAGE( ZLIB ) +FIND_PACKAGE( Readline ) +FIND_PACKAGE( Editline ) + +# Configuration checks + +INCLUDE(CheckIncludeFile) +INCLUDE(CheckIncludeFileCXX) +INCLUDE(CheckFunctionExists) +INCLUDE(CheckTypeSize) + +CHECK_INCLUDE_FILE(dirent.h HAVE_DIRENT_H) +CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H) +CHECK_INCLUDE_FILE(inttypes.h HAVE_INTTYPES_H) +CHECK_INCLUDE_FILE(sys/stat.h HAVE_SYS_STAT_H) +CHECK_INCLUDE_FILE(sys/types.h HAVE_SYS_TYPES_H) +CHECK_INCLUDE_FILE(unistd.h HAVE_UNISTD_H) +CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H) + +CHECK_INCLUDE_FILE_CXX(type_traits.h HAVE_TYPE_TRAITS_H) +CHECK_INCLUDE_FILE_CXX(bits/type_traits.h HAVE_BITS_TYPE_TRAITS_H) + +CHECK_FUNCTION_EXISTS(bcopy HAVE_BCOPY) +CHECK_FUNCTION_EXISTS(memmove HAVE_MEMMOVE) +CHECK_FUNCTION_EXISTS(strerror HAVE_STRERROR) +CHECK_FUNCTION_EXISTS(strtoll HAVE_STRTOLL) +CHECK_FUNCTION_EXISTS(strtoq HAVE_STRTOQ) +CHECK_FUNCTION_EXISTS(_strtoi64 HAVE__STRTOI64) + +CHECK_TYPE_SIZE("long long" LONG_LONG) +CHECK_TYPE_SIZE("unsigned long long" UNSIGNED_LONG_LONG) + +# User-configurable options +# +# (Note: CMakeSetup displays these in alphabetical order, regardless of +# the order we use here) + +SET(BUILD_SHARED_LIBS OFF CACHE BOOL + "Build shared libraries instead of static ones.") + +OPTION(PCRE_BUILD_PCRE8 "Build 8 bit PCRE library" ON) + +OPTION(PCRE_BUILD_PCRE16 "Build 16 bit PCRE library" OFF) + +OPTION(PCRE_BUILD_PCRE32 "Build 32 bit PCRE library" OFF) + +OPTION(PCRE_BUILD_PCRECPP "Build the PCRE C++ library (pcrecpp)." ON) + +SET(PCRE_EBCDIC OFF CACHE BOOL + "Use EBCDIC coding instead of ASCII. (This is rarely used outside of mainframe systems.)") + +SET(PCRE_EBCDIC_NL25 OFF CACHE BOOL + "Use 0x25 as EBCDIC NL character instead of 0x15; implies EBCDIC.") + +SET(PCRE_LINK_SIZE "2" CACHE STRING + "Internal link size (2, 3 or 4 allowed). See LINK_SIZE in config.h.in for details.") + +SET(PCRE_PARENS_NEST_LIMIT "250" CACHE STRING + "Default nested parentheses limit. See PARENS_NEST_LIMIT in config.h.in for details.") + +SET(PCRE_MATCH_LIMIT "10000000" CACHE STRING + "Default limit on internal looping. See MATCH_LIMIT in config.h.in for details.") + +SET(PCRE_MATCH_LIMIT_RECURSION "MATCH_LIMIT" CACHE STRING + "Default limit on internal recursion. See MATCH_LIMIT_RECURSION in config.h.in for details.") + +SET(PCREGREP_BUFSIZE "20480" CACHE STRING + "Buffer size parameter for pcregrep. See PCREGREP_BUFSIZE in config.h.in for details.") + +SET(PCRE_NEWLINE "LF" CACHE STRING + "What to recognize as a newline (one of CR, LF, CRLF, ANY, ANYCRLF).") + +SET(PCRE_NO_RECURSE OFF CACHE BOOL + "If ON, then don't use stack recursion when matching. See NO_RECURSE in config.h.in for details.") + +SET(PCRE_POSIX_MALLOC_THRESHOLD "10" CACHE STRING + "Threshold for malloc() usage. See POSIX_MALLOC_THRESHOLD in config.h.in for details.") + +SET(PCRE_SUPPORT_JIT OFF CACHE BOOL + "Enable support for Just-in-time compiling.") + +SET(PCRE_SUPPORT_PCREGREP_JIT ON CACHE BOOL + "Enable use of Just-in-time compiling in pcregrep.") + +SET(PCRE_SUPPORT_UTF OFF CACHE BOOL + "Enable support for Unicode Transformation Format (UTF-8/UTF-16/UTF-32) encoding.") + +SET(PCRE_SUPPORT_UNICODE_PROPERTIES OFF CACHE BOOL + "Enable support for Unicode properties (if set, UTF support will be enabled as well).") + +SET(PCRE_SUPPORT_BSR_ANYCRLF OFF CACHE BOOL + "ON=Backslash-R matches only LF CR and CRLF, OFF=Backslash-R matches all Unicode Linebreaks") + +SET(PCRE_SUPPORT_VALGRIND OFF CACHE BOOL + "Enable Valgrind support.") + +OPTION(PCRE_SHOW_REPORT "Show the final configuration report" ON) +OPTION(PCRE_BUILD_PCREGREP "Build pcregrep" ON) +OPTION(PCRE_BUILD_TESTS "Build the tests" ON) + +IF (MINGW) + OPTION(NON_STANDARD_LIB_PREFIX + "ON=Shared libraries built in mingw will be named pcre.dll, etc., instead of libpcre.dll, etc." + OFF) + + OPTION(NON_STANDARD_LIB_SUFFIX + "ON=Shared libraries built in mingw will be named libpcre-0.dll, etc., instead of libpcre.dll, etc." + OFF) +ENDIF(MINGW) + +IF(MSVC) + OPTION(PCRE_STATIC_RUNTIME + "ON=Compile against the static runtime (/MT)." + OFF) + OPTION(INSTALL_MSVC_PDB + "ON=Install .pdb files built by MSVC, if generated" + OFF) +ENDIF(MSVC) + +# bzip2 lib +IF(BZIP2_FOUND) + OPTION (PCRE_SUPPORT_LIBBZ2 "Enable support for linking pcregrep with libbz2." ON) +ENDIF(BZIP2_FOUND) +IF(PCRE_SUPPORT_LIBBZ2) + INCLUDE_DIRECTORIES(${BZIP2_INCLUDE_DIR}) +ENDIF(PCRE_SUPPORT_LIBBZ2) + +# zlib +IF(ZLIB_FOUND) + OPTION (PCRE_SUPPORT_LIBZ "Enable support for linking pcregrep with libz." ON) +ENDIF(ZLIB_FOUND) +IF(PCRE_SUPPORT_LIBZ) + INCLUDE_DIRECTORIES(${ZLIB_INCLUDE_DIR}) +ENDIF(PCRE_SUPPORT_LIBZ) + +# editline lib +IF(EDITLINE_FOUND) + OPTION (PCRE_SUPPORT_LIBEDIT "Enable support for linking pcretest with libedit." OFF) +ENDIF(EDITLINE_FOUND) +IF(PCRE_SUPPORT_LIBEDIT) + INCLUDE_DIRECTORIES(${EDITLINE_INCLUDE_DIR}) +ENDIF(PCRE_SUPPORT_LIBEDIT) + +# readline lib +IF(READLINE_FOUND) + OPTION (PCRE_SUPPORT_LIBREADLINE "Enable support for linking pcretest with libreadline." ON) +ENDIF(READLINE_FOUND) +IF(PCRE_SUPPORT_LIBREADLINE) + INCLUDE_DIRECTORIES(${READLINE_INCLUDE_DIR}) +ENDIF(PCRE_SUPPORT_LIBREADLINE) + +# Prepare build configuration + +SET(pcre_have_type_traits 0) +SET(pcre_have_bits_type_traits 0) + +IF(HAVE_TYPE_TRAITS_H) + SET(pcre_have_type_traits 1) +ENDIF(HAVE_TYPE_TRAITS_H) + +IF(HAVE_BITS_TYPE_TRAITS_H) + SET(pcre_have_bits_type_traits 1) +ENDIF(HAVE_BITS_TYPE_TRAITS_H) + +SET(pcre_have_long_long 0) +SET(pcre_have_ulong_long 0) + +IF(HAVE_LONG_LONG) + SET(pcre_have_long_long 1) +ENDIF(HAVE_LONG_LONG) + +IF(HAVE_UNSIGNED_LONG_LONG) + SET(pcre_have_ulong_long 1) +ENDIF(HAVE_UNSIGNED_LONG_LONG) + +IF(NOT BUILD_SHARED_LIBS) + SET(PCRE_STATIC 1) +ENDIF(NOT BUILD_SHARED_LIBS) + +IF(NOT PCRE_BUILD_PCRE8 AND NOT PCRE_BUILD_PCRE16 AND NOT PCRE_BUILD_PCRE32) + MESSAGE(FATAL_ERROR "At least one of PCRE_BUILD_PCRE8, PCRE_BUILD_PCRE16 or PCRE_BUILD_PCRE32 must be enabled") +ENDIF(NOT PCRE_BUILD_PCRE8 AND NOT PCRE_BUILD_PCRE16 AND NOT PCRE_BUILD_PCRE32) + +IF(PCRE_BUILD_PCRE8) + SET(SUPPORT_PCRE8 1) +ENDIF(PCRE_BUILD_PCRE8) + +IF(PCRE_BUILD_PCRE16) + SET(SUPPORT_PCRE16 1) +ENDIF(PCRE_BUILD_PCRE16) + +IF(PCRE_BUILD_PCRE32) + SET(SUPPORT_PCRE32 1) +ENDIF(PCRE_BUILD_PCRE32) + +IF(PCRE_BUILD_PCRECPP AND NOT PCRE_BUILD_PCRE8) + MESSAGE(STATUS "** PCRE_BUILD_PCRE8 must be enabled for the C++ library support") + SET(PCRE_BUILD_PCRECPP OFF) +ENDIF(PCRE_BUILD_PCRECPP AND NOT PCRE_BUILD_PCRE8) + +IF(PCRE_BUILD_PCREGREP AND NOT PCRE_BUILD_PCRE8) + MESSAGE(STATUS "** PCRE_BUILD_PCRE8 must be enabled for the pcregrep program") + SET(PCRE_BUILD_PCREGREP OFF) +ENDIF(PCRE_BUILD_PCREGREP AND NOT PCRE_BUILD_PCRE8) + +IF(PCRE_SUPPORT_LIBREADLINE AND PCRE_SUPPORT_LIBEDIT) + MESSAGE(FATAL_ERROR "Only one of libreadline or libeditline can be specified") +ENDIF(PCRE_SUPPORT_LIBREADLINE AND PCRE_SUPPORT_LIBEDIT) + +IF(PCRE_SUPPORT_BSR_ANYCRLF) + SET(BSR_ANYCRLF 1) +ENDIF(PCRE_SUPPORT_BSR_ANYCRLF) + +IF(PCRE_SUPPORT_UTF OR PCRE_SUPPORT_UNICODE_PROPERTIES) + SET(SUPPORT_UTF 1) + SET(PCRE_SUPPORT_UTF ON) +ENDIF(PCRE_SUPPORT_UTF OR PCRE_SUPPORT_UNICODE_PROPERTIES) + +IF(PCRE_SUPPORT_UNICODE_PROPERTIES) + SET(SUPPORT_UCP 1) +ENDIF(PCRE_SUPPORT_UNICODE_PROPERTIES) + +IF(PCRE_SUPPORT_JIT) + SET(SUPPORT_JIT 1) +ENDIF(PCRE_SUPPORT_JIT) + +IF(PCRE_SUPPORT_PCREGREP_JIT) + SET(SUPPORT_PCREGREP_JIT 1) +ENDIF(PCRE_SUPPORT_PCREGREP_JIT) + +IF(PCRE_SUPPORT_VALGRIND) + SET(SUPPORT_VALGRIND 1) +ENDIF(PCRE_SUPPORT_VALGRIND) + +# This next one used to contain +# SET(PCRETEST_LIBS ${READLINE_LIBRARY}) +# but I was advised to add the NCURSES test as well, along with +# some modifications to cmake/FindReadline.cmake which should +# make it possible to override the default if necessary. PH + +IF(PCRE_SUPPORT_LIBREADLINE) + SET(SUPPORT_LIBREADLINE 1) + SET(PCRETEST_LIBS ${READLINE_LIBRARY} ${NCURSES_LIBRARY}) +ENDIF(PCRE_SUPPORT_LIBREADLINE) + +# libedit is a plug-compatible alternative to libreadline + +IF(PCRE_SUPPORT_LIBEDIT) + SET(SUPPORT_LIBEDIT 1) + SET(PCRETEST_LIBS ${EDITLINE_LIBRARY} ${NCURSES_LIBRARY}) +ENDIF(PCRE_SUPPORT_LIBEDIT) + +IF(PCRE_SUPPORT_LIBZ) + SET(SUPPORT_LIBZ 1) + SET(PCREGREP_LIBS ${PCREGREP_LIBS} ${ZLIB_LIBRARIES}) +ENDIF(PCRE_SUPPORT_LIBZ) + +IF(PCRE_SUPPORT_LIBBZ2) + SET(SUPPORT_LIBBZ2 1) + SET(PCREGREP_LIBS ${PCREGREP_LIBS} ${BZIP2_LIBRARIES}) +ENDIF(PCRE_SUPPORT_LIBBZ2) + +SET(NEWLINE "") + +IF(PCRE_NEWLINE STREQUAL "LF") + SET(NEWLINE "10") +ENDIF(PCRE_NEWLINE STREQUAL "LF") +IF(PCRE_NEWLINE STREQUAL "CR") + SET(NEWLINE "13") +ENDIF(PCRE_NEWLINE STREQUAL "CR") +IF(PCRE_NEWLINE STREQUAL "CRLF") + SET(NEWLINE "3338") +ENDIF(PCRE_NEWLINE STREQUAL "CRLF") +IF(PCRE_NEWLINE STREQUAL "ANY") + SET(NEWLINE "-1") +ENDIF(PCRE_NEWLINE STREQUAL "ANY") +IF(PCRE_NEWLINE STREQUAL "ANYCRLF") + SET(NEWLINE "-2") +ENDIF(PCRE_NEWLINE STREQUAL "ANYCRLF") + +IF(NEWLINE STREQUAL "") + MESSAGE(FATAL_ERROR "The PCRE_NEWLINE variable must be set to one of the following values: \"LF\", \"CR\", \"CRLF\", \"ANY\", \"ANYCRLF\".") +ENDIF(NEWLINE STREQUAL "") + +IF(PCRE_EBCDIC) + SET(EBCDIC 1) +IF(PCRE_NEWLINE STREQUAL "LF") + SET(NEWLINE "21") +ENDIF(PCRE_NEWLINE STREQUAL "LF") +IF(PCRE_NEWLINE STREQUAL "CRLF") + SET(NEWLINE "3349") +ENDIF(PCRE_NEWLINE STREQUAL "CRLF") +ENDIF(PCRE_EBCDIC) + +IF(PCRE_EBCDIC_NL25) + SET(EBCDIC 1) + SET(EBCDIC_NL25 1) +IF(PCRE_NEWLINE STREQUAL "LF") + SET(NEWLINE "37") +ENDIF(PCRE_NEWLINE STREQUAL "LF") +IF(PCRE_NEWLINE STREQUAL "CRLF") + SET(NEWLINE "3365") +ENDIF(PCRE_NEWLINE STREQUAL "CRLF") +ENDIF(PCRE_EBCDIC_NL25) + +IF(PCRE_NO_RECURSE) + SET(NO_RECURSE 1) +ENDIF(PCRE_NO_RECURSE) + +# Output files +CONFIGURE_FILE(config-cmake.h.in + ${PROJECT_BINARY_DIR}/config.h + @ONLY) + +# Parse version numbers and date out of configure.ac + +file(STRINGS ${PROJECT_SOURCE_DIR}/configure.ac + configure_lines + LIMIT_COUNT 50 # Read only the first 50 lines of the file +) + +set(SEARCHED_VARIABLES "pcre_major" "pcre_minor" "pcre_prerelease" "pcre_date") +foreach(configure_line ${configure_lines}) + foreach(_substitution_variable ${SEARCHED_VARIABLES}) + string(TOUPPER ${_substitution_variable} _substitution_variable_upper) + if (NOT ${_substitution_variable_upper}) + string(REGEX MATCH "m4_define\\(${_substitution_variable}, \\[(.*)\\]" MACTHED_STRING ${configure_line}) + if (CMAKE_MATCH_1) + set(${_substitution_variable_upper} ${CMAKE_MATCH_1}) + endif() + endif() + endforeach() +endforeach() + +CONFIGURE_FILE(pcre.h.in + ${PROJECT_BINARY_DIR}/pcre.h + @ONLY) + +# What about pcre-config and libpcre.pc? + +IF(PCRE_BUILD_PCRECPP) + CONFIGURE_FILE(pcre_stringpiece.h.in + ${PROJECT_BINARY_DIR}/pcre_stringpiece.h + @ONLY) + + CONFIGURE_FILE(pcrecpparg.h.in + ${PROJECT_BINARY_DIR}/pcrecpparg.h + @ONLY) +ENDIF(PCRE_BUILD_PCRECPP) + +# Character table generation + +OPTION(PCRE_REBUILD_CHARTABLES "Rebuild char tables" OFF) +IF(PCRE_REBUILD_CHARTABLES) + ADD_EXECUTABLE(dftables dftables.c) + + GET_TARGET_PROPERTY(DFTABLES_EXE dftables LOCATION) + + ADD_CUSTOM_COMMAND( + COMMENT "Generating character tables (pcre_chartables.c) for current locale" + DEPENDS dftables + COMMAND ${DFTABLES_EXE} + ARGS ${PROJECT_BINARY_DIR}/pcre_chartables.c + OUTPUT ${PROJECT_BINARY_DIR}/pcre_chartables.c + ) +ELSE(PCRE_REBUILD_CHARTABLES) + CONFIGURE_FILE(${PROJECT_SOURCE_DIR}/pcre_chartables.c.dist + ${PROJECT_BINARY_DIR}/pcre_chartables.c + COPYONLY) +ENDIF(PCRE_REBUILD_CHARTABLES) + +# Source code + +SET(PCRE_HEADERS ${PROJECT_BINARY_DIR}/pcre.h) + +IF(PCRE_BUILD_PCRE8) +SET(PCRE_SOURCES + pcre_byte_order.c + pcre_chartables.c + pcre_compile.c + pcre_config.c + pcre_dfa_exec.c + pcre_exec.c + pcre_fullinfo.c + pcre_get.c + pcre_globals.c + pcre_jit_compile.c + pcre_maketables.c + pcre_newline.c + pcre_ord2utf8.c + pcre_refcount.c + pcre_string_utils.c + pcre_study.c + pcre_tables.c + pcre_ucd.c + pcre_valid_utf8.c + pcre_version.c + pcre_xclass.c +) + +SET(PCREPOSIX_HEADERS pcreposix.h) + +SET(PCREPOSIX_SOURCES pcreposix.c) + +ENDIF(PCRE_BUILD_PCRE8) + +IF(PCRE_BUILD_PCRE16) +SET(PCRE16_SOURCES + pcre16_byte_order.c + pcre16_chartables.c + pcre16_compile.c + pcre16_config.c + pcre16_dfa_exec.c + pcre16_exec.c + pcre16_fullinfo.c + pcre16_get.c + pcre16_globals.c + pcre16_jit_compile.c + pcre16_maketables.c + pcre16_newline.c + pcre16_ord2utf16.c + pcre16_refcount.c + pcre16_string_utils.c + pcre16_study.c + pcre16_tables.c + pcre16_ucd.c + pcre16_utf16_utils.c + pcre16_valid_utf16.c + pcre16_version.c + pcre16_xclass.c +) +ENDIF(PCRE_BUILD_PCRE16) + +IF(PCRE_BUILD_PCRE32) +SET(PCRE32_SOURCES + pcre32_byte_order.c + pcre32_chartables.c + pcre32_compile.c + pcre32_config.c + pcre32_dfa_exec.c + pcre32_exec.c + pcre32_fullinfo.c + pcre32_get.c + pcre32_globals.c + pcre32_jit_compile.c + pcre32_maketables.c + pcre32_newline.c + pcre32_ord2utf32.c + pcre32_refcount.c + pcre32_string_utils.c + pcre32_study.c + pcre32_tables.c + pcre32_ucd.c + pcre32_utf32_utils.c + pcre32_valid_utf32.c + pcre32_version.c + pcre32_xclass.c +) +ENDIF(PCRE_BUILD_PCRE32) + +IF(MINGW AND NOT PCRE_STATIC) +IF (EXISTS ${PROJECT_SOURCE_DIR}/pcre.rc) +ADD_CUSTOM_COMMAND(OUTPUT ${PROJECT_SOURCE_DIR}/pcre.o +PRE-LINK +COMMAND windres ARGS pcre.rc pcre.o +WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} +COMMENT Using pcre coff info in mingw build) +SET(PCRE_SOURCES + ${PCRE_SOURCES} ${PROJECT_SOURCE_DIR}/pcre.o +) +ENDIF(EXISTS ${PROJECT_SOURCE_DIR}/pcre.rc) +IF (EXISTS ${PROJECT_SOURCE_DIR}/pcreposix.rc) +ADD_CUSTOM_COMMAND(OUTPUT ${PROJECT_SOURCE_DIR}/pcreposix.o +PRE-LINK +COMMAND windres ARGS pcreposix.rc pcreposix.o +WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} +COMMENT Using pcreposix coff info in mingw build) +SET(PCREPOSIX_SOURCES + ${PCREPOSIX_SOURCES} ${PROJECT_SOURCE_DIR}/pcreposix.o +) +ENDIF(EXISTS ${PROJECT_SOURCE_DIR}/pcreposix.rc) +ENDIF(MINGW AND NOT PCRE_STATIC) + +IF(MSVC AND NOT PCRE_STATIC) +IF (EXISTS ${PROJECT_SOURCE_DIR}/pcre.rc) +SET(PCRE_SOURCES + ${PCRE_SOURCES} pcre.rc) +ENDIF(EXISTS ${PROJECT_SOURCE_DIR}/pcre.rc) +IF (EXISTS ${PROJECT_SOURCE_DIR}/pcreposix.rc) +SET(PCREPOSIX_SOURCES + ${PCREPOSIX_SOURCES} pcreposix.rc) +ENDIF (EXISTS ${PROJECT_SOURCE_DIR}/pcreposix.rc) +ENDIF(MSVC AND NOT PCRE_STATIC) + +# Fix static compilation with MSVC: https://bugs.exim.org/show_bug.cgi?id=1681 +# This code was taken from the CMake wiki, not from WebM. + +IF(MSVC AND PCRE_STATIC_RUNTIME) + MESSAGE(STATUS "** MSVC and PCRE_STATIC_RUNTIME: modifying compiler flags to use static runtime library") + foreach(flag_var + CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE + CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO + CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE + CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO) + string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}") + endforeach() +ENDIF(MSVC AND PCRE_STATIC_RUNTIME) + +SET(PCRECPP_HEADERS + pcrecpp.h + pcre_scanner.h + ${PROJECT_BINARY_DIR}/pcrecpparg.h + ${PROJECT_BINARY_DIR}/pcre_stringpiece.h +) + +SET(PCRECPP_SOURCES + pcrecpp.cc + pcre_scanner.cc + pcre_stringpiece.cc +) + +# Build setup + +ADD_DEFINITIONS(-DHAVE_CONFIG_H) + +IF(MSVC) + ADD_DEFINITIONS(-D_CRT_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS) +ENDIF(MSVC) + +SET(CMAKE_INCLUDE_CURRENT_DIR 1) +# needed to make sure to not link debug libs +# against release libs and vice versa +IF(WIN32) + SET(CMAKE_DEBUG_POSTFIX "d") +ENDIF(WIN32) + +SET(targets) + +# Libraries +# pcre +IF(PCRE_BUILD_PCRE8) +ADD_LIBRARY(pcre ${PCRE_HEADERS} ${PCRE_SOURCES} ${PROJECT_BINARY_DIR}/config.h) +SET(targets ${targets} pcre) +ADD_LIBRARY(pcreposix ${PCREPOSIX_HEADERS} ${PCREPOSIX_SOURCES}) +SET(targets ${targets} pcreposix) +TARGET_LINK_LIBRARIES(pcreposix pcre) + +IF(MINGW AND NOT PCRE_STATIC) + IF(NON_STANDARD_LIB_PREFIX) + SET_TARGET_PROPERTIES(pcre pcreposix + PROPERTIES PREFIX "" + ) + ENDIF(NON_STANDARD_LIB_PREFIX) + + IF(NON_STANDARD_LIB_SUFFIX) + SET_TARGET_PROPERTIES(pcre pcreposix + PROPERTIES SUFFIX "-0.dll" + ) + ENDIF(NON_STANDARD_LIB_SUFFIX) +ENDIF(MINGW AND NOT PCRE_STATIC) + +ENDIF(PCRE_BUILD_PCRE8) + +IF(PCRE_BUILD_PCRE16) +ADD_LIBRARY(pcre16 ${PCRE_HEADERS} ${PCRE16_SOURCES} ${PROJECT_BINARY_DIR}/config.h) +SET(targets ${targets} pcre16) + +IF(MINGW AND NOT PCRE_STATIC) + IF(NON_STANDARD_LIB_PREFIX) + SET_TARGET_PROPERTIES(pcre16 + PROPERTIES PREFIX "" + ) + ENDIF(NON_STANDARD_LIB_PREFIX) + + IF(NON_STANDARD_LIB_SUFFIX) + SET_TARGET_PROPERTIES(pcre16 + PROPERTIES SUFFIX "-0.dll" + ) + ENDIF(NON_STANDARD_LIB_SUFFIX) +ENDIF(MINGW AND NOT PCRE_STATIC) + +ENDIF(PCRE_BUILD_PCRE16) + +IF(PCRE_BUILD_PCRE32) +ADD_LIBRARY(pcre32 ${PCRE_HEADERS} ${PCRE32_SOURCES} ${PROJECT_BINARY_DIR}/config.h) +SET(targets ${targets} pcre32) + +IF(MINGW AND NOT PCRE_STATIC) + IF(NON_STANDARD_LIB_PREFIX) + SET_TARGET_PROPERTIES(pcre32 + PROPERTIES PREFIX "" + ) + ENDIF(NON_STANDARD_LIB_PREFIX) + + IF(NON_STANDARD_LIB_SUFFIX) + SET_TARGET_PROPERTIES(pcre32 + PROPERTIES SUFFIX "-0.dll" + ) + ENDIF(NON_STANDARD_LIB_SUFFIX) +ENDIF(MINGW AND NOT PCRE_STATIC) + +ENDIF(PCRE_BUILD_PCRE32) + +# pcrecpp +IF(PCRE_BUILD_PCRECPP) +ADD_LIBRARY(pcrecpp ${PCRECPP_HEADERS} ${PCRECPP_SOURCES}) +SET(targets ${targets} pcrecpp) +TARGET_LINK_LIBRARIES(pcrecpp pcre) + + IF(MINGW AND NOT PCRE_STATIC) + IF(NON_STANDARD_LIB_PREFIX) + SET_TARGET_PROPERTIES(pcrecpp + PROPERTIES PREFIX "" + ) + ENDIF(NON_STANDARD_LIB_PREFIX) + + IF(NON_STANDARD_LIB_SUFFIX) + SET_TARGET_PROPERTIES(pcrecpp + PROPERTIES SUFFIX "-0.dll" + ) + ENDIF(NON_STANDARD_LIB_SUFFIX) + ENDIF(MINGW AND NOT PCRE_STATIC) +ENDIF(PCRE_BUILD_PCRECPP) + + +# Executables + +# Removed by PH (2008-01-23) because pcredemo shouldn't really be built +# automatically, and it gave trouble in some environments anyway. +# ADD_EXECUTABLE(pcredemo pcredemo.c) +# TARGET_LINK_LIBRARIES(pcredemo pcreposix) +# IF(NOT BUILD_SHARED_LIBS) +# # make sure to not use declspec(dllimport) in static mode on windows +# SET_TARGET_PROPERTIES(pcredemo PROPERTIES COMPILE_FLAGS "-DPCRE_STATIC") +# ENDIF(NOT BUILD_SHARED_LIBS) + +IF(PCRE_BUILD_PCREGREP) + ADD_EXECUTABLE(pcregrep pcregrep.c) + SET(targets ${targets} pcregrep) + TARGET_LINK_LIBRARIES(pcregrep pcreposix ${PCREGREP_LIBS}) +ENDIF(PCRE_BUILD_PCREGREP) + +# Testing +IF(PCRE_BUILD_TESTS) + ENABLE_TESTING() + + SET(PCRETEST_SOURCES pcretest.c) + IF(PCRE_BUILD_PCRE8) + LIST(APPEND PCRETEST_SOURCES pcre_printint.c) + ENDIF(PCRE_BUILD_PCRE8) + IF(PCRE_BUILD_PCRE16) + LIST(APPEND PCRETEST_SOURCES pcre16_printint.c) + ENDIF(PCRE_BUILD_PCRE16) + IF(PCRE_BUILD_PCRE32) + LIST(APPEND PCRETEST_SOURCES pcre32_printint.c) + ENDIF(PCRE_BUILD_PCRE32) + + ADD_EXECUTABLE(pcretest ${PCRETEST_SOURCES}) + SET(targets ${targets} pcretest) + IF(PCRE_BUILD_PCRE8) + LIST(APPEND PCRETEST_LIBS pcreposix pcre) + ENDIF(PCRE_BUILD_PCRE8) + IF(PCRE_BUILD_PCRE16) + LIST(APPEND PCRETEST_LIBS pcre16) + ENDIF(PCRE_BUILD_PCRE16) + IF(PCRE_BUILD_PCRE32) + LIST(APPEND PCRETEST_LIBS pcre32) + ENDIF(PCRE_BUILD_PCRE32) + TARGET_LINK_LIBRARIES(pcretest ${PCRETEST_LIBS}) + + IF(PCRE_SUPPORT_JIT) + ADD_EXECUTABLE(pcre_jit_test pcre_jit_test.c) + SET(targets ${targets} pcre_jit_test) + SET(PCRE_JIT_TEST_LIBS ) + IF(PCRE_BUILD_PCRE8) + LIST(APPEND PCRE_JIT_TEST_LIBS pcre) + ENDIF(PCRE_BUILD_PCRE8) + IF(PCRE_BUILD_PCRE16) + LIST(APPEND PCRE_JIT_TEST_LIBS pcre16) + ENDIF(PCRE_BUILD_PCRE16) + IF(PCRE_BUILD_PCRE32) + LIST(APPEND PCRE_JIT_TEST_LIBS pcre32) + ENDIF(PCRE_BUILD_PCRE32) + TARGET_LINK_LIBRARIES(pcre_jit_test ${PCRE_JIT_TEST_LIBS}) + ENDIF(PCRE_SUPPORT_JIT) + + IF(PCRE_BUILD_PCRECPP) + ADD_EXECUTABLE(pcrecpp_unittest pcrecpp_unittest.cc) + SET(targets ${targets} pcrecpp_unittest) + TARGET_LINK_LIBRARIES(pcrecpp_unittest pcrecpp) + IF(MINGW AND NON_STANDARD_LIB_NAMES AND NOT PCRE_STATIC) + SET_TARGET_PROPERTIES(pcrecpp + PROPERTIES PREFIX "" + ) + ENDIF(MINGW AND NON_STANDARD_LIB_NAMES AND NOT PCRE_STATIC) + + ADD_EXECUTABLE(pcre_scanner_unittest pcre_scanner_unittest.cc) + SET(targets ${targets} pcre_scanner_unittest) + TARGET_LINK_LIBRARIES(pcre_scanner_unittest pcrecpp) + + ADD_EXECUTABLE(pcre_stringpiece_unittest pcre_stringpiece_unittest.cc) + SET(targets ${targets} pcre_stringpiece_unittest) + TARGET_LINK_LIBRARIES(pcre_stringpiece_unittest pcrecpp) + ENDIF(PCRE_BUILD_PCRECPP) + + # exes in Debug location tested by the RunTest shell script + # via "make test" + IF(PCRE_BUILD_PCREGREP) + GET_TARGET_PROPERTY(PCREGREP_EXE pcregrep DEBUG_LOCATION) + ENDIF(PCRE_BUILD_PCREGREP) + + GET_TARGET_PROPERTY(PCRETEST_EXE pcretest DEBUG_LOCATION) + +# ================================================= + # Write out a CTest configuration file + # + FILE(WRITE ${PROJECT_BINARY_DIR}/CTestCustom.ctest + "# This is a generated file. +MESSAGE(\"When testing is complete, review test output in the +\\\"${PROJECT_BINARY_DIR}/Testing/Temporary\\\" folder.\") +MESSAGE(\" \") +") + + FILE(WRITE ${PROJECT_BINARY_DIR}/pcre_test.sh + "#! /bin/sh +# This is a generated file. +srcdir=${PROJECT_SOURCE_DIR} +pcretest=${PCRETEST_EXE} +. ${PROJECT_SOURCE_DIR}/RunTest +if test \"$?\" != \"0\"; then exit 1; fi +# End +") + + IF(UNIX) + ADD_TEST(pcre_test sh ${PROJECT_BINARY_DIR}/pcre_test.sh) + ENDIF(UNIX) + + IF(PCRE_BUILD_PCREGREP) + FILE(WRITE ${PROJECT_BINARY_DIR}/pcre_grep_test.sh + "#! /bin/sh +# This is a generated file. +srcdir=${PROJECT_SOURCE_DIR} +pcregrep=${PCREGREP_EXE} +pcretest=${PCRETEST_EXE} +. ${PROJECT_SOURCE_DIR}/RunGrepTest +if test \"$?\" != \"0\"; then exit 1; fi +# End +") + + IF(UNIX) + ADD_TEST(pcre_grep_test sh ${PROJECT_BINARY_DIR}/pcre_grep_test.sh) + ENDIF(UNIX) + ENDIF(PCRE_BUILD_PCREGREP) + + IF(WIN32) + # Provide environment for executing the bat file version of RunTest + FILE(TO_NATIVE_PATH ${PROJECT_SOURCE_DIR} winsrc) + FILE(TO_NATIVE_PATH ${PROJECT_BINARY_DIR} winbin) + FILE(TO_NATIVE_PATH ${PCRETEST_EXE} winexe) + + FILE(WRITE ${PROJECT_BINARY_DIR}/pcre_test.bat + "\@REM This is a generated file. +\@echo off +setlocal +SET srcdir=\"${winsrc}\" +SET pcretest=\"${winexe}\" +if not [%CMAKE_CONFIG_TYPE%]==[] SET pcretest=\"${winbin}\\%CMAKE_CONFIG_TYPE%\\pcretest.exe\" +call %srcdir%\\RunTest.Bat +if errorlevel 1 exit /b 1 +echo RunTest.bat tests successfully completed +") + + ADD_TEST(NAME pcre_test_bat + COMMAND pcre_test.bat) + SET_TESTS_PROPERTIES(pcre_test_bat PROPERTIES + PASS_REGULAR_EXPRESSION "RunTest\\.bat tests successfully completed") + + IF("$ENV{OSTYPE}" STREQUAL "msys") + # Both the sh and bat file versions of RunTest are run if make test is used + # in msys + ADD_TEST(pcre_test_sh sh.exe ${PROJECT_BINARY_DIR}/pcre_test.sh) + IF(PCRE_BUILD_PCREGREP) + ADD_TEST(pcre_grep_test sh.exe ${PROJECT_BINARY_DIR}/pcre_grep_test.sh) + ENDIF(PCRE_BUILD_PCREGREP) + ENDIF("$ENV{OSTYPE}" STREQUAL "msys") + + ENDIF(WIN32) + + # Changed to accommodate testing whichever location was just built + + IF(PCRE_SUPPORT_JIT) + ADD_TEST(pcre_jit_test pcre_jit_test) + ENDIF(PCRE_SUPPORT_JIT) + + IF(PCRE_BUILD_PCRECPP) + ADD_TEST(pcrecpp_test pcrecpp_unittest) + ADD_TEST(pcre_scanner_test pcre_scanner_unittest) + ADD_TEST(pcre_stringpiece_test pcre_stringpiece_unittest) + ENDIF(PCRE_BUILD_PCRECPP) + +ENDIF(PCRE_BUILD_TESTS) + +# Installation +SET(CMAKE_INSTALL_ALWAYS 1) + +INSTALL(TARGETS ${targets} + RUNTIME DESTINATION bin + LIBRARY DESTINATION lib + ARCHIVE DESTINATION lib) + +INSTALL(FILES ${PCRE_HEADERS} ${PCREPOSIX_HEADERS} DESTINATION include) + +FILE(GLOB html ${PROJECT_SOURCE_DIR}/doc/html/*.html) +FILE(GLOB man1 ${PROJECT_SOURCE_DIR}/doc/*.1) +FILE(GLOB man3 ${PROJECT_SOURCE_DIR}/doc/*.3) + +IF(PCRE_BUILD_PCRECPP) + INSTALL(FILES ${PCRECPP_HEADERS} DESTINATION include) +ELSE(PCRE_BUILD_PCRECPP) + # Remove pcrecpp.3 + FOREACH(man ${man3}) + GET_FILENAME_COMPONENT(man_tmp ${man} NAME) + IF(NOT man_tmp STREQUAL "pcrecpp.3") + SET(man3_new ${man3} ${man}) + ENDIF(NOT man_tmp STREQUAL "pcrecpp.3") + ENDFOREACH(man ${man3}) + SET(man3 ${man3_new}) +ENDIF(PCRE_BUILD_PCRECPP) + +INSTALL(FILES ${man1} DESTINATION man/man1) +INSTALL(FILES ${man3} DESTINATION man/man3) +INSTALL(FILES ${html} DESTINATION share/doc/pcre/html) + +IF(MSVC AND INSTALL_MSVC_PDB) + INSTALL(FILES ${PROJECT_BINARY_DIR}/pcre.pdb + ${PROJECT_BINARY_DIR}/pcreposix.pdb + DESTINATION bin + CONFIGURATIONS RelWithDebInfo) + INSTALL(FILES ${PROJECT_BINARY_DIR}/pcred.pdb + ${PROJECT_BINARY_DIR}/pcreposixd.pdb + DESTINATION bin + CONFIGURATIONS Debug) +ENDIF(MSVC AND INSTALL_MSVC_PDB) + +# help, only for nice output +IF(BUILD_SHARED_LIBS) + SET(BUILD_STATIC_LIBS OFF) +ELSE(BUILD_SHARED_LIBS) + SET(BUILD_STATIC_LIBS ON) +ENDIF(BUILD_SHARED_LIBS) + +IF(PCRE_SHOW_REPORT) + STRING(TOUPPER "${CMAKE_BUILD_TYPE}" buildtype) + IF (CMAKE_C_FLAGS) + SET(cfsp " ") + ENDIF(CMAKE_C_FLAGS) + IF (CMAKE_CXX_FLAGS) + SET(cxxfsp " ") + ENDIF(CMAKE_CXX_FLAGS) + MESSAGE(STATUS "") + MESSAGE(STATUS "") + MESSAGE(STATUS "PCRE configuration summary:") + MESSAGE(STATUS "") + MESSAGE(STATUS " Install prefix .................. : ${CMAKE_INSTALL_PREFIX}") + MESSAGE(STATUS " C compiler ...................... : ${CMAKE_C_COMPILER}") + MESSAGE(STATUS " C++ compiler .................... : ${CMAKE_CXX_COMPILER}") + MESSAGE(STATUS " C compiler flags ................ : ${CMAKE_C_FLAGS}${cfsp}${CMAKE_C_FLAGS_${buildtype}}") + MESSAGE(STATUS " C++ compiler flags .............. : ${CMAKE_CXX_FLAGS}${cxxfsp}${CMAKE_CXX_FLAGS_${buildtype}}") + MESSAGE(STATUS "") + MESSAGE(STATUS " Build 8 bit PCRE library ........ : ${PCRE_BUILD_PCRE8}") + MESSAGE(STATUS " Build 16 bit PCRE library ....... : ${PCRE_BUILD_PCRE16}") + MESSAGE(STATUS " Build 32 bit PCRE library ....... : ${PCRE_BUILD_PCRE32}") + MESSAGE(STATUS " Build C++ library ............... : ${PCRE_BUILD_PCRECPP}") + MESSAGE(STATUS " Enable JIT compiling support .... : ${PCRE_SUPPORT_JIT}") + MESSAGE(STATUS " Enable UTF support .............. : ${PCRE_SUPPORT_UTF}") + MESSAGE(STATUS " Unicode properties .............. : ${PCRE_SUPPORT_UNICODE_PROPERTIES}") + MESSAGE(STATUS " Newline char/sequence ........... : ${PCRE_NEWLINE}") + MESSAGE(STATUS " \\R matches only ANYCRLF ......... : ${PCRE_SUPPORT_BSR_ANYCRLF}") + MESSAGE(STATUS " EBCDIC coding ................... : ${PCRE_EBCDIC}") + MESSAGE(STATUS " EBCDIC coding with NL=0x25 ...... : ${PCRE_EBCDIC_NL25}") + MESSAGE(STATUS " Rebuild char tables ............. : ${PCRE_REBUILD_CHARTABLES}") + MESSAGE(STATUS " No stack recursion .............. : ${PCRE_NO_RECURSE}") + MESSAGE(STATUS " POSIX mem threshold ............. : ${PCRE_POSIX_MALLOC_THRESHOLD}") + MESSAGE(STATUS " Internal link size .............. : ${PCRE_LINK_SIZE}") + MESSAGE(STATUS " Parentheses nest limit .......... : ${PCRE_PARENS_NEST_LIMIT}") + MESSAGE(STATUS " Match limit ..................... : ${PCRE_MATCH_LIMIT}") + MESSAGE(STATUS " Match limit recursion ........... : ${PCRE_MATCH_LIMIT_RECURSION}") + MESSAGE(STATUS " Build shared libs ............... : ${BUILD_SHARED_LIBS}") + MESSAGE(STATUS " Build static libs ............... : ${BUILD_STATIC_LIBS}") + MESSAGE(STATUS " Build pcregrep .................. : ${PCRE_BUILD_PCREGREP}") + MESSAGE(STATUS " Enable JIT in pcregrep .......... : ${PCRE_SUPPORT_PCREGREP_JIT}") + MESSAGE(STATUS " Buffer size for pcregrep ........ : ${PCREGREP_BUFSIZE}") + MESSAGE(STATUS " Build tests (implies pcretest .. : ${PCRE_BUILD_TESTS}") + MESSAGE(STATUS " and pcregrep)") + IF(ZLIB_FOUND) + MESSAGE(STATUS " Link pcregrep with libz ......... : ${PCRE_SUPPORT_LIBZ}") + ELSE(ZLIB_FOUND) + MESSAGE(STATUS " Link pcregrep with libz ......... : Library not found" ) + ENDIF(ZLIB_FOUND) + IF(BZIP2_FOUND) + MESSAGE(STATUS " Link pcregrep with libbz2 ....... : ${PCRE_SUPPORT_LIBBZ2}") + ELSE(BZIP2_FOUND) + MESSAGE(STATUS " Link pcregrep with libbz2 ....... : Library not found" ) + ENDIF(BZIP2_FOUND) + IF(EDITLINE_FOUND) + MESSAGE(STATUS " Link pcretest with libeditline .. : ${PCRE_SUPPORT_LIBEDIT}") + ELSE(EDITLINE_FOUND) + MESSAGE(STATUS " Link pcretest with libeditline .. : Library not found" ) + ENDIF(EDITLINE_FOUND) + IF(READLINE_FOUND) + MESSAGE(STATUS " Link pcretest with libreadline .. : ${PCRE_SUPPORT_LIBREADLINE}") + ELSE(READLINE_FOUND) + MESSAGE(STATUS " Link pcretest with libreadline .. : Library not found" ) + ENDIF(READLINE_FOUND) + MESSAGE(STATUS " Support Valgrind .................: ${PCRE_SUPPORT_VALGRIND}") + MESSAGE(STATUS " Support coverage .................: ${PCRE_SUPPORT_COVERAGE}") + + IF(MINGW AND NOT PCRE_STATIC) + MESSAGE(STATUS " Non-standard dll names (prefix) . : ${NON_STANDARD_LIB_PREFIX}") + MESSAGE(STATUS " Non-standard dll names (suffix) . : ${NON_STANDARD_LIB_SUFFIX}") + ENDIF(MINGW AND NOT PCRE_STATIC) + + IF(MSVC) + MESSAGE(STATUS " Install MSVC .pdb files ..........: ${INSTALL_MSVC_PDB}") + ENDIF(MSVC) + + MESSAGE(STATUS "") +ENDIF(PCRE_SHOW_REPORT) + +# end CMakeLists.txt diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/COPYING b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/COPYING new file mode 100755 index 000000000..58eed01b6 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/COPYING @@ -0,0 +1,5 @@ +PCRE LICENCE + +Please see the file LICENCE in the PCRE distribution for licensing details. + +End diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/ChangeLog b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/ChangeLog new file mode 100755 index 000000000..04d1ef5b2 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/ChangeLog @@ -0,0 +1,6229 @@ +ChangeLog for PCRE +------------------ + +Note that the PCRE 8.xx series (PCRE1) is now in a bugfix-only state. All +development is happening in the PCRE2 10.xx series. + + +Version 8.44 12 February-2020 +----------------------------- + +1. Setting --enable-jit=auto for an out-of-tree build failed because the +source directory wasn't in the search path for AC_TRY_COMPILE always. Patch +from Ross Burton. + +2. Applied a patch from Michael Shigorin to fix 8.43 build on e2k arch +with lcc compiler (EDG frontend based); the problem it fixes is: + + lcc: "pcrecpp.cc", line 74: error: declaration aliased to undefined entity + "_ZN7pcrecpp2RE6no_argE" [-Werror] + +3. Change 2 for 8.43 omitted (*LF) from the list of start-of-pattern items. Now +added. + +4. Fix ARMv5 JIT improper handling of labels right after a constant pool. + +5. Small patch to pcreposix.c to set the erroroffset field to -1 immediately +after a successful compile, instead of at the start of matching to avoid a +sanitizer complaint (regexec is supposed to be thread safe). + +6. Check the size of the number after (?C as it is read, in order to avoid +integer overflow. + +7. Tidy up left shifts to avoid sanitize warnings; also fix one NULL deference +in pcretest. + + +Version 8.43 23-February-2019 +----------------------------- + +1. Some time ago the config macro SUPPORT_UTF8 was changed to SUPPORT_UTF +because it also applies to UTF-16 and UTF-32. However, this change was not made +in the pcre2cpp files; consequently the C++ wrapper has from then been compiled +with a bug in it, which would have been picked up by the unit test except that +it also had its UTF8 code cut out. The bug was in a global replace when moving +forward after matching an empty string. + +2. The C++ wrapper got broken a long time ago (version 7.3, August 2007) when +(*CR) was invented (assuming it was the first such start-of-pattern option). +The wrapper could never handle such patterns because it wraps patterns in +(?:...)\z in order to support end anchoring. I have hacked in some code to fix +this, that is, move the wrapping till after any existing start-of-pattern +special settings. + +3. "pcre2grep" (sic) was accidentally mentioned in an error message (fix was +ported from PCRE2). + +4. Typo LCC_ALL for LC_ALL fixed in pcregrep. + +5. In a pattern such as /[^\x{100}-\x{ffff}]*[\x80-\xff]/ which has a repeated +negative class with no characters less than 0x100 followed by a positive class +with only characters less than 0x100, the first class was incorrectly being +auto-possessified, causing incorrect match failures. + +6. If the only branch in a conditional subpattern was anchored, the whole +subpattern was treated as anchored, when it should not have been, since the +assumed empty second branch cannot be anchored. Demonstrated by test patterns +such as /(?(1)^())b/ or /(?(?=^))b/. + +7. Fix subject buffer overread in JIT when UTF is disabled and \X or \R has +a greater than 1 fixed quantifier. This issue was found by Yunho Kim. + +8. If a pattern started with a subroutine call that had a quantifier with a +minimum of zero, an incorrect "match must start with this character" could be +recorded. Example: /(?&xxx)*ABC(?XYZ)/ would (incorrectly) expect 'A' to +be the first character of a match. + +9. Improve MAP_JIT flag usage on MacOS. Patch by Rich Siegel. + + +Version 8.42 20-March-2018 +-------------------------- + +1. Fixed a MIPS issue in the JIT compiler reported by Joshua Kinard. + +2. Fixed outdated real_pcre definitions in pcre.h.in (patch by Evgeny Kotkov). + +3. pcregrep was truncating components of file names to 128 characters when +processing files with the -r option, and also (some very odd code) truncating +path names to 512 characters. There is now a check on the absolute length of +full path file names, which may be up to 2047 characters long. + +4. Using pcre_dfa_exec(), in UTF mode when UCP support was not defined, there +was the possibility of a false positive match when caselessly matching a "not +this character" item such as [^\x{1234}] (with a code point greater than 127) +because the "other case" variable was not being initialized. + +5. Although pcre_jit_exec checks whether the pattern is compiled +in a given mode, it was also expected that at least one mode is available. +This is fixed and pcre_jit_exec returns with PCRE_ERROR_JIT_BADOPTION +when the pattern is not optimized by JIT at all. + +6. The line number and related variables such as match counts in pcregrep +were all int variables, causing overflow when files with more than 2147483647 +lines were processed (assuming 32-bit ints). They have all been changed to +unsigned long ints. + +7. If a backreference with a minimum repeat count of zero was first in a +pattern, apart from assertions, an incorrect first matching character could be +recorded. For example, for the pattern /(?=(a))\1?b/, "b" was incorrectly set +as the first character of a match. + +8. Fix out-of-bounds read for partial matching of /./ against an empty string +when the newline type is CRLF. + +9. When matching using the the REG_STARTEND feature of the POSIX API with a +non-zero starting offset, unset capturing groups with lower numbers than a +group that did capture something were not being correctly returned as "unset" +(that is, with offset values of -1). + +10. Matching the pattern /(*UTF)\C[^\v]+\x80/ against an 8-bit string +containing multi-code-unit characters caused bad behaviour and possibly a +crash. This issue was fixed for other kinds of repeat in release 8.37 by change +38, but repeating character classes were overlooked. + +11. A small fix to pcregrep to avoid compiler warnings for -Wformat-overflow=2. + +12. Added --enable-jit=auto support to configure.ac. + +13. Fix misleading error message in configure.ac. + + +Version 8.41 05-July-2017 +------------------------- + +1. Fixed typo in CMakeLists.txt (wrong number of arguments for +PCRE_STATIC_RUNTIME (affects MSVC only). + +2. Issue 1 for 8.40 below was not correctly fixed. If pcregrep in multiline +mode with --only-matching matched several lines, it restarted scanning at the +next line instead of moving on to the end of the matched string, which can be +several lines after the start. + +3. Fix a missing else in the JIT compiler reported by 'idaifish'. + +4. A (?# style comment is now ignored between a basic quantifier and a +following '+' or '?' (example: /X+(?#comment)?Y/. + +5. Avoid use of a potentially overflowing buffer in pcregrep (patch by Petr +Pisar). + +6. Fuzzers have reported issues in pcretest. These are NOT serious (it is, +after all, just a test program). However, to stop the reports, some easy ones +are fixed: + + (a) Check for values < 256 when calling isprint() in pcretest. + (b) Give an error for too big a number after \O. + +7. In the 32-bit library in non-UTF mode, an attempt to find a Unicode +property for a character with a code point greater than 0x10ffff (the Unicode +maximum) caused a crash. + +8. The alternative matching function, pcre_dfa_exec() misbehaved if it +encountered a character class with a possessive repeat, for example [a-f]{3}+. + +9. When pcretest called pcre_copy_substring() in 32-bit mode, it set the buffer +length incorrectly, which could result in buffer overflow. + +10. Remove redundant line of code (accidentally left in ages ago). + +11. Applied C++ patch from Irfan Adilovic to guard 'using std::' directives +with namespace pcrecpp (Bugzilla #2084). + +12. Remove a duplication typo in pcre_tables.c. + +13. Fix returned offsets from regexec() when REG_STARTEND is used with a +starting offset greater than zero. + + +Version 8.40 11-January-2017 +---------------------------- + +1. Using -o with -M in pcregrep could cause unnecessary repeated output when + the match extended over a line boundary. + +2. Applied Chris Wilson's second patch (Bugzilla #1681) to CMakeLists.txt for + MSVC static compilation, putting the first patch under a new option. + +3. Fix register overwite in JIT when SSE2 acceleration is enabled. + +4. Ignore "show all captures" (/=) for DFA matching. + +5. Fix JIT unaligned accesses on x86. Patch by Marc Mutz. + +6. In any wide-character mode (8-bit UTF or any 16-bit or 32-bit mode), + without PCRE_UCP set, a negative character type such as \D in a positive + class should cause all characters greater than 255 to match, whatever else + is in the class. There was a bug that caused this not to happen if a + Unicode property item was added to such a class, for example [\D\P{Nd}] or + [\W\pL]. + +7. When pcretest was outputing information from a callout, the caret indicator + for the current position in the subject line was incorrect if it was after + an escape sequence for a character whose code point was greater than + \x{ff}. + +8. A pattern such as (?abc)(?(R)xyz) was incorrectly compiled such that + the conditional was interpreted as a reference to capturing group 1 instead + of a test for recursion. Any group whose name began with R was + misinterpreted in this way. (The reference interpretation should only + happen if the group's name is precisely "R".) + +9. A number of bugs have been mended relating to match start-up optimizations + when the first thing in a pattern is a positive lookahead. These all + applied only when PCRE_NO_START_OPTIMIZE was *not* set: + + (a) A pattern such as (?=.*X)X$ was incorrectly optimized as if it needed + both an initial 'X' and a following 'X'. + (b) Some patterns starting with an assertion that started with .* were + incorrectly optimized as having to match at the start of the subject or + after a newline. There are cases where this is not true, for example, + (?=.*[A-Z])(?=.{8,16})(?!.*[\s]) matches after the start in lines that + start with spaces. Starting .* in an assertion is no longer taken as an + indication of matching at the start (or after a newline). + + +Version 8.39 14-June-2016 +------------------------- + +1. If PCRE_AUTO_CALLOUT was set on a pattern that had a (?# comment between + an item and its qualifier (for example, A(?#comment)?B) pcre_compile() + misbehaved. This bug was found by the LLVM fuzzer. + +2. Similar to the above, if an isolated \E was present between an item and its + qualifier when PCRE_AUTO_CALLOUT was set, pcre_compile() misbehaved. This + bug was found by the LLVM fuzzer. + +3. Further to 8.38/46, negated classes such as [^[:^ascii:]\d] were also not + working correctly in UCP mode. + +4. The POSIX wrapper function regexec() crashed if the option REG_STARTEND + was set when the pmatch argument was NULL. It now returns REG_INVARG. + +5. Allow for up to 32-bit numbers in the ordin() function in pcregrep. + +6. An empty \Q\E sequence between an item and its qualifier caused + pcre_compile() to misbehave when auto callouts were enabled. This bug was + found by the LLVM fuzzer. + +7. If a pattern that was compiled with PCRE_EXTENDED started with white + space or a #-type comment that was followed by (?-x), which turns off + PCRE_EXTENDED, and there was no subsequent (?x) to turn it on again, + pcre_compile() assumed that (?-x) applied to the whole pattern and + consequently mis-compiled it. This bug was found by the LLVM fuzzer. + +8. A call of pcre_copy_named_substring() for a named substring whose number + was greater than the space in the ovector could cause a crash. + +9. Yet another buffer overflow bug involved duplicate named groups with a + group that reset capture numbers (compare 8.38/7 below). Once again, I have + just allowed for more memory, even if not needed. (A proper fix is + implemented in PCRE2, but it involves a lot of refactoring.) + +10. pcre_get_substring_list() crashed if the use of \K in a match caused the + start of the match to be earlier than the end. + +11. Migrating appropriate PCRE2 JIT improvements to PCRE. + +12. A pattern such as /(?<=((?C)0))/, which has a callout inside a lookbehind + assertion, caused pcretest to generate incorrect output, and also to read + uninitialized memory (detected by ASAN or valgrind). + +13. A pattern that included (*ACCEPT) in the middle of a sufficiently deeply + nested set of parentheses of sufficient size caused an overflow of the + compiling workspace (which was diagnosed, but of course is not desirable). + +14. And yet another buffer overflow bug involving duplicate named groups, this + time nested, with a nested back reference. Yet again, I have just allowed + for more memory, because anything more needs all the refactoring that has + been done for PCRE2. An example pattern that provoked this bug is: + /((?J)(?'R'(?'R'(?'R'(?'R'(?'R'(?|(\k'R'))))))))/ and the bug was + registered as CVE-2016-1283. + +15. pcretest went into a loop if global matching was requested with an ovector + size less than 2. It now gives an error message. This bug was found by + afl-fuzz. + +16. An invalid pattern fragment such as (?(?C)0 was not diagnosing an error + ("assertion expected") when (?(?C) was not followed by an opening + parenthesis. + +17. Fixed typo ("&&" for "&") in pcre_study(). Fortunately, this could not + actually affect anything, by sheer luck. + +18. Applied Chris Wilson's patch (Bugzilla #1681) to CMakeLists.txt for MSVC + static compilation. + +19. Modified the RunTest script to incorporate a valgrind suppressions file so + that certain errors, provoked by the SSE2 instruction set when JIT is used, + are ignored. + +20. A racing condition is fixed in JIT reported by Mozilla. + +21. Minor code refactor to avoid "array subscript is below array bounds" + compiler warning. + +22. Minor code refactor to avoid "left shift of negative number" warning. + +23. Fix typo causing compile error when 16- or 32-bit JIT is compiled without + UCP support. + +24. Refactor to avoid compiler warnings in pcrecpp.cc. + +25. Refactor to fix a typo in pcre_jit_test.c + +26. Patch to support compiling pcrecpp.cc with Intel compiler. + + +Version 8.38 23-November-2015 +----------------------------- + +1. If a group that contained a recursive back reference also contained a + forward reference subroutine call followed by a non-forward-reference + subroutine call, for example /.((?2)(?R)\1)()/, pcre_compile() failed to + compile correct code, leading to undefined behaviour or an internally + detected error. This bug was discovered by the LLVM fuzzer. + +2. Quantification of certain items (e.g. atomic back references) could cause + incorrect code to be compiled when recursive forward references were + involved. For example, in this pattern: /(?1)()((((((\1++))\x85)+)|))/. + This bug was discovered by the LLVM fuzzer. + +3. A repeated conditional group whose condition was a reference by name caused + a buffer overflow if there was more than one group with the given name. + This bug was discovered by the LLVM fuzzer. + +4. A recursive back reference by name within a group that had the same name as + another group caused a buffer overflow. For example: + /(?J)(?'d'(?'d'\g{d}))/. This bug was discovered by the LLVM fuzzer. + +5. A forward reference by name to a group whose number is the same as the + current group, for example in this pattern: /(?|(\k'Pm')|(?'Pm'))/, caused + a buffer overflow at compile time. This bug was discovered by the LLVM + fuzzer. + +6. A lookbehind assertion within a set of mutually recursive subpatterns could + provoke a buffer overflow. This bug was discovered by the LLVM fuzzer. + +7. Another buffer overflow bug involved duplicate named groups with a + reference between their definition, with a group that reset capture + numbers, for example: /(?J:(?|(?'R')(\k'R')|((?'R'))))/. This has been + fixed by always allowing for more memory, even if not needed. (A proper fix + is implemented in PCRE2, but it involves more refactoring.) + +8. There was no check for integer overflow in subroutine calls such as (?123). + +9. The table entry for \l in EBCDIC environments was incorrect, leading to its + being treated as a literal 'l' instead of causing an error. + +10. There was a buffer overflow if pcre_exec() was called with an ovector of + size 1. This bug was found by american fuzzy lop. + +11. If a non-capturing group containing a conditional group that could match + an empty string was repeated, it was not identified as matching an empty + string itself. For example: /^(?:(?(1)x|)+)+$()/. + +12. In an EBCDIC environment, pcretest was mishandling the escape sequences + \a and \e in test subject lines. + +13. In an EBCDIC environment, \a in a pattern was converted to the ASCII + instead of the EBCDIC value. + +14. The handling of \c in an EBCDIC environment has been revised so that it is + now compatible with the specification in Perl's perlebcdic page. + +15. The EBCDIC character 0x41 is a non-breaking space, equivalent to 0xa0 in + ASCII/Unicode. This has now been added to the list of characters that are + recognized as white space in EBCDIC. + +16. When PCRE was compiled without UCP support, the use of \p and \P gave an + error (correctly) when used outside a class, but did not give an error + within a class. + +17. \h within a class was incorrectly compiled in EBCDIC environments. + +18. A pattern with an unmatched closing parenthesis that contained a backward + assertion which itself contained a forward reference caused buffer + overflow. And example pattern is: /(?=di(?<=(?1))|(?=(.))))/. + +19. JIT should return with error when the compiled pattern requires more stack + space than the maximum. + +20. A possessively repeated conditional group that could match an empty string, + for example, /(?(R))*+/, was incorrectly compiled. + +21. Fix infinite recursion in the JIT compiler when certain patterns such as + /(?:|a|){100}x/ are analysed. + +22. Some patterns with character classes involving [: and \\ were incorrectly + compiled and could cause reading from uninitialized memory or an incorrect + error diagnosis. + +23. Pathological patterns containing many nested occurrences of [: caused + pcre_compile() to run for a very long time. + +24. A conditional group with only one branch has an implicit empty alternative + branch and must therefore be treated as potentially matching an empty + string. + +25. If (?R was followed by - or + incorrect behaviour happened instead of a + diagnostic. + +26. Arrange to give up on finding the minimum matching length for overly + complex patterns. + +27. Similar to (4) above: in a pattern with duplicated named groups and an + occurrence of (?| it is possible for an apparently non-recursive back + reference to become recursive if a later named group with the relevant + number is encountered. This could lead to a buffer overflow. Wen Guanxing + from Venustech ADLAB discovered this bug. + +28. If pcregrep was given the -q option with -c or -l, or when handling a + binary file, it incorrectly wrote output to stdout. + +29. The JIT compiler did not restore the control verb head in case of *THEN + control verbs. This issue was found by Karl Skomski with a custom LLVM + fuzzer. + +30. Error messages for syntax errors following \g and \k were giving inaccurate + offsets in the pattern. + +31. Added a check for integer overflow in conditions (?() and + (?(R). This omission was discovered by Karl Skomski with the LLVM + fuzzer. + +32. Handling recursive references such as (?2) when the reference is to a group + later in the pattern uses code that is very hacked about and error-prone. + It has been re-written for PCRE2. Here in PCRE1, a check has been added to + give an internal error if it is obvious that compiling has gone wrong. + +33. The JIT compiler should not check repeats after a {0,1} repeat byte code. + This issue was found by Karl Skomski with a custom LLVM fuzzer. + +34. The JIT compiler should restore the control chain for empty possessive + repeats. This issue was found by Karl Skomski with a custom LLVM fuzzer. + +35. Match limit check added to JIT recursion. This issue was found by Karl + Skomski with a custom LLVM fuzzer. + +36. Yet another case similar to 27 above has been circumvented by an + unconditional allocation of extra memory. This issue is fixed "properly" in + PCRE2 by refactoring the way references are handled. Wen Guanxing + from Venustech ADLAB discovered this bug. + +37. Fix two assertion fails in JIT. These issues were found by Karl Skomski + with a custom LLVM fuzzer. + +38. Fixed a corner case of range optimization in JIT. + +39. An incorrect error "overran compiling workspace" was given if there were + exactly enough group forward references such that the last one extended + into the workspace safety margin. The next one would have expanded the + workspace. The test for overflow was not including the safety margin. + +40. A match limit issue is fixed in JIT which was found by Karl Skomski + with a custom LLVM fuzzer. + +41. Remove the use of /dev/null in testdata/testinput2, because it doesn't + work under Windows. (Why has it taken so long for anyone to notice?) + +42. In a character class such as [\W\p{Any}] where both a negative-type escape + ("not a word character") and a property escape were present, the property + escape was being ignored. + +43. Fix crash caused by very long (*MARK) or (*THEN) names. + +44. A sequence such as [[:punct:]b] that is, a POSIX character class followed + by a single ASCII character in a class item, was incorrectly compiled in + UCP mode. The POSIX class got lost, but only if the single character + followed it. + +45. [:punct:] in UCP mode was matching some characters in the range 128-255 + that should not have been matched. + +46. If [:^ascii:] or [:^xdigit:] or [:^cntrl:] are present in a non-negated + class, all characters with code points greater than 255 are in the class. + When a Unicode property was also in the class (if PCRE_UCP is set, escapes + such as \w are turned into Unicode properties), wide characters were not + correctly handled, and could fail to match. + + +Version 8.37 28-April-2015 +-------------------------- + +1. When an (*ACCEPT) is triggered inside capturing parentheses, it arranges + for those parentheses to be closed with whatever has been captured so far. + However, it was failing to mark any other groups between the hightest + capture so far and the currrent group as "unset". Thus, the ovector for + those groups contained whatever was previously there. An example is the + pattern /(x)|((*ACCEPT))/ when matched against "abcd". + +2. If an assertion condition was quantified with a minimum of zero (an odd + thing to do, but it happened), SIGSEGV or other misbehaviour could occur. + +3. If a pattern in pcretest input had the P (POSIX) modifier followed by an + unrecognized modifier, a crash could occur. + +4. An attempt to do global matching in pcretest with a zero-length ovector + caused a crash. + +5. Fixed a memory leak during matching that could occur for a subpattern + subroutine call (recursive or otherwise) if the number of captured groups + that had to be saved was greater than ten. + +6. Catch a bad opcode during auto-possessification after compiling a bad UTF + string with NO_UTF_CHECK. This is a tidyup, not a bug fix, as passing bad + UTF with NO_UTF_CHECK is documented as having an undefined outcome. + +7. A UTF pattern containing a "not" match of a non-ASCII character and a + subroutine reference could loop at compile time. Example: /[^\xff]((?1))/. + +8. When a pattern is compiled, it remembers the highest back reference so that + when matching, if the ovector is too small, extra memory can be obtained to + use instead. A conditional subpattern whose condition is a check on a + capture having happened, such as, for example in the pattern + /^(?:(a)|b)(?(1)A|B)/, is another kind of back reference, but it was not + setting the highest backreference number. This mattered only if pcre_exec() + was called with an ovector that was too small to hold the capture, and there + was no other kind of back reference (a situation which is probably quite + rare). The effect of the bug was that the condition was always treated as + FALSE when the capture could not be consulted, leading to a incorrect + behaviour by pcre_exec(). This bug has been fixed. + +9. A reference to a duplicated named group (either a back reference or a test + for being set in a conditional) that occurred in a part of the pattern where + PCRE_DUPNAMES was not set caused the amount of memory needed for the pattern + to be incorrectly calculated, leading to overwriting. + +10. A mutually recursive set of back references such as (\2)(\1) caused a + segfault at study time (while trying to find the minimum matching length). + The infinite loop is now broken (with the minimum length unset, that is, + zero). + +11. If an assertion that was used as a condition was quantified with a minimum + of zero, matching went wrong. In particular, if the whole group had + unlimited repetition and could match an empty string, a segfault was + likely. The pattern (?(?=0)?)+ is an example that caused this. Perl allows + assertions to be quantified, but not if they are being used as conditions, + so the above pattern is faulted by Perl. PCRE has now been changed so that + it also rejects such patterns. + +12. A possessive capturing group such as (a)*+ with a minimum repeat of zero + failed to allow the zero-repeat case if pcre2_exec() was called with an + ovector too small to capture the group. + +13. Fixed two bugs in pcretest that were discovered by fuzzing and reported by + Red Hat Product Security: + + (a) A crash if /K and /F were both set with the option to save the compiled + pattern. + + (b) Another crash if the option to print captured substrings in a callout + was combined with setting a null ovector, for example \O\C+ as a subject + string. + +14. A pattern such as "((?2){0,1999}())?", which has a group containing a + forward reference repeated a large (but limited) number of times within a + repeated outer group that has a zero minimum quantifier, caused incorrect + code to be compiled, leading to the error "internal error: + previously-checked referenced subpattern not found" when an incorrect + memory address was read. This bug was reported as "heap overflow", + discovered by Kai Lu of Fortinet's FortiGuard Labs and given the CVE number + CVE-2015-2325. + +23. A pattern such as "((?+1)(\1))/" containing a forward reference subroutine + call within a group that also contained a recursive back reference caused + incorrect code to be compiled. This bug was reported as "heap overflow", + discovered by Kai Lu of Fortinet's FortiGuard Labs, and given the CVE + number CVE-2015-2326. + +24. Computing the size of the JIT read-only data in advance has been a source + of various issues, and new ones are still appear unfortunately. To fix + existing and future issues, size computation is eliminated from the code, + and replaced by on-demand memory allocation. + +25. A pattern such as /(?i)[A-`]/, where characters in the other case are + adjacent to the end of the range, and the range contained characters with + more than one other case, caused incorrect behaviour when compiled in UTF + mode. In that example, the range a-j was left out of the class. + +26. Fix JIT compilation of conditional blocks, which assertion + is converted to (*FAIL). E.g: /(?(?!))/. + +27. The pattern /(?(?!)^)/ caused references to random memory. This bug was + discovered by the LLVM fuzzer. + +28. The assertion (?!) is optimized to (*FAIL). This was not handled correctly + when this assertion was used as a condition, for example (?(?!)a|b). In + pcre2_match() it worked by luck; in pcre2_dfa_match() it gave an incorrect + error about an unsupported item. + +29. For some types of pattern, for example /Z*(|d*){216}/, the auto- + possessification code could take exponential time to complete. A recursion + depth limit of 1000 has been imposed to limit the resources used by this + optimization. + +30. A pattern such as /(*UTF)[\S\V\H]/, which contains a negated special class + such as \S in non-UCP mode, explicit wide characters (> 255) can be ignored + because \S ensures they are all in the class. The code for doing this was + interacting badly with the code for computing the amount of space needed to + compile the pattern, leading to a buffer overflow. This bug was discovered + by the LLVM fuzzer. + +31. A pattern such as /((?2)+)((?1))/ which has mutual recursion nested inside + other kinds of group caused stack overflow at compile time. This bug was + discovered by the LLVM fuzzer. + +32. A pattern such as /(?1)(?#?'){8}(a)/ which had a parenthesized comment + between a subroutine call and its quantifier was incorrectly compiled, + leading to buffer overflow or other errors. This bug was discovered by the + LLVM fuzzer. + +33. The illegal pattern /(?(?.*!.*)?)/ was not being diagnosed as missing an + assertion after (?(. The code was failing to check the character after + (?(?< for the ! or = that would indicate a lookbehind assertion. This bug + was discovered by the LLVM fuzzer. + +34. A pattern such as /X((?2)()*+){2}+/ which has a possessive quantifier with + a fixed maximum following a group that contains a subroutine reference was + incorrectly compiled and could trigger buffer overflow. This bug was + discovered by the LLVM fuzzer. + +35. A mutual recursion within a lookbehind assertion such as (?<=((?2))((?1))) + caused a stack overflow instead of the diagnosis of a non-fixed length + lookbehind assertion. This bug was discovered by the LLVM fuzzer. + +36. The use of \K in a positive lookbehind assertion in a non-anchored pattern + (e.g. /(?<=\Ka)/) could make pcregrep loop. + +37. There was a similar problem to 36 in pcretest for global matches. + +38. If a greedy quantified \X was preceded by \C in UTF mode (e.g. \C\X*), + and a subsequent item in the pattern caused a non-match, backtracking over + the repeated \X did not stop, but carried on past the start of the subject, + causing reference to random memory and/or a segfault. There were also some + other cases where backtracking after \C could crash. This set of bugs was + discovered by the LLVM fuzzer. + +39. The function for finding the minimum length of a matching string could take + a very long time if mutual recursion was present many times in a pattern, + for example, /((?2){73}(?2))((?1))/. A better mutual recursion detection + method has been implemented. This infelicity was discovered by the LLVM + fuzzer. + +40. Static linking against the PCRE library using the pkg-config module was + failing on missing pthread symbols. + + +Version 8.36 26-September-2014 +------------------------------ + +1. Got rid of some compiler warnings in the C++ modules that were shown up by + -Wmissing-field-initializers and -Wunused-parameter. + +2. The tests for quantifiers being too big (greater than 65535) were being + applied after reading the number, and stupidly assuming that integer + overflow would give a negative number. The tests are now applied as the + numbers are read. + +3. Tidy code in pcre_exec.c where two branches that used to be different are + now the same. + +4. The JIT compiler did not generate match limit checks for certain + bracketed expressions with quantifiers. This may lead to exponential + backtracking, instead of returning with PCRE_ERROR_MATCHLIMIT. This + issue should be resolved now. + +5. Fixed an issue, which occures when nested alternatives are optimized + with table jumps. + +6. Inserted two casts and changed some ints to size_t in the light of some + reported 64-bit compiler warnings (Bugzilla 1477). + +7. Fixed a bug concerned with zero-minimum possessive groups that could match + an empty string, which sometimes were behaving incorrectly in the + interpreter (though correctly in the JIT matcher). This pcretest input is + an example: + + '\A(?:[^"]++|"(?:[^"]*+|"")*+")++' + NON QUOTED "QUOT""ED" AFTER "NOT MATCHED + + the interpreter was reporting a match of 'NON QUOTED ' only, whereas the + JIT matcher and Perl both matched 'NON QUOTED "QUOT""ED" AFTER '. The test + for an empty string was breaking the inner loop and carrying on at a lower + level, when possessive repeated groups should always return to a higher + level as they have no backtrack points in them. The empty string test now + occurs at the outer level. + +8. Fixed a bug that was incorrectly auto-possessifying \w+ in the pattern + ^\w+(?>\s*)(?<=\w) which caused it not to match "test test". + +9. Give a compile-time error for \o{} (as Perl does) and for \x{} (which Perl + doesn't). + +10. Change 8.34/15 introduced a bug that caused the amount of memory needed + to hold a pattern to be incorrectly computed (too small) when there were + named back references to duplicated names. This could cause "internal + error: code overflow" or "double free or corruption" or other memory + handling errors. + +11. When named subpatterns had the same prefixes, back references could be + confused. For example, in this pattern: + + /(?Pa)?(?Pb)?(?()c|d)*l/ + + the reference to 'Name' was incorrectly treated as a reference to a + duplicate name. + +12. A pattern such as /^s?c/mi8 where the optional character has more than + one "other case" was incorrectly compiled such that it would only try to + match starting at "c". + +13. When a pattern starting with \s was studied, VT was not included in the + list of possible starting characters; this should have been part of the + 8.34/18 patch. + +14. If a character class started [\Qx]... where x is any character, the class + was incorrectly terminated at the ]. + +15. If a pattern that started with a caseless match for a character with more + than one "other case" was studied, PCRE did not set up the starting code + unit bit map for the list of possible characters. Now it does. This is an + optimization improvement, not a bug fix. + +16. The Unicode data tables have been updated to Unicode 7.0.0. + +17. Fixed a number of memory leaks in pcregrep. + +18. Avoid a compiler warning (from some compilers) for a function call with + a cast that removes "const" from an lvalue by using an intermediate + variable (to which the compiler does not object). + +19. Incorrect code was compiled if a group that contained an internal recursive + back reference was optional (had quantifier with a minimum of zero). This + example compiled incorrect code: /(((a\2)|(a*)\g<-1>))*/ and other examples + caused segmentation faults because of stack overflows at compile time. + +20. A pattern such as /((?(R)a|(?1)))+/, which contains a recursion within a + group that is quantified with an indefinite repeat, caused a compile-time + loop which used up all the system stack and provoked a segmentation fault. + This was not the same bug as 19 above. + +21. Add PCRECPP_EXP_DECL declaration to operator<< in pcre_stringpiece.h. + Patch by Mike Frysinger. + + +Version 8.35 04-April-2014 +-------------------------- + +1. A new flag is set, when property checks are present in an XCLASS. + When this flag is not set, PCRE can perform certain optimizations + such as studying these XCLASS-es. + +2. The auto-possessification of character sets were improved: a normal + and an extended character set can be compared now. Furthermore + the JIT compiler optimizes more character set checks. + +3. Got rid of some compiler warnings for potentially uninitialized variables + that show up only when compiled with -O2. + +4. A pattern such as (?=ab\K) that uses \K in an assertion can set the start + of a match later then the end of the match. The pcretest program was not + handling the case sensibly - it was outputting from the start to the next + binary zero. It now reports this situation in a message, and outputs the + text from the end to the start. + +5. Fast forward search is improved in JIT. Instead of the first three + characters, any three characters with fixed position can be searched. + Search order: first, last, middle. + +6. Improve character range checks in JIT. Characters are read by an inprecise + function now, which returns with an unknown value if the character code is + above a certain threshold (e.g: 256). The only limitation is that the value + must be bigger than the threshold as well. This function is useful when + the characters above the threshold are handled in the same way. + +7. The macros whose names start with RAWUCHAR are placeholders for a future + mode in which only the bottom 21 bits of 32-bit data items are used. To + make this more memorable for those maintaining the code, the names have + been changed to start with UCHAR21, and an extensive comment has been added + to their definition. + +8. Add missing (new) files sljitNativeTILEGX.c and sljitNativeTILEGX-encoder.c + to the export list in Makefile.am (they were accidentally omitted from the + 8.34 tarball). + +9. The informational output from pcretest used the phrase "starting byte set" + which is inappropriate for the 16-bit and 32-bit libraries. As the output + for "first char" and "need char" really means "non-UTF-char", I've changed + "byte" to "char", and slightly reworded the output. The documentation about + these values has also been (I hope) clarified. + +10. Another JIT related optimization: use table jumps for selecting the correct + backtracking path, when more than four alternatives are present inside a + bracket. + +11. Empty match is not possible, when the minimum length is greater than zero, + and there is no \K in the pattern. JIT should avoid empty match checks in + such cases. + +12. In a caseless character class with UCP support, when a character with more + than one alternative case was not the first character of a range, not all + the alternative cases were added to the class. For example, s and \x{17f} + are both alternative cases for S: the class [RST] was handled correctly, + but [R-T] was not. + +13. The configure.ac file always checked for pthread support when JIT was + enabled. This is not used in Windows, so I have put this test inside a + check for the presence of windows.h (which was already tested for). + +14. Improve pattern prefix search by a simplified Boyer-Moore algorithm in JIT. + The algorithm provides a way to skip certain starting offsets, and usually + faster than linear prefix searches. + +15. Change 13 for 8.20 updated RunTest to check for the 'fr' locale as well + as for 'fr_FR' and 'french'. For some reason, however, it then used the + Windows-specific input and output files, which have 'french' screwed in. + So this could never have worked. One of the problems with locales is that + they aren't always the same. I have now updated RunTest so that it checks + the output of the locale test (test 3) against three different output + files, and it allows the test to pass if any one of them matches. With luck + this should make the test pass on some versions of Solaris where it was + failing. Because of the uncertainty, the script did not used to stop if + test 3 failed; it now does. If further versions of a French locale ever + come to light, they can now easily be added. + +16. If --with-pcregrep-bufsize was given a non-integer value such as "50K", + there was a message during ./configure, but it did not stop. This now + provokes an error. The invalid example in README has been corrected. + If a value less than the minimum is given, the minimum value has always + been used, but now a warning is given. + +17. If --enable-bsr-anycrlf was set, the special 16/32-bit test failed. This + was a bug in the test system, which is now fixed. Also, the list of various + configurations that are tested for each release did not have one with both + 16/32 bits and --enable-bar-anycrlf. It now does. + +18. pcretest was missing "-C bsr" for displaying the \R default setting. + +19. Little endian PowerPC systems are supported now by the JIT compiler. + +20. The fast forward newline mechanism could enter to an infinite loop on + certain invalid UTF-8 input. Although we don't support these cases + this issue can be fixed by a performance optimization. + +21. Change 33 of 8.34 is not sufficient to ensure stack safety because it does + not take account if existing stack usage. There is now a new global + variable called pcre_stack_guard that can be set to point to an external + function to check stack availability. It is called at the start of + processing every parenthesized group. + +22. A typo in the code meant that in ungreedy mode the max/min qualifier + behaved like a min-possessive qualifier, and, for example, /a{1,3}b/U did + not match "ab". + +23. When UTF was disabled, the JIT program reported some incorrect compile + errors. These messages are silenced now. + +24. Experimental support for ARM-64 and MIPS-64 has been added to the JIT + compiler. + +25. Change all the temporary files used in RunGrepTest to be different to those + used by RunTest so that the tests can be run simultaneously, for example by + "make -j check". + + +Version 8.34 15-December-2013 +----------------------------- + +1. Add pcre[16|32]_jit_free_unused_memory to forcibly free unused JIT + executable memory. Patch inspired by Carsten Klein. + +2. ./configure --enable-coverage defined SUPPORT_GCOV in config.h, although + this macro is never tested and has no effect, because the work to support + coverage involves only compiling and linking options and special targets in + the Makefile. The comment in config.h implied that defining the macro would + enable coverage support, which is totally false. There was also support for + setting this macro in the CMake files (my fault, I just copied it from + configure). SUPPORT_GCOV has now been removed. + +3. Make a small performance improvement in strlen16() and strlen32() in + pcretest. + +4. Change 36 for 8.33 left some unreachable statements in pcre_exec.c, + detected by the Solaris compiler (gcc doesn't seem to be able to diagnose + these cases). There was also one in pcretest.c. + +5. Cleaned up a "may be uninitialized" compiler warning in pcre_exec.c. + +6. In UTF mode, the code for checking whether a group could match an empty + string (which is used for indefinitely repeated groups to allow for + breaking an infinite loop) was broken when the group contained a repeated + negated single-character class with a character that occupied more than one + data item and had a minimum repetition of zero (for example, [^\x{100}]* in + UTF-8 mode). The effect was undefined: the group might or might not be + deemed as matching an empty string, or the program might have crashed. + +7. The code for checking whether a group could match an empty string was not + recognizing that \h, \H, \v, \V, and \R must match a character. + +8. Implemented PCRE_INFO_MATCH_EMPTY, which yields 1 if the pattern can match + an empty string. If it can, pcretest shows this in its information output. + +9. Fixed two related bugs that applied to Unicode extended grapheme clusters + that were repeated with a maximizing qualifier (e.g. \X* or \X{2,5}) when + matched by pcre_exec() without using JIT: + + (a) If the rest of the pattern did not match after a maximal run of + grapheme clusters, the code for backing up to try with fewer of them + did not always back up over a full grapheme when characters that do not + have the modifier quality were involved, e.g. Hangul syllables. + + (b) If the match point in a subject started with modifier character, and + there was no match, the code could incorrectly back up beyond the match + point, and potentially beyond the first character in the subject, + leading to a segfault or an incorrect match result. + +10. A conditional group with an assertion condition could lead to PCRE + recording an incorrect first data item for a match if no other first data + item was recorded. For example, the pattern (?(?=ab)ab) recorded "a" as a + first data item, and therefore matched "ca" after "c" instead of at the + start. + +11. Change 40 for 8.33 (allowing pcregrep to find empty strings) showed up a + bug that caused the command "echo a | ./pcregrep -M '|a'" to loop. + +12. The source of pcregrep now includes z/OS-specific code so that it can be + compiled for z/OS as part of the special z/OS distribution. + +13. Added the -T and -TM options to pcretest. + +14. The code in pcre_compile.c for creating the table of named capturing groups + has been refactored. Instead of creating the table dynamically during the + actual compiling pass, the information is remembered during the pre-compile + pass (on the stack unless there are more than 20 named groups, in which + case malloc() is used) and the whole table is created before the actual + compile happens. This has simplified the code (it is now nearly 150 lines + shorter) and prepared the way for better handling of references to groups + with duplicate names. + +15. A back reference to a named subpattern when there is more than one of the + same name now checks them in the order in which they appear in the pattern. + The first one that is set is used for the reference. Previously only the + first one was inspected. This change makes PCRE more compatible with Perl. + +16. Unicode character properties were updated from Unicode 6.3.0. + +17. The compile-time code for auto-possessification has been refactored, based + on a patch by Zoltan Herczeg. It now happens after instead of during + compilation. The code is cleaner, and more cases are handled. The option + PCRE_NO_AUTO_POSSESS is added for testing purposes, and the -O and /O + options in pcretest are provided to set it. It can also be set by + (*NO_AUTO_POSSESS) at the start of a pattern. + +18. The character VT has been added to the default ("C" locale) set of + characters that match \s and are generally treated as white space, + following this same change in Perl 5.18. There is now no difference between + "Perl space" and "POSIX space". Whether VT is treated as white space in + other locales depends on the locale. + +19. The code for checking named groups as conditions, either for being set or + for being recursed, has been refactored (this is related to 14 and 15 + above). Processing unduplicated named groups should now be as fast at + numerical groups, and processing duplicated groups should be faster than + before. + +20. Two patches to the CMake build system, by Alexander Barkov: + + (1) Replace the "source" command by "." in CMakeLists.txt because + "source" is a bash-ism. + + (2) Add missing HAVE_STDINT_H and HAVE_INTTYPES_H to config-cmake.h.in; + without these the CMake build does not work on Solaris. + +21. Perl has changed its handling of \8 and \9. If there is no previously + encountered capturing group of those numbers, they are treated as the + literal characters 8 and 9 instead of a binary zero followed by the + literals. PCRE now does the same. + +22. Following Perl, added \o{} to specify codepoints in octal, making it + possible to specify values greater than 0777 and also making them + unambiguous. + +23. Perl now gives an error for missing closing braces after \x{... instead of + treating the string as literal. PCRE now does the same. + +24. RunTest used to grumble if an inappropriate test was selected explicitly, + but just skip it when running all tests. This make it awkward to run ranges + of tests when one of them was inappropriate. Now it just skips any + inappropriate tests, as it always did when running all tests. + +25. If PCRE_AUTO_CALLOUT and PCRE_UCP were set for a pattern that contained + character types such as \d or \w, too many callouts were inserted, and the + data that they returned was rubbish. + +26. In UCP mode, \s was not matching two of the characters that Perl matches, + namely NEL (U+0085) and MONGOLIAN VOWEL SEPARATOR (U+180E), though they + were matched by \h. The code has now been refactored so that the lists of + the horizontal and vertical whitespace characters used for \h and \v (which + are defined only in one place) are now also used for \s. + +27. Add JIT support for the 64 bit TileGX architecture. + Patch by Jiong Wang (Tilera Corporation). + +28. Possessive quantifiers for classes (both explicit and automatically + generated) now use special opcodes instead of wrapping in ONCE brackets. + +29. Whereas an item such as A{4}+ ignored the possessivenes of the quantifier + (because it's meaningless), this was not happening when PCRE_CASELESS was + set. Not wrong, but inefficient. + +30. Updated perltest.pl to add /u (force Unicode mode) when /W (use Unicode + properties for \w, \d, etc) is present in a test regex. Otherwise if the + test contains no characters greater than 255, Perl doesn't realise it + should be using Unicode semantics. + +31. Upgraded the handling of the POSIX classes [:graph:], [:print:], and + [:punct:] when PCRE_UCP is set so as to include the same characters as Perl + does in Unicode mode. + +32. Added the "forbid" facility to pcretest so that putting tests into the + wrong test files can sometimes be quickly detected. + +33. There is now a limit (default 250) on the depth of nesting of parentheses. + This limit is imposed to control the amount of system stack used at compile + time. It can be changed at build time by --with-parens-nest-limit=xxx or + the equivalent in CMake. + +34. Character classes such as [A-\d] or [a-[:digit:]] now cause compile-time + errors. Perl warns for these when in warning mode, but PCRE has no facility + for giving warnings. + +35. Change 34 for 8.13 allowed quantifiers on assertions, because Perl does. + However, this was not working for (?!) because it is optimized to (*FAIL), + for which PCRE does not allow quantifiers. The optimization is now disabled + when a quantifier follows (?!). I can't see any use for this, but it makes + things uniform. + +36. Perl no longer allows group names to start with digits, so I have made this + change also in PCRE. It simplifies the code a bit. + +37. In extended mode, Perl ignores spaces before a + that indicates a + possessive quantifier. PCRE allowed a space before the quantifier, but not + before the possessive +. It now does. + +38. The use of \K (reset reported match start) within a repeated possessive + group such as (a\Kb)*+ was not working. + +40. Document that the same character tables must be used at compile time and + run time, and that the facility to pass tables to pcre_exec() and + pcre_dfa_exec() is for use only with saved/restored patterns. + +41. Applied Jeff Trawick's patch CMakeLists.txt, which "provides two new + features for Builds with MSVC: + + 1. Support pcre.rc and/or pcreposix.rc (as is already done for MinGW + builds). The .rc files can be used to set FileDescription and many other + attributes. + + 2. Add an option (-DINSTALL_MSVC_PDB) to enable installation of .pdb files. + This allows higher-level build scripts which want .pdb files to avoid + hard-coding the exact files needed." + +42. Added support for [[:<:]] and [[:>:]] as used in the BSD POSIX library to + mean "start of word" and "end of word", respectively, as a transition aid. + +43. A minimizing repeat of a class containing codepoints greater than 255 in + non-UTF 16-bit or 32-bit modes caused an internal error when PCRE was + compiled to use the heap for recursion. + +44. Got rid of some compiler warnings for unused variables when UTF but not UCP + is configured. + + +Version 8.33 28-May-2013 +------------------------ + +1. Added 'U' to some constants that are compared to unsigned integers, to + avoid compiler signed/unsigned warnings. Added (int) casts to unsigned + variables that are added to signed variables, to ensure the result is + signed and can be negated. + +2. Applied patch by Daniel Richard G for quashing MSVC warnings to the + CMake config files. + +3. Revise the creation of config.h.generic so that all boolean macros are + #undefined, whereas non-boolean macros are #ifndef/#endif-ed. This makes + overriding via -D on the command line possible. + +4. Changing the definition of the variable "op" in pcre_exec.c from pcre_uchar + to unsigned int is reported to make a quite noticeable speed difference in + a specific Windows environment. Testing on Linux did also appear to show + some benefit (and it is clearly not harmful). Also fixed the definition of + Xop which should be unsigned. + +5. Related to (4), changing the definition of the intermediate variable cc + in repeated character loops from pcre_uchar to pcre_uint32 also gave speed + improvements. + +6. Fix forward search in JIT when link size is 3 or greater. Also removed some + unnecessary spaces. + +7. Adjust autogen.sh and configure.ac to lose warnings given by automake 1.12 + and later. + +8. Fix two buffer over read issues in 16 and 32 bit modes. Affects JIT only. + +9. Optimizing fast_forward_start_bits in JIT. + +10. Adding support for callouts in JIT, and fixing some issues revealed + during this work. Namely: + + (a) Unoptimized capturing brackets incorrectly reset on backtrack. + + (b) Minimum length was not checked before the matching is started. + +11. The value of capture_last that is passed to callouts was incorrect in some + cases when there was a capture on one path that was subsequently abandoned + after a backtrack. Also, the capture_last value is now reset after a + recursion, since all captures are also reset in this case. + +12. The interpreter no longer returns the "too many substrings" error in the + case when an overflowing capture is in a branch that is subsequently + abandoned after a backtrack. + +13. In the pathological case when an offset vector of size 2 is used, pcretest + now prints out the matched string after a yield of 0 or 1. + +14. Inlining subpatterns in recursions, when certain conditions are fulfilled. + Only supported by the JIT compiler at the moment. + +15. JIT compiler now supports 32 bit Macs thanks to Lawrence Velazquez. + +16. Partial matches now set offsets[2] to the "bumpalong" value, that is, the + offset of the starting point of the matching process, provided the offsets + vector is large enough. + +17. The \A escape now records a lookbehind value of 1, though its execution + does not actually inspect the previous character. This is to ensure that, + in partial multi-segment matching, at least one character from the old + segment is retained when a new segment is processed. Otherwise, if there + are no lookbehinds in the pattern, \A might match incorrectly at the start + of a new segment. + +18. Added some #ifdef __VMS code into pcretest.c to help VMS implementations. + +19. Redefined some pcre_uchar variables in pcre_exec.c as pcre_uint32; this + gives some modest performance improvement in 8-bit mode. + +20. Added the PCRE-specific property \p{Xuc} for matching characters that can + be expressed in certain programming languages using Universal Character + Names. + +21. Unicode validation has been updated in the light of Unicode Corrigendum #9, + which points out that "non characters" are not "characters that may not + appear in Unicode strings" but rather "characters that are reserved for + internal use and have only local meaning". + +22. When a pattern was compiled with automatic callouts (PCRE_AUTO_CALLOUT) and + there was a conditional group that depended on an assertion, if the + assertion was false, the callout that immediately followed the alternation + in the condition was skipped when pcre_exec() was used for matching. + +23. Allow an explicit callout to be inserted before an assertion that is the + condition for a conditional group, for compatibility with automatic + callouts, which always insert a callout at this point. + +24. In 8.31, (*COMMIT) was confined to within a recursive subpattern. Perl also + confines (*SKIP) and (*PRUNE) in the same way, and this has now been done. + +25. (*PRUNE) is now supported by the JIT compiler. + +26. Fix infinite loop when /(?<=(*SKIP)ac)a/ is matched against aa. + +27. Fix the case where there are two or more SKIPs with arguments that may be + ignored. + +28. (*SKIP) is now supported by the JIT compiler. + +29. (*THEN) is now supported by the JIT compiler. + +30. Update RunTest with additional test selector options. + +31. The way PCRE handles backtracking verbs has been changed in two ways. + + (1) Previously, in something like (*COMMIT)(*SKIP), COMMIT would override + SKIP. Now, PCRE acts on whichever backtracking verb is reached first by + backtracking. In some cases this makes it more Perl-compatible, but Perl's + rather obscure rules do not always do the same thing. + + (2) Previously, backtracking verbs were confined within assertions. This is + no longer the case for positive assertions, except for (*ACCEPT). Again, + this sometimes improves Perl compatibility, and sometimes does not. + +32. A number of tests that were in test 2 because Perl did things differently + have been moved to test 1, because either Perl or PCRE has changed, and + these tests are now compatible. + +32. Backtracking control verbs are now handled in the same way in JIT and + interpreter. + +33. An opening parenthesis in a MARK/PRUNE/SKIP/THEN name in a pattern that + contained a forward subroutine reference caused a compile error. + +34. Auto-detect and optimize limited repetitions in JIT. + +35. Implement PCRE_NEVER_UTF to lock out the use of UTF, in particular, + blocking (*UTF) etc. + +36. In the interpreter, maximizing pattern repetitions for characters and + character types now use tail recursion, which reduces stack usage. + +37. The value of the max lookbehind was not correctly preserved if a compiled + and saved regex was reloaded on a host of different endianness. + +38. Implemented (*LIMIT_MATCH) and (*LIMIT_RECURSION). As part of the extension + of the compiled pattern block, expand the flags field from 16 to 32 bits + because it was almost full. + +39. Try madvise first before posix_madvise. + +40. Change 7 for PCRE 7.9 made it impossible for pcregrep to find empty lines + with a pattern such as ^$. It has taken 4 years for anybody to notice! The + original change locked out all matches of empty strings. This has been + changed so that one match of an empty string per line is recognized. + Subsequent searches on the same line (for colouring or for --only-matching, + for example) do not recognize empty strings. + +41. Applied a user patch to fix a number of spelling mistakes in comments. + +42. Data lines longer than 65536 caused pcretest to crash. + +43. Clarified the data type for length and startoffset arguments for pcre_exec + and pcre_dfa_exec in the function-specific man pages, where they were + explicitly stated to be in bytes, never having been updated. I also added + some clarification to the pcreapi man page. + +44. A call to pcre_dfa_exec() with an output vector size less than 2 caused + a segmentation fault. + + +Version 8.32 30-November-2012 +----------------------------- + +1. Improved JIT compiler optimizations for first character search and single + character iterators. + +2. Supporting IBM XL C compilers for PPC architectures in the JIT compiler. + Patch by Daniel Richard G. + +3. Single character iterator optimizations in the JIT compiler. + +4. Improved JIT compiler optimizations for character ranges. + +5. Rename the "leave" variable names to "quit" to improve WinCE compatibility. + Reported by Giuseppe D'Angelo. + +6. The PCRE_STARTLINE bit, indicating that a match can occur only at the start + of a line, was being set incorrectly in cases where .* appeared inside + atomic brackets at the start of a pattern, or where there was a subsequent + *PRUNE or *SKIP. + +7. Improved instruction cache flush for POWER/PowerPC. + Patch by Daniel Richard G. + +8. Fixed a number of issues in pcregrep, making it more compatible with GNU + grep: + + (a) There is now no limit to the number of patterns to be matched. + + (b) An error is given if a pattern is too long. + + (c) Multiple uses of --exclude, --exclude-dir, --include, and --include-dir + are now supported. + + (d) --exclude-from and --include-from (multiple use) have been added. + + (e) Exclusions and inclusions now apply to all files and directories, not + just to those obtained from scanning a directory recursively. + + (f) Multiple uses of -f and --file-list are now supported. + + (g) In a Windows environment, the default for -d has been changed from + "read" (the GNU grep default) to "skip", because otherwise the presence + of a directory in the file list provokes an error. + + (h) The documentation has been revised and clarified in places. + +9. Improve the matching speed of capturing brackets. + +10. Changed the meaning of \X so that it now matches a Unicode extended + grapheme cluster. + +11. Patch by Daniel Richard G to the autoconf files to add a macro for sorting + out POSIX threads when JIT support is configured. + +12. Added support for PCRE_STUDY_EXTRA_NEEDED. + +13. In the POSIX wrapper regcomp() function, setting re_nsub field in the preg + structure could go wrong in environments where size_t is not the same size + as int. + +14. Applied user-supplied patch to pcrecpp.cc to allow PCRE_NO_UTF8_CHECK to be + set. + +15. The EBCDIC support had decayed; later updates to the code had included + explicit references to (e.g.) \x0a instead of CHAR_LF. There has been a + general tidy up of EBCDIC-related issues, and the documentation was also + not quite right. There is now a test that can be run on ASCII systems to + check some of the EBCDIC-related things (but is it not a full test). + +16. The new PCRE_STUDY_EXTRA_NEEDED option is now used by pcregrep, resulting + in a small tidy to the code. + +17. Fix JIT tests when UTF is disabled and both 8 and 16 bit mode are enabled. + +18. If the --only-matching (-o) option in pcregrep is specified multiple + times, each one causes appropriate output. For example, -o1 -o2 outputs the + substrings matched by the 1st and 2nd capturing parentheses. A separating + string can be specified by --om-separator (default empty). + +19. Improving the first n character searches. + +20. Turn case lists for horizontal and vertical white space into macros so that + they are defined only once. + +21. This set of changes together give more compatible Unicode case-folding + behaviour for characters that have more than one other case when UCP + support is available. + + (a) The Unicode property table now has offsets into a new table of sets of + three or more characters that are case-equivalent. The MultiStage2.py + script that generates these tables (the pcre_ucd.c file) now scans + CaseFolding.txt instead of UnicodeData.txt for character case + information. + + (b) The code for adding characters or ranges of characters to a character + class has been abstracted into a generalized function that also handles + case-independence. In UTF-mode with UCP support, this uses the new data + to handle characters with more than one other case. + + (c) A bug that is fixed as a result of (b) is that codepoints less than 256 + whose other case is greater than 256 are now correctly matched + caselessly. Previously, the high codepoint matched the low one, but not + vice versa. + + (d) The processing of \h, \H, \v, and \ in character classes now makes use + of the new class addition function, using character lists defined as + macros alongside the case definitions of 20 above. + + (e) Caseless back references now work with characters that have more than + one other case. + + (f) General caseless matching of characters with more than one other case + is supported. + +22. Unicode character properties were updated from Unicode 6.2.0 + +23. Improved CMake support under Windows. Patch by Daniel Richard G. + +24. Add support for 32-bit character strings, and UTF-32 + +25. Major JIT compiler update (code refactoring and bugfixing). + Experimental Sparc 32 support is added. + +26. Applied a modified version of Daniel Richard G's patch to create + pcre.h.generic and config.h.generic by "make" instead of in the + PrepareRelease script. + +27. Added a definition for CHAR_NULL (helpful for the z/OS port), and use it in + pcre_compile.c when checking for a zero character. + +28. Introducing a native interface for JIT. Through this interface, the compiled + machine code can be directly executed. The purpose of this interface is to + provide fast pattern matching, so several sanity checks are not performed. + However, feature tests are still performed. The new interface provides + 1.4x speedup compared to the old one. + +29. If pcre_exec() or pcre_dfa_exec() was called with a negative value for + the subject string length, the error given was PCRE_ERROR_BADOFFSET, which + was confusing. There is now a new error PCRE_ERROR_BADLENGTH for this case. + +30. In 8-bit UTF-8 mode, pcretest failed to give an error for data codepoints + greater than 0x7fffffff (which cannot be represented in UTF-8, even under + the "old" RFC 2279). Instead, it ended up passing a negative length to + pcre_exec(). + +31. Add support for GCC's visibility feature to hide internal functions. + +32. Running "pcretest -C pcre8" or "pcretest -C pcre16" gave a spurious error + "unknown -C option" after outputting 0 or 1. + +33. There is now support for generating a code coverage report for the test + suite in environments where gcc is the compiler and lcov is installed. This + is mainly for the benefit of the developers. + +34. If PCRE is built with --enable-valgrind, certain memory regions are marked + unaddressable using valgrind annotations, allowing valgrind to detect + invalid memory accesses. This is mainly for the benefit of the developers. + +25. (*UTF) can now be used to start a pattern in any of the three libraries. + +26. Give configure error if --enable-cpp but no C++ compiler found. + + +Version 8.31 06-July-2012 +------------------------- + +1. Fixing a wrong JIT test case and some compiler warnings. + +2. Removed a bashism from the RunTest script. + +3. Add a cast to pcre_exec.c to fix the warning "unary minus operator applied + to unsigned type, result still unsigned" that was given by an MS compiler + on encountering the code "-sizeof(xxx)". + +4. Partial matching support is added to the JIT compiler. + +5. Fixed several bugs concerned with partial matching of items that consist + of more than one character: + + (a) /^(..)\1/ did not partially match "aba" because checking references was + done on an "all or nothing" basis. This also applied to repeated + references. + + (b) \R did not give a hard partial match if \r was found at the end of the + subject. + + (c) \X did not give a hard partial match after matching one or more + characters at the end of the subject. + + (d) When newline was set to CRLF, a pattern such as /a$/ did not recognize + a partial match for the string "\r". + + (e) When newline was set to CRLF, the metacharacter "." did not recognize + a partial match for a CR character at the end of the subject string. + +6. If JIT is requested using /S++ or -s++ (instead of just /S+ or -s+) when + running pcretest, the text "(JIT)" added to the output whenever JIT is + actually used to run the match. + +7. Individual JIT compile options can be set in pcretest by following -s+[+] + or /S+[+] with a digit between 1 and 7. + +8. OP_NOT now supports any UTF character not just single-byte ones. + +9. (*MARK) control verb is now supported by the JIT compiler. + +10. The command "./RunTest list" lists the available tests without actually + running any of them. (Because I keep forgetting what they all are.) + +11. Add PCRE_INFO_MAXLOOKBEHIND. + +12. Applied a (slightly modified) user-supplied patch that improves performance + when the heap is used for recursion (compiled with --disable-stack-for- + recursion). Instead of malloc and free for each heap frame each time a + logical recursion happens, frames are retained on a chain and re-used where + possible. This sometimes gives as much as 30% improvement. + +13. As documented, (*COMMIT) is now confined to within a recursive subpattern + call. + +14. As documented, (*COMMIT) is now confined to within a positive assertion. + +15. It is now possible to link pcretest with libedit as an alternative to + libreadline. + +16. (*COMMIT) control verb is now supported by the JIT compiler. + +17. The Unicode data tables have been updated to Unicode 6.1.0. + +18. Added --file-list option to pcregrep. + +19. Added binary file support to pcregrep, including the -a, --binary-files, + -I, and --text options. + +20. The madvise function is renamed for posix_madvise for QNX compatibility + reasons. Fixed by Giuseppe D'Angelo. + +21. Fixed a bug for backward assertions with REVERSE 0 in the JIT compiler. + +22. Changed the option for creating symbolic links for 16-bit man pages from + -s to -sf so that re-installing does not cause issues. + +23. Support PCRE_NO_START_OPTIMIZE in JIT as (*MARK) support requires it. + +24. Fixed a very old bug in pcretest that caused errors with restarted DFA + matches in certain environments (the workspace was not being correctly + retained). Also added to pcre_dfa_exec() a simple plausibility check on + some of the workspace data at the beginning of a restart. + +25. \s*\R was auto-possessifying the \s* when it should not, whereas \S*\R + was not doing so when it should - probably a typo introduced by SVN 528 + (change 8.10/14). + +26. When PCRE_UCP was not set, \w+\x{c4} was incorrectly auto-possessifying the + \w+ when the character tables indicated that \x{c4} was a word character. + There were several related cases, all because the tests for doing a table + lookup were testing for characters less than 127 instead of 255. + +27. If a pattern contains capturing parentheses that are not used in a match, + their slots in the ovector are set to -1. For those that are higher than + any matched groups, this happens at the end of processing. In the case when + there were back references that the ovector was too small to contain + (causing temporary malloc'd memory to be used during matching), and the + highest capturing number was not used, memory off the end of the ovector + was incorrectly being set to -1. (It was using the size of the temporary + memory instead of the true size.) + +28. To catch bugs like 27 using valgrind, when pcretest is asked to specify an + ovector size, it uses memory at the end of the block that it has got. + +29. Check for an overlong MARK name and give an error at compile time. The + limit is 255 for the 8-bit library and 65535 for the 16-bit library. + +30. JIT compiler update. + +31. JIT is now supported on jailbroken iOS devices. Thanks for Ruiger + Rill for the patch. + +32. Put spaces around SLJIT_PRINT_D in the JIT compiler. Required by CXX11. + +33. Variable renamings in the PCRE-JIT compiler. No functionality change. + +34. Fixed typos in pcregrep: in two places there was SUPPORT_LIBZ2 instead of + SUPPORT_LIBBZ2. This caused a build problem when bzip2 but not gzip (zlib) + was enabled. + +35. Improve JIT code generation for greedy plus quantifier. + +36. When /((?:a?)*)*c/ or /((?>a?)*)*c/ was matched against "aac", it set group + 1 to "aa" instead of to an empty string. The bug affected repeated groups + that could potentially match an empty string. + +37. Optimizing single character iterators in JIT. + +38. Wide characters specified with \uxxxx in JavaScript mode are now subject to + the same checks as \x{...} characters in non-JavaScript mode. Specifically, + codepoints that are too big for the mode are faulted, and in a UTF mode, + disallowed codepoints are also faulted. + +39. If PCRE was compiled with UTF support, in three places in the DFA + matcher there was code that should only have been obeyed in UTF mode, but + was being obeyed unconditionally. In 8-bit mode this could cause incorrect + processing when bytes with values greater than 127 were present. In 16-bit + mode the bug would be provoked by values in the range 0xfc00 to 0xdc00. In + both cases the values are those that cannot be the first data item in a UTF + character. The three items that might have provoked this were recursions, + possessively repeated groups, and atomic groups. + +40. Ensure that libpcre is explicitly listed in the link commands for pcretest + and pcregrep, because some OS require shared objects to be explicitly + passed to ld, causing the link step to fail if they are not. + +41. There were two incorrect #ifdefs in pcre_study.c, meaning that, in 16-bit + mode, patterns that started with \h* or \R* might be incorrectly matched. + + +Version 8.30 04-February-2012 +----------------------------- + +1. Renamed "isnumber" as "is_a_number" because in some Mac environments this + name is defined in ctype.h. + +2. Fixed a bug in fixed-length calculation for lookbehinds that would show up + only in quite long subpatterns. + +3. Removed the function pcre_info(), which has been obsolete and deprecated + since it was replaced by pcre_fullinfo() in February 2000. + +4. For a non-anchored pattern, if (*SKIP) was given with a name that did not + match a (*MARK), and the match failed at the start of the subject, a + reference to memory before the start of the subject could occur. This bug + was introduced by fix 17 of release 8.21. + +5. A reference to an unset group with zero minimum repetition was giving + totally wrong answers (in non-JavaScript-compatibility mode). For example, + /(another)?(\1?)test/ matched against "hello world test". This bug was + introduced in release 8.13. + +6. Add support for 16-bit character strings (a large amount of work involving + many changes and refactorings). + +7. RunGrepTest failed on msys because \r\n was replaced by whitespace when the + command "pattern=`printf 'xxx\r\njkl'`" was run. The pattern is now taken + from a file. + +8. Ovector size of 2 is also supported by JIT based pcre_exec (the ovector size + rounding is not applied in this particular case). + +9. The invalid Unicode surrogate codepoints U+D800 to U+DFFF are now rejected + if they appear, or are escaped, in patterns. + +10. Get rid of a number of -Wunused-but-set-variable warnings. + +11. The pattern /(?=(*:x))(q|)/ matches an empty string, and returns the mark + "x". The similar pattern /(?=(*:x))((*:y)q|)/ did not return a mark at all. + Oddly, Perl behaves the same way. PCRE has been fixed so that this pattern + also returns the mark "x". This bug applied to capturing parentheses, + non-capturing parentheses, and atomic parentheses. It also applied to some + assertions. + +12. Stephen Kelly's patch to CMakeLists.txt allows it to parse the version + information out of configure.ac instead of relying on pcre.h.generic, which + is not stored in the repository. + +13. Applied Dmitry V. Levin's patch for a more portable method for linking with + -lreadline. + +14. ZH added PCRE_CONFIG_JITTARGET; added its output to pcretest -C. + +15. Applied Graycode's patch to put the top-level frame on the stack rather + than the heap when not using the stack for recursion. This gives a + performance improvement in many cases when recursion is not deep. + +16. Experimental code added to "pcretest -C" to output the stack frame size. + + +Version 8.21 12-Dec-2011 +------------------------ + +1. Updating the JIT compiler. + +2. JIT compiler now supports OP_NCREF, OP_RREF and OP_NRREF. New test cases + are added as well. + +3. Fix cache-flush issue on PowerPC (It is still an experimental JIT port). + PCRE_EXTRA_TABLES is not suported by JIT, and should be checked before + calling _pcre_jit_exec. Some extra comments are added. + +4. (*MARK) settings inside atomic groups that do not contain any capturing + parentheses, for example, (?>a(*:m)), were not being passed out. This bug + was introduced by change 18 for 8.20. + +5. Supporting of \x, \U and \u in JavaScript compatibility mode based on the + ECMA-262 standard. + +6. Lookbehinds such as (?<=a{2}b) that contained a fixed repetition were + erroneously being rejected as "not fixed length" if PCRE_CASELESS was set. + This bug was probably introduced by change 9 of 8.13. + +7. While fixing 6 above, I noticed that a number of other items were being + incorrectly rejected as "not fixed length". This arose partly because newer + opcodes had not been added to the fixed-length checking code. I have (a) + corrected the bug and added tests for these items, and (b) arranged for an + error to occur if an unknown opcode is encountered while checking for fixed + length instead of just assuming "not fixed length". The items that were + rejected were: (*ACCEPT), (*COMMIT), (*FAIL), (*MARK), (*PRUNE), (*SKIP), + (*THEN), \h, \H, \v, \V, and single character negative classes with fixed + repetitions, e.g. [^a]{3}, with and without PCRE_CASELESS. + +8. A possessively repeated conditional subpattern such as (?(?=c)c|d)++ was + being incorrectly compiled and would have given unpredicatble results. + +9. A possessively repeated subpattern with minimum repeat count greater than + one behaved incorrectly. For example, (A){2,}+ behaved as if it was + (A)(A)++ which meant that, after a subsequent mismatch, backtracking into + the first (A) could occur when it should not. + +10. Add a cast and remove a redundant test from the code. + +11. JIT should use pcre_malloc/pcre_free for allocation. + +12. Updated pcre-config so that it no longer shows -L/usr/lib, which seems + best practice nowadays, and helps with cross-compiling. (If the exec_prefix + is anything other than /usr, -L is still shown). + +13. In non-UTF-8 mode, \C is now supported in lookbehinds and DFA matching. + +14. Perl does not support \N without a following name in a [] class; PCRE now + also gives an error. + +15. If a forward reference was repeated with an upper limit of around 2000, + it caused the error "internal error: overran compiling workspace". The + maximum number of forward references (including repeats) was limited by the + internal workspace, and dependent on the LINK_SIZE. The code has been + rewritten so that the workspace expands (via pcre_malloc) if necessary, and + the default depends on LINK_SIZE. There is a new upper limit (for safety) + of around 200,000 forward references. While doing this, I also speeded up + the filling in of repeated forward references. + +16. A repeated forward reference in a pattern such as (a)(?2){2}(.) was + incorrectly expecting the subject to contain another "a" after the start. + +17. When (*SKIP:name) is activated without a corresponding (*MARK:name) earlier + in the match, the SKIP should be ignored. This was not happening; instead + the SKIP was being treated as NOMATCH. For patterns such as + /A(*MARK:A)A+(*SKIP:B)Z|AAC/ this meant that the AAC branch was never + tested. + +18. The behaviour of (*MARK), (*PRUNE), and (*THEN) has been reworked and is + now much more compatible with Perl, in particular in cases where the result + is a non-match for a non-anchored pattern. For example, if + /b(*:m)f|a(*:n)w/ is matched against "abc", the non-match returns the name + "m", where previously it did not return a name. A side effect of this + change is that for partial matches, the last encountered mark name is + returned, as for non matches. A number of tests that were previously not + Perl-compatible have been moved into the Perl-compatible test files. The + refactoring has had the pleasing side effect of removing one argument from + the match() function, thus reducing its stack requirements. + +19. If the /S+ option was used in pcretest to study a pattern using JIT, + subsequent uses of /S (without +) incorrectly behaved like /S+. + +21. Retrieve executable code size support for the JIT compiler and fixing + some warnings. + +22. A caseless match of a UTF-8 character whose other case uses fewer bytes did + not work when the shorter character appeared right at the end of the + subject string. + +23. Added some (int) casts to non-JIT modules to reduce warnings on 64-bit + systems. + +24. Added PCRE_INFO_JITSIZE to pass on the value from (21) above, and also + output it when the /M option is used in pcretest. + +25. The CheckMan script was not being included in the distribution. Also, added + an explicit "perl" to run Perl scripts from the PrepareRelease script + because this is reportedly needed in Windows. + +26. If study data was being save in a file and studying had not found a set of + "starts with" bytes for the pattern, the data written to the file (though + never used) was taken from uninitialized memory and so caused valgrind to + complain. + +27. Updated RunTest.bat as provided by Sheri Pierce. + +28. Fixed a possible uninitialized memory bug in pcre_jit_compile.c. + +29. Computation of memory usage for the table of capturing group names was + giving an unnecessarily large value. + + +Version 8.20 21-Oct-2011 +------------------------ + +1. Change 37 of 8.13 broke patterns like [:a]...[b:] because it thought it had + a POSIX class. After further experiments with Perl, which convinced me that + Perl has bugs and confusions, a closing square bracket is no longer allowed + in a POSIX name. This bug also affected patterns with classes that started + with full stops. + +2. If a pattern such as /(a)b|ac/ is matched against "ac", there is no + captured substring, but while checking the failing first alternative, + substring 1 is temporarily captured. If the output vector supplied to + pcre_exec() was not big enough for this capture, the yield of the function + was still zero ("insufficient space for captured substrings"). This cannot + be totally fixed without adding another stack variable, which seems a lot + of expense for a edge case. However, I have improved the situation in cases + such as /(a)(b)x|abc/ matched against "abc", where the return code + indicates that fewer than the maximum number of slots in the ovector have + been set. + +3. Related to (2) above: when there are more back references in a pattern than + slots in the output vector, pcre_exec() uses temporary memory during + matching, and copies in the captures as far as possible afterwards. It was + using the entire output vector, but this conflicts with the specification + that only 2/3 is used for passing back captured substrings. Now it uses + only the first 2/3, for compatibility. This is, of course, another edge + case. + +4. Zoltan Herczeg's just-in-time compiler support has been integrated into the + main code base, and can be used by building with --enable-jit. When this is + done, pcregrep automatically uses it unless --disable-pcregrep-jit or the + runtime --no-jit option is given. + +5. When the number of matches in a pcre_dfa_exec() run exactly filled the + ovector, the return from the function was zero, implying that there were + other matches that did not fit. The correct "exactly full" value is now + returned. + +6. If a subpattern that was called recursively or as a subroutine contained + (*PRUNE) or any other control that caused it to give a non-standard return, + invalid errors such as "Error -26 (nested recursion at the same subject + position)" or even infinite loops could occur. + +7. If a pattern such as /a(*SKIP)c|b(*ACCEPT)|/ was studied, it stopped + computing the minimum length on reaching *ACCEPT, and so ended up with the + wrong value of 1 rather than 0. Further investigation indicates that + computing a minimum subject length in the presence of *ACCEPT is difficult + (think back references, subroutine calls), and so I have changed the code + so that no minimum is registered for a pattern that contains *ACCEPT. + +8. If (*THEN) was present in the first (true) branch of a conditional group, + it was not handled as intended. [But see 16 below.] + +9. Replaced RunTest.bat and CMakeLists.txt with improved versions provided by + Sheri Pierce. + +10. A pathological pattern such as /(*ACCEPT)a/ was miscompiled, thinking that + the first byte in a match must be "a". + +11. Change 17 for 8.13 increased the recursion depth for patterns like + /a(?:.)*?a/ drastically. I've improved things by remembering whether a + pattern contains any instances of (*THEN). If it does not, the old + optimizations are restored. It would be nice to do this on a per-group + basis, but at the moment that is not feasible. + +12. In some environments, the output of pcretest -C is CRLF terminated. This + broke RunTest's code that checks for the link size. A single white space + character after the value is now allowed for. + +13. RunTest now checks for the "fr" locale as well as for "fr_FR" and "french". + For "fr", it uses the Windows-specific input and output files. + +14. If (*THEN) appeared in a group that was called recursively or as a + subroutine, it did not work as intended. [But see next item.] + +15. Consider the pattern /A (B(*THEN)C) | D/ where A, B, C, and D are complex + pattern fragments (but not containing any | characters). If A and B are + matched, but there is a failure in C so that it backtracks to (*THEN), PCRE + was behaving differently to Perl. PCRE backtracked into A, but Perl goes to + D. In other words, Perl considers parentheses that do not contain any | + characters to be part of a surrounding alternative, whereas PCRE was + treading (B(*THEN)C) the same as (B(*THEN)C|(*FAIL)) -- which Perl handles + differently. PCRE now behaves in the same way as Perl, except in the case + of subroutine/recursion calls such as (?1) which have in any case always + been different (but PCRE had them first :-). + +16. Related to 15 above: Perl does not treat the | in a conditional group as + creating alternatives. Such a group is treated in the same way as an + ordinary group without any | characters when processing (*THEN). PCRE has + been changed to match Perl's behaviour. + +17. If a user had set PCREGREP_COLO(U)R to something other than 1:31, the + RunGrepTest script failed. + +18. Change 22 for version 13 caused atomic groups to use more stack. This is + inevitable for groups that contain captures, but it can lead to a lot of + stack use in large patterns. The old behaviour has been restored for atomic + groups that do not contain any capturing parentheses. + +19. If the PCRE_NO_START_OPTIMIZE option was set for pcre_compile(), it did not + suppress the check for a minimum subject length at run time. (If it was + given to pcre_exec() or pcre_dfa_exec() it did work.) + +20. Fixed an ASCII-dependent infelicity in pcretest that would have made it + fail to work when decoding hex characters in data strings in EBCDIC + environments. + +21. It appears that in at least one Mac OS environment, the isxdigit() function + is implemented as a macro that evaluates to its argument more than once, + contravening the C 90 Standard (I haven't checked a later standard). There + was an instance in pcretest which caused it to go wrong when processing + \x{...} escapes in subject strings. The has been rewritten to avoid using + things like p++ in the argument of isxdigit(). + + +Version 8.13 16-Aug-2011 +------------------------ + +1. The Unicode data tables have been updated to Unicode 6.0.0. + +2. Two minor typos in pcre_internal.h have been fixed. + +3. Added #include to pcre_scanner_unittest.cc, pcrecpp.cc, and + pcrecpp_unittest.cc. They are needed for strcmp(), memset(), and strchr() + in some environments (e.g. Solaris 10/SPARC using Sun Studio 12U2). + +4. There were a number of related bugs in the code for matching backrefences + caselessly in UTF-8 mode when codes for the characters concerned were + different numbers of bytes. For example, U+023A and U+2C65 are an upper + and lower case pair, using 2 and 3 bytes, respectively. The main bugs were: + (a) A reference to 3 copies of a 2-byte code matched only 2 of a 3-byte + code. (b) A reference to 2 copies of a 3-byte code would not match 2 of a + 2-byte code at the end of the subject (it thought there wasn't enough data + left). + +5. Comprehensive information about what went wrong is now returned by + pcre_exec() and pcre_dfa_exec() when the UTF-8 string check fails, as long + as the output vector has at least 2 elements. The offset of the start of + the failing character and a reason code are placed in the vector. + +6. When the UTF-8 string check fails for pcre_compile(), the offset that is + now returned is for the first byte of the failing character, instead of the + last byte inspected. This is an incompatible change, but I hope it is small + enough not to be a problem. It makes the returned offset consistent with + pcre_exec() and pcre_dfa_exec(). + +7. pcretest now gives a text phrase as well as the error number when + pcre_exec() or pcre_dfa_exec() fails; if the error is a UTF-8 check + failure, the offset and reason code are output. + +8. When \R was used with a maximizing quantifier it failed to skip backwards + over a \r\n pair if the subsequent match failed. Instead, it just skipped + back over a single character (\n). This seems wrong (because it treated the + two characters as a single entity when going forwards), conflicts with the + documentation that \R is equivalent to (?>\r\n|\n|...etc), and makes the + behaviour of \R* different to (\R)*, which also seems wrong. The behaviour + has been changed. + +9. Some internal refactoring has changed the processing so that the handling + of the PCRE_CASELESS and PCRE_MULTILINE options is done entirely at compile + time (the PCRE_DOTALL option was changed this way some time ago: version + 7.7 change 16). This has made it possible to abolish the OP_OPT op code, + which was always a bit of a fudge. It also means that there is one less + argument for the match() function, which reduces its stack requirements + slightly. This change also fixes an incompatibility with Perl: the pattern + (?i:([^b]))(?1) should not match "ab", but previously PCRE gave a match. + +10. More internal refactoring has drastically reduced the number of recursive + calls to match() for possessively repeated groups such as (abc)++ when + using pcre_exec(). + +11. While implementing 10, a number of bugs in the handling of groups were + discovered and fixed: + + (?<=(a)+) was not diagnosed as invalid (non-fixed-length lookbehind). + (a|)*(?1) gave a compile-time internal error. + ((a|)+)+ did not notice that the outer group could match an empty string. + (^a|^)+ was not marked as anchored. + (.*a|.*)+ was not marked as matching at start or after a newline. + +12. Yet more internal refactoring has removed another argument from the match() + function. Special calls to this function are now indicated by setting a + value in a variable in the "match data" data block. + +13. Be more explicit in pcre_study() instead of relying on "default" for + opcodes that mean there is no starting character; this means that when new + ones are added and accidentally left out of pcre_study(), testing should + pick them up. + +14. The -s option of pcretest has been documented for ages as being an old + synonym of -m (show memory usage). I have changed it to mean "force study + for every regex", that is, assume /S for every regex. This is similar to -i + and -d etc. It's slightly incompatible, but I'm hoping nobody is still + using it. It makes it easier to run collections of tests with and without + study enabled, and thereby test pcre_study() more easily. All the standard + tests are now run with and without -s (but some patterns can be marked as + "never study" - see 20 below). + +15. When (*ACCEPT) was used in a subpattern that was called recursively, the + restoration of the capturing data to the outer values was not happening + correctly. + +16. If a recursively called subpattern ended with (*ACCEPT) and matched an + empty string, and PCRE_NOTEMPTY was set, pcre_exec() thought the whole + pattern had matched an empty string, and so incorrectly returned a no + match. + +17. There was optimizing code for the last branch of non-capturing parentheses, + and also for the obeyed branch of a conditional subexpression, which used + tail recursion to cut down on stack usage. Unfortunately, now that there is + the possibility of (*THEN) occurring in these branches, tail recursion is + no longer possible because the return has to be checked for (*THEN). These + two optimizations have therefore been removed. [But see 8.20/11 above.] + +18. If a pattern containing \R was studied, it was assumed that \R always + matched two bytes, thus causing the minimum subject length to be + incorrectly computed because \R can also match just one byte. + +19. If a pattern containing (*ACCEPT) was studied, the minimum subject length + was incorrectly computed. + +20. If /S is present twice on a test pattern in pcretest input, it now + *disables* studying, thereby overriding the use of -s on the command line + (see 14 above). This is necessary for one or two tests to keep the output + identical in both cases. + +21. When (*ACCEPT) was used in an assertion that matched an empty string and + PCRE_NOTEMPTY was set, PCRE applied the non-empty test to the assertion. + +22. When an atomic group that contained a capturing parenthesis was + successfully matched, but the branch in which it appeared failed, the + capturing was not being forgotten if a higher numbered group was later + captured. For example, /(?>(a))b|(a)c/ when matching "ac" set capturing + group 1 to "a", when in fact it should be unset. This applied to multi- + branched capturing and non-capturing groups, repeated or not, and also to + positive assertions (capturing in negative assertions does not happen + in PCRE) and also to nested atomic groups. + +23. Add the ++ qualifier feature to pcretest, to show the remainder of the + subject after a captured substring, to make it easier to tell which of a + number of identical substrings has been captured. + +24. The way atomic groups are processed by pcre_exec() has been changed so that + if they are repeated, backtracking one repetition now resets captured + values correctly. For example, if ((?>(a+)b)+aabab) is matched against + "aaaabaaabaabab" the value of captured group 2 is now correctly recorded as + "aaa". Previously, it would have been "a". As part of this code + refactoring, the way recursive calls are handled has also been changed. + +25. If an assertion condition captured any substrings, they were not passed + back unless some other capturing happened later. For example, if + (?(?=(a))a) was matched against "a", no capturing was returned. + +26. When studying a pattern that contained subroutine calls or assertions, + the code for finding the minimum length of a possible match was handling + direct recursions such as (xxx(?1)|yyy) but not mutual recursions (where + group 1 called group 2 while simultaneously a separate group 2 called group + 1). A stack overflow occurred in this case. I have fixed this by limiting + the recursion depth to 10. + +27. Updated RunTest.bat in the distribution to the version supplied by Tom + Fortmann. This supports explicit test numbers on the command line, and has + argument validation and error reporting. + +28. An instance of \X with an unlimited repeat could fail if at any point the + first character it looked at was a mark character. + +29. Some minor code refactoring concerning Unicode properties and scripts + should reduce the stack requirement of match() slightly. + +30. Added the '=' option to pcretest to check the setting of unused capturing + slots at the end of the pattern, which are documented as being -1, but are + not included in the return count. + +31. If \k was not followed by a braced, angle-bracketed, or quoted name, PCRE + compiled something random. Now it gives a compile-time error (as does + Perl). + +32. A *MARK encountered during the processing of a positive assertion is now + recorded and passed back (compatible with Perl). + +33. If --only-matching or --colour was set on a pcregrep call whose pattern + had alternative anchored branches, the search for a second match in a line + was done as if at the line start. Thus, for example, /^01|^02/ incorrectly + matched the line "0102" twice. The same bug affected patterns that started + with a backwards assertion. For example /\b01|\b02/ also matched "0102" + twice. + +34. Previously, PCRE did not allow quantification of assertions. However, Perl + does, and because of capturing effects, quantifying parenthesized + assertions may at times be useful. Quantifiers are now allowed for + parenthesized assertions. + +35. A minor code tidy in pcre_compile() when checking options for \R usage. + +36. \g was being checked for fancy things in a character class, when it should + just be a literal "g". + +37. PCRE was rejecting [:a[:digit:]] whereas Perl was not. It seems that the + appearance of a nested POSIX class supersedes an apparent external class. + For example, [:a[:digit:]b:] matches "a", "b", ":", or a digit. Also, + unescaped square brackets may also appear as part of class names. For + example, [:a[:abc]b:] gives unknown class "[:abc]b:]". PCRE now behaves + more like Perl. (But see 8.20/1 above.) + +38. PCRE was giving an error for \N with a braced quantifier such as {1,} (this + was because it thought it was \N{name}, which is not supported). + +39. Add minix to OS list not supporting the -S option in pcretest. + +40. PCRE tries to detect cases of infinite recursion at compile time, but it + cannot analyze patterns in sufficient detail to catch mutual recursions + such as ((?1))((?2)). There is now a runtime test that gives an error if a + subgroup is called recursively as a subpattern for a second time at the + same position in the subject string. In previous releases this might have + been caught by the recursion limit, or it might have run out of stack. + +41. A pattern such as /(?(R)a+|(?R)b)/ is quite safe, as the recursion can + happen only once. PCRE was, however incorrectly giving a compile time error + "recursive call could loop indefinitely" because it cannot analyze the + pattern in sufficient detail. The compile time test no longer happens when + PCRE is compiling a conditional subpattern, but actual runaway loops are + now caught at runtime (see 40 above). + +42. It seems that Perl allows any characters other than a closing parenthesis + to be part of the NAME in (*MARK:NAME) and other backtracking verbs. PCRE + has been changed to be the same. + +43. Updated configure.ac to put in more quoting round AC_LANG_PROGRAM etc. so + as not to get warnings when autogen.sh is called. Also changed + AC_PROG_LIBTOOL (deprecated) to LT_INIT (the current macro). + +44. To help people who use pcregrep to scan files containing exceedingly long + lines, the following changes have been made: + + (a) The default value of the buffer size parameter has been increased from + 8K to 20K. (The actual buffer used is three times this size.) + + (b) The default can be changed by ./configure --with-pcregrep-bufsize when + PCRE is built. + + (c) A --buffer-size=n option has been added to pcregrep, to allow the size + to be set at run time. + + (d) Numerical values in pcregrep options can be followed by K or M, for + example --buffer-size=50K. + + (e) If a line being scanned overflows pcregrep's buffer, an error is now + given and the return code is set to 2. + +45. Add a pointer to the latest mark to the callout data block. + +46. The pattern /.(*F)/, when applied to "abc" with PCRE_PARTIAL_HARD, gave a + partial match of an empty string instead of no match. This was specific to + the use of ".". + +47. The pattern /f.*/8s, when applied to "for" with PCRE_PARTIAL_HARD, gave a + complete match instead of a partial match. This bug was dependent on both + the PCRE_UTF8 and PCRE_DOTALL options being set. + +48. For a pattern such as /\babc|\bdef/ pcre_study() was failing to set up the + starting byte set, because \b was not being ignored. + + +Version 8.12 15-Jan-2011 +------------------------ + +1. Fixed some typos in the markup of the man pages, and wrote a script that + checks for such things as part of the documentation building process. + +2. On a big-endian 64-bit system, pcregrep did not correctly process the + --match-limit and --recursion-limit options (added for 8.11). In + particular, this made one of the standard tests fail. (The integer value + went into the wrong half of a long int.) + +3. If the --colour option was given to pcregrep with -v (invert match), it + did strange things, either producing crazy output, or crashing. It should, + of course, ignore a request for colour when reporting lines that do not + match. + +4. Another pcregrep bug caused similar problems if --colour was specified with + -M (multiline) and the pattern match finished with a line ending. + +5. In pcregrep, when a pattern that ended with a literal newline sequence was + matched in multiline mode, the following line was shown as part of the + match. This seems wrong, so I have changed it. + +6. Another pcregrep bug in multiline mode, when --colour was specified, caused + the check for further matches in the same line (so they could be coloured) + to overrun the end of the current line. If another match was found, it was + incorrectly shown (and then shown again when found in the next line). + +7. If pcregrep was compiled under Windows, there was a reference to the + function pcregrep_exit() before it was defined. I am assuming this was + the cause of the "error C2371: 'pcregrep_exit' : redefinition;" that was + reported by a user. I've moved the definition above the reference. + + +Version 8.11 10-Dec-2010 +------------------------ + +1. (*THEN) was not working properly if there were untried alternatives prior + to it in the current branch. For example, in ((a|b)(*THEN)(*F)|c..) it + backtracked to try for "b" instead of moving to the next alternative branch + at the same level (in this case, to look for "c"). The Perl documentation + is clear that when (*THEN) is backtracked onto, it goes to the "next + alternative in the innermost enclosing group". + +2. (*COMMIT) was not overriding (*THEN), as it does in Perl. In a pattern + such as (A(*COMMIT)B(*THEN)C|D) any failure after matching A should + result in overall failure. Similarly, (*COMMIT) now overrides (*PRUNE) and + (*SKIP), (*SKIP) overrides (*PRUNE) and (*THEN), and (*PRUNE) overrides + (*THEN). + +3. If \s appeared in a character class, it removed the VT character from + the class, even if it had been included by some previous item, for example + in [\x00-\xff\s]. (This was a bug related to the fact that VT is not part + of \s, but is part of the POSIX "space" class.) + +4. A partial match never returns an empty string (because you can always + match an empty string at the end of the subject); however the checking for + an empty string was starting at the "start of match" point. This has been + changed to the "earliest inspected character" point, because the returned + data for a partial match starts at this character. This means that, for + example, /(?<=abc)def/ gives a partial match for the subject "abc" + (previously it gave "no match"). + +5. Changes have been made to the way PCRE_PARTIAL_HARD affects the matching + of $, \z, \Z, \b, and \B. If the match point is at the end of the string, + previously a full match would be given. However, setting PCRE_PARTIAL_HARD + has an implication that the given string is incomplete (because a partial + match is preferred over a full match). For this reason, these items now + give a partial match in this situation. [Aside: previously, the one case + /t\b/ matched against "cat" with PCRE_PARTIAL_HARD set did return a partial + match rather than a full match, which was wrong by the old rules, but is + now correct.] + +6. There was a bug in the handling of #-introduced comments, recognized when + PCRE_EXTENDED is set, when PCRE_NEWLINE_ANY and PCRE_UTF8 were also set. + If a UTF-8 multi-byte character included the byte 0x85 (e.g. +U0445, whose + UTF-8 encoding is 0xd1,0x85), this was misinterpreted as a newline when + scanning for the end of the comment. (*Character* 0x85 is an "any" newline, + but *byte* 0x85 is not, in UTF-8 mode). This bug was present in several + places in pcre_compile(). + +7. Related to (6) above, when pcre_compile() was skipping #-introduced + comments when looking ahead for named forward references to subpatterns, + the only newline sequence it recognized was NL. It now handles newlines + according to the set newline convention. + +8. SunOS4 doesn't have strerror() or strtoul(); pcregrep dealt with the + former, but used strtoul(), whereas pcretest avoided strtoul() but did not + cater for a lack of strerror(). These oversights have been fixed. + +9. Added --match-limit and --recursion-limit to pcregrep. + +10. Added two casts needed to build with Visual Studio when NO_RECURSE is set. + +11. When the -o option was used, pcregrep was setting a return code of 1, even + when matches were found, and --line-buffered was not being honoured. + +12. Added an optional parentheses number to the -o and --only-matching options + of pcregrep. + +13. Imitating Perl's /g action for multiple matches is tricky when the pattern + can match an empty string. The code to do it in pcretest and pcredemo + needed fixing: + + (a) When the newline convention was "crlf", pcretest got it wrong, skipping + only one byte after an empty string match just before CRLF (this case + just got forgotten; "any" and "anycrlf" were OK). + + (b) The pcretest code also had a bug, causing it to loop forever in UTF-8 + mode when an empty string match preceded an ASCII character followed by + a non-ASCII character. (The code for advancing by one character rather + than one byte was nonsense.) + + (c) The pcredemo.c sample program did not have any code at all to handle + the cases when CRLF is a valid newline sequence. + +14. Neither pcre_exec() nor pcre_dfa_exec() was checking that the value given + as a starting offset was within the subject string. There is now a new + error, PCRE_ERROR_BADOFFSET, which is returned if the starting offset is + negative or greater than the length of the string. In order to test this, + pcretest is extended to allow the setting of negative starting offsets. + +15. In both pcre_exec() and pcre_dfa_exec() the code for checking that the + starting offset points to the beginning of a UTF-8 character was + unnecessarily clumsy. I tidied it up. + +16. Added PCRE_ERROR_SHORTUTF8 to make it possible to distinguish between a + bad UTF-8 sequence and one that is incomplete when using PCRE_PARTIAL_HARD. + +17. Nobody had reported that the --include_dir option, which was added in + release 7.7 should have been called --include-dir (hyphen, not underscore) + for compatibility with GNU grep. I have changed it to --include-dir, but + left --include_dir as an undocumented synonym, and the same for + --exclude-dir, though that is not available in GNU grep, at least as of + release 2.5.4. + +18. At a user's suggestion, the macros GETCHAR and friends (which pick up UTF-8 + characters from a string of bytes) have been redefined so as not to use + loops, in order to improve performance in some environments. At the same + time, I abstracted some of the common code into auxiliary macros to save + repetition (this should not affect the compiled code). + +19. If \c was followed by a multibyte UTF-8 character, bad things happened. A + compile-time error is now given if \c is not followed by an ASCII + character, that is, a byte less than 128. (In EBCDIC mode, the code is + different, and any byte value is allowed.) + +20. Recognize (*NO_START_OPT) at the start of a pattern to set the PCRE_NO_ + START_OPTIMIZE option, which is now allowed at compile time - but just + passed through to pcre_exec() or pcre_dfa_exec(). This makes it available + to pcregrep and other applications that have no direct access to PCRE + options. The new /Y option in pcretest sets this option when calling + pcre_compile(). + +21. Change 18 of release 8.01 broke the use of named subpatterns for recursive + back references. Groups containing recursive back references were forced to + be atomic by that change, but in the case of named groups, the amount of + memory required was incorrectly computed, leading to "Failed: internal + error: code overflow". This has been fixed. + +22. Some patches to pcre_stringpiece.h, pcre_stringpiece_unittest.cc, and + pcretest.c, to avoid build problems in some Borland environments. + + +Version 8.10 25-Jun-2010 +------------------------ + +1. Added support for (*MARK:ARG) and for ARG additions to PRUNE, SKIP, and + THEN. + +2. (*ACCEPT) was not working when inside an atomic group. + +3. Inside a character class, \B is treated as a literal by default, but + faulted if PCRE_EXTRA is set. This mimics Perl's behaviour (the -w option + causes the error). The code is unchanged, but I tidied the documentation. + +4. Inside a character class, PCRE always treated \R and \X as literals, + whereas Perl faults them if its -w option is set. I have changed PCRE so + that it faults them when PCRE_EXTRA is set. + +5. Added support for \N, which always matches any character other than + newline. (It is the same as "." when PCRE_DOTALL is not set.) + +6. When compiling pcregrep with newer versions of gcc which may have + FORTIFY_SOURCE set, several warnings "ignoring return value of 'fwrite', + declared with attribute warn_unused_result" were given. Just casting the + result to (void) does not stop the warnings; a more elaborate fudge is + needed. I've used a macro to implement this. + +7. Minor change to pcretest.c to avoid a compiler warning. + +8. Added four artifical Unicode properties to help with an option to make + \s etc use properties (see next item). The new properties are: Xan + (alphanumeric), Xsp (Perl space), Xps (POSIX space), and Xwd (word). + +9. Added PCRE_UCP to make \b, \d, \s, \w, and certain POSIX character classes + use Unicode properties. (*UCP) at the start of a pattern can be used to set + this option. Modified pcretest to add /W to test this facility. Added + REG_UCP to make it available via the POSIX interface. + +10. Added --line-buffered to pcregrep. + +11. In UTF-8 mode, if a pattern that was compiled with PCRE_CASELESS was + studied, and the match started with a letter with a code point greater than + 127 whose first byte was different to the first byte of the other case of + the letter, the other case of this starting letter was not recognized + (#976). + +12. If a pattern that was studied started with a repeated Unicode property + test, for example, \p{Nd}+, there was the theoretical possibility of + setting up an incorrect bitmap of starting bytes, but fortunately it could + not have actually happened in practice until change 8 above was made (it + added property types that matched character-matching opcodes). + +13. pcre_study() now recognizes \h, \v, and \R when constructing a bit map of + possible starting bytes for non-anchored patterns. + +14. Extended the "auto-possessify" feature of pcre_compile(). It now recognizes + \R, and also a number of cases that involve Unicode properties, both + explicit and implicit when PCRE_UCP is set. + +15. If a repeated Unicode property match (e.g. \p{Lu}*) was used with non-UTF-8 + input, it could crash or give wrong results if characters with values + greater than 0xc0 were present in the subject string. (Detail: it assumed + UTF-8 input when processing these items.) + +16. Added a lot of (int) casts to avoid compiler warnings in systems where + size_t is 64-bit (#991). + +17. Added a check for running out of memory when PCRE is compiled with + --disable-stack-for-recursion (#990). + +18. If the last data line in a file for pcretest does not have a newline on + the end, a newline was missing in the output. + +19. The default pcre_chartables.c file recognizes only ASCII characters (values + less than 128) in its various bitmaps. However, there is a facility for + generating tables according to the current locale when PCRE is compiled. It + turns out that in some environments, 0x85 and 0xa0, which are Unicode space + characters, are recognized by isspace() and therefore were getting set in + these tables, and indeed these tables seem to approximate to ISO 8859. This + caused a problem in UTF-8 mode when pcre_study() was used to create a list + of bytes that can start a match. For \s, it was including 0x85 and 0xa0, + which of course cannot start UTF-8 characters. I have changed the code so + that only real ASCII characters (less than 128) and the correct starting + bytes for UTF-8 encodings are set for characters greater than 127 when in + UTF-8 mode. (When PCRE_UCP is set - see 9 above - the code is different + altogether.) + +20. Added the /T option to pcretest so as to be able to run tests with non- + standard character tables, thus making it possible to include the tests + used for 19 above in the standard set of tests. + +21. A pattern such as (?&t)(?#()(?(DEFINE)(?a)) which has a forward + reference to a subpattern the other side of a comment that contains an + opening parenthesis caused either an internal compiling error, or a + reference to the wrong subpattern. + + +Version 8.02 19-Mar-2010 +------------------------ + +1. The Unicode data tables have been updated to Unicode 5.2.0. + +2. Added the option --libs-cpp to pcre-config, but only when C++ support is + configured. + +3. Updated the licensing terms in the pcregexp.pas file, as agreed with the + original author of that file, following a query about its status. + +4. On systems that do not have stdint.h (e.g. Solaris), check for and include + inttypes.h instead. This fixes a bug that was introduced by change 8.01/8. + +5. A pattern such as (?&t)*+(?(DEFINE)(?.)) which has a possessive + quantifier applied to a forward-referencing subroutine call, could compile + incorrect code or give the error "internal error: previously-checked + referenced subpattern not found". + +6. Both MS Visual Studio and Symbian OS have problems with initializing + variables to point to external functions. For these systems, therefore, + pcre_malloc etc. are now initialized to local functions that call the + relevant global functions. + +7. There were two entries missing in the vectors called coptable and poptable + in pcre_dfa_exec.c. This could lead to memory accesses outsize the vectors. + I've fixed the data, and added a kludgy way of testing at compile time that + the lengths are correct (equal to the number of opcodes). + +8. Following on from 7, I added a similar kludge to check the length of the + eint vector in pcreposix.c. + +9. Error texts for pcre_compile() are held as one long string to avoid too + much relocation at load time. To find a text, the string is searched, + counting zeros. There was no check for running off the end of the string, + which could happen if a new error number was added without updating the + string. + +10. \K gave a compile-time error if it appeared in a lookbehind assersion. + +11. \K was not working if it appeared in an atomic group or in a group that + was called as a "subroutine", or in an assertion. Perl 5.11 documents that + \K is "not well defined" if used in an assertion. PCRE now accepts it if + the assertion is positive, but not if it is negative. + +12. Change 11 fortuitously reduced the size of the stack frame used in the + "match()" function of pcre_exec.c by one pointer. Forthcoming + implementation of support for (*MARK) will need an extra pointer on the + stack; I have reserved it now, so that the stack frame size does not + decrease. + +13. A pattern such as (?P(?P0)|(?P>L2)(?P>L1)) in which the only other + item in branch that calls a recursion is a subroutine call - as in the + second branch in the above example - was incorrectly given the compile- + time error "recursive call could loop indefinitely" because pcre_compile() + was not correctly checking the subroutine for matching a non-empty string. + +14. The checks for overrunning compiling workspace could trigger after an + overrun had occurred. This is a "should never occur" error, but it can be + triggered by pathological patterns such as hundreds of nested parentheses. + The checks now trigger 100 bytes before the end of the workspace. + +15. Fix typo in configure.ac: "srtoq" should be "strtoq". + + +Version 8.01 19-Jan-2010 +------------------------ + +1. If a pattern contained a conditional subpattern with only one branch (in + particular, this includes all (*DEFINE) patterns), a call to pcre_study() + computed the wrong minimum data length (which is of course zero for such + subpatterns). This could cause incorrect "no match" results. + +2. For patterns such as (?i)a(?-i)b|c where an option setting at the start of + the pattern is reset in the first branch, pcre_compile() failed with + "internal error: code overflow at offset...". This happened only when + the reset was to the original external option setting. (An optimization + abstracts leading options settings into an external setting, which was the + cause of this.) + +3. A pattern such as ^(?!a(*SKIP)b) where a negative assertion contained one + of the verbs SKIP, PRUNE, or COMMIT, did not work correctly. When the + assertion pattern did not match (meaning that the assertion was true), it + was incorrectly treated as false if the SKIP had been reached during the + matching. This also applied to assertions used as conditions. + +4. If an item that is not supported by pcre_dfa_exec() was encountered in an + assertion subpattern, including such a pattern used as a condition, + unpredictable results occurred, instead of the error return + PCRE_ERROR_DFA_UITEM. + +5. The C++ GlobalReplace function was not working like Perl for the special + situation when an empty string is matched. It now does the fancy magic + stuff that is necessary. + +6. In pcre_internal.h, obsolete includes to setjmp.h and stdarg.h have been + removed. (These were left over from very, very early versions of PCRE.) + +7. Some cosmetic changes to the code to make life easier when compiling it + as part of something else: + + (a) Change DEBUG to PCRE_DEBUG. + + (b) In pcre_compile(), rename the member of the "branch_chain" structure + called "current" as "current_branch", to prevent a collision with the + Linux macro when compiled as a kernel module. + + (c) In pcre_study(), rename the function set_bit() as set_table_bit(), to + prevent a collision with the Linux macro when compiled as a kernel + module. + +8. In pcre_compile() there are some checks for integer overflows that used to + cast potentially large values to (double). This has been changed to that + when building, a check for int64_t is made, and if it is found, it is used + instead, thus avoiding the use of floating point arithmetic. (There is no + other use of FP in PCRE.) If int64_t is not found, the fallback is to + double. + +9. Added two casts to avoid signed/unsigned warnings from VS Studio Express + 2005 (difference between two addresses compared to an unsigned value). + +10. Change the standard AC_CHECK_LIB test for libbz2 in configure.ac to a + custom one, because of the following reported problem in Windows: + + - libbz2 uses the Pascal calling convention (WINAPI) for the functions + under Win32. + - The standard autoconf AC_CHECK_LIB fails to include "bzlib.h", + therefore missing the function definition. + - The compiler thus generates a "C" signature for the test function. + - The linker fails to find the "C" function. + - PCRE fails to configure if asked to do so against libbz2. + +11. When running libtoolize from libtool-2.2.6b as part of autogen.sh, these + messages were output: + + Consider adding `AC_CONFIG_MACRO_DIR([m4])' to configure.ac and + rerunning libtoolize, to keep the correct libtool macros in-tree. + Consider adding `-I m4' to ACLOCAL_AMFLAGS in Makefile.am. + + I have done both of these things. + +12. Although pcre_dfa_exec() does not use nearly as much stack as pcre_exec() + most of the time, it *can* run out if it is given a pattern that contains a + runaway infinite recursion. I updated the discussion in the pcrestack man + page. + +13. Now that we have gone to the x.xx style of version numbers, the minor + version may start with zero. Using 08 or 09 is a bad idea because users + might check the value of PCRE_MINOR in their code, and 08 or 09 may be + interpreted as invalid octal numbers. I've updated the previous comment in + configure.ac, and also added a check that gives an error if 08 or 09 are + used. + +14. Change 8.00/11 was not quite complete: code had been accidentally omitted, + causing partial matching to fail when the end of the subject matched \W + in a UTF-8 pattern where \W was quantified with a minimum of 3. + +15. There were some discrepancies between the declarations in pcre_internal.h + of _pcre_is_newline(), _pcre_was_newline(), and _pcre_valid_utf8() and + their definitions. The declarations used "const uschar *" and the + definitions used USPTR. Even though USPTR is normally defined as "const + unsigned char *" (and uschar is typedeffed as "unsigned char"), it was + reported that: "This difference in casting confuses some C++ compilers, for + example, SunCC recognizes above declarations as different functions and + generates broken code for hbpcre." I have changed the declarations to use + USPTR. + +16. GNU libtool is named differently on some systems. The autogen.sh script now + tries several variants such as glibtoolize (MacOSX) and libtoolize1x + (FreeBSD). + +17. Applied Craig's patch that fixes an HP aCC compile error in pcre 8.00 + (strtoXX undefined when compiling pcrecpp.cc). The patch contains this + comment: "Figure out how to create a longlong from a string: strtoll and + equivalent. It's not enough to call AC_CHECK_FUNCS: hpux has a strtoll, for + instance, but it only takes 2 args instead of 3!" + +18. A subtle bug concerned with back references has been fixed by a change of + specification, with a corresponding code fix. A pattern such as + ^(xa|=?\1a)+$ which contains a back reference inside the group to which it + refers, was giving matches when it shouldn't. For example, xa=xaaa would + match that pattern. Interestingly, Perl (at least up to 5.11.3) has the + same bug. Such groups have to be quantified to be useful, or contained + inside another quantified group. (If there's no repetition, the reference + can never match.) The problem arises because, having left the group and + moved on to the rest of the pattern, a later failure that backtracks into + the group uses the captured value from the final iteration of the group + rather than the correct earlier one. I have fixed this in PCRE by forcing + any group that contains a reference to itself to be an atomic group; that + is, there cannot be any backtracking into it once it has completed. This is + similar to recursive and subroutine calls. + + +Version 8.00 19-Oct-09 +---------------------- + +1. The table for translating pcre_compile() error codes into POSIX error codes + was out-of-date, and there was no check on the pcre_compile() error code + being within the table. This could lead to an OK return being given in + error. + +2. Changed the call to open a subject file in pcregrep from fopen(pathname, + "r") to fopen(pathname, "rb"), which fixed a problem with some of the tests + in a Windows environment. + +3. The pcregrep --count option prints the count for each file even when it is + zero, as does GNU grep. However, pcregrep was also printing all files when + --files-with-matches was added. Now, when both options are given, it prints + counts only for those files that have at least one match. (GNU grep just + prints the file name in this circumstance, but including the count seems + more useful - otherwise, why use --count?) Also ensured that the + combination -clh just lists non-zero counts, with no names. + +4. The long form of the pcregrep -F option was incorrectly implemented as + --fixed_strings instead of --fixed-strings. This is an incompatible change, + but it seems right to fix it, and I didn't think it was worth preserving + the old behaviour. + +5. The command line items --regex=pattern and --regexp=pattern were not + recognized by pcregrep, which required --regex pattern or --regexp pattern + (with a space rather than an '='). The man page documented the '=' forms, + which are compatible with GNU grep; these now work. + +6. No libpcreposix.pc file was created for pkg-config; there was just + libpcre.pc and libpcrecpp.pc. The omission has been rectified. + +7. Added #ifndef SUPPORT_UCP into the pcre_ucd.c module, to reduce its size + when UCP support is not needed, by modifying the Python script that + generates it from Unicode data files. This should not matter if the module + is correctly used as a library, but I received one complaint about 50K of + unwanted data. My guess is that the person linked everything into his + program rather than using a library. Anyway, it does no harm. + +8. A pattern such as /\x{123}{2,2}+/8 was incorrectly compiled; the trigger + was a minimum greater than 1 for a wide character in a possessive + repetition. The same bug could also affect patterns like /(\x{ff}{0,2})*/8 + which had an unlimited repeat of a nested, fixed maximum repeat of a wide + character. Chaos in the form of incorrect output or a compiling loop could + result. + +9. The restrictions on what a pattern can contain when partial matching is + requested for pcre_exec() have been removed. All patterns can now be + partially matched by this function. In addition, if there are at least two + slots in the offset vector, the offset of the earliest inspected character + for the match and the offset of the end of the subject are set in them when + PCRE_ERROR_PARTIAL is returned. + +10. Partial matching has been split into two forms: PCRE_PARTIAL_SOFT, which is + synonymous with PCRE_PARTIAL, for backwards compatibility, and + PCRE_PARTIAL_HARD, which causes a partial match to supersede a full match, + and may be more useful for multi-segment matching. + +11. Partial matching with pcre_exec() is now more intuitive. A partial match + used to be given if ever the end of the subject was reached; now it is + given only if matching could not proceed because another character was + needed. This makes a difference in some odd cases such as Z(*FAIL) with the + string "Z", which now yields "no match" instead of "partial match". In the + case of pcre_dfa_exec(), "no match" is given if every matching path for the + final character ended with (*FAIL). + +12. Restarting a match using pcre_dfa_exec() after a partial match did not work + if the pattern had a "must contain" character that was already found in the + earlier partial match, unless partial matching was again requested. For + example, with the pattern /dog.(body)?/, the "must contain" character is + "g". If the first part-match was for the string "dog", restarting with + "sbody" failed. This bug has been fixed. + +13. The string returned by pcre_dfa_exec() after a partial match has been + changed so that it starts at the first inspected character rather than the + first character of the match. This makes a difference only if the pattern + starts with a lookbehind assertion or \b or \B (\K is not supported by + pcre_dfa_exec()). It's an incompatible change, but it makes the two + matching functions compatible, and I think it's the right thing to do. + +14. Added a pcredemo man page, created automatically from the pcredemo.c file, + so that the demonstration program is easily available in environments where + PCRE has not been installed from source. + +15. Arranged to add -DPCRE_STATIC to cflags in libpcre.pc, libpcreposix.cp, + libpcrecpp.pc and pcre-config when PCRE is not compiled as a shared + library. + +16. Added REG_UNGREEDY to the pcreposix interface, at the request of a user. + It maps to PCRE_UNGREEDY. It is not, of course, POSIX-compatible, but it + is not the first non-POSIX option to be added. Clearly some people find + these options useful. + +17. If a caller to the POSIX matching function regexec() passes a non-zero + value for nmatch with a NULL value for pmatch, the value of + nmatch is forced to zero. + +18. RunGrepTest did not have a test for the availability of the -u option of + the diff command, as RunTest does. It now checks in the same way as + RunTest, and also checks for the -b option. + +19. If an odd number of negated classes containing just a single character + interposed, within parentheses, between a forward reference to a named + subpattern and the definition of the subpattern, compilation crashed with + an internal error, complaining that it could not find the referenced + subpattern. An example of a crashing pattern is /(?&A)(([^m])(?))/. + [The bug was that it was starting one character too far in when skipping + over the character class, thus treating the ] as data rather than + terminating the class. This meant it could skip too much.] + +20. Added PCRE_NOTEMPTY_ATSTART in order to be able to correctly implement the + /g option in pcretest when the pattern contains \K, which makes it possible + to have an empty string match not at the start, even when the pattern is + anchored. Updated pcretest and pcredemo to use this option. + +21. If the maximum number of capturing subpatterns in a recursion was greater + than the maximum at the outer level, the higher number was returned, but + with unset values at the outer level. The correct (outer level) value is + now given. + +22. If (*ACCEPT) appeared inside capturing parentheses, previous releases of + PCRE did not set those parentheses (unlike Perl). I have now found a way to + make it do so. The string so far is captured, making this feature + compatible with Perl. + +23. The tests have been re-organized, adding tests 11 and 12, to make it + possible to check the Perl 5.10 features against Perl 5.10. + +24. Perl 5.10 allows subroutine calls in lookbehinds, as long as the subroutine + pattern matches a fixed length string. PCRE did not allow this; now it + does. Neither allows recursion. + +25. I finally figured out how to implement a request to provide the minimum + length of subject string that was needed in order to match a given pattern. + (It was back references and recursion that I had previously got hung up + on.) This code has now been added to pcre_study(); it finds a lower bound + to the length of subject needed. It is not necessarily the greatest lower + bound, but using it to avoid searching strings that are too short does give + some useful speed-ups. The value is available to calling programs via + pcre_fullinfo(). + +26. While implementing 25, I discovered to my embarrassment that pcretest had + not been passing the result of pcre_study() to pcre_dfa_exec(), so the + study optimizations had never been tested with that matching function. + Oops. What is worse, even when it was passed study data, there was a bug in + pcre_dfa_exec() that meant it never actually used it. Double oops. There + were also very few tests of studied patterns with pcre_dfa_exec(). + +27. If (?| is used to create subpatterns with duplicate numbers, they are now + allowed to have the same name, even if PCRE_DUPNAMES is not set. However, + on the other side of the coin, they are no longer allowed to have different + names, because these cannot be distinguished in PCRE, and this has caused + confusion. (This is a difference from Perl.) + +28. When duplicate subpattern names are present (necessarily with different + numbers, as required by 27 above), and a test is made by name in a + conditional pattern, either for a subpattern having been matched, or for + recursion in such a pattern, all the associated numbered subpatterns are + tested, and the overall condition is true if the condition is true for any + one of them. This is the way Perl works, and is also more like the way + testing by number works. + + +Version 7.9 11-Apr-09 +--------------------- + +1. When building with support for bzlib/zlib (pcregrep) and/or readline + (pcretest), all targets were linked against these libraries. This included + libpcre, libpcreposix, and libpcrecpp, even though they do not use these + libraries. This caused unwanted dependencies to be created. This problem + has been fixed, and now only pcregrep is linked with bzlib/zlib and only + pcretest is linked with readline. + +2. The "typedef int BOOL" in pcre_internal.h that was included inside the + "#ifndef FALSE" condition by an earlier change (probably 7.8/18) has been + moved outside it again, because FALSE and TRUE are already defined in AIX, + but BOOL is not. + +3. The pcre_config() function was treating the PCRE_MATCH_LIMIT and + PCRE_MATCH_LIMIT_RECURSION values as ints, when they should be long ints. + +4. The pcregrep documentation said spaces were inserted as well as colons (or + hyphens) following file names and line numbers when outputting matching + lines. This is not true; no spaces are inserted. I have also clarified the + wording for the --colour (or --color) option. + +5. In pcregrep, when --colour was used with -o, the list of matching strings + was not coloured; this is different to GNU grep, so I have changed it to be + the same. + +6. When --colo(u)r was used in pcregrep, only the first matching substring in + each matching line was coloured. Now it goes on to look for further matches + of any of the test patterns, which is the same behaviour as GNU grep. + +7. A pattern that could match an empty string could cause pcregrep to loop; it + doesn't make sense to accept an empty string match in pcregrep, so I have + locked it out (using PCRE's PCRE_NOTEMPTY option). By experiment, this + seems to be how GNU grep behaves. [But see later change 40 for release + 8.33.] + +8. The pattern (?(?=.*b)b|^) was incorrectly compiled as "match must be at + start or after a newline", because the conditional assertion was not being + correctly handled. The rule now is that both the assertion and what follows + in the first alternative must satisfy the test. + +9. If auto-callout was enabled in a pattern with a conditional group whose + condition was an assertion, PCRE could crash during matching, both with + pcre_exec() and pcre_dfa_exec(). + +10. The PCRE_DOLLAR_ENDONLY option was not working when pcre_dfa_exec() was + used for matching. + +11. Unicode property support in character classes was not working for + characters (bytes) greater than 127 when not in UTF-8 mode. + +12. Added the -M command line option to pcretest. + +14. Added the non-standard REG_NOTEMPTY option to the POSIX interface. + +15. Added the PCRE_NO_START_OPTIMIZE match-time option. + +16. Added comments and documentation about mis-use of no_arg in the C++ + wrapper. + +17. Implemented support for UTF-8 encoding in EBCDIC environments, a patch + from Martin Jerabek that uses macro names for all relevant character and + string constants. + +18. Added to pcre_internal.h two configuration checks: (a) If both EBCDIC and + SUPPORT_UTF8 are set, give an error; (b) If SUPPORT_UCP is set without + SUPPORT_UTF8, define SUPPORT_UTF8. The "configure" script handles both of + these, but not everybody uses configure. + +19. A conditional group that had only one branch was not being correctly + recognized as an item that could match an empty string. This meant that an + enclosing group might also not be so recognized, causing infinite looping + (and probably a segfault) for patterns such as ^"((?(?=[a])[^"])|b)*"$ + with the subject "ab", where knowledge that the repeated group can match + nothing is needed in order to break the loop. + +20. If a pattern that was compiled with callouts was matched using pcre_dfa_ + exec(), but without supplying a callout function, matching went wrong. + +21. If PCRE_ERROR_MATCHLIMIT occurred during a recursion, there was a memory + leak if the size of the offset vector was greater than 30. When the vector + is smaller, the saved offsets during recursion go onto a local stack + vector, but for larger vectors malloc() is used. It was failing to free + when the recursion yielded PCRE_ERROR_MATCH_LIMIT (or any other "abnormal" + error, in fact). + +22. There was a missing #ifdef SUPPORT_UTF8 round one of the variables in the + heapframe that is used only when UTF-8 support is enabled. This caused no + problem, but was untidy. + +23. Steven Van Ingelgem's patch to CMakeLists.txt to change the name + CMAKE_BINARY_DIR to PROJECT_BINARY_DIR so that it works when PCRE is + included within another project. + +24. Steven Van Ingelgem's patches to add more options to the CMake support, + slightly modified by me: + + (a) PCRE_BUILD_TESTS can be set OFF not to build the tests, including + not building pcregrep. + + (b) PCRE_BUILD_PCREGREP can be see OFF not to build pcregrep, but only + if PCRE_BUILD_TESTS is also set OFF, because the tests use pcregrep. + +25. Forward references, both numeric and by name, in patterns that made use of + duplicate group numbers, could behave incorrectly or give incorrect errors, + because when scanning forward to find the reference group, PCRE was not + taking into account the duplicate group numbers. A pattern such as + ^X(?3)(a)(?|(b)|(q))(Y) is an example. + +26. Changed a few more instances of "const unsigned char *" to USPTR, making + the feature of a custom pointer more persuasive (as requested by a user). + +27. Wrapped the definitions of fileno and isatty for Windows, which appear in + pcretest.c, inside #ifndefs, because it seems they are sometimes already + pre-defined. + +28. Added support for (*UTF8) at the start of a pattern. + +29. Arrange for flags added by the "release type" setting in CMake to be shown + in the configuration summary. + + +Version 7.8 05-Sep-08 +--------------------- + +1. Replaced UCP searching code with optimized version as implemented for Ad + Muncher (http://www.admuncher.com/) by Peter Kankowski. This uses a two- + stage table and inline lookup instead of a function, giving speed ups of 2 + to 5 times on some simple patterns that I tested. Permission was given to + distribute the MultiStage2.py script that generates the tables (it's not in + the tarball, but is in the Subversion repository). + +2. Updated the Unicode datatables to Unicode 5.1.0. This adds yet more + scripts. + +3. Change 12 for 7.7 introduced a bug in pcre_study() when a pattern contained + a group with a zero qualifier. The result of the study could be incorrect, + or the function might crash, depending on the pattern. + +4. Caseless matching was not working for non-ASCII characters in back + references. For example, /(\x{de})\1/8i was not matching \x{de}\x{fe}. + It now works when Unicode Property Support is available. + +5. In pcretest, an escape such as \x{de} in the data was always generating + a UTF-8 string, even in non-UTF-8 mode. Now it generates a single byte in + non-UTF-8 mode. If the value is greater than 255, it gives a warning about + truncation. + +6. Minor bugfix in pcrecpp.cc (change "" == ... to NULL == ...). + +7. Added two (int) casts to pcregrep when printing the difference of two + pointers, in case they are 64-bit values. + +8. Added comments about Mac OS X stack usage to the pcrestack man page and to + test 2 if it fails. + +9. Added PCRE_CALL_CONVENTION just before the names of all exported functions, + and a #define of that name to empty if it is not externally set. This is to + allow users of MSVC to set it if necessary. + +10. The PCRE_EXP_DEFN macro which precedes exported functions was missing from + the convenience functions in the pcre_get.c source file. + +11. An option change at the start of a pattern that had top-level alternatives + could cause overwriting and/or a crash. This command provoked a crash in + some environments: + + printf "/(?i)[\xc3\xa9\xc3\xbd]|[\xc3\xa9\xc3\xbdA]/8\n" | pcretest + + This potential security problem was recorded as CVE-2008-2371. + +12. For a pattern where the match had to start at the beginning or immediately + after a newline (e.g /.*anything/ without the DOTALL flag), pcre_exec() and + pcre_dfa_exec() could read past the end of the passed subject if there was + no match. To help with detecting such bugs (e.g. with valgrind), I modified + pcretest so that it places the subject at the end of its malloc-ed buffer. + +13. The change to pcretest in 12 above threw up a couple more cases when pcre_ + exec() might read past the end of the data buffer in UTF-8 mode. + +14. A similar bug to 7.3/2 existed when the PCRE_FIRSTLINE option was set and + the data contained the byte 0x85 as part of a UTF-8 character within its + first line. This applied both to normal and DFA matching. + +15. Lazy qualifiers were not working in some cases in UTF-8 mode. For example, + /^[^d]*?$/8 failed to match "abc". + +16. Added a missing copyright notice to pcrecpp_internal.h. + +17. Make it more clear in the documentation that values returned from + pcre_exec() in ovector are byte offsets, not character counts. + +18. Tidied a few places to stop certain compilers from issuing warnings. + +19. Updated the Virtual Pascal + BCC files to compile the latest v7.7, as + supplied by Stefan Weber. I made a further small update for 7.8 because + there is a change of source arrangements: the pcre_searchfuncs.c module is + replaced by pcre_ucd.c. + + +Version 7.7 07-May-08 +--------------------- + +1. Applied Craig's patch to sort out a long long problem: "If we can't convert + a string to a long long, pretend we don't even have a long long." This is + done by checking for the strtoq, strtoll, and _strtoi64 functions. + +2. Applied Craig's patch to pcrecpp.cc to restore ABI compatibility with + pre-7.6 versions, which defined a global no_arg variable instead of putting + it in the RE class. (See also #8 below.) + +3. Remove a line of dead code, identified by coverity and reported by Nuno + Lopes. + +4. Fixed two related pcregrep bugs involving -r with --include or --exclude: + + (1) The include/exclude patterns were being applied to the whole pathnames + of files, instead of just to the final components. + + (2) If there was more than one level of directory, the subdirectories were + skipped unless they satisfied the include/exclude conditions. This is + inconsistent with GNU grep (and could even be seen as contrary to the + pcregrep specification - which I improved to make it absolutely clear). + The action now is always to scan all levels of directory, and just + apply the include/exclude patterns to regular files. + +5. Added the --include_dir and --exclude_dir patterns to pcregrep, and used + --exclude_dir in the tests to avoid scanning .svn directories. + +6. Applied Craig's patch to the QuoteMeta function so that it escapes the + NUL character as backslash + 0 rather than backslash + NUL, because PCRE + doesn't support NULs in patterns. + +7. Added some missing "const"s to declarations of static tables in + pcre_compile.c and pcre_dfa_exec.c. + +8. Applied Craig's patch to pcrecpp.cc to fix a problem in OS X that was + caused by fix #2 above. (Subsequently also a second patch to fix the + first patch. And a third patch - this was a messy problem.) + +9. Applied Craig's patch to remove the use of push_back(). + +10. Applied Alan Lehotsky's patch to add REG_STARTEND support to the POSIX + matching function regexec(). + +11. Added support for the Oniguruma syntax \g, \g, \g'name', \g'n', + which, however, unlike Perl's \g{...}, are subroutine calls, not back + references. PCRE supports relative numbers with this syntax (I don't think + Oniguruma does). + +12. Previously, a group with a zero repeat such as (...){0} was completely + omitted from the compiled regex. However, this means that if the group + was called as a subroutine from elsewhere in the pattern, things went wrong + (an internal error was given). Such groups are now left in the compiled + pattern, with a new opcode that causes them to be skipped at execution + time. + +13. Added the PCRE_JAVASCRIPT_COMPAT option. This makes the following changes + to the way PCRE behaves: + + (a) A lone ] character is dis-allowed (Perl treats it as data). + + (b) A back reference to an unmatched subpattern matches an empty string + (Perl fails the current match path). + + (c) A data ] in a character class must be notated as \] because if the + first data character in a class is ], it defines an empty class. (In + Perl it is not possible to have an empty class.) The empty class [] + never matches; it forces failure and is equivalent to (*FAIL) or (?!). + The negative empty class [^] matches any one character, independently + of the DOTALL setting. + +14. A pattern such as /(?2)[]a()b](abc)/ which had a forward reference to a + non-existent subpattern following a character class starting with ']' and + containing () gave an internal compiling error instead of "reference to + non-existent subpattern". Fortunately, when the pattern did exist, the + compiled code was correct. (When scanning forwards to check for the + existence of the subpattern, it was treating the data ']' as terminating + the class, so got the count wrong. When actually compiling, the reference + was subsequently set up correctly.) + +15. The "always fail" assertion (?!) is optimzed to (*FAIL) by pcre_compile; + it was being rejected as not supported by pcre_dfa_exec(), even though + other assertions are supported. I have made pcre_dfa_exec() support + (*FAIL). + +16. The implementation of 13c above involved the invention of a new opcode, + OP_ALLANY, which is like OP_ANY but doesn't check the /s flag. Since /s + cannot be changed at match time, I realized I could make a small + improvement to matching performance by compiling OP_ALLANY instead of + OP_ANY for "." when DOTALL was set, and then removing the runtime tests + on the OP_ANY path. + +17. Compiling pcretest on Windows with readline support failed without the + following two fixes: (1) Make the unistd.h include conditional on + HAVE_UNISTD_H; (2) #define isatty and fileno as _isatty and _fileno. + +18. Changed CMakeLists.txt and cmake/FindReadline.cmake to arrange for the + ncurses library to be included for pcretest when ReadLine support is + requested, but also to allow for it to be overridden. This patch came from + Daniel Bergström. + +19. There was a typo in the file ucpinternal.h where f0_rangeflag was defined + as 0x00f00000 instead of 0x00800000. Luckily, this would not have caused + any errors with the current Unicode tables. Thanks to Peter Kankowski for + spotting this. + + +Version 7.6 28-Jan-08 +--------------------- + +1. A character class containing a very large number of characters with + codepoints greater than 255 (in UTF-8 mode, of course) caused a buffer + overflow. + +2. Patch to cut out the "long long" test in pcrecpp_unittest when + HAVE_LONG_LONG is not defined. + +3. Applied Christian Ehrlicher's patch to update the CMake build files to + bring them up to date and include new features. This patch includes: + + - Fixed PH's badly added libz and libbz2 support. + - Fixed a problem with static linking. + - Added pcredemo. [But later removed - see 7 below.] + - Fixed dftables problem and added an option. + - Added a number of HAVE_XXX tests, including HAVE_WINDOWS_H and + HAVE_LONG_LONG. + - Added readline support for pcretest. + - Added an listing of the option settings after cmake has run. + +4. A user submitted a patch to Makefile that makes it easy to create + "pcre.dll" under mingw when using Configure/Make. I added stuff to + Makefile.am that cause it to include this special target, without + affecting anything else. Note that the same mingw target plus all + the other distribution libraries and programs are now supported + when configuring with CMake (see 6 below) instead of with + Configure/Make. + +5. Applied Craig's patch that moves no_arg into the RE class in the C++ code. + This is an attempt to solve the reported problem "pcrecpp::no_arg is not + exported in the Windows port". It has not yet been confirmed that the patch + solves the problem, but it does no harm. + +6. Applied Sheri's patch to CMakeLists.txt to add NON_STANDARD_LIB_PREFIX and + NON_STANDARD_LIB_SUFFIX for dll names built with mingw when configured + with CMake, and also correct the comment about stack recursion. + +7. Remove the automatic building of pcredemo from the ./configure system and + from CMakeLists.txt. The whole idea of pcredemo.c is that it is an example + of a program that users should build themselves after PCRE is installed, so + building it automatically is not really right. What is more, it gave + trouble in some build environments. + +8. Further tidies to CMakeLists.txt from Sheri and Christian. + + +Version 7.5 10-Jan-08 +--------------------- + +1. Applied a patch from Craig: "This patch makes it possible to 'ignore' + values in parens when parsing an RE using the C++ wrapper." + +2. Negative specials like \S did not work in character classes in UTF-8 mode. + Characters greater than 255 were excluded from the class instead of being + included. + +3. The same bug as (2) above applied to negated POSIX classes such as + [:^space:]. + +4. PCRECPP_STATIC was referenced in pcrecpp_internal.h, but nowhere was it + defined or documented. It seems to have been a typo for PCRE_STATIC, so + I have changed it. + +5. The construct (?&) was not diagnosed as a syntax error (it referenced the + first named subpattern) and a construct such as (?&a) would reference the + first named subpattern whose name started with "a" (in other words, the + length check was missing). Both these problems are fixed. "Subpattern name + expected" is now given for (?&) (a zero-length name), and this patch also + makes it give the same error for \k'' (previously it complained that that + was a reference to a non-existent subpattern). + +6. The erroneous patterns (?+-a) and (?-+a) give different error messages; + this is right because (?- can be followed by option settings as well as by + digits. I have, however, made the messages clearer. + +7. Patterns such as (?(1)a|b) (a pattern that contains fewer subpatterns + than the number used in the conditional) now cause a compile-time error. + This is actually not compatible with Perl, which accepts such patterns, but + treats the conditional as always being FALSE (as PCRE used to), but it + seems to me that giving a diagnostic is better. + +8. Change "alphameric" to the more common word "alphanumeric" in comments + and messages. + +9. Fix two occurrences of "backslash" in comments that should have been + "backspace". + +10. Remove two redundant lines of code that can never be obeyed (their function + was moved elsewhere). + +11. The program that makes PCRE's Unicode character property table had a bug + which caused it to generate incorrect table entries for sequences of + characters that have the same character type, but are in different scripts. + It amalgamated them into a single range, with the script of the first of + them. In other words, some characters were in the wrong script. There were + thirteen such cases, affecting characters in the following ranges: + + U+002b0 - U+002c1 + U+0060c - U+0060d + U+0061e - U+00612 + U+0064b - U+0065e + U+0074d - U+0076d + U+01800 - U+01805 + U+01d00 - U+01d77 + U+01d9b - U+01dbf + U+0200b - U+0200f + U+030fc - U+030fe + U+03260 - U+0327f + U+0fb46 - U+0fbb1 + U+10450 - U+1049d + +12. The -o option (show only the matching part of a line) for pcregrep was not + compatible with GNU grep in that, if there was more than one match in a + line, it showed only the first of them. It now behaves in the same way as + GNU grep. + +13. If the -o and -v options were combined for pcregrep, it printed a blank + line for every non-matching line. GNU grep prints nothing, and pcregrep now + does the same. The return code can be used to tell if there were any + non-matching lines. + +14. Added --file-offsets and --line-offsets to pcregrep. + +15. The pattern (?=something)(?R) was not being diagnosed as a potentially + infinitely looping recursion. The bug was that positive lookaheads were not + being skipped when checking for a possible empty match (negative lookaheads + and both kinds of lookbehind were skipped). + +16. Fixed two typos in the Windows-only code in pcregrep.c, and moved the + inclusion of to before rather than after the definition of + INVALID_FILE_ATTRIBUTES (patch from David Byron). + +17. Specifying a possessive quantifier with a specific limit for a Unicode + character property caused pcre_compile() to compile bad code, which led at + runtime to PCRE_ERROR_INTERNAL (-14). Examples of patterns that caused this + are: /\p{Zl}{2,3}+/8 and /\p{Cc}{2}+/8. It was the possessive "+" that + caused the error; without that there was no problem. + +18. Added --enable-pcregrep-libz and --enable-pcregrep-libbz2. + +19. Added --enable-pcretest-libreadline. + +20. In pcrecpp.cc, the variable 'count' was incremented twice in + RE::GlobalReplace(). As a result, the number of replacements returned was + double what it should be. I removed one of the increments, but Craig sent a + later patch that removed the other one (the right fix) and added unit tests + that check the return values (which was not done before). + +21. Several CMake things: + + (1) Arranged that, when cmake is used on Unix, the libraries end up with + the names libpcre and libpcreposix, not just pcre and pcreposix. + + (2) The above change means that pcretest and pcregrep are now correctly + linked with the newly-built libraries, not previously installed ones. + + (3) Added PCRE_SUPPORT_LIBREADLINE, PCRE_SUPPORT_LIBZ, PCRE_SUPPORT_LIBBZ2. + +22. In UTF-8 mode, with newline set to "any", a pattern such as .*a.*=.b.* + crashed when matching a string such as a\x{2029}b (note that \x{2029} is a + UTF-8 newline character). The key issue is that the pattern starts .*; + this means that the match must be either at the beginning, or after a + newline. The bug was in the code for advancing after a failed match and + checking that the new position followed a newline. It was not taking + account of UTF-8 characters correctly. + +23. PCRE was behaving differently from Perl in the way it recognized POSIX + character classes. PCRE was not treating the sequence [:...:] as a + character class unless the ... were all letters. Perl, however, seems to + allow any characters between [: and :], though of course it rejects as + unknown any "names" that contain non-letters, because all the known class + names consist only of letters. Thus, Perl gives an error for [[:1234:]], + for example, whereas PCRE did not - it did not recognize a POSIX character + class. This seemed a bit dangerous, so the code has been changed to be + closer to Perl. The behaviour is not identical to Perl, because PCRE will + diagnose an unknown class for, for example, [[:l\ower:]] where Perl will + treat it as [[:lower:]]. However, PCRE does now give "unknown" errors where + Perl does, and where it didn't before. + +24. Rewrite so as to remove the single use of %n from pcregrep because in some + Windows environments %n is disabled by default. + + +Version 7.4 21-Sep-07 +--------------------- + +1. Change 7.3/28 was implemented for classes by looking at the bitmap. This + means that a class such as [\s] counted as "explicit reference to CR or + LF". That isn't really right - the whole point of the change was to try to + help when there was an actual mention of one of the two characters. So now + the change happens only if \r or \n (or a literal CR or LF) character is + encountered. + +2. The 32-bit options word was also used for 6 internal flags, but the numbers + of both had grown to the point where there were only 3 bits left. + Fortunately, there was spare space in the data structure, and so I have + moved the internal flags into a new 16-bit field to free up more option + bits. + +3. The appearance of (?J) at the start of a pattern set the DUPNAMES option, + but did not set the internal JCHANGED flag - either of these is enough to + control the way the "get" function works - but the PCRE_INFO_JCHANGED + facility is supposed to tell if (?J) was ever used, so now (?J) at the + start sets both bits. + +4. Added options (at build time, compile time, exec time) to change \R from + matching any Unicode line ending sequence to just matching CR, LF, or CRLF. + +5. doc/pcresyntax.html was missing from the distribution. + +6. Put back the definition of PCRE_ERROR_NULLWSLIMIT, for backward + compatibility, even though it is no longer used. + +7. Added macro for snprintf to pcrecpp_unittest.cc and also for strtoll and + strtoull to pcrecpp.cc to select the available functions in WIN32 when the + windows.h file is present (where different names are used). [This was + reversed later after testing - see 16 below.] + +8. Changed all #include to #include "config.h". There were also + some further cases that I changed to "pcre.h". + +9. When pcregrep was used with the --colour option, it missed the line ending + sequence off the lines that it output. + +10. It was pointed out to me that arrays of string pointers cause lots of + relocations when a shared library is dynamically loaded. A technique of + using a single long string with a table of offsets can drastically reduce + these. I have refactored PCRE in four places to do this. The result is + dramatic: + + Originally: 290 + After changing UCP table: 187 + After changing error message table: 43 + After changing table of "verbs" 36 + After changing table of Posix names 22 + + Thanks to the folks working on Gregex for glib for this insight. + +11. --disable-stack-for-recursion caused compiling to fail unless -enable- + unicode-properties was also set. + +12. Updated the tests so that they work when \R is defaulted to ANYCRLF. + +13. Added checks for ANY and ANYCRLF to pcrecpp.cc where it previously + checked only for CRLF. + +14. Added casts to pcretest.c to avoid compiler warnings. + +15. Added Craig's patch to various pcrecpp modules to avoid compiler warnings. + +16. Added Craig's patch to remove the WINDOWS_H tests, that were not working, + and instead check for _strtoi64 explicitly, and avoid the use of snprintf() + entirely. This removes changes made in 7 above. + +17. The CMake files have been updated, and there is now more information about + building with CMake in the NON-UNIX-USE document. + + +Version 7.3 28-Aug-07 +--------------------- + + 1. In the rejigging of the build system that eventually resulted in 7.1, the + line "#include " was included in pcre_internal.h. The use of angle + brackets there is not right, since it causes compilers to look for an + installed pcre.h, not the version that is in the source that is being + compiled (which of course may be different). I have changed it back to: + + #include "pcre.h" + + I have a vague recollection that the change was concerned with compiling in + different directories, but in the new build system, that is taken care of + by the VPATH setting the Makefile. + + 2. The pattern .*$ when run in not-DOTALL UTF-8 mode with newline=any failed + when the subject happened to end in the byte 0x85 (e.g. if the last + character was \x{1ec5}). *Character* 0x85 is one of the "any" newline + characters but of course it shouldn't be taken as a newline when it is part + of another character. The bug was that, for an unlimited repeat of . in + not-DOTALL UTF-8 mode, PCRE was advancing by bytes rather than by + characters when looking for a newline. + + 3. A small performance improvement in the DOTALL UTF-8 mode .* case. + + 4. Debugging: adjusted the names of opcodes for different kinds of parentheses + in debug output. + + 5. Arrange to use "%I64d" instead of "%lld" and "%I64u" instead of "%llu" for + long printing in the pcrecpp unittest when running under MinGW. + + 6. ESC_K was left out of the EBCDIC table. + + 7. Change 7.0/38 introduced a new limit on the number of nested non-capturing + parentheses; I made it 1000, which seemed large enough. Unfortunately, the + limit also applies to "virtual nesting" when a pattern is recursive, and in + this case 1000 isn't so big. I have been able to remove this limit at the + expense of backing off one optimization in certain circumstances. Normally, + when pcre_exec() would call its internal match() function recursively and + immediately return the result unconditionally, it uses a "tail recursion" + feature to save stack. However, when a subpattern that can match an empty + string has an unlimited repetition quantifier, it no longer makes this + optimization. That gives it a stack frame in which to save the data for + checking that an empty string has been matched. Previously this was taken + from the 1000-entry workspace that had been reserved. So now there is no + explicit limit, but more stack is used. + + 8. Applied Daniel's patches to solve problems with the import/export magic + syntax that is required for Windows, and which was going wrong for the + pcreposix and pcrecpp parts of the library. These were overlooked when this + problem was solved for the main library. + + 9. There were some crude static tests to avoid integer overflow when computing + the size of patterns that contain repeated groups with explicit upper + limits. As the maximum quantifier is 65535, the maximum group length was + set at 30,000 so that the product of these two numbers did not overflow a + 32-bit integer. However, it turns out that people want to use groups that + are longer than 30,000 bytes (though not repeat them that many times). + Change 7.0/17 (the refactoring of the way the pattern size is computed) has + made it possible to implement the integer overflow checks in a much more + dynamic way, which I have now done. The artificial limitation on group + length has been removed - we now have only the limit on the total length of + the compiled pattern, which depends on the LINK_SIZE setting. + +10. Fixed a bug in the documentation for get/copy named substring when + duplicate names are permitted. If none of the named substrings are set, the + functions return PCRE_ERROR_NOSUBSTRING (7); the doc said they returned an + empty string. + +11. Because Perl interprets \Q...\E at a high level, and ignores orphan \E + instances, patterns such as [\Q\E] or [\E] or even [^\E] cause an error, + because the ] is interpreted as the first data character and the + terminating ] is not found. PCRE has been made compatible with Perl in this + regard. Previously, it interpreted [\Q\E] as an empty class, and [\E] could + cause memory overwriting. + +10. Like Perl, PCRE automatically breaks an unlimited repeat after an empty + string has been matched (to stop an infinite loop). It was not recognizing + a conditional subpattern that could match an empty string if that + subpattern was within another subpattern. For example, it looped when + trying to match (((?(1)X|))*) but it was OK with ((?(1)X|)*) where the + condition was not nested. This bug has been fixed. + +12. A pattern like \X?\d or \P{L}?\d in non-UTF-8 mode could cause a backtrack + past the start of the subject in the presence of bytes with the top bit + set, for example "\x8aBCD". + +13. Added Perl 5.10 experimental backtracking controls (*FAIL), (*F), (*PRUNE), + (*SKIP), (*THEN), (*COMMIT), and (*ACCEPT). + +14. Optimized (?!) to (*FAIL). + +15. Updated the test for a valid UTF-8 string to conform to the later RFC 3629. + This restricts code points to be within the range 0 to 0x10FFFF, excluding + the "low surrogate" sequence 0xD800 to 0xDFFF. Previously, PCRE allowed the + full range 0 to 0x7FFFFFFF, as defined by RFC 2279. Internally, it still + does: it's just the validity check that is more restrictive. + +16. Inserted checks for integer overflows during escape sequence (backslash) + processing, and also fixed erroneous offset values for syntax errors during + backslash processing. + +17. Fixed another case of looking too far back in non-UTF-8 mode (cf 12 above) + for patterns like [\PPP\x8a]{1,}\x80 with the subject "A\x80". + +18. An unterminated class in a pattern like (?1)\c[ with a "forward reference" + caused an overrun. + +19. A pattern like (?:[\PPa*]*){8,} which had an "extended class" (one with + something other than just ASCII characters) inside a group that had an + unlimited repeat caused a loop at compile time (while checking to see + whether the group could match an empty string). + +20. Debugging a pattern containing \p or \P could cause a crash. For example, + [\P{Any}] did so. (Error in the code for printing property names.) + +21. An orphan \E inside a character class could cause a crash. + +22. A repeated capturing bracket such as (A)? could cause a wild memory + reference during compilation. + +23. There are several functions in pcre_compile() that scan along a compiled + expression for various reasons (e.g. to see if it's fixed length for look + behind). There were bugs in these functions when a repeated \p or \P was + present in the pattern. These operators have additional parameters compared + with \d, etc, and these were not being taken into account when moving along + the compiled data. Specifically: + + (a) A item such as \p{Yi}{3} in a lookbehind was not treated as fixed + length. + + (b) An item such as \pL+ within a repeated group could cause crashes or + loops. + + (c) A pattern such as \p{Yi}+(\P{Yi}+)(?1) could give an incorrect + "reference to non-existent subpattern" error. + + (d) A pattern like (\P{Yi}{2}\277)? could loop at compile time. + +24. A repeated \S or \W in UTF-8 mode could give wrong answers when multibyte + characters were involved (for example /\S{2}/8g with "A\x{a3}BC"). + +25. Using pcregrep in multiline, inverted mode (-Mv) caused it to loop. + +26. Patterns such as [\P{Yi}A] which include \p or \P and just one other + character were causing crashes (broken optimization). + +27. Patterns such as (\P{Yi}*\277)* (group with possible zero repeat containing + \p or \P) caused a compile-time loop. + +28. More problems have arisen in unanchored patterns when CRLF is a valid line + break. For example, the unstudied pattern [\r\n]A does not match the string + "\r\nA" because change 7.0/46 below moves the current point on by two + characters after failing to match at the start. However, the pattern \nA + *does* match, because it doesn't start till \n, and if [\r\n]A is studied, + the same is true. There doesn't seem any very clean way out of this, but + what I have chosen to do makes the common cases work: PCRE now takes note + of whether there can be an explicit match for \r or \n anywhere in the + pattern, and if so, 7.0/46 no longer applies. As part of this change, + there's a new PCRE_INFO_HASCRORLF option for finding out whether a compiled + pattern has explicit CR or LF references. + +29. Added (*CR) etc for changing newline setting at start of pattern. + + +Version 7.2 19-Jun-07 +--------------------- + + 1. If the fr_FR locale cannot be found for test 3, try the "french" locale, + which is apparently normally available under Windows. + + 2. Re-jig the pcregrep tests with different newline settings in an attempt + to make them independent of the local environment's newline setting. + + 3. Add code to configure.ac to remove -g from the CFLAGS default settings. + + 4. Some of the "internals" tests were previously cut out when the link size + was not 2, because the output contained actual offsets. The recent new + "Z" feature of pcretest means that these can be cut out, making the tests + usable with all link sizes. + + 5. Implemented Stan Switzer's goto replacement for longjmp() when not using + stack recursion. This gives a massive performance boost under BSD, but just + a small improvement under Linux. However, it saves one field in the frame + in all cases. + + 6. Added more features from the forthcoming Perl 5.10: + + (a) (?-n) (where n is a string of digits) is a relative subroutine or + recursion call. It refers to the nth most recently opened parentheses. + + (b) (?+n) is also a relative subroutine call; it refers to the nth next + to be opened parentheses. + + (c) Conditions that refer to capturing parentheses can be specified + relatively, for example, (?(-2)... or (?(+3)... + + (d) \K resets the start of the current match so that everything before + is not part of it. + + (e) \k{name} is synonymous with \k and \k'name' (.NET compatible). + + (f) \g{name} is another synonym - part of Perl 5.10's unification of + reference syntax. + + (g) (?| introduces a group in which the numbering of parentheses in each + alternative starts with the same number. + + (h) \h, \H, \v, and \V match horizontal and vertical whitespace. + + 7. Added two new calls to pcre_fullinfo(): PCRE_INFO_OKPARTIAL and + PCRE_INFO_JCHANGED. + + 8. A pattern such as (.*(.)?)* caused pcre_exec() to fail by either not + terminating or by crashing. Diagnosed by Viktor Griph; it was in the code + for detecting groups that can match an empty string. + + 9. A pattern with a very large number of alternatives (more than several + hundred) was running out of internal workspace during the pre-compile + phase, where pcre_compile() figures out how much memory will be needed. A + bit of new cunning has reduced the workspace needed for groups with + alternatives. The 1000-alternative test pattern now uses 12 bytes of + workspace instead of running out of the 4096 that are available. + +10. Inserted some missing (unsigned int) casts to get rid of compiler warnings. + +11. Applied patch from Google to remove an optimization that didn't quite work. + The report of the bug said: + + pcrecpp::RE("a*").FullMatch("aaa") matches, while + pcrecpp::RE("a*?").FullMatch("aaa") does not, and + pcrecpp::RE("a*?\\z").FullMatch("aaa") does again. + +12. If \p or \P was used in non-UTF-8 mode on a character greater than 127 + it matched the wrong number of bytes. + + +Version 7.1 24-Apr-07 +--------------------- + + 1. Applied Bob Rossi and Daniel G's patches to convert the build system to one + that is more "standard", making use of automake and other Autotools. There + is some re-arrangement of the files and adjustment of comments consequent + on this. + + 2. Part of the patch fixed a problem with the pcregrep tests. The test of -r + for recursive directory scanning broke on some systems because the files + are not scanned in any specific order and on different systems the order + was different. A call to "sort" has been inserted into RunGrepTest for the + approprate test as a short-term fix. In the longer term there may be an + alternative. + + 3. I had an email from Eric Raymond about problems translating some of PCRE's + man pages to HTML (despite the fact that I distribute HTML pages, some + people do their own conversions for various reasons). The problems + concerned the use of low-level troff macros .br and .in. I have therefore + removed all such uses from the man pages (some were redundant, some could + be replaced by .nf/.fi pairs). The 132html script that I use to generate + HTML has been updated to handle .nf/.fi and to complain if it encounters + .br or .in. + + 4. Updated comments in configure.ac that get placed in config.h.in and also + arranged for config.h to be included in the distribution, with the name + config.h.generic, for the benefit of those who have to compile without + Autotools (compare pcre.h, which is now distributed as pcre.h.generic). + + 5. Updated the support (such as it is) for Virtual Pascal, thanks to Stefan + Weber: (1) pcre_internal.h was missing some function renames; (2) updated + makevp.bat for the current PCRE, using the additional files + makevp_c.txt, makevp_l.txt, and pcregexp.pas. + + 6. A Windows user reported a minor discrepancy with test 2, which turned out + to be caused by a trailing space on an input line that had got lost in his + copy. The trailing space was an accident, so I've just removed it. + + 7. Add -Wl,-R... flags in pcre-config.in for *BSD* systems, as I'm told + that is needed. + + 8. Mark ucp_table (in ucptable.h) and ucp_gentype (in pcre_ucp_searchfuncs.c) + as "const" (a) because they are and (b) because it helps the PHP + maintainers who have recently made a script to detect big data structures + in the php code that should be moved to the .rodata section. I remembered + to update Builducptable as well, so it won't revert if ucptable.h is ever + re-created. + + 9. Added some extra #ifdef SUPPORT_UTF8 conditionals into pcretest.c, + pcre_printint.src, pcre_compile.c, pcre_study.c, and pcre_tables.c, in + order to be able to cut out the UTF-8 tables in the latter when UTF-8 + support is not required. This saves 1.5-2K of code, which is important in + some applications. + + Later: more #ifdefs are needed in pcre_ord2utf8.c and pcre_valid_utf8.c + so as not to refer to the tables, even though these functions will never be + called when UTF-8 support is disabled. Otherwise there are problems with a + shared library. + +10. Fixed two bugs in the emulated memmove() function in pcre_internal.h: + + (a) It was defining its arguments as char * instead of void *. + + (b) It was assuming that all moves were upwards in memory; this was true + a long time ago when I wrote it, but is no longer the case. + + The emulated memove() is provided for those environments that have neither + memmove() nor bcopy(). I didn't think anyone used it these days, but that + is clearly not the case, as these two bugs were recently reported. + +11. The script PrepareRelease is now distributed: it calls 132html, CleanTxt, + and Detrail to create the HTML documentation, the .txt form of the man + pages, and it removes trailing spaces from listed files. It also creates + pcre.h.generic and config.h.generic from pcre.h and config.h. In the latter + case, it wraps all the #defines with #ifndefs. This script should be run + before "make dist". + +12. Fixed two fairly obscure bugs concerned with quantified caseless matching + with Unicode property support. + + (a) For a maximizing quantifier, if the two different cases of the + character were of different lengths in their UTF-8 codings (there are + some cases like this - I found 11), and the matching function had to + back up over a mixture of the two cases, it incorrectly assumed they + were both the same length. + + (b) When PCRE was configured to use the heap rather than the stack for + recursion during matching, it was not correctly preserving the data for + the other case of a UTF-8 character when checking ahead for a match + while processing a minimizing repeat. If the check also involved + matching a wide character, but failed, corruption could cause an + erroneous result when trying to check for a repeat of the original + character. + +13. Some tidying changes to the testing mechanism: + + (a) The RunTest script now detects the internal link size and whether there + is UTF-8 and UCP support by running ./pcretest -C instead of relying on + values substituted by "configure". (The RunGrepTest script already did + this for UTF-8.) The configure.ac script no longer substitutes the + relevant variables. + + (b) The debugging options /B and /D in pcretest show the compiled bytecode + with length and offset values. This means that the output is different + for different internal link sizes. Test 2 is skipped for link sizes + other than 2 because of this, bypassing the problem. Unfortunately, + there was also a test in test 3 (the locale tests) that used /B and + failed for link sizes other than 2. Rather than cut the whole test out, + I have added a new /Z option to pcretest that replaces the length and + offset values with spaces. This is now used to make test 3 independent + of link size. (Test 2 will be tidied up later.) + +14. If erroroffset was passed as NULL to pcre_compile, it provoked a + segmentation fault instead of returning the appropriate error message. + +15. In multiline mode when the newline sequence was set to "any", the pattern + ^$ would give a match between the \r and \n of a subject such as "A\r\nB". + This doesn't seem right; it now treats the CRLF combination as the line + ending, and so does not match in that case. It's only a pattern such as ^$ + that would hit this one: something like ^ABC$ would have failed after \r + and then tried again after \r\n. + +16. Changed the comparison command for RunGrepTest from "diff -u" to "diff -ub" + in an attempt to make files that differ only in their line terminators + compare equal. This works on Linux. + +17. Under certain error circumstances pcregrep might try to free random memory + as it exited. This is now fixed, thanks to valgrind. + +19. In pcretest, if the pattern /(?m)^$/g was matched against the string + "abc\r\n\r\n", it found an unwanted second match after the second \r. This + was because its rules for how to advance for /g after matching an empty + string at the end of a line did not allow for this case. They now check for + it specially. + +20. pcretest is supposed to handle patterns and data of any length, by + extending its buffers when necessary. It was getting this wrong when the + buffer for a data line had to be extended. + +21. Added PCRE_NEWLINE_ANYCRLF which is like ANY, but matches only CR, LF, or + CRLF as a newline sequence. + +22. Code for handling Unicode properties in pcre_dfa_exec() wasn't being cut + out by #ifdef SUPPORT_UCP. This did no harm, as it could never be used, but + I have nevertheless tidied it up. + +23. Added some casts to kill warnings from HP-UX ia64 compiler. + +24. Added a man page for pcre-config. + + +Version 7.0 19-Dec-06 +--------------------- + + 1. Fixed a signed/unsigned compiler warning in pcre_compile.c, shown up by + moving to gcc 4.1.1. + + 2. The -S option for pcretest uses setrlimit(); I had omitted to #include + sys/time.h, which is documented as needed for this function. It doesn't + seem to matter on Linux, but it showed up on some releases of OS X. + + 3. It seems that there are systems where bytes whose values are greater than + 127 match isprint() in the "C" locale. The "C" locale should be the + default when a C program starts up. In most systems, only ASCII printing + characters match isprint(). This difference caused the output from pcretest + to vary, making some of the tests fail. I have changed pcretest so that: + + (a) When it is outputting text in the compiled version of a pattern, bytes + other than 32-126 are always shown as hex escapes. + + (b) When it is outputting text that is a matched part of a subject string, + it does the same, unless a different locale has been set for the match + (using the /L modifier). In this case, it uses isprint() to decide. + + 4. Fixed a major bug that caused incorrect computation of the amount of memory + required for a compiled pattern when options that changed within the + pattern affected the logic of the preliminary scan that determines the + length. The relevant options are -x, and -i in UTF-8 mode. The result was + that the computed length was too small. The symptoms of this bug were + either the PCRE error "internal error: code overflow" from pcre_compile(), + or a glibc crash with a message such as "pcretest: free(): invalid next + size (fast)". Examples of patterns that provoked this bug (shown in + pcretest format) are: + + /(?-x: )/x + /(?x)(?-x: \s*#\s*)/ + /((?i)[\x{c0}])/8 + /(?i:[\x{c0}])/8 + + HOWEVER: Change 17 below makes this fix obsolete as the memory computation + is now done differently. + + 5. Applied patches from Google to: (a) add a QuoteMeta function to the C++ + wrapper classes; (b) implement a new function in the C++ scanner that is + more efficient than the old way of doing things because it avoids levels of + recursion in the regex matching; (c) add a paragraph to the documentation + for the FullMatch() function. + + 6. The escape sequence \n was being treated as whatever was defined as + "newline". Not only was this contrary to the documentation, which states + that \n is character 10 (hex 0A), but it also went horribly wrong when + "newline" was defined as CRLF. This has been fixed. + + 7. In pcre_dfa_exec.c the value of an unsigned integer (the variable called c) + was being set to -1 for the "end of line" case (supposedly a value that no + character can have). Though this value is never used (the check for end of + line is "zero bytes in current character"), it caused compiler complaints. + I've changed it to 0xffffffff. + + 8. In pcre_version.c, the version string was being built by a sequence of + C macros that, in the event of PCRE_PRERELEASE being defined as an empty + string (as it is for production releases) called a macro with an empty + argument. The C standard says the result of this is undefined. The gcc + compiler treats it as an empty string (which was what was wanted) but it is + reported that Visual C gives an error. The source has been hacked around to + avoid this problem. + + 9. On the advice of a Windows user, included and in Windows + builds of pcretest, and changed the call to _setmode() to use _O_BINARY + instead of 0x8000. Made all the #ifdefs test both _WIN32 and WIN32 (not all + of them did). + +10. Originally, pcretest opened its input and output without "b"; then I was + told that "b" was needed in some environments, so it was added for release + 5.0 to both the input and output. (It makes no difference on Unix-like + systems.) Later I was told that it is wrong for the input on Windows. I've + now abstracted the modes into two macros, to make it easier to fiddle with + them, and removed "b" from the input mode under Windows. + +11. Added pkgconfig support for the C++ wrapper library, libpcrecpp. + +12. Added -help and --help to pcretest as an official way of being reminded + of the options. + +13. Removed some redundant semicolons after macro calls in pcrecpparg.h.in + and pcrecpp.cc because they annoy compilers at high warning levels. + +14. A bit of tidying/refactoring in pcre_exec.c in the main bumpalong loop. + +15. Fixed an occurrence of == in configure.ac that should have been = (shell + scripts are not C programs :-) and which was not noticed because it works + on Linux. + +16. pcretest is supposed to handle any length of pattern and data line (as one + line or as a continued sequence of lines) by extending its input buffer if + necessary. This feature was broken for very long pattern lines, leading to + a string of junk being passed to pcre_compile() if the pattern was longer + than about 50K. + +17. I have done a major re-factoring of the way pcre_compile() computes the + amount of memory needed for a compiled pattern. Previously, there was code + that made a preliminary scan of the pattern in order to do this. That was + OK when PCRE was new, but as the facilities have expanded, it has become + harder and harder to keep it in step with the real compile phase, and there + have been a number of bugs (see for example, 4 above). I have now found a + cunning way of running the real compile function in a "fake" mode that + enables it to compute how much memory it would need, while actually only + ever using a few hundred bytes of working memory and without too many + tests of the mode. This should make future maintenance and development + easier. A side effect of this work is that the limit of 200 on the nesting + depth of parentheses has been removed (though this was never a serious + limitation, I suspect). However, there is a downside: pcre_compile() now + runs more slowly than before (30% or more, depending on the pattern). I + hope this isn't a big issue. There is no effect on runtime performance. + +18. Fixed a minor bug in pcretest: if a pattern line was not terminated by a + newline (only possible for the last line of a file) and it was a + pattern that set a locale (followed by /Lsomething), pcretest crashed. + +19. Added additional timing features to pcretest. (1) The -tm option now times + matching only, not compiling. (2) Both -t and -tm can be followed, as a + separate command line item, by a number that specifies the number of + repeats to use when timing. The default is 50000; this gives better + precision, but takes uncomfortably long for very large patterns. + +20. Extended pcre_study() to be more clever in cases where a branch of a + subpattern has no definite first character. For example, (a*|b*)[cd] would + previously give no result from pcre_study(). Now it recognizes that the + first character must be a, b, c, or d. + +21. There was an incorrect error "recursive call could loop indefinitely" if + a subpattern (or the entire pattern) that was being tested for matching an + empty string contained only one non-empty item after a nested subpattern. + For example, the pattern (?>\x{100}*)\d(?R) provoked this error + incorrectly, because the \d was being skipped in the check. + +22. The pcretest program now has a new pattern option /B and a command line + option -b, which is equivalent to adding /B to every pattern. This causes + it to show the compiled bytecode, without the additional information that + -d shows. The effect of -d is now the same as -b with -i (and similarly, /D + is the same as /B/I). + +23. A new optimization is now able automatically to treat some sequences such + as a*b as a*+b. More specifically, if something simple (such as a character + or a simple class like \d) has an unlimited quantifier, and is followed by + something that cannot possibly match the quantified thing, the quantifier + is automatically "possessified". + +24. A recursive reference to a subpattern whose number was greater than 39 + went wrong under certain circumstances in UTF-8 mode. This bug could also + have affected the operation of pcre_study(). + +25. Realized that a little bit of performance could be had by replacing + (c & 0xc0) == 0xc0 with c >= 0xc0 when processing UTF-8 characters. + +26. Timing data from pcretest is now shown to 4 decimal places instead of 3. + +27. Possessive quantifiers such as a++ were previously implemented by turning + them into atomic groups such as ($>a+). Now they have their own opcodes, + which improves performance. This includes the automatically created ones + from 23 above. + +28. A pattern such as (?=(\w+))\1: which simulates an atomic group using a + lookahead was broken if it was not anchored. PCRE was mistakenly expecting + the first matched character to be a colon. This applied both to named and + numbered groups. + +29. The ucpinternal.h header file was missing its idempotency #ifdef. + +30. I was sent a "project" file called libpcre.a.dev which I understand makes + building PCRE on Windows easier, so I have included it in the distribution. + +31. There is now a check in pcretest against a ridiculously large number being + returned by pcre_exec() or pcre_dfa_exec(). If this happens in a /g or /G + loop, the loop is abandoned. + +32. Forward references to subpatterns in conditions such as (?(2)...) where + subpattern 2 is defined later cause pcre_compile() to search forwards in + the pattern for the relevant set of parentheses. This search went wrong + when there were unescaped parentheses in a character class, parentheses + escaped with \Q...\E, or parentheses in a #-comment in /x mode. + +33. "Subroutine" calls and backreferences were previously restricted to + referencing subpatterns earlier in the regex. This restriction has now + been removed. + +34. Added a number of extra features that are going to be in Perl 5.10. On the + whole, these are just syntactic alternatives for features that PCRE had + previously implemented using the Python syntax or my own invention. The + other formats are all retained for compatibility. + + (a) Named groups can now be defined as (?...) or (?'name'...) as well + as (?P...). The new forms, as well as being in Perl 5.10, are + also .NET compatible. + + (b) A recursion or subroutine call to a named group can now be defined as + (?&name) as well as (?P>name). + + (c) A backreference to a named group can now be defined as \k or + \k'name' as well as (?P=name). The new forms, as well as being in Perl + 5.10, are also .NET compatible. + + (d) A conditional reference to a named group can now use the syntax + (?() or (?('name') as well as (?(name). + + (e) A "conditional group" of the form (?(DEFINE)...) can be used to define + groups (named and numbered) that are never evaluated inline, but can be + called as "subroutines" from elsewhere. In effect, the DEFINE condition + is always false. There may be only one alternative in such a group. + + (f) A test for recursion can be given as (?(R1).. or (?(R&name)... as well + as the simple (?(R). The condition is true only if the most recent + recursion is that of the given number or name. It does not search out + through the entire recursion stack. + + (g) The escape \gN or \g{N} has been added, where N is a positive or + negative number, specifying an absolute or relative reference. + +35. Tidied to get rid of some further signed/unsigned compiler warnings and + some "unreachable code" warnings. + +36. Updated the Unicode property tables to Unicode version 5.0.0. Amongst other + things, this adds five new scripts. + +37. Perl ignores orphaned \E escapes completely. PCRE now does the same. + There were also incompatibilities regarding the handling of \Q..\E inside + character classes, for example with patterns like [\Qa\E-\Qz\E] where the + hyphen was adjacent to \Q or \E. I hope I've cleared all this up now. + +38. Like Perl, PCRE detects when an indefinitely repeated parenthesized group + matches an empty string, and forcibly breaks the loop. There were bugs in + this code in non-simple cases. For a pattern such as ^(a()*)* matched + against aaaa the result was just "a" rather than "aaaa", for example. Two + separate and independent bugs (that affected different cases) have been + fixed. + +39. Refactored the code to abolish the use of different opcodes for small + capturing bracket numbers. This is a tidy that I avoided doing when I + removed the limit on the number of capturing brackets for 3.5 back in 2001. + The new approach is not only tidier, it makes it possible to reduce the + memory needed to fix the previous bug (38). + +40. Implemented PCRE_NEWLINE_ANY to recognize any of the Unicode newline + sequences (http://unicode.org/unicode/reports/tr18/) as "newline" when + processing dot, circumflex, or dollar metacharacters, or #-comments in /x + mode. + +41. Add \R to match any Unicode newline sequence, as suggested in the Unicode + report. + +42. Applied patch, originally from Ari Pollak, modified by Google, to allow + copy construction and assignment in the C++ wrapper. + +43. Updated pcregrep to support "--newline=any". In the process, I fixed a + couple of bugs that could have given wrong results in the "--newline=crlf" + case. + +44. Added a number of casts and did some reorganization of signed/unsigned int + variables following suggestions from Dair Grant. Also renamed the variable + "this" as "item" because it is a C++ keyword. + +45. Arranged for dftables to add + + #include "pcre_internal.h" + + to pcre_chartables.c because without it, gcc 4.x may remove the array + definition from the final binary if PCRE is built into a static library and + dead code stripping is activated. + +46. For an unanchored pattern, if a match attempt fails at the start of a + newline sequence, and the newline setting is CRLF or ANY, and the next two + characters are CRLF, advance by two characters instead of one. + + +Version 6.7 04-Jul-06 +--------------------- + + 1. In order to handle tests when input lines are enormously long, pcretest has + been re-factored so that it automatically extends its buffers when + necessary. The code is crude, but this _is_ just a test program. The + default size has been increased from 32K to 50K. + + 2. The code in pcre_study() was using the value of the re argument before + testing it for NULL. (Of course, in any sensible call of the function, it + won't be NULL.) + + 3. The memmove() emulation function in pcre_internal.h, which is used on + systems that lack both memmove() and bcopy() - that is, hardly ever - + was missing a "static" storage class specifier. + + 4. When UTF-8 mode was not set, PCRE looped when compiling certain patterns + containing an extended class (one that cannot be represented by a bitmap + because it contains high-valued characters or Unicode property items, e.g. + [\pZ]). Almost always one would set UTF-8 mode when processing such a + pattern, but PCRE should not loop if you do not (it no longer does). + [Detail: two cases were found: (a) a repeated subpattern containing an + extended class; (b) a recursive reference to a subpattern that followed a + previous extended class. It wasn't skipping over the extended class + correctly when UTF-8 mode was not set.] + + 5. A negated single-character class was not being recognized as fixed-length + in lookbehind assertions such as (?<=[^f]), leading to an incorrect + compile error "lookbehind assertion is not fixed length". + + 6. The RunPerlTest auxiliary script was showing an unexpected difference + between PCRE and Perl for UTF-8 tests. It turns out that it is hard to + write a Perl script that can interpret lines of an input file either as + byte characters or as UTF-8, which is what "perltest" was being required to + do for the non-UTF-8 and UTF-8 tests, respectively. Essentially what you + can't do is switch easily at run time between having the "use utf8;" pragma + or not. In the end, I fudged it by using the RunPerlTest script to insert + "use utf8;" explicitly for the UTF-8 tests. + + 7. In multiline (/m) mode, PCRE was matching ^ after a terminating newline at + the end of the subject string, contrary to the documentation and to what + Perl does. This was true of both matching functions. Now it matches only at + the start of the subject and immediately after *internal* newlines. + + 8. A call of pcre_fullinfo() from pcretest to get the option bits was passing + a pointer to an int instead of a pointer to an unsigned long int. This + caused problems on 64-bit systems. + + 9. Applied a patch from the folks at Google to pcrecpp.cc, to fix "another + instance of the 'standard' template library not being so standard". + +10. There was no check on the number of named subpatterns nor the maximum + length of a subpattern name. The product of these values is used to compute + the size of the memory block for a compiled pattern. By supplying a very + long subpattern name and a large number of named subpatterns, the size + computation could be caused to overflow. This is now prevented by limiting + the length of names to 32 characters, and the number of named subpatterns + to 10,000. + +11. Subpatterns that are repeated with specific counts have to be replicated in + the compiled pattern. The size of memory for this was computed from the + length of the subpattern and the repeat count. The latter is limited to + 65535, but there was no limit on the former, meaning that integer overflow + could in principle occur. The compiled length of a repeated subpattern is + now limited to 30,000 bytes in order to prevent this. + +12. Added the optional facility to have named substrings with the same name. + +13. Added the ability to use a named substring as a condition, using the + Python syntax: (?(name)yes|no). This overloads (?(R)... and names that + are numbers (not recommended). Forward references are permitted. + +14. Added forward references in named backreferences (if you see what I mean). + +15. In UTF-8 mode, with the PCRE_DOTALL option set, a quantified dot in the + pattern could run off the end of the subject. For example, the pattern + "(?s)(.{1,5})"8 did this with the subject "ab". + +16. If PCRE_DOTALL or PCRE_MULTILINE were set, pcre_dfa_exec() behaved as if + PCRE_CASELESS was set when matching characters that were quantified with ? + or *. + +17. A character class other than a single negated character that had a minimum + but no maximum quantifier - for example [ab]{6,} - was not handled + correctly by pce_dfa_exec(). It would match only one character. + +18. A valid (though odd) pattern that looked like a POSIX character + class but used an invalid character after [ (for example [[,abc,]]) caused + pcre_compile() to give the error "Failed: internal error: code overflow" or + in some cases to crash with a glibc free() error. This could even happen if + the pattern terminated after [[ but there just happened to be a sequence of + letters, a binary zero, and a closing ] in the memory that followed. + +19. Perl's treatment of octal escapes in the range \400 to \777 has changed + over the years. Originally (before any Unicode support), just the bottom 8 + bits were taken. Thus, for example, \500 really meant \100. Nowadays the + output from "man perlunicode" includes this: + + The regular expression compiler produces polymorphic opcodes. That + is, the pattern adapts to the data and automatically switches to + the Unicode character scheme when presented with Unicode data--or + instead uses a traditional byte scheme when presented with byte + data. + + Sadly, a wide octal escape does not cause a switch, and in a string with + no other multibyte characters, these octal escapes are treated as before. + Thus, in Perl, the pattern /\500/ actually matches \100 but the pattern + /\500|\x{1ff}/ matches \500 or \777 because the whole thing is treated as a + Unicode string. + + I have not perpetrated such confusion in PCRE. Up till now, it took just + the bottom 8 bits, as in old Perl. I have now made octal escapes with + values greater than \377 illegal in non-UTF-8 mode. In UTF-8 mode they + translate to the appropriate multibyte character. + +29. Applied some refactoring to reduce the number of warnings from Microsoft + and Borland compilers. This has included removing the fudge introduced + seven years ago for the OS/2 compiler (see 2.02/2 below) because it caused + a warning about an unused variable. + +21. PCRE has not included VT (character 0x0b) in the set of whitespace + characters since release 4.0, because Perl (from release 5.004) does not. + [Or at least, is documented not to: some releases seem to be in conflict + with the documentation.] However, when a pattern was studied with + pcre_study() and all its branches started with \s, PCRE still included VT + as a possible starting character. Of course, this did no harm; it just + caused an unnecessary match attempt. + +22. Removed a now-redundant internal flag bit that recorded the fact that case + dependency changed within the pattern. This was once needed for "required + byte" processing, but is no longer used. This recovers a now-scarce options + bit. Also moved the least significant internal flag bit to the most- + significant bit of the word, which was not previously used (hangover from + the days when it was an int rather than a uint) to free up another bit for + the future. + +23. Added support for CRLF line endings as well as CR and LF. As well as the + default being selectable at build time, it can now be changed at runtime + via the PCRE_NEWLINE_xxx flags. There are now options for pcregrep to + specify that it is scanning data with non-default line endings. + +24. Changed the definition of CXXLINK to make it agree with the definition of + LINK in the Makefile, by replacing LDFLAGS to CXXFLAGS. + +25. Applied Ian Taylor's patches to avoid using another stack frame for tail + recursions. This makes a big different to stack usage for some patterns. + +26. If a subpattern containing a named recursion or subroutine reference such + as (?P>B) was quantified, for example (xxx(?P>B)){3}, the calculation of + the space required for the compiled pattern went wrong and gave too small a + value. Depending on the environment, this could lead to "Failed: internal + error: code overflow at offset 49" or "glibc detected double free or + corruption" errors. + +27. Applied patches from Google (a) to support the new newline modes and (b) to + advance over multibyte UTF-8 characters in GlobalReplace. + +28. Change free() to pcre_free() in pcredemo.c. Apparently this makes a + difference for some implementation of PCRE in some Windows version. + +29. Added some extra testing facilities to pcretest: + + \q in a data line sets the "match limit" value + \Q in a data line sets the "match recursion limt" value + -S sets the stack size, where is in megabytes + + The -S option isn't available for Windows. + + +Version 6.6 06-Feb-06 +--------------------- + + 1. Change 16(a) for 6.5 broke things, because PCRE_DATA_SCOPE was not defined + in pcreposix.h. I have copied the definition from pcre.h. + + 2. Change 25 for 6.5 broke compilation in a build directory out-of-tree + because pcre.h is no longer a built file. + + 3. Added Jeff Friedl's additional debugging patches to pcregrep. These are + not normally included in the compiled code. + + +Version 6.5 01-Feb-06 +--------------------- + + 1. When using the partial match feature with pcre_dfa_exec(), it was not + anchoring the second and subsequent partial matches at the new starting + point. This could lead to incorrect results. For example, with the pattern + /1234/, partially matching against "123" and then "a4" gave a match. + + 2. Changes to pcregrep: + + (a) All non-match returns from pcre_exec() were being treated as failures + to match the line. Now, unless the error is PCRE_ERROR_NOMATCH, an + error message is output. Some extra information is given for the + PCRE_ERROR_MATCHLIMIT and PCRE_ERROR_RECURSIONLIMIT errors, which are + probably the only errors that are likely to be caused by users (by + specifying a regex that has nested indefinite repeats, for instance). + If there are more than 20 of these errors, pcregrep is abandoned. + + (b) A binary zero was treated as data while matching, but terminated the + output line if it was written out. This has been fixed: binary zeroes + are now no different to any other data bytes. + + (c) Whichever of the LC_ALL or LC_CTYPE environment variables is set is + used to set a locale for matching. The --locale=xxxx long option has + been added (no short equivalent) to specify a locale explicitly on the + pcregrep command, overriding the environment variables. + + (d) When -B was used with -n, some line numbers in the output were one less + than they should have been. + + (e) Added the -o (--only-matching) option. + + (f) If -A or -C was used with -c (count only), some lines of context were + accidentally printed for the final match. + + (g) Added the -H (--with-filename) option. + + (h) The combination of options -rh failed to suppress file names for files + that were found from directory arguments. + + (i) Added the -D (--devices) and -d (--directories) options. + + (j) Added the -F (--fixed-strings) option. + + (k) Allow "-" to be used as a file name for -f as well as for a data file. + + (l) Added the --colo(u)r option. + + (m) Added Jeffrey Friedl's -S testing option, but within #ifdefs so that it + is not present by default. + + 3. A nasty bug was discovered in the handling of recursive patterns, that is, + items such as (?R) or (?1), when the recursion could match a number of + alternatives. If it matched one of the alternatives, but subsequently, + outside the recursion, there was a failure, the code tried to back up into + the recursion. However, because of the way PCRE is implemented, this is not + possible, and the result was an incorrect result from the match. + + In order to prevent this happening, the specification of recursion has + been changed so that all such subpatterns are automatically treated as + atomic groups. Thus, for example, (?R) is treated as if it were (?>(?R)). + + 4. I had overlooked the fact that, in some locales, there are characters for + which isalpha() is true but neither isupper() nor islower() are true. In + the fr_FR locale, for instance, the \xAA and \xBA characters (ordmasculine + and ordfeminine) are like this. This affected the treatment of \w and \W + when they appeared in character classes, but not when they appeared outside + a character class. The bit map for "word" characters is now created + separately from the results of isalnum() instead of just taking it from the + upper, lower, and digit maps. (Plus the underscore character, of course.) + + 5. The above bug also affected the handling of POSIX character classes such as + [[:alpha:]] and [[:alnum:]]. These do not have their own bit maps in PCRE's + permanent tables. Instead, the bit maps for such a class were previously + created as the appropriate unions of the upper, lower, and digit bitmaps. + Now they are created by subtraction from the [[:word:]] class, which has + its own bitmap. + + 6. The [[:blank:]] character class matches horizontal, but not vertical space. + It is created by subtracting the vertical space characters (\x09, \x0a, + \x0b, \x0c) from the [[:space:]] bitmap. Previously, however, the + subtraction was done in the overall bitmap for a character class, meaning + that a class such as [\x0c[:blank:]] was incorrect because \x0c would not + be recognized. This bug has been fixed. + + 7. Patches from the folks at Google: + + (a) pcrecpp.cc: "to handle a corner case that may or may not happen in + real life, but is still worth protecting against". + + (b) pcrecpp.cc: "corrects a bug when negative radixes are used with + regular expressions". + + (c) pcre_scanner.cc: avoid use of std::count() because not all systems + have it. + + (d) Split off pcrecpparg.h from pcrecpp.h and had the former built by + "configure" and the latter not, in order to fix a problem somebody had + with compiling the Arg class on HP-UX. + + (e) Improve the error-handling of the C++ wrapper a little bit. + + (f) New tests for checking recursion limiting. + + 8. The pcre_memmove() function, which is used only if the environment does not + have a standard memmove() function (and is therefore rarely compiled), + contained two bugs: (a) use of int instead of size_t, and (b) it was not + returning a result (though PCRE never actually uses the result). + + 9. In the POSIX regexec() interface, if nmatch is specified as a ridiculously + large number - greater than INT_MAX/(3*sizeof(int)) - REG_ESPACE is + returned instead of calling malloc() with an overflowing number that would + most likely cause subsequent chaos. + +10. The debugging option of pcretest was not showing the NO_AUTO_CAPTURE flag. + +11. The POSIX flag REG_NOSUB is now supported. When a pattern that was compiled + with this option is matched, the nmatch and pmatch options of regexec() are + ignored. + +12. Added REG_UTF8 to the POSIX interface. This is not defined by POSIX, but is + provided in case anyone wants to the the POSIX interface with UTF-8 + strings. + +13. Added CXXLDFLAGS to the Makefile parameters to provide settings only on the + C++ linking (needed for some HP-UX environments). + +14. Avoid compiler warnings in get_ucpname() when compiled without UCP support + (unused parameter) and in the pcre_printint() function (omitted "default" + switch label when the default is to do nothing). + +15. Added some code to make it possible, when PCRE is compiled as a C++ + library, to replace subject pointers for pcre_exec() with a smart pointer + class, thus making it possible to process discontinuous strings. + +16. The two macros PCRE_EXPORT and PCRE_DATA_SCOPE are confusing, and perform + much the same function. They were added by different people who were trying + to make PCRE easy to compile on non-Unix systems. It has been suggested + that PCRE_EXPORT be abolished now that there is more automatic apparatus + for compiling on Windows systems. I have therefore replaced it with + PCRE_DATA_SCOPE. This is set automatically for Windows; if not set it + defaults to "extern" for C or "extern C" for C++, which works fine on + Unix-like systems. It is now possible to override the value of PCRE_DATA_ + SCOPE with something explicit in config.h. In addition: + + (a) pcreposix.h still had just "extern" instead of either of these macros; + I have replaced it with PCRE_DATA_SCOPE. + + (b) Functions such as _pcre_xclass(), which are internal to the library, + but external in the C sense, all had PCRE_EXPORT in their definitions. + This is apparently wrong for the Windows case, so I have removed it. + (It makes no difference on Unix-like systems.) + +17. Added a new limit, MATCH_LIMIT_RECURSION, which limits the depth of nesting + of recursive calls to match(). This is different to MATCH_LIMIT because + that limits the total number of calls to match(), not all of which increase + the depth of recursion. Limiting the recursion depth limits the amount of + stack (or heap if NO_RECURSE is set) that is used. The default can be set + when PCRE is compiled, and changed at run time. A patch from Google adds + this functionality to the C++ interface. + +18. Changes to the handling of Unicode character properties: + + (a) Updated the table to Unicode 4.1.0. + + (b) Recognize characters that are not in the table as "Cn" (undefined). + + (c) I revised the way the table is implemented to a much improved format + which includes recognition of ranges. It now supports the ranges that + are defined in UnicodeData.txt, and it also amalgamates other + characters into ranges. This has reduced the number of entries in the + table from around 16,000 to around 3,000, thus reducing its size + considerably. I realized I did not need to use a tree structure after + all - a binary chop search is just as efficient. Having reduced the + number of entries, I extended their size from 6 bytes to 8 bytes to + allow for more data. + + (d) Added support for Unicode script names via properties such as \p{Han}. + +19. In UTF-8 mode, a backslash followed by a non-Ascii character was not + matching that character. + +20. When matching a repeated Unicode property with a minimum greater than zero, + (for example \pL{2,}), PCRE could look past the end of the subject if it + reached it while seeking the minimum number of characters. This could + happen only if some of the characters were more than one byte long, because + there is a check for at least the minimum number of bytes. + +21. Refactored the implementation of \p and \P so as to be more general, to + allow for more different types of property in future. This has changed the + compiled form incompatibly. Anybody with saved compiled patterns that use + \p or \P will have to recompile them. + +22. Added "Any" and "L&" to the supported property types. + +23. Recognize \x{...} as a code point specifier, even when not in UTF-8 mode, + but give a compile time error if the value is greater than 0xff. + +24. The man pages for pcrepartial, pcreprecompile, and pcre_compile2 were + accidentally not being installed or uninstalled. + +25. The pcre.h file was built from pcre.h.in, but the only changes that were + made were to insert the current release number. This seemed silly, because + it made things harder for people building PCRE on systems that don't run + "configure". I have turned pcre.h into a distributed file, no longer built + by "configure", with the version identification directly included. There is + no longer a pcre.h.in file. + + However, this change necessitated a change to the pcre-config script as + well. It is built from pcre-config.in, and one of the substitutions was the + release number. I have updated configure.ac so that ./configure now finds + the release number by grepping pcre.h. + +26. Added the ability to run the tests under valgrind. + + +Version 6.4 05-Sep-05 +--------------------- + + 1. Change 6.0/10/(l) to pcregrep introduced a bug that caused separator lines + "--" to be printed when multiple files were scanned, even when none of the + -A, -B, or -C options were used. This is not compatible with Gnu grep, so I + consider it to be a bug, and have restored the previous behaviour. + + 2. A couple of code tidies to get rid of compiler warnings. + + 3. The pcretest program used to cheat by referring to symbols in the library + whose names begin with _pcre_. These are internal symbols that are not + really supposed to be visible externally, and in some environments it is + possible to suppress them. The cheating is now confined to including + certain files from the library's source, which is a bit cleaner. + + 4. Renamed pcre.in as pcre.h.in to go with pcrecpp.h.in; it also makes the + file's purpose clearer. + + 5. Reorganized pcre_ucp_findchar(). + + +Version 6.3 15-Aug-05 +--------------------- + + 1. The file libpcre.pc.in did not have general read permission in the tarball. + + 2. There were some problems when building without C++ support: + + (a) If C++ support was not built, "make install" and "make test" still + tried to test it. + + (b) There were problems when the value of CXX was explicitly set. Some + changes have been made to try to fix these, and ... + + (c) --disable-cpp can now be used to explicitly disable C++ support. + + (d) The use of @CPP_OBJ@ directly caused a blank line preceded by a + backslash in a target when C++ was disabled. This confuses some + versions of "make", apparently. Using an intermediate variable solves + this. (Same for CPP_LOBJ.) + + 3. $(LINK_FOR_BUILD) now includes $(CFLAGS_FOR_BUILD) and $(LINK) + (non-Windows) now includes $(CFLAGS) because these flags are sometimes + necessary on certain architectures. + + 4. Added a setting of -export-symbols-regex to the link command to remove + those symbols that are exported in the C sense, but actually are local + within the library, and not documented. Their names all begin with + "_pcre_". This is not a perfect job, because (a) we have to except some + symbols that pcretest ("illegally") uses, and (b) the facility isn't always + available (and never for static libraries). I have made a note to try to + find a way round (a) in the future. + + +Version 6.2 01-Aug-05 +--------------------- + + 1. There was no test for integer overflow of quantifier values. A construction + such as {1111111111111111} would give undefined results. What is worse, if + a minimum quantifier for a parenthesized subpattern overflowed and became + negative, the calculation of the memory size went wrong. This could have + led to memory overwriting. + + 2. Building PCRE using VPATH was broken. Hopefully it is now fixed. + + 3. Added "b" to the 2nd argument of fopen() in dftables.c, for non-Unix-like + operating environments where this matters. + + 4. Applied Giuseppe Maxia's patch to add additional features for controlling + PCRE options from within the C++ wrapper. + + 5. Named capturing subpatterns were not being correctly counted when a pattern + was compiled. This caused two problems: (a) If there were more than 100 + such subpatterns, the calculation of the memory needed for the whole + compiled pattern went wrong, leading to an overflow error. (b) Numerical + back references of the form \12, where the number was greater than 9, were + not recognized as back references, even though there were sufficient + previous subpatterns. + + 6. Two minor patches to pcrecpp.cc in order to allow it to compile on older + versions of gcc, e.g. 2.95.4. + + +Version 6.1 21-Jun-05 +--------------------- + + 1. There was one reference to the variable "posix" in pcretest.c that was not + surrounded by "#if !defined NOPOSIX". + + 2. Make it possible to compile pcretest without DFA support, UTF8 support, or + the cross-check on the old pcre_info() function, for the benefit of the + cut-down version of PCRE that is currently imported into Exim. + + 3. A (silly) pattern starting with (?i)(?-i) caused an internal space + allocation error. I've done the easy fix, which wastes 2 bytes for sensible + patterns that start (?i) but I don't think that matters. The use of (?i) is + just an example; this all applies to the other options as well. + + 4. Since libtool seems to echo the compile commands it is issuing, the output + from "make" can be reduced a bit by putting "@" in front of each libtool + compile command. + + 5. Patch from the folks at Google for configure.in to be a bit more thorough + in checking for a suitable C++ installation before trying to compile the + C++ stuff. This should fix a reported problem when a compiler was present, + but no suitable headers. + + 6. The man pages all had just "PCRE" as their title. I have changed them to + be the relevant file name. I have also arranged that these names are + retained in the file doc/pcre.txt, which is a concatenation in text format + of all the man pages except the little individual ones for each function. + + 7. The NON-UNIX-USE file had not been updated for the different set of source + files that come with release 6. I also added a few comments about the C++ + wrapper. + + +Version 6.0 07-Jun-05 +--------------------- + + 1. Some minor internal re-organization to help with my DFA experiments. + + 2. Some missing #ifdef SUPPORT_UCP conditionals in pcretest and printint that + didn't matter for the library itself when fully configured, but did matter + when compiling without UCP support, or within Exim, where the ucp files are + not imported. + + 3. Refactoring of the library code to split up the various functions into + different source modules. The addition of the new DFA matching code (see + below) to a single monolithic source would have made it really too + unwieldy, quite apart from causing all the code to be include in a + statically linked application, when only some functions are used. This is + relevant even without the DFA addition now that patterns can be compiled in + one application and matched in another. + + The downside of splitting up is that there have to be some external + functions and data tables that are used internally in different modules of + the library but which are not part of the API. These have all had their + names changed to start with "_pcre_" so that they are unlikely to clash + with other external names. + + 4. Added an alternate matching function, pcre_dfa_exec(), which matches using + a different (DFA) algorithm. Although it is slower than the original + function, it does have some advantages for certain types of matching + problem. + + 5. Upgrades to pcretest in order to test the features of pcre_dfa_exec(), + including restarting after a partial match. + + 6. A patch for pcregrep that defines INVALID_FILE_ATTRIBUTES if it is not + defined when compiling for Windows was sent to me. I have put it into the + code, though I have no means of testing or verifying it. + + 7. Added the pcre_refcount() auxiliary function. + + 8. Added the PCRE_FIRSTLINE option. This constrains an unanchored pattern to + match before or at the first newline in the subject string. In pcretest, + the /f option on a pattern can be used to set this. + + 9. A repeated \w when used in UTF-8 mode with characters greater than 256 + would behave wrongly. This has been present in PCRE since release 4.0. + +10. A number of changes to the pcregrep command: + + (a) Refactored how -x works; insert ^(...)$ instead of setting + PCRE_ANCHORED and checking the length, in preparation for adding + something similar for -w. + + (b) Added the -w (match as a word) option. + + (c) Refactored the way lines are read and buffered so as to have more + than one at a time available. + + (d) Implemented a pcregrep test script. + + (e) Added the -M (multiline match) option. This allows patterns to match + over several lines of the subject. The buffering ensures that at least + 8K, or the rest of the document (whichever is the shorter) is available + for matching (and similarly the previous 8K for lookbehind assertions). + + (f) Changed the --help output so that it now says + + -w, --word-regex(p) + + instead of two lines, one with "regex" and the other with "regexp" + because that confused at least one person since the short forms are the + same. (This required a bit of code, as the output is generated + automatically from a table. It wasn't just a text change.) + + (g) -- can be used to terminate pcregrep options if the next thing isn't an + option but starts with a hyphen. Could be a pattern or a path name + starting with a hyphen, for instance. + + (h) "-" can be given as a file name to represent stdin. + + (i) When file names are being printed, "(standard input)" is used for + the standard input, for compatibility with GNU grep. Previously + "" was used. + + (j) The option --label=xxx can be used to supply a name to be used for + stdin when file names are being printed. There is no short form. + + (k) Re-factored the options decoding logic because we are going to add + two more options that take data. Such options can now be given in four + different ways, e.g. "-fname", "-f name", "--file=name", "--file name". + + (l) Added the -A, -B, and -C options for requesting that lines of context + around matches be printed. + + (m) Added the -L option to print the names of files that do not contain + any matching lines, that is, the complement of -l. + + (n) The return code is 2 if any file cannot be opened, but pcregrep does + continue to scan other files. + + (o) The -s option was incorrectly implemented. For compatibility with other + greps, it now suppresses the error message for a non-existent or non- + accessible file (but not the return code). There is a new option called + -q that suppresses the output of matching lines, which was what -s was + previously doing. + + (p) Added --include and --exclude options to specify files for inclusion + and exclusion when recursing. + +11. The Makefile was not using the Autoconf-supported LDFLAGS macro properly. + Hopefully, it now does. + +12. Missing cast in pcre_study(). + +13. Added an "uninstall" target to the makefile. + +14. Replaced "extern" in the function prototypes in Makefile.in with + "PCRE_DATA_SCOPE", which defaults to 'extern' or 'extern "C"' in the Unix + world, but is set differently for Windows. + +15. Added a second compiling function called pcre_compile2(). The only + difference is that it has an extra argument, which is a pointer to an + integer error code. When there is a compile-time failure, this is set + non-zero, in addition to the error test pointer being set to point to an + error message. The new argument may be NULL if no error number is required + (but then you may as well call pcre_compile(), which is now just a + wrapper). This facility is provided because some applications need a + numeric error indication, but it has also enabled me to tidy up the way + compile-time errors are handled in the POSIX wrapper. + +16. Added VPATH=.libs to the makefile; this should help when building with one + prefix path and installing with another. (Or so I'm told by someone who + knows more about this stuff than I do.) + +17. Added a new option, REG_DOTALL, to the POSIX function regcomp(). This + passes PCRE_DOTALL to the pcre_compile() function, making the "." character + match everything, including newlines. This is not POSIX-compatible, but + somebody wanted the feature. From pcretest it can be activated by using + both the P and the s flags. + +18. AC_PROG_LIBTOOL appeared twice in Makefile.in. Removed one. + +19. libpcre.pc was being incorrectly installed as executable. + +20. A couple of places in pcretest check for end-of-line by looking for '\n'; + it now also looks for '\r' so that it will work unmodified on Windows. + +21. Added Google's contributed C++ wrapper to the distribution. + +22. Added some untidy missing memory free() calls in pcretest, to keep + Electric Fence happy when testing. + + + +Version 5.0 13-Sep-04 +--------------------- + + 1. Internal change: literal characters are no longer packed up into items + containing multiple characters in a single byte-string. Each character + is now matched using a separate opcode. However, there may be more than one + byte in the character in UTF-8 mode. + + 2. The pcre_callout_block structure has two new fields: pattern_position and + next_item_length. These contain the offset in the pattern to the next match + item, and its length, respectively. + + 3. The PCRE_AUTO_CALLOUT option for pcre_compile() requests the automatic + insertion of callouts before each pattern item. Added the /C option to + pcretest to make use of this. + + 4. On the advice of a Windows user, the lines + + #if defined(_WIN32) || defined(WIN32) + _setmode( _fileno( stdout ), 0x8000 ); + #endif /* defined(_WIN32) || defined(WIN32) */ + + have been added to the source of pcretest. This apparently does useful + magic in relation to line terminators. + + 5. Changed "r" and "w" in the calls to fopen() in pcretest to "rb" and "wb" + for the benefit of those environments where the "b" makes a difference. + + 6. The icc compiler has the same options as gcc, but "configure" doesn't seem + to know about it. I have put a hack into configure.in that adds in code + to set GCC=yes if CC=icc. This seems to end up at a point in the + generated configure script that is early enough to affect the setting of + compiler options, which is what is needed, but I have no means of testing + whether it really works. (The user who reported this had patched the + generated configure script, which of course I cannot do.) + + LATER: After change 22 below (new libtool files), the configure script + seems to know about icc (and also ecc). Therefore, I have commented out + this hack in configure.in. + + 7. Added support for pkg-config (2 patches were sent in). + + 8. Negated POSIX character classes that used a combination of internal tables + were completely broken. These were [[:^alpha:]], [[:^alnum:]], and + [[:^ascii]]. Typically, they would match almost any characters. The other + POSIX classes were not broken in this way. + + 9. Matching the pattern "\b.*?" against "ab cd", starting at offset 1, failed + to find the match, as PCRE was deluded into thinking that the match had to + start at the start point or following a newline. The same bug applied to + patterns with negative forward assertions or any backward assertions + preceding ".*" at the start, unless the pattern required a fixed first + character. This was a failing pattern: "(?!.bcd).*". The bug is now fixed. + +10. In UTF-8 mode, when moving forwards in the subject after a failed match + starting at the last subject character, bytes beyond the end of the subject + string were read. + +11. Renamed the variable "class" as "classbits" to make life easier for C++ + users. (Previously there was a macro definition, but it apparently wasn't + enough.) + +12. Added the new field "tables" to the extra data so that tables can be passed + in at exec time, or the internal tables can be re-selected. This allows + a compiled regex to be saved and re-used at a later time by a different + program that might have everything at different addresses. + +13. Modified the pcre-config script so that, when run on Solaris, it shows a + -R library as well as a -L library. + +14. The debugging options of pcretest (-d on the command line or D on a + pattern) showed incorrect output for anything following an extended class + that contained multibyte characters and which was followed by a quantifier. + +15. Added optional support for general category Unicode character properties + via the \p, \P, and \X escapes. Unicode property support implies UTF-8 + support. It adds about 90K to the size of the library. The meanings of the + inbuilt class escapes such as \d and \s have NOT been changed. + +16. Updated pcredemo.c to include calls to free() to release the memory for the + compiled pattern. + +17. The generated file chartables.c was being created in the source directory + instead of in the building directory. This caused the build to fail if the + source directory was different from the building directory, and was + read-only. + +18. Added some sample Win commands from Mark Tetrode into the NON-UNIX-USE + file. No doubt somebody will tell me if they don't make sense... Also added + Dan Mooney's comments about building on OpenVMS. + +19. Added support for partial matching via the PCRE_PARTIAL option for + pcre_exec() and the \P data escape in pcretest. + +20. Extended pcretest with 3 new pattern features: + + (i) A pattern option of the form ">rest-of-line" causes pcretest to + write the compiled pattern to the file whose name is "rest-of-line". + This is a straight binary dump of the data, with the saved pointer to + the character tables forced to be NULL. The study data, if any, is + written too. After writing, pcretest reads a new pattern. + + (ii) If, instead of a pattern, ": new target + : new target + : use native compiler + : use native linker + : handle Windows platform correctly + : ditto + : ditto + copy DLL to top builddir before testing + + As part of these changes, -no-undefined was removed again. This was reported + to give trouble on HP-UX 11.0, so getting rid of it seems like a good idea + in any case. + +3. Some tidies to get rid of compiler warnings: + + . In the match_data structure, match_limit was an unsigned long int, whereas + match_call_count was an int. I've made them both unsigned long ints. + + . In pcretest the fact that a const uschar * doesn't automatically cast to + a void * provoked a warning. + + . Turning on some more compiler warnings threw up some "shadow" variables + and a few more missing casts. + +4. If PCRE was complied with UTF-8 support, but called without the PCRE_UTF8 + option, a class that contained a single character with a value between 128 + and 255 (e.g. /[\xFF]/) caused PCRE to crash. + +5. If PCRE was compiled with UTF-8 support, but called without the PCRE_UTF8 + option, a class that contained several characters, but with at least one + whose value was between 128 and 255 caused PCRE to crash. + + +Version 4.1 12-Mar-03 +--------------------- + +1. Compiling with gcc -pedantic found a couple of places where casts were +needed, and a string in dftables.c that was longer than standard compilers are +required to support. + +2. Compiling with Sun's compiler found a few more places where the code could +be tidied up in order to avoid warnings. + +3. The variables for cross-compiling were called HOST_CC and HOST_CFLAGS; the +first of these names is deprecated in the latest Autoconf in favour of the name +CC_FOR_BUILD, because "host" is typically used to mean the system on which the +compiled code will be run. I can't find a reference for HOST_CFLAGS, but by +analogy I have changed it to CFLAGS_FOR_BUILD. + +4. Added -no-undefined to the linking command in the Makefile, because this is +apparently helpful for Windows. To make it work, also added "-L. -lpcre" to the +linking step for the pcreposix library. + +5. PCRE was failing to diagnose the case of two named groups with the same +name. + +6. A problem with one of PCRE's optimizations was discovered. PCRE remembers a +literal character that is needed in the subject for a match, and scans along to +ensure that it is present before embarking on the full matching process. This +saves time in cases of nested unlimited repeats that are never going to match. +Problem: the scan can take a lot of time if the subject is very long (e.g. +megabytes), thus penalizing straightforward matches. It is now done only if the +amount of subject to be scanned is less than 1000 bytes. + +7. A lesser problem with the same optimization is that it was recording the +first character of an anchored pattern as "needed", thus provoking a search +right along the subject, even when the first match of the pattern was going to +fail. The "needed" character is now not set for anchored patterns, unless it +follows something in the pattern that is of non-fixed length. Thus, it still +fulfils its original purpose of finding quick non-matches in cases of nested +unlimited repeats, but isn't used for simple anchored patterns such as /^abc/. + + +Version 4.0 17-Feb-03 +--------------------- + +1. If a comment in an extended regex that started immediately after a meta-item +extended to the end of string, PCRE compiled incorrect data. This could lead to +all kinds of weird effects. Example: /#/ was bad; /()#/ was bad; /a#/ was not. + +2. Moved to autoconf 2.53 and libtool 1.4.2. + +3. Perl 5.8 no longer needs "use utf8" for doing UTF-8 things. Consequently, +the special perltest8 script is no longer needed - all the tests can be run +from a single perltest script. + +4. From 5.004, Perl has not included the VT character (0x0b) in the set defined +by \s. It has now been removed in PCRE. This means it isn't recognized as +whitespace in /x regexes too, which is the same as Perl. Note that the POSIX +class [:space:] *does* include VT, thereby creating a mess. + +5. Added the class [:blank:] (a GNU extension from Perl 5.8) to match only +space and tab. + +6. Perl 5.005 was a long time ago. It's time to amalgamate the tests that use +its new features into the main test script, reducing the number of scripts. + +7. Perl 5.8 has changed the meaning of patterns like /a(?i)b/. Earlier versions +were backward compatible, and made the (?i) apply to the whole pattern, as if +/i were given. Now it behaves more logically, and applies the option setting +only to what follows. PCRE has been changed to follow suit. However, if it +finds options settings right at the start of the pattern, it extracts them into +the global options, as before. Thus, they show up in the info data. + +8. Added support for the \Q...\E escape sequence. Characters in between are +treated as literals. This is slightly different from Perl in that $ and @ are +also handled as literals inside the quotes. In Perl, they will cause variable +interpolation. Note the following examples: + + Pattern PCRE matches Perl matches + + \Qabc$xyz\E abc$xyz abc followed by the contents of $xyz + \Qabc\$xyz\E abc\$xyz abc\$xyz + \Qabc\E\$\Qxyz\E abc$xyz abc$xyz + +For compatibility with Perl, \Q...\E sequences are recognized inside character +classes as well as outside them. + +9. Re-organized 3 code statements in pcretest to avoid "overflow in +floating-point constant arithmetic" warnings from a Microsoft compiler. Added a +(size_t) cast to one statement in pcretest and one in pcreposix to avoid +signed/unsigned warnings. + +10. SunOS4 doesn't have strtoul(). This was used only for unpicking the -o +option for pcretest, so I've replaced it by a simple function that does just +that job. + +11. pcregrep was ending with code 0 instead of 2 for the commands "pcregrep" or +"pcregrep -". + +12. Added "possessive quantifiers" ?+, *+, ++, and {,}+ which come from Sun's +Java package. This provides some syntactic sugar for simple cases of what my +documentation calls "once-only subpatterns". A pattern such as x*+ is the same +as (?>x*). In other words, if what is inside (?>...) is just a single repeated +item, you can use this simplified notation. Note that only makes sense with +greedy quantifiers. Consequently, the use of the possessive quantifier forces +greediness, whatever the setting of the PCRE_UNGREEDY option. + +13. A change of greediness default within a pattern was not taking effect at +the current level for patterns like /(b+(?U)a+)/. It did apply to parenthesized +subpatterns that followed. Patterns like /b+(?U)a+/ worked because the option +was abstracted outside. + +14. PCRE now supports the \G assertion. It is true when the current matching +position is at the start point of the match. This differs from \A when the +starting offset is non-zero. Used with the /g option of pcretest (or similar +code), it works in the same way as it does for Perl's /g option. If all +alternatives of a regex begin with \G, the expression is anchored to the start +match position, and the "anchored" flag is set in the compiled expression. + +15. Some bugs concerning the handling of certain option changes within patterns +have been fixed. These applied to options other than (?ims). For example, +"a(?x: b c )d" did not match "XabcdY" but did match "Xa b c dY". It should have +been the other way round. Some of this was related to change 7 above. + +16. PCRE now gives errors for /[.x.]/ and /[=x=]/ as unsupported POSIX +features, as Perl does. Previously, PCRE gave the warnings only for /[[.x.]]/ +and /[[=x=]]/. PCRE now also gives an error for /[:name:]/ because it supports +POSIX classes only within a class (e.g. /[[:alpha:]]/). + +17. Added support for Perl's \C escape. This matches one byte, even in UTF8 +mode. Unlike ".", it always matches newline, whatever the setting of +PCRE_DOTALL. However, PCRE does not permit \C to appear in lookbehind +assertions. Perl allows it, but it doesn't (in general) work because it can't +calculate the length of the lookbehind. At least, that's the case for Perl +5.8.0 - I've been told they are going to document that it doesn't work in +future. + +18. Added an error diagnosis for escapes that PCRE does not support: these are +\L, \l, \N, \P, \p, \U, \u, and \X. + +19. Although correctly diagnosing a missing ']' in a character class, PCRE was +reading past the end of the pattern in cases such as /[abcd/. + +20. PCRE was getting more memory than necessary for patterns with classes that +contained both POSIX named classes and other characters, e.g. /[[:space:]abc/. + +21. Added some code, conditional on #ifdef VPCOMPAT, to make life easier for +compiling PCRE for use with Virtual Pascal. + +22. Small fix to the Makefile to make it work properly if the build is done +outside the source tree. + +23. Added a new extension: a condition to go with recursion. If a conditional +subpattern starts with (?(R) the "true" branch is used if recursion has +happened, whereas the "false" branch is used only at the top level. + +24. When there was a very long string of literal characters (over 255 bytes +without UTF support, over 250 bytes with UTF support), the computation of how +much memory was required could be incorrect, leading to segfaults or other +strange effects. + +25. PCRE was incorrectly assuming anchoring (either to start of subject or to +start of line for a non-DOTALL pattern) when a pattern started with (.*) and +there was a subsequent back reference to those brackets. This meant that, for +example, /(.*)\d+\1/ failed to match "abc123bc". Unfortunately, it isn't +possible to check for precisely this case. All we can do is abandon the +optimization if .* occurs inside capturing brackets when there are any back +references whatsoever. (See below for a better fix that came later.) + +26. The handling of the optimization for finding the first character of a +non-anchored pattern, and for finding a character that is required later in the +match were failing in some cases. This didn't break the matching; it just +failed to optimize when it could. The way this is done has been re-implemented. + +27. Fixed typo in error message for invalid (?R item (it said "(?p"). + +28. Added a new feature that provides some of the functionality that Perl +provides with (?{...}). The facility is termed a "callout". The way it is done +in PCRE is for the caller to provide an optional function, by setting +pcre_callout to its entry point. Like pcre_malloc and pcre_free, this is a +global variable. By default it is unset, which disables all calling out. To get +the function called, the regex must include (?C) at appropriate points. This +is, in fact, equivalent to (?C0), and any number <= 255 may be given with (?C). +This provides a means of identifying different callout points. When PCRE +reaches such a point in the regex, if pcre_callout has been set, the external +function is called. It is provided with data in a structure called +pcre_callout_block, which is defined in pcre.h. If the function returns 0, +matching continues; if it returns a non-zero value, the match at the current +point fails. However, backtracking will occur if possible. [This was changed +later and other features added - see item 49 below.] + +29. pcretest is upgraded to test the callout functionality. It provides a +callout function that displays information. By default, it shows the start of +the match and the current position in the text. There are some new data escapes +to vary what happens: + + \C+ in addition, show current contents of captured substrings + \C- do not supply a callout function + \C!n return 1 when callout number n is reached + \C!n!m return 1 when callout number n is reached for the mth time + +30. If pcregrep was called with the -l option and just a single file name, it +output "" if a match was found, instead of the file name. + +31. Improve the efficiency of the POSIX API to PCRE. If the number of capturing +slots is less than POSIX_MALLOC_THRESHOLD, use a block on the stack to pass to +pcre_exec(). This saves a malloc/free per call. The default value of +POSIX_MALLOC_THRESHOLD is 10; it can be changed by --with-posix-malloc-threshold +when configuring. + +32. The default maximum size of a compiled pattern is 64K. There have been a +few cases of people hitting this limit. The code now uses macros to handle the +storing of links as offsets within the compiled pattern. It defaults to 2-byte +links, but this can be changed to 3 or 4 bytes by --with-link-size when +configuring. Tests 2 and 5 work only with 2-byte links because they output +debugging information about compiled patterns. + +33. Internal code re-arrangements: + +(a) Moved the debugging function for printing out a compiled regex into + its own source file (printint.c) and used #include to pull it into + pcretest.c and, when DEBUG is defined, into pcre.c, instead of having two + separate copies. + +(b) Defined the list of op-code names for debugging as a macro in + internal.h so that it is next to the definition of the opcodes. + +(c) Defined a table of op-code lengths for simpler skipping along compiled + code. This is again a macro in internal.h so that it is next to the + definition of the opcodes. + +34. Added support for recursive calls to individual subpatterns, along the +lines of Robin Houston's patch (but implemented somewhat differently). + +35. Further mods to the Makefile to help Win32. Also, added code to pcregrep to +allow it to read and process whole directories in Win32. This code was +contributed by Lionel Fourquaux; it has not been tested by me. + +36. Added support for named subpatterns. The Python syntax (?P...) is +used to name a group. Names consist of alphanumerics and underscores, and must +be unique. Back references use the syntax (?P=name) and recursive calls use +(?P>name) which is a PCRE extension to the Python extension. Groups still have +numbers. The function pcre_fullinfo() can be used after compilation to extract +a name/number map. There are three relevant calls: + + PCRE_INFO_NAMEENTRYSIZE yields the size of each entry in the map + PCRE_INFO_NAMECOUNT yields the number of entries + PCRE_INFO_NAMETABLE yields a pointer to the map. + +The map is a vector of fixed-size entries. The size of each entry depends on +the length of the longest name used. The first two bytes of each entry are the +group number, most significant byte first. There follows the corresponding +name, zero terminated. The names are in alphabetical order. + +37. Make the maximum literal string in the compiled code 250 for the non-UTF-8 +case instead of 255. Making it the same both with and without UTF-8 support +means that the same test output works with both. + +38. There was a case of malloc(0) in the POSIX testing code in pcretest. Avoid +calling malloc() with a zero argument. + +39. Change 25 above had to resort to a heavy-handed test for the .* anchoring +optimization. I've improved things by keeping a bitmap of backreferences with +numbers 1-31 so that if .* occurs inside capturing brackets that are not in +fact referenced, the optimization can be applied. It is unlikely that a +relevant occurrence of .* (i.e. one which might indicate anchoring or forcing +the match to follow \n) will appear inside brackets with a number greater than +31, but if it does, any back reference > 31 suppresses the optimization. + +40. Added a new compile-time option PCRE_NO_AUTO_CAPTURE. This has the effect +of disabling numbered capturing parentheses. Any opening parenthesis that is +not followed by ? behaves as if it were followed by ?: but named parentheses +can still be used for capturing (and they will acquire numbers in the usual +way). + +41. Redesigned the return codes from the match() function into yes/no/error so +that errors can be passed back from deep inside the nested calls. A malloc +failure while inside a recursive subpattern call now causes the +PCRE_ERROR_NOMEMORY return instead of quietly going wrong. + +42. It is now possible to set a limit on the number of times the match() +function is called in a call to pcre_exec(). This facility makes it possible to +limit the amount of recursion and backtracking, though not in a directly +obvious way, because the match() function is used in a number of different +circumstances. The count starts from zero for each position in the subject +string (for non-anchored patterns). The default limit is, for compatibility, a +large number, namely 10 000 000. You can change this in two ways: + +(a) When configuring PCRE before making, you can use --with-match-limit=n + to set a default value for the compiled library. + +(b) For each call to pcre_exec(), you can pass a pcre_extra block in which + a different value is set. See 45 below. + +If the limit is exceeded, pcre_exec() returns PCRE_ERROR_MATCHLIMIT. + +43. Added a new function pcre_config(int, void *) to enable run-time extraction +of things that can be changed at compile time. The first argument specifies +what is wanted and the second points to where the information is to be placed. +The current list of available information is: + + PCRE_CONFIG_UTF8 + +The output is an integer that is set to one if UTF-8 support is available; +otherwise it is set to zero. + + PCRE_CONFIG_NEWLINE + +The output is an integer that it set to the value of the code that is used for +newline. It is either LF (10) or CR (13). + + PCRE_CONFIG_LINK_SIZE + +The output is an integer that contains the number of bytes used for internal +linkage in compiled expressions. The value is 2, 3, or 4. See item 32 above. + + PCRE_CONFIG_POSIX_MALLOC_THRESHOLD + +The output is an integer that contains the threshold above which the POSIX +interface uses malloc() for output vectors. See item 31 above. + + PCRE_CONFIG_MATCH_LIMIT + +The output is an unsigned integer that contains the default limit of the number +of match() calls in a pcre_exec() execution. See 42 above. + +44. pcretest has been upgraded by the addition of the -C option. This causes it +to extract all the available output from the new pcre_config() function, and to +output it. The program then exits immediately. + +45. A need has arisen to pass over additional data with calls to pcre_exec() in +order to support additional features. One way would have been to define +pcre_exec2() (for example) with extra arguments, but this would not have been +extensible, and would also have required all calls to the original function to +be mapped to the new one. Instead, I have chosen to extend the mechanism that +is used for passing in "extra" data from pcre_study(). + +The pcre_extra structure is now exposed and defined in pcre.h. It currently +contains the following fields: + + flags a bitmap indicating which of the following fields are set + study_data opaque data from pcre_study() + match_limit a way of specifying a limit on match() calls for a specific + call to pcre_exec() + callout_data data for callouts (see 49 below) + +The flag bits are also defined in pcre.h, and are + + PCRE_EXTRA_STUDY_DATA + PCRE_EXTRA_MATCH_LIMIT + PCRE_EXTRA_CALLOUT_DATA + +The pcre_study() function now returns one of these new pcre_extra blocks, with +the actual study data pointed to by the study_data field, and the +PCRE_EXTRA_STUDY_DATA flag set. This can be passed directly to pcre_exec() as +before. That is, this change is entirely upwards-compatible and requires no +change to existing code. + +If you want to pass in additional data to pcre_exec(), you can either place it +in a pcre_extra block provided by pcre_study(), or create your own pcre_extra +block. + +46. pcretest has been extended to test the PCRE_EXTRA_MATCH_LIMIT feature. If a +data string contains the escape sequence \M, pcretest calls pcre_exec() several +times with different match limits, until it finds the minimum value needed for +pcre_exec() to complete. The value is then output. This can be instructive; for +most simple matches the number is quite small, but for pathological cases it +gets very large very quickly. + +47. There's a new option for pcre_fullinfo() called PCRE_INFO_STUDYSIZE. It +returns the size of the data block pointed to by the study_data field in a +pcre_extra block, that is, the value that was passed as the argument to +pcre_malloc() when PCRE was getting memory in which to place the information +created by pcre_study(). The fourth argument should point to a size_t variable. +pcretest has been extended so that this information is shown after a successful +pcre_study() call when information about the compiled regex is being displayed. + +48. Cosmetic change to Makefile: there's no need to have / after $(DESTDIR) +because what follows is always an absolute path. (Later: it turns out that this +is more than cosmetic for MinGW, because it doesn't like empty path +components.) + +49. Some changes have been made to the callout feature (see 28 above): + +(i) A callout function now has three choices for what it returns: + + 0 => success, carry on matching + > 0 => failure at this point, but backtrack if possible + < 0 => serious error, return this value from pcre_exec() + + Negative values should normally be chosen from the set of PCRE_ERROR_xxx + values. In particular, returning PCRE_ERROR_NOMATCH forces a standard + "match failed" error. The error number PCRE_ERROR_CALLOUT is reserved for + use by callout functions. It will never be used by PCRE itself. + +(ii) The pcre_extra structure (see 45 above) has a void * field called + callout_data, with corresponding flag bit PCRE_EXTRA_CALLOUT_DATA. The + pcre_callout_block structure has a field of the same name. The contents of + the field passed in the pcre_extra structure are passed to the callout + function in the corresponding field in the callout block. This makes it + easier to use the same callout-containing regex from multiple threads. For + testing, the pcretest program has a new data escape + + \C*n pass the number n (may be negative) as callout_data + + If the callout function in pcretest receives a non-zero value as + callout_data, it returns that value. + +50. Makefile wasn't handling CFLAGS properly when compiling dftables. Also, +there were some redundant $(CFLAGS) in commands that are now specified as +$(LINK), which already includes $(CFLAGS). + +51. Extensions to UTF-8 support are listed below. These all apply when (a) PCRE +has been compiled with UTF-8 support *and* pcre_compile() has been compiled +with the PCRE_UTF8 flag. Patterns that are compiled without that flag assume +one-byte characters throughout. Note that case-insensitive matching applies +only to characters whose values are less than 256. PCRE doesn't support the +notion of cases for higher-valued characters. + +(i) A character class whose characters are all within 0-255 is handled as + a bit map, and the map is inverted for negative classes. Previously, a + character > 255 always failed to match such a class; however it should + match if the class was a negative one (e.g. [^ab]). This has been fixed. + +(ii) A negated character class with a single character < 255 is coded as + "not this character" (OP_NOT). This wasn't working properly when the test + character was multibyte, either singly or repeated. + +(iii) Repeats of multibyte characters are now handled correctly in UTF-8 + mode, for example: \x{100}{2,3}. + +(iv) The character escapes \b, \B, \d, \D, \s, \S, \w, and \W (either + singly or repeated) now correctly test multibyte characters. However, + PCRE doesn't recognize any characters with values greater than 255 as + digits, spaces, or word characters. Such characters always match \D, \S, + and \W, and never match \d, \s, or \w. + +(v) Classes may now contain characters and character ranges with values + greater than 255. For example: [ab\x{100}-\x{400}]. + +(vi) pcregrep now has a --utf-8 option (synonym -u) which makes it call + PCRE in UTF-8 mode. + +52. The info request value PCRE_INFO_FIRSTCHAR has been renamed +PCRE_INFO_FIRSTBYTE because it is a byte value. However, the old name is +retained for backwards compatibility. (Note that LASTLITERAL is also a byte +value.) + +53. The single man page has become too large. I have therefore split it up into +a number of separate man pages. These also give rise to individual HTML pages; +these are now put in a separate directory, and there is an index.html page that +lists them all. Some hyperlinking between the pages has been installed. + +54. Added convenience functions for handling named capturing parentheses. + +55. Unknown escapes inside character classes (e.g. [\M]) and escapes that +aren't interpreted therein (e.g. [\C]) are literals in Perl. This is now also +true in PCRE, except when the PCRE_EXTENDED option is set, in which case they +are faulted. + +56. Introduced HOST_CC and HOST_CFLAGS which can be set in the environment when +calling configure. These values are used when compiling the dftables.c program +which is run to generate the source of the default character tables. They +default to the values of CC and CFLAGS. If you are cross-compiling PCRE, +you will need to set these values. + +57. Updated the building process for Windows DLL, as provided by Fred Cox. + + +Version 3.9 02-Jan-02 +--------------------- + +1. A bit of extraneous text had somehow crept into the pcregrep documentation. + +2. If --disable-static was given, the building process failed when trying to +build pcretest and pcregrep. (For some reason it was using libtool to compile +them, which is not right, as they aren't part of the library.) + + +Version 3.8 18-Dec-01 +--------------------- + +1. The experimental UTF-8 code was completely screwed up. It was packing the +bytes in the wrong order. How dumb can you get? + + +Version 3.7 29-Oct-01 +--------------------- + +1. In updating pcretest to check change 1 of version 3.6, I screwed up. +This caused pcretest, when used on the test data, to segfault. Unfortunately, +this didn't happen under Solaris 8, where I normally test things. + +2. The Makefile had to be changed to make it work on BSD systems, where 'make' +doesn't seem to recognize that ./xxx and xxx are the same file. (This entry +isn't in ChangeLog distributed with 3.7 because I forgot when I hastily made +this fix an hour or so after the initial 3.7 release.) + + +Version 3.6 23-Oct-01 +--------------------- + +1. Crashed with /(sens|respons)e and \1ibility/ and "sense and sensibility" if +offsets passed as NULL with zero offset count. + +2. The config.guess and config.sub files had not been updated when I moved to +the latest autoconf. + + +Version 3.5 15-Aug-01 +--------------------- + +1. Added some missing #if !defined NOPOSIX conditionals in pcretest.c that +had been forgotten. + +2. By using declared but undefined structures, we can avoid using "void" +definitions in pcre.h while keeping the internal definitions of the structures +private. + +3. The distribution is now built using autoconf 2.50 and libtool 1.4. From a +user point of view, this means that both static and shared libraries are built +by default, but this can be individually controlled. More of the work of +handling this static/shared cases is now inside libtool instead of PCRE's make +file. + +4. The pcretest utility is now installed along with pcregrep because it is +useful for users (to test regexs) and by doing this, it automatically gets +relinked by libtool. The documentation has been turned into a man page, so +there are now .1, .txt, and .html versions in /doc. + +5. Upgrades to pcregrep: + (i) Added long-form option names like gnu grep. + (ii) Added --help to list all options with an explanatory phrase. + (iii) Added -r, --recursive to recurse into sub-directories. + (iv) Added -f, --file to read patterns from a file. + +6. pcre_exec() was referring to its "code" argument before testing that +argument for NULL (and giving an error if it was NULL). + +7. Upgraded Makefile.in to allow for compiling in a different directory from +the source directory. + +8. Tiny buglet in pcretest: when pcre_fullinfo() was called to retrieve the +options bits, the pointer it was passed was to an int instead of to an unsigned +long int. This mattered only on 64-bit systems. + +9. Fixed typo (3.4/1) in pcre.h again. Sigh. I had changed pcre.h (which is +generated) instead of pcre.in, which it its source. Also made the same change +in several of the .c files. + +10. A new release of gcc defines printf() as a macro, which broke pcretest +because it had an ifdef in the middle of a string argument for printf(). Fixed +by using separate calls to printf(). + +11. Added --enable-newline-is-cr and --enable-newline-is-lf to the configure +script, to force use of CR or LF instead of \n in the source. On non-Unix +systems, the value can be set in config.h. + +12. The limit of 200 on non-capturing parentheses is a _nesting_ limit, not an +absolute limit. Changed the text of the error message to make this clear, and +likewise updated the man page. + +13. The limit of 99 on the number of capturing subpatterns has been removed. +The new limit is 65535, which I hope will not be a "real" limit. + + +Version 3.4 22-Aug-00 +--------------------- + +1. Fixed typo in pcre.h: unsigned const char * changed to const unsigned char *. + +2. Diagnose condition (?(0) as an error instead of crashing on matching. + + +Version 3.3 01-Aug-00 +--------------------- + +1. If an octal character was given, but the value was greater than \377, it +was not getting masked to the least significant bits, as documented. This could +lead to crashes in some systems. + +2. Perl 5.6 (if not earlier versions) accepts classes like [a-\d] and treats +the hyphen as a literal. PCRE used to give an error; it now behaves like Perl. + +3. Added the functions pcre_free_substring() and pcre_free_substring_list(). +These just pass their arguments on to (pcre_free)(), but they are provided +because some uses of PCRE bind it to non-C systems that can call its functions, +but cannot call free() or pcre_free() directly. + +4. Add "make test" as a synonym for "make check". Corrected some comments in +the Makefile. + +5. Add $(DESTDIR)/ in front of all the paths in the "install" target in the +Makefile. + +6. Changed the name of pgrep to pcregrep, because Solaris has introduced a +command called pgrep for grepping around the active processes. + +7. Added the beginnings of support for UTF-8 character strings. + +8. Arranged for the Makefile to pass over the settings of CC, CFLAGS, and +RANLIB to ./ltconfig so that they are used by libtool. I think these are all +the relevant ones. (AR is not passed because ./ltconfig does its own figuring +out for the ar command.) + + +Version 3.2 12-May-00 +--------------------- + +This is purely a bug fixing release. + +1. If the pattern /((Z)+|A)*/ was matched agained ZABCDEFG it matched Z instead +of ZA. This was just one example of several cases that could provoke this bug, +which was introduced by change 9 of version 2.00. The code for breaking +infinite loops after an iteration that matches an empty string was't working +correctly. + +2. The pcretest program was not imitating Perl correctly for the pattern /a*/g +when matched against abbab (for example). After matching an empty string, it +wasn't forcing anchoring when setting PCRE_NOTEMPTY for the next attempt; this +caused it to match further down the string than it should. + +3. The code contained an inclusion of sys/types.h. It isn't clear why this +was there because it doesn't seem to be needed, and it causes trouble on some +systems, as it is not a Standard C header. It has been removed. + +4. Made 4 silly changes to the source to avoid stupid compiler warnings that +were reported on the Macintosh. The changes were from + + while ((c = *(++ptr)) != 0 && c != '\n'); +to + while ((c = *(++ptr)) != 0 && c != '\n') ; + +Totally extraordinary, but if that's what it takes... + +5. PCRE is being used in one environment where neither memmove() nor bcopy() is +available. Added HAVE_BCOPY and an autoconf test for it; if neither +HAVE_MEMMOVE nor HAVE_BCOPY is set, use a built-in emulation function which +assumes the way PCRE uses memmove() (always moving upwards). + +6. PCRE is being used in one environment where strchr() is not available. There +was only one use in pcre.c, and writing it out to avoid strchr() probably gives +faster code anyway. + + +Version 3.1 09-Feb-00 +--------------------- + +The only change in this release is the fixing of some bugs in Makefile.in for +the "install" target: + +(1) It was failing to install pcreposix.h. + +(2) It was overwriting the pcre.3 man page with the pcreposix.3 man page. + + +Version 3.0 01-Feb-00 +--------------------- + +1. Add support for the /+ modifier to perltest (to output $` like it does in +pcretest). + +2. Add support for the /g modifier to perltest. + +3. Fix pcretest so that it behaves even more like Perl for /g when the pattern +matches null strings. + +4. Fix perltest so that it doesn't do unwanted things when fed an empty +pattern. Perl treats empty patterns specially - it reuses the most recent +pattern, which is not what we want. Replace // by /(?#)/ in order to avoid this +effect. + +5. The POSIX interface was broken in that it was just handing over the POSIX +captured string vector to pcre_exec(), but (since release 2.00) PCRE has +required a bigger vector, with some working space on the end. This means that +the POSIX wrapper now has to get and free some memory, and copy the results. + +6. Added some simple autoconf support, placing the test data and the +documentation in separate directories, re-organizing some of the +information files, and making it build pcre-config (a GNU standard). Also added +libtool support for building PCRE as a shared library, which is now the +default. + +7. Got rid of the leading zero in the definition of PCRE_MINOR because 08 and +09 are not valid octal constants. Single digits will be used for minor values +less than 10. + +8. Defined REG_EXTENDED and REG_NOSUB as zero in the POSIX header, so that +existing programs that set these in the POSIX interface can use PCRE without +modification. + +9. Added a new function, pcre_fullinfo() with an extensible interface. It can +return all that pcre_info() returns, plus additional data. The pcre_info() +function is retained for compatibility, but is considered to be obsolete. + +10. Added experimental recursion feature (?R) to handle one common case that +Perl 5.6 will be able to do with (?p{...}). + +11. Added support for POSIX character classes like [:alpha:], which Perl is +adopting. + + +Version 2.08 31-Aug-99 +---------------------- + +1. When startoffset was not zero and the pattern began with ".*", PCRE was not +trying to match at the startoffset position, but instead was moving forward to +the next newline as if a previous match had failed. + +2. pcretest was not making use of PCRE_NOTEMPTY when repeating for /g and /G, +and could get into a loop if a null string was matched other than at the start +of the subject. + +3. Added definitions of PCRE_MAJOR and PCRE_MINOR to pcre.h so the version can +be distinguished at compile time, and for completeness also added PCRE_DATE. + +5. Added Paul Sokolovsky's minor changes to make it easy to compile a Win32 DLL +in GnuWin32 environments. + + +Version 2.07 29-Jul-99 +---------------------- + +1. The documentation is now supplied in plain text form and HTML as well as in +the form of man page sources. + +2. C++ compilers don't like assigning (void *) values to other pointer types. +In particular this affects malloc(). Although there is no problem in Standard +C, I've put in casts to keep C++ compilers happy. + +3. Typo on pcretest.c; a cast of (unsigned char *) in the POSIX regexec() call +should be (const char *). + +4. If NOPOSIX is defined, pcretest.c compiles without POSIX support. This may +be useful for non-Unix systems who don't want to bother with the POSIX stuff. +However, I haven't made this a standard facility. The documentation doesn't +mention it, and the Makefile doesn't support it. + +5. The Makefile now contains an "install" target, with editable destinations at +the top of the file. The pcretest program is not installed. + +6. pgrep -V now gives the PCRE version number and date. + +7. Fixed bug: a zero repetition after a literal string (e.g. /abcde{0}/) was +causing the entire string to be ignored, instead of just the last character. + +8. If a pattern like /"([^\\"]+|\\.)*"/ is applied in the normal way to a +non-matching string, it can take a very, very long time, even for strings of +quite modest length, because of the nested recursion. PCRE now does better in +some of these cases. It does this by remembering the last required literal +character in the pattern, and pre-searching the subject to ensure it is present +before running the real match. In other words, it applies a heuristic to detect +some types of certain failure quickly, and in the above example, if presented +with a string that has no trailing " it gives "no match" very quickly. + +9. A new runtime option PCRE_NOTEMPTY causes null string matches to be ignored; +other alternatives are tried instead. + + +Version 2.06 09-Jun-99 +---------------------- + +1. Change pcretest's output for amount of store used to show just the code +space, because the remainder (the data block) varies in size between 32-bit and +64-bit systems. + +2. Added an extra argument to pcre_exec() to supply an offset in the subject to +start matching at. This allows lookbehinds to work when searching for multiple +occurrences in a string. + +3. Added additional options to pcretest for testing multiple occurrences: + + /+ outputs the rest of the string that follows a match + /g loops for multiple occurrences, using the new startoffset argument + /G loops for multiple occurrences by passing an incremented pointer + +4. PCRE wasn't doing the "first character" optimization for patterns starting +with \b or \B, though it was doing it for other lookbehind assertions. That is, +it wasn't noticing that a match for a pattern such as /\bxyz/ has to start with +the letter 'x'. On long subject strings, this gives a significant speed-up. + + +Version 2.05 21-Apr-99 +---------------------- + +1. Changed the type of magic_number from int to long int so that it works +properly on 16-bit systems. + +2. Fixed a bug which caused patterns starting with .* not to work correctly +when the subject string contained newline characters. PCRE was assuming +anchoring for such patterns in all cases, which is not correct because .* will +not pass a newline unless PCRE_DOTALL is set. It now assumes anchoring only if +DOTALL is set at top level; otherwise it knows that patterns starting with .* +must be retried after every newline in the subject. + + +Version 2.04 18-Feb-99 +---------------------- + +1. For parenthesized subpatterns with repeats whose minimum was zero, the +computation of the store needed to hold the pattern was incorrect (too large). +If such patterns were nested a few deep, this could multiply and become a real +problem. + +2. Added /M option to pcretest to show the memory requirement of a specific +pattern. Made -m a synonym of -s (which does this globally) for compatibility. + +3. Subpatterns of the form (regex){n,m} (i.e. limited maximum) were being +compiled in such a way that the backtracking after subsequent failure was +pessimal. Something like (a){0,3} was compiled as (a)?(a)?(a)? instead of +((a)((a)(a)?)?)? with disastrous performance if the maximum was of any size. + + +Version 2.03 02-Feb-99 +---------------------- + +1. Fixed typo and small mistake in man page. + +2. Added 4th condition (GPL supersedes if conflict) and created separate +LICENCE file containing the conditions. + +3. Updated pcretest so that patterns such as /abc\/def/ work like they do in +Perl, that is the internal \ allows the delimiter to be included in the +pattern. Locked out the use of \ as a delimiter. If \ immediately follows +the final delimiter, add \ to the end of the pattern (to test the error). + +4. Added the convenience functions for extracting substrings after a successful +match. Updated pcretest to make it able to test these functions. + + +Version 2.02 14-Jan-99 +---------------------- + +1. Initialized the working variables associated with each extraction so that +their saving and restoring doesn't refer to uninitialized store. + +2. Put dummy code into study.c in order to trick the optimizer of the IBM C +compiler for OS/2 into generating correct code. Apparently IBM isn't going to +fix the problem. + +3. Pcretest: the timing code wasn't using LOOPREPEAT for timing execution +calls, and wasn't printing the correct value for compiling calls. Increased the +default value of LOOPREPEAT, and the number of significant figures in the +times. + +4. Changed "/bin/rm" in the Makefile to "-rm" so it works on Windows NT. + +5. Renamed "deftables" as "dftables" to get it down to 8 characters, to avoid +a building problem on Windows NT with a FAT file system. + + +Version 2.01 21-Oct-98 +---------------------- + +1. Changed the API for pcre_compile() to allow for the provision of a pointer +to character tables built by pcre_maketables() in the current locale. If NULL +is passed, the default tables are used. + + +Version 2.00 24-Sep-98 +---------------------- + +1. Since the (>?) facility is in Perl 5.005, don't require PCRE_EXTRA to enable +it any more. + +2. Allow quantification of (?>) groups, and make it work correctly. + +3. The first character computation wasn't working for (?>) groups. + +4. Correct the implementation of \Z (it is permitted to match on the \n at the +end of the subject) and add 5.005's \z, which really does match only at the +very end of the subject. + +5. Remove the \X "cut" facility; Perl doesn't have it, and (?> is neater. + +6. Remove the ability to specify CASELESS, MULTILINE, DOTALL, and +DOLLAR_END_ONLY at runtime, to make it possible to implement the Perl 5.005 +localized options. All options to pcre_study() were also removed. + +7. Add other new features from 5.005: + + $(?<= positive lookbehind + $(?a*))*/ (a PCRE_EXTRA facility). + + +Version 1.00 18-Nov-97 +---------------------- + +1. Added compile-time macros to support systems such as SunOS4 which don't have +memmove() or strerror() but have other things that can be used instead. + +2. Arranged that "make clean" removes the executables. + + +Version 0.99 27-Oct-97 +---------------------- + +1. Fixed bug in code for optimizing classes with only one character. It was +initializing a 32-byte map regardless, which could cause it to run off the end +of the memory it had got. + +2. Added, conditional on PCRE_EXTRA, the proposed (?>REGEX) construction. + + +Version 0.98 22-Oct-97 +---------------------- + +1. Fixed bug in code for handling temporary memory usage when there are more +back references than supplied space in the ovector. This could cause segfaults. + + +Version 0.97 21-Oct-97 +---------------------- + +1. Added the \X "cut" facility, conditional on PCRE_EXTRA. + +2. Optimized negated single characters not to use a bit map. + +3. Brought error texts together as macro definitions; clarified some of them; +fixed one that was wrong - it said "range out of order" when it meant "invalid +escape sequence". + +4. Changed some char * arguments to const char *. + +5. Added PCRE_NOTBOL and PCRE_NOTEOL (from POSIX). + +6. Added the POSIX-style API wrapper in pcreposix.a and testing facilities in +pcretest. + + +Version 0.96 16-Oct-97 +---------------------- + +1. Added a simple "pgrep" utility to the distribution. + +2. Fixed an incompatibility with Perl: "{" is now treated as a normal character +unless it appears in one of the precise forms "{ddd}", "{ddd,}", or "{ddd,ddd}" +where "ddd" means "one or more decimal digits". + +3. Fixed serious bug. If a pattern had a back reference, but the call to +pcre_exec() didn't supply a large enough ovector to record the related +identifying subpattern, the match always failed. PCRE now remembers the number +of the largest back reference, and gets some temporary memory in which to save +the offsets during matching if necessary, in order to ensure that +backreferences always work. + +4. Increased the compatibility with Perl in a number of ways: + + (a) . no longer matches \n by default; an option PCRE_DOTALL is provided + to request this handling. The option can be set at compile or exec time. + + (b) $ matches before a terminating newline by default; an option + PCRE_DOLLAR_ENDONLY is provided to override this (but not in multiline + mode). The option can be set at compile or exec time. + + (c) The handling of \ followed by a digit other than 0 is now supposed to be + the same as Perl's. If the decimal number it represents is less than 10 + or there aren't that many previous left capturing parentheses, an octal + escape is read. Inside a character class, it's always an octal escape, + even if it is a single digit. + + (d) An escaped but undefined alphabetic character is taken as a literal, + unless PCRE_EXTRA is set. Currently this just reserves the remaining + escapes. + + (e) {0} is now permitted. (The previous item is removed from the compiled + pattern). + +5. Changed all the names of code files so that the basic parts are no longer +than 10 characters, and abolished the teeny "globals.c" file. + +6. Changed the handling of character classes; they are now done with a 32-byte +bit map always. + +7. Added the -d and /D options to pcretest to make it possible to look at the +internals of compilation without having to recompile pcre. + + +Version 0.95 23-Sep-97 +---------------------- + +1. Fixed bug in pre-pass concerning escaped "normal" characters such as \x5c or +\x20 at the start of a run of normal characters. These were being treated as +real characters, instead of the source characters being re-checked. + + +Version 0.94 18-Sep-97 +---------------------- + +1. The functions are now thread-safe, with the caveat that the global variables +containing pointers to malloc() and free() or alternative functions are the +same for all threads. + +2. Get pcre_study() to generate a bitmap of initial characters for non- +anchored patterns when this is possible, and use it if passed to pcre_exec(). + + +Version 0.93 15-Sep-97 +---------------------- + +1. /(b)|(:+)/ was computing an incorrect first character. + +2. Add pcre_study() to the API and the passing of pcre_extra to pcre_exec(), +but not actually doing anything yet. + +3. Treat "-" characters in classes that cannot be part of ranges as literals, +as Perl does (e.g. [-az] or [az-]). + +4. Set the anchored flag if a branch starts with .* or .*? because that tests +all possible positions. + +5. Split up into different modules to avoid including unneeded functions in a +compiled binary. However, compile and exec are still in one module. The "study" +function is split off. + +6. The character tables are now in a separate module whose source is generated +by an auxiliary program - but can then be edited by hand if required. There are +now no calls to isalnum(), isspace(), isdigit(), isxdigit(), tolower() or +toupper() in the code. + +7. Turn the malloc/free funtions variables into pcre_malloc and pcre_free and +make them global. Abolish the function for setting them, as the caller can now +set them directly. + + +Version 0.92 11-Sep-97 +---------------------- + +1. A repeat with a fixed maximum and a minimum of 1 for an ordinary character +(e.g. /a{1,3}/) was broken (I mis-optimized it). + +2. Caseless matching was not working in character classes if the characters in +the pattern were in upper case. + +3. Make ranges like [W-c] work in the same way as Perl for caseless matching. + +4. Make PCRE_ANCHORED public and accept as a compile option. + +5. Add an options word to pcre_exec() and accept PCRE_ANCHORED and +PCRE_CASELESS at run time. Add escapes \A and \I to pcretest to cause it to +pass them. + +6. Give an error if bad option bits passed at compile or run time. + +7. Add PCRE_MULTILINE at compile and exec time, and (?m) as well. Add \M to +pcretest to cause it to pass that flag. + +8. Add pcre_info(), to get the number of identifying subpatterns, the stored +options, and the first character, if set. + +9. Recognize C+ or C{n,m} where n >= 1 as providing a fixed starting character. + + +Version 0.91 10-Sep-97 +---------------------- + +1. PCRE was failing to diagnose unlimited repeats of subpatterns that could +match the empty string as in /(a*)*/. It was looping and ultimately crashing. + +2. PCRE was looping on encountering an indefinitely repeated back reference to +a subpattern that had matched an empty string, e.g. /(a|)\1*/. It now does what +Perl does - treats the match as successful. + +**** diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/CheckMan b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/CheckMan new file mode 100755 index 000000000..480d73548 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/CheckMan @@ -0,0 +1,67 @@ +#! /usr/bin/perl + +# A script to scan PCRE's man pages to check for typos in the control +# sequences. I use only a small set of the available repertoire, so it is +# straightforward to check that nothing else has slipped in by mistake. This +# script should be called in the doc directory. + +$yield = 0; + +while (scalar(@ARGV) > 0) + { + $line = 0; + $file = shift @ARGV; + + open (IN, $file) || die "Failed to open $file\n"; + + while () + { + $line++; + if (/^\s*$/) + { + printf "Empty line $line of $file\n"; + $yield = 1; + } + elsif (/^\./) + { + if (!/^\.\s*$| + ^\.B\s+\S| + ^\.TH\s\S| + ^\.SH\s\S| + ^\.SS\s\S| + ^\.TP(?:\s?\d+)?\s*$| + ^\.SM\s*$| + ^\.br\s*$| + ^\.rs\s*$| + ^\.sp\s*$| + ^\.nf\s*$| + ^\.fi\s*$| + ^\.P\s*$| + ^\.PP\s*$| + ^\.\\"(?:\ HREF)?\s*$| + ^\.\\"\sHTML\s\s*$| + ^\.\\"\sHTML\s<\/a>\s*$| + ^\.\\"\s<\/a>\s*$| + ^\.\\"\sJOINSH\s*$| + ^\.\\"\sJOIN\s*$/x + ) + { + printf "Bad control line $line of $file\n"; + $yield = 1; + } + } + else + { + if (/\\[^ef]|\\f[^IBP]/) + { + printf "Bad backslash in line $line of $file\n"; + $yield = 1; + } + } + } + + close(IN); + } + +exit $yield; +# End diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/CleanTxt b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/CleanTxt new file mode 100755 index 000000000..1f42519c8 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/CleanTxt @@ -0,0 +1,113 @@ +#! /usr/bin/perl -w + +# Script to take the output of nroff -man and remove all the backspacing and +# the page footers and the screen commands etc so that it is more usefully +# readable online. In fact, in the latest nroff, intermediate footers don't +# seem to be generated any more. + +$blankcount = 0; +$lastwascut = 0; +$firstheader = 1; + +# Input on STDIN; output to STDOUT. + +while () + { + s/\x1b\[\d+m//g; # Remove screen controls "ESC [ number m" + s/.\x8//g; # Remove "char, backspace" + + # Handle header lines. Retain only the first one we encounter, but remove + # the blank line that follows. Any others (e.g. at end of document) and the + # following blank line are dropped. + + if (/^PCRE(\w*)\(([13])\)\s+PCRE\1\(\2\)$/) + { + if ($firstheader) + { + $firstheader = 0; + print; + $lastprinted = $_; + $lastwascut = 0; + } + $_=; # Remove a blank that follows + next; + } + + # Count runs of empty lines + + if (/^\s*$/) + { + $blankcount++; + $lastwascut = 0; + next; + } + + # If a chunk of lines has been cut out (page footer) and the next line + # has a different indentation, put back one blank line. + + if ($lastwascut && $blankcount < 1 && defined($lastprinted)) + { + ($a) = $lastprinted =~ /^(\s*)/; + ($b) = $_ =~ /^(\s*)/; + $blankcount++ if ($a ne $b); + } + + # We get here only when we have a non-blank line in hand. If it was preceded + # by 3 or more blank lines, read the next 3 lines and see if they are blank. + # If so, remove all 7 lines, and remember that we have just done a cut. + + if ($blankcount >= 3) + { + for ($i = 0; $i < 3; $i++) + { + $next[$i] = ; + $next[$i] = "" if !defined $next[$i]; + $next[$i] =~ s/\x1b\[\d+m//g; # Remove screen controls "ESC [ number m" + $next[$i] =~ s/.\x8//g; # Remove "char, backspace" + } + + # Cut out chunks of the form <3 blanks><3 blanks> + + if ($next[0] =~ /^\s*$/ && + $next[1] =~ /^\s*$/ && + $next[2] =~ /^\s*$/) + { + $blankcount -= 3; + $lastwascut = 1; + } + + # Otherwise output the saved blanks, the current, and the next three + # lines. Remember the last printed line. + + else + { + for ($i = 0; $i < $blankcount; $i++) { print "\n"; } + print; + for ($i = 0; $i < 3; $i++) + { + $next[$i] =~ s/.\x8//g; + print $next[$i]; + $lastprinted = $_; + } + $lastwascut = 0; + $blankcount = 0; + } + } + + # This non-blank line is not preceded by 3 or more blank lines. Output + # any blanks there are, and the line. Remember it. Force two blank lines + # before headings. + + else + { + $blankcount = 2 if /^\S/ && !/^Last updated/ && !/^Copyright/ && + defined($lastprinted); + for ($i = 0; $i < $blankcount; $i++) { print "\n"; } + print; + $lastprinted = $_; + $lastwascut = 0; + $blankcount = 0; + } + } + +# End diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/Detrail b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/Detrail new file mode 100755 index 000000000..1c5c7e9ca --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/Detrail @@ -0,0 +1,35 @@ +#!/usr/bin/perl + +# This is a script for removing trailing whitespace from lines in files that +# are listed on the command line. + +# This subroutine does the work for one file. + +sub detrail { +my($file) = $_[0]; +my($changed) = 0; +open(IN, "$file") || die "Can't open $file for input"; +@lines = ; +close(IN); +foreach (@lines) + { + if (/\s+\n$/) + { + s/\s+\n$/\n/; + $changed = 1; + } + } +if ($changed) + { + open(OUT, ">$file") || die "Can't open $file for output"; + print OUT @lines; + close(OUT); + } +} + +# This is the main program + +$, = ""; # Output field separator +for ($i = 0; $i < @ARGV; $i++) { &detrail($ARGV[$i]); } + +# End diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/HACKING b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/HACKING new file mode 100755 index 000000000..691b7a14e --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/HACKING @@ -0,0 +1,528 @@ +Technical Notes about PCRE +-------------------------- + +These are very rough technical notes that record potentially useful information +about PCRE internals. For information about testing PCRE, see the pcretest +documentation and the comment at the head of the RunTest file. + + +Historical note 1 +----------------- + +Many years ago I implemented some regular expression functions to an algorithm +suggested by Martin Richards. These were not Unix-like in form, and were quite +restricted in what they could do by comparison with Perl. The interesting part +about the algorithm was that the amount of space required to hold the compiled +form of an expression was known in advance. The code to apply an expression did +not operate by backtracking, as the original Henry Spencer code and current +Perl code does, but instead checked all possibilities simultaneously by keeping +a list of current states and checking all of them as it advanced through the +subject string. In the terminology of Jeffrey Friedl's book, it was a "DFA +algorithm", though it was not a traditional Finite State Machine (FSM). When +the pattern was all used up, all remaining states were possible matches, and +the one matching the longest subset of the subject string was chosen. This did +not necessarily maximize the individual wild portions of the pattern, as is +expected in Unix and Perl-style regular expressions. + + +Historical note 2 +----------------- + +By contrast, the code originally written by Henry Spencer (which was +subsequently heavily modified for Perl) compiles the expression twice: once in +a dummy mode in order to find out how much store will be needed, and then for +real. (The Perl version probably doesn't do this any more; I'm talking about +the original library.) The execution function operates by backtracking and +maximizing (or, optionally, minimizing in Perl) the amount of the subject that +matches individual wild portions of the pattern. This is an "NFA algorithm" in +Friedl's terminology. + + +OK, here's the real stuff +------------------------- + +For the set of functions that form the "basic" PCRE library (which are +unrelated to those mentioned above), I tried at first to invent an algorithm +that used an amount of store bounded by a multiple of the number of characters +in the pattern, to save on compiling time. However, because of the greater +complexity in Perl regular expressions, I couldn't do this. In any case, a +first pass through the pattern is helpful for other reasons. + + +Support for 16-bit and 32-bit data strings +------------------------------------------- + +From release 8.30, PCRE supports 16-bit as well as 8-bit data strings; and from +release 8.32, PCRE supports 32-bit data strings. The library can be compiled +in any combination of 8-bit, 16-bit or 32-bit modes, creating up to three +different libraries. In the description that follows, the word "short" is used +for a 16-bit data quantity, and the word "unit" is used for a quantity that is +a byte in 8-bit mode, a short in 16-bit mode and a 32-bit word in 32-bit mode. +However, so as not to over-complicate the text, the names of PCRE functions are +given in 8-bit form only. + + +Computing the memory requirement: how it was +-------------------------------------------- + +Up to and including release 6.7, PCRE worked by running a very degenerate first +pass to calculate a maximum store size, and then a second pass to do the real +compile - which might use a bit less than the predicted amount of memory. The +idea was that this would turn out faster than the Henry Spencer code because +the first pass is degenerate and the second pass can just store stuff straight +into the vector, which it knows is big enough. + + +Computing the memory requirement: how it is +------------------------------------------- + +By the time I was working on a potential 6.8 release, the degenerate first pass +had become very complicated and hard to maintain. Indeed one of the early +things I did for 6.8 was to fix Yet Another Bug in the memory computation. Then +I had a flash of inspiration as to how I could run the real compile function in +a "fake" mode that enables it to compute how much memory it would need, while +actually only ever using a few hundred bytes of working memory, and without too +many tests of the mode that might slow it down. So I refactored the compiling +functions to work this way. This got rid of about 600 lines of source. It +should make future maintenance and development easier. As this was such a major +change, I never released 6.8, instead upping the number to 7.0 (other quite +major changes were also present in the 7.0 release). + +A side effect of this work was that the previous limit of 200 on the nesting +depth of parentheses was removed. However, there is a downside: pcre_compile() +runs more slowly than before (30% or more, depending on the pattern) because it +is doing a full analysis of the pattern. My hope was that this would not be a +big issue, and in the event, nobody has commented on it. + +At release 8.34, a limit on the nesting depth of parentheses was re-introduced +(default 250, settable at build time) so as to put a limit on the amount of +system stack used by pcre_compile(). This is a safety feature for environments +with small stacks where the patterns are provided by users. + + +Traditional matching function +----------------------------- + +The "traditional", and original, matching function is called pcre_exec(), and +it implements an NFA algorithm, similar to the original Henry Spencer algorithm +and the way that Perl works. This is not surprising, since it is intended to be +as compatible with Perl as possible. This is the function most users of PCRE +will use most of the time. From release 8.20, if PCRE is compiled with +just-in-time (JIT) support, and studying a compiled pattern with JIT is +successful, the JIT code is run instead of the normal pcre_exec() code, but the +result is the same. + + +Supplementary matching function +------------------------------- + +From PCRE 6.0, there is also a supplementary matching function called +pcre_dfa_exec(). This implements a DFA matching algorithm that searches +simultaneously for all possible matches that start at one point in the subject +string. (Going back to my roots: see Historical Note 1 above.) This function +intreprets the same compiled pattern data as pcre_exec(); however, not all the +facilities are available, and those that are do not always work in quite the +same way. See the user documentation for details. + +The algorithm that is used for pcre_dfa_exec() is not a traditional FSM, +because it may have a number of states active at one time. More work would be +needed at compile time to produce a traditional FSM where only one state is +ever active at once. I believe some other regex matchers work this way. JIT +support is not available for this kind of matching. + + +Changeable options +------------------ + +The /i, /m, or /s options (PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL, and some +others) may change in the middle of patterns. From PCRE 8.13, their processing +is handled entirely at compile time by generating different opcodes for the +different settings. The runtime functions do not need to keep track of an +options state any more. + + +Format of compiled patterns +--------------------------- + +The compiled form of a pattern is a vector of unsigned units (bytes in 8-bit +mode, shorts in 16-bit mode, 32-bit words in 32-bit mode), containing items of +variable length. The first unit in an item contains an opcode, and the length +of the item is either implicit in the opcode or contained in the data that +follows it. + +In many cases listed below, LINK_SIZE data values are specified for offsets +within the compiled pattern. LINK_SIZE always specifies a number of bytes. The +default value for LINK_SIZE is 2, but PCRE can be compiled to use 3-byte or +4-byte values for these offsets, although this impairs the performance. (3-byte +LINK_SIZE values are available only in 8-bit mode.) Specifing a LINK_SIZE +larger than 2 is necessary only when patterns whose compiled length is greater +than 64K are going to be processed. In this description, we assume the "normal" +compilation options. Data values that are counts (e.g. quantifiers) are two +bytes long in 8-bit mode (most significant byte first), or one unit in 16-bit +and 32-bit modes. + + +Opcodes with no following data +------------------------------ + +These items are all just one unit long + + OP_END end of pattern + OP_ANY match any one character other than newline + OP_ALLANY match any one character, including newline + OP_ANYBYTE match any single unit, even in UTF-8/16 mode + OP_SOD match start of data: \A + OP_SOM, start of match (subject + offset): \G + OP_SET_SOM, set start of match (\K) + OP_CIRC ^ (start of data) + OP_CIRCM ^ multiline mode (start of data or after newline) + OP_NOT_WORD_BOUNDARY \W + OP_WORD_BOUNDARY \w + OP_NOT_DIGIT \D + OP_DIGIT \d + OP_NOT_HSPACE \H + OP_HSPACE \h + OP_NOT_WHITESPACE \S + OP_WHITESPACE \s + OP_NOT_VSPACE \V + OP_VSPACE \v + OP_NOT_WORDCHAR \W + OP_WORDCHAR \w + OP_EODN match end of data or newline at end: \Z + OP_EOD match end of data: \z + OP_DOLL $ (end of data, or before final newline) + OP_DOLLM $ multiline mode (end of data or before newline) + OP_EXTUNI match an extended Unicode grapheme cluster + OP_ANYNL match any Unicode newline sequence + + OP_ASSERT_ACCEPT ) + OP_ACCEPT ) These are Perl 5.10's "backtracking control + OP_COMMIT ) verbs". If OP_ACCEPT is inside capturing + OP_FAIL ) parentheses, it may be preceded by one or more + OP_PRUNE ) OP_CLOSE, each followed by a count that + OP_SKIP ) indicates which parentheses must be closed. + OP_THEN ) + +OP_ASSERT_ACCEPT is used when (*ACCEPT) is encountered within an assertion. +This ends the assertion, not the entire pattern match. + + +Backtracking control verbs with optional data +--------------------------------------------- + +(*THEN) without an argument generates the opcode OP_THEN and no following data. +OP_MARK is followed by the mark name, preceded by a one-unit length, and +followed by a binary zero. For (*PRUNE), (*SKIP), and (*THEN) with arguments, +the opcodes OP_PRUNE_ARG, OP_SKIP_ARG, and OP_THEN_ARG are used, with the name +following in the same format as OP_MARK. + + +Matching literal characters +--------------------------- + +The OP_CHAR opcode is followed by a single character that is to be matched +casefully. For caseless matching, OP_CHARI is used. In UTF-8 or UTF-16 modes, +the character may be more than one unit long. In UTF-32 mode, characters +are always exactly one unit long. + +If there is only one character in a character class, OP_CHAR or OP_CHARI is +used for a positive class, and OP_NOT or OP_NOTI for a negative one (that is, +for something like [^a]). + + +Repeating single characters +--------------------------- + +The common repeats (*, +, ?), when applied to a single character, use the +following opcodes, which come in caseful and caseless versions: + + Caseful Caseless + OP_STAR OP_STARI + OP_MINSTAR OP_MINSTARI + OP_POSSTAR OP_POSSTARI + OP_PLUS OP_PLUSI + OP_MINPLUS OP_MINPLUSI + OP_POSPLUS OP_POSPLUSI + OP_QUERY OP_QUERYI + OP_MINQUERY OP_MINQUERYI + OP_POSQUERY OP_POSQUERYI + +Each opcode is followed by the character that is to be repeated. In ASCII mode, +these are two-unit items; in UTF-8 or UTF-16 modes, the length is variable; in +UTF-32 mode these are one-unit items. Those with "MIN" in their names are the +minimizing versions. Those with "POS" in their names are possessive versions. +Other repeats make use of these opcodes: + + Caseful Caseless + OP_UPTO OP_UPTOI + OP_MINUPTO OP_MINUPTOI + OP_POSUPTO OP_POSUPTOI + OP_EXACT OP_EXACTI + +Each of these is followed by a count and then the repeated character. OP_UPTO +matches from 0 to the given number. A repeat with a non-zero minimum and a +fixed maximum is coded as an OP_EXACT followed by an OP_UPTO (or OP_MINUPTO or +OPT_POSUPTO). + +Another set of matching repeating opcodes (called OP_NOTSTAR, OP_NOTSTARI, +etc.) are used for repeated, negated, single-character classes such as [^a]*. +The normal single-character opcodes (OP_STAR, etc.) are used for repeated +positive single-character classes. + + +Repeating character types +------------------------- + +Repeats of things like \d are done exactly as for single characters, except +that instead of a character, the opcode for the type is stored in the data +unit. The opcodes are: + + OP_TYPESTAR + OP_TYPEMINSTAR + OP_TYPEPOSSTAR + OP_TYPEPLUS + OP_TYPEMINPLUS + OP_TYPEPOSPLUS + OP_TYPEQUERY + OP_TYPEMINQUERY + OP_TYPEPOSQUERY + OP_TYPEUPTO + OP_TYPEMINUPTO + OP_TYPEPOSUPTO + OP_TYPEEXACT + + +Match by Unicode property +------------------------- + +OP_PROP and OP_NOTPROP are used for positive and negative matches of a +character by testing its Unicode property (the \p and \P escape sequences). +Each is followed by two units that encode the desired property as a type and a +value. The types are a set of #defines of the form PT_xxx, and the values are +enumerations of the form ucp_xx, defined in the ucp.h source file. The value is +relevant only for PT_GC (General Category), PT_PC (Particular Category), and +PT_SC (Script). + +Repeats of these items use the OP_TYPESTAR etc. set of opcodes, followed by +three units: OP_PROP or OP_NOTPROP, and then the desired property type and +value. + + +Character classes +----------------- + +If there is only one character in a class, OP_CHAR or OP_CHARI is used for a +positive class, and OP_NOT or OP_NOTI for a negative one (that is, for +something like [^a]). + +A set of repeating opcodes (called OP_NOTSTAR etc.) are used for repeated, +negated, single-character classes. The normal single-character opcodes +(OP_STAR, etc.) are used for repeated positive single-character classes. + +When there is more than one character in a class, and all the code points are +less than 256, OP_CLASS is used for a positive class, and OP_NCLASS for a +negative one. In either case, the opcode is followed by a 32-byte (16-short, +8-word) bit map containing a 1 bit for every character that is acceptable. The +bits are counted from the least significant end of each unit. In caseless mode, +bits for both cases are set. + +The reason for having both OP_CLASS and OP_NCLASS is so that, in UTF-8/16/32 +mode, subject characters with values greater than 255 can be handled correctly. +For OP_CLASS they do not match, whereas for OP_NCLASS they do. + +For classes containing characters with values greater than 255 or that contain +\p or \P, OP_XCLASS is used. It optionally uses a bit map if any code points +are less than 256, followed by a list of pairs (for a range) and single +characters. In caseless mode, both cases are explicitly listed. + +OP_XCLASS is followed by a unit containing flag bits: XCL_NOT indicates that +this is a negative class, and XCL_MAP indicates that a bit map is present. +There follows the bit map, if XCL_MAP is set, and then a sequence of items +coded as follows: + + XCL_END marks the end of the list + XCL_SINGLE one character follows + XCL_RANGE two characters follow + XCL_PROP a Unicode property (type, value) follows + XCL_NOTPROP a Unicode property (type, value) follows + +If a range starts with a code point less than 256 and ends with one greater +than 256, an XCL_RANGE item is used, without setting any bits in the bit map. +This means that if no other items in the class set bits in the map, a map is +not needed. + + +Back references +--------------- + +OP_REF (caseful) or OP_REFI (caseless) is followed by a count containing the +reference number if the reference is to a unique capturing group (either by +number or by name). When named groups are used, there may be more than one +group with the same name. In this case, a reference by name generates OP_DNREF +or OP_DNREFI. These are followed by two counts: the index (not the byte offset) +in the group name table of the first entry for the requred name, followed by +the number of groups with the same name. + + +Repeating character classes and back references +----------------------------------------------- + +Single-character classes are handled specially (see above). This section +applies to other classes and also to back references. In both cases, the repeat +information follows the base item. The matching code looks at the following +opcode to see if it is one of + + OP_CRSTAR + OP_CRMINSTAR + OP_CRPOSSTAR + OP_CRPLUS + OP_CRMINPLUS + OP_CRPOSPLUS + OP_CRQUERY + OP_CRMINQUERY + OP_CRPOSQUERY + OP_CRRANGE + OP_CRMINRANGE + OP_CRPOSRANGE + +All but the last three are single-unit items, with no data. The others are +followed by the minimum and maximum repeat counts. + + +Brackets and alternation +------------------------ + +A pair of non-capturing round brackets is wrapped round each expression at +compile time, so alternation always happens in the context of brackets. + +[Note for North Americans: "bracket" to some English speakers, including +myself, can be round, square, curly, or pointy. Hence this usage rather than +"parentheses".] + +Non-capturing brackets use the opcode OP_BRA. Originally PCRE was limited to 99 +capturing brackets and it used a different opcode for each one. From release +3.5, the limit was removed by putting the bracket number into the data for +higher-numbered brackets. From release 7.0 all capturing brackets are handled +this way, using the single opcode OP_CBRA. + +A bracket opcode is followed by LINK_SIZE bytes which give the offset to the +next alternative OP_ALT or, if there aren't any branches, to the matching +OP_KET opcode. Each OP_ALT is followed by LINK_SIZE bytes giving the offset to +the next one, or to the OP_KET opcode. For capturing brackets, the bracket +number is a count that immediately follows the offset. + +OP_KET is used for subpatterns that do not repeat indefinitely, and OP_KETRMIN +and OP_KETRMAX are used for indefinite repetitions, minimally or maximally +respectively (see below for possessive repetitions). All three are followed by +LINK_SIZE bytes giving (as a positive number) the offset back to the matching +bracket opcode. + +If a subpattern is quantified such that it is permitted to match zero times, it +is preceded by one of OP_BRAZERO, OP_BRAMINZERO, or OP_SKIPZERO. These are +single-unit opcodes that tell the matcher that skipping the following +subpattern entirely is a valid branch. In the case of the first two, not +skipping the pattern is also valid (greedy and non-greedy). The third is used +when a pattern has the quantifier {0,0}. It cannot be entirely discarded, +because it may be called as a subroutine from elsewhere in the regex. + +A subpattern with an indefinite maximum repetition is replicated in the +compiled data its minimum number of times (or once with OP_BRAZERO if the +minimum is zero), with the final copy terminating with OP_KETRMIN or OP_KETRMAX +as appropriate. + +A subpattern with a bounded maximum repetition is replicated in a nested +fashion up to the maximum number of times, with OP_BRAZERO or OP_BRAMINZERO +before each replication after the minimum, so that, for example, (abc){2,5} is +compiled as (abc)(abc)((abc)((abc)(abc)?)?)?, except that each bracketed group +has the same number. + +When a repeated subpattern has an unbounded upper limit, it is checked to see +whether it could match an empty string. If this is the case, the opcode in the +final replication is changed to OP_SBRA or OP_SCBRA. This tells the matcher +that it needs to check for matching an empty string when it hits OP_KETRMIN or +OP_KETRMAX, and if so, to break the loop. + + +Possessive brackets +------------------- + +When a repeated group (capturing or non-capturing) is marked as possessive by +the "+" notation, e.g. (abc)++, different opcodes are used. Their names all +have POS on the end, e.g. OP_BRAPOS instead of OP_BRA and OP_SCPBRPOS instead +of OP_SCBRA. The end of such a group is marked by OP_KETRPOS. If the minimum +repetition is zero, the group is preceded by OP_BRAPOSZERO. + + +Once-only (atomic) groups +------------------------- + +These are just like other subpatterns, but they start with the opcode +OP_ONCE or OP_ONCE_NC. The former is used when there are no capturing brackets +within the atomic group; the latter when there are. The distinction is needed +for when there is a backtrack to before the group - any captures within the +group must be reset, so it is necessary to retain backtracking points inside +the group even after it is complete in order to do this. When there are no +captures in an atomic group, all the backtracking can be discarded when it is +complete. This is more efficient, and also uses less stack. + +The check for matching an empty string in an unbounded repeat is handled +entirely at runtime, so there are just these two opcodes for atomic groups. + + +Assertions +---------- + +Forward assertions are also just like other subpatterns, but starting with one +of the opcodes OP_ASSERT or OP_ASSERT_NOT. Backward assertions use the opcodes +OP_ASSERTBACK and OP_ASSERTBACK_NOT, and the first opcode inside the assertion +is OP_REVERSE, followed by a count of the number of characters to move back the +pointer in the subject string. In ASCII mode, the count is a number of units, +but in UTF-8/16 mode each character may occupy more than one unit; in UTF-32 +mode each character occupies exactly one unit. A separate count is present in +each alternative of a lookbehind assertion, allowing them to have different +fixed lengths. + + +Conditional subpatterns +----------------------- + +These are like other subpatterns, but they start with the opcode OP_COND, or +OP_SCOND for one that might match an empty string in an unbounded repeat. If +the condition is a back reference, this is stored at the start of the +subpattern using the opcode OP_CREF followed by a count containing the +reference number, provided that the reference is to a unique capturing group. +If the reference was by name and there is more than one group with that name, +OP_DNCREF is used instead. It is followed by two counts: the index in the group +names table, and the number of groups with the same name. + +If the condition is "in recursion" (coded as "(?(R)"), or "in recursion of +group x" (coded as "(?(Rx)"), the group number is stored at the start of the +subpattern using the opcode OP_RREF (with a value of zero for "the whole +pattern") or OP_DNRREF (with data as for OP_DNCREF). For a DEFINE condition, +just the single unit OP_DEF is used (it has no associated data). Otherwise, a +conditional subpattern always starts with one of the assertions. + + +Recursion +--------- + +Recursion either matches the current regex, or some subexpression. The opcode +OP_RECURSE is followed by aLINK_SIZE value that is the offset to the starting +bracket from the start of the whole pattern. From release 6.5, OP_RECURSE is +automatically wrapped inside OP_ONCE brackets, because otherwise some patterns +broke it. OP_RECURSE is also used for "subroutine" calls, even though they are +not strictly a recursion. + + +Callout +------- + +OP_CALLOUT is followed by one unit of data that holds a callout number in the +range 0 to 254 for manual callouts, or 255 for an automatic callout. In both +cases there follows a count giving the offset in the pattern string to the +start of the following item, and another count giving the length of this item. +These values make is possible for pcretest to output useful tracing information +using automatic callouts. + +Philip Hazel +November 2013 diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/INSTALL b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/INSTALL new file mode 100755 index 000000000..8865734f8 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/INSTALL @@ -0,0 +1,368 @@ +Installation Instructions +************************* + + Copyright (C) 1994-1996, 1999-2002, 2004-2016 Free Software +Foundation, Inc. + + Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. This file is offered as-is, +without warranty of any kind. + +Basic Installation +================== + + Briefly, the shell command './configure && make && make install' +should configure, build, and install this package. The following +more-detailed instructions are generic; see the 'README' file for +instructions specific to this package. Some packages provide this +'INSTALL' file but do not implement all of the features documented +below. The lack of an optional feature in a given package is not +necessarily a bug. More recommendations for GNU packages can be found +in *note Makefile Conventions: (standards)Makefile Conventions. + + The 'configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a 'Makefile' in each directory of the package. +It may also create one or more '.h' files containing system-dependent +definitions. Finally, it creates a shell script 'config.status' that +you can run in the future to recreate the current configuration, and a +file 'config.log' containing compiler output (useful mainly for +debugging 'configure'). + + It can also use an optional file (typically called 'config.cache' and +enabled with '--cache-file=config.cache' or simply '-C') that saves the +results of its tests to speed up reconfiguring. Caching is disabled by +default to prevent problems with accidental use of stale cache files. + + If you need to do unusual things to compile the package, please try +to figure out how 'configure' could check whether to do them, and mail +diffs or instructions to the address given in the 'README' so they can +be considered for the next release. If you are using the cache, and at +some point 'config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file 'configure.ac' (or 'configure.in') is used to create +'configure' by a program called 'autoconf'. You need 'configure.ac' if +you want to change it or regenerate 'configure' using a newer version of +'autoconf'. + + The simplest way to compile this package is: + + 1. 'cd' to the directory containing the package's source code and type + './configure' to configure the package for your system. + + Running 'configure' might take a while. While running, it prints + some messages telling which features it is checking for. + + 2. Type 'make' to compile the package. + + 3. Optionally, type 'make check' to run any self-tests that come with + the package, generally using the just-built uninstalled binaries. + + 4. Type 'make install' to install the programs and any data files and + documentation. When installing into a prefix owned by root, it is + recommended that the package be configured and built as a regular + user, and only the 'make install' phase executed with root + privileges. + + 5. Optionally, type 'make installcheck' to repeat any self-tests, but + this time using the binaries in their final installed location. + This target does not install anything. Running this target as a + regular user, particularly if the prior 'make install' required + root privileges, verifies that the installation completed + correctly. + + 6. You can remove the program binaries and object files from the + source code directory by typing 'make clean'. To also remove the + files that 'configure' created (so you can compile the package for + a different kind of computer), type 'make distclean'. There is + also a 'make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + + 7. Often, you can also type 'make uninstall' to remove the installed + files again. In practice, not all packages have tested that + uninstallation works correctly, even though it is required by the + GNU Coding Standards. + + 8. Some packages, particularly those that use Automake, provide 'make + distcheck', which can by used by developers to test that all other + targets like 'make install' and 'make uninstall' work correctly. + This target is generally not run by end users. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the 'configure' script does not know about. Run './configure --help' +for details on some of the pertinent environment variables. + + You can give 'configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here is +an example: + + ./configure CC=c99 CFLAGS=-g LIBS=-lposix + + *Note Defining Variables::, for more details. + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you can use GNU 'make'. 'cd' to the +directory where you want the object files and executables to go and run +the 'configure' script. 'configure' automatically checks for the source +code in the directory that 'configure' is in and in '..'. This is known +as a "VPATH" build. + + With a non-GNU 'make', it is safer to compile the package for one +architecture at a time in the source code directory. After you have +installed the package for one architecture, use 'make distclean' before +reconfiguring for another architecture. + + On MacOS X 10.5 and later systems, you can create libraries and +executables that work on multiple system types--known as "fat" or +"universal" binaries--by specifying multiple '-arch' options to the +compiler but only a single '-arch' option to the preprocessor. Like +this: + + ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ + CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ + CPP="gcc -E" CXXCPP="g++ -E" + + This is not guaranteed to produce working output in all cases, you +may have to build one architecture at a time and combine the results +using the 'lipo' tool if you have problems. + +Installation Names +================== + + By default, 'make install' installs the package's commands under +'/usr/local/bin', include files under '/usr/local/include', etc. You +can specify an installation prefix other than '/usr/local' by giving +'configure' the option '--prefix=PREFIX', where PREFIX must be an +absolute file name. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +pass the option '--exec-prefix=PREFIX' to 'configure', the package uses +PREFIX as the prefix for installing programs and libraries. +Documentation and other data files still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like '--bindir=DIR' to specify different values for particular +kinds of files. Run 'configure --help' for a list of the directories +you can set and what kinds of files go in them. In general, the default +for these options is expressed in terms of '${prefix}', so that +specifying just '--prefix' will affect all of the other directory +specifications that were not explicitly provided. + + The most portable way to affect installation locations is to pass the +correct locations to 'configure'; however, many packages provide one or +both of the following shortcuts of passing variable assignments to the +'make install' command line to change installation locations without +having to reconfigure or recompile. + + The first method involves providing an override variable for each +affected directory. For example, 'make install +prefix=/alternate/directory' will choose an alternate location for all +directory configuration variables that were expressed in terms of +'${prefix}'. Any directories that were specified during 'configure', +but not in terms of '${prefix}', must each be overridden at install time +for the entire installation to be relocated. The approach of makefile +variable overrides for each directory variable is required by the GNU +Coding Standards, and ideally causes no recompilation. However, some +platforms have known limitations with the semantics of shared libraries +that end up requiring recompilation when using this method, particularly +noticeable in packages that use GNU Libtool. + + The second method involves providing the 'DESTDIR' variable. For +example, 'make install DESTDIR=/alternate/directory' will prepend +'/alternate/directory' before all installation names. The approach of +'DESTDIR' overrides is not required by the GNU Coding Standards, and +does not work on platforms that have drive letters. On the other hand, +it does better at avoiding recompilation issues, and works well even +when some directory options were not specified in terms of '${prefix}' +at 'configure' time. + +Optional Features +================= + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving 'configure' the +option '--program-prefix=PREFIX' or '--program-suffix=SUFFIX'. + + Some packages pay attention to '--enable-FEATURE' options to +'configure', where FEATURE indicates an optional part of the package. +They may also pay attention to '--with-PACKAGE' options, where PACKAGE +is something like 'gnu-as' or 'x' (for the X Window System). The +'README' should mention any '--enable-' and '--with-' options that the +package recognizes. + + For packages that use the X Window System, 'configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the 'configure' options '--x-includes=DIR' and +'--x-libraries=DIR' to specify their locations. + + Some packages offer the ability to configure how verbose the +execution of 'make' will be. For these packages, running './configure +--enable-silent-rules' sets the default to minimal output, which can be +overridden with 'make V=1'; while running './configure +--disable-silent-rules' sets the default to verbose, which can be +overridden with 'make V=0'. + +Particular systems +================== + + On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC +is not installed, it is recommended to use the following options in +order to use an ANSI C compiler: + + ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" + +and if that doesn't work, install pre-built binaries of GCC for HP-UX. + + HP-UX 'make' updates targets which have the same time stamps as their +prerequisites, which makes it generally unusable when shipped generated +files such as 'configure' are involved. Use GNU 'make' instead. + + On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot +parse its '' header file. The option '-nodtk' can be used as a +workaround. If GNU CC is not installed, it is therefore recommended to +try + + ./configure CC="cc" + +and if that doesn't work, try + + ./configure CC="cc -nodtk" + + On Solaris, don't put '/usr/ucb' early in your 'PATH'. This +directory contains several dysfunctional programs; working variants of +these programs are available in '/usr/bin'. So, if you need '/usr/ucb' +in your 'PATH', put it _after_ '/usr/bin'. + + On Haiku, software installed for all users goes in '/boot/common', +not '/usr/local'. It is recommended to use the following options: + + ./configure --prefix=/boot/common + +Specifying the System Type +========================== + + There may be some features 'configure' cannot figure out +automatically, but needs to determine by the type of machine the package +will run on. Usually, assuming the package is built to be run on the +_same_ architectures, 'configure' can figure that out, but if it prints +a message saying it cannot guess the machine type, give it the +'--build=TYPE' option. TYPE can either be a short name for the system +type, such as 'sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS + KERNEL-OS + + See the file 'config.sub' for the possible values of each field. If +'config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should +use the option '--target=TYPE' to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with '--host=TYPE'. + +Sharing Defaults +================ + + If you want to set default values for 'configure' scripts to share, +you can create a site shell script called 'config.site' that gives +default values for variables like 'CC', 'cache_file', and 'prefix'. +'configure' looks for 'PREFIX/share/config.site' if it exists, then +'PREFIX/etc/config.site' if it exists. Or, you can set the +'CONFIG_SITE' environment variable to the location of the site script. +A warning: not all 'configure' scripts look for a site script. + +Defining Variables +================== + + Variables not defined in a site shell script can be set in the +environment passed to 'configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the 'configure' command line, using 'VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +causes the specified 'gcc' to be used as the C compiler (unless it is +overridden in the site shell script). + +Unfortunately, this technique does not work for 'CONFIG_SHELL' due to an +Autoconf limitation. Until the limitation is lifted, you can use this +workaround: + + CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash + +'configure' Invocation +====================== + + 'configure' recognizes the following options to control how it +operates. + +'--help' +'-h' + Print a summary of all of the options to 'configure', and exit. + +'--help=short' +'--help=recursive' + Print a summary of the options unique to this package's + 'configure', and exit. The 'short' variant lists options used only + in the top level, while the 'recursive' variant lists options also + present in any nested packages. + +'--version' +'-V' + Print the version of Autoconf used to generate the 'configure' + script, and exit. + +'--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally 'config.cache'. FILE defaults to '/dev/null' to + disable caching. + +'--config-cache' +'-C' + Alias for '--cache-file=config.cache'. + +'--quiet' +'--silent' +'-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to '/dev/null' (any error + messages will still be shown). + +'--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + 'configure' can determine that directory automatically. + +'--prefix=DIR' + Use DIR as the installation prefix. *note Installation Names:: for + more details, including other options available for fine-tuning the + installation locations. + +'--no-create' +'-n' + Run the configure checks, but stop before creating any output + files. + +'configure' also accepts some other, not widely useful, options. Run +'configure --help' for more details. diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/LICENCE b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/LICENCE new file mode 100755 index 000000000..57a544814 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/LICENCE @@ -0,0 +1,93 @@ +PCRE LICENCE +------------ + +PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + +Release 8 of PCRE is distributed under the terms of the "BSD" licence, as +specified below. The documentation for PCRE, supplied in the "doc" +directory, is distributed under the same terms as the software itself. The data +in the testdata directory is not copyrighted and is in the public domain. + +The basic library functions are written in C and are freestanding. Also +included in the distribution is a set of C++ wrapper functions, and a +just-in-time compiler that can be used to optimize pattern matching. These +are both optional features that can be omitted when the library is built. + + +THE BASIC LIBRARY FUNCTIONS +--------------------------- + +Written by: Philip Hazel +Email local part: ph10 +Email domain: cam.ac.uk + +University of Cambridge Computing Service, +Cambridge, England. + +Copyright (c) 1997-2020 University of Cambridge +All rights reserved. + + +PCRE JUST-IN-TIME COMPILATION SUPPORT +------------------------------------- + +Written by: Zoltan Herczeg +Email local part: hzmester +Email domain: freemail.hu + +Copyright(c) 2010-2020 Zoltan Herczeg +All rights reserved. + + +STACK-LESS JUST-IN-TIME COMPILER +-------------------------------- + +Written by: Zoltan Herczeg +Email local part: hzmester +Email domain: freemail.hu + +Copyright(c) 2009-2020 Zoltan Herczeg +All rights reserved. + + +THE C++ WRAPPER FUNCTIONS +------------------------- + +Contributed by: Google Inc. + +Copyright (c) 2007-2012, Google Inc. +All rights reserved. + + +THE "BSD" LICENCE +----------------- + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the name of Google + Inc. nor the names of their contributors may be used to endorse or + promote products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +End diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/Makefile.am b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/Makefile.am new file mode 100755 index 000000000..22b69471b --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/Makefile.am @@ -0,0 +1,895 @@ +## Process this file with automake to produce Makefile.in. + +ACLOCAL_AMFLAGS = -I m4 + +dist_doc_DATA = \ + doc/pcre.txt \ + doc/pcre-config.txt \ + doc/pcregrep.txt \ + doc/pcretest.txt \ + AUTHORS \ + COPYING \ + ChangeLog \ + LICENCE \ + NEWS \ + README + +# Note that pcrecpp.html is not in this list; it is listed separately below. + +dist_html_DATA = \ + doc/html/NON-AUTOTOOLS-BUILD.txt \ + doc/html/README.txt \ + doc/html/index.html \ + doc/html/pcre-config.html \ + doc/html/pcre.html \ + doc/html/pcre16.html \ + doc/html/pcre32.html \ + doc/html/pcre_assign_jit_stack.html \ + doc/html/pcre_compile.html \ + doc/html/pcre_compile2.html \ + doc/html/pcre_config.html \ + doc/html/pcre_copy_named_substring.html \ + doc/html/pcre_copy_substring.html \ + doc/html/pcre_dfa_exec.html \ + doc/html/pcre_exec.html \ + doc/html/pcre_free_study.html \ + doc/html/pcre_free_substring.html \ + doc/html/pcre_free_substring_list.html \ + doc/html/pcre_fullinfo.html \ + doc/html/pcre_get_named_substring.html \ + doc/html/pcre_get_stringnumber.html \ + doc/html/pcre_get_stringtable_entries.html \ + doc/html/pcre_get_substring.html \ + doc/html/pcre_get_substring_list.html \ + doc/html/pcre_jit_exec.html \ + doc/html/pcre_jit_stack_alloc.html \ + doc/html/pcre_jit_stack_free.html \ + doc/html/pcre_maketables.html \ + doc/html/pcre_pattern_to_host_byte_order.html \ + doc/html/pcre_refcount.html \ + doc/html/pcre_study.html \ + doc/html/pcre_utf16_to_host_byte_order.html \ + doc/html/pcre_utf32_to_host_byte_order.html \ + doc/html/pcre_version.html \ + doc/html/pcreapi.html \ + doc/html/pcrebuild.html \ + doc/html/pcrecallout.html \ + doc/html/pcrecompat.html \ + doc/html/pcredemo.html \ + doc/html/pcregrep.html \ + doc/html/pcrejit.html \ + doc/html/pcrelimits.html \ + doc/html/pcrematching.html \ + doc/html/pcrepartial.html \ + doc/html/pcrepattern.html \ + doc/html/pcreperform.html \ + doc/html/pcreposix.html \ + doc/html/pcreprecompile.html \ + doc/html/pcresample.html \ + doc/html/pcrestack.html \ + doc/html/pcresyntax.html \ + doc/html/pcretest.html \ + doc/html/pcreunicode.html + +pcrecpp_html = doc/html/pcrecpp.html +dist_noinst_DATA = $(pcrecpp_html) + +if WITH_PCRE_CPP +html_DATA = $(pcrecpp_html) +endif + +# The Libtool libraries to install. We'll add to this later. +lib_LTLIBRARIES = + +# Unit tests you want to run when people type 'make check'. +# TESTS is for binary unit tests, check_SCRIPTS for script-based tests +TESTS = +check_SCRIPTS = +dist_noinst_SCRIPTS = + +# Some of the binaries we make are to be installed, and others are +# (non-user-visible) helper programs needed to build libpcre, libpcre16 +# or libpcre32. +bin_PROGRAMS = +noinst_PROGRAMS = + +# Additional files to delete on 'make clean' and 'make maintainer-clean'. +CLEANFILES = +MAINTAINERCLEANFILES = + +# Additional files to bundle with the distribution, over and above what +# the Autotools include by default. +EXTRA_DIST = + +# These files contain additional m4 macros that are used by autoconf. +EXTRA_DIST += \ + m4/ax_pthread.m4 m4/pcre_visibility.m4 + +# These files contain maintenance information +EXTRA_DIST += \ + doc/perltest.txt \ + NON-UNIX-USE \ + NON-AUTOTOOLS-BUILD \ + HACKING + +# These files are used in the preparation of a release +EXTRA_DIST += \ + PrepareRelease \ + CheckMan \ + CleanTxt \ + Detrail \ + 132html \ + doc/index.html.src + +# These files are to do with building for Virtual Pascal +EXTRA_DIST += \ + makevp.bat \ + makevp_c.txt \ + makevp_l.txt \ + pcregexp.pas + +# These files are usable versions of pcre.h and config.h that are distributed +# for the benefit of people who are building PCRE manually, without the +# Autotools support. +EXTRA_DIST += \ + pcre.h.generic \ + config.h.generic + +# The only difference between pcre.h.in and pcre.h is the setting of the PCRE +# version number. Therefore, we can create the generic version just by copying. +pcre.h.generic: pcre.h.in configure.ac + rm -f $@ + cp -p pcre.h $@ + +# It is more complicated for config.h.generic. We need the version that results +# from a default configuration so as to get all the default values for PCRE +# configuration macros such as MATCH_LIMIT and NEWLINE. We can get this by +# doing a configure in a temporary directory. However, some trickery is needed, +# because the source directory may already be configured. If you just try +# running configure in a new directory, it complains. For this reason, we move +# config.status out of the way while doing the default configuration. The +# resulting config.h is munged by perl to put #ifdefs round any #defines for +# macros with values, and to #undef all boolean macros such as HAVE_xxx and +# SUPPORT_xxx. We also get rid of any gcc-specific visibility settings. Make +# sure that PCRE_EXP_DEFN is unset (in case it has visibility settings). +config.h.generic: configure.ac + rm -rf $@ _generic + mkdir _generic + cs=$(srcdir)/config.status; test ! -f $$cs || mv -f $$cs $$cs.aside + cd _generic && $(abs_top_srcdir)/configure || : + cs=$(srcdir)/config.status; test ! -f $$cs.aside || mv -f $$cs.aside $$cs + test -f _generic/config.h + perl -n \ + -e 'BEGIN{$$blank=0;}' \ + -e 'if(/PCRE_EXP_DEFN/){print"/* #undef PCRE_EXP_DEFN */\n";$$blank=0;next;}' \ + -e 'if(/to make a symbol visible/){next;}' \ + -e 'if(/__attribute__ \(\(visibility/){next;}' \ + -e 'if(/LT_OBJDIR/){print"/* This is ignored unless you are using libtool. */\n";}' \ + -e 'if(/^#define\s((?:HAVE|SUPPORT|STDC)_\w+)/){print"/* #undef $$1 */\n";$$blank=0;next;}' \ + -e 'if(/^#define\s(?!PACKAGE|VERSION)(\w+)/){print"#ifndef $$1\n$$_#endif\n";$$blank=0;next;}' \ + -e 'if(/^\s*$$/){print unless $$blank; $$blank=1;} else{print;$$blank=0;}' \ + _generic/config.h >$@ + rm -rf _generic + +MAINTAINERCLEANFILES += pcre.h.generic config.h.generic + +# These are the header files we'll install. We do not distribute pcre.h because +# it is generated from pcre.h.in. +nodist_include_HEADERS = \ + pcre.h +include_HEADERS = \ + pcreposix.h + +# These additional headers will be be installed if C++ support is enabled. We +# do not distribute pcrecpparg.h or pcre_stringpiece.h, as these are generated +# from corresponding .h.in files (which we do distribute). +if WITH_PCRE_CPP +nodist_include_HEADERS += \ + pcrecpparg.h \ + pcre_stringpiece.h +include_HEADERS += \ + pcrecpp.h \ + pcre_scanner.h +endif # WITH_PCRE_CPP + +bin_SCRIPTS = pcre-config + +## --------------------------------------------------------------- +## The dftables program is used to rebuild character tables before compiling +## PCRE, if --enable-rebuild-chartables is specified. It is not a user-visible +## program. The default (when --enable-rebuild-chartables is not specified) is +## to copy a distributed set of tables that are defined for ASCII code. In this +## case, dftables is not needed. + +if WITH_REBUILD_CHARTABLES + +noinst_PROGRAMS += dftables +dftables_SOURCES = dftables.c + +pcre_chartables.c: dftables$(EXEEXT) + ./dftables$(EXEEXT) $@ +else + +pcre_chartables.c: $(srcdir)/pcre_chartables.c.dist + rm -f $@ + $(LN_S) $(srcdir)/pcre_chartables.c.dist $@ + +endif # WITH_REBUILD_CHARTABLES + +BUILT_SOURCES = pcre_chartables.c + +## The main pcre library + +# Build the 8 bit library if it is enabled. +if WITH_PCRE8 +lib_LTLIBRARIES += libpcre.la + +libpcre_la_SOURCES = \ + pcre_byte_order.c \ + pcre_compile.c \ + pcre_config.c \ + pcre_dfa_exec.c \ + pcre_exec.c \ + pcre_fullinfo.c \ + pcre_get.c \ + pcre_globals.c \ + pcre_internal.h \ + pcre_jit_compile.c \ + pcre_maketables.c \ + pcre_newline.c \ + pcre_ord2utf8.c \ + pcre_refcount.c \ + pcre_string_utils.c \ + pcre_study.c \ + pcre_tables.c \ + pcre_ucd.c \ + pcre_valid_utf8.c \ + pcre_version.c \ + pcre_xclass.c \ + ucp.h + +libpcre_la_CFLAGS = \ + $(VISIBILITY_CFLAGS) \ + $(AM_CFLAGS) + +libpcre_la_LIBADD = + +## This file is generated as part of the building process, so don't distribute. +nodist_libpcre_la_SOURCES = \ + pcre_chartables.c + +endif # WITH_PCRE8 + +# Build the 16 bit library if it is enabled. +if WITH_PCRE16 +lib_LTLIBRARIES += libpcre16.la +libpcre16_la_SOURCES = \ + pcre16_byte_order.c \ + pcre16_chartables.c \ + pcre16_compile.c \ + pcre16_config.c \ + pcre16_dfa_exec.c \ + pcre16_exec.c \ + pcre16_fullinfo.c \ + pcre16_get.c \ + pcre16_globals.c \ + pcre16_jit_compile.c \ + pcre16_maketables.c \ + pcre16_newline.c \ + pcre16_ord2utf16.c \ + pcre16_refcount.c \ + pcre16_string_utils.c \ + pcre16_study.c \ + pcre16_tables.c \ + pcre16_ucd.c \ + pcre16_utf16_utils.c \ + pcre16_valid_utf16.c \ + pcre16_version.c \ + pcre16_xclass.c + +libpcre16_la_CFLAGS = \ + $(VISIBILITY_CFLAGS) \ + $(AM_CFLAGS) + +libpcre16_la_LIBADD = + +## This file is generated as part of the building process, so don't distribute. +nodist_libpcre16_la_SOURCES = \ + pcre_chartables.c + +endif # WITH_PCRE16 + +# Build the 32 bit library if it is enabled. +if WITH_PCRE32 +lib_LTLIBRARIES += libpcre32.la +libpcre32_la_SOURCES = \ + pcre32_byte_order.c \ + pcre32_chartables.c \ + pcre32_compile.c \ + pcre32_config.c \ + pcre32_dfa_exec.c \ + pcre32_exec.c \ + pcre32_fullinfo.c \ + pcre32_get.c \ + pcre32_globals.c \ + pcre32_jit_compile.c \ + pcre32_maketables.c \ + pcre32_newline.c \ + pcre32_ord2utf32.c \ + pcre32_refcount.c \ + pcre32_string_utils.c \ + pcre32_study.c \ + pcre32_tables.c \ + pcre32_ucd.c \ + pcre32_utf32_utils.c \ + pcre32_valid_utf32.c \ + pcre32_version.c \ + pcre32_xclass.c + +libpcre32_la_CFLAGS = \ + $(VISIBILITY_CFLAGS) \ + $(AM_CFLAGS) + +libpcre32_la_LIBADD = + +## This file is generated as part of the building process, so don't distribute. +nodist_libpcre32_la_SOURCES = \ + pcre_chartables.c + +endif # WITH_PCRE32 + +# The pcre_chartables.c.dist file is the default version of pcre_chartables.c, +# used unless --enable-rebuild-chartables is specified. +EXTRA_DIST += pcre_chartables.c.dist + +# The JIT compiler lives in a separate directory, but its files are #included +# when pcre_jit_compile.c is processed, so they must be distributed. +EXTRA_DIST += \ + sljit/sljitConfig.h \ + sljit/sljitConfigInternal.h \ + sljit/sljitExecAllocator.c \ + sljit/sljitLir.c \ + sljit/sljitLir.h \ + sljit/sljitNativeARM_32.c \ + sljit/sljitNativeARM_64.c \ + sljit/sljitNativeARM_T2_32.c \ + sljit/sljitNativeMIPS_32.c \ + sljit/sljitNativeMIPS_64.c \ + sljit/sljitNativeMIPS_common.c \ + sljit/sljitNativePPC_32.c \ + sljit/sljitNativePPC_64.c \ + sljit/sljitNativePPC_common.c \ + sljit/sljitNativeSPARC_32.c \ + sljit/sljitNativeSPARC_common.c \ + sljit/sljitNativeTILEGX_64.c \ + sljit/sljitNativeTILEGX-encoder.c \ + sljit/sljitNativeX86_32.c \ + sljit/sljitNativeX86_64.c \ + sljit/sljitNativeX86_common.c \ + sljit/sljitUtils.c + +if WITH_PCRE8 +libpcre_la_LDFLAGS = $(EXTRA_LIBPCRE_LDFLAGS) +endif # WITH_PCRE8 +if WITH_PCRE16 +libpcre16_la_LDFLAGS = $(EXTRA_LIBPCRE16_LDFLAGS) +endif # WITH_PCRE16 +if WITH_PCRE32 +libpcre32_la_LDFLAGS = $(EXTRA_LIBPCRE32_LDFLAGS) +endif # WITH_PCRE32 + +if WITH_VALGRIND +if WITH_PCRE8 +libpcre_la_CFLAGS += $(VALGRIND_CFLAGS) +endif # WITH_PCRE8 +if WITH_PCRE16 +libpcre16_la_CFLAGS += $(VALGRIND_CFLAGS) +endif # WITH_PCRE16 +if WITH_PCRE32 +libpcre32_la_CFLAGS += $(VALGRIND_CFLAGS) +endif # WITH_PCRE32 +endif # WITH_VALGRIND + +if WITH_GCOV +if WITH_PCRE8 +libpcre_la_CFLAGS += $(GCOV_CFLAGS) +endif # WITH_PCRE8 +if WITH_PCRE16 +libpcre16_la_CFLAGS += $(GCOV_CFLAGS) +endif # WITH_PCRE16 +if WITH_PCRE32 +libpcre32_la_CFLAGS += $(GCOV_CFLAGS) +endif # WITH_PCRE32 +endif # WITH_GCOV + +CLEANFILES += pcre_chartables.c + +## If JIT support is enabled, arrange for the JIT test program to run. +if WITH_JIT +TESTS += pcre_jit_test +noinst_PROGRAMS += pcre_jit_test +pcre_jit_test_SOURCES = pcre_jit_test.c +pcre_jit_test_CFLAGS = $(AM_CFLAGS) +pcre_jit_test_LDADD = +if WITH_PCRE8 +pcre_jit_test_LDADD += libpcre.la +endif # WITH_PCRE8 +if WITH_PCRE16 +pcre_jit_test_LDADD += libpcre16.la +endif # WITH_PCRE16 +if WITH_PCRE32 +pcre_jit_test_LDADD += libpcre32.la +endif # WITH_PCRE32 +if WITH_GCOV +pcre_jit_test_CFLAGS += $(GCOV_CFLAGS) +pcre_jit_test_LDADD += $(GCOV_LIBS) +endif # WITH_GCOV +endif # WITH_JIT + +## A version of the main pcre library that has a posix re API. +if WITH_PCRE8 + +lib_LTLIBRARIES += libpcreposix.la +libpcreposix_la_SOURCES = \ + pcreposix.c +libpcreposix_la_CFLAGS = $(VISIBILITY_CFLAGS) $(AM_CFLAGS) +libpcreposix_la_LDFLAGS = $(EXTRA_LIBPCREPOSIX_LDFLAGS) +libpcreposix_la_LIBADD = libpcre.la + +if WITH_GCOV +libpcreposix_la_CFLAGS += $(GCOV_CFLAGS) +endif # WITH_GCOV + +endif # WITH_PCRE8 + +## There's a C++ library as well. +if WITH_PCRE_CPP + +lib_LTLIBRARIES += libpcrecpp.la +libpcrecpp_la_SOURCES = \ + pcrecpp_internal.h \ + pcrecpp.cc \ + pcre_scanner.cc \ + pcre_stringpiece.cc +libpcrecpp_la_CXXFLAGS = $(VISIBILITY_CXXFLAGS) $(AM_CXXFLAGS) +libpcrecpp_la_LDFLAGS = $(EXTRA_LIBPCRECPP_LDFLAGS) +libpcrecpp_la_LIBADD = libpcre.la + +TESTS += pcrecpp_unittest +noinst_PROGRAMS += pcrecpp_unittest +pcrecpp_unittest_SOURCES = pcrecpp_unittest.cc +pcrecpp_unittest_CXXFLAGS = $(AM_CXXFLAGS) +pcrecpp_unittest_LDADD = libpcrecpp.la + +TESTS += pcre_scanner_unittest +noinst_PROGRAMS += pcre_scanner_unittest +pcre_scanner_unittest_SOURCES = pcre_scanner_unittest.cc +pcre_scanner_unittest_CXXFLAGS = $(AM_CXXFLAGS) +pcre_scanner_unittest_LDADD = libpcrecpp.la + +TESTS += pcre_stringpiece_unittest +noinst_PROGRAMS += pcre_stringpiece_unittest +pcre_stringpiece_unittest_SOURCES = pcre_stringpiece_unittest.cc +pcre_stringpiece_unittest_CXXFLAGS = $(AM_CXXFLAGS) +pcre_stringpiece_unittest_LDADD = libpcrecpp.la + +if WITH_GCOV +libpcrecpp_la_CXXFLAGS += $(GCOV_CXXFLAGS) +pcrecpp_unittest_LDADD += $(GCOV_LIBS) +pcre_scanner_unittest_LDADD += $(GCOV_LIBS) +pcre_stringpiece_unittest_LDADD += $(GCOV_LIBS) +endif # WITH_GCOV + +endif # WITH_PCRE_CPP + +## The main unit tests + +# Each unit test is a binary plus a script that runs that binary in various +# ways. We install these test binaries in case folks find it helpful. + +TESTS += RunTest +dist_noinst_SCRIPTS += RunTest +EXTRA_DIST += RunTest.bat +bin_PROGRAMS += pcretest +pcretest_SOURCES = pcretest.c +pcretest_CFLAGS = $(AM_CFLAGS) +pcretest_LDADD = $(LIBREADLINE) +if WITH_PCRE8 +pcretest_SOURCES += pcre_printint.c +pcretest_LDADD += libpcre.la libpcreposix.la +endif # WITH_PCRE8 +if WITH_PCRE16 +pcretest_SOURCES += pcre16_printint.c +pcretest_LDADD += libpcre16.la +endif # WITH_PCRE16 +if WITH_PCRE32 +pcretest_SOURCES += pcre32_printint.c +pcretest_LDADD += libpcre32.la +endif # WITH_PCRE32 +if WITH_VALGRIND +pcretest_CFLAGS += $(VALGRIND_CFLAGS) +endif # WITH_VALGRIND +if WITH_GCOV +pcretest_CFLAGS += $(GCOV_CFLAGS) +pcretest_LDADD += $(GCOV_LIBS) +endif # WITH_GCOV + +if WITH_PCRE8 +TESTS += RunGrepTest +dist_noinst_SCRIPTS += RunGrepTest +bin_PROGRAMS += pcregrep +pcregrep_SOURCES = pcregrep.c +pcregrep_CFLAGS = $(AM_CFLAGS) +pcregrep_LDADD = $(LIBZ) $(LIBBZ2) +pcregrep_LDADD += libpcre.la libpcreposix.la +if WITH_GCOV +pcregrep_CFLAGS += $(GCOV_CFLAGS) +pcregrep_LDADD += $(GCOV_LIBS) +endif # WITH_GCOV +endif # WITH_PCRE8 + +EXTRA_DIST += \ + testdata/grepbinary \ + testdata/grepfilelist \ + testdata/grepinput \ + testdata/grepinput3 \ + testdata/grepinput8 \ + testdata/grepinputv \ + testdata/grepinputx \ + testdata/greplist \ + testdata/grepoutput \ + testdata/grepoutput8 \ + testdata/grepoutputN \ + testdata/greppatN4 \ + testdata/saved16 \ + testdata/saved16BE-1 \ + testdata/saved16BE-2 \ + testdata/saved16LE-1 \ + testdata/saved16LE-2 \ + testdata/saved32 \ + testdata/saved32BE-1 \ + testdata/saved32BE-2 \ + testdata/saved32LE-1 \ + testdata/saved32LE-2 \ + testdata/saved8 \ + testdata/testinput1 \ + testdata/testinput2 \ + testdata/testinput3 \ + testdata/testinput4 \ + testdata/testinput5 \ + testdata/testinput6 \ + testdata/testinput7 \ + testdata/testinput8 \ + testdata/testinput9 \ + testdata/testinput10 \ + testdata/testinput11 \ + testdata/testinput12 \ + testdata/testinput13 \ + testdata/testinput14 \ + testdata/testinput15 \ + testdata/testinput16 \ + testdata/testinput17 \ + testdata/testinput18 \ + testdata/testinput19 \ + testdata/testinput20 \ + testdata/testinput21 \ + testdata/testinput22 \ + testdata/testinput23 \ + testdata/testinput24 \ + testdata/testinput25 \ + testdata/testinput26 \ + testdata/testinputEBC \ + testdata/testoutput1 \ + testdata/testoutput2 \ + testdata/testoutput3 \ + testdata/testoutput3A \ + testdata/testoutput3B \ + testdata/testoutput4 \ + testdata/testoutput5 \ + testdata/testoutput6 \ + testdata/testoutput7 \ + testdata/testoutput8 \ + testdata/testoutput9 \ + testdata/testoutput10 \ + testdata/testoutput11-8 \ + testdata/testoutput11-16 \ + testdata/testoutput11-32 \ + testdata/testoutput12 \ + testdata/testoutput13 \ + testdata/testoutput14 \ + testdata/testoutput15 \ + testdata/testoutput16 \ + testdata/testoutput17 \ + testdata/testoutput18-16 \ + testdata/testoutput18-32 \ + testdata/testoutput19 \ + testdata/testoutput20 \ + testdata/testoutput21-16 \ + testdata/testoutput21-32 \ + testdata/testoutput22-16 \ + testdata/testoutput22-32 \ + testdata/testoutput23 \ + testdata/testoutput24 \ + testdata/testoutput25 \ + testdata/testoutput26 \ + testdata/testoutputEBC \ + testdata/valgrind-jit.supp \ + testdata/wintestinput3 \ + testdata/wintestoutput3 \ + perltest.pl + +CLEANFILES += \ + testsavedregex \ + teststderr \ + testtemp* \ + testtry \ + testNinput \ + testtrygrep \ + teststderrgrep \ + testNinputgrep + +# PCRE demonstration program. No longer built automatcally. The point is that +# the users should build it themselves. So just distribute the source. +# noinst_PROGRAMS += pcredemo +# pcredemo_SOURCES = pcredemo.c +# pcredemo_LDADD = libpcre.la + +EXTRA_DIST += pcredemo.c + + +## Utility rules, documentation, etc. + +# A compatibility line, the old build system worked with 'make test' +test: check ; + + +# A PCRE user submitted the following addition, saying that it "will allow +# anyone using the 'mingw32' compiler to simply type 'make pcre.dll' and get a +# nice DLL for Windows use". (It is used by the pcre.dll target.) +DLL_OBJS= pcre_byte_order.o pcre_compile.o pcre_config.o \ + pcre_dfa_exec.o pcre_exec.o pcre_fullinfo.o pcre_get.o \ + pcre_globals.o pcre_jit_compile.o pcre_maketables.o \ + pcre_newline.o pcre_ord2utf8.o pcre_refcount.o \ + pcre_study.o pcre_tables.o pcre_ucd.o \ + pcre_valid_utf8.o pcre_version.o pcre_chartables.o \ + pcre_xclass.o + +# A PCRE user submitted the following addition, saying that it "will allow +# anyone using the 'mingw32' compiler to simply type 'make pcre.dll' and get a +# nice DLL for Windows use". +pcre.dll: $(DLL_OBJS) + $(CC) -shared -o pcre.dll -Wl,"--strip-all" -Wl,"--export-all-symbols" $(DLL_OBJS) + + +# We have .pc files for pkg-config users. +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = libpcre.pc libpcreposix.pc +if WITH_PCRE16 +pkgconfig_DATA += libpcre16.pc +endif +if WITH_PCRE32 +pkgconfig_DATA += libpcre32.pc +endif +if WITH_PCRE_CPP +pkgconfig_DATA += libpcrecpp.pc +endif + +# Note that pcrecpp.3 is not in this list, but is included separately below. + +dist_man_MANS = \ + doc/pcre-config.1 \ + doc/pcre.3 \ + doc/pcre16.3 \ + doc/pcre32.3 \ + doc/pcre_assign_jit_stack.3 \ + doc/pcre_compile.3 \ + doc/pcre_compile2.3 \ + doc/pcre_config.3 \ + doc/pcre_copy_named_substring.3 \ + doc/pcre_copy_substring.3 \ + doc/pcre_dfa_exec.3 \ + doc/pcre_exec.3 \ + doc/pcre_free_study.3 \ + doc/pcre_free_substring.3 \ + doc/pcre_free_substring_list.3 \ + doc/pcre_fullinfo.3 \ + doc/pcre_get_named_substring.3 \ + doc/pcre_get_stringnumber.3 \ + doc/pcre_get_stringtable_entries.3 \ + doc/pcre_get_substring.3 \ + doc/pcre_get_substring_list.3 \ + doc/pcre_jit_exec.3 \ + doc/pcre_jit_stack_alloc.3 \ + doc/pcre_jit_stack_free.3 \ + doc/pcre_maketables.3 \ + doc/pcre_pattern_to_host_byte_order.3 \ + doc/pcre_refcount.3 \ + doc/pcre_study.3 \ + doc/pcre_utf16_to_host_byte_order.3 \ + doc/pcre_utf32_to_host_byte_order.3 \ + doc/pcre_version.3 \ + doc/pcreapi.3 \ + doc/pcrebuild.3 \ + doc/pcrecallout.3 \ + doc/pcrecompat.3 \ + doc/pcredemo.3 \ + doc/pcregrep.1 \ + doc/pcrejit.3 \ + doc/pcrelimits.3 \ + doc/pcrematching.3 \ + doc/pcrepartial.3 \ + doc/pcrepattern.3 \ + doc/pcreperform.3 \ + doc/pcreposix.3 \ + doc/pcreprecompile.3 \ + doc/pcresample.3 \ + doc/pcrestack.3 \ + doc/pcresyntax.3 \ + doc/pcretest.1 \ + doc/pcreunicode.3 + +# Arrange for the per-function man pages to have 16- and 32-bit names as well. +install-data-hook: + ln -sf pcre_assign_jit_stack.3 $(DESTDIR)$(man3dir)/pcre16_assign_jit_stack.3 + ln -sf pcre_compile.3 $(DESTDIR)$(man3dir)/pcre16_compile.3 + ln -sf pcre_compile2.3 $(DESTDIR)$(man3dir)/pcre16_compile2.3 + ln -sf pcre_config.3 $(DESTDIR)$(man3dir)/pcre16_config.3 + ln -sf pcre_copy_named_substring.3 $(DESTDIR)$(man3dir)/pcre16_copy_named_substring.3 + ln -sf pcre_copy_substring.3 $(DESTDIR)$(man3dir)/pcre16_copy_substring.3 + ln -sf pcre_dfa_exec.3 $(DESTDIR)$(man3dir)/pcre16_dfa_exec.3 + ln -sf pcre_exec.3 $(DESTDIR)$(man3dir)/pcre16_exec.3 + ln -sf pcre_free_study.3 $(DESTDIR)$(man3dir)/pcre16_free_study.3 + ln -sf pcre_free_substring.3 $(DESTDIR)$(man3dir)/pcre16_free_substring.3 + ln -sf pcre_free_substring_list.3 $(DESTDIR)$(man3dir)/pcre16_free_substring_list.3 + ln -sf pcre_fullinfo.3 $(DESTDIR)$(man3dir)/pcre16_fullinfo.3 + ln -sf pcre_get_named_substring.3 $(DESTDIR)$(man3dir)/pcre16_get_named_substring.3 + ln -sf pcre_get_stringnumber.3 $(DESTDIR)$(man3dir)/pcre16_get_stringnumber.3 + ln -sf pcre_get_stringtable_entries.3 $(DESTDIR)$(man3dir)/pcre16_get_stringtable_entries.3 + ln -sf pcre_get_substring.3 $(DESTDIR)$(man3dir)/pcre16_get_substring.3 + ln -sf pcre_get_substring_list.3 $(DESTDIR)$(man3dir)/pcre16_get_substring_list.3 + ln -sf pcre_jit_exec.3 $(DESTDIR)$(man3dir)/pcre16_jit_exec.3 + ln -sf pcre_jit_stack_alloc.3 $(DESTDIR)$(man3dir)/pcre16_jit_stack_alloc.3 + ln -sf pcre_jit_stack_free.3 $(DESTDIR)$(man3dir)/pcre16_jit_stack_free.3 + ln -sf pcre_maketables.3 $(DESTDIR)$(man3dir)/pcre16_maketables.3 + ln -sf pcre_pattern_to_host_byte_order.3 $(DESTDIR)$(man3dir)/pcre16_pattern_to_host_byte_order.3 + ln -sf pcre_refcount.3 $(DESTDIR)$(man3dir)/pcre16_refcount.3 + ln -sf pcre_study.3 $(DESTDIR)$(man3dir)/pcre16_study.3 + ln -sf pcre_utf16_to_host_byte_order.3 $(DESTDIR)$(man3dir)/pcre16_utf16_to_host_byte_order.3 + ln -sf pcre_version.3 $(DESTDIR)$(man3dir)/pcre16_version.3 + ln -sf pcre_assign_jit_stack.3 $(DESTDIR)$(man3dir)/pcre32_assign_jit_stack.3 + ln -sf pcre_compile.3 $(DESTDIR)$(man3dir)/pcre32_compile.3 + ln -sf pcre_compile2.3 $(DESTDIR)$(man3dir)/pcre32_compile2.3 + ln -sf pcre_config.3 $(DESTDIR)$(man3dir)/pcre32_config.3 + ln -sf pcre_copy_named_substring.3 $(DESTDIR)$(man3dir)/pcre32_copy_named_substring.3 + ln -sf pcre_copy_substring.3 $(DESTDIR)$(man3dir)/pcre32_copy_substring.3 + ln -sf pcre_dfa_exec.3 $(DESTDIR)$(man3dir)/pcre32_dfa_exec.3 + ln -sf pcre_exec.3 $(DESTDIR)$(man3dir)/pcre32_exec.3 + ln -sf pcre_free_study.3 $(DESTDIR)$(man3dir)/pcre32_free_study.3 + ln -sf pcre_free_substring.3 $(DESTDIR)$(man3dir)/pcre32_free_substring.3 + ln -sf pcre_free_substring_list.3 $(DESTDIR)$(man3dir)/pcre32_free_substring_list.3 + ln -sf pcre_fullinfo.3 $(DESTDIR)$(man3dir)/pcre32_fullinfo.3 + ln -sf pcre_get_named_substring.3 $(DESTDIR)$(man3dir)/pcre32_get_named_substring.3 + ln -sf pcre_get_stringnumber.3 $(DESTDIR)$(man3dir)/pcre32_get_stringnumber.3 + ln -sf pcre_get_stringtable_entries.3 $(DESTDIR)$(man3dir)/pcre32_get_stringtable_entries.3 + ln -sf pcre_get_substring.3 $(DESTDIR)$(man3dir)/pcre32_get_substring.3 + ln -sf pcre_get_substring_list.3 $(DESTDIR)$(man3dir)/pcre32_get_substring_list.3 + ln -sf pcre_jit_exec.3 $(DESTDIR)$(man3dir)/pcre32_jit_exec.3 + ln -sf pcre_jit_stack_alloc.3 $(DESTDIR)$(man3dir)/pcre32_jit_stack_alloc.3 + ln -sf pcre_jit_stack_free.3 $(DESTDIR)$(man3dir)/pcre32_jit_stack_free.3 + ln -sf pcre_maketables.3 $(DESTDIR)$(man3dir)/pcre32_maketables.3 + ln -sf pcre_pattern_to_host_byte_order.3 $(DESTDIR)$(man3dir)/pcre32_pattern_to_host_byte_order.3 + ln -sf pcre_refcount.3 $(DESTDIR)$(man3dir)/pcre32_refcount.3 + ln -sf pcre_study.3 $(DESTDIR)$(man3dir)/pcre32_study.3 + ln -sf pcre_utf32_to_host_byte_order.3 $(DESTDIR)$(man3dir)/pcre32_utf32_to_host_byte_order.3 + ln -sf pcre_version.3 $(DESTDIR)$(man3dir)/pcre32_version.3 + +pcrecpp_man = doc/pcrecpp.3 +EXTRA_DIST += $(pcrecpp_man) + +if WITH_PCRE_CPP +man_MANS = $(pcrecpp_man) +endif + +# gcov/lcov code coverage reporting + +if WITH_GCOV + +# Coverage reporting targets: +# +# coverage: Create a coverage report from 'make check' +# coverage-baseline: Capture baseline coverage information +# coverage-reset: This zeros the coverage counters only +# coverage-report: This creates the coverage report only +# coverage-clean-report: This removes the generated coverage report +# without cleaning the coverage data itself +# coverage-clean-data: This removes the captured coverage data without +# removing the coverage files created at compile time (*.gcno) +# coverage-clean: This cleans all coverage data including the generated +# coverage report. + +COVERAGE_TEST_NAME = $(PACKAGE) +COVERAGE_NAME = $(PACKAGE)-$(VERSION) +COVERAGE_OUTPUT_FILE = $(COVERAGE_NAME)-coverage.info +COVERAGE_OUTPUT_DIR = $(COVERAGE_NAME)-coverage +COVERAGE_LCOV_EXTRA_FLAGS = +COVERAGE_GENHTML_EXTRA_FLAGS = + +coverage_quiet = $(coverage_quiet_$(V)) +coverage_quiet_ = $(coverage_quiet_$(AM_DEFAULT_VERBOSITY)) +coverage_quiet_0 = --quiet + +coverage-check: all + -$(MAKE) $(AM_MAKEFLAGS) -k check + +coverage-baseline: + $(LCOV) $(coverage_quiet) \ + --directory $(top_builddir) \ + --output-file "$(COVERAGE_OUTPUT_FILE)" \ + --capture \ + --initial + +coverage-report: + $(LCOV) $(coverage_quiet) \ + --directory $(top_builddir) \ + --capture \ + --output-file "$(COVERAGE_OUTPUT_FILE).tmp" \ + --test-name "$(COVERAGE_TEST_NAME)" \ + --no-checksum \ + --compat-libtool \ + $(COVERAGE_LCOV_EXTRA_FLAGS) + $(LCOV) $(coverage_quiet) \ + --directory $(top_builddir) \ + --output-file "$(COVERAGE_OUTPUT_FILE)" \ + --remove "$(COVERAGE_OUTPUT_FILE).tmp" \ + "/tmp/*" \ + "/usr/include/*" \ + "$(includedir)/*" + -@rm -f "$(COVERAGE_OUTPUT_FILE).tmp" + LANG=C $(GENHTML) $(coverage_quiet) \ + --prefix $(top_builddir) \ + --output-directory "$(COVERAGE_OUTPUT_DIR)" \ + --title "$(PACKAGE) $(VERSION) Code Coverage Report" \ + --show-details "$(COVERAGE_OUTPUT_FILE)" \ + --legend \ + $(COVERAGE_GENHTML_EXTRA_FLAGS) + @echo "Code coverage report written to file://$(abs_builddir)/$(COVERAGE_OUTPUT_DIR)/index.html" + +coverage-reset: + -$(LCOV) $(coverage_quiet) --zerocounters --directory $(top_builddir) + +coverage-clean-report: + -rm -f "$(COVERAGE_OUTPUT_FILE)" "$(COVERAGE_OUTPUT_FILE).tmp" + -rm -rf "$(COVERAGE_OUTPUT_DIR)" + +coverage-clean-data: + -find $(top_builddir) -name "*.gcda" -delete + +coverage-clean: coverage-reset coverage-clean-report coverage-clean-data + -find $(top_builddir) -name "*.gcno" -delete + +coverage-distclean: coverage-clean + +coverage: coverage-reset coverage-baseline coverage-check coverage-report +clean-local: coverage-clean +distclean-local: coverage-distclean + +.PHONY: coverage coverage-baseline coverage-check coverage-report coverage-reset coverage-clean-report coverage-clean-data coverage-clean coverage-distclean + +else + +coverage: + @echo "Configuring with --enable-coverage required to generate code coverage report." + +endif # WITH_GCOV + +## CMake support + +EXTRA_DIST += \ + cmake/COPYING-CMAKE-SCRIPTS \ + cmake/FindPackageHandleStandardArgs.cmake \ + cmake/FindReadline.cmake \ + cmake/FindEditline.cmake \ + CMakeLists.txt \ + config-cmake.h.in + +## end Makefile.am diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/Makefile.in b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/Makefile.in new file mode 100755 index 000000000..dd9df7f66 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/Makefile.in @@ -0,0 +1,3546 @@ +# Makefile.in generated by automake 1.16.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2018 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + + + + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +TESTS = $(am__EXEEXT_3) $(am__EXEEXT_4) RunTest $(am__append_38) +bin_PROGRAMS = pcretest$(EXEEXT) $(am__EXEEXT_1) +noinst_PROGRAMS = $(am__EXEEXT_2) $(am__EXEEXT_3) $(am__EXEEXT_4) + +# These additional headers will be be installed if C++ support is enabled. We +# do not distribute pcrecpparg.h or pcre_stringpiece.h, as these are generated +# from corresponding .h.in files (which we do distribute). +@WITH_PCRE_CPP_TRUE@am__append_1 = \ +@WITH_PCRE_CPP_TRUE@ pcrecpparg.h \ +@WITH_PCRE_CPP_TRUE@ pcre_stringpiece.h + +@WITH_PCRE_CPP_TRUE@am__append_2 = \ +@WITH_PCRE_CPP_TRUE@ pcrecpp.h \ +@WITH_PCRE_CPP_TRUE@ pcre_scanner.h + +@WITH_REBUILD_CHARTABLES_TRUE@am__append_3 = dftables + +# Build the 8 bit library if it is enabled. +@WITH_PCRE8_TRUE@am__append_4 = libpcre.la + +# Build the 16 bit library if it is enabled. +@WITH_PCRE16_TRUE@am__append_5 = libpcre16.la + +# Build the 32 bit library if it is enabled. +@WITH_PCRE32_TRUE@am__append_6 = libpcre32.la +@WITH_PCRE8_TRUE@@WITH_VALGRIND_TRUE@am__append_7 = $(VALGRIND_CFLAGS) +@WITH_PCRE16_TRUE@@WITH_VALGRIND_TRUE@am__append_8 = $(VALGRIND_CFLAGS) +@WITH_PCRE32_TRUE@@WITH_VALGRIND_TRUE@am__append_9 = $(VALGRIND_CFLAGS) +@WITH_GCOV_TRUE@@WITH_PCRE8_TRUE@am__append_10 = $(GCOV_CFLAGS) +@WITH_GCOV_TRUE@@WITH_PCRE16_TRUE@am__append_11 = $(GCOV_CFLAGS) +@WITH_GCOV_TRUE@@WITH_PCRE32_TRUE@am__append_12 = $(GCOV_CFLAGS) +@WITH_JIT_TRUE@am__append_13 = pcre_jit_test +@WITH_JIT_TRUE@am__append_14 = pcre_jit_test +@WITH_JIT_TRUE@@WITH_PCRE8_TRUE@am__append_15 = libpcre.la +@WITH_JIT_TRUE@@WITH_PCRE16_TRUE@am__append_16 = libpcre16.la +@WITH_JIT_TRUE@@WITH_PCRE32_TRUE@am__append_17 = libpcre32.la +@WITH_GCOV_TRUE@@WITH_JIT_TRUE@am__append_18 = $(GCOV_CFLAGS) +@WITH_GCOV_TRUE@@WITH_JIT_TRUE@am__append_19 = $(GCOV_LIBS) +@WITH_PCRE8_TRUE@am__append_20 = libpcreposix.la +@WITH_GCOV_TRUE@@WITH_PCRE8_TRUE@am__append_21 = $(GCOV_CFLAGS) +@WITH_PCRE_CPP_TRUE@am__append_22 = libpcrecpp.la +@WITH_PCRE_CPP_TRUE@am__append_23 = pcrecpp_unittest \ +@WITH_PCRE_CPP_TRUE@ pcre_scanner_unittest \ +@WITH_PCRE_CPP_TRUE@ pcre_stringpiece_unittest +@WITH_PCRE_CPP_TRUE@am__append_24 = pcrecpp_unittest \ +@WITH_PCRE_CPP_TRUE@ pcre_scanner_unittest \ +@WITH_PCRE_CPP_TRUE@ pcre_stringpiece_unittest +@WITH_GCOV_TRUE@@WITH_PCRE_CPP_TRUE@am__append_25 = $(GCOV_CXXFLAGS) +@WITH_GCOV_TRUE@@WITH_PCRE_CPP_TRUE@am__append_26 = $(GCOV_LIBS) +@WITH_GCOV_TRUE@@WITH_PCRE_CPP_TRUE@am__append_27 = $(GCOV_LIBS) +@WITH_GCOV_TRUE@@WITH_PCRE_CPP_TRUE@am__append_28 = $(GCOV_LIBS) +@WITH_PCRE8_TRUE@am__append_29 = pcre_printint.c +@WITH_PCRE8_TRUE@am__append_30 = libpcre.la libpcreposix.la +@WITH_PCRE16_TRUE@am__append_31 = pcre16_printint.c +@WITH_PCRE16_TRUE@am__append_32 = libpcre16.la +@WITH_PCRE32_TRUE@am__append_33 = pcre32_printint.c +@WITH_PCRE32_TRUE@am__append_34 = libpcre32.la +@WITH_VALGRIND_TRUE@am__append_35 = $(VALGRIND_CFLAGS) +@WITH_GCOV_TRUE@am__append_36 = $(GCOV_CFLAGS) +@WITH_GCOV_TRUE@am__append_37 = $(GCOV_LIBS) +@WITH_PCRE8_TRUE@am__append_38 = RunGrepTest +@WITH_PCRE8_TRUE@am__append_39 = RunGrepTest +@WITH_PCRE8_TRUE@am__append_40 = pcregrep +@WITH_GCOV_TRUE@@WITH_PCRE8_TRUE@am__append_41 = $(GCOV_CFLAGS) +@WITH_GCOV_TRUE@@WITH_PCRE8_TRUE@am__append_42 = $(GCOV_LIBS) +@WITH_PCRE16_TRUE@am__append_43 = libpcre16.pc +@WITH_PCRE32_TRUE@am__append_44 = libpcre32.pc +@WITH_PCRE_CPP_TRUE@am__append_45 = libpcrecpp.pc +subdir = . +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/pcre_visibility.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ + $(am__configure_deps) $(am__dist_noinst_SCRIPTS_DIST) \ + $(dist_doc_DATA) $(dist_html_DATA) $(dist_noinst_DATA) \ + $(am__include_HEADERS_DIST) $(am__DIST_COMMON) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = config.h +CONFIG_CLEAN_FILES = libpcre.pc libpcre16.pc libpcre32.pc \ + libpcreposix.pc libpcrecpp.pc pcre-config pcre.h \ + pcre_stringpiece.h pcrecpparg.h +CONFIG_CLEAN_VPATH_FILES = +@WITH_PCRE8_TRUE@am__EXEEXT_1 = pcregrep$(EXEEXT) +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libdir)" \ + "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" \ + "$(DESTDIR)$(man3dir)" "$(DESTDIR)$(docdir)" \ + "$(DESTDIR)$(htmldir)" "$(DESTDIR)$(htmldir)" \ + "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(includedir)" \ + "$(DESTDIR)$(includedir)" +@WITH_REBUILD_CHARTABLES_TRUE@am__EXEEXT_2 = dftables$(EXEEXT) +@WITH_JIT_TRUE@am__EXEEXT_3 = pcre_jit_test$(EXEEXT) +@WITH_PCRE_CPP_TRUE@am__EXEEXT_4 = pcrecpp_unittest$(EXEEXT) \ +@WITH_PCRE_CPP_TRUE@ pcre_scanner_unittest$(EXEEXT) \ +@WITH_PCRE_CPP_TRUE@ pcre_stringpiece_unittest$(EXEEXT) +PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS) +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +LTLIBRARIES = $(lib_LTLIBRARIES) +libpcre_la_DEPENDENCIES = +am__libpcre_la_SOURCES_DIST = pcre_byte_order.c pcre_compile.c \ + pcre_config.c pcre_dfa_exec.c pcre_exec.c pcre_fullinfo.c \ + pcre_get.c pcre_globals.c pcre_internal.h pcre_jit_compile.c \ + pcre_maketables.c pcre_newline.c pcre_ord2utf8.c \ + pcre_refcount.c pcre_string_utils.c pcre_study.c pcre_tables.c \ + pcre_ucd.c pcre_valid_utf8.c pcre_version.c pcre_xclass.c \ + ucp.h +@WITH_PCRE8_TRUE@am_libpcre_la_OBJECTS = \ +@WITH_PCRE8_TRUE@ libpcre_la-pcre_byte_order.lo \ +@WITH_PCRE8_TRUE@ libpcre_la-pcre_compile.lo \ +@WITH_PCRE8_TRUE@ libpcre_la-pcre_config.lo \ +@WITH_PCRE8_TRUE@ libpcre_la-pcre_dfa_exec.lo \ +@WITH_PCRE8_TRUE@ libpcre_la-pcre_exec.lo \ +@WITH_PCRE8_TRUE@ libpcre_la-pcre_fullinfo.lo \ +@WITH_PCRE8_TRUE@ libpcre_la-pcre_get.lo \ +@WITH_PCRE8_TRUE@ libpcre_la-pcre_globals.lo \ +@WITH_PCRE8_TRUE@ libpcre_la-pcre_jit_compile.lo \ +@WITH_PCRE8_TRUE@ libpcre_la-pcre_maketables.lo \ +@WITH_PCRE8_TRUE@ libpcre_la-pcre_newline.lo \ +@WITH_PCRE8_TRUE@ libpcre_la-pcre_ord2utf8.lo \ +@WITH_PCRE8_TRUE@ libpcre_la-pcre_refcount.lo \ +@WITH_PCRE8_TRUE@ libpcre_la-pcre_string_utils.lo \ +@WITH_PCRE8_TRUE@ libpcre_la-pcre_study.lo \ +@WITH_PCRE8_TRUE@ libpcre_la-pcre_tables.lo \ +@WITH_PCRE8_TRUE@ libpcre_la-pcre_ucd.lo \ +@WITH_PCRE8_TRUE@ libpcre_la-pcre_valid_utf8.lo \ +@WITH_PCRE8_TRUE@ libpcre_la-pcre_version.lo \ +@WITH_PCRE8_TRUE@ libpcre_la-pcre_xclass.lo +@WITH_PCRE8_TRUE@nodist_libpcre_la_OBJECTS = \ +@WITH_PCRE8_TRUE@ libpcre_la-pcre_chartables.lo +libpcre_la_OBJECTS = $(am_libpcre_la_OBJECTS) \ + $(nodist_libpcre_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +libpcre_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libpcre_la_CFLAGS) \ + $(CFLAGS) $(libpcre_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_PCRE8_TRUE@am_libpcre_la_rpath = -rpath $(libdir) +libpcre16_la_DEPENDENCIES = +am__libpcre16_la_SOURCES_DIST = pcre16_byte_order.c \ + pcre16_chartables.c pcre16_compile.c pcre16_config.c \ + pcre16_dfa_exec.c pcre16_exec.c pcre16_fullinfo.c pcre16_get.c \ + pcre16_globals.c pcre16_jit_compile.c pcre16_maketables.c \ + pcre16_newline.c pcre16_ord2utf16.c pcre16_refcount.c \ + pcre16_string_utils.c pcre16_study.c pcre16_tables.c \ + pcre16_ucd.c pcre16_utf16_utils.c pcre16_valid_utf16.c \ + pcre16_version.c pcre16_xclass.c +@WITH_PCRE16_TRUE@am_libpcre16_la_OBJECTS = \ +@WITH_PCRE16_TRUE@ libpcre16_la-pcre16_byte_order.lo \ +@WITH_PCRE16_TRUE@ libpcre16_la-pcre16_chartables.lo \ +@WITH_PCRE16_TRUE@ libpcre16_la-pcre16_compile.lo \ +@WITH_PCRE16_TRUE@ libpcre16_la-pcre16_config.lo \ +@WITH_PCRE16_TRUE@ libpcre16_la-pcre16_dfa_exec.lo \ +@WITH_PCRE16_TRUE@ libpcre16_la-pcre16_exec.lo \ +@WITH_PCRE16_TRUE@ libpcre16_la-pcre16_fullinfo.lo \ +@WITH_PCRE16_TRUE@ libpcre16_la-pcre16_get.lo \ +@WITH_PCRE16_TRUE@ libpcre16_la-pcre16_globals.lo \ +@WITH_PCRE16_TRUE@ libpcre16_la-pcre16_jit_compile.lo \ +@WITH_PCRE16_TRUE@ libpcre16_la-pcre16_maketables.lo \ +@WITH_PCRE16_TRUE@ libpcre16_la-pcre16_newline.lo \ +@WITH_PCRE16_TRUE@ libpcre16_la-pcre16_ord2utf16.lo \ +@WITH_PCRE16_TRUE@ libpcre16_la-pcre16_refcount.lo \ +@WITH_PCRE16_TRUE@ libpcre16_la-pcre16_string_utils.lo \ +@WITH_PCRE16_TRUE@ libpcre16_la-pcre16_study.lo \ +@WITH_PCRE16_TRUE@ libpcre16_la-pcre16_tables.lo \ +@WITH_PCRE16_TRUE@ libpcre16_la-pcre16_ucd.lo \ +@WITH_PCRE16_TRUE@ libpcre16_la-pcre16_utf16_utils.lo \ +@WITH_PCRE16_TRUE@ libpcre16_la-pcre16_valid_utf16.lo \ +@WITH_PCRE16_TRUE@ libpcre16_la-pcre16_version.lo \ +@WITH_PCRE16_TRUE@ libpcre16_la-pcre16_xclass.lo +@WITH_PCRE16_TRUE@nodist_libpcre16_la_OBJECTS = \ +@WITH_PCRE16_TRUE@ libpcre16_la-pcre_chartables.lo +libpcre16_la_OBJECTS = $(am_libpcre16_la_OBJECTS) \ + $(nodist_libpcre16_la_OBJECTS) +libpcre16_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libpcre16_la_CFLAGS) \ + $(CFLAGS) $(libpcre16_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_PCRE16_TRUE@am_libpcre16_la_rpath = -rpath $(libdir) +libpcre32_la_DEPENDENCIES = +am__libpcre32_la_SOURCES_DIST = pcre32_byte_order.c \ + pcre32_chartables.c pcre32_compile.c pcre32_config.c \ + pcre32_dfa_exec.c pcre32_exec.c pcre32_fullinfo.c pcre32_get.c \ + pcre32_globals.c pcre32_jit_compile.c pcre32_maketables.c \ + pcre32_newline.c pcre32_ord2utf32.c pcre32_refcount.c \ + pcre32_string_utils.c pcre32_study.c pcre32_tables.c \ + pcre32_ucd.c pcre32_utf32_utils.c pcre32_valid_utf32.c \ + pcre32_version.c pcre32_xclass.c +@WITH_PCRE32_TRUE@am_libpcre32_la_OBJECTS = \ +@WITH_PCRE32_TRUE@ libpcre32_la-pcre32_byte_order.lo \ +@WITH_PCRE32_TRUE@ libpcre32_la-pcre32_chartables.lo \ +@WITH_PCRE32_TRUE@ libpcre32_la-pcre32_compile.lo \ +@WITH_PCRE32_TRUE@ libpcre32_la-pcre32_config.lo \ +@WITH_PCRE32_TRUE@ libpcre32_la-pcre32_dfa_exec.lo \ +@WITH_PCRE32_TRUE@ libpcre32_la-pcre32_exec.lo \ +@WITH_PCRE32_TRUE@ libpcre32_la-pcre32_fullinfo.lo \ +@WITH_PCRE32_TRUE@ libpcre32_la-pcre32_get.lo \ +@WITH_PCRE32_TRUE@ libpcre32_la-pcre32_globals.lo \ +@WITH_PCRE32_TRUE@ libpcre32_la-pcre32_jit_compile.lo \ +@WITH_PCRE32_TRUE@ libpcre32_la-pcre32_maketables.lo \ +@WITH_PCRE32_TRUE@ libpcre32_la-pcre32_newline.lo \ +@WITH_PCRE32_TRUE@ libpcre32_la-pcre32_ord2utf32.lo \ +@WITH_PCRE32_TRUE@ libpcre32_la-pcre32_refcount.lo \ +@WITH_PCRE32_TRUE@ libpcre32_la-pcre32_string_utils.lo \ +@WITH_PCRE32_TRUE@ libpcre32_la-pcre32_study.lo \ +@WITH_PCRE32_TRUE@ libpcre32_la-pcre32_tables.lo \ +@WITH_PCRE32_TRUE@ libpcre32_la-pcre32_ucd.lo \ +@WITH_PCRE32_TRUE@ libpcre32_la-pcre32_utf32_utils.lo \ +@WITH_PCRE32_TRUE@ libpcre32_la-pcre32_valid_utf32.lo \ +@WITH_PCRE32_TRUE@ libpcre32_la-pcre32_version.lo \ +@WITH_PCRE32_TRUE@ libpcre32_la-pcre32_xclass.lo +@WITH_PCRE32_TRUE@nodist_libpcre32_la_OBJECTS = \ +@WITH_PCRE32_TRUE@ libpcre32_la-pcre_chartables.lo +libpcre32_la_OBJECTS = $(am_libpcre32_la_OBJECTS) \ + $(nodist_libpcre32_la_OBJECTS) +libpcre32_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libpcre32_la_CFLAGS) \ + $(CFLAGS) $(libpcre32_la_LDFLAGS) $(LDFLAGS) -o $@ +@WITH_PCRE32_TRUE@am_libpcre32_la_rpath = -rpath $(libdir) +@WITH_PCRE_CPP_TRUE@libpcrecpp_la_DEPENDENCIES = libpcre.la +am__libpcrecpp_la_SOURCES_DIST = pcrecpp_internal.h pcrecpp.cc \ + pcre_scanner.cc pcre_stringpiece.cc +@WITH_PCRE_CPP_TRUE@am_libpcrecpp_la_OBJECTS = \ +@WITH_PCRE_CPP_TRUE@ libpcrecpp_la-pcrecpp.lo \ +@WITH_PCRE_CPP_TRUE@ libpcrecpp_la-pcre_scanner.lo \ +@WITH_PCRE_CPP_TRUE@ libpcrecpp_la-pcre_stringpiece.lo +libpcrecpp_la_OBJECTS = $(am_libpcrecpp_la_OBJECTS) +libpcrecpp_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ + $(libpcrecpp_la_CXXFLAGS) $(CXXFLAGS) $(libpcrecpp_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +@WITH_PCRE_CPP_TRUE@am_libpcrecpp_la_rpath = -rpath $(libdir) +@WITH_PCRE8_TRUE@libpcreposix_la_DEPENDENCIES = libpcre.la +am__libpcreposix_la_SOURCES_DIST = pcreposix.c +@WITH_PCRE8_TRUE@am_libpcreposix_la_OBJECTS = \ +@WITH_PCRE8_TRUE@ libpcreposix_la-pcreposix.lo +libpcreposix_la_OBJECTS = $(am_libpcreposix_la_OBJECTS) +libpcreposix_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(libpcreposix_la_CFLAGS) $(CFLAGS) $(libpcreposix_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +@WITH_PCRE8_TRUE@am_libpcreposix_la_rpath = -rpath $(libdir) +am__dftables_SOURCES_DIST = dftables.c +@WITH_REBUILD_CHARTABLES_TRUE@am_dftables_OBJECTS = \ +@WITH_REBUILD_CHARTABLES_TRUE@ dftables.$(OBJEXT) +dftables_OBJECTS = $(am_dftables_OBJECTS) +dftables_LDADD = $(LDADD) +am__pcre_jit_test_SOURCES_DIST = pcre_jit_test.c +@WITH_JIT_TRUE@am_pcre_jit_test_OBJECTS = \ +@WITH_JIT_TRUE@ pcre_jit_test-pcre_jit_test.$(OBJEXT) +pcre_jit_test_OBJECTS = $(am_pcre_jit_test_OBJECTS) +am__DEPENDENCIES_1 = +@WITH_GCOV_TRUE@@WITH_JIT_TRUE@am__DEPENDENCIES_2 = \ +@WITH_GCOV_TRUE@@WITH_JIT_TRUE@ $(am__DEPENDENCIES_1) +@WITH_JIT_TRUE@pcre_jit_test_DEPENDENCIES = $(am__append_15) \ +@WITH_JIT_TRUE@ $(am__append_16) $(am__append_17) \ +@WITH_JIT_TRUE@ $(am__DEPENDENCIES_2) +pcre_jit_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(pcre_jit_test_CFLAGS) \ + $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +am__pcre_scanner_unittest_SOURCES_DIST = pcre_scanner_unittest.cc +@WITH_PCRE_CPP_TRUE@am_pcre_scanner_unittest_OBJECTS = pcre_scanner_unittest-pcre_scanner_unittest.$(OBJEXT) +pcre_scanner_unittest_OBJECTS = $(am_pcre_scanner_unittest_OBJECTS) +@WITH_GCOV_TRUE@@WITH_PCRE_CPP_TRUE@am__DEPENDENCIES_3 = \ +@WITH_GCOV_TRUE@@WITH_PCRE_CPP_TRUE@ $(am__DEPENDENCIES_1) +@WITH_PCRE_CPP_TRUE@pcre_scanner_unittest_DEPENDENCIES = \ +@WITH_PCRE_CPP_TRUE@ libpcrecpp.la $(am__DEPENDENCIES_3) +pcre_scanner_unittest_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ + $(pcre_scanner_unittest_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +am__pcre_stringpiece_unittest_SOURCES_DIST = \ + pcre_stringpiece_unittest.cc +@WITH_PCRE_CPP_TRUE@am_pcre_stringpiece_unittest_OBJECTS = pcre_stringpiece_unittest-pcre_stringpiece_unittest.$(OBJEXT) +pcre_stringpiece_unittest_OBJECTS = \ + $(am_pcre_stringpiece_unittest_OBJECTS) +@WITH_PCRE_CPP_TRUE@pcre_stringpiece_unittest_DEPENDENCIES = \ +@WITH_PCRE_CPP_TRUE@ libpcrecpp.la $(am__DEPENDENCIES_3) +pcre_stringpiece_unittest_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ + $(pcre_stringpiece_unittest_CXXFLAGS) $(CXXFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +am__pcrecpp_unittest_SOURCES_DIST = pcrecpp_unittest.cc +@WITH_PCRE_CPP_TRUE@am_pcrecpp_unittest_OBJECTS = pcrecpp_unittest-pcrecpp_unittest.$(OBJEXT) +pcrecpp_unittest_OBJECTS = $(am_pcrecpp_unittest_OBJECTS) +@WITH_PCRE_CPP_TRUE@pcrecpp_unittest_DEPENDENCIES = libpcrecpp.la \ +@WITH_PCRE_CPP_TRUE@ $(am__DEPENDENCIES_3) +pcrecpp_unittest_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ + $(pcrecpp_unittest_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +am__pcregrep_SOURCES_DIST = pcregrep.c +@WITH_PCRE8_TRUE@am_pcregrep_OBJECTS = pcregrep-pcregrep.$(OBJEXT) +pcregrep_OBJECTS = $(am_pcregrep_OBJECTS) +@WITH_GCOV_TRUE@@WITH_PCRE8_TRUE@am__DEPENDENCIES_4 = \ +@WITH_GCOV_TRUE@@WITH_PCRE8_TRUE@ $(am__DEPENDENCIES_1) +@WITH_PCRE8_TRUE@pcregrep_DEPENDENCIES = $(am__DEPENDENCIES_1) \ +@WITH_PCRE8_TRUE@ $(am__DEPENDENCIES_1) libpcre.la \ +@WITH_PCRE8_TRUE@ libpcreposix.la $(am__DEPENDENCIES_4) +pcregrep_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(pcregrep_CFLAGS) \ + $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +am__pcretest_SOURCES_DIST = pcretest.c pcre_printint.c \ + pcre16_printint.c pcre32_printint.c +@WITH_PCRE8_TRUE@am__objects_1 = pcretest-pcre_printint.$(OBJEXT) +@WITH_PCRE16_TRUE@am__objects_2 = pcretest-pcre16_printint.$(OBJEXT) +@WITH_PCRE32_TRUE@am__objects_3 = pcretest-pcre32_printint.$(OBJEXT) +am_pcretest_OBJECTS = pcretest-pcretest.$(OBJEXT) $(am__objects_1) \ + $(am__objects_2) $(am__objects_3) +pcretest_OBJECTS = $(am_pcretest_OBJECTS) +@WITH_GCOV_TRUE@am__DEPENDENCIES_5 = $(am__DEPENDENCIES_1) +pcretest_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__append_30) \ + $(am__append_32) $(am__append_34) $(am__DEPENDENCIES_5) +pcretest_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(pcretest_CFLAGS) \ + $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +am__dist_noinst_SCRIPTS_DIST = RunTest RunGrepTest +SCRIPTS = $(bin_SCRIPTS) $(dist_noinst_SCRIPTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/dftables.Po \ + ./$(DEPDIR)/libpcre16_la-pcre16_byte_order.Plo \ + ./$(DEPDIR)/libpcre16_la-pcre16_chartables.Plo \ + ./$(DEPDIR)/libpcre16_la-pcre16_compile.Plo \ + ./$(DEPDIR)/libpcre16_la-pcre16_config.Plo \ + ./$(DEPDIR)/libpcre16_la-pcre16_dfa_exec.Plo \ + ./$(DEPDIR)/libpcre16_la-pcre16_exec.Plo \ + ./$(DEPDIR)/libpcre16_la-pcre16_fullinfo.Plo \ + ./$(DEPDIR)/libpcre16_la-pcre16_get.Plo \ + ./$(DEPDIR)/libpcre16_la-pcre16_globals.Plo \ + ./$(DEPDIR)/libpcre16_la-pcre16_jit_compile.Plo \ + ./$(DEPDIR)/libpcre16_la-pcre16_maketables.Plo \ + ./$(DEPDIR)/libpcre16_la-pcre16_newline.Plo \ + ./$(DEPDIR)/libpcre16_la-pcre16_ord2utf16.Plo \ + ./$(DEPDIR)/libpcre16_la-pcre16_refcount.Plo \ + ./$(DEPDIR)/libpcre16_la-pcre16_string_utils.Plo \ + ./$(DEPDIR)/libpcre16_la-pcre16_study.Plo \ + ./$(DEPDIR)/libpcre16_la-pcre16_tables.Plo \ + ./$(DEPDIR)/libpcre16_la-pcre16_ucd.Plo \ + ./$(DEPDIR)/libpcre16_la-pcre16_utf16_utils.Plo \ + ./$(DEPDIR)/libpcre16_la-pcre16_valid_utf16.Plo \ + ./$(DEPDIR)/libpcre16_la-pcre16_version.Plo \ + ./$(DEPDIR)/libpcre16_la-pcre16_xclass.Plo \ + ./$(DEPDIR)/libpcre16_la-pcre_chartables.Plo \ + ./$(DEPDIR)/libpcre32_la-pcre32_byte_order.Plo \ + ./$(DEPDIR)/libpcre32_la-pcre32_chartables.Plo \ + ./$(DEPDIR)/libpcre32_la-pcre32_compile.Plo \ + ./$(DEPDIR)/libpcre32_la-pcre32_config.Plo \ + ./$(DEPDIR)/libpcre32_la-pcre32_dfa_exec.Plo \ + ./$(DEPDIR)/libpcre32_la-pcre32_exec.Plo \ + ./$(DEPDIR)/libpcre32_la-pcre32_fullinfo.Plo \ + ./$(DEPDIR)/libpcre32_la-pcre32_get.Plo \ + ./$(DEPDIR)/libpcre32_la-pcre32_globals.Plo \ + ./$(DEPDIR)/libpcre32_la-pcre32_jit_compile.Plo \ + ./$(DEPDIR)/libpcre32_la-pcre32_maketables.Plo \ + ./$(DEPDIR)/libpcre32_la-pcre32_newline.Plo \ + ./$(DEPDIR)/libpcre32_la-pcre32_ord2utf32.Plo \ + ./$(DEPDIR)/libpcre32_la-pcre32_refcount.Plo \ + ./$(DEPDIR)/libpcre32_la-pcre32_string_utils.Plo \ + ./$(DEPDIR)/libpcre32_la-pcre32_study.Plo \ + ./$(DEPDIR)/libpcre32_la-pcre32_tables.Plo \ + ./$(DEPDIR)/libpcre32_la-pcre32_ucd.Plo \ + ./$(DEPDIR)/libpcre32_la-pcre32_utf32_utils.Plo \ + ./$(DEPDIR)/libpcre32_la-pcre32_valid_utf32.Plo \ + ./$(DEPDIR)/libpcre32_la-pcre32_version.Plo \ + ./$(DEPDIR)/libpcre32_la-pcre32_xclass.Plo \ + ./$(DEPDIR)/libpcre32_la-pcre_chartables.Plo \ + ./$(DEPDIR)/libpcre_la-pcre_byte_order.Plo \ + ./$(DEPDIR)/libpcre_la-pcre_chartables.Plo \ + ./$(DEPDIR)/libpcre_la-pcre_compile.Plo \ + ./$(DEPDIR)/libpcre_la-pcre_config.Plo \ + ./$(DEPDIR)/libpcre_la-pcre_dfa_exec.Plo \ + ./$(DEPDIR)/libpcre_la-pcre_exec.Plo \ + ./$(DEPDIR)/libpcre_la-pcre_fullinfo.Plo \ + ./$(DEPDIR)/libpcre_la-pcre_get.Plo \ + ./$(DEPDIR)/libpcre_la-pcre_globals.Plo \ + ./$(DEPDIR)/libpcre_la-pcre_jit_compile.Plo \ + ./$(DEPDIR)/libpcre_la-pcre_maketables.Plo \ + ./$(DEPDIR)/libpcre_la-pcre_newline.Plo \ + ./$(DEPDIR)/libpcre_la-pcre_ord2utf8.Plo \ + ./$(DEPDIR)/libpcre_la-pcre_refcount.Plo \ + ./$(DEPDIR)/libpcre_la-pcre_string_utils.Plo \ + ./$(DEPDIR)/libpcre_la-pcre_study.Plo \ + ./$(DEPDIR)/libpcre_la-pcre_tables.Plo \ + ./$(DEPDIR)/libpcre_la-pcre_ucd.Plo \ + ./$(DEPDIR)/libpcre_la-pcre_valid_utf8.Plo \ + ./$(DEPDIR)/libpcre_la-pcre_version.Plo \ + ./$(DEPDIR)/libpcre_la-pcre_xclass.Plo \ + ./$(DEPDIR)/libpcrecpp_la-pcre_scanner.Plo \ + ./$(DEPDIR)/libpcrecpp_la-pcre_stringpiece.Plo \ + ./$(DEPDIR)/libpcrecpp_la-pcrecpp.Plo \ + ./$(DEPDIR)/libpcreposix_la-pcreposix.Plo \ + ./$(DEPDIR)/pcre_jit_test-pcre_jit_test.Po \ + ./$(DEPDIR)/pcre_scanner_unittest-pcre_scanner_unittest.Po \ + ./$(DEPDIR)/pcre_stringpiece_unittest-pcre_stringpiece_unittest.Po \ + ./$(DEPDIR)/pcrecpp_unittest-pcrecpp_unittest.Po \ + ./$(DEPDIR)/pcregrep-pcregrep.Po \ + ./$(DEPDIR)/pcretest-pcre16_printint.Po \ + ./$(DEPDIR)/pcretest-pcre32_printint.Po \ + ./$(DEPDIR)/pcretest-pcre_printint.Po \ + ./$(DEPDIR)/pcretest-pcretest.Po +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +am__v_CXX_1 = +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +am__v_CXXLD_1 = +SOURCES = $(libpcre_la_SOURCES) $(nodist_libpcre_la_SOURCES) \ + $(libpcre16_la_SOURCES) $(nodist_libpcre16_la_SOURCES) \ + $(libpcre32_la_SOURCES) $(nodist_libpcre32_la_SOURCES) \ + $(libpcrecpp_la_SOURCES) $(libpcreposix_la_SOURCES) \ + $(dftables_SOURCES) $(pcre_jit_test_SOURCES) \ + $(pcre_scanner_unittest_SOURCES) \ + $(pcre_stringpiece_unittest_SOURCES) \ + $(pcrecpp_unittest_SOURCES) $(pcregrep_SOURCES) \ + $(pcretest_SOURCES) +DIST_SOURCES = $(am__libpcre_la_SOURCES_DIST) \ + $(am__libpcre16_la_SOURCES_DIST) \ + $(am__libpcre32_la_SOURCES_DIST) \ + $(am__libpcrecpp_la_SOURCES_DIST) \ + $(am__libpcreposix_la_SOURCES_DIST) \ + $(am__dftables_SOURCES_DIST) $(am__pcre_jit_test_SOURCES_DIST) \ + $(am__pcre_scanner_unittest_SOURCES_DIST) \ + $(am__pcre_stringpiece_unittest_SOURCES_DIST) \ + $(am__pcrecpp_unittest_SOURCES_DIST) \ + $(am__pcregrep_SOURCES_DIST) $(am__pcretest_SOURCES_DIST) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +man1dir = $(mandir)/man1 +man3dir = $(mandir)/man3 +NROFF = nroff +MANS = $(dist_man_MANS) $(man_MANS) +DATA = $(dist_doc_DATA) $(dist_html_DATA) $(dist_noinst_DATA) \ + $(html_DATA) $(pkgconfig_DATA) +am__include_HEADERS_DIST = pcreposix.h pcrecpp.h pcre_scanner.h +HEADERS = $(include_HEADERS) $(nodist_include_HEADERS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ + $(LISP)config.h.in +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +CSCOPE = cscope +AM_RECURSIVE_TARGETS = cscope check recheck +am__tty_colors_dummy = \ + mgn= red= grn= lgn= blu= brg= std=; \ + am__color_tests=no +am__tty_colors = { \ + $(am__tty_colors_dummy); \ + if test "X$(AM_COLOR_TESTS)" = Xno; then \ + am__color_tests=no; \ + elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ + am__color_tests=yes; \ + elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ + am__color_tests=yes; \ + fi; \ + if test $$am__color_tests = yes; then \ + red=''; \ + grn=''; \ + lgn=''; \ + blu=''; \ + mgn=''; \ + brg=''; \ + std=''; \ + fi; \ +} +am__recheck_rx = ^[ ]*:recheck:[ ]* +am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* +am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* +# A command that, given a newline-separated list of test names on the +# standard input, print the name of the tests that are to be re-run +# upon "make recheck". +am__list_recheck_tests = $(AWK) '{ \ + recheck = 1; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + { \ + if ((getline line2 < ($$0 ".log")) < 0) \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ + { \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ + { \ + break; \ + } \ + }; \ + if (recheck) \ + print $$0; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# A command that, given a newline-separated list of test names on the +# standard input, create the global log from their .trs and .log files. +am__create_global_log = $(AWK) ' \ +function fatal(msg) \ +{ \ + print "fatal: making $@: " msg | "cat >&2"; \ + exit 1; \ +} \ +function rst_section(header) \ +{ \ + print header; \ + len = length(header); \ + for (i = 1; i <= len; i = i + 1) \ + printf "="; \ + printf "\n\n"; \ +} \ +{ \ + copy_in_global_log = 1; \ + global_test_result = "RUN"; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".trs"); \ + if (line ~ /$(am__global_test_result_rx)/) \ + { \ + sub("$(am__global_test_result_rx)", "", line); \ + sub("[ ]*$$", "", line); \ + global_test_result = line; \ + } \ + else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ + copy_in_global_log = 0; \ + }; \ + if (copy_in_global_log) \ + { \ + rst_section(global_test_result ": " $$0); \ + while ((rc = (getline line < ($$0 ".log"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".log"); \ + print line; \ + }; \ + printf "\n"; \ + }; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# Restructured Text title. +am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } +# Solaris 10 'make', and several other traditional 'make' implementations, +# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it +# by disabling -e (using the XSI extension "set +e") if it's set. +am__sh_e_setup = case $$- in *e*) set +e;; esac +# Default flags passed to test drivers. +am__common_driver_flags = \ + --color-tests "$$am__color_tests" \ + --enable-hard-errors "$$am__enable_hard_errors" \ + --expect-failure "$$am__expect_failure" +# To be inserted before the command running the test. Creates the +# directory for the log if needed. Stores in $dir the directory +# containing $f, in $tst the test, in $log the log. Executes the +# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and +# passes TESTS_ENVIRONMENT. Set up options for the wrapper that +# will run the test scripts (or their associated LOG_COMPILER, if +# thy have one). +am__check_pre = \ +$(am__sh_e_setup); \ +$(am__vpath_adj_setup) $(am__vpath_adj) \ +$(am__tty_colors); \ +srcdir=$(srcdir); export srcdir; \ +case "$@" in \ + */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ + *) am__odir=.;; \ +esac; \ +test "x$$am__odir" = x"." || test -d "$$am__odir" \ + || $(MKDIR_P) "$$am__odir" || exit $$?; \ +if test -f "./$$f"; then dir=./; \ +elif test -f "$$f"; then dir=; \ +else dir="$(srcdir)/"; fi; \ +tst=$$dir$$f; log='$@'; \ +if test -n '$(DISABLE_HARD_ERRORS)'; then \ + am__enable_hard_errors=no; \ +else \ + am__enable_hard_errors=yes; \ +fi; \ +case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ + am__expect_failure=yes;; \ + *) \ + am__expect_failure=no;; \ +esac; \ +$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) +# A shell command to get the names of the tests scripts with any registered +# extension removed (i.e., equivalently, the names of the test logs, with +# the '.log' extension removed). The result is saved in the shell variable +# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, +# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", +# since that might cause problem with VPATH rewrites for suffix-less tests. +# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. +am__set_TESTS_bases = \ + bases='$(TEST_LOGS)'; \ + bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ + bases=`echo $$bases` +RECHECK_LOGS = $(TEST_LOGS) +TEST_SUITE_LOG = test-suite.log +TEST_EXTENSIONS = @EXEEXT@ .test +LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) +am__set_b = \ + case '$@' in \ + */*) \ + case '$*' in \ + */*) b='$*';; \ + *) b=`echo '$@' | sed 's/\.log$$//'`; \ + esac;; \ + *) \ + b='$*';; \ + esac +am__test_logs1 = $(TESTS:=.log) +am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) +TEST_LOGS = $(am__test_logs2:.test.log=.log) +TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ + $(TEST_LOG_FLAGS) +am__DIST_COMMON = $(dist_man_MANS) $(srcdir)/Makefile.in \ + $(srcdir)/config.h.in $(srcdir)/libpcre.pc.in \ + $(srcdir)/libpcre16.pc.in $(srcdir)/libpcre32.pc.in \ + $(srcdir)/libpcrecpp.pc.in $(srcdir)/libpcreposix.pc.in \ + $(srcdir)/pcre-config.in $(srcdir)/pcre.h.in \ + $(srcdir)/pcre_stringpiece.h.in $(srcdir)/pcrecpparg.h.in \ + AUTHORS COPYING ChangeLog INSTALL NEWS README ar-lib compile \ + config.guess config.sub depcomp install-sh ltmain.sh missing \ + test-driver +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + if test -d "$(distdir)"; then \ + find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -rf "$(distdir)" \ + || { sleep 5 && rm -rf "$(distdir)"; }; \ + else :; fi +am__post_remove_distdir = $(am__remove_distdir) +DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2 $(distdir).zip +GZIP_ENV = --best +DIST_TARGETS = dist-bzip2 dist-gzip dist-zip +distuninstallcheck_listfiles = find . -type f -print +am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ + | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' +distcleancheck_listfiles = find . -type f -print +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +EXTRA_LIBPCRE16_LDFLAGS = @EXTRA_LIBPCRE16_LDFLAGS@ +EXTRA_LIBPCRE32_LDFLAGS = @EXTRA_LIBPCRE32_LDFLAGS@ +EXTRA_LIBPCRECPP_LDFLAGS = @EXTRA_LIBPCRECPP_LDFLAGS@ +EXTRA_LIBPCREPOSIX_LDFLAGS = @EXTRA_LIBPCREPOSIX_LDFLAGS@ +EXTRA_LIBPCRE_LDFLAGS = @EXTRA_LIBPCRE_LDFLAGS@ +FGREP = @FGREP@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_CXXFLAGS = @GCOV_CXXFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GENHTML = @GENHTML@ +GREP = @GREP@ +HAVE_VISIBILITY = @HAVE_VISIBILITY@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LCOV = @LCOV@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBBZ2 = @LIBBZ2@ +LIBOBJS = @LIBOBJS@ +LIBREADLINE = @LIBREADLINE@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBZ = @LIBZ@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PCRE_DATE = @PCRE_DATE@ +PCRE_MAJOR = @PCRE_MAJOR@ +PCRE_MINOR = @PCRE_MINOR@ +PCRE_PRERELEASE = @PCRE_PRERELEASE@ +PCRE_STATIC_CFLAG = @PCRE_STATIC_CFLAG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHTOOL = @SHTOOL@ +STRIP = @STRIP@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VERSION = @VERSION@ +VISIBILITY_CFLAGS = @VISIBILITY_CFLAGS@ +VISIBILITY_CXXFLAGS = @VISIBILITY_CXXFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +ax_pthread_config = @ax_pthread_config@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +enable_cpp = @enable_cpp@ +enable_pcre16 = @enable_pcre16@ +enable_pcre32 = @enable_pcre32@ +enable_pcre8 = @enable_pcre8@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pcre_have_bits_type_traits = @pcre_have_bits_type_traits@ +pcre_have_long_long = @pcre_have_long_long@ +pcre_have_type_traits = @pcre_have_type_traits@ +pcre_have_ulong_long = @pcre_have_ulong_long@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +ACLOCAL_AMFLAGS = -I m4 +dist_doc_DATA = \ + doc/pcre.txt \ + doc/pcre-config.txt \ + doc/pcregrep.txt \ + doc/pcretest.txt \ + AUTHORS \ + COPYING \ + ChangeLog \ + LICENCE \ + NEWS \ + README + + +# Note that pcrecpp.html is not in this list; it is listed separately below. +dist_html_DATA = \ + doc/html/NON-AUTOTOOLS-BUILD.txt \ + doc/html/README.txt \ + doc/html/index.html \ + doc/html/pcre-config.html \ + doc/html/pcre.html \ + doc/html/pcre16.html \ + doc/html/pcre32.html \ + doc/html/pcre_assign_jit_stack.html \ + doc/html/pcre_compile.html \ + doc/html/pcre_compile2.html \ + doc/html/pcre_config.html \ + doc/html/pcre_copy_named_substring.html \ + doc/html/pcre_copy_substring.html \ + doc/html/pcre_dfa_exec.html \ + doc/html/pcre_exec.html \ + doc/html/pcre_free_study.html \ + doc/html/pcre_free_substring.html \ + doc/html/pcre_free_substring_list.html \ + doc/html/pcre_fullinfo.html \ + doc/html/pcre_get_named_substring.html \ + doc/html/pcre_get_stringnumber.html \ + doc/html/pcre_get_stringtable_entries.html \ + doc/html/pcre_get_substring.html \ + doc/html/pcre_get_substring_list.html \ + doc/html/pcre_jit_exec.html \ + doc/html/pcre_jit_stack_alloc.html \ + doc/html/pcre_jit_stack_free.html \ + doc/html/pcre_maketables.html \ + doc/html/pcre_pattern_to_host_byte_order.html \ + doc/html/pcre_refcount.html \ + doc/html/pcre_study.html \ + doc/html/pcre_utf16_to_host_byte_order.html \ + doc/html/pcre_utf32_to_host_byte_order.html \ + doc/html/pcre_version.html \ + doc/html/pcreapi.html \ + doc/html/pcrebuild.html \ + doc/html/pcrecallout.html \ + doc/html/pcrecompat.html \ + doc/html/pcredemo.html \ + doc/html/pcregrep.html \ + doc/html/pcrejit.html \ + doc/html/pcrelimits.html \ + doc/html/pcrematching.html \ + doc/html/pcrepartial.html \ + doc/html/pcrepattern.html \ + doc/html/pcreperform.html \ + doc/html/pcreposix.html \ + doc/html/pcreprecompile.html \ + doc/html/pcresample.html \ + doc/html/pcrestack.html \ + doc/html/pcresyntax.html \ + doc/html/pcretest.html \ + doc/html/pcreunicode.html + +pcrecpp_html = doc/html/pcrecpp.html +dist_noinst_DATA = $(pcrecpp_html) +@WITH_PCRE_CPP_TRUE@html_DATA = $(pcrecpp_html) + +# The Libtool libraries to install. We'll add to this later. +lib_LTLIBRARIES = $(am__append_4) $(am__append_5) $(am__append_6) \ + $(am__append_20) $(am__append_22) +check_SCRIPTS = +dist_noinst_SCRIPTS = RunTest $(am__append_39) + +# Additional files to delete on 'make clean' and 'make maintainer-clean'. +CLEANFILES = pcre_chartables.c testsavedregex teststderr testtemp* \ + testtry testNinput testtrygrep teststderrgrep testNinputgrep +MAINTAINERCLEANFILES = pcre.h.generic config.h.generic + +# Additional files to bundle with the distribution, over and above what +# the Autotools include by default. + +# These files contain additional m4 macros that are used by autoconf. + +# These files contain maintenance information + +# These files are used in the preparation of a release + +# These files are to do with building for Virtual Pascal + +# These files are usable versions of pcre.h and config.h that are distributed +# for the benefit of people who are building PCRE manually, without the +# Autotools support. + +# The pcre_chartables.c.dist file is the default version of pcre_chartables.c, +# used unless --enable-rebuild-chartables is specified. + +# The JIT compiler lives in a separate directory, but its files are #included +# when pcre_jit_compile.c is processed, so they must be distributed. + +# PCRE demonstration program. No longer built automatcally. The point is that +# the users should build it themselves. So just distribute the source. +# noinst_PROGRAMS += pcredemo +# pcredemo_SOURCES = pcredemo.c +# pcredemo_LDADD = libpcre.la +EXTRA_DIST = m4/ax_pthread.m4 m4/pcre_visibility.m4 doc/perltest.txt \ + NON-UNIX-USE NON-AUTOTOOLS-BUILD HACKING PrepareRelease \ + CheckMan CleanTxt Detrail 132html doc/index.html.src \ + makevp.bat makevp_c.txt makevp_l.txt pcregexp.pas \ + pcre.h.generic config.h.generic pcre_chartables.c.dist \ + sljit/sljitConfig.h sljit/sljitConfigInternal.h \ + sljit/sljitExecAllocator.c sljit/sljitLir.c sljit/sljitLir.h \ + sljit/sljitNativeARM_32.c sljit/sljitNativeARM_64.c \ + sljit/sljitNativeARM_T2_32.c sljit/sljitNativeMIPS_32.c \ + sljit/sljitNativeMIPS_64.c sljit/sljitNativeMIPS_common.c \ + sljit/sljitNativePPC_32.c sljit/sljitNativePPC_64.c \ + sljit/sljitNativePPC_common.c sljit/sljitNativeSPARC_32.c \ + sljit/sljitNativeSPARC_common.c sljit/sljitNativeTILEGX_64.c \ + sljit/sljitNativeTILEGX-encoder.c sljit/sljitNativeX86_32.c \ + sljit/sljitNativeX86_64.c sljit/sljitNativeX86_common.c \ + sljit/sljitUtils.c RunTest.bat testdata/grepbinary \ + testdata/grepfilelist testdata/grepinput testdata/grepinput3 \ + testdata/grepinput8 testdata/grepinputv testdata/grepinputx \ + testdata/greplist testdata/grepoutput testdata/grepoutput8 \ + testdata/grepoutputN testdata/greppatN4 testdata/saved16 \ + testdata/saved16BE-1 testdata/saved16BE-2 testdata/saved16LE-1 \ + testdata/saved16LE-2 testdata/saved32 testdata/saved32BE-1 \ + testdata/saved32BE-2 testdata/saved32LE-1 testdata/saved32LE-2 \ + testdata/saved8 testdata/testinput1 testdata/testinput2 \ + testdata/testinput3 testdata/testinput4 testdata/testinput5 \ + testdata/testinput6 testdata/testinput7 testdata/testinput8 \ + testdata/testinput9 testdata/testinput10 testdata/testinput11 \ + testdata/testinput12 testdata/testinput13 testdata/testinput14 \ + testdata/testinput15 testdata/testinput16 testdata/testinput17 \ + testdata/testinput18 testdata/testinput19 testdata/testinput20 \ + testdata/testinput21 testdata/testinput22 testdata/testinput23 \ + testdata/testinput24 testdata/testinput25 testdata/testinput26 \ + testdata/testinputEBC testdata/testoutput1 \ + testdata/testoutput2 testdata/testoutput3 \ + testdata/testoutput3A testdata/testoutput3B \ + testdata/testoutput4 testdata/testoutput5 testdata/testoutput6 \ + testdata/testoutput7 testdata/testoutput8 testdata/testoutput9 \ + testdata/testoutput10 testdata/testoutput11-8 \ + testdata/testoutput11-16 testdata/testoutput11-32 \ + testdata/testoutput12 testdata/testoutput13 \ + testdata/testoutput14 testdata/testoutput15 \ + testdata/testoutput16 testdata/testoutput17 \ + testdata/testoutput18-16 testdata/testoutput18-32 \ + testdata/testoutput19 testdata/testoutput20 \ + testdata/testoutput21-16 testdata/testoutput21-32 \ + testdata/testoutput22-16 testdata/testoutput22-32 \ + testdata/testoutput23 testdata/testoutput24 \ + testdata/testoutput25 testdata/testoutput26 \ + testdata/testoutputEBC testdata/valgrind-jit.supp \ + testdata/wintestinput3 testdata/wintestoutput3 perltest.pl \ + pcredemo.c $(pcrecpp_man) cmake/COPYING-CMAKE-SCRIPTS \ + cmake/FindPackageHandleStandardArgs.cmake \ + cmake/FindReadline.cmake cmake/FindEditline.cmake \ + CMakeLists.txt config-cmake.h.in + +# These are the header files we'll install. We do not distribute pcre.h because +# it is generated from pcre.h.in. +nodist_include_HEADERS = pcre.h $(am__append_1) +include_HEADERS = pcreposix.h $(am__append_2) +bin_SCRIPTS = pcre-config +@WITH_REBUILD_CHARTABLES_TRUE@dftables_SOURCES = dftables.c +BUILT_SOURCES = pcre_chartables.c +@WITH_PCRE8_TRUE@libpcre_la_SOURCES = \ +@WITH_PCRE8_TRUE@ pcre_byte_order.c \ +@WITH_PCRE8_TRUE@ pcre_compile.c \ +@WITH_PCRE8_TRUE@ pcre_config.c \ +@WITH_PCRE8_TRUE@ pcre_dfa_exec.c \ +@WITH_PCRE8_TRUE@ pcre_exec.c \ +@WITH_PCRE8_TRUE@ pcre_fullinfo.c \ +@WITH_PCRE8_TRUE@ pcre_get.c \ +@WITH_PCRE8_TRUE@ pcre_globals.c \ +@WITH_PCRE8_TRUE@ pcre_internal.h \ +@WITH_PCRE8_TRUE@ pcre_jit_compile.c \ +@WITH_PCRE8_TRUE@ pcre_maketables.c \ +@WITH_PCRE8_TRUE@ pcre_newline.c \ +@WITH_PCRE8_TRUE@ pcre_ord2utf8.c \ +@WITH_PCRE8_TRUE@ pcre_refcount.c \ +@WITH_PCRE8_TRUE@ pcre_string_utils.c \ +@WITH_PCRE8_TRUE@ pcre_study.c \ +@WITH_PCRE8_TRUE@ pcre_tables.c \ +@WITH_PCRE8_TRUE@ pcre_ucd.c \ +@WITH_PCRE8_TRUE@ pcre_valid_utf8.c \ +@WITH_PCRE8_TRUE@ pcre_version.c \ +@WITH_PCRE8_TRUE@ pcre_xclass.c \ +@WITH_PCRE8_TRUE@ ucp.h + +@WITH_PCRE8_TRUE@libpcre_la_CFLAGS = $(VISIBILITY_CFLAGS) $(AM_CFLAGS) \ +@WITH_PCRE8_TRUE@ $(am__append_7) $(am__append_10) +@WITH_PCRE8_TRUE@libpcre_la_LIBADD = +@WITH_PCRE8_TRUE@nodist_libpcre_la_SOURCES = \ +@WITH_PCRE8_TRUE@ pcre_chartables.c + +@WITH_PCRE16_TRUE@libpcre16_la_SOURCES = \ +@WITH_PCRE16_TRUE@ pcre16_byte_order.c \ +@WITH_PCRE16_TRUE@ pcre16_chartables.c \ +@WITH_PCRE16_TRUE@ pcre16_compile.c \ +@WITH_PCRE16_TRUE@ pcre16_config.c \ +@WITH_PCRE16_TRUE@ pcre16_dfa_exec.c \ +@WITH_PCRE16_TRUE@ pcre16_exec.c \ +@WITH_PCRE16_TRUE@ pcre16_fullinfo.c \ +@WITH_PCRE16_TRUE@ pcre16_get.c \ +@WITH_PCRE16_TRUE@ pcre16_globals.c \ +@WITH_PCRE16_TRUE@ pcre16_jit_compile.c \ +@WITH_PCRE16_TRUE@ pcre16_maketables.c \ +@WITH_PCRE16_TRUE@ pcre16_newline.c \ +@WITH_PCRE16_TRUE@ pcre16_ord2utf16.c \ +@WITH_PCRE16_TRUE@ pcre16_refcount.c \ +@WITH_PCRE16_TRUE@ pcre16_string_utils.c \ +@WITH_PCRE16_TRUE@ pcre16_study.c \ +@WITH_PCRE16_TRUE@ pcre16_tables.c \ +@WITH_PCRE16_TRUE@ pcre16_ucd.c \ +@WITH_PCRE16_TRUE@ pcre16_utf16_utils.c \ +@WITH_PCRE16_TRUE@ pcre16_valid_utf16.c \ +@WITH_PCRE16_TRUE@ pcre16_version.c \ +@WITH_PCRE16_TRUE@ pcre16_xclass.c + +@WITH_PCRE16_TRUE@libpcre16_la_CFLAGS = $(VISIBILITY_CFLAGS) \ +@WITH_PCRE16_TRUE@ $(AM_CFLAGS) $(am__append_8) \ +@WITH_PCRE16_TRUE@ $(am__append_11) +@WITH_PCRE16_TRUE@libpcre16_la_LIBADD = +@WITH_PCRE16_TRUE@nodist_libpcre16_la_SOURCES = \ +@WITH_PCRE16_TRUE@ pcre_chartables.c + +@WITH_PCRE32_TRUE@libpcre32_la_SOURCES = \ +@WITH_PCRE32_TRUE@ pcre32_byte_order.c \ +@WITH_PCRE32_TRUE@ pcre32_chartables.c \ +@WITH_PCRE32_TRUE@ pcre32_compile.c \ +@WITH_PCRE32_TRUE@ pcre32_config.c \ +@WITH_PCRE32_TRUE@ pcre32_dfa_exec.c \ +@WITH_PCRE32_TRUE@ pcre32_exec.c \ +@WITH_PCRE32_TRUE@ pcre32_fullinfo.c \ +@WITH_PCRE32_TRUE@ pcre32_get.c \ +@WITH_PCRE32_TRUE@ pcre32_globals.c \ +@WITH_PCRE32_TRUE@ pcre32_jit_compile.c \ +@WITH_PCRE32_TRUE@ pcre32_maketables.c \ +@WITH_PCRE32_TRUE@ pcre32_newline.c \ +@WITH_PCRE32_TRUE@ pcre32_ord2utf32.c \ +@WITH_PCRE32_TRUE@ pcre32_refcount.c \ +@WITH_PCRE32_TRUE@ pcre32_string_utils.c \ +@WITH_PCRE32_TRUE@ pcre32_study.c \ +@WITH_PCRE32_TRUE@ pcre32_tables.c \ +@WITH_PCRE32_TRUE@ pcre32_ucd.c \ +@WITH_PCRE32_TRUE@ pcre32_utf32_utils.c \ +@WITH_PCRE32_TRUE@ pcre32_valid_utf32.c \ +@WITH_PCRE32_TRUE@ pcre32_version.c \ +@WITH_PCRE32_TRUE@ pcre32_xclass.c + +@WITH_PCRE32_TRUE@libpcre32_la_CFLAGS = $(VISIBILITY_CFLAGS) \ +@WITH_PCRE32_TRUE@ $(AM_CFLAGS) $(am__append_9) \ +@WITH_PCRE32_TRUE@ $(am__append_12) +@WITH_PCRE32_TRUE@libpcre32_la_LIBADD = +@WITH_PCRE32_TRUE@nodist_libpcre32_la_SOURCES = \ +@WITH_PCRE32_TRUE@ pcre_chartables.c + +@WITH_PCRE8_TRUE@libpcre_la_LDFLAGS = $(EXTRA_LIBPCRE_LDFLAGS) +@WITH_PCRE16_TRUE@libpcre16_la_LDFLAGS = $(EXTRA_LIBPCRE16_LDFLAGS) +@WITH_PCRE32_TRUE@libpcre32_la_LDFLAGS = $(EXTRA_LIBPCRE32_LDFLAGS) +@WITH_JIT_TRUE@pcre_jit_test_SOURCES = pcre_jit_test.c +@WITH_JIT_TRUE@pcre_jit_test_CFLAGS = $(AM_CFLAGS) $(am__append_18) +@WITH_JIT_TRUE@pcre_jit_test_LDADD = $(am__append_15) $(am__append_16) \ +@WITH_JIT_TRUE@ $(am__append_17) $(am__append_19) +@WITH_PCRE8_TRUE@libpcreposix_la_SOURCES = \ +@WITH_PCRE8_TRUE@ pcreposix.c + +@WITH_PCRE8_TRUE@libpcreposix_la_CFLAGS = $(VISIBILITY_CFLAGS) \ +@WITH_PCRE8_TRUE@ $(AM_CFLAGS) $(am__append_21) +@WITH_PCRE8_TRUE@libpcreposix_la_LDFLAGS = $(EXTRA_LIBPCREPOSIX_LDFLAGS) +@WITH_PCRE8_TRUE@libpcreposix_la_LIBADD = libpcre.la +@WITH_PCRE_CPP_TRUE@libpcrecpp_la_SOURCES = \ +@WITH_PCRE_CPP_TRUE@ pcrecpp_internal.h \ +@WITH_PCRE_CPP_TRUE@ pcrecpp.cc \ +@WITH_PCRE_CPP_TRUE@ pcre_scanner.cc \ +@WITH_PCRE_CPP_TRUE@ pcre_stringpiece.cc + +@WITH_PCRE_CPP_TRUE@libpcrecpp_la_CXXFLAGS = $(VISIBILITY_CXXFLAGS) \ +@WITH_PCRE_CPP_TRUE@ $(AM_CXXFLAGS) $(am__append_25) +@WITH_PCRE_CPP_TRUE@libpcrecpp_la_LDFLAGS = $(EXTRA_LIBPCRECPP_LDFLAGS) +@WITH_PCRE_CPP_TRUE@libpcrecpp_la_LIBADD = libpcre.la +@WITH_PCRE_CPP_TRUE@pcrecpp_unittest_SOURCES = pcrecpp_unittest.cc +@WITH_PCRE_CPP_TRUE@pcrecpp_unittest_CXXFLAGS = $(AM_CXXFLAGS) +@WITH_PCRE_CPP_TRUE@pcrecpp_unittest_LDADD = libpcrecpp.la \ +@WITH_PCRE_CPP_TRUE@ $(am__append_26) +@WITH_PCRE_CPP_TRUE@pcre_scanner_unittest_SOURCES = pcre_scanner_unittest.cc +@WITH_PCRE_CPP_TRUE@pcre_scanner_unittest_CXXFLAGS = $(AM_CXXFLAGS) +@WITH_PCRE_CPP_TRUE@pcre_scanner_unittest_LDADD = libpcrecpp.la \ +@WITH_PCRE_CPP_TRUE@ $(am__append_27) +@WITH_PCRE_CPP_TRUE@pcre_stringpiece_unittest_SOURCES = pcre_stringpiece_unittest.cc +@WITH_PCRE_CPP_TRUE@pcre_stringpiece_unittest_CXXFLAGS = $(AM_CXXFLAGS) +@WITH_PCRE_CPP_TRUE@pcre_stringpiece_unittest_LDADD = libpcrecpp.la \ +@WITH_PCRE_CPP_TRUE@ $(am__append_28) +pcretest_SOURCES = pcretest.c $(am__append_29) $(am__append_31) \ + $(am__append_33) +pcretest_CFLAGS = $(AM_CFLAGS) $(am__append_35) $(am__append_36) +pcretest_LDADD = $(LIBREADLINE) $(am__append_30) $(am__append_32) \ + $(am__append_34) $(am__append_37) +@WITH_PCRE8_TRUE@pcregrep_SOURCES = pcregrep.c +@WITH_PCRE8_TRUE@pcregrep_CFLAGS = $(AM_CFLAGS) $(am__append_41) +@WITH_PCRE8_TRUE@pcregrep_LDADD = $(LIBZ) $(LIBBZ2) libpcre.la \ +@WITH_PCRE8_TRUE@ libpcreposix.la $(am__append_42) + +# A PCRE user submitted the following addition, saying that it "will allow +# anyone using the 'mingw32' compiler to simply type 'make pcre.dll' and get a +# nice DLL for Windows use". (It is used by the pcre.dll target.) +DLL_OBJS = pcre_byte_order.o pcre_compile.o pcre_config.o \ + pcre_dfa_exec.o pcre_exec.o pcre_fullinfo.o pcre_get.o \ + pcre_globals.o pcre_jit_compile.o pcre_maketables.o \ + pcre_newline.o pcre_ord2utf8.o pcre_refcount.o \ + pcre_study.o pcre_tables.o pcre_ucd.o \ + pcre_valid_utf8.o pcre_version.o pcre_chartables.o \ + pcre_xclass.o + + +# We have .pc files for pkg-config users. +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = libpcre.pc libpcreposix.pc $(am__append_43) \ + $(am__append_44) $(am__append_45) + +# Note that pcrecpp.3 is not in this list, but is included separately below. +dist_man_MANS = \ + doc/pcre-config.1 \ + doc/pcre.3 \ + doc/pcre16.3 \ + doc/pcre32.3 \ + doc/pcre_assign_jit_stack.3 \ + doc/pcre_compile.3 \ + doc/pcre_compile2.3 \ + doc/pcre_config.3 \ + doc/pcre_copy_named_substring.3 \ + doc/pcre_copy_substring.3 \ + doc/pcre_dfa_exec.3 \ + doc/pcre_exec.3 \ + doc/pcre_free_study.3 \ + doc/pcre_free_substring.3 \ + doc/pcre_free_substring_list.3 \ + doc/pcre_fullinfo.3 \ + doc/pcre_get_named_substring.3 \ + doc/pcre_get_stringnumber.3 \ + doc/pcre_get_stringtable_entries.3 \ + doc/pcre_get_substring.3 \ + doc/pcre_get_substring_list.3 \ + doc/pcre_jit_exec.3 \ + doc/pcre_jit_stack_alloc.3 \ + doc/pcre_jit_stack_free.3 \ + doc/pcre_maketables.3 \ + doc/pcre_pattern_to_host_byte_order.3 \ + doc/pcre_refcount.3 \ + doc/pcre_study.3 \ + doc/pcre_utf16_to_host_byte_order.3 \ + doc/pcre_utf32_to_host_byte_order.3 \ + doc/pcre_version.3 \ + doc/pcreapi.3 \ + doc/pcrebuild.3 \ + doc/pcrecallout.3 \ + doc/pcrecompat.3 \ + doc/pcredemo.3 \ + doc/pcregrep.1 \ + doc/pcrejit.3 \ + doc/pcrelimits.3 \ + doc/pcrematching.3 \ + doc/pcrepartial.3 \ + doc/pcrepattern.3 \ + doc/pcreperform.3 \ + doc/pcreposix.3 \ + doc/pcreprecompile.3 \ + doc/pcresample.3 \ + doc/pcrestack.3 \ + doc/pcresyntax.3 \ + doc/pcretest.1 \ + doc/pcreunicode.3 + +pcrecpp_man = doc/pcrecpp.3 +@WITH_PCRE_CPP_TRUE@man_MANS = $(pcrecpp_man) + +# gcov/lcov code coverage reporting + +# Coverage reporting targets: +# +# coverage: Create a coverage report from 'make check' +# coverage-baseline: Capture baseline coverage information +# coverage-reset: This zeros the coverage counters only +# coverage-report: This creates the coverage report only +# coverage-clean-report: This removes the generated coverage report +# without cleaning the coverage data itself +# coverage-clean-data: This removes the captured coverage data without +# removing the coverage files created at compile time (*.gcno) +# coverage-clean: This cleans all coverage data including the generated +# coverage report. +@WITH_GCOV_TRUE@COVERAGE_TEST_NAME = $(PACKAGE) +@WITH_GCOV_TRUE@COVERAGE_NAME = $(PACKAGE)-$(VERSION) +@WITH_GCOV_TRUE@COVERAGE_OUTPUT_FILE = $(COVERAGE_NAME)-coverage.info +@WITH_GCOV_TRUE@COVERAGE_OUTPUT_DIR = $(COVERAGE_NAME)-coverage +@WITH_GCOV_TRUE@COVERAGE_LCOV_EXTRA_FLAGS = +@WITH_GCOV_TRUE@COVERAGE_GENHTML_EXTRA_FLAGS = +@WITH_GCOV_TRUE@coverage_quiet = $(coverage_quiet_$(V)) +@WITH_GCOV_TRUE@coverage_quiet_ = $(coverage_quiet_$(AM_DEFAULT_VERBOSITY)) +@WITH_GCOV_TRUE@coverage_quiet_0 = --quiet +all: $(BUILT_SOURCES) config.h + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .cc .lo .log .o .obj .test .test$(EXEEXT) .trs +am--refresh: Makefile + @: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: $(am__configure_deps) + $(am__cd) $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): + +config.h: stamp-h1 + @test -f $@ || rm -f stamp-h1 + @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 + +stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status + @rm -f stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status config.h +$(srcdir)/config.h.in: $(am__configure_deps) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) + rm -f stamp-h1 + touch $@ + +distclean-hdr: + -rm -f config.h stamp-h1 +libpcre.pc: $(top_builddir)/config.status $(srcdir)/libpcre.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +libpcre16.pc: $(top_builddir)/config.status $(srcdir)/libpcre16.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +libpcre32.pc: $(top_builddir)/config.status $(srcdir)/libpcre32.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +libpcreposix.pc: $(top_builddir)/config.status $(srcdir)/libpcreposix.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +libpcrecpp.pc: $(top_builddir)/config.status $(srcdir)/libpcrecpp.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +pcre-config: $(top_builddir)/config.status $(srcdir)/pcre-config.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +pcre.h: $(top_builddir)/config.status $(srcdir)/pcre.h.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +pcre_stringpiece.h: $(top_builddir)/config.status $(srcdir)/pcre_stringpiece.h.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +pcrecpparg.h: $(top_builddir)/config.status $(srcdir)/pcrecpparg.h.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ + fi; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p \ + || test -f $$p1 \ + ; then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' \ + -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' \ + `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +libpcre.la: $(libpcre_la_OBJECTS) $(libpcre_la_DEPENDENCIES) $(EXTRA_libpcre_la_DEPENDENCIES) + $(AM_V_CCLD)$(libpcre_la_LINK) $(am_libpcre_la_rpath) $(libpcre_la_OBJECTS) $(libpcre_la_LIBADD) $(LIBS) + +libpcre16.la: $(libpcre16_la_OBJECTS) $(libpcre16_la_DEPENDENCIES) $(EXTRA_libpcre16_la_DEPENDENCIES) + $(AM_V_CCLD)$(libpcre16_la_LINK) $(am_libpcre16_la_rpath) $(libpcre16_la_OBJECTS) $(libpcre16_la_LIBADD) $(LIBS) + +libpcre32.la: $(libpcre32_la_OBJECTS) $(libpcre32_la_DEPENDENCIES) $(EXTRA_libpcre32_la_DEPENDENCIES) + $(AM_V_CCLD)$(libpcre32_la_LINK) $(am_libpcre32_la_rpath) $(libpcre32_la_OBJECTS) $(libpcre32_la_LIBADD) $(LIBS) + +libpcrecpp.la: $(libpcrecpp_la_OBJECTS) $(libpcrecpp_la_DEPENDENCIES) $(EXTRA_libpcrecpp_la_DEPENDENCIES) + $(AM_V_CXXLD)$(libpcrecpp_la_LINK) $(am_libpcrecpp_la_rpath) $(libpcrecpp_la_OBJECTS) $(libpcrecpp_la_LIBADD) $(LIBS) + +libpcreposix.la: $(libpcreposix_la_OBJECTS) $(libpcreposix_la_DEPENDENCIES) $(EXTRA_libpcreposix_la_DEPENDENCIES) + $(AM_V_CCLD)$(libpcreposix_la_LINK) $(am_libpcreposix_la_rpath) $(libpcreposix_la_OBJECTS) $(libpcreposix_la_LIBADD) $(LIBS) + +dftables$(EXEEXT): $(dftables_OBJECTS) $(dftables_DEPENDENCIES) $(EXTRA_dftables_DEPENDENCIES) + @rm -f dftables$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(dftables_OBJECTS) $(dftables_LDADD) $(LIBS) + +pcre_jit_test$(EXEEXT): $(pcre_jit_test_OBJECTS) $(pcre_jit_test_DEPENDENCIES) $(EXTRA_pcre_jit_test_DEPENDENCIES) + @rm -f pcre_jit_test$(EXEEXT) + $(AM_V_CCLD)$(pcre_jit_test_LINK) $(pcre_jit_test_OBJECTS) $(pcre_jit_test_LDADD) $(LIBS) + +pcre_scanner_unittest$(EXEEXT): $(pcre_scanner_unittest_OBJECTS) $(pcre_scanner_unittest_DEPENDENCIES) $(EXTRA_pcre_scanner_unittest_DEPENDENCIES) + @rm -f pcre_scanner_unittest$(EXEEXT) + $(AM_V_CXXLD)$(pcre_scanner_unittest_LINK) $(pcre_scanner_unittest_OBJECTS) $(pcre_scanner_unittest_LDADD) $(LIBS) + +pcre_stringpiece_unittest$(EXEEXT): $(pcre_stringpiece_unittest_OBJECTS) $(pcre_stringpiece_unittest_DEPENDENCIES) $(EXTRA_pcre_stringpiece_unittest_DEPENDENCIES) + @rm -f pcre_stringpiece_unittest$(EXEEXT) + $(AM_V_CXXLD)$(pcre_stringpiece_unittest_LINK) $(pcre_stringpiece_unittest_OBJECTS) $(pcre_stringpiece_unittest_LDADD) $(LIBS) + +pcrecpp_unittest$(EXEEXT): $(pcrecpp_unittest_OBJECTS) $(pcrecpp_unittest_DEPENDENCIES) $(EXTRA_pcrecpp_unittest_DEPENDENCIES) + @rm -f pcrecpp_unittest$(EXEEXT) + $(AM_V_CXXLD)$(pcrecpp_unittest_LINK) $(pcrecpp_unittest_OBJECTS) $(pcrecpp_unittest_LDADD) $(LIBS) + +pcregrep$(EXEEXT): $(pcregrep_OBJECTS) $(pcregrep_DEPENDENCIES) $(EXTRA_pcregrep_DEPENDENCIES) + @rm -f pcregrep$(EXEEXT) + $(AM_V_CCLD)$(pcregrep_LINK) $(pcregrep_OBJECTS) $(pcregrep_LDADD) $(LIBS) + +pcretest$(EXEEXT): $(pcretest_OBJECTS) $(pcretest_DEPENDENCIES) $(EXTRA_pcretest_DEPENDENCIES) + @rm -f pcretest$(EXEEXT) + $(AM_V_CCLD)$(pcretest_LINK) $(pcretest_OBJECTS) $(pcretest_LDADD) $(LIBS) +install-binSCRIPTS: $(bin_SCRIPTS) + @$(NORMAL_INSTALL) + @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n' \ + -e 'h;s|.*|.|' \ + -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) { files[d] = files[d] " " $$1; \ + if (++n[d] == $(am__install_max)) { \ + print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ + else { print "f", d "/" $$4, $$1 } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binSCRIPTS: + @$(NORMAL_UNINSTALL) + @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 's,.*/,,;$(transform)'`; \ + dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dftables.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_byte_order.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_chartables.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_compile.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_config.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_dfa_exec.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_exec.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_fullinfo.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_get.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_globals.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_jit_compile.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_maketables.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_newline.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_ord2utf16.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_refcount.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_string_utils.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_study.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_tables.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_ucd.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_utf16_utils.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_valid_utf16.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_version.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_xclass.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre_chartables.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_byte_order.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_chartables.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_compile.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_config.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_dfa_exec.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_exec.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_fullinfo.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_get.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_globals.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_jit_compile.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_maketables.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_newline.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_ord2utf32.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_refcount.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_string_utils.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_study.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_tables.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_ucd.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_utf32_utils.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_valid_utf32.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_version.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_xclass.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre_chartables.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_byte_order.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_chartables.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_compile.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_config.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_dfa_exec.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_exec.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_fullinfo.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_get.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_globals.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_jit_compile.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_maketables.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_newline.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_ord2utf8.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_refcount.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_string_utils.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_study.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_tables.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_ucd.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_valid_utf8.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_version.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_xclass.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcrecpp_la-pcre_scanner.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcrecpp_la-pcre_stringpiece.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcrecpp_la-pcrecpp.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcreposix_la-pcreposix.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcre_jit_test-pcre_jit_test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcre_scanner_unittest-pcre_scanner_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcre_stringpiece_unittest-pcre_stringpiece_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcrecpp_unittest-pcrecpp_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcregrep-pcregrep.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcretest-pcre16_printint.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcretest-pcre32_printint.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcretest-pcre_printint.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcretest-pcretest.Po@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libpcre_la-pcre_byte_order.lo: pcre_byte_order.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_byte_order.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_byte_order.Tpo -c -o libpcre_la-pcre_byte_order.lo `test -f 'pcre_byte_order.c' || echo '$(srcdir)/'`pcre_byte_order.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_byte_order.Tpo $(DEPDIR)/libpcre_la-pcre_byte_order.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre_byte_order.c' object='libpcre_la-pcre_byte_order.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_byte_order.lo `test -f 'pcre_byte_order.c' || echo '$(srcdir)/'`pcre_byte_order.c + +libpcre_la-pcre_compile.lo: pcre_compile.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_compile.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_compile.Tpo -c -o libpcre_la-pcre_compile.lo `test -f 'pcre_compile.c' || echo '$(srcdir)/'`pcre_compile.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_compile.Tpo $(DEPDIR)/libpcre_la-pcre_compile.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre_compile.c' object='libpcre_la-pcre_compile.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_compile.lo `test -f 'pcre_compile.c' || echo '$(srcdir)/'`pcre_compile.c + +libpcre_la-pcre_config.lo: pcre_config.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_config.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_config.Tpo -c -o libpcre_la-pcre_config.lo `test -f 'pcre_config.c' || echo '$(srcdir)/'`pcre_config.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_config.Tpo $(DEPDIR)/libpcre_la-pcre_config.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre_config.c' object='libpcre_la-pcre_config.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_config.lo `test -f 'pcre_config.c' || echo '$(srcdir)/'`pcre_config.c + +libpcre_la-pcre_dfa_exec.lo: pcre_dfa_exec.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_dfa_exec.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_dfa_exec.Tpo -c -o libpcre_la-pcre_dfa_exec.lo `test -f 'pcre_dfa_exec.c' || echo '$(srcdir)/'`pcre_dfa_exec.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_dfa_exec.Tpo $(DEPDIR)/libpcre_la-pcre_dfa_exec.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre_dfa_exec.c' object='libpcre_la-pcre_dfa_exec.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_dfa_exec.lo `test -f 'pcre_dfa_exec.c' || echo '$(srcdir)/'`pcre_dfa_exec.c + +libpcre_la-pcre_exec.lo: pcre_exec.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_exec.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_exec.Tpo -c -o libpcre_la-pcre_exec.lo `test -f 'pcre_exec.c' || echo '$(srcdir)/'`pcre_exec.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_exec.Tpo $(DEPDIR)/libpcre_la-pcre_exec.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre_exec.c' object='libpcre_la-pcre_exec.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_exec.lo `test -f 'pcre_exec.c' || echo '$(srcdir)/'`pcre_exec.c + +libpcre_la-pcre_fullinfo.lo: pcre_fullinfo.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_fullinfo.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_fullinfo.Tpo -c -o libpcre_la-pcre_fullinfo.lo `test -f 'pcre_fullinfo.c' || echo '$(srcdir)/'`pcre_fullinfo.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_fullinfo.Tpo $(DEPDIR)/libpcre_la-pcre_fullinfo.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre_fullinfo.c' object='libpcre_la-pcre_fullinfo.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_fullinfo.lo `test -f 'pcre_fullinfo.c' || echo '$(srcdir)/'`pcre_fullinfo.c + +libpcre_la-pcre_get.lo: pcre_get.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_get.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_get.Tpo -c -o libpcre_la-pcre_get.lo `test -f 'pcre_get.c' || echo '$(srcdir)/'`pcre_get.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_get.Tpo $(DEPDIR)/libpcre_la-pcre_get.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre_get.c' object='libpcre_la-pcre_get.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_get.lo `test -f 'pcre_get.c' || echo '$(srcdir)/'`pcre_get.c + +libpcre_la-pcre_globals.lo: pcre_globals.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_globals.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_globals.Tpo -c -o libpcre_la-pcre_globals.lo `test -f 'pcre_globals.c' || echo '$(srcdir)/'`pcre_globals.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_globals.Tpo $(DEPDIR)/libpcre_la-pcre_globals.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre_globals.c' object='libpcre_la-pcre_globals.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_globals.lo `test -f 'pcre_globals.c' || echo '$(srcdir)/'`pcre_globals.c + +libpcre_la-pcre_jit_compile.lo: pcre_jit_compile.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_jit_compile.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_jit_compile.Tpo -c -o libpcre_la-pcre_jit_compile.lo `test -f 'pcre_jit_compile.c' || echo '$(srcdir)/'`pcre_jit_compile.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_jit_compile.Tpo $(DEPDIR)/libpcre_la-pcre_jit_compile.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre_jit_compile.c' object='libpcre_la-pcre_jit_compile.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_jit_compile.lo `test -f 'pcre_jit_compile.c' || echo '$(srcdir)/'`pcre_jit_compile.c + +libpcre_la-pcre_maketables.lo: pcre_maketables.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_maketables.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_maketables.Tpo -c -o libpcre_la-pcre_maketables.lo `test -f 'pcre_maketables.c' || echo '$(srcdir)/'`pcre_maketables.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_maketables.Tpo $(DEPDIR)/libpcre_la-pcre_maketables.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre_maketables.c' object='libpcre_la-pcre_maketables.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_maketables.lo `test -f 'pcre_maketables.c' || echo '$(srcdir)/'`pcre_maketables.c + +libpcre_la-pcre_newline.lo: pcre_newline.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_newline.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_newline.Tpo -c -o libpcre_la-pcre_newline.lo `test -f 'pcre_newline.c' || echo '$(srcdir)/'`pcre_newline.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_newline.Tpo $(DEPDIR)/libpcre_la-pcre_newline.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre_newline.c' object='libpcre_la-pcre_newline.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_newline.lo `test -f 'pcre_newline.c' || echo '$(srcdir)/'`pcre_newline.c + +libpcre_la-pcre_ord2utf8.lo: pcre_ord2utf8.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_ord2utf8.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_ord2utf8.Tpo -c -o libpcre_la-pcre_ord2utf8.lo `test -f 'pcre_ord2utf8.c' || echo '$(srcdir)/'`pcre_ord2utf8.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_ord2utf8.Tpo $(DEPDIR)/libpcre_la-pcre_ord2utf8.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre_ord2utf8.c' object='libpcre_la-pcre_ord2utf8.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_ord2utf8.lo `test -f 'pcre_ord2utf8.c' || echo '$(srcdir)/'`pcre_ord2utf8.c + +libpcre_la-pcre_refcount.lo: pcre_refcount.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_refcount.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_refcount.Tpo -c -o libpcre_la-pcre_refcount.lo `test -f 'pcre_refcount.c' || echo '$(srcdir)/'`pcre_refcount.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_refcount.Tpo $(DEPDIR)/libpcre_la-pcre_refcount.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre_refcount.c' object='libpcre_la-pcre_refcount.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_refcount.lo `test -f 'pcre_refcount.c' || echo '$(srcdir)/'`pcre_refcount.c + +libpcre_la-pcre_string_utils.lo: pcre_string_utils.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_string_utils.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_string_utils.Tpo -c -o libpcre_la-pcre_string_utils.lo `test -f 'pcre_string_utils.c' || echo '$(srcdir)/'`pcre_string_utils.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_string_utils.Tpo $(DEPDIR)/libpcre_la-pcre_string_utils.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre_string_utils.c' object='libpcre_la-pcre_string_utils.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_string_utils.lo `test -f 'pcre_string_utils.c' || echo '$(srcdir)/'`pcre_string_utils.c + +libpcre_la-pcre_study.lo: pcre_study.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_study.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_study.Tpo -c -o libpcre_la-pcre_study.lo `test -f 'pcre_study.c' || echo '$(srcdir)/'`pcre_study.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_study.Tpo $(DEPDIR)/libpcre_la-pcre_study.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre_study.c' object='libpcre_la-pcre_study.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_study.lo `test -f 'pcre_study.c' || echo '$(srcdir)/'`pcre_study.c + +libpcre_la-pcre_tables.lo: pcre_tables.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_tables.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_tables.Tpo -c -o libpcre_la-pcre_tables.lo `test -f 'pcre_tables.c' || echo '$(srcdir)/'`pcre_tables.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_tables.Tpo $(DEPDIR)/libpcre_la-pcre_tables.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre_tables.c' object='libpcre_la-pcre_tables.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_tables.lo `test -f 'pcre_tables.c' || echo '$(srcdir)/'`pcre_tables.c + +libpcre_la-pcre_ucd.lo: pcre_ucd.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_ucd.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_ucd.Tpo -c -o libpcre_la-pcre_ucd.lo `test -f 'pcre_ucd.c' || echo '$(srcdir)/'`pcre_ucd.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_ucd.Tpo $(DEPDIR)/libpcre_la-pcre_ucd.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre_ucd.c' object='libpcre_la-pcre_ucd.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_ucd.lo `test -f 'pcre_ucd.c' || echo '$(srcdir)/'`pcre_ucd.c + +libpcre_la-pcre_valid_utf8.lo: pcre_valid_utf8.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_valid_utf8.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_valid_utf8.Tpo -c -o libpcre_la-pcre_valid_utf8.lo `test -f 'pcre_valid_utf8.c' || echo '$(srcdir)/'`pcre_valid_utf8.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_valid_utf8.Tpo $(DEPDIR)/libpcre_la-pcre_valid_utf8.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre_valid_utf8.c' object='libpcre_la-pcre_valid_utf8.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_valid_utf8.lo `test -f 'pcre_valid_utf8.c' || echo '$(srcdir)/'`pcre_valid_utf8.c + +libpcre_la-pcre_version.lo: pcre_version.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_version.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_version.Tpo -c -o libpcre_la-pcre_version.lo `test -f 'pcre_version.c' || echo '$(srcdir)/'`pcre_version.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_version.Tpo $(DEPDIR)/libpcre_la-pcre_version.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre_version.c' object='libpcre_la-pcre_version.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_version.lo `test -f 'pcre_version.c' || echo '$(srcdir)/'`pcre_version.c + +libpcre_la-pcre_xclass.lo: pcre_xclass.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_xclass.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_xclass.Tpo -c -o libpcre_la-pcre_xclass.lo `test -f 'pcre_xclass.c' || echo '$(srcdir)/'`pcre_xclass.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_xclass.Tpo $(DEPDIR)/libpcre_la-pcre_xclass.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre_xclass.c' object='libpcre_la-pcre_xclass.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_xclass.lo `test -f 'pcre_xclass.c' || echo '$(srcdir)/'`pcre_xclass.c + +libpcre_la-pcre_chartables.lo: pcre_chartables.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_chartables.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_chartables.Tpo -c -o libpcre_la-pcre_chartables.lo `test -f 'pcre_chartables.c' || echo '$(srcdir)/'`pcre_chartables.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_chartables.Tpo $(DEPDIR)/libpcre_la-pcre_chartables.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre_chartables.c' object='libpcre_la-pcre_chartables.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_chartables.lo `test -f 'pcre_chartables.c' || echo '$(srcdir)/'`pcre_chartables.c + +libpcre16_la-pcre16_byte_order.lo: pcre16_byte_order.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_byte_order.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_byte_order.Tpo -c -o libpcre16_la-pcre16_byte_order.lo `test -f 'pcre16_byte_order.c' || echo '$(srcdir)/'`pcre16_byte_order.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_byte_order.Tpo $(DEPDIR)/libpcre16_la-pcre16_byte_order.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre16_byte_order.c' object='libpcre16_la-pcre16_byte_order.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_byte_order.lo `test -f 'pcre16_byte_order.c' || echo '$(srcdir)/'`pcre16_byte_order.c + +libpcre16_la-pcre16_chartables.lo: pcre16_chartables.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_chartables.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_chartables.Tpo -c -o libpcre16_la-pcre16_chartables.lo `test -f 'pcre16_chartables.c' || echo '$(srcdir)/'`pcre16_chartables.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_chartables.Tpo $(DEPDIR)/libpcre16_la-pcre16_chartables.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre16_chartables.c' object='libpcre16_la-pcre16_chartables.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_chartables.lo `test -f 'pcre16_chartables.c' || echo '$(srcdir)/'`pcre16_chartables.c + +libpcre16_la-pcre16_compile.lo: pcre16_compile.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_compile.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_compile.Tpo -c -o libpcre16_la-pcre16_compile.lo `test -f 'pcre16_compile.c' || echo '$(srcdir)/'`pcre16_compile.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_compile.Tpo $(DEPDIR)/libpcre16_la-pcre16_compile.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre16_compile.c' object='libpcre16_la-pcre16_compile.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_compile.lo `test -f 'pcre16_compile.c' || echo '$(srcdir)/'`pcre16_compile.c + +libpcre16_la-pcre16_config.lo: pcre16_config.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_config.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_config.Tpo -c -o libpcre16_la-pcre16_config.lo `test -f 'pcre16_config.c' || echo '$(srcdir)/'`pcre16_config.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_config.Tpo $(DEPDIR)/libpcre16_la-pcre16_config.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre16_config.c' object='libpcre16_la-pcre16_config.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_config.lo `test -f 'pcre16_config.c' || echo '$(srcdir)/'`pcre16_config.c + +libpcre16_la-pcre16_dfa_exec.lo: pcre16_dfa_exec.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_dfa_exec.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_dfa_exec.Tpo -c -o libpcre16_la-pcre16_dfa_exec.lo `test -f 'pcre16_dfa_exec.c' || echo '$(srcdir)/'`pcre16_dfa_exec.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_dfa_exec.Tpo $(DEPDIR)/libpcre16_la-pcre16_dfa_exec.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre16_dfa_exec.c' object='libpcre16_la-pcre16_dfa_exec.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_dfa_exec.lo `test -f 'pcre16_dfa_exec.c' || echo '$(srcdir)/'`pcre16_dfa_exec.c + +libpcre16_la-pcre16_exec.lo: pcre16_exec.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_exec.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_exec.Tpo -c -o libpcre16_la-pcre16_exec.lo `test -f 'pcre16_exec.c' || echo '$(srcdir)/'`pcre16_exec.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_exec.Tpo $(DEPDIR)/libpcre16_la-pcre16_exec.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre16_exec.c' object='libpcre16_la-pcre16_exec.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_exec.lo `test -f 'pcre16_exec.c' || echo '$(srcdir)/'`pcre16_exec.c + +libpcre16_la-pcre16_fullinfo.lo: pcre16_fullinfo.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_fullinfo.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_fullinfo.Tpo -c -o libpcre16_la-pcre16_fullinfo.lo `test -f 'pcre16_fullinfo.c' || echo '$(srcdir)/'`pcre16_fullinfo.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_fullinfo.Tpo $(DEPDIR)/libpcre16_la-pcre16_fullinfo.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre16_fullinfo.c' object='libpcre16_la-pcre16_fullinfo.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_fullinfo.lo `test -f 'pcre16_fullinfo.c' || echo '$(srcdir)/'`pcre16_fullinfo.c + +libpcre16_la-pcre16_get.lo: pcre16_get.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_get.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_get.Tpo -c -o libpcre16_la-pcre16_get.lo `test -f 'pcre16_get.c' || echo '$(srcdir)/'`pcre16_get.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_get.Tpo $(DEPDIR)/libpcre16_la-pcre16_get.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre16_get.c' object='libpcre16_la-pcre16_get.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_get.lo `test -f 'pcre16_get.c' || echo '$(srcdir)/'`pcre16_get.c + +libpcre16_la-pcre16_globals.lo: pcre16_globals.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_globals.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_globals.Tpo -c -o libpcre16_la-pcre16_globals.lo `test -f 'pcre16_globals.c' || echo '$(srcdir)/'`pcre16_globals.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_globals.Tpo $(DEPDIR)/libpcre16_la-pcre16_globals.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre16_globals.c' object='libpcre16_la-pcre16_globals.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_globals.lo `test -f 'pcre16_globals.c' || echo '$(srcdir)/'`pcre16_globals.c + +libpcre16_la-pcre16_jit_compile.lo: pcre16_jit_compile.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_jit_compile.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_jit_compile.Tpo -c -o libpcre16_la-pcre16_jit_compile.lo `test -f 'pcre16_jit_compile.c' || echo '$(srcdir)/'`pcre16_jit_compile.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_jit_compile.Tpo $(DEPDIR)/libpcre16_la-pcre16_jit_compile.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre16_jit_compile.c' object='libpcre16_la-pcre16_jit_compile.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_jit_compile.lo `test -f 'pcre16_jit_compile.c' || echo '$(srcdir)/'`pcre16_jit_compile.c + +libpcre16_la-pcre16_maketables.lo: pcre16_maketables.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_maketables.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_maketables.Tpo -c -o libpcre16_la-pcre16_maketables.lo `test -f 'pcre16_maketables.c' || echo '$(srcdir)/'`pcre16_maketables.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_maketables.Tpo $(DEPDIR)/libpcre16_la-pcre16_maketables.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre16_maketables.c' object='libpcre16_la-pcre16_maketables.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_maketables.lo `test -f 'pcre16_maketables.c' || echo '$(srcdir)/'`pcre16_maketables.c + +libpcre16_la-pcre16_newline.lo: pcre16_newline.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_newline.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_newline.Tpo -c -o libpcre16_la-pcre16_newline.lo `test -f 'pcre16_newline.c' || echo '$(srcdir)/'`pcre16_newline.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_newline.Tpo $(DEPDIR)/libpcre16_la-pcre16_newline.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre16_newline.c' object='libpcre16_la-pcre16_newline.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_newline.lo `test -f 'pcre16_newline.c' || echo '$(srcdir)/'`pcre16_newline.c + +libpcre16_la-pcre16_ord2utf16.lo: pcre16_ord2utf16.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_ord2utf16.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_ord2utf16.Tpo -c -o libpcre16_la-pcre16_ord2utf16.lo `test -f 'pcre16_ord2utf16.c' || echo '$(srcdir)/'`pcre16_ord2utf16.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_ord2utf16.Tpo $(DEPDIR)/libpcre16_la-pcre16_ord2utf16.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre16_ord2utf16.c' object='libpcre16_la-pcre16_ord2utf16.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_ord2utf16.lo `test -f 'pcre16_ord2utf16.c' || echo '$(srcdir)/'`pcre16_ord2utf16.c + +libpcre16_la-pcre16_refcount.lo: pcre16_refcount.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_refcount.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_refcount.Tpo -c -o libpcre16_la-pcre16_refcount.lo `test -f 'pcre16_refcount.c' || echo '$(srcdir)/'`pcre16_refcount.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_refcount.Tpo $(DEPDIR)/libpcre16_la-pcre16_refcount.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre16_refcount.c' object='libpcre16_la-pcre16_refcount.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_refcount.lo `test -f 'pcre16_refcount.c' || echo '$(srcdir)/'`pcre16_refcount.c + +libpcre16_la-pcre16_string_utils.lo: pcre16_string_utils.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_string_utils.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_string_utils.Tpo -c -o libpcre16_la-pcre16_string_utils.lo `test -f 'pcre16_string_utils.c' || echo '$(srcdir)/'`pcre16_string_utils.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_string_utils.Tpo $(DEPDIR)/libpcre16_la-pcre16_string_utils.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre16_string_utils.c' object='libpcre16_la-pcre16_string_utils.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_string_utils.lo `test -f 'pcre16_string_utils.c' || echo '$(srcdir)/'`pcre16_string_utils.c + +libpcre16_la-pcre16_study.lo: pcre16_study.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_study.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_study.Tpo -c -o libpcre16_la-pcre16_study.lo `test -f 'pcre16_study.c' || echo '$(srcdir)/'`pcre16_study.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_study.Tpo $(DEPDIR)/libpcre16_la-pcre16_study.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre16_study.c' object='libpcre16_la-pcre16_study.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_study.lo `test -f 'pcre16_study.c' || echo '$(srcdir)/'`pcre16_study.c + +libpcre16_la-pcre16_tables.lo: pcre16_tables.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_tables.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_tables.Tpo -c -o libpcre16_la-pcre16_tables.lo `test -f 'pcre16_tables.c' || echo '$(srcdir)/'`pcre16_tables.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_tables.Tpo $(DEPDIR)/libpcre16_la-pcre16_tables.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre16_tables.c' object='libpcre16_la-pcre16_tables.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_tables.lo `test -f 'pcre16_tables.c' || echo '$(srcdir)/'`pcre16_tables.c + +libpcre16_la-pcre16_ucd.lo: pcre16_ucd.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_ucd.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_ucd.Tpo -c -o libpcre16_la-pcre16_ucd.lo `test -f 'pcre16_ucd.c' || echo '$(srcdir)/'`pcre16_ucd.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_ucd.Tpo $(DEPDIR)/libpcre16_la-pcre16_ucd.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre16_ucd.c' object='libpcre16_la-pcre16_ucd.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_ucd.lo `test -f 'pcre16_ucd.c' || echo '$(srcdir)/'`pcre16_ucd.c + +libpcre16_la-pcre16_utf16_utils.lo: pcre16_utf16_utils.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_utf16_utils.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_utf16_utils.Tpo -c -o libpcre16_la-pcre16_utf16_utils.lo `test -f 'pcre16_utf16_utils.c' || echo '$(srcdir)/'`pcre16_utf16_utils.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_utf16_utils.Tpo $(DEPDIR)/libpcre16_la-pcre16_utf16_utils.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre16_utf16_utils.c' object='libpcre16_la-pcre16_utf16_utils.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_utf16_utils.lo `test -f 'pcre16_utf16_utils.c' || echo '$(srcdir)/'`pcre16_utf16_utils.c + +libpcre16_la-pcre16_valid_utf16.lo: pcre16_valid_utf16.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_valid_utf16.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_valid_utf16.Tpo -c -o libpcre16_la-pcre16_valid_utf16.lo `test -f 'pcre16_valid_utf16.c' || echo '$(srcdir)/'`pcre16_valid_utf16.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_valid_utf16.Tpo $(DEPDIR)/libpcre16_la-pcre16_valid_utf16.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre16_valid_utf16.c' object='libpcre16_la-pcre16_valid_utf16.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_valid_utf16.lo `test -f 'pcre16_valid_utf16.c' || echo '$(srcdir)/'`pcre16_valid_utf16.c + +libpcre16_la-pcre16_version.lo: pcre16_version.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_version.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_version.Tpo -c -o libpcre16_la-pcre16_version.lo `test -f 'pcre16_version.c' || echo '$(srcdir)/'`pcre16_version.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_version.Tpo $(DEPDIR)/libpcre16_la-pcre16_version.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre16_version.c' object='libpcre16_la-pcre16_version.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_version.lo `test -f 'pcre16_version.c' || echo '$(srcdir)/'`pcre16_version.c + +libpcre16_la-pcre16_xclass.lo: pcre16_xclass.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_xclass.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_xclass.Tpo -c -o libpcre16_la-pcre16_xclass.lo `test -f 'pcre16_xclass.c' || echo '$(srcdir)/'`pcre16_xclass.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_xclass.Tpo $(DEPDIR)/libpcre16_la-pcre16_xclass.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre16_xclass.c' object='libpcre16_la-pcre16_xclass.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_xclass.lo `test -f 'pcre16_xclass.c' || echo '$(srcdir)/'`pcre16_xclass.c + +libpcre16_la-pcre_chartables.lo: pcre_chartables.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre_chartables.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre_chartables.Tpo -c -o libpcre16_la-pcre_chartables.lo `test -f 'pcre_chartables.c' || echo '$(srcdir)/'`pcre_chartables.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre_chartables.Tpo $(DEPDIR)/libpcre16_la-pcre_chartables.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre_chartables.c' object='libpcre16_la-pcre_chartables.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre_chartables.lo `test -f 'pcre_chartables.c' || echo '$(srcdir)/'`pcre_chartables.c + +libpcre32_la-pcre32_byte_order.lo: pcre32_byte_order.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_byte_order.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_byte_order.Tpo -c -o libpcre32_la-pcre32_byte_order.lo `test -f 'pcre32_byte_order.c' || echo '$(srcdir)/'`pcre32_byte_order.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_byte_order.Tpo $(DEPDIR)/libpcre32_la-pcre32_byte_order.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre32_byte_order.c' object='libpcre32_la-pcre32_byte_order.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_byte_order.lo `test -f 'pcre32_byte_order.c' || echo '$(srcdir)/'`pcre32_byte_order.c + +libpcre32_la-pcre32_chartables.lo: pcre32_chartables.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_chartables.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_chartables.Tpo -c -o libpcre32_la-pcre32_chartables.lo `test -f 'pcre32_chartables.c' || echo '$(srcdir)/'`pcre32_chartables.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_chartables.Tpo $(DEPDIR)/libpcre32_la-pcre32_chartables.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre32_chartables.c' object='libpcre32_la-pcre32_chartables.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_chartables.lo `test -f 'pcre32_chartables.c' || echo '$(srcdir)/'`pcre32_chartables.c + +libpcre32_la-pcre32_compile.lo: pcre32_compile.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_compile.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_compile.Tpo -c -o libpcre32_la-pcre32_compile.lo `test -f 'pcre32_compile.c' || echo '$(srcdir)/'`pcre32_compile.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_compile.Tpo $(DEPDIR)/libpcre32_la-pcre32_compile.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre32_compile.c' object='libpcre32_la-pcre32_compile.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_compile.lo `test -f 'pcre32_compile.c' || echo '$(srcdir)/'`pcre32_compile.c + +libpcre32_la-pcre32_config.lo: pcre32_config.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_config.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_config.Tpo -c -o libpcre32_la-pcre32_config.lo `test -f 'pcre32_config.c' || echo '$(srcdir)/'`pcre32_config.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_config.Tpo $(DEPDIR)/libpcre32_la-pcre32_config.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre32_config.c' object='libpcre32_la-pcre32_config.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_config.lo `test -f 'pcre32_config.c' || echo '$(srcdir)/'`pcre32_config.c + +libpcre32_la-pcre32_dfa_exec.lo: pcre32_dfa_exec.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_dfa_exec.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_dfa_exec.Tpo -c -o libpcre32_la-pcre32_dfa_exec.lo `test -f 'pcre32_dfa_exec.c' || echo '$(srcdir)/'`pcre32_dfa_exec.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_dfa_exec.Tpo $(DEPDIR)/libpcre32_la-pcre32_dfa_exec.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre32_dfa_exec.c' object='libpcre32_la-pcre32_dfa_exec.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_dfa_exec.lo `test -f 'pcre32_dfa_exec.c' || echo '$(srcdir)/'`pcre32_dfa_exec.c + +libpcre32_la-pcre32_exec.lo: pcre32_exec.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_exec.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_exec.Tpo -c -o libpcre32_la-pcre32_exec.lo `test -f 'pcre32_exec.c' || echo '$(srcdir)/'`pcre32_exec.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_exec.Tpo $(DEPDIR)/libpcre32_la-pcre32_exec.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre32_exec.c' object='libpcre32_la-pcre32_exec.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_exec.lo `test -f 'pcre32_exec.c' || echo '$(srcdir)/'`pcre32_exec.c + +libpcre32_la-pcre32_fullinfo.lo: pcre32_fullinfo.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_fullinfo.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_fullinfo.Tpo -c -o libpcre32_la-pcre32_fullinfo.lo `test -f 'pcre32_fullinfo.c' || echo '$(srcdir)/'`pcre32_fullinfo.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_fullinfo.Tpo $(DEPDIR)/libpcre32_la-pcre32_fullinfo.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre32_fullinfo.c' object='libpcre32_la-pcre32_fullinfo.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_fullinfo.lo `test -f 'pcre32_fullinfo.c' || echo '$(srcdir)/'`pcre32_fullinfo.c + +libpcre32_la-pcre32_get.lo: pcre32_get.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_get.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_get.Tpo -c -o libpcre32_la-pcre32_get.lo `test -f 'pcre32_get.c' || echo '$(srcdir)/'`pcre32_get.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_get.Tpo $(DEPDIR)/libpcre32_la-pcre32_get.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre32_get.c' object='libpcre32_la-pcre32_get.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_get.lo `test -f 'pcre32_get.c' || echo '$(srcdir)/'`pcre32_get.c + +libpcre32_la-pcre32_globals.lo: pcre32_globals.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_globals.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_globals.Tpo -c -o libpcre32_la-pcre32_globals.lo `test -f 'pcre32_globals.c' || echo '$(srcdir)/'`pcre32_globals.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_globals.Tpo $(DEPDIR)/libpcre32_la-pcre32_globals.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre32_globals.c' object='libpcre32_la-pcre32_globals.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_globals.lo `test -f 'pcre32_globals.c' || echo '$(srcdir)/'`pcre32_globals.c + +libpcre32_la-pcre32_jit_compile.lo: pcre32_jit_compile.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_jit_compile.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_jit_compile.Tpo -c -o libpcre32_la-pcre32_jit_compile.lo `test -f 'pcre32_jit_compile.c' || echo '$(srcdir)/'`pcre32_jit_compile.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_jit_compile.Tpo $(DEPDIR)/libpcre32_la-pcre32_jit_compile.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre32_jit_compile.c' object='libpcre32_la-pcre32_jit_compile.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_jit_compile.lo `test -f 'pcre32_jit_compile.c' || echo '$(srcdir)/'`pcre32_jit_compile.c + +libpcre32_la-pcre32_maketables.lo: pcre32_maketables.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_maketables.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_maketables.Tpo -c -o libpcre32_la-pcre32_maketables.lo `test -f 'pcre32_maketables.c' || echo '$(srcdir)/'`pcre32_maketables.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_maketables.Tpo $(DEPDIR)/libpcre32_la-pcre32_maketables.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre32_maketables.c' object='libpcre32_la-pcre32_maketables.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_maketables.lo `test -f 'pcre32_maketables.c' || echo '$(srcdir)/'`pcre32_maketables.c + +libpcre32_la-pcre32_newline.lo: pcre32_newline.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_newline.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_newline.Tpo -c -o libpcre32_la-pcre32_newline.lo `test -f 'pcre32_newline.c' || echo '$(srcdir)/'`pcre32_newline.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_newline.Tpo $(DEPDIR)/libpcre32_la-pcre32_newline.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre32_newline.c' object='libpcre32_la-pcre32_newline.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_newline.lo `test -f 'pcre32_newline.c' || echo '$(srcdir)/'`pcre32_newline.c + +libpcre32_la-pcre32_ord2utf32.lo: pcre32_ord2utf32.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_ord2utf32.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_ord2utf32.Tpo -c -o libpcre32_la-pcre32_ord2utf32.lo `test -f 'pcre32_ord2utf32.c' || echo '$(srcdir)/'`pcre32_ord2utf32.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_ord2utf32.Tpo $(DEPDIR)/libpcre32_la-pcre32_ord2utf32.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre32_ord2utf32.c' object='libpcre32_la-pcre32_ord2utf32.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_ord2utf32.lo `test -f 'pcre32_ord2utf32.c' || echo '$(srcdir)/'`pcre32_ord2utf32.c + +libpcre32_la-pcre32_refcount.lo: pcre32_refcount.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_refcount.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_refcount.Tpo -c -o libpcre32_la-pcre32_refcount.lo `test -f 'pcre32_refcount.c' || echo '$(srcdir)/'`pcre32_refcount.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_refcount.Tpo $(DEPDIR)/libpcre32_la-pcre32_refcount.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre32_refcount.c' object='libpcre32_la-pcre32_refcount.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_refcount.lo `test -f 'pcre32_refcount.c' || echo '$(srcdir)/'`pcre32_refcount.c + +libpcre32_la-pcre32_string_utils.lo: pcre32_string_utils.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_string_utils.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_string_utils.Tpo -c -o libpcre32_la-pcre32_string_utils.lo `test -f 'pcre32_string_utils.c' || echo '$(srcdir)/'`pcre32_string_utils.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_string_utils.Tpo $(DEPDIR)/libpcre32_la-pcre32_string_utils.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre32_string_utils.c' object='libpcre32_la-pcre32_string_utils.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_string_utils.lo `test -f 'pcre32_string_utils.c' || echo '$(srcdir)/'`pcre32_string_utils.c + +libpcre32_la-pcre32_study.lo: pcre32_study.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_study.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_study.Tpo -c -o libpcre32_la-pcre32_study.lo `test -f 'pcre32_study.c' || echo '$(srcdir)/'`pcre32_study.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_study.Tpo $(DEPDIR)/libpcre32_la-pcre32_study.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre32_study.c' object='libpcre32_la-pcre32_study.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_study.lo `test -f 'pcre32_study.c' || echo '$(srcdir)/'`pcre32_study.c + +libpcre32_la-pcre32_tables.lo: pcre32_tables.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_tables.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_tables.Tpo -c -o libpcre32_la-pcre32_tables.lo `test -f 'pcre32_tables.c' || echo '$(srcdir)/'`pcre32_tables.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_tables.Tpo $(DEPDIR)/libpcre32_la-pcre32_tables.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre32_tables.c' object='libpcre32_la-pcre32_tables.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_tables.lo `test -f 'pcre32_tables.c' || echo '$(srcdir)/'`pcre32_tables.c + +libpcre32_la-pcre32_ucd.lo: pcre32_ucd.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_ucd.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_ucd.Tpo -c -o libpcre32_la-pcre32_ucd.lo `test -f 'pcre32_ucd.c' || echo '$(srcdir)/'`pcre32_ucd.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_ucd.Tpo $(DEPDIR)/libpcre32_la-pcre32_ucd.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre32_ucd.c' object='libpcre32_la-pcre32_ucd.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_ucd.lo `test -f 'pcre32_ucd.c' || echo '$(srcdir)/'`pcre32_ucd.c + +libpcre32_la-pcre32_utf32_utils.lo: pcre32_utf32_utils.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_utf32_utils.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_utf32_utils.Tpo -c -o libpcre32_la-pcre32_utf32_utils.lo `test -f 'pcre32_utf32_utils.c' || echo '$(srcdir)/'`pcre32_utf32_utils.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_utf32_utils.Tpo $(DEPDIR)/libpcre32_la-pcre32_utf32_utils.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre32_utf32_utils.c' object='libpcre32_la-pcre32_utf32_utils.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_utf32_utils.lo `test -f 'pcre32_utf32_utils.c' || echo '$(srcdir)/'`pcre32_utf32_utils.c + +libpcre32_la-pcre32_valid_utf32.lo: pcre32_valid_utf32.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_valid_utf32.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_valid_utf32.Tpo -c -o libpcre32_la-pcre32_valid_utf32.lo `test -f 'pcre32_valid_utf32.c' || echo '$(srcdir)/'`pcre32_valid_utf32.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_valid_utf32.Tpo $(DEPDIR)/libpcre32_la-pcre32_valid_utf32.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre32_valid_utf32.c' object='libpcre32_la-pcre32_valid_utf32.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_valid_utf32.lo `test -f 'pcre32_valid_utf32.c' || echo '$(srcdir)/'`pcre32_valid_utf32.c + +libpcre32_la-pcre32_version.lo: pcre32_version.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_version.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_version.Tpo -c -o libpcre32_la-pcre32_version.lo `test -f 'pcre32_version.c' || echo '$(srcdir)/'`pcre32_version.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_version.Tpo $(DEPDIR)/libpcre32_la-pcre32_version.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre32_version.c' object='libpcre32_la-pcre32_version.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_version.lo `test -f 'pcre32_version.c' || echo '$(srcdir)/'`pcre32_version.c + +libpcre32_la-pcre32_xclass.lo: pcre32_xclass.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_xclass.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_xclass.Tpo -c -o libpcre32_la-pcre32_xclass.lo `test -f 'pcre32_xclass.c' || echo '$(srcdir)/'`pcre32_xclass.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_xclass.Tpo $(DEPDIR)/libpcre32_la-pcre32_xclass.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre32_xclass.c' object='libpcre32_la-pcre32_xclass.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_xclass.lo `test -f 'pcre32_xclass.c' || echo '$(srcdir)/'`pcre32_xclass.c + +libpcre32_la-pcre_chartables.lo: pcre_chartables.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre_chartables.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre_chartables.Tpo -c -o libpcre32_la-pcre_chartables.lo `test -f 'pcre_chartables.c' || echo '$(srcdir)/'`pcre_chartables.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre_chartables.Tpo $(DEPDIR)/libpcre32_la-pcre_chartables.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre_chartables.c' object='libpcre32_la-pcre_chartables.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre_chartables.lo `test -f 'pcre_chartables.c' || echo '$(srcdir)/'`pcre_chartables.c + +libpcreposix_la-pcreposix.lo: pcreposix.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcreposix_la_CFLAGS) $(CFLAGS) -MT libpcreposix_la-pcreposix.lo -MD -MP -MF $(DEPDIR)/libpcreposix_la-pcreposix.Tpo -c -o libpcreposix_la-pcreposix.lo `test -f 'pcreposix.c' || echo '$(srcdir)/'`pcreposix.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcreposix_la-pcreposix.Tpo $(DEPDIR)/libpcreposix_la-pcreposix.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcreposix.c' object='libpcreposix_la-pcreposix.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcreposix_la_CFLAGS) $(CFLAGS) -c -o libpcreposix_la-pcreposix.lo `test -f 'pcreposix.c' || echo '$(srcdir)/'`pcreposix.c + +pcre_jit_test-pcre_jit_test.o: pcre_jit_test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcre_jit_test_CFLAGS) $(CFLAGS) -MT pcre_jit_test-pcre_jit_test.o -MD -MP -MF $(DEPDIR)/pcre_jit_test-pcre_jit_test.Tpo -c -o pcre_jit_test-pcre_jit_test.o `test -f 'pcre_jit_test.c' || echo '$(srcdir)/'`pcre_jit_test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pcre_jit_test-pcre_jit_test.Tpo $(DEPDIR)/pcre_jit_test-pcre_jit_test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre_jit_test.c' object='pcre_jit_test-pcre_jit_test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcre_jit_test_CFLAGS) $(CFLAGS) -c -o pcre_jit_test-pcre_jit_test.o `test -f 'pcre_jit_test.c' || echo '$(srcdir)/'`pcre_jit_test.c + +pcre_jit_test-pcre_jit_test.obj: pcre_jit_test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcre_jit_test_CFLAGS) $(CFLAGS) -MT pcre_jit_test-pcre_jit_test.obj -MD -MP -MF $(DEPDIR)/pcre_jit_test-pcre_jit_test.Tpo -c -o pcre_jit_test-pcre_jit_test.obj `if test -f 'pcre_jit_test.c'; then $(CYGPATH_W) 'pcre_jit_test.c'; else $(CYGPATH_W) '$(srcdir)/pcre_jit_test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pcre_jit_test-pcre_jit_test.Tpo $(DEPDIR)/pcre_jit_test-pcre_jit_test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre_jit_test.c' object='pcre_jit_test-pcre_jit_test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcre_jit_test_CFLAGS) $(CFLAGS) -c -o pcre_jit_test-pcre_jit_test.obj `if test -f 'pcre_jit_test.c'; then $(CYGPATH_W) 'pcre_jit_test.c'; else $(CYGPATH_W) '$(srcdir)/pcre_jit_test.c'; fi` + +pcregrep-pcregrep.o: pcregrep.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcregrep_CFLAGS) $(CFLAGS) -MT pcregrep-pcregrep.o -MD -MP -MF $(DEPDIR)/pcregrep-pcregrep.Tpo -c -o pcregrep-pcregrep.o `test -f 'pcregrep.c' || echo '$(srcdir)/'`pcregrep.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pcregrep-pcregrep.Tpo $(DEPDIR)/pcregrep-pcregrep.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcregrep.c' object='pcregrep-pcregrep.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcregrep_CFLAGS) $(CFLAGS) -c -o pcregrep-pcregrep.o `test -f 'pcregrep.c' || echo '$(srcdir)/'`pcregrep.c + +pcregrep-pcregrep.obj: pcregrep.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcregrep_CFLAGS) $(CFLAGS) -MT pcregrep-pcregrep.obj -MD -MP -MF $(DEPDIR)/pcregrep-pcregrep.Tpo -c -o pcregrep-pcregrep.obj `if test -f 'pcregrep.c'; then $(CYGPATH_W) 'pcregrep.c'; else $(CYGPATH_W) '$(srcdir)/pcregrep.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pcregrep-pcregrep.Tpo $(DEPDIR)/pcregrep-pcregrep.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcregrep.c' object='pcregrep-pcregrep.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcregrep_CFLAGS) $(CFLAGS) -c -o pcregrep-pcregrep.obj `if test -f 'pcregrep.c'; then $(CYGPATH_W) 'pcregrep.c'; else $(CYGPATH_W) '$(srcdir)/pcregrep.c'; fi` + +pcretest-pcretest.o: pcretest.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcretest_CFLAGS) $(CFLAGS) -MT pcretest-pcretest.o -MD -MP -MF $(DEPDIR)/pcretest-pcretest.Tpo -c -o pcretest-pcretest.o `test -f 'pcretest.c' || echo '$(srcdir)/'`pcretest.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pcretest-pcretest.Tpo $(DEPDIR)/pcretest-pcretest.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcretest.c' object='pcretest-pcretest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcretest_CFLAGS) $(CFLAGS) -c -o pcretest-pcretest.o `test -f 'pcretest.c' || echo '$(srcdir)/'`pcretest.c + +pcretest-pcretest.obj: pcretest.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcretest_CFLAGS) $(CFLAGS) -MT pcretest-pcretest.obj -MD -MP -MF $(DEPDIR)/pcretest-pcretest.Tpo -c -o pcretest-pcretest.obj `if test -f 'pcretest.c'; then $(CYGPATH_W) 'pcretest.c'; else $(CYGPATH_W) '$(srcdir)/pcretest.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pcretest-pcretest.Tpo $(DEPDIR)/pcretest-pcretest.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcretest.c' object='pcretest-pcretest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcretest_CFLAGS) $(CFLAGS) -c -o pcretest-pcretest.obj `if test -f 'pcretest.c'; then $(CYGPATH_W) 'pcretest.c'; else $(CYGPATH_W) '$(srcdir)/pcretest.c'; fi` + +pcretest-pcre_printint.o: pcre_printint.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcretest_CFLAGS) $(CFLAGS) -MT pcretest-pcre_printint.o -MD -MP -MF $(DEPDIR)/pcretest-pcre_printint.Tpo -c -o pcretest-pcre_printint.o `test -f 'pcre_printint.c' || echo '$(srcdir)/'`pcre_printint.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pcretest-pcre_printint.Tpo $(DEPDIR)/pcretest-pcre_printint.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre_printint.c' object='pcretest-pcre_printint.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcretest_CFLAGS) $(CFLAGS) -c -o pcretest-pcre_printint.o `test -f 'pcre_printint.c' || echo '$(srcdir)/'`pcre_printint.c + +pcretest-pcre_printint.obj: pcre_printint.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcretest_CFLAGS) $(CFLAGS) -MT pcretest-pcre_printint.obj -MD -MP -MF $(DEPDIR)/pcretest-pcre_printint.Tpo -c -o pcretest-pcre_printint.obj `if test -f 'pcre_printint.c'; then $(CYGPATH_W) 'pcre_printint.c'; else $(CYGPATH_W) '$(srcdir)/pcre_printint.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pcretest-pcre_printint.Tpo $(DEPDIR)/pcretest-pcre_printint.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre_printint.c' object='pcretest-pcre_printint.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcretest_CFLAGS) $(CFLAGS) -c -o pcretest-pcre_printint.obj `if test -f 'pcre_printint.c'; then $(CYGPATH_W) 'pcre_printint.c'; else $(CYGPATH_W) '$(srcdir)/pcre_printint.c'; fi` + +pcretest-pcre16_printint.o: pcre16_printint.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcretest_CFLAGS) $(CFLAGS) -MT pcretest-pcre16_printint.o -MD -MP -MF $(DEPDIR)/pcretest-pcre16_printint.Tpo -c -o pcretest-pcre16_printint.o `test -f 'pcre16_printint.c' || echo '$(srcdir)/'`pcre16_printint.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pcretest-pcre16_printint.Tpo $(DEPDIR)/pcretest-pcre16_printint.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre16_printint.c' object='pcretest-pcre16_printint.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcretest_CFLAGS) $(CFLAGS) -c -o pcretest-pcre16_printint.o `test -f 'pcre16_printint.c' || echo '$(srcdir)/'`pcre16_printint.c + +pcretest-pcre16_printint.obj: pcre16_printint.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcretest_CFLAGS) $(CFLAGS) -MT pcretest-pcre16_printint.obj -MD -MP -MF $(DEPDIR)/pcretest-pcre16_printint.Tpo -c -o pcretest-pcre16_printint.obj `if test -f 'pcre16_printint.c'; then $(CYGPATH_W) 'pcre16_printint.c'; else $(CYGPATH_W) '$(srcdir)/pcre16_printint.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pcretest-pcre16_printint.Tpo $(DEPDIR)/pcretest-pcre16_printint.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre16_printint.c' object='pcretest-pcre16_printint.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcretest_CFLAGS) $(CFLAGS) -c -o pcretest-pcre16_printint.obj `if test -f 'pcre16_printint.c'; then $(CYGPATH_W) 'pcre16_printint.c'; else $(CYGPATH_W) '$(srcdir)/pcre16_printint.c'; fi` + +pcretest-pcre32_printint.o: pcre32_printint.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcretest_CFLAGS) $(CFLAGS) -MT pcretest-pcre32_printint.o -MD -MP -MF $(DEPDIR)/pcretest-pcre32_printint.Tpo -c -o pcretest-pcre32_printint.o `test -f 'pcre32_printint.c' || echo '$(srcdir)/'`pcre32_printint.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pcretest-pcre32_printint.Tpo $(DEPDIR)/pcretest-pcre32_printint.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre32_printint.c' object='pcretest-pcre32_printint.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcretest_CFLAGS) $(CFLAGS) -c -o pcretest-pcre32_printint.o `test -f 'pcre32_printint.c' || echo '$(srcdir)/'`pcre32_printint.c + +pcretest-pcre32_printint.obj: pcre32_printint.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcretest_CFLAGS) $(CFLAGS) -MT pcretest-pcre32_printint.obj -MD -MP -MF $(DEPDIR)/pcretest-pcre32_printint.Tpo -c -o pcretest-pcre32_printint.obj `if test -f 'pcre32_printint.c'; then $(CYGPATH_W) 'pcre32_printint.c'; else $(CYGPATH_W) '$(srcdir)/pcre32_printint.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pcretest-pcre32_printint.Tpo $(DEPDIR)/pcretest-pcre32_printint.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcre32_printint.c' object='pcretest-pcre32_printint.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcretest_CFLAGS) $(CFLAGS) -c -o pcretest-pcre32_printint.obj `if test -f 'pcre32_printint.c'; then $(CYGPATH_W) 'pcre32_printint.c'; else $(CYGPATH_W) '$(srcdir)/pcre32_printint.c'; fi` + +.cc.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cc.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cc.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +libpcrecpp_la-pcrecpp.lo: pcrecpp.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcrecpp_la_CXXFLAGS) $(CXXFLAGS) -MT libpcrecpp_la-pcrecpp.lo -MD -MP -MF $(DEPDIR)/libpcrecpp_la-pcrecpp.Tpo -c -o libpcrecpp_la-pcrecpp.lo `test -f 'pcrecpp.cc' || echo '$(srcdir)/'`pcrecpp.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcrecpp_la-pcrecpp.Tpo $(DEPDIR)/libpcrecpp_la-pcrecpp.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='pcrecpp.cc' object='libpcrecpp_la-pcrecpp.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcrecpp_la_CXXFLAGS) $(CXXFLAGS) -c -o libpcrecpp_la-pcrecpp.lo `test -f 'pcrecpp.cc' || echo '$(srcdir)/'`pcrecpp.cc + +libpcrecpp_la-pcre_scanner.lo: pcre_scanner.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcrecpp_la_CXXFLAGS) $(CXXFLAGS) -MT libpcrecpp_la-pcre_scanner.lo -MD -MP -MF $(DEPDIR)/libpcrecpp_la-pcre_scanner.Tpo -c -o libpcrecpp_la-pcre_scanner.lo `test -f 'pcre_scanner.cc' || echo '$(srcdir)/'`pcre_scanner.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcrecpp_la-pcre_scanner.Tpo $(DEPDIR)/libpcrecpp_la-pcre_scanner.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='pcre_scanner.cc' object='libpcrecpp_la-pcre_scanner.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcrecpp_la_CXXFLAGS) $(CXXFLAGS) -c -o libpcrecpp_la-pcre_scanner.lo `test -f 'pcre_scanner.cc' || echo '$(srcdir)/'`pcre_scanner.cc + +libpcrecpp_la-pcre_stringpiece.lo: pcre_stringpiece.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcrecpp_la_CXXFLAGS) $(CXXFLAGS) -MT libpcrecpp_la-pcre_stringpiece.lo -MD -MP -MF $(DEPDIR)/libpcrecpp_la-pcre_stringpiece.Tpo -c -o libpcrecpp_la-pcre_stringpiece.lo `test -f 'pcre_stringpiece.cc' || echo '$(srcdir)/'`pcre_stringpiece.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpcrecpp_la-pcre_stringpiece.Tpo $(DEPDIR)/libpcrecpp_la-pcre_stringpiece.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='pcre_stringpiece.cc' object='libpcrecpp_la-pcre_stringpiece.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcrecpp_la_CXXFLAGS) $(CXXFLAGS) -c -o libpcrecpp_la-pcre_stringpiece.lo `test -f 'pcre_stringpiece.cc' || echo '$(srcdir)/'`pcre_stringpiece.cc + +pcre_scanner_unittest-pcre_scanner_unittest.o: pcre_scanner_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcre_scanner_unittest_CXXFLAGS) $(CXXFLAGS) -MT pcre_scanner_unittest-pcre_scanner_unittest.o -MD -MP -MF $(DEPDIR)/pcre_scanner_unittest-pcre_scanner_unittest.Tpo -c -o pcre_scanner_unittest-pcre_scanner_unittest.o `test -f 'pcre_scanner_unittest.cc' || echo '$(srcdir)/'`pcre_scanner_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pcre_scanner_unittest-pcre_scanner_unittest.Tpo $(DEPDIR)/pcre_scanner_unittest-pcre_scanner_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='pcre_scanner_unittest.cc' object='pcre_scanner_unittest-pcre_scanner_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcre_scanner_unittest_CXXFLAGS) $(CXXFLAGS) -c -o pcre_scanner_unittest-pcre_scanner_unittest.o `test -f 'pcre_scanner_unittest.cc' || echo '$(srcdir)/'`pcre_scanner_unittest.cc + +pcre_scanner_unittest-pcre_scanner_unittest.obj: pcre_scanner_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcre_scanner_unittest_CXXFLAGS) $(CXXFLAGS) -MT pcre_scanner_unittest-pcre_scanner_unittest.obj -MD -MP -MF $(DEPDIR)/pcre_scanner_unittest-pcre_scanner_unittest.Tpo -c -o pcre_scanner_unittest-pcre_scanner_unittest.obj `if test -f 'pcre_scanner_unittest.cc'; then $(CYGPATH_W) 'pcre_scanner_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/pcre_scanner_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pcre_scanner_unittest-pcre_scanner_unittest.Tpo $(DEPDIR)/pcre_scanner_unittest-pcre_scanner_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='pcre_scanner_unittest.cc' object='pcre_scanner_unittest-pcre_scanner_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcre_scanner_unittest_CXXFLAGS) $(CXXFLAGS) -c -o pcre_scanner_unittest-pcre_scanner_unittest.obj `if test -f 'pcre_scanner_unittest.cc'; then $(CYGPATH_W) 'pcre_scanner_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/pcre_scanner_unittest.cc'; fi` + +pcre_stringpiece_unittest-pcre_stringpiece_unittest.o: pcre_stringpiece_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcre_stringpiece_unittest_CXXFLAGS) $(CXXFLAGS) -MT pcre_stringpiece_unittest-pcre_stringpiece_unittest.o -MD -MP -MF $(DEPDIR)/pcre_stringpiece_unittest-pcre_stringpiece_unittest.Tpo -c -o pcre_stringpiece_unittest-pcre_stringpiece_unittest.o `test -f 'pcre_stringpiece_unittest.cc' || echo '$(srcdir)/'`pcre_stringpiece_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pcre_stringpiece_unittest-pcre_stringpiece_unittest.Tpo $(DEPDIR)/pcre_stringpiece_unittest-pcre_stringpiece_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='pcre_stringpiece_unittest.cc' object='pcre_stringpiece_unittest-pcre_stringpiece_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcre_stringpiece_unittest_CXXFLAGS) $(CXXFLAGS) -c -o pcre_stringpiece_unittest-pcre_stringpiece_unittest.o `test -f 'pcre_stringpiece_unittest.cc' || echo '$(srcdir)/'`pcre_stringpiece_unittest.cc + +pcre_stringpiece_unittest-pcre_stringpiece_unittest.obj: pcre_stringpiece_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcre_stringpiece_unittest_CXXFLAGS) $(CXXFLAGS) -MT pcre_stringpiece_unittest-pcre_stringpiece_unittest.obj -MD -MP -MF $(DEPDIR)/pcre_stringpiece_unittest-pcre_stringpiece_unittest.Tpo -c -o pcre_stringpiece_unittest-pcre_stringpiece_unittest.obj `if test -f 'pcre_stringpiece_unittest.cc'; then $(CYGPATH_W) 'pcre_stringpiece_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/pcre_stringpiece_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pcre_stringpiece_unittest-pcre_stringpiece_unittest.Tpo $(DEPDIR)/pcre_stringpiece_unittest-pcre_stringpiece_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='pcre_stringpiece_unittest.cc' object='pcre_stringpiece_unittest-pcre_stringpiece_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcre_stringpiece_unittest_CXXFLAGS) $(CXXFLAGS) -c -o pcre_stringpiece_unittest-pcre_stringpiece_unittest.obj `if test -f 'pcre_stringpiece_unittest.cc'; then $(CYGPATH_W) 'pcre_stringpiece_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/pcre_stringpiece_unittest.cc'; fi` + +pcrecpp_unittest-pcrecpp_unittest.o: pcrecpp_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcrecpp_unittest_CXXFLAGS) $(CXXFLAGS) -MT pcrecpp_unittest-pcrecpp_unittest.o -MD -MP -MF $(DEPDIR)/pcrecpp_unittest-pcrecpp_unittest.Tpo -c -o pcrecpp_unittest-pcrecpp_unittest.o `test -f 'pcrecpp_unittest.cc' || echo '$(srcdir)/'`pcrecpp_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pcrecpp_unittest-pcrecpp_unittest.Tpo $(DEPDIR)/pcrecpp_unittest-pcrecpp_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='pcrecpp_unittest.cc' object='pcrecpp_unittest-pcrecpp_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcrecpp_unittest_CXXFLAGS) $(CXXFLAGS) -c -o pcrecpp_unittest-pcrecpp_unittest.o `test -f 'pcrecpp_unittest.cc' || echo '$(srcdir)/'`pcrecpp_unittest.cc + +pcrecpp_unittest-pcrecpp_unittest.obj: pcrecpp_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcrecpp_unittest_CXXFLAGS) $(CXXFLAGS) -MT pcrecpp_unittest-pcrecpp_unittest.obj -MD -MP -MF $(DEPDIR)/pcrecpp_unittest-pcrecpp_unittest.Tpo -c -o pcrecpp_unittest-pcrecpp_unittest.obj `if test -f 'pcrecpp_unittest.cc'; then $(CYGPATH_W) 'pcrecpp_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/pcrecpp_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pcrecpp_unittest-pcrecpp_unittest.Tpo $(DEPDIR)/pcrecpp_unittest-pcrecpp_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='pcrecpp_unittest.cc' object='pcrecpp_unittest-pcrecpp_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcrecpp_unittest_CXXFLAGS) $(CXXFLAGS) -c -o pcrecpp_unittest-pcrecpp_unittest.obj `if test -f 'pcrecpp_unittest.cc'; then $(CYGPATH_W) 'pcrecpp_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/pcrecpp_unittest.cc'; fi` + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool config.lt +install-man1: $(dist_man_MANS) $(man_MANS) + @$(NORMAL_INSTALL) + @list1=''; \ + list2='$(dist_man_MANS) $(man_MANS)'; \ + test -n "$(man1dir)" \ + && test -n "`echo $$list1$$list2`" \ + || exit 0; \ + echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ + { for i in $$list1; do echo "$$i"; done; \ + if test -n "$$list2"; then \ + for i in $$list2; do echo "$$i"; done \ + | sed -n '/\.1[a-z]*$$/p'; \ + fi; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ + done; } + +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man1dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(dist_man_MANS) $(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) +install-man3: $(dist_man_MANS) $(man_MANS) + @$(NORMAL_INSTALL) + @list1=''; \ + list2='$(dist_man_MANS) $(man_MANS)'; \ + test -n "$(man3dir)" \ + && test -n "`echo $$list1$$list2`" \ + || exit 0; \ + echo " $(MKDIR_P) '$(DESTDIR)$(man3dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(man3dir)" || exit 1; \ + { for i in $$list1; do echo "$$i"; done; \ + if test -n "$$list2"; then \ + for i in $$list2; do echo "$$i"; done \ + | sed -n '/\.3[a-z]*$$/p'; \ + fi; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man3dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man3dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man3dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man3dir)" || exit $$?; }; \ + done; } + +uninstall-man3: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man3dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(dist_man_MANS) $(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.3[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + dir='$(DESTDIR)$(man3dir)'; $(am__uninstall_files_from_dir) +install-dist_docDATA: $(dist_doc_DATA) + @$(NORMAL_INSTALL) + @list='$(dist_doc_DATA)'; test -n "$(docdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(docdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(docdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(docdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(docdir)" || exit $$?; \ + done + +uninstall-dist_docDATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_doc_DATA)'; test -n "$(docdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(docdir)'; $(am__uninstall_files_from_dir) +install-dist_htmlDATA: $(dist_html_DATA) + @$(NORMAL_INSTALL) + @list='$(dist_html_DATA)'; test -n "$(htmldir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(htmldir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(htmldir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(htmldir)" || exit $$?; \ + done + +uninstall-dist_htmlDATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_html_DATA)'; test -n "$(htmldir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(htmldir)'; $(am__uninstall_files_from_dir) +install-htmlDATA: $(html_DATA) + @$(NORMAL_INSTALL) + @list='$(html_DATA)'; test -n "$(htmldir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(htmldir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(htmldir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(htmldir)" || exit $$?; \ + done + +uninstall-htmlDATA: + @$(NORMAL_UNINSTALL) + @list='$(html_DATA)'; test -n "$(htmldir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(htmldir)'; $(am__uninstall_files_from_dir) +install-pkgconfigDATA: $(pkgconfig_DATA) + @$(NORMAL_INSTALL) + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ + done + +uninstall-pkgconfigDATA: + @$(NORMAL_UNINSTALL) + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) +install-includeHEADERS: $(include_HEADERS) + @$(NORMAL_INSTALL) + @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ + done + +uninstall-includeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) +install-nodist_includeHEADERS: $(nodist_include_HEADERS) + @$(NORMAL_INSTALL) + @list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ + done + +uninstall-nodist_includeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscope: cscope.files + test ! -s cscope.files \ + || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) +clean-cscope: + -rm -f cscope.files +cscope.files: clean-cscope cscopelist +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + -rm -f cscope.out cscope.in.out cscope.po.out cscope.files + +# Recover from deleted '.trs' file; this should ensure that +# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create +# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells +# to avoid problems with "make -n". +.log.trs: + rm -f $< $@ + $(MAKE) $(AM_MAKEFLAGS) $< + +# Leading 'am--fnord' is there to ensure the list of targets does not +# expand to empty, as could happen e.g. with make check TESTS=''. +am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) +am--force-recheck: + @: + +$(TEST_SUITE_LOG): $(TEST_LOGS) + @$(am__set_TESTS_bases); \ + am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ + redo_bases=`for i in $$bases; do \ + am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ + done`; \ + if test -n "$$redo_bases"; then \ + redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ + redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ + if $(am__make_dryrun); then :; else \ + rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ + fi; \ + fi; \ + if test -n "$$am__remaking_logs"; then \ + echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ + "recursion detected" >&2; \ + elif test -n "$$redo_logs"; then \ + am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ + fi; \ + if $(am__make_dryrun); then :; else \ + st=0; \ + errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ + for i in $$redo_bases; do \ + test -f $$i.trs && test -r $$i.trs \ + || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ + test -f $$i.log && test -r $$i.log \ + || { echo "$$errmsg $$i.log" >&2; st=1; }; \ + done; \ + test $$st -eq 0 || exit 1; \ + fi + @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ + ws='[ ]'; \ + results=`for b in $$bases; do echo $$b.trs; done`; \ + test -n "$$results" || results=/dev/null; \ + all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ + pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ + fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ + skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ + xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ + xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ + error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ + if test `expr $$fail + $$xpass + $$error` -eq 0; then \ + success=true; \ + else \ + success=false; \ + fi; \ + br='==================='; br=$$br$$br$$br$$br; \ + result_count () \ + { \ + if test x"$$1" = x"--maybe-color"; then \ + maybe_colorize=yes; \ + elif test x"$$1" = x"--no-color"; then \ + maybe_colorize=no; \ + else \ + echo "$@: invalid 'result_count' usage" >&2; exit 4; \ + fi; \ + shift; \ + desc=$$1 count=$$2; \ + if test $$maybe_colorize = yes && test $$count -gt 0; then \ + color_start=$$3 color_end=$$std; \ + else \ + color_start= color_end=; \ + fi; \ + echo "$${color_start}# $$desc $$count$${color_end}"; \ + }; \ + create_testsuite_report () \ + { \ + result_count $$1 "TOTAL:" $$all "$$brg"; \ + result_count $$1 "PASS: " $$pass "$$grn"; \ + result_count $$1 "SKIP: " $$skip "$$blu"; \ + result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ + result_count $$1 "FAIL: " $$fail "$$red"; \ + result_count $$1 "XPASS:" $$xpass "$$red"; \ + result_count $$1 "ERROR:" $$error "$$mgn"; \ + }; \ + { \ + echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ + $(am__rst_title); \ + create_testsuite_report --no-color; \ + echo; \ + echo ".. contents:: :depth: 2"; \ + echo; \ + for b in $$bases; do echo $$b; done \ + | $(am__create_global_log); \ + } >$(TEST_SUITE_LOG).tmp || exit 1; \ + mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ + if $$success; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ + fi; \ + echo "$${col}$$br$${std}"; \ + echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ + echo "$${col}$$br$${std}"; \ + create_testsuite_report --maybe-color; \ + echo "$$col$$br$$std"; \ + if $$success; then :; else \ + echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ + if test -n "$(PACKAGE_BUGREPORT)"; then \ + echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ + fi; \ + echo "$$col$$br$$std"; \ + fi; \ + $$success || exit 1 + +check-TESTS: $(check_SCRIPTS) + @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list + @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + trs_list=`for i in $$bases; do echo $$i.trs; done`; \ + log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ + exit $$?; +recheck: all $(check_SCRIPTS) + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + bases=`for i in $$bases; do echo $$i; done \ + | $(am__list_recheck_tests)` || exit 1; \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + log_list=`echo $$log_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ + am__force_recheck=am--force-recheck \ + TEST_LOGS="$$log_list"; \ + exit $$? +pcre_jit_test.log: pcre_jit_test$(EXEEXT) + @p='pcre_jit_test$(EXEEXT)'; \ + b='pcre_jit_test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +pcrecpp_unittest.log: pcrecpp_unittest$(EXEEXT) + @p='pcrecpp_unittest$(EXEEXT)'; \ + b='pcrecpp_unittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +pcre_scanner_unittest.log: pcre_scanner_unittest$(EXEEXT) + @p='pcre_scanner_unittest$(EXEEXT)'; \ + b='pcre_scanner_unittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +pcre_stringpiece_unittest.log: pcre_stringpiece_unittest$(EXEEXT) + @p='pcre_stringpiece_unittest$(EXEEXT)'; \ + b='pcre_stringpiece_unittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +RunTest.log: RunTest + @p='RunTest'; \ + b='RunTest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +RunGrepTest.log: RunGrepTest + @p='RunGrepTest'; \ + b='RunGrepTest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +.test.log: + @p='$<'; \ + $(am__set_b); \ + $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +@am__EXEEXT_TRUE@.test$(EXEEXT).log: +@am__EXEEXT_TRUE@ @p='$<'; \ +@am__EXEEXT_TRUE@ $(am__set_b); \ +@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ +@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ +@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ +@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + $(am__remove_distdir) + test -d "$(distdir)" || mkdir "$(distdir)" + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + -test -n "$(am__skip_mode_fix)" \ + || find "$(distdir)" -type d ! -perm -755 \ + -exec chmod u+rwx,go+rx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r "$(distdir)" +dist-gzip: distdir + tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz + $(am__post_remove_distdir) +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 + $(am__post_remove_distdir) + +dist-lzip: distdir + tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz + $(am__post_remove_distdir) + +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz + $(am__post_remove_distdir) + +dist-tarZ: distdir + @echo WARNING: "Support for distribution archives compressed with" \ + "legacy program 'compress' is deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__post_remove_distdir) + +dist-shar: distdir + @echo WARNING: "Support for shar distribution archives is" \ + "deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz + $(am__post_remove_distdir) +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__post_remove_distdir) + +dist dist-all: + $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' + $(am__post_remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.lz*) \ + lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ + *.tar.xz*) \ + xz -dc $(distdir).tar.xz | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir) + chmod u+w $(distdir) + mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst + chmod a-w $(distdir) + test -d $(distdir)/_build || exit 0; \ + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && am__cwd=`pwd` \ + && $(am__cd) $(distdir)/_build/sub \ + && ../../configure \ + $(AM_DISTCHECK_CONFIGURE_FLAGS) \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + --srcdir=../.. --prefix="$$dc_install_base" \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ + && cd "$$am__cwd" \ + || exit 1 + $(am__post_remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' +distuninstallcheck: + @test -n '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: trying to run $@ with an empty' \ + '$$(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + $(am__cd) '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_SCRIPTS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(PROGRAMS) $(LTLIBRARIES) $(SCRIPTS) $(MANS) $(DATA) \ + $(HEADERS) config.h +install-binPROGRAMS: install-libLTLIBRARIES + +installdirs: + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man3dir)" "$(DESTDIR)$(docdir)" "$(DESTDIR)$(htmldir)" "$(DESTDIR)$(htmldir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(includedir)" "$(DESTDIR)$(includedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) + -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) + -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +@WITH_GCOV_FALSE@clean-local: +@WITH_GCOV_FALSE@distclean-local: +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \ + clean-libtool clean-local clean-noinstPROGRAMS mostlyclean-am + +distclean: distclean-am + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -f ./$(DEPDIR)/dftables.Po + -rm -f ./$(DEPDIR)/libpcre16_la-pcre16_byte_order.Plo + -rm -f ./$(DEPDIR)/libpcre16_la-pcre16_chartables.Plo + -rm -f ./$(DEPDIR)/libpcre16_la-pcre16_compile.Plo + -rm -f ./$(DEPDIR)/libpcre16_la-pcre16_config.Plo + -rm -f ./$(DEPDIR)/libpcre16_la-pcre16_dfa_exec.Plo + -rm -f ./$(DEPDIR)/libpcre16_la-pcre16_exec.Plo + -rm -f ./$(DEPDIR)/libpcre16_la-pcre16_fullinfo.Plo + -rm -f ./$(DEPDIR)/libpcre16_la-pcre16_get.Plo + -rm -f ./$(DEPDIR)/libpcre16_la-pcre16_globals.Plo + -rm -f ./$(DEPDIR)/libpcre16_la-pcre16_jit_compile.Plo + -rm -f ./$(DEPDIR)/libpcre16_la-pcre16_maketables.Plo + -rm -f ./$(DEPDIR)/libpcre16_la-pcre16_newline.Plo + -rm -f ./$(DEPDIR)/libpcre16_la-pcre16_ord2utf16.Plo + -rm -f ./$(DEPDIR)/libpcre16_la-pcre16_refcount.Plo + -rm -f ./$(DEPDIR)/libpcre16_la-pcre16_string_utils.Plo + -rm -f ./$(DEPDIR)/libpcre16_la-pcre16_study.Plo + -rm -f ./$(DEPDIR)/libpcre16_la-pcre16_tables.Plo + -rm -f ./$(DEPDIR)/libpcre16_la-pcre16_ucd.Plo + -rm -f ./$(DEPDIR)/libpcre16_la-pcre16_utf16_utils.Plo + -rm -f ./$(DEPDIR)/libpcre16_la-pcre16_valid_utf16.Plo + -rm -f ./$(DEPDIR)/libpcre16_la-pcre16_version.Plo + -rm -f ./$(DEPDIR)/libpcre16_la-pcre16_xclass.Plo + -rm -f ./$(DEPDIR)/libpcre16_la-pcre_chartables.Plo + -rm -f ./$(DEPDIR)/libpcre32_la-pcre32_byte_order.Plo + -rm -f ./$(DEPDIR)/libpcre32_la-pcre32_chartables.Plo + -rm -f ./$(DEPDIR)/libpcre32_la-pcre32_compile.Plo + -rm -f ./$(DEPDIR)/libpcre32_la-pcre32_config.Plo + -rm -f ./$(DEPDIR)/libpcre32_la-pcre32_dfa_exec.Plo + -rm -f ./$(DEPDIR)/libpcre32_la-pcre32_exec.Plo + -rm -f ./$(DEPDIR)/libpcre32_la-pcre32_fullinfo.Plo + -rm -f ./$(DEPDIR)/libpcre32_la-pcre32_get.Plo + -rm -f ./$(DEPDIR)/libpcre32_la-pcre32_globals.Plo + -rm -f ./$(DEPDIR)/libpcre32_la-pcre32_jit_compile.Plo + -rm -f ./$(DEPDIR)/libpcre32_la-pcre32_maketables.Plo + -rm -f ./$(DEPDIR)/libpcre32_la-pcre32_newline.Plo + -rm -f ./$(DEPDIR)/libpcre32_la-pcre32_ord2utf32.Plo + -rm -f ./$(DEPDIR)/libpcre32_la-pcre32_refcount.Plo + -rm -f ./$(DEPDIR)/libpcre32_la-pcre32_string_utils.Plo + -rm -f ./$(DEPDIR)/libpcre32_la-pcre32_study.Plo + -rm -f ./$(DEPDIR)/libpcre32_la-pcre32_tables.Plo + -rm -f ./$(DEPDIR)/libpcre32_la-pcre32_ucd.Plo + -rm -f ./$(DEPDIR)/libpcre32_la-pcre32_utf32_utils.Plo + -rm -f ./$(DEPDIR)/libpcre32_la-pcre32_valid_utf32.Plo + -rm -f ./$(DEPDIR)/libpcre32_la-pcre32_version.Plo + -rm -f ./$(DEPDIR)/libpcre32_la-pcre32_xclass.Plo + -rm -f ./$(DEPDIR)/libpcre32_la-pcre_chartables.Plo + -rm -f ./$(DEPDIR)/libpcre_la-pcre_byte_order.Plo + -rm -f ./$(DEPDIR)/libpcre_la-pcre_chartables.Plo + -rm -f ./$(DEPDIR)/libpcre_la-pcre_compile.Plo + -rm -f ./$(DEPDIR)/libpcre_la-pcre_config.Plo + -rm -f ./$(DEPDIR)/libpcre_la-pcre_dfa_exec.Plo + -rm -f ./$(DEPDIR)/libpcre_la-pcre_exec.Plo + -rm -f ./$(DEPDIR)/libpcre_la-pcre_fullinfo.Plo + -rm -f ./$(DEPDIR)/libpcre_la-pcre_get.Plo + -rm -f ./$(DEPDIR)/libpcre_la-pcre_globals.Plo + -rm -f ./$(DEPDIR)/libpcre_la-pcre_jit_compile.Plo + -rm -f ./$(DEPDIR)/libpcre_la-pcre_maketables.Plo + -rm -f ./$(DEPDIR)/libpcre_la-pcre_newline.Plo + -rm -f ./$(DEPDIR)/libpcre_la-pcre_ord2utf8.Plo + -rm -f ./$(DEPDIR)/libpcre_la-pcre_refcount.Plo + -rm -f ./$(DEPDIR)/libpcre_la-pcre_string_utils.Plo + -rm -f ./$(DEPDIR)/libpcre_la-pcre_study.Plo + -rm -f ./$(DEPDIR)/libpcre_la-pcre_tables.Plo + -rm -f ./$(DEPDIR)/libpcre_la-pcre_ucd.Plo + -rm -f ./$(DEPDIR)/libpcre_la-pcre_valid_utf8.Plo + -rm -f ./$(DEPDIR)/libpcre_la-pcre_version.Plo + -rm -f ./$(DEPDIR)/libpcre_la-pcre_xclass.Plo + -rm -f ./$(DEPDIR)/libpcrecpp_la-pcre_scanner.Plo + -rm -f ./$(DEPDIR)/libpcrecpp_la-pcre_stringpiece.Plo + -rm -f ./$(DEPDIR)/libpcrecpp_la-pcrecpp.Plo + -rm -f ./$(DEPDIR)/libpcreposix_la-pcreposix.Plo + -rm -f ./$(DEPDIR)/pcre_jit_test-pcre_jit_test.Po + -rm -f ./$(DEPDIR)/pcre_scanner_unittest-pcre_scanner_unittest.Po + -rm -f ./$(DEPDIR)/pcre_stringpiece_unittest-pcre_stringpiece_unittest.Po + -rm -f ./$(DEPDIR)/pcrecpp_unittest-pcrecpp_unittest.Po + -rm -f ./$(DEPDIR)/pcregrep-pcregrep.Po + -rm -f ./$(DEPDIR)/pcretest-pcre16_printint.Po + -rm -f ./$(DEPDIR)/pcretest-pcre32_printint.Po + -rm -f ./$(DEPDIR)/pcretest-pcre_printint.Po + -rm -f ./$(DEPDIR)/pcretest-pcretest.Po + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-hdr distclean-libtool distclean-local distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-dist_docDATA install-dist_htmlDATA \ + install-htmlDATA install-includeHEADERS install-man \ + install-nodist_includeHEADERS install-pkgconfigDATA + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-data-hook +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS install-binSCRIPTS \ + install-libLTLIBRARIES + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: install-man1 install-man3 + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -f ./$(DEPDIR)/dftables.Po + -rm -f ./$(DEPDIR)/libpcre16_la-pcre16_byte_order.Plo + -rm -f ./$(DEPDIR)/libpcre16_la-pcre16_chartables.Plo + -rm -f ./$(DEPDIR)/libpcre16_la-pcre16_compile.Plo + -rm -f ./$(DEPDIR)/libpcre16_la-pcre16_config.Plo + -rm -f ./$(DEPDIR)/libpcre16_la-pcre16_dfa_exec.Plo + -rm -f ./$(DEPDIR)/libpcre16_la-pcre16_exec.Plo + -rm -f ./$(DEPDIR)/libpcre16_la-pcre16_fullinfo.Plo + -rm -f ./$(DEPDIR)/libpcre16_la-pcre16_get.Plo + -rm -f ./$(DEPDIR)/libpcre16_la-pcre16_globals.Plo + -rm -f ./$(DEPDIR)/libpcre16_la-pcre16_jit_compile.Plo + -rm -f ./$(DEPDIR)/libpcre16_la-pcre16_maketables.Plo + -rm -f ./$(DEPDIR)/libpcre16_la-pcre16_newline.Plo + -rm -f ./$(DEPDIR)/libpcre16_la-pcre16_ord2utf16.Plo + -rm -f ./$(DEPDIR)/libpcre16_la-pcre16_refcount.Plo + -rm -f ./$(DEPDIR)/libpcre16_la-pcre16_string_utils.Plo + -rm -f ./$(DEPDIR)/libpcre16_la-pcre16_study.Plo + -rm -f ./$(DEPDIR)/libpcre16_la-pcre16_tables.Plo + -rm -f ./$(DEPDIR)/libpcre16_la-pcre16_ucd.Plo + -rm -f ./$(DEPDIR)/libpcre16_la-pcre16_utf16_utils.Plo + -rm -f ./$(DEPDIR)/libpcre16_la-pcre16_valid_utf16.Plo + -rm -f ./$(DEPDIR)/libpcre16_la-pcre16_version.Plo + -rm -f ./$(DEPDIR)/libpcre16_la-pcre16_xclass.Plo + -rm -f ./$(DEPDIR)/libpcre16_la-pcre_chartables.Plo + -rm -f ./$(DEPDIR)/libpcre32_la-pcre32_byte_order.Plo + -rm -f ./$(DEPDIR)/libpcre32_la-pcre32_chartables.Plo + -rm -f ./$(DEPDIR)/libpcre32_la-pcre32_compile.Plo + -rm -f ./$(DEPDIR)/libpcre32_la-pcre32_config.Plo + -rm -f ./$(DEPDIR)/libpcre32_la-pcre32_dfa_exec.Plo + -rm -f ./$(DEPDIR)/libpcre32_la-pcre32_exec.Plo + -rm -f ./$(DEPDIR)/libpcre32_la-pcre32_fullinfo.Plo + -rm -f ./$(DEPDIR)/libpcre32_la-pcre32_get.Plo + -rm -f ./$(DEPDIR)/libpcre32_la-pcre32_globals.Plo + -rm -f ./$(DEPDIR)/libpcre32_la-pcre32_jit_compile.Plo + -rm -f ./$(DEPDIR)/libpcre32_la-pcre32_maketables.Plo + -rm -f ./$(DEPDIR)/libpcre32_la-pcre32_newline.Plo + -rm -f ./$(DEPDIR)/libpcre32_la-pcre32_ord2utf32.Plo + -rm -f ./$(DEPDIR)/libpcre32_la-pcre32_refcount.Plo + -rm -f ./$(DEPDIR)/libpcre32_la-pcre32_string_utils.Plo + -rm -f ./$(DEPDIR)/libpcre32_la-pcre32_study.Plo + -rm -f ./$(DEPDIR)/libpcre32_la-pcre32_tables.Plo + -rm -f ./$(DEPDIR)/libpcre32_la-pcre32_ucd.Plo + -rm -f ./$(DEPDIR)/libpcre32_la-pcre32_utf32_utils.Plo + -rm -f ./$(DEPDIR)/libpcre32_la-pcre32_valid_utf32.Plo + -rm -f ./$(DEPDIR)/libpcre32_la-pcre32_version.Plo + -rm -f ./$(DEPDIR)/libpcre32_la-pcre32_xclass.Plo + -rm -f ./$(DEPDIR)/libpcre32_la-pcre_chartables.Plo + -rm -f ./$(DEPDIR)/libpcre_la-pcre_byte_order.Plo + -rm -f ./$(DEPDIR)/libpcre_la-pcre_chartables.Plo + -rm -f ./$(DEPDIR)/libpcre_la-pcre_compile.Plo + -rm -f ./$(DEPDIR)/libpcre_la-pcre_config.Plo + -rm -f ./$(DEPDIR)/libpcre_la-pcre_dfa_exec.Plo + -rm -f ./$(DEPDIR)/libpcre_la-pcre_exec.Plo + -rm -f ./$(DEPDIR)/libpcre_la-pcre_fullinfo.Plo + -rm -f ./$(DEPDIR)/libpcre_la-pcre_get.Plo + -rm -f ./$(DEPDIR)/libpcre_la-pcre_globals.Plo + -rm -f ./$(DEPDIR)/libpcre_la-pcre_jit_compile.Plo + -rm -f ./$(DEPDIR)/libpcre_la-pcre_maketables.Plo + -rm -f ./$(DEPDIR)/libpcre_la-pcre_newline.Plo + -rm -f ./$(DEPDIR)/libpcre_la-pcre_ord2utf8.Plo + -rm -f ./$(DEPDIR)/libpcre_la-pcre_refcount.Plo + -rm -f ./$(DEPDIR)/libpcre_la-pcre_string_utils.Plo + -rm -f ./$(DEPDIR)/libpcre_la-pcre_study.Plo + -rm -f ./$(DEPDIR)/libpcre_la-pcre_tables.Plo + -rm -f ./$(DEPDIR)/libpcre_la-pcre_ucd.Plo + -rm -f ./$(DEPDIR)/libpcre_la-pcre_valid_utf8.Plo + -rm -f ./$(DEPDIR)/libpcre_la-pcre_version.Plo + -rm -f ./$(DEPDIR)/libpcre_la-pcre_xclass.Plo + -rm -f ./$(DEPDIR)/libpcrecpp_la-pcre_scanner.Plo + -rm -f ./$(DEPDIR)/libpcrecpp_la-pcre_stringpiece.Plo + -rm -f ./$(DEPDIR)/libpcrecpp_la-pcrecpp.Plo + -rm -f ./$(DEPDIR)/libpcreposix_la-pcreposix.Plo + -rm -f ./$(DEPDIR)/pcre_jit_test-pcre_jit_test.Po + -rm -f ./$(DEPDIR)/pcre_scanner_unittest-pcre_scanner_unittest.Po + -rm -f ./$(DEPDIR)/pcre_stringpiece_unittest-pcre_stringpiece_unittest.Po + -rm -f ./$(DEPDIR)/pcrecpp_unittest-pcrecpp_unittest.Po + -rm -f ./$(DEPDIR)/pcregrep-pcregrep.Po + -rm -f ./$(DEPDIR)/pcretest-pcre16_printint.Po + -rm -f ./$(DEPDIR)/pcretest-pcre32_printint.Po + -rm -f ./$(DEPDIR)/pcretest-pcre_printint.Po + -rm -f ./$(DEPDIR)/pcretest-pcretest.Po + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-binSCRIPTS \ + uninstall-dist_docDATA uninstall-dist_htmlDATA \ + uninstall-htmlDATA uninstall-includeHEADERS \ + uninstall-libLTLIBRARIES uninstall-man \ + uninstall-nodist_includeHEADERS uninstall-pkgconfigDATA + +uninstall-man: uninstall-man1 uninstall-man3 + +.MAKE: all check check-am install install-am install-data-am \ + install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles am--refresh check \ + check-TESTS check-am clean clean-binPROGRAMS clean-cscope \ + clean-generic clean-libLTLIBRARIES clean-libtool clean-local \ + clean-noinstPROGRAMS cscope cscopelist-am ctags ctags-am dist \ + dist-all dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ \ + dist-xz dist-zip distcheck distclean distclean-compile \ + distclean-generic distclean-hdr distclean-libtool \ + distclean-local distclean-tags distcleancheck distdir \ + distuninstallcheck dvi dvi-am html html-am info info-am \ + install install-am install-binPROGRAMS install-binSCRIPTS \ + install-data install-data-am install-data-hook \ + install-dist_docDATA install-dist_htmlDATA install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-htmlDATA install-includeHEADERS \ + install-info install-info-am install-libLTLIBRARIES \ + install-man install-man1 install-man3 \ + install-nodist_includeHEADERS install-pdf install-pdf-am \ + install-pkgconfigDATA install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + recheck tags tags-am uninstall uninstall-am \ + uninstall-binPROGRAMS uninstall-binSCRIPTS \ + uninstall-dist_docDATA uninstall-dist_htmlDATA \ + uninstall-htmlDATA uninstall-includeHEADERS \ + uninstall-libLTLIBRARIES uninstall-man uninstall-man1 \ + uninstall-man3 uninstall-nodist_includeHEADERS \ + uninstall-pkgconfigDATA + +.PRECIOUS: Makefile + + +# The only difference between pcre.h.in and pcre.h is the setting of the PCRE +# version number. Therefore, we can create the generic version just by copying. +pcre.h.generic: pcre.h.in configure.ac + rm -f $@ + cp -p pcre.h $@ + +# It is more complicated for config.h.generic. We need the version that results +# from a default configuration so as to get all the default values for PCRE +# configuration macros such as MATCH_LIMIT and NEWLINE. We can get this by +# doing a configure in a temporary directory. However, some trickery is needed, +# because the source directory may already be configured. If you just try +# running configure in a new directory, it complains. For this reason, we move +# config.status out of the way while doing the default configuration. The +# resulting config.h is munged by perl to put #ifdefs round any #defines for +# macros with values, and to #undef all boolean macros such as HAVE_xxx and +# SUPPORT_xxx. We also get rid of any gcc-specific visibility settings. Make +# sure that PCRE_EXP_DEFN is unset (in case it has visibility settings). +config.h.generic: configure.ac + rm -rf $@ _generic + mkdir _generic + cs=$(srcdir)/config.status; test ! -f $$cs || mv -f $$cs $$cs.aside + cd _generic && $(abs_top_srcdir)/configure || : + cs=$(srcdir)/config.status; test ! -f $$cs.aside || mv -f $$cs.aside $$cs + test -f _generic/config.h + perl -n \ + -e 'BEGIN{$$blank=0;}' \ + -e 'if(/PCRE_EXP_DEFN/){print"/* #undef PCRE_EXP_DEFN */\n";$$blank=0;next;}' \ + -e 'if(/to make a symbol visible/){next;}' \ + -e 'if(/__attribute__ \(\(visibility/){next;}' \ + -e 'if(/LT_OBJDIR/){print"/* This is ignored unless you are using libtool. */\n";}' \ + -e 'if(/^#define\s((?:HAVE|SUPPORT|STDC)_\w+)/){print"/* #undef $$1 */\n";$$blank=0;next;}' \ + -e 'if(/^#define\s(?!PACKAGE|VERSION)(\w+)/){print"#ifndef $$1\n$$_#endif\n";$$blank=0;next;}' \ + -e 'if(/^\s*$$/){print unless $$blank; $$blank=1;} else{print;$$blank=0;}' \ + _generic/config.h >$@ + rm -rf _generic + +@WITH_REBUILD_CHARTABLES_TRUE@pcre_chartables.c: dftables$(EXEEXT) +@WITH_REBUILD_CHARTABLES_TRUE@ ./dftables$(EXEEXT) $@ + +@WITH_REBUILD_CHARTABLES_FALSE@pcre_chartables.c: $(srcdir)/pcre_chartables.c.dist +@WITH_REBUILD_CHARTABLES_FALSE@ rm -f $@ +@WITH_REBUILD_CHARTABLES_FALSE@ $(LN_S) $(srcdir)/pcre_chartables.c.dist $@ + +# A compatibility line, the old build system worked with 'make test' +test: check ; + +# A PCRE user submitted the following addition, saying that it "will allow +# anyone using the 'mingw32' compiler to simply type 'make pcre.dll' and get a +# nice DLL for Windows use". +pcre.dll: $(DLL_OBJS) + $(CC) -shared -o pcre.dll -Wl,"--strip-all" -Wl,"--export-all-symbols" $(DLL_OBJS) + +# Arrange for the per-function man pages to have 16- and 32-bit names as well. +install-data-hook: + ln -sf pcre_assign_jit_stack.3 $(DESTDIR)$(man3dir)/pcre16_assign_jit_stack.3 + ln -sf pcre_compile.3 $(DESTDIR)$(man3dir)/pcre16_compile.3 + ln -sf pcre_compile2.3 $(DESTDIR)$(man3dir)/pcre16_compile2.3 + ln -sf pcre_config.3 $(DESTDIR)$(man3dir)/pcre16_config.3 + ln -sf pcre_copy_named_substring.3 $(DESTDIR)$(man3dir)/pcre16_copy_named_substring.3 + ln -sf pcre_copy_substring.3 $(DESTDIR)$(man3dir)/pcre16_copy_substring.3 + ln -sf pcre_dfa_exec.3 $(DESTDIR)$(man3dir)/pcre16_dfa_exec.3 + ln -sf pcre_exec.3 $(DESTDIR)$(man3dir)/pcre16_exec.3 + ln -sf pcre_free_study.3 $(DESTDIR)$(man3dir)/pcre16_free_study.3 + ln -sf pcre_free_substring.3 $(DESTDIR)$(man3dir)/pcre16_free_substring.3 + ln -sf pcre_free_substring_list.3 $(DESTDIR)$(man3dir)/pcre16_free_substring_list.3 + ln -sf pcre_fullinfo.3 $(DESTDIR)$(man3dir)/pcre16_fullinfo.3 + ln -sf pcre_get_named_substring.3 $(DESTDIR)$(man3dir)/pcre16_get_named_substring.3 + ln -sf pcre_get_stringnumber.3 $(DESTDIR)$(man3dir)/pcre16_get_stringnumber.3 + ln -sf pcre_get_stringtable_entries.3 $(DESTDIR)$(man3dir)/pcre16_get_stringtable_entries.3 + ln -sf pcre_get_substring.3 $(DESTDIR)$(man3dir)/pcre16_get_substring.3 + ln -sf pcre_get_substring_list.3 $(DESTDIR)$(man3dir)/pcre16_get_substring_list.3 + ln -sf pcre_jit_exec.3 $(DESTDIR)$(man3dir)/pcre16_jit_exec.3 + ln -sf pcre_jit_stack_alloc.3 $(DESTDIR)$(man3dir)/pcre16_jit_stack_alloc.3 + ln -sf pcre_jit_stack_free.3 $(DESTDIR)$(man3dir)/pcre16_jit_stack_free.3 + ln -sf pcre_maketables.3 $(DESTDIR)$(man3dir)/pcre16_maketables.3 + ln -sf pcre_pattern_to_host_byte_order.3 $(DESTDIR)$(man3dir)/pcre16_pattern_to_host_byte_order.3 + ln -sf pcre_refcount.3 $(DESTDIR)$(man3dir)/pcre16_refcount.3 + ln -sf pcre_study.3 $(DESTDIR)$(man3dir)/pcre16_study.3 + ln -sf pcre_utf16_to_host_byte_order.3 $(DESTDIR)$(man3dir)/pcre16_utf16_to_host_byte_order.3 + ln -sf pcre_version.3 $(DESTDIR)$(man3dir)/pcre16_version.3 + ln -sf pcre_assign_jit_stack.3 $(DESTDIR)$(man3dir)/pcre32_assign_jit_stack.3 + ln -sf pcre_compile.3 $(DESTDIR)$(man3dir)/pcre32_compile.3 + ln -sf pcre_compile2.3 $(DESTDIR)$(man3dir)/pcre32_compile2.3 + ln -sf pcre_config.3 $(DESTDIR)$(man3dir)/pcre32_config.3 + ln -sf pcre_copy_named_substring.3 $(DESTDIR)$(man3dir)/pcre32_copy_named_substring.3 + ln -sf pcre_copy_substring.3 $(DESTDIR)$(man3dir)/pcre32_copy_substring.3 + ln -sf pcre_dfa_exec.3 $(DESTDIR)$(man3dir)/pcre32_dfa_exec.3 + ln -sf pcre_exec.3 $(DESTDIR)$(man3dir)/pcre32_exec.3 + ln -sf pcre_free_study.3 $(DESTDIR)$(man3dir)/pcre32_free_study.3 + ln -sf pcre_free_substring.3 $(DESTDIR)$(man3dir)/pcre32_free_substring.3 + ln -sf pcre_free_substring_list.3 $(DESTDIR)$(man3dir)/pcre32_free_substring_list.3 + ln -sf pcre_fullinfo.3 $(DESTDIR)$(man3dir)/pcre32_fullinfo.3 + ln -sf pcre_get_named_substring.3 $(DESTDIR)$(man3dir)/pcre32_get_named_substring.3 + ln -sf pcre_get_stringnumber.3 $(DESTDIR)$(man3dir)/pcre32_get_stringnumber.3 + ln -sf pcre_get_stringtable_entries.3 $(DESTDIR)$(man3dir)/pcre32_get_stringtable_entries.3 + ln -sf pcre_get_substring.3 $(DESTDIR)$(man3dir)/pcre32_get_substring.3 + ln -sf pcre_get_substring_list.3 $(DESTDIR)$(man3dir)/pcre32_get_substring_list.3 + ln -sf pcre_jit_exec.3 $(DESTDIR)$(man3dir)/pcre32_jit_exec.3 + ln -sf pcre_jit_stack_alloc.3 $(DESTDIR)$(man3dir)/pcre32_jit_stack_alloc.3 + ln -sf pcre_jit_stack_free.3 $(DESTDIR)$(man3dir)/pcre32_jit_stack_free.3 + ln -sf pcre_maketables.3 $(DESTDIR)$(man3dir)/pcre32_maketables.3 + ln -sf pcre_pattern_to_host_byte_order.3 $(DESTDIR)$(man3dir)/pcre32_pattern_to_host_byte_order.3 + ln -sf pcre_refcount.3 $(DESTDIR)$(man3dir)/pcre32_refcount.3 + ln -sf pcre_study.3 $(DESTDIR)$(man3dir)/pcre32_study.3 + ln -sf pcre_utf32_to_host_byte_order.3 $(DESTDIR)$(man3dir)/pcre32_utf32_to_host_byte_order.3 + ln -sf pcre_version.3 $(DESTDIR)$(man3dir)/pcre32_version.3 + +@WITH_GCOV_TRUE@coverage-check: all +@WITH_GCOV_TRUE@ -$(MAKE) $(AM_MAKEFLAGS) -k check + +@WITH_GCOV_TRUE@coverage-baseline: +@WITH_GCOV_TRUE@ $(LCOV) $(coverage_quiet) \ +@WITH_GCOV_TRUE@ --directory $(top_builddir) \ +@WITH_GCOV_TRUE@ --output-file "$(COVERAGE_OUTPUT_FILE)" \ +@WITH_GCOV_TRUE@ --capture \ +@WITH_GCOV_TRUE@ --initial + +@WITH_GCOV_TRUE@coverage-report: +@WITH_GCOV_TRUE@ $(LCOV) $(coverage_quiet) \ +@WITH_GCOV_TRUE@ --directory $(top_builddir) \ +@WITH_GCOV_TRUE@ --capture \ +@WITH_GCOV_TRUE@ --output-file "$(COVERAGE_OUTPUT_FILE).tmp" \ +@WITH_GCOV_TRUE@ --test-name "$(COVERAGE_TEST_NAME)" \ +@WITH_GCOV_TRUE@ --no-checksum \ +@WITH_GCOV_TRUE@ --compat-libtool \ +@WITH_GCOV_TRUE@ $(COVERAGE_LCOV_EXTRA_FLAGS) +@WITH_GCOV_TRUE@ $(LCOV) $(coverage_quiet) \ +@WITH_GCOV_TRUE@ --directory $(top_builddir) \ +@WITH_GCOV_TRUE@ --output-file "$(COVERAGE_OUTPUT_FILE)" \ +@WITH_GCOV_TRUE@ --remove "$(COVERAGE_OUTPUT_FILE).tmp" \ +@WITH_GCOV_TRUE@ "/tmp/*" \ +@WITH_GCOV_TRUE@ "/usr/include/*" \ +@WITH_GCOV_TRUE@ "$(includedir)/*" +@WITH_GCOV_TRUE@ -@rm -f "$(COVERAGE_OUTPUT_FILE).tmp" +@WITH_GCOV_TRUE@ LANG=C $(GENHTML) $(coverage_quiet) \ +@WITH_GCOV_TRUE@ --prefix $(top_builddir) \ +@WITH_GCOV_TRUE@ --output-directory "$(COVERAGE_OUTPUT_DIR)" \ +@WITH_GCOV_TRUE@ --title "$(PACKAGE) $(VERSION) Code Coverage Report" \ +@WITH_GCOV_TRUE@ --show-details "$(COVERAGE_OUTPUT_FILE)" \ +@WITH_GCOV_TRUE@ --legend \ +@WITH_GCOV_TRUE@ $(COVERAGE_GENHTML_EXTRA_FLAGS) +@WITH_GCOV_TRUE@ @echo "Code coverage report written to file://$(abs_builddir)/$(COVERAGE_OUTPUT_DIR)/index.html" + +@WITH_GCOV_TRUE@coverage-reset: +@WITH_GCOV_TRUE@ -$(LCOV) $(coverage_quiet) --zerocounters --directory $(top_builddir) + +@WITH_GCOV_TRUE@coverage-clean-report: +@WITH_GCOV_TRUE@ -rm -f "$(COVERAGE_OUTPUT_FILE)" "$(COVERAGE_OUTPUT_FILE).tmp" +@WITH_GCOV_TRUE@ -rm -rf "$(COVERAGE_OUTPUT_DIR)" + +@WITH_GCOV_TRUE@coverage-clean-data: +@WITH_GCOV_TRUE@ -find $(top_builddir) -name "*.gcda" -delete + +@WITH_GCOV_TRUE@coverage-clean: coverage-reset coverage-clean-report coverage-clean-data +@WITH_GCOV_TRUE@ -find $(top_builddir) -name "*.gcno" -delete + +@WITH_GCOV_TRUE@coverage-distclean: coverage-clean + +@WITH_GCOV_TRUE@coverage: coverage-reset coverage-baseline coverage-check coverage-report +@WITH_GCOV_TRUE@clean-local: coverage-clean +@WITH_GCOV_TRUE@distclean-local: coverage-distclean + +@WITH_GCOV_TRUE@.PHONY: coverage coverage-baseline coverage-check coverage-report coverage-reset coverage-clean-report coverage-clean-data coverage-clean coverage-distclean + +@WITH_GCOV_FALSE@coverage: +@WITH_GCOV_FALSE@ @echo "Configuring with --enable-coverage required to generate code coverage report." + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/NEWS b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/NEWS new file mode 100755 index 000000000..3d91b67df --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/NEWS @@ -0,0 +1,759 @@ +News about PCRE releases +------------------------ + +Note that this library (now called PCRE1) is now being maintained for bug fixes +only. New projects are advised to use the new PCRE2 libraries. + + +Release 8.44 12-February-2020 +----------------------------- + +This is a bug-fix release. + + +Release 8.43 23-February-2019 +----------------------------- + +This is a bug-fix release. + + +Release 8.42 20-March-2018 +-------------------------- + +This is a bug-fix release. + + +Release 8.41 13-June-2017 +------------------------- + +This is a bug-fix release. + + +Release 8.40 11-January-2017 +---------------------------- + +This is a bug-fix release. + + +Release 8.39 14-June-2016 +------------------------- + +Some appropriate PCRE2 JIT improvements have been retro-fitted to PCRE1. Apart +from that, this is another bug-fix release. Note that this library (now called +PCRE1) is now being maintained for bug fixes only. New projects are advised to +use the new PCRE2 libraries. + + +Release 8.38 23-November-2015 +----------------------------- + +This is bug-fix release. Note that this library (now called PCRE1) is now being +maintained for bug fixes only. New projects are advised to use the new PCRE2 +libraries. + + +Release 8.37 28-April-2015 +-------------------------- + +This is bug-fix release. Note that this library (now called PCRE1) is now being +maintained for bug fixes only. New projects are advised to use the new PCRE2 +libraries. + + +Release 8.36 26-September-2014 +------------------------------ + +This is primarily a bug-fix release. However, in addition, the Unicode data +tables have been updated to Unicode 7.0.0. + + +Release 8.35 04-April-2014 +-------------------------- + +There have been performance improvements for classes containing non-ASCII +characters and the "auto-possessification" feature has been extended. Other +minor improvements have been implemented and bugs fixed. There is a new callout +feature to enable applications to do detailed stack checks at compile time, to +avoid running out of stack for deeply nested parentheses. The JIT compiler has +been extended with experimental support for ARM-64, MIPS-64, and PPC-LE. + + +Release 8.34 15-December-2013 +----------------------------- + +As well as fixing the inevitable bugs, performance has been improved by +refactoring and extending the amount of "auto-possessification" that PCRE does. +Other notable changes: + +. Implemented PCRE_INFO_MATCH_EMPTY, which yields 1 if the pattern can match + an empty string. If it can, pcretest shows this in its information output. + +. A back reference to a named subpattern when there is more than one of the + same name now checks them in the order in which they appear in the pattern. + The first one that is set is used for the reference. Previously only the + first one was inspected. This change makes PCRE more compatible with Perl. + +. Unicode character properties were updated from Unicode 6.3.0. + +. The character VT has been added to the set of characters that match \s and + are generally treated as white space, following this same change in Perl + 5.18. There is now no difference between "Perl space" and "POSIX space". + +. Perl has changed its handling of \8 and \9. If there is no previously + encountered capturing group of those numbers, they are treated as the + literal characters 8 and 9 instead of a binary zero followed by the + literals. PCRE now does the same. + +. Following Perl, added \o{} to specify codepoints in octal, making it + possible to specify values greater than 0777 and also making them + unambiguous. + +. In UCP mode, \s was not matching two of the characters that Perl matches, + namely NEL (U+0085) and MONGOLIAN VOWEL SEPARATOR (U+180E), though they + were matched by \h. + +. Add JIT support for the 64 bit TileGX architecture. + +. Upgraded the handling of the POSIX classes [:graph:], [:print:], and + [:punct:] when PCRE_UCP is set so as to include the same characters as Perl + does in Unicode mode. + +. Perl no longer allows group names to start with digits, so I have made this + change also in PCRE. + +. Added support for [[:<:]] and [[:>:]] as used in the BSD POSIX library to + mean "start of word" and "end of word", respectively, as a transition aid. + + +Release 8.33 28-May-2013 +-------------------------- + +A number of bugs are fixed, and some performance improvements have been made. +There are also some new features, of which these are the most important: + +. The behaviour of the backtracking verbs has been rationalized and + documented in more detail. + +. JIT now supports callouts and all of the backtracking verbs. + +. Unicode validation has been updated in the light of Unicode Corrigendum #9, + which points out that "non characters" are not "characters that may not + appear in Unicode strings" but rather "characters that are reserved for + internal use and have only local meaning". + +. (*LIMIT_MATCH=d) and (*LIMIT_RECURSION=d) have been added so that the + creator of a pattern can specify lower (but not higher) limits for the + matching process. + +. The PCRE_NEVER_UTF option is available to prevent pattern-writers from using + the (*UTF) feature, as this could be a security issue. + + +Release 8.32 30-November-2012 +----------------------------- + +This release fixes a number of bugs, but also has some new features. These are +the highlights: + +. There is now support for 32-bit character strings and UTF-32. Like the + 16-bit support, this is done by compiling a separate 32-bit library. + +. \X now matches a Unicode extended grapheme cluster. + +. Case-independent matching of Unicode characters that have more than one + "other case" now makes all three (or more) characters equivalent. This + applies, for example, to Greek Sigma, which has two lowercase versions. + +. Unicode character properties are updated to Unicode 6.2.0. + +. The EBCDIC support, which had decayed, has had a spring clean. + +. A number of JIT optimizations have been added, which give faster JIT + execution speed. In addition, a new direct interface to JIT execution is + available. This bypasses some of the sanity checks of pcre_exec() to give a + noticeable speed-up. + +. A number of issues in pcregrep have been fixed, making it more compatible + with GNU grep. In particular, --exclude and --include (and variants) apply + to all files now, not just those obtained from scanning a directory + recursively. In Windows environments, the default action for directories is + now "skip" instead of "read" (which provokes an error). + +. If the --only-matching (-o) option in pcregrep is specified multiple + times, each one causes appropriate output. For example, -o1 -o2 outputs the + substrings matched by the 1st and 2nd capturing parentheses. A separating + string can be specified by --om-separator (default empty). + +. When PCRE is built via Autotools using a version of gcc that has the + "visibility" feature, it is used to hide internal library functions that are + not part of the public API. + + +Release 8.31 06-July-2012 +------------------------- + +This is mainly a bug-fixing release, with a small number of developments: + +. The JIT compiler now supports partial matching and the (*MARK) and + (*COMMIT) verbs. + +. PCRE_INFO_MAXLOOKBEHIND can be used to find the longest lookbehind in a + pattern. + +. There should be a performance improvement when using the heap instead of the + stack for recursion. + +. pcregrep can now be linked with libedit as an alternative to libreadline. + +. pcregrep now has a --file-list option where the list of files to scan is + given as a file. + +. pcregrep now recognizes binary files and there are related options. + +. The Unicode tables have been updated to 6.1.0. + +As always, the full list of changes is in the ChangeLog file. + + +Release 8.30 04-February-2012 +----------------------------- + +Release 8.30 introduces a major new feature: support for 16-bit character +strings, compiled as a separate library. There are a few changes to the +8-bit library, in addition to some bug fixes. + +. The pcre_info() function, which has been obsolete for over 10 years, has + been removed. + +. When a compiled pattern was saved to a file and later reloaded on a host + with different endianness, PCRE used automatically to swap the bytes in some + of the data fields. With the advent of the 16-bit library, where more of this + swapping is needed, it is no longer done automatically. Instead, the bad + endianness is detected and a specific error is given. The user can then call + a new function called pcre_pattern_to_host_byte_order() (or an equivalent + 16-bit function) to do the swap. + +. In UTF-8 mode, the values 0xd800 to 0xdfff are not legal Unicode + code points and are now faulted. (They are the so-called "surrogates" + that are reserved for coding high values in UTF-16.) + + +Release 8.21 12-Dec-2011 +------------------------ + +This is almost entirely a bug-fix release. The only new feature is the ability +to obtain the size of the memory used by the JIT compiler. + + +Release 8.20 21-Oct-2011 +------------------------ + +The main change in this release is the inclusion of Zoltan Herczeg's +just-in-time compiler support, which can be accessed by building PCRE with +--enable-jit. Large performance benefits can be had in many situations. 8.20 +also fixes an unfortunate bug that was introduced in 8.13 as well as tidying up +a number of infelicities and differences from Perl. + + +Release 8.13 16-Aug-2011 +------------------------ + +This is mainly a bug-fix release. There has been a lot of internal refactoring. +The Unicode tables have been updated. The only new feature in the library is +the passing of *MARK information to callouts. Some additions have been made to +pcretest to make testing easier and more comprehensive. There is a new option +for pcregrep to adjust its internal buffer size. + + +Release 8.12 15-Jan-2011 +------------------------ + +This release fixes some bugs in pcregrep, one of which caused the tests to fail +on 64-bit big-endian systems. There are no changes to the code of the library. + + +Release 8.11 10-Dec-2010 +------------------------ + +A number of bugs in the library and in pcregrep have been fixed. As always, see +ChangeLog for details. The following are the non-bug-fix changes: + +. Added --match-limit and --recursion-limit to pcregrep. + +. Added an optional parentheses number to the -o and --only-matching options + of pcregrep. + +. Changed the way PCRE_PARTIAL_HARD affects the matching of $, \z, \Z, \b, and + \B. + +. Added PCRE_ERROR_SHORTUTF8 to make it possible to distinguish between a + bad UTF-8 sequence and one that is incomplete when using PCRE_PARTIAL_HARD. + +. Recognize (*NO_START_OPT) at the start of a pattern to set the PCRE_NO_ + START_OPTIMIZE option, which is now allowed at compile time + + +Release 8.10 25-Jun-2010 +------------------------ + +There are two major additions: support for (*MARK) and friends, and the option +PCRE_UCP, which changes the behaviour of \b, \d, \s, and \w (and their +opposites) so that they make use of Unicode properties. There are also a number +of lesser new features, and several bugs have been fixed. A new option, +--line-buffered, has been added to pcregrep, for use when it is connected to +pipes. + + +Release 8.02 19-Mar-2010 +------------------------ + +Another bug-fix release. + + +Release 8.01 19-Jan-2010 +------------------------ + +This is a bug-fix release. Several bugs in the code itself and some bugs and +infelicities in the build system have been fixed. + + +Release 8.00 19-Oct-09 +---------------------- + +Bugs have been fixed in the library and in pcregrep. There are also some +enhancements. Restrictions on patterns used for partial matching have been +removed, extra information is given for partial matches, the partial matching +process has been improved, and an option to make a partial match override a +full match is available. The "study" process has been enhanced by finding a +lower bound matching length. Groups with duplicate numbers may now have +duplicated names without the use of PCRE_DUPNAMES. However, they may not have +different names. The documentation has been revised to reflect these changes. +The version number has been expanded to 3 digits as it is clear that the rate +of change is not slowing down. + + +Release 7.9 11-Apr-09 +--------------------- + +Mostly bugfixes and tidies with just a couple of minor functional additions. + + +Release 7.8 05-Sep-08 +--------------------- + +More bug fixes, plus a performance improvement in Unicode character property +lookup. + + +Release 7.7 07-May-08 +--------------------- + +This is once again mainly a bug-fix release, but there are a couple of new +features. + + +Release 7.6 28-Jan-08 +--------------------- + +The main reason for having this release so soon after 7.5 is because it fixes a +potential buffer overflow problem in pcre_compile() when run in UTF-8 mode. In +addition, the CMake configuration files have been brought up to date. + + +Release 7.5 10-Jan-08 +--------------------- + +This is mainly a bug-fix release. However the ability to link pcregrep with +libz or libbz2 and the ability to link pcretest with libreadline have been +added. Also the --line-offsets and --file-offsets options were added to +pcregrep. + + +Release 7.4 21-Sep-07 +--------------------- + +The only change of specification is the addition of options to control whether +\R matches any Unicode line ending (the default) or just CR, LF, and CRLF. +Otherwise, the changes are bug fixes and a refactoring to reduce the number of +relocations needed in a shared library. There have also been some documentation +updates, in particular, some more information about using CMake to build PCRE +has been added to the NON-UNIX-USE file. + + +Release 7.3 28-Aug-07 +--------------------- + +Most changes are bug fixes. Some that are not: + +1. There is some support for Perl 5.10's experimental "backtracking control + verbs" such as (*PRUNE). + +2. UTF-8 checking is now as per RFC 3629 instead of RFC 2279; this is more + restrictive in the strings it accepts. + +3. Checking for potential integer overflow has been made more dynamic, and as a + consequence there is no longer a hard limit on the size of a subpattern that + has a limited repeat count. + +4. When CRLF is a valid line-ending sequence, pcre_exec() and pcre_dfa_exec() + no longer advance by two characters instead of one when an unanchored match + fails at CRLF if there are explicit CR or LF matches within the pattern. + This gets rid of some anomalous effects that previously occurred. + +5. Some PCRE-specific settings for varying the newline options at the start of + a pattern have been added. + + +Release 7.2 19-Jun-07 +--------------------- + +WARNING: saved patterns that were compiled by earlier versions of PCRE must be +recompiled for use with 7.2 (necessitated by the addition of \K, \h, \H, \v, +and \V). + +Correction to the notes for 7.1: the note about shared libraries for Windows is +wrong. Previously, three libraries were built, but each could function +independently. For example, the pcreposix library also included all the +functions from the basic pcre library. The change is that the three libraries +are no longer independent. They are like the Unix libraries. To use the +pcreposix functions, for example, you need to link with both the pcreposix and +the basic pcre library. + +Some more features from Perl 5.10 have been added: + + (?-n) and (?+n) relative references for recursion and subroutines. + + (?(-n) and (?(+n) relative references as conditions. + + \k{name} and \g{name} are synonyms for \k. + + \K to reset the start of the matched string; for example, (foo)\Kbar + matches bar preceded by foo, but only sets bar as the matched string. + + (?| introduces a group where the capturing parentheses in each alternative + start from the same number; for example, (?|(abc)|(xyz)) sets capturing + parentheses number 1 in both cases. + + \h, \H, \v, \V match horizontal and vertical whitespace, respectively. + + +Release 7.1 24-Apr-07 +--------------------- + +There is only one new feature in this release: a linebreak setting of +PCRE_NEWLINE_ANYCRLF. It is a cut-down version of PCRE_NEWLINE_ANY, which +recognizes only CRLF, CR, and LF as linebreaks. + +A few bugs are fixed (see ChangeLog for details), but the major change is a +complete re-implementation of the build system. This now has full Autotools +support and so is now "standard" in some sense. It should help with compiling +PCRE in a wide variety of environments. + +NOTE: when building shared libraries for Windows, three dlls are now built, +called libpcre, libpcreposix, and libpcrecpp. Previously, everything was +included in a single dll. + +Another important change is that the dftables auxiliary program is no longer +compiled and run at "make" time by default. Instead, a default set of character +tables (assuming ASCII coding) is used. If you want to use dftables to generate +the character tables as previously, add --enable-rebuild-chartables to the +"configure" command. You must do this if you are compiling PCRE to run on a +system that uses EBCDIC code. + +There is a discussion about character tables in the README file. The default is +not to use dftables so that that there is no problem when cross-compiling. + + +Release 7.0 19-Dec-06 +--------------------- + +This release has a new major number because there have been some internal +upheavals to facilitate the addition of new optimizations and other facilities, +and to make subsequent maintenance and extension easier. Compilation is likely +to be a bit slower, but there should be no major effect on runtime performance. +Previously compiled patterns are NOT upwards compatible with this release. If +you have saved compiled patterns from a previous release, you will have to +re-compile them. Important changes that are visible to users are: + +1. The Unicode property tables have been updated to Unicode 5.0.0, which adds + some more scripts. + +2. The option PCRE_NEWLINE_ANY causes PCRE to recognize any Unicode newline + sequence as a newline. + +3. The \R escape matches a single Unicode newline sequence as a single unit. + +4. New features that will appear in Perl 5.10 are now in PCRE. These include + alternative Perl syntax for named parentheses, and Perl syntax for + recursion. + +5. The C++ wrapper interface has been extended by the addition of a + QuoteMeta function and the ability to allow copy construction and + assignment. + +For a complete list of changes, see the ChangeLog file. + + +Release 6.7 04-Jul-06 +--------------------- + +The main additions to this release are the ability to use the same name for +multiple sets of parentheses, and support for CRLF line endings in both the +library and pcregrep (and in pcretest for testing). + +Thanks to Ian Taylor, the stack usage for many kinds of pattern has been +significantly reduced for certain subject strings. + + +Release 6.5 01-Feb-06 +--------------------- + +Important changes in this release: + +1. A number of new features have been added to pcregrep. + +2. The Unicode property tables have been updated to Unicode 4.1.0, and the + supported properties have been extended with script names such as "Arabic", + and the derived properties "Any" and "L&". This has necessitated a change to + the interal format of compiled patterns. Any saved compiled patterns that + use \p or \P must be recompiled. + +3. The specification of recursion in patterns has been changed so that all + recursive subpatterns are automatically treated as atomic groups. Thus, for + example, (?R) is treated as if it were (?>(?R)). This is necessary because + otherwise there are situations where recursion does not work. + +See the ChangeLog for a complete list of changes, which include a number of bug +fixes and tidies. + + +Release 6.0 07-Jun-05 +--------------------- + +The release number has been increased to 6.0 because of the addition of several +major new pieces of functionality. + +A new function, pcre_dfa_exec(), which implements pattern matching using a DFA +algorithm, has been added. This has a number of advantages for certain cases, +though it does run more slowly, and lacks the ability to capture substrings. On +the other hand, it does find all matches, not just the first, and it works +better for partial matching. The pcrematching man page discusses the +differences. + +The pcretest program has been enhanced so that it can make use of the new +pcre_dfa_exec() matching function and the extra features it provides. + +The distribution now includes a C++ wrapper library. This is built +automatically if a C++ compiler is found. The pcrecpp man page discusses this +interface. + +The code itself has been re-organized into many more files, one for each +function, so it no longer requires everything to be linked in when static +linkage is used. As a consequence, some internal functions have had to have +their names exposed. These functions all have names starting with _pcre_. They +are undocumented, and are not intended for use by outside callers. + +The pcregrep program has been enhanced with new functionality such as +multiline-matching and options for output more matching context. See the +ChangeLog for a complete list of changes to the library and the utility +programs. + + +Release 5.0 13-Sep-04 +--------------------- + +The licence under which PCRE is released has been changed to the more +conventional "BSD" licence. + +In the code, some bugs have been fixed, and there are also some major changes +in this release (which is why I've increased the number to 5.0). Some changes +are internal rearrangements, and some provide a number of new facilities. The +new features are: + +1. There's an "automatic callout" feature that inserts callouts before every + item in the regex, and there's a new callout field that gives the position + in the pattern - useful for debugging and tracing. + +2. The extra_data structure can now be used to pass in a set of character + tables at exec time. This is useful if compiled regex are saved and re-used + at a later time when the tables may not be at the same address. If the + default internal tables are used, the pointer saved with the compiled + pattern is now set to NULL, which means that you don't need to do anything + special unless you are using custom tables. + +3. It is possible, with some restrictions on the content of the regex, to + request "partial" matching. A special return code is given if all of the + subject string matched part of the regex. This could be useful for testing + an input field as it is being typed. + +4. There is now some optional support for Unicode character properties, which + means that the patterns items such as \p{Lu} and \X can now be used. Only + the general category properties are supported. If PCRE is compiled with this + support, an additional 90K data structure is include, which increases the + size of the library dramatically. + +5. There is support for saving compiled patterns and re-using them later. + +6. There is support for running regular expressions that were compiled on a + different host with the opposite endianness. + +7. The pcretest program has been extended to accommodate the new features. + +The main internal rearrangement is that sequences of literal characters are no +longer handled as strings. Instead, each character is handled on its own. This +makes some UTF-8 handling easier, and makes the support of partial matching +possible. Compiled patterns containing long literal strings will be larger as a +result of this change; I hope that performance will not be much affected. + + +Release 4.5 01-Dec-03 +--------------------- + +Again mainly a bug-fix and tidying release, with only a couple of new features: + +1. It's possible now to compile PCRE so that it does not use recursive +function calls when matching. Instead it gets memory from the heap. This slows +things down, but may be necessary on systems with limited stacks. + +2. UTF-8 string checking has been tightened to reject overlong sequences and to +check that a starting offset points to the start of a character. Failure of the +latter returns a new error code: PCRE_ERROR_BADUTF8_OFFSET. + +3. PCRE can now be compiled for systems that use EBCDIC code. + + +Release 4.4 21-Aug-03 +--------------------- + +This is mainly a bug-fix and tidying release. The only new feature is that PCRE +checks UTF-8 strings for validity by default. There is an option to suppress +this, just in case anybody wants that teeny extra bit of performance. + + +Releases 4.1 - 4.3 +------------------ + +Sorry, I forgot about updating the NEWS file for these releases. Please take a +look at ChangeLog. + + +Release 4.0 17-Feb-03 +--------------------- + +There have been a lot of changes for the 4.0 release, adding additional +functionality and mending bugs. Below is a list of the highlights of the new +functionality. For full details of these features, please consult the +documentation. For a complete list of changes, see the ChangeLog file. + +1. Support for Perl's \Q...\E escapes. + +2. "Possessive quantifiers" ?+, *+, ++, and {,}+ which come from Sun's Java +package. They provide some syntactic sugar for simple cases of "atomic +grouping". + +3. Support for the \G assertion. It is true when the current matching position +is at the start point of the match. + +4. A new feature that provides some of the functionality that Perl provides +with (?{...}). The facility is termed a "callout". The way it is done in PCRE +is for the caller to provide an optional function, by setting pcre_callout to +its entry point. To get the function called, the regex must include (?C) at +appropriate points. + +5. Support for recursive calls to individual subpatterns. This makes it really +easy to get totally confused. + +6. Support for named subpatterns. The Python syntax (?P...) is used to +name a group. + +7. Several extensions to UTF-8 support; it is now fairly complete. There is an +option for pcregrep to make it operate in UTF-8 mode. + +8. The single man page has been split into a number of separate man pages. +These also give rise to individual HTML pages which are put in a separate +directory. There is an index.html page that lists them all. Some hyperlinking +between the pages has been installed. + + +Release 3.5 15-Aug-01 +--------------------- + +1. The configuring system has been upgraded to use later versions of autoconf +and libtool. By default it builds both a shared and a static library if the OS +supports it. You can use --disable-shared or --disable-static on the configure +command if you want only one of them. + +2. The pcretest utility is now installed along with pcregrep because it is +useful for users (to test regexs) and by doing this, it automatically gets +relinked by libtool. The documentation has been turned into a man page, so +there are now .1, .txt, and .html versions in /doc. + +3. Upgrades to pcregrep: + (i) Added long-form option names like gnu grep. + (ii) Added --help to list all options with an explanatory phrase. + (iii) Added -r, --recursive to recurse into sub-directories. + (iv) Added -f, --file to read patterns from a file. + +4. Added --enable-newline-is-cr and --enable-newline-is-lf to the configure +script, to force use of CR or LF instead of \n in the source. On non-Unix +systems, the value can be set in config.h. + +5. The limit of 200 on non-capturing parentheses is a _nesting_ limit, not an +absolute limit. Changed the text of the error message to make this clear, and +likewise updated the man page. + +6. The limit of 99 on the number of capturing subpatterns has been removed. +The new limit is 65535, which I hope will not be a "real" limit. + + +Release 3.3 01-Aug-00 +--------------------- + +There is some support for UTF-8 character strings. This is incomplete and +experimental. The documentation describes what is and what is not implemented. +Otherwise, this is just a bug-fixing release. + + +Release 3.0 01-Feb-00 +--------------------- + +1. A "configure" script is now used to configure PCRE for Unix systems. It +builds a Makefile, a config.h file, and the pcre-config script. + +2. PCRE is built as a shared library by default. + +3. There is support for POSIX classes such as [:alpha:]. + +5. There is an experimental recursion feature. + +---------------------------------------------------------------------------- + IMPORTANT FOR THOSE UPGRADING FROM VERSIONS BEFORE 2.00 + +Please note that there has been a change in the API such that a larger +ovector is required at matching time, to provide some additional workspace. +The new man page has details. This change was necessary in order to support +some of the new functionality in Perl 5.005. + + IMPORTANT FOR THOSE UPGRADING FROM VERSION 2.00 + +Another (I hope this is the last!) change has been made to the API for the +pcre_compile() function. An additional argument has been added to make it +possible to pass over a pointer to character tables built in the current +locale by pcre_maketables(). To use the default tables, this new argument +should be passed as NULL. + + IMPORTANT FOR THOSE UPGRADING FROM VERSION 2.05 + +Yet another (and again I hope this really is the last) change has been made +to the API for the pcre_exec() function. An additional argument has been +added to make it possible to start the match other than at the start of the +subject string. This is important if there are lookbehinds. The new man +page has the details, but you just want to convert existing programs, all +you need to do is to stick in a new fifth argument to pcre_exec(), with a +value of zero. For example, change + + pcre_exec(pattern, extra, subject, length, options, ovec, ovecsize) +to + pcre_exec(pattern, extra, subject, length, 0, options, ovec, ovecsize) + +**** diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/NON-AUTOTOOLS-BUILD b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/NON-AUTOTOOLS-BUILD new file mode 100755 index 000000000..37f616447 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/NON-AUTOTOOLS-BUILD @@ -0,0 +1,773 @@ +Building PCRE without using autotools +------------------------------------- + +NOTE: This document relates to PCRE releases that use the original API, with +library names libpcre, libpcre16, and libpcre32. January 2015 saw the first +release of a new API, known as PCRE2, with release numbers starting at 10.00 +and library names libpcre2-8, libpcre2-16, and libpcre2-32. The old libraries +(now called PCRE1) are still being maintained for bug fixes, but there will be +no new development. New projects are advised to use the new PCRE2 libraries. + + +This document contains the following sections: + + General + Generic instructions for the PCRE C library + The C++ wrapper functions + Building for virtual Pascal + Stack size in Windows environments + Linking programs in Windows environments + Calling conventions in Windows environments + Comments about Win32 builds + Building PCRE on Windows with CMake + Use of relative paths with CMake on Windows + Testing with RunTest.bat + Building under Windows CE with Visual Studio 200x + Building under Windows with BCC5.5 + Building using Borland C++ Builder 2007 (CB2007) and higher + Building PCRE on OpenVMS + Building PCRE on Stratus OpenVOS + Building PCRE on native z/OS and z/VM + + +GENERAL + +I (Philip Hazel) have no experience of Windows or VMS sytems and how their +libraries work. The items in the PCRE distribution and Makefile that relate to +anything other than Linux systems are untested by me. + +There are some other comments and files (including some documentation in CHM +format) in the Contrib directory on the FTP site: + + ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/Contrib + +The basic PCRE library consists entirely of code written in Standard C, and so +should compile successfully on any system that has a Standard C compiler and +library. The C++ wrapper functions are a separate issue (see below). + +The PCRE distribution includes a "configure" file for use by the configure/make +(autotools) build system, as found in many Unix-like environments. The README +file contains information about the options for "configure". + +There is also support for CMake, which some users prefer, especially in Windows +environments, though it can also be run in Unix-like environments. See the +section entitled "Building PCRE on Windows with CMake" below. + +Versions of config.h and pcre.h are distributed in the PCRE tarballs under the +names config.h.generic and pcre.h.generic. These are provided for those who +build PCRE without using "configure" or CMake. If you use "configure" or CMake, +the .generic versions are not used. + + +GENERIC INSTRUCTIONS FOR THE PCRE C LIBRARY + +The following are generic instructions for building the PCRE C library "by +hand". If you are going to use CMake, this section does not apply to you; you +can skip ahead to the CMake section. + + (1) Copy or rename the file config.h.generic as config.h, and edit the macro + settings that it contains to whatever is appropriate for your environment. + + In particular, you can alter the definition of the NEWLINE macro to + specify what character(s) you want to be interpreted as line terminators. + In an EBCDIC environment, you MUST change NEWLINE, because its default + value is 10, an ASCII LF. The usual EBCDIC newline character is 21 (0x15, + NL), though in some cases it may be 37 (0x25). + + When you compile any of the PCRE modules, you must specify -DHAVE_CONFIG_H + to your compiler so that config.h is included in the sources. + + An alternative approach is not to edit config.h, but to use -D on the + compiler command line to make any changes that you need to the + configuration options. In this case -DHAVE_CONFIG_H must not be set. + + NOTE: There have been occasions when the way in which certain parameters + in config.h are used has changed between releases. (In the configure/make + world, this is handled automatically.) When upgrading to a new release, + you are strongly advised to review config.h.generic before re-using what + you had previously. + + (2) Copy or rename the file pcre.h.generic as pcre.h. + + (3) EITHER: + Copy or rename file pcre_chartables.c.dist as pcre_chartables.c. + + OR: + Compile dftables.c as a stand-alone program (using -DHAVE_CONFIG_H if + you have set up config.h), and then run it with the single argument + "pcre_chartables.c". This generates a set of standard character tables + and writes them to that file. The tables are generated using the default + C locale for your system. If you want to use a locale that is specified + by LC_xxx environment variables, add the -L option to the dftables + command. You must use this method if you are building on a system that + uses EBCDIC code. + + The tables in pcre_chartables.c are defaults. The caller of PCRE can + specify alternative tables at run time. + + (4) Ensure that you have the following header files: + + pcre_internal.h + ucp.h + + (5) For an 8-bit library, compile the following source files, setting + -DHAVE_CONFIG_H as a compiler option if you have set up config.h with your + configuration, or else use other -D settings to change the configuration + as required. + + pcre_byte_order.c + pcre_chartables.c + pcre_compile.c + pcre_config.c + pcre_dfa_exec.c + pcre_exec.c + pcre_fullinfo.c + pcre_get.c + pcre_globals.c + pcre_jit_compile.c + pcre_maketables.c + pcre_newline.c + pcre_ord2utf8.c + pcre_refcount.c + pcre_string_utils.c + pcre_study.c + pcre_tables.c + pcre_ucd.c + pcre_valid_utf8.c + pcre_version.c + pcre_xclass.c + + Make sure that you include -I. in the compiler command (or equivalent for + an unusual compiler) so that all included PCRE header files are first + sought in the current directory. Otherwise you run the risk of picking up + a previously-installed file from somewhere else. + + Note that you must still compile pcre_jit_compile.c, even if you have not + defined SUPPORT_JIT in config.h, because when JIT support is not + configured, dummy functions are compiled. When JIT support IS configured, + pcre_jit_compile.c #includes sources from the sljit subdirectory, where + there should be 16 files, all of whose names begin with "sljit". + + (6) Now link all the compiled code into an object library in whichever form + your system keeps such libraries. This is the basic PCRE C 8-bit library. + If your system has static and shared libraries, you may have to do this + once for each type. + + (7) If you want to build a 16-bit library (as well as, or instead of the 8-bit + or 32-bit libraries) repeat steps 5-6 with the following files: + + pcre16_byte_order.c + pcre16_chartables.c + pcre16_compile.c + pcre16_config.c + pcre16_dfa_exec.c + pcre16_exec.c + pcre16_fullinfo.c + pcre16_get.c + pcre16_globals.c + pcre16_jit_compile.c + pcre16_maketables.c + pcre16_newline.c + pcre16_ord2utf16.c + pcre16_refcount.c + pcre16_string_utils.c + pcre16_study.c + pcre16_tables.c + pcre16_ucd.c + pcre16_utf16_utils.c + pcre16_valid_utf16.c + pcre16_version.c + pcre16_xclass.c + + (8) If you want to build a 32-bit library (as well as, or instead of the 8-bit + or 16-bit libraries) repeat steps 5-6 with the following files: + + pcre32_byte_order.c + pcre32_chartables.c + pcre32_compile.c + pcre32_config.c + pcre32_dfa_exec.c + pcre32_exec.c + pcre32_fullinfo.c + pcre32_get.c + pcre32_globals.c + pcre32_jit_compile.c + pcre32_maketables.c + pcre32_newline.c + pcre32_ord2utf32.c + pcre32_refcount.c + pcre32_string_utils.c + pcre32_study.c + pcre32_tables.c + pcre32_ucd.c + pcre32_utf32_utils.c + pcre32_valid_utf32.c + pcre32_version.c + pcre32_xclass.c + + (9) If you want to build the POSIX wrapper functions (which apply only to the + 8-bit library), ensure that you have the pcreposix.h file and then compile + pcreposix.c (remembering -DHAVE_CONFIG_H if necessary). Link the result + (on its own) as the pcreposix library. + +(10) The pcretest program can be linked with any combination of the 8-bit, + 16-bit and 32-bit libraries (depending on what you selected in config.h). + Compile pcretest.c and pcre_printint.c (again, don't forget + -DHAVE_CONFIG_H) and link them together with the appropriate library/ies. + If you compiled an 8-bit library, pcretest also needs the pcreposix + wrapper library unless you compiled it with -DNOPOSIX. + +(11) Run pcretest on the testinput files in the testdata directory, and check + that the output matches the corresponding testoutput files. There are + comments about what each test does in the section entitled "Testing PCRE" + in the README file. If you compiled more than one of the 8-bit, 16-bit and + 32-bit libraries, you need to run pcretest with the -16 option to do + 16-bit tests and with the -32 option to do 32-bit tests. + + Some tests are relevant only when certain build-time options are selected. + For example, test 4 is for UTF-8/UTF-16/UTF-32 support, and will not run + if you have built PCRE without it. See the comments at the start of each + testinput file. If you have a suitable Unix-like shell, the RunTest script + will run the appropriate tests for you. The command "RunTest list" will + output a list of all the tests. + + Note that the supplied files are in Unix format, with just LF characters + as line terminators. You may need to edit them to change this if your + system uses a different convention. If you are using Windows, you probably + should use the wintestinput3 file instead of testinput3 (and the + corresponding output file). This is a locale test; wintestinput3 sets the + locale to "french" rather than "fr_FR", and there some minor output + differences. + +(12) If you have built PCRE with SUPPORT_JIT, the JIT features will be tested + by the testdata files. However, you might also like to build and run + the freestanding JIT test program, pcre_jit_test.c. + +(13) If you want to use the pcregrep command, compile and link pcregrep.c; it + uses only the basic 8-bit PCRE library (it does not need the pcreposix + library). + + +THE C++ WRAPPER FUNCTIONS + +The PCRE distribution also contains some C++ wrapper functions and tests, +applicable to the 8-bit library, which were contributed by Google Inc. On a +system that can use "configure" and "make", the functions are automatically +built into a library called pcrecpp. It should be straightforward to compile +the .cc files manually on other systems. The files called xxx_unittest.cc are +test programs for each of the corresponding xxx.cc files. + + +BUILDING FOR VIRTUAL PASCAL + +A script for building PCRE using Borland's C++ compiler for use with VPASCAL +was contributed by Alexander Tokarev. Stefan Weber updated the script and added +additional files. The following files in the distribution are for building PCRE +for use with VP/Borland: makevp_c.txt, makevp_l.txt, makevp.bat, pcregexp.pas. + + +STACK SIZE IN WINDOWS ENVIRONMENTS + +The default processor stack size of 1Mb in some Windows environments is too +small for matching patterns that need much recursion. In particular, test 2 may +fail because of this. Normally, running out of stack causes a crash, but there +have been cases where the test program has just died silently. See your linker +documentation for how to increase stack size if you experience problems. The +Linux default of 8Mb is a reasonable choice for the stack, though even that can +be too small for some pattern/subject combinations. + +PCRE has a compile configuration option to disable the use of stack for +recursion so that heap is used instead. However, pattern matching is +significantly slower when this is done. There is more about stack usage in the +"pcrestack" documentation. + + +LINKING PROGRAMS IN WINDOWS ENVIRONMENTS + +If you want to statically link a program against a PCRE library in the form of +a non-dll .a file, you must define PCRE_STATIC before including pcre.h or +pcrecpp.h, otherwise the pcre_malloc() and pcre_free() exported functions will +be declared __declspec(dllimport), with unwanted results. + + +CALLING CONVENTIONS IN WINDOWS ENVIRONMENTS + +It is possible to compile programs to use different calling conventions using +MSVC. Search the web for "calling conventions" for more information. To make it +easier to change the calling convention for the exported functions in the +PCRE library, the macro PCRE_CALL_CONVENTION is present in all the external +definitions. It can be set externally when compiling (e.g. in CFLAGS). If it is +not set, it defaults to empty; the default calling convention is then used +(which is what is wanted most of the time). + + +COMMENTS ABOUT WIN32 BUILDS (see also "BUILDING PCRE ON WINDOWS WITH CMAKE") + +There are two ways of building PCRE using the "configure, make, make install" +paradigm on Windows systems: using MinGW or using Cygwin. These are not at all +the same thing; they are completely different from each other. There is also +support for building using CMake, which some users find a more straightforward +way of building PCRE under Windows. + +The MinGW home page (http://www.mingw.org/) says this: + + MinGW: A collection of freely available and freely distributable Windows + specific header files and import libraries combined with GNU toolsets that + allow one to produce native Windows programs that do not rely on any + 3rd-party C runtime DLLs. + +The Cygwin home page (http://www.cygwin.com/) says this: + + Cygwin is a Linux-like environment for Windows. It consists of two parts: + + . A DLL (cygwin1.dll) which acts as a Linux API emulation layer providing + substantial Linux API functionality + + . A collection of tools which provide Linux look and feel. + + The Cygwin DLL currently works with all recent, commercially released x86 32 + bit and 64 bit versions of Windows, with the exception of Windows CE. + +On both MinGW and Cygwin, PCRE should build correctly using: + + ./configure && make && make install + +This should create two libraries called libpcre and libpcreposix, and, if you +have enabled building the C++ wrapper, a third one called libpcrecpp. These are +independent libraries: when you link with libpcreposix or libpcrecpp you must +also link with libpcre, which contains the basic functions. (Some earlier +releases of PCRE included the basic libpcre functions in libpcreposix. This no +longer happens.) + +A user submitted a special-purpose patch that makes it easy to create +"pcre.dll" under mingw32 using the "msys" environment. It provides "pcre.dll" +as a special target. If you use this target, no other files are built, and in +particular, the pcretest and pcregrep programs are not built. An example of how +this might be used is: + + ./configure --enable-utf --disable-cpp CFLAGS="-03 -s"; make pcre.dll + +Using Cygwin's compiler generates libraries and executables that depend on +cygwin1.dll. If a library that is generated this way is distributed, +cygwin1.dll has to be distributed as well. Since cygwin1.dll is under the GPL +licence, this forces not only PCRE to be under the GPL, but also the entire +application. A distributor who wants to keep their own code proprietary must +purchase an appropriate Cygwin licence. + +MinGW has no such restrictions. The MinGW compiler generates a library or +executable that can run standalone on Windows without any third party dll or +licensing issues. + +But there is more complication: + +If a Cygwin user uses the -mno-cygwin Cygwin gcc flag, what that really does is +to tell Cygwin's gcc to use the MinGW gcc. Cygwin's gcc is only acting as a +front end to MinGW's gcc (if you install Cygwin's gcc, you get both Cygwin's +gcc and MinGW's gcc). So, a user can: + +. Build native binaries by using MinGW or by getting Cygwin and using + -mno-cygwin. + +. Build binaries that depend on cygwin1.dll by using Cygwin with the normal + compiler flags. + +The test files that are supplied with PCRE are in UNIX format, with LF +characters as line terminators. Unless your PCRE library uses a default newline +option that includes LF as a valid newline, it may be necessary to change the +line terminators in the test files to get some of the tests to work. + + +BUILDING PCRE ON WINDOWS WITH CMAKE + +CMake is an alternative configuration facility that can be used instead of +"configure". CMake creates project files (make files, solution files, etc.) +tailored to numerous development environments, including Visual Studio, +Borland, Msys, MinGW, NMake, and Unix. If possible, use short paths with no +spaces in the names for your CMake installation and your PCRE source and build +directories. + +The following instructions were contributed by a PCRE user. If they are not +followed exactly, errors may occur. In the event that errors do occur, it is +recommended that you delete the CMake cache before attempting to repeat the +CMake build process. In the CMake GUI, the cache can be deleted by selecting +"File > Delete Cache". + +1. Install the latest CMake version available from http://www.cmake.org/, and + ensure that cmake\bin is on your path. + +2. Unzip (retaining folder structure) the PCRE source tree into a source + directory such as C:\pcre. You should ensure your local date and time + is not earlier than the file dates in your source dir if the release is + very new. + +3. Create a new, empty build directory, preferably a subdirectory of the + source dir. For example, C:\pcre\pcre-xx\build. + +4. Run cmake-gui from the Shell envirornment of your build tool, for example, + Msys for Msys/MinGW or Visual Studio Command Prompt for VC/VC++. Do not try + to start Cmake from the Windows Start menu, as this can lead to errors. + +5. Enter C:\pcre\pcre-xx and C:\pcre\pcre-xx\build for the source and build + directories, respectively. + +6. Hit the "Configure" button. + +7. Select the particular IDE / build tool that you are using (Visual + Studio, MSYS makefiles, MinGW makefiles, etc.) + +8. The GUI will then list several configuration options. This is where + you can enable UTF-8 support or other PCRE optional features. + +9. Hit "Configure" again. The adjacent "Generate" button should now be + active. + +10. Hit "Generate". + +11. The build directory should now contain a usable build system, be it a + solution file for Visual Studio, makefiles for MinGW, etc. Exit from + cmake-gui and use the generated build system with your compiler or IDE. + E.g., for MinGW you can run "make", or for Visual Studio, open the PCRE + solution, select the desired configuration (Debug, or Release, etc.) and + build the ALL_BUILD project. + +12. If during configuration with cmake-gui you've elected to build the test + programs, you can execute them by building the test project. E.g., for + MinGW: "make test"; for Visual Studio build the RUN_TESTS project. The + most recent build configuration is targeted by the tests. A summary of + test results is presented. Complete test output is subsequently + available for review in Testing\Temporary under your build dir. + + +USE OF RELATIVE PATHS WITH CMAKE ON WINDOWS + +A PCRE user comments as follows: I thought that others may want to know the +current state of CMAKE_USE_RELATIVE_PATHS support on Windows. Here it is: + +-- AdditionalIncludeDirectories is only partially modified (only the + first path - see below) +-- Only some of the contained file paths are modified - shown below for + pcre.vcproj +-- It properly modifies + +I am sure CMake people can fix that if they want to. Until then one will +need to replace existing absolute paths in project files with relative +paths manually (e.g. from VS) - relative to project file location. I did +just that before being told to try CMAKE_USE_RELATIVE_PATHS. Not a big +deal. + +AdditionalIncludeDirectories="E:\builds\pcre\build;E:\builds\pcre\pcre-7.5;" +AdditionalIncludeDirectories=".;E:\builds\pcre\pcre-7.5;" + +RelativePath="pcre.h" +RelativePath="pcre_chartables.c" +RelativePath="pcre_chartables.c.rule" + + +TESTING WITH RUNTEST.BAT + +If configured with CMake, building the test project ("make test" or building +ALL_TESTS in Visual Studio) creates (and runs) pcre_test.bat (and depending +on your configuration options, possibly other test programs) in the build +directory. Pcre_test.bat runs RunTest.Bat with correct source and exe paths. + +For manual testing with RunTest.bat, provided the build dir is a subdirectory +of the source directory: Open command shell window. Chdir to the location +of your pcretest.exe and pcregrep.exe programs. Call RunTest.bat with +"..\RunTest.Bat" or "..\..\RunTest.bat" as appropriate. + +To run only a particular test with RunTest.Bat provide a test number argument. + +Otherwise: + +1. Copy RunTest.bat into the directory where pcretest.exe and pcregrep.exe + have been created. + +2. Edit RunTest.bat to indentify the full or relative location of + the pcre source (wherein which the testdata folder resides), e.g.: + + set srcdir=C:\pcre\pcre-8.20 + +3. In a Windows command environment, chdir to the location of your bat and + exe programs. + +4. Run RunTest.bat. Test outputs will automatically be compared to expected + results, and discrepancies will be identified in the console output. + +To independently test the just-in-time compiler, run pcre_jit_test.exe. +To test pcrecpp, run pcrecpp_unittest.exe, pcre_stringpiece_unittest.exe and +pcre_scanner_unittest.exe. + + +BUILDING UNDER WINDOWS CE WITH VISUAL STUDIO 200x + +Vincent Richomme sent a zip archive of files to help with this process. They +can be found in the file "pcre-vsbuild.zip" in the Contrib directory of the FTP +site. + + +BUILDING UNDER WINDOWS WITH BCC5.5 + +Michael Roy sent these comments about building PCRE under Windows with BCC5.5: + +Some of the core BCC libraries have a version of PCRE from 1998 built in, which +can lead to pcre_exec() giving an erroneous PCRE_ERROR_NULL from a version +mismatch. I'm including an easy workaround below, if you'd like to include it +in the non-unix instructions: + +When linking a project with BCC5.5, pcre.lib must be included before any of the +libraries cw32.lib, cw32i.lib, cw32mt.lib, and cw32mti.lib on the command line. + + +BUILDING USING BORLAND C++ BUILDER 2007 (CB2007) AND HIGHER + +A PCRE user sent these comments about this environment (see also the comment +from another user that follows them): + +The XE versions of C++ Builder come with a RegularExpressionsCore class which +contain a version of TPerlRegEx. However, direct use of the C PCRE library may +be desirable. + +The default makevp.bat, however, supplied with PCRE builds a version of PCRE +that is not usable with any version of C++ Builder because the compiler ships +with an embedded version of PCRE, version 2.01 from 1998! [See also the note +about BCC5.5 above.] If you want to use PCRE you'll need to rename the +functions (pcre_compile to pcre_compile_bcc, etc) or do as I have done and just +use the 16 bit versions. I'm using std::wstring everywhere anyway. Since the +embedded version of PCRE does not have the 16 bit function names, there is no +conflict. + +Building PCRE using a C++ Builder static library project file (recommended): + +1. Rename or remove pcre.h, pcreposi.h, and pcreposix.h from your C++ Builder +original include path. + +2. Download PCRE from pcre.org and extract to a directory. + +3. Rename pcre_chartables.c.dist to pcre_chartables.c, pcre.h.generic to +pcre.h, and config.h.generic to config.h. + +4. Edit pcre.h and pcre_config.c so that they include config.h. + +5. Edit config.h like so: + +Comment out the following lines: +#define PACKAGE "pcre" +#define PACKAGE_BUGREPORT "" +#define PACKAGE_NAME "PCRE" +#define PACKAGE_STRING "PCRE 8.32" +#define PACKAGE_TARNAME "pcre" +#define PACKAGE_URL "" +#define PACKAGE_VERSION "8.32" + +Add the following lines: +#ifndef SUPPORT_UTF +#define SUPPORT_UTF 100 // any value is fine +#endif + +#ifndef SUPPORT_UCP +#define SUPPORT_UCP 101 // any value is fine +#endif + +#ifndef SUPPORT_UCP +#define SUPPORT_PCRE16 102 // any value is fine +#endif + +#ifndef SUPPORT_UTF8 +#define SUPPORT_UTF8 103 // any value is fine +#endif + +6. Build a C++ Builder project using the IDE. Go to File / New / Other and +choose Static Library. You can name it pcre.cbproj or whatever. Now set your +paths by going to Project / Options. Set the Include path. Do this from the +"Base" option to apply to both Release and Debug builds. Now add the following +files to the project: + +pcre.h +pcre16_byte_order.c +pcre16_chartables.c +pcre16_compile.c +pcre16_config.c +pcre16_dfa_exec.c +pcre16_exec.c +pcre16_fullinfo.c +pcre16_get.c +pcre16_globals.c +pcre16_maketables.c +pcre16_newline.c +pcre16_ord2utf16.c +pcre16_printint.c +pcre16_refcount.c +pcre16_string_utils.c +pcre16_study.c +pcre16_tables.c +pcre16_ucd.c +pcre16_utf16_utils.c +pcre16_valid_utf16.c +pcre16_version.c +pcre16_xclass.c + +//Optional +pcre_version.c + +7. After compiling the .lib file, copy the .lib and header files to a project +you want to use PCRE with. Enjoy. + +Optional ... Building PCRE using the makevp.bat file: + +1. Edit makevp_c.txt and makevp_l.txt and change all the names to the 16 bit +versions. + +2. Edit makevp.bat and set the path to C++ Builder. Run makevp.bat. + +Another PCRE user added this comment: + +Another approach I successfully used for some years with BCB 5 and 6 was to +make sure that include and library paths of PCRE are configured before the +default paths of the IDE in the dialogs where one can manage those paths. +Afterwards one can open the project files using a text editor and manually add +the self created library for pcre itself, pcrecpp doesn't ship with the IDE, in +the library nodes where the IDE manages its own libraries to link against in +front of the IDE-own libraries. This way one can use the default PCRE function +names without getting access violations on runtime. + + + + +BUILDING PCRE ON OPENVMS + +Stephen Hoffman sent the following, in December 2012: + +"Here is a very short write-up on the +OpenVMS port and here + + + +is a zip with the OpenVMS files, and with one modified testing-related PCRE +file." This is a port of PCRE 8.32. + +Earlier, Dan Mooney sent the following comments about building PCRE on OpenVMS. +They relate to an older version of PCRE that used fewer source files, so the +exact commands will need changing. See the current list of source files above. + +"It was quite easy to compile and link the library. I don't have a formal +make file but the attached file [reproduced below] contains the OpenVMS DCL +commands I used to build the library. I had to add #define +POSIX_MALLOC_THRESHOLD 10 to pcre.h since it was not defined anywhere. + +The library was built on: +O/S: HP OpenVMS v7.3-1 +Compiler: Compaq C v6.5-001-48BCD +Linker: vA13-01 + +The test results did not match 100% due to the issues you mention in your +documentation regarding isprint(), iscntrl(), isgraph() and ispunct(). I +modified some of the character tables temporarily and was able to get the +results to match. Tests using the fr locale did not match since I don't have +that locale loaded. The study size was always reported to be 3 less than the +value in the standard test output files." + +========================= +$! This DCL procedure builds PCRE on OpenVMS +$! +$! I followed the instructions in the non-unix-use file in the distribution. +$! +$ COMPILE == "CC/LIST/NOMEMBER_ALIGNMENT/PREFIX_LIBRARY_ENTRIES=ALL_ENTRIES +$ COMPILE DFTABLES.C +$ LINK/EXE=DFTABLES.EXE DFTABLES.OBJ +$ RUN DFTABLES.EXE/OUTPUT=CHARTABLES.C +$ COMPILE MAKETABLES.C +$ COMPILE GET.C +$ COMPILE STUDY.C +$! I had to set POSIX_MALLOC_THRESHOLD to 10 in PCRE.H since the symbol +$! did not seem to be defined anywhere. +$! I edited pcre.h and added #DEFINE SUPPORT_UTF8 to enable UTF8 support. +$ COMPILE PCRE.C +$ LIB/CREATE PCRE MAKETABLES.OBJ, GET.OBJ, STUDY.OBJ, PCRE.OBJ +$! I had to set POSIX_MALLOC_THRESHOLD to 10 in PCRE.H since the symbol +$! did not seem to be defined anywhere. +$ COMPILE PCREPOSIX.C +$ LIB/CREATE PCREPOSIX PCREPOSIX.OBJ +$ COMPILE PCRETEST.C +$ LINK/EXE=PCRETEST.EXE PCRETEST.OBJ, PCRE/LIB, PCREPOSIX/LIB +$! C programs that want access to command line arguments must be +$! defined as a symbol +$ PCRETEST :== "$ SYS$ROADSUSERS:[DMOONEY.REGEXP]PCRETEST.EXE" +$! Arguments must be enclosed in quotes. +$ PCRETEST "-C" +$! Test results: +$! +$! The test results did not match 100%. The functions isprint(), iscntrl(), +$! isgraph() and ispunct() on OpenVMS must not produce the same results +$! as the system that built the test output files provided with the +$! distribution. +$! +$! The study size did not match and was always 3 less on OpenVMS. +$! +$! Locale could not be set to fr +$! +========================= + + +BUILDING PCRE ON STRATUS OPENVOS + +These notes on the port of PCRE to VOS (lightly edited) were supplied by +Ashutosh Warikoo, whose email address has the local part awarikoo and the +domain nse.co.in. The port was for version 7.9 in August 2009. + +1. Building PCRE + +I built pcre on OpenVOS Release 17.0.1at using GNU Tools 3.4a without any +problems. I used the following packages to build PCRE: + + ftp://ftp.stratus.com/pub/vos/posix/ga/posix.save.evf.gz + +Please read and follow the instructions that come with these packages. To start +the build of pcre, from the root of the package type: + + ./build.sh + +2. Installing PCRE + +Once you have successfully built PCRE, login to the SysAdmin group, switch to +the root user, and type + + [ !create_dir (master_disk)>usr --if needed ] + [ !create_dir (master_disk)>usr>local --if needed ] + !gmake install + +This installs PCRE and its man pages into /usr/local. You can add +(master_disk)>usr>local>bin to your command search paths, or if you are in +BASH, add /usr/local/bin to the PATH environment variable. + +4. Restrictions + +This port requires readline library optionally. However during the build I +faced some yet unexplored errors while linking with readline. As it was an +optional component I chose to disable it. + +5. Known Problems + +I ran the test suite, but you will have to be your own judge of whether this +command, and this port, suits your purposes. If you find any problems that +appear to be related to the port itself, please let me know. Please see the +build.log file in the root of the package also. + + +BUILDING PCRE ON NATIVE Z/OS AND Z/VM + +z/OS and z/VM are operating systems for mainframe computers, produced by IBM. +The character code used is EBCDIC, not ASCII or Unicode. In z/OS, UNIX APIs and +applications can be supported through UNIX System Services, and in such an +environment PCRE can be built in the same way as in other systems. However, in +native z/OS (without UNIX System Services) and in z/VM, special ports are +required. PCRE1 version 8.39 is available in file 882 on this site: + + http://www.cbttape.org + +Everything, source and executable, is in EBCDIC and native z/OS file formats. +However, this software is not maintained and will not be upgraded. If you are +new to PCRE you should be looking at PCRE2 (version 10.30 or later). + +=============================== +Last Updated: 13 September 2017 +=============================== diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/NON-UNIX-USE b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/NON-UNIX-USE new file mode 100755 index 000000000..a25546b6f --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/NON-UNIX-USE @@ -0,0 +1,7 @@ +Compiling PCRE on non-Unix systems +---------------------------------- + +This has been renamed to better reflect its contents. Please see the file +NON-AUTOTOOLS-BUILD for details of how to build PCRE without using autotools. + +#### diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/PrepareRelease b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/PrepareRelease new file mode 100755 index 000000000..9891e08d6 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/PrepareRelease @@ -0,0 +1,258 @@ +#/bin/sh + +# Script to prepare the files for building a PCRE release. It does some +# processing of the documentation, detrails files, and creates pcre.h.generic +# and config.h.generic (for use by builders who can't run ./configure). + +# You must run this script before runnning "make dist". If its first argument +# is "doc", it stops after preparing the documentation. There are no other +# arguments. The script makes use of the following files: + +# 132html A Perl script that converts a .1 or .3 man page into HTML. It +# "knows" the relevant troff constructs that are used in the PCRE +# man pages. + +# CheckMan A Perl script that checks man pages for typos in the mark up. + +# CleanTxt A Perl script that cleans up the output of "nroff -man" by +# removing backspaces and other redundant text so as to produce +# a readable .txt file. + +# Detrail A Perl script that removes trailing spaces from files. + +# doc/index.html.src +# A file that is copied as index.html into the doc/html directory +# when the HTML documentation is built. It works like this so that +# doc/html can be deleted and re-created from scratch. + +# README & NON-AUTOTOOLS-BUILD +# These files are copied into the doc/html directory, with .txt +# extensions so that they can by hyperlinked from the HTML +# documentation, because some people just go to the HTML without +# looking for text files. + + +# First, sort out the documentation. Remove pcredemo.3 first because it won't +# pass the markup check (it is created below, using markup that none of the +# other pages use). + +cd doc +echo Processing documentation + +/bin/rm -f pcredemo.3 + +# Check the remaining man pages + +perl ../CheckMan *.1 *.3 +if [ $? != 0 ] ; then exit 1; fi + +# Make Text form of the documentation. It needs some mangling to make it +# tidy for online reading. Concatenate all the .3 stuff, but omit the +# individual function pages. + +cat <pcre.txt +----------------------------------------------------------------------------- +This file contains a concatenation of the PCRE man pages, converted to plain +text format for ease of searching with a text editor, or for use on systems +that do not have a man page processor. The small individual files that give +synopses of each function in the library have not been included. Neither has +the pcredemo program. There are separate text files for the pcregrep and +pcretest commands. +----------------------------------------------------------------------------- + + +End + +echo "Making pcre.txt" +for file in pcre pcre16 pcre32 pcrebuild pcrematching pcreapi pcrecallout \ + pcrecompat pcrepattern pcresyntax pcreunicode pcrejit pcrepartial \ + pcreprecompile pcreperform pcreposix pcrecpp pcresample \ + pcrelimits pcrestack ; do + echo " Processing $file.3" + nroff -c -man $file.3 >$file.rawtxt + perl ../CleanTxt <$file.rawtxt >>pcre.txt + /bin/rm $file.rawtxt + echo "------------------------------------------------------------------------------" >>pcre.txt + if [ "$file" != "pcresample" ] ; then + echo " " >>pcre.txt + echo " " >>pcre.txt + fi +done + +# The three commands +for file in pcretest pcregrep pcre-config ; do + echo Making $file.txt + nroff -c -man $file.1 >$file.rawtxt + perl ../CleanTxt <$file.rawtxt >$file.txt + /bin/rm $file.rawtxt +done + + +# Make pcredemo.3 from the pcredemo.c source file + +echo "Making pcredemo.3" +perl <<"END" >pcredemo.3 + open(IN, "../pcredemo.c") || die "Failed to open pcredemo.c\n"; + open(OUT, ">pcredemo.3") || die "Failed to open pcredemo.3\n"; + print OUT ".\\\" Start example.\n" . + ".de EX\n" . + ". nr mE \\\\n(.f\n" . + ". nf\n" . + ". nh\n" . + ". ft CW\n" . + "..\n" . + ".\n" . + ".\n" . + ".\\\" End example.\n" . + ".de EE\n" . + ". ft \\\\n(mE\n" . + ". fi\n" . + ". hy \\\\n(HY\n" . + "..\n" . + ".\n" . + ".EX\n" ; + while () + { + s/\\/\\e/g; + print OUT; + } + print OUT ".EE\n"; + close(IN); + close(OUT); +END +if [ $? != 0 ] ; then exit 1; fi + + +# Make HTML form of the documentation. + +echo "Making HTML documentation" +/bin/rm html/* +cp index.html.src html/index.html +cp ../README html/README.txt +cp ../NON-AUTOTOOLS-BUILD html/NON-AUTOTOOLS-BUILD.txt + +for file in *.1 ; do + base=`basename $file .1` + echo " Making $base.html" + perl ../132html -toc $base <$file >html/$base.html +done + +# Exclude table of contents for function summaries. It seems that expr +# forces an anchored regex. Also exclude them for small pages that have +# only one section. + +for file in *.3 ; do + base=`basename $file .3` + toc=-toc + if [ `expr $base : '.*_'` -ne 0 ] ; then toc="" ; fi + if [ "$base" = "pcresample" ] || \ + [ "$base" = "pcrestack" ] || \ + [ "$base" = "pcrecompat" ] || \ + [ "$base" = "pcrelimits" ] || \ + [ "$base" = "pcreperform" ] || \ + [ "$base" = "pcreunicode" ] ; then + toc="" + fi + echo " Making $base.html" + perl ../132html $toc $base <$file >html/$base.html + if [ $? != 0 ] ; then exit 1; fi +done + +# End of documentation processing; stop if only documentation required. + +cd .. +echo Documentation done +if [ "$1" = "doc" ] ; then exit; fi + +# These files are detrailed; do not detrail the test data because there may be +# significant trailing spaces. Do not detrail RunTest.bat, because it has CRLF +# line endings and the detrail script removes all trailing white space. The +# configure files are also omitted from the detrailing. We don't bother with +# those pcre[16|32]_xx files that just define COMPILE_PCRE16 and then #include the +# common file, because they aren't going to change. + +files="\ + Makefile.am \ + Makefile.in \ + configure.ac \ + README \ + LICENCE \ + COPYING \ + AUTHORS \ + NEWS \ + NON-UNIX-USE \ + NON-AUTOTOOLS-BUILD \ + INSTALL \ + 132html \ + CleanTxt \ + Detrail \ + ChangeLog \ + CMakeLists.txt \ + RunGrepTest \ + RunTest \ + pcre-config.in \ + libpcre.pc.in \ + libpcre16.pc.in \ + libpcre32.pc.in \ + libpcreposix.pc.in \ + libpcrecpp.pc.in \ + config.h.in \ + pcre_chartables.c.dist \ + pcredemo.c \ + pcregrep.c \ + pcretest.c \ + dftables.c \ + pcreposix.c \ + pcreposix.h \ + pcre.h.in \ + pcre_internal.h \ + pcre_byte_order.c \ + pcre_compile.c \ + pcre_config.c \ + pcre_dfa_exec.c \ + pcre_exec.c \ + pcre_fullinfo.c \ + pcre_get.c \ + pcre_globals.c \ + pcre_jit_compile.c \ + pcre_jit_test.c \ + pcre_maketables.c \ + pcre_newline.c \ + pcre_ord2utf8.c \ + pcre16_ord2utf16.c \ + pcre32_ord2utf32.c \ + pcre_printint.c \ + pcre_refcount.c \ + pcre_string_utils.c \ + pcre_study.c \ + pcre_tables.c \ + pcre_valid_utf8.c \ + pcre_version.c \ + pcre_xclass.c \ + pcre16_utf16_utils.c \ + pcre32_utf32_utils.c \ + pcre16_valid_utf16.c \ + pcre32_valid_utf32.c \ + pcre_scanner.cc \ + pcre_scanner.h \ + pcre_scanner_unittest.cc \ + pcrecpp.cc \ + pcrecpp.h \ + pcrecpparg.h.in \ + pcrecpp_unittest.cc \ + pcre_stringpiece.cc \ + pcre_stringpiece.h.in \ + pcre_stringpiece_unittest.cc \ + perltest.pl \ + ucp.h \ + makevp.bat \ + pcre.def \ + libpcre.def \ + libpcreposix.def" + +echo Detrailing +perl ./Detrail $files doc/p* doc/html/* + +echo Done + +#End diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/README b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/README new file mode 100755 index 000000000..334362b3e --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/README @@ -0,0 +1,1003 @@ +README file for PCRE (Perl-compatible regular expression library) +----------------------------------------------------------------- + +NOTE: This set of files relates to PCRE releases that use the original API, +with library names libpcre, libpcre16, and libpcre32. January 2015 saw the +first release of a new API, known as PCRE2, with release numbers starting at +10.00 and library names libpcre2-8, libpcre2-16, and libpcre2-32. The old +libraries (now called PCRE1) are still being maintained for bug fixes, but +there will be no new development. New projects are advised to use the new PCRE2 +libraries. + + +The latest release of PCRE1 is always available in three alternative formats +from: + + https://ftp.pcre.org/pub/pcre/pcre-x.xx.tar.gz + https://ftp.pcre.org/pub/pcre/pcre-x.xx.tar.bz2 + https://ftp.pcre.org/pub/pcre/pcre-x.xx.tar.zip + + +There is a mailing list for discussion about the development of PCRE at +pcre-dev@exim.org. You can access the archives and subscribe or manage your +subscription here: + + https://lists.exim.org/mailman/listinfo/pcre-dev + +Please read the NEWS file if you are upgrading from a previous release. +The contents of this README file are: + + The PCRE APIs + Documentation for PCRE + Contributions by users of PCRE + Building PCRE on non-Unix-like systems + Building PCRE without using autotools + Building PCRE using autotools + Retrieving configuration information + Shared libraries + Cross-compiling using autotools + Using HP's ANSI C++ compiler (aCC) + Compiling in Tru64 using native compilers + Using Sun's compilers for Solaris + Using PCRE from MySQL + Making new tarballs + Testing PCRE + Character tables + File manifest + + +The PCRE APIs +------------- + +PCRE is written in C, and it has its own API. There are three sets of +functions, one for the 8-bit library, which processes strings of bytes, one for +the 16-bit library, which processes strings of 16-bit values, and one for the +32-bit library, which processes strings of 32-bit values. The distribution also +includes a set of C++ wrapper functions (see the pcrecpp man page for details), +courtesy of Google Inc., which can be used to call the 8-bit PCRE library from +C++. Other C++ wrappers have been created from time to time. See, for example: +https://github.com/YasserAsmi/regexp, which aims to be simple and similar in +style to the C API. + +The distribution also contains a set of C wrapper functions (again, just for +the 8-bit library) that are based on the POSIX regular expression API (see the +pcreposix man page). These end up in the library called libpcreposix. Note that +this just provides a POSIX calling interface to PCRE; the regular expressions +themselves still follow Perl syntax and semantics. The POSIX API is restricted, +and does not give full access to all of PCRE's facilities. + +The header file for the POSIX-style functions is called pcreposix.h. The +official POSIX name is regex.h, but I did not want to risk possible problems +with existing files of that name by distributing it that way. To use PCRE with +an existing program that uses the POSIX API, pcreposix.h will have to be +renamed or pointed at by a link. + +If you are using the POSIX interface to PCRE and there is already a POSIX regex +library installed on your system, as well as worrying about the regex.h header +file (as mentioned above), you must also take care when linking programs to +ensure that they link with PCRE's libpcreposix library. Otherwise they may pick +up the POSIX functions of the same name from the other library. + +One way of avoiding this confusion is to compile PCRE with the addition of +-Dregcomp=PCREregcomp (and similarly for the other POSIX functions) to the +compiler flags (CFLAGS if you are using "configure" -- see below). This has the +effect of renaming the functions so that the names no longer clash. Of course, +you have to do the same thing for your applications, or write them using the +new names. + + +Documentation for PCRE +---------------------- + +If you install PCRE in the normal way on a Unix-like system, you will end up +with a set of man pages whose names all start with "pcre". The one that is just +called "pcre" lists all the others. In addition to these man pages, the PCRE +documentation is supplied in two other forms: + + 1. There are files called doc/pcre.txt, doc/pcregrep.txt, and + doc/pcretest.txt in the source distribution. The first of these is a + concatenation of the text forms of all the section 3 man pages except + the listing of pcredemo.c and those that summarize individual functions. + The other two are the text forms of the section 1 man pages for the + pcregrep and pcretest commands. These text forms are provided for ease of + scanning with text editors or similar tools. They are installed in + /share/doc/pcre, where is the installation prefix + (defaulting to /usr/local). + + 2. A set of files containing all the documentation in HTML form, hyperlinked + in various ways, and rooted in a file called index.html, is distributed in + doc/html and installed in /share/doc/pcre/html. + +Users of PCRE have contributed files containing the documentation for various +releases in CHM format. These can be found in the Contrib directory of the FTP +site (see next section). + + +Contributions by users of PCRE +------------------------------ + +You can find contributions from PCRE users in the directory + + ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/Contrib + +There is a README file giving brief descriptions of what they are. Some are +complete in themselves; others are pointers to URLs containing relevant files. +Some of this material is likely to be well out-of-date. Several of the earlier +contributions provided support for compiling PCRE on various flavours of +Windows (I myself do not use Windows). Nowadays there is more Windows support +in the standard distribution, so these contibutions have been archived. + +A PCRE user maintains downloadable Windows binaries of the pcregrep and +pcretest programs here: + + http://www.rexegg.com/pcregrep-pcretest.html + + +Building PCRE on non-Unix-like systems +-------------------------------------- + +For a non-Unix-like system, please read the comments in the file +NON-AUTOTOOLS-BUILD, though if your system supports the use of "configure" and +"make" you may be able to build PCRE using autotools in the same way as for +many Unix-like systems. + +PCRE can also be configured using the GUI facility provided by CMake's +cmake-gui command. This creates Makefiles, solution files, etc. The file +NON-AUTOTOOLS-BUILD has information about CMake. + +PCRE has been compiled on many different operating systems. It should be +straightforward to build PCRE on any system that has a Standard C compiler and +library, because it uses only Standard C functions. + + +Building PCRE without using autotools +------------------------------------- + +The use of autotools (in particular, libtool) is problematic in some +environments, even some that are Unix or Unix-like. See the NON-AUTOTOOLS-BUILD +file for ways of building PCRE without using autotools. + + +Building PCRE using autotools +----------------------------- + +If you are using HP's ANSI C++ compiler (aCC), please see the special note +in the section entitled "Using HP's ANSI C++ compiler (aCC)" below. + +The following instructions assume the use of the widely used "configure; make; +make install" (autotools) process. + +To build PCRE on system that supports autotools, first run the "configure" +command from the PCRE distribution directory, with your current directory set +to the directory where you want the files to be created. This command is a +standard GNU "autoconf" configuration script, for which generic instructions +are supplied in the file INSTALL. + +Most commonly, people build PCRE within its own distribution directory, and in +this case, on many systems, just running "./configure" is sufficient. However, +the usual methods of changing standard defaults are available. For example: + +CFLAGS='-O2 -Wall' ./configure --prefix=/opt/local + +This command specifies that the C compiler should be run with the flags '-O2 +-Wall' instead of the default, and that "make install" should install PCRE +under /opt/local instead of the default /usr/local. + +If you want to build in a different directory, just run "configure" with that +directory as current. For example, suppose you have unpacked the PCRE source +into /source/pcre/pcre-xxx, but you want to build it in /build/pcre/pcre-xxx: + +cd /build/pcre/pcre-xxx +/source/pcre/pcre-xxx/configure + +PCRE is written in C and is normally compiled as a C library. However, it is +possible to build it as a C++ library, though the provided building apparatus +does not have any features to support this. + +There are some optional features that can be included or omitted from the PCRE +library. They are also documented in the pcrebuild man page. + +. By default, both shared and static libraries are built. You can change this + by adding one of these options to the "configure" command: + + --disable-shared + --disable-static + + (See also "Shared libraries on Unix-like systems" below.) + +. By default, only the 8-bit library is built. If you add --enable-pcre16 to + the "configure" command, the 16-bit library is also built. If you add + --enable-pcre32 to the "configure" command, the 32-bit library is also built. + If you want only the 16-bit or 32-bit library, use --disable-pcre8 to disable + building the 8-bit library. + +. If you are building the 8-bit library and want to suppress the building of + the C++ wrapper library, you can add --disable-cpp to the "configure" + command. Otherwise, when "configure" is run without --disable-pcre8, it will + try to find a C++ compiler and C++ header files, and if it succeeds, it will + try to build the C++ wrapper. + +. If you want to include support for just-in-time compiling, which can give + large performance improvements on certain platforms, add --enable-jit to the + "configure" command. This support is available only for certain hardware + architectures. If you try to enable it on an unsupported architecture, there + will be a compile time error. + +. When JIT support is enabled, pcregrep automatically makes use of it, unless + you add --disable-pcregrep-jit to the "configure" command. + +. If you want to make use of the support for UTF-8 Unicode character strings in + the 8-bit library, or UTF-16 Unicode character strings in the 16-bit library, + or UTF-32 Unicode character strings in the 32-bit library, you must add + --enable-utf to the "configure" command. Without it, the code for handling + UTF-8, UTF-16 and UTF-8 is not included in the relevant library. Even + when --enable-utf is included, the use of a UTF encoding still has to be + enabled by an option at run time. When PCRE is compiled with this option, its + input can only either be ASCII or UTF-8/16/32, even when running on EBCDIC + platforms. It is not possible to use both --enable-utf and --enable-ebcdic at + the same time. + +. There are no separate options for enabling UTF-8, UTF-16 and UTF-32 + independently because that would allow ridiculous settings such as requesting + UTF-16 support while building only the 8-bit library. However, the option + --enable-utf8 is retained for backwards compatibility with earlier releases + that did not support 16-bit or 32-bit character strings. It is synonymous with + --enable-utf. It is not possible to configure one library with UTF support + and the other without in the same configuration. + +. If, in addition to support for UTF-8/16/32 character strings, you want to + include support for the \P, \p, and \X sequences that recognize Unicode + character properties, you must add --enable-unicode-properties to the + "configure" command. This adds about 30K to the size of the library (in the + form of a property table); only the basic two-letter properties such as Lu + are supported. + +. You can build PCRE to recognize either CR or LF or the sequence CRLF or any + of the preceding, or any of the Unicode newline sequences as indicating the + end of a line. Whatever you specify at build time is the default; the caller + of PCRE can change the selection at run time. The default newline indicator + is a single LF character (the Unix standard). You can specify the default + newline indicator by adding --enable-newline-is-cr or --enable-newline-is-lf + or --enable-newline-is-crlf or --enable-newline-is-anycrlf or + --enable-newline-is-any to the "configure" command, respectively. + + If you specify --enable-newline-is-cr or --enable-newline-is-crlf, some of + the standard tests will fail, because the lines in the test files end with + LF. Even if the files are edited to change the line endings, there are likely + to be some failures. With --enable-newline-is-anycrlf or + --enable-newline-is-any, many tests should succeed, but there may be some + failures. + +. By default, the sequence \R in a pattern matches any Unicode line ending + sequence. This is independent of the option specifying what PCRE considers to + be the end of a line (see above). However, the caller of PCRE can restrict \R + to match only CR, LF, or CRLF. You can make this the default by adding + --enable-bsr-anycrlf to the "configure" command (bsr = "backslash R"). + +. When called via the POSIX interface, PCRE uses malloc() to get additional + storage for processing capturing parentheses if there are more than 10 of + them in a pattern. You can increase this threshold by setting, for example, + + --with-posix-malloc-threshold=20 + + on the "configure" command. + +. PCRE has a counter that limits the depth of nesting of parentheses in a + pattern. This limits the amount of system stack that a pattern uses when it + is compiled. The default is 250, but you can change it by setting, for + example, + + --with-parens-nest-limit=500 + +. PCRE has a counter that can be set to limit the amount of resources it uses + when matching a pattern. If the limit is exceeded during a match, the match + fails. The default is ten million. You can change the default by setting, for + example, + + --with-match-limit=500000 + + on the "configure" command. This is just the default; individual calls to + pcre_exec() can supply their own value. There is more discussion on the + pcreapi man page. + +. There is a separate counter that limits the depth of recursive function calls + during a matching process. This also has a default of ten million, which is + essentially "unlimited". You can change the default by setting, for example, + + --with-match-limit-recursion=500000 + + Recursive function calls use up the runtime stack; running out of stack can + cause programs to crash in strange ways. There is a discussion about stack + sizes in the pcrestack man page. + +. The default maximum compiled pattern size is around 64K. You can increase + this by adding --with-link-size=3 to the "configure" command. In the 8-bit + library, PCRE then uses three bytes instead of two for offsets to different + parts of the compiled pattern. In the 16-bit library, --with-link-size=3 is + the same as --with-link-size=4, which (in both libraries) uses four-byte + offsets. Increasing the internal link size reduces performance. In the 32-bit + library, the only supported link size is 4. + +. You can build PCRE so that its internal match() function that is called from + pcre_exec() does not call itself recursively. Instead, it uses memory blocks + obtained from the heap via the special functions pcre_stack_malloc() and + pcre_stack_free() to save data that would otherwise be saved on the stack. To + build PCRE like this, use + + --disable-stack-for-recursion + + on the "configure" command. PCRE runs more slowly in this mode, but it may be + necessary in environments with limited stack sizes. This applies only to the + normal execution of the pcre_exec() function; if JIT support is being + successfully used, it is not relevant. Equally, it does not apply to + pcre_dfa_exec(), which does not use deeply nested recursion. There is a + discussion about stack sizes in the pcrestack man page. + +. For speed, PCRE uses four tables for manipulating and identifying characters + whose code point values are less than 256. By default, it uses a set of + tables for ASCII encoding that is part of the distribution. If you specify + + --enable-rebuild-chartables + + a program called dftables is compiled and run in the default C locale when + you obey "make". It builds a source file called pcre_chartables.c. If you do + not specify this option, pcre_chartables.c is created as a copy of + pcre_chartables.c.dist. See "Character tables" below for further information. + +. It is possible to compile PCRE for use on systems that use EBCDIC as their + character code (as opposed to ASCII/Unicode) by specifying + + --enable-ebcdic + + This automatically implies --enable-rebuild-chartables (see above). However, + when PCRE is built this way, it always operates in EBCDIC. It cannot support + both EBCDIC and UTF-8/16/32. There is a second option, --enable-ebcdic-nl25, + which specifies that the code value for the EBCDIC NL character is 0x25 + instead of the default 0x15. + +. In environments where valgrind is installed, if you specify + + --enable-valgrind + + PCRE will use valgrind annotations to mark certain memory regions as + unaddressable. This allows it to detect invalid memory accesses, and is + mostly useful for debugging PCRE itself. + +. In environments where the gcc compiler is used and lcov version 1.6 or above + is installed, if you specify + + --enable-coverage + + the build process implements a code coverage report for the test suite. The + report is generated by running "make coverage". If ccache is installed on + your system, it must be disabled when building PCRE for coverage reporting. + You can do this by setting the environment variable CCACHE_DISABLE=1 before + running "make" to build PCRE. There is more information about coverage + reporting in the "pcrebuild" documentation. + +. The pcregrep program currently supports only 8-bit data files, and so + requires the 8-bit PCRE library. It is possible to compile pcregrep to use + libz and/or libbz2, in order to read .gz and .bz2 files (respectively), by + specifying one or both of + + --enable-pcregrep-libz + --enable-pcregrep-libbz2 + + Of course, the relevant libraries must be installed on your system. + +. The default size (in bytes) of the internal buffer used by pcregrep can be + set by, for example: + + --with-pcregrep-bufsize=51200 + + The value must be a plain integer. The default is 20480. + +. It is possible to compile pcretest so that it links with the libreadline + or libedit libraries, by specifying, respectively, + + --enable-pcretest-libreadline or --enable-pcretest-libedit + + If this is done, when pcretest's input is from a terminal, it reads it using + the readline() function. This provides line-editing and history facilities. + Note that libreadline is GPL-licenced, so if you distribute a binary of + pcretest linked in this way, there may be licensing issues. These can be + avoided by linking with libedit (which has a BSD licence) instead. + + Enabling libreadline causes the -lreadline option to be added to the pcretest + build. In many operating environments with a sytem-installed readline + library this is sufficient. However, in some environments (e.g. if an + unmodified distribution version of readline is in use), it may be necessary + to specify something like LIBS="-lncurses" as well. This is because, to quote + the readline INSTALL, "Readline uses the termcap functions, but does not link + with the termcap or curses library itself, allowing applications which link + with readline the to choose an appropriate library." If you get error + messages about missing functions tgetstr, tgetent, tputs, tgetflag, or tgoto, + this is the problem, and linking with the ncurses library should fix it. + +The "configure" script builds the following files for the basic C library: + +. Makefile the makefile that builds the library +. config.h build-time configuration options for the library +. pcre.h the public PCRE header file +. pcre-config script that shows the building settings such as CFLAGS + that were set for "configure" +. libpcre.pc ) data for the pkg-config command +. libpcre16.pc ) +. libpcre32.pc ) +. libpcreposix.pc ) +. libtool script that builds shared and/or static libraries + +Versions of config.h and pcre.h are distributed in the PCRE tarballs under the +names config.h.generic and pcre.h.generic. These are provided for those who +have to built PCRE without using "configure" or CMake. If you use "configure" +or CMake, the .generic versions are not used. + +When building the 8-bit library, if a C++ compiler is found, the following +files are also built: + +. libpcrecpp.pc data for the pkg-config command +. pcrecpparg.h header file for calling PCRE via the C++ wrapper +. pcre_stringpiece.h header for the C++ "stringpiece" functions + +The "configure" script also creates config.status, which is an executable +script that can be run to recreate the configuration, and config.log, which +contains compiler output from tests that "configure" runs. + +Once "configure" has run, you can run "make". This builds the the libraries +libpcre, libpcre16 and/or libpcre32, and a test program called pcretest. If you +enabled JIT support with --enable-jit, a test program called pcre_jit_test is +built as well. + +If the 8-bit library is built, libpcreposix and the pcregrep command are also +built, and if a C++ compiler was found on your system, and you did not disable +it with --disable-cpp, "make" builds the C++ wrapper library, which is called +libpcrecpp, as well as some test programs called pcrecpp_unittest, +pcre_scanner_unittest, and pcre_stringpiece_unittest. + +The command "make check" runs all the appropriate tests. Details of the PCRE +tests are given below in a separate section of this document. + +You can use "make install" to install PCRE into live directories on your +system. The following are installed (file names are all relative to the + that is set when "configure" is run): + + Commands (bin): + pcretest + pcregrep (if 8-bit support is enabled) + pcre-config + + Libraries (lib): + libpcre16 (if 16-bit support is enabled) + libpcre32 (if 32-bit support is enabled) + libpcre (if 8-bit support is enabled) + libpcreposix (if 8-bit support is enabled) + libpcrecpp (if 8-bit and C++ support is enabled) + + Configuration information (lib/pkgconfig): + libpcre16.pc + libpcre32.pc + libpcre.pc + libpcreposix.pc + libpcrecpp.pc (if C++ support is enabled) + + Header files (include): + pcre.h + pcreposix.h + pcre_scanner.h ) + pcre_stringpiece.h ) if C++ support is enabled + pcrecpp.h ) + pcrecpparg.h ) + + Man pages (share/man/man{1,3}): + pcregrep.1 + pcretest.1 + pcre-config.1 + pcre.3 + pcre*.3 (lots more pages, all starting "pcre") + + HTML documentation (share/doc/pcre/html): + index.html + *.html (lots more pages, hyperlinked from index.html) + + Text file documentation (share/doc/pcre): + AUTHORS + COPYING + ChangeLog + LICENCE + NEWS + README + pcre.txt (a concatenation of the man(3) pages) + pcretest.txt the pcretest man page + pcregrep.txt the pcregrep man page + pcre-config.txt the pcre-config man page + +If you want to remove PCRE from your system, you can run "make uninstall". +This removes all the files that "make install" installed. However, it does not +remove any directories, because these are often shared with other programs. + + +Retrieving configuration information +------------------------------------ + +Running "make install" installs the command pcre-config, which can be used to +recall information about the PCRE configuration and installation. For example: + + pcre-config --version + +prints the version number, and + + pcre-config --libs + +outputs information about where the library is installed. This command can be +included in makefiles for programs that use PCRE, saving the programmer from +having to remember too many details. + +The pkg-config command is another system for saving and retrieving information +about installed libraries. Instead of separate commands for each library, a +single command is used. For example: + + pkg-config --cflags pcre + +The data is held in *.pc files that are installed in a directory called +/lib/pkgconfig. + + +Shared libraries +---------------- + +The default distribution builds PCRE as shared libraries and static libraries, +as long as the operating system supports shared libraries. Shared library +support relies on the "libtool" script which is built as part of the +"configure" process. + +The libtool script is used to compile and link both shared and static +libraries. They are placed in a subdirectory called .libs when they are newly +built. The programs pcretest and pcregrep are built to use these uninstalled +libraries (by means of wrapper scripts in the case of shared libraries). When +you use "make install" to install shared libraries, pcregrep and pcretest are +automatically re-built to use the newly installed shared libraries before being +installed themselves. However, the versions left in the build directory still +use the uninstalled libraries. + +To build PCRE using static libraries only you must use --disable-shared when +configuring it. For example: + +./configure --prefix=/usr/gnu --disable-shared + +Then run "make" in the usual way. Similarly, you can use --disable-static to +build only shared libraries. + + +Cross-compiling using autotools +------------------------------- + +You can specify CC and CFLAGS in the normal way to the "configure" command, in +order to cross-compile PCRE for some other host. However, you should NOT +specify --enable-rebuild-chartables, because if you do, the dftables.c source +file is compiled and run on the local host, in order to generate the inbuilt +character tables (the pcre_chartables.c file). This will probably not work, +because dftables.c needs to be compiled with the local compiler, not the cross +compiler. + +When --enable-rebuild-chartables is not specified, pcre_chartables.c is created +by making a copy of pcre_chartables.c.dist, which is a default set of tables +that assumes ASCII code. Cross-compiling with the default tables should not be +a problem. + +If you need to modify the character tables when cross-compiling, you should +move pcre_chartables.c.dist out of the way, then compile dftables.c by hand and +run it on the local host to make a new version of pcre_chartables.c.dist. +Then when you cross-compile PCRE this new version of the tables will be used. + + +Using HP's ANSI C++ compiler (aCC) +---------------------------------- + +Unless C++ support is disabled by specifying the "--disable-cpp" option of the +"configure" script, you must include the "-AA" option in the CXXFLAGS +environment variable in order for the C++ components to compile correctly. + +Also, note that the aCC compiler on PA-RISC platforms may have a defect whereby +needed libraries fail to get included when specifying the "-AA" compiler +option. If you experience unresolved symbols when linking the C++ programs, +use the workaround of specifying the following environment variable prior to +running the "configure" script: + + CXXLDFLAGS="-lstd_v2 -lCsup_v2" + + +Compiling in Tru64 using native compilers +----------------------------------------- + +The following error may occur when compiling with native compilers in the Tru64 +operating system: + + CXX libpcrecpp_la-pcrecpp.lo +cxx: Error: /usr/lib/cmplrs/cxx/V7.1-006/include/cxx/iosfwd, line 58: #error + directive: "cannot include iosfwd -- define __USE_STD_IOSTREAM to + override default - see section 7.1.2 of the C++ Using Guide" +#error "cannot include iosfwd -- define __USE_STD_IOSTREAM to override default +- see section 7.1.2 of the C++ Using Guide" + +This may be followed by other errors, complaining that 'namespace "std" has no +member'. The solution to this is to add the line + +#define __USE_STD_IOSTREAM 1 + +to the config.h file. + + +Using Sun's compilers for Solaris +--------------------------------- + +A user reports that the following configurations work on Solaris 9 sparcv9 and +Solaris 9 x86 (32-bit): + + Solaris 9 sparcv9: ./configure --disable-cpp CC=/bin/cc CFLAGS="-m64 -g" + Solaris 9 x86: ./configure --disable-cpp CC=/bin/cc CFLAGS="-g" + + +Using PCRE from MySQL +--------------------- + +On systems where both PCRE and MySQL are installed, it is possible to make use +of PCRE from within MySQL, as an alternative to the built-in pattern matching. +There is a web page that tells you how to do this: + + http://www.mysqludf.org/lib_mysqludf_preg/index.php + + +Making new tarballs +------------------- + +The command "make dist" creates three PCRE tarballs, in tar.gz, tar.bz2, and +zip formats. The command "make distcheck" does the same, but then does a trial +build of the new distribution to ensure that it works. + +If you have modified any of the man page sources in the doc directory, you +should first run the PrepareRelease script before making a distribution. This +script creates the .txt and HTML forms of the documentation from the man pages. + + +Testing PCRE +------------ + +To test the basic PCRE library on a Unix-like system, run the RunTest script. +There is another script called RunGrepTest that tests the options of the +pcregrep command. If the C++ wrapper library is built, three test programs +called pcrecpp_unittest, pcre_scanner_unittest, and pcre_stringpiece_unittest +are also built. When JIT support is enabled, another test program called +pcre_jit_test is built. + +Both the scripts and all the program tests are run if you obey "make check" or +"make test". For other environments, see the instructions in +NON-AUTOTOOLS-BUILD. + +The RunTest script runs the pcretest test program (which is documented in its +own man page) on each of the relevant testinput files in the testdata +directory, and compares the output with the contents of the corresponding +testoutput files. RunTest uses a file called testtry to hold the main output +from pcretest. Other files whose names begin with "test" are used as working +files in some tests. + +Some tests are relevant only when certain build-time options were selected. For +example, the tests for UTF-8/16/32 support are run only if --enable-utf was +used. RunTest outputs a comment when it skips a test. + +Many of the tests that are not skipped are run up to three times. The second +run forces pcre_study() to be called for all patterns except for a few in some +tests that are marked "never study" (see the pcretest program for how this is +done). If JIT support is available, the non-DFA tests are run a third time, +this time with a forced pcre_study() with the PCRE_STUDY_JIT_COMPILE option. +This testing can be suppressed by putting "nojit" on the RunTest command line. + +The entire set of tests is run once for each of the 8-bit, 16-bit and 32-bit +libraries that are enabled. If you want to run just one set of tests, call +RunTest with either the -8, -16 or -32 option. + +If valgrind is installed, you can run the tests under it by putting "valgrind" +on the RunTest command line. To run pcretest on just one or more specific test +files, give their numbers as arguments to RunTest, for example: + + RunTest 2 7 11 + +You can also specify ranges of tests such as 3-6 or 3- (meaning 3 to the +end), or a number preceded by ~ to exclude a test. For example: + + Runtest 3-15 ~10 + +This runs tests 3 to 15, excluding test 10, and just ~13 runs all the tests +except test 13. Whatever order the arguments are in, the tests are always run +in numerical order. + +You can also call RunTest with the single argument "list" to cause it to output +a list of tests. + +The first test file can be fed directly into the perltest.pl script to check +that Perl gives the same results. The only difference you should see is in the +first few lines, where the Perl version is given instead of the PCRE version. + +The second set of tests check pcre_fullinfo(), pcre_study(), +pcre_copy_substring(), pcre_get_substring(), pcre_get_substring_list(), error +detection, and run-time flags that are specific to PCRE, as well as the POSIX +wrapper API. It also uses the debugging flags to check some of the internals of +pcre_compile(). + +If you build PCRE with a locale setting that is not the standard C locale, the +character tables may be different (see next paragraph). In some cases, this may +cause failures in the second set of tests. For example, in a locale where the +isprint() function yields TRUE for characters in the range 128-255, the use of +[:isascii:] inside a character class defines a different set of characters, and +this shows up in this test as a difference in the compiled code, which is being +listed for checking. Where the comparison test output contains [\x00-\x7f] the +test will contain [\x00-\xff], and similarly in some other cases. This is not a +bug in PCRE. + +The third set of tests checks pcre_maketables(), the facility for building a +set of character tables for a specific locale and using them instead of the +default tables. The tests make use of the "fr_FR" (French) locale. Before +running the test, the script checks for the presence of this locale by running +the "locale" command. If that command fails, or if it doesn't include "fr_FR" +in the list of available locales, the third test cannot be run, and a comment +is output to say why. If running this test produces instances of the error + + ** Failed to set locale "fr_FR" + +in the comparison output, it means that locale is not available on your system, +despite being listed by "locale". This does not mean that PCRE is broken. + +[If you are trying to run this test on Windows, you may be able to get it to +work by changing "fr_FR" to "french" everywhere it occurs. Alternatively, use +RunTest.bat. The version of RunTest.bat included with PCRE 7.4 and above uses +Windows versions of test 2. More info on using RunTest.bat is included in the +document entitled NON-UNIX-USE.] + +The fourth and fifth tests check the UTF-8/16/32 support and error handling and +internal UTF features of PCRE that are not relevant to Perl, respectively. The +sixth and seventh tests do the same for Unicode character properties support. + +The eighth, ninth, and tenth tests check the pcre_dfa_exec() alternative +matching function, in non-UTF-8/16/32 mode, UTF-8/16/32 mode, and UTF-8/16/32 +mode with Unicode property support, respectively. + +The eleventh test checks some internal offsets and code size features; it is +run only when the default "link size" of 2 is set (in other cases the sizes +change) and when Unicode property support is enabled. + +The twelfth test is run only when JIT support is available, and the thirteenth +test is run only when JIT support is not available. They test some JIT-specific +features such as information output from pcretest about JIT compilation. + +The fourteenth, fifteenth, and sixteenth tests are run only in 8-bit mode, and +the seventeenth, eighteenth, and nineteenth tests are run only in 16/32-bit +mode. These are tests that generate different output in the two modes. They are +for general cases, UTF-8/16/32 support, and Unicode property support, +respectively. + +The twentieth test is run only in 16/32-bit mode. It tests some specific +16/32-bit features of the DFA matching engine. + +The twenty-first and twenty-second tests are run only in 16/32-bit mode, when +the link size is set to 2 for the 16-bit library. They test reloading +pre-compiled patterns. + +The twenty-third and twenty-fourth tests are run only in 16-bit mode. They are +for general cases, and UTF-16 support, respectively. + +The twenty-fifth and twenty-sixth tests are run only in 32-bit mode. They are +for general cases, and UTF-32 support, respectively. + + +Character tables +---------------- + +For speed, PCRE uses four tables for manipulating and identifying characters +whose code point values are less than 256. The final argument of the +pcre_compile() function is a pointer to a block of memory containing the +concatenated tables. A call to pcre_maketables() can be used to generate a set +of tables in the current locale. If the final argument for pcre_compile() is +passed as NULL, a set of default tables that is built into the binary is used. + +The source file called pcre_chartables.c contains the default set of tables. By +default, this is created as a copy of pcre_chartables.c.dist, which contains +tables for ASCII coding. However, if --enable-rebuild-chartables is specified +for ./configure, a different version of pcre_chartables.c is built by the +program dftables (compiled from dftables.c), which uses the ANSI C character +handling functions such as isalnum(), isalpha(), isupper(), islower(), etc. to +build the table sources. This means that the default C locale which is set for +your system will control the contents of these default tables. You can change +the default tables by editing pcre_chartables.c and then re-building PCRE. If +you do this, you should take care to ensure that the file does not get +automatically re-generated. The best way to do this is to move +pcre_chartables.c.dist out of the way and replace it with your customized +tables. + +When the dftables program is run as a result of --enable-rebuild-chartables, +it uses the default C locale that is set on your system. It does not pay +attention to the LC_xxx environment variables. In other words, it uses the +system's default locale rather than whatever the compiling user happens to have +set. If you really do want to build a source set of character tables in a +locale that is specified by the LC_xxx variables, you can run the dftables +program by hand with the -L option. For example: + + ./dftables -L pcre_chartables.c.special + +The first two 256-byte tables provide lower casing and case flipping functions, +respectively. The next table consists of three 32-byte bit maps which identify +digits, "word" characters, and white space, respectively. These are used when +building 32-byte bit maps that represent character classes for code points less +than 256. + +The final 256-byte table has bits indicating various character types, as +follows: + + 1 white space character + 2 letter + 4 decimal digit + 8 hexadecimal digit + 16 alphanumeric or '_' + 128 regular expression metacharacter or binary zero + +You should not alter the set of characters that contain the 128 bit, as that +will cause PCRE to malfunction. + + +File manifest +------------- + +The distribution should contain the files listed below. Where a file name is +given as pcre[16|32]_xxx it means that there are three files, one with the name +pcre_xxx, one with the name pcre16_xx, and a third with the name pcre32_xxx. + +(A) Source files of the PCRE library functions and their headers: + + dftables.c auxiliary program for building pcre_chartables.c + when --enable-rebuild-chartables is specified + + pcre_chartables.c.dist a default set of character tables that assume ASCII + coding; used, unless --enable-rebuild-chartables is + specified, by copying to pcre[16]_chartables.c + + pcreposix.c ) + pcre[16|32]_byte_order.c ) + pcre[16|32]_compile.c ) + pcre[16|32]_config.c ) + pcre[16|32]_dfa_exec.c ) + pcre[16|32]_exec.c ) + pcre[16|32]_fullinfo.c ) + pcre[16|32]_get.c ) sources for the functions in the library, + pcre[16|32]_globals.c ) and some internal functions that they use + pcre[16|32]_jit_compile.c ) + pcre[16|32]_maketables.c ) + pcre[16|32]_newline.c ) + pcre[16|32]_refcount.c ) + pcre[16|32]_string_utils.c ) + pcre[16|32]_study.c ) + pcre[16|32]_tables.c ) + pcre[16|32]_ucd.c ) + pcre[16|32]_version.c ) + pcre[16|32]_xclass.c ) + pcre_ord2utf8.c ) + pcre_valid_utf8.c ) + pcre16_ord2utf16.c ) + pcre16_utf16_utils.c ) + pcre16_valid_utf16.c ) + pcre32_utf32_utils.c ) + pcre32_valid_utf32.c ) + + pcre[16|32]_printint.c ) debugging function that is used by pcretest, + ) and can also be #included in pcre_compile() + + pcre.h.in template for pcre.h when built by "configure" + pcreposix.h header for the external POSIX wrapper API + pcre_internal.h header for internal use + sljit/* 16 files that make up the JIT compiler + ucp.h header for Unicode property handling + + config.h.in template for config.h, which is built by "configure" + + pcrecpp.h public header file for the C++ wrapper + pcrecpparg.h.in template for another C++ header file + pcre_scanner.h public header file for C++ scanner functions + pcrecpp.cc ) + pcre_scanner.cc ) source for the C++ wrapper library + + pcre_stringpiece.h.in template for pcre_stringpiece.h, the header for the + C++ stringpiece functions + pcre_stringpiece.cc source for the C++ stringpiece functions + +(B) Source files for programs that use PCRE: + + pcredemo.c simple demonstration of coding calls to PCRE + pcregrep.c source of a grep utility that uses PCRE + pcretest.c comprehensive test program + +(C) Auxiliary files: + + 132html script to turn "man" pages into HTML + AUTHORS information about the author of PCRE + ChangeLog log of changes to the code + CleanTxt script to clean nroff output for txt man pages + Detrail script to remove trailing spaces + HACKING some notes about the internals of PCRE + INSTALL generic installation instructions + LICENCE conditions for the use of PCRE + COPYING the same, using GNU's standard name + Makefile.in ) template for Unix Makefile, which is built by + ) "configure" + Makefile.am ) the automake input that was used to create + ) Makefile.in + NEWS important changes in this release + NON-UNIX-USE the previous name for NON-AUTOTOOLS-BUILD + NON-AUTOTOOLS-BUILD notes on building PCRE without using autotools + PrepareRelease script to make preparations for "make dist" + README this file + RunTest a Unix shell script for running tests + RunGrepTest a Unix shell script for pcregrep tests + aclocal.m4 m4 macros (generated by "aclocal") + config.guess ) files used by libtool, + config.sub ) used only when building a shared library + configure a configuring shell script (built by autoconf) + configure.ac ) the autoconf input that was used to build + ) "configure" and config.h + depcomp ) script to find program dependencies, generated by + ) automake + doc/*.3 man page sources for PCRE + doc/*.1 man page sources for pcregrep and pcretest + doc/index.html.src the base HTML page + doc/html/* HTML documentation + doc/pcre.txt plain text version of the man pages + doc/pcretest.txt plain text documentation of test program + doc/perltest.txt plain text documentation of Perl test program + install-sh a shell script for installing files + libpcre16.pc.in template for libpcre16.pc for pkg-config + libpcre32.pc.in template for libpcre32.pc for pkg-config + libpcre.pc.in template for libpcre.pc for pkg-config + libpcreposix.pc.in template for libpcreposix.pc for pkg-config + libpcrecpp.pc.in template for libpcrecpp.pc for pkg-config + ltmain.sh file used to build a libtool script + missing ) common stub for a few missing GNU programs while + ) installing, generated by automake + mkinstalldirs script for making install directories + perltest.pl Perl test program + pcre-config.in source of script which retains PCRE information + pcre_jit_test.c test program for the JIT compiler + pcrecpp_unittest.cc ) + pcre_scanner_unittest.cc ) test programs for the C++ wrapper + pcre_stringpiece_unittest.cc ) + testdata/testinput* test data for main library tests + testdata/testoutput* expected test results + testdata/grep* input and output for pcregrep tests + testdata/* other supporting test files + +(D) Auxiliary files for cmake support + + cmake/COPYING-CMAKE-SCRIPTS + cmake/FindPackageHandleStandardArgs.cmake + cmake/FindEditline.cmake + cmake/FindReadline.cmake + CMakeLists.txt + config-cmake.h.in + +(E) Auxiliary files for VPASCAL + + makevp.bat + makevp_c.txt + makevp_l.txt + pcregexp.pas + +(F) Auxiliary files for building PCRE "by hand" + + pcre.h.generic ) a version of the public PCRE header file + ) for use in non-"configure" environments + config.h.generic ) a version of config.h for use in non-"configure" + ) environments + +(F) Miscellaneous + + RunTest.bat a script for running tests under Windows + +Philip Hazel +Email local part: ph10 +Email domain: cam.ac.uk +Last updated: 12 February 2020 diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/RunGrepTest b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/RunGrepTest new file mode 100755 index 000000000..721ec5184 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/RunGrepTest @@ -0,0 +1,593 @@ +#! /bin/sh + +# Run pcregrep tests. The assumption is that the PCRE tests check the library +# itself. What we are checking here is the file handling and options that are +# supported by pcregrep. This script must be run in the build directory. + +# Set the C locale, so that sort(1) behaves predictably. + +LC_ALL=C +export LC_ALL + +# Remove any non-default colouring and aliases that the caller may have set. + +unset PCREGREP_COLOUR PCREGREP_COLOR +unset cp ls mv rm + +# Remember the current (build) directory, set the program to be tested, and +# valgrind settings when requested. + +builddir=`pwd` +pcregrep=$builddir/pcregrep + +valgrind= +while [ $# -gt 0 ] ; do + case $1 in + valgrind) valgrind="valgrind -q --leak-check=no --smc-check=all";; + *) echo "RunGrepTest: Unknown argument $1"; exit 1;; + esac + shift +done + +echo " " +pcregrep_version=`$pcregrep -V` +if [ "$valgrind" = "" ] ; then + echo "Testing $pcregrep_version" +else + echo "Testing $pcregrep_version using valgrind" +fi + +# Set up a suitable "diff" command for comparison. Some systems have a diff +# that lacks a -u option. Try to deal with this; better do the test for the -b +# option as well. + +cf="diff" +diff -b /dev/null /dev/null 2>/dev/null && cf="diff -b" +diff -u /dev/null /dev/null 2>/dev/null && cf="diff -u" +diff -ub /dev/null /dev/null 2>/dev/null && cf="diff -ub" + +# If this test is being run from "make check", $srcdir will be set. If not, set +# it to the current or parent directory, whichever one contains the test data. +# Subsequently, we run most of the pcregrep tests in the source directory so +# that the file names in the output are always the same. + +if [ -z "$srcdir" -o ! -d "$srcdir/testdata" ] ; then + if [ -d "./testdata" ] ; then + srcdir=. + elif [ -d "../testdata" ] ; then + srcdir=.. + else + echo "Cannot find the testdata directory" + exit 1 + fi +fi + +# Check for the availability of UTF-8 support + +./pcretest -C utf >/dev/null +utf8=$? + +# We need valgrind suppressions when JIT is in use. (This isn't perfect because +# some tests are run with -no-jit, but as PCRE1 is in maintenance only, I have +# not bothered about that.) + +./pcretest -C jit >/dev/null +if [ $? -eq 1 -a "$valgrind" != "" ] ; then + valgrind="$valgrind --suppressions=./testdata/valgrind-jit.supp" +fi + +echo "Testing pcregrep main features" + +echo "---------------------------- Test 1 ------------------------------" >testtrygrep +(cd $srcdir; $valgrind $pcregrep PATTERN ./testdata/grepinput) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 2 ------------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep '^PATTERN' ./testdata/grepinput) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 3 ------------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -in PATTERN ./testdata/grepinput) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 4 ------------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -ic PATTERN ./testdata/grepinput) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 5 ------------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -in PATTERN ./testdata/grepinput ./testdata/grepinputx) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 6 ------------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -inh PATTERN ./testdata/grepinput ./testdata/grepinputx) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 7 ------------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -il PATTERN ./testdata/grepinput ./testdata/grepinputx) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 8 ------------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -l PATTERN ./testdata/grepinput ./testdata/grepinputx) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 9 ------------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -q PATTERN ./testdata/grepinput ./testdata/grepinputx) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 10 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -q NEVER-PATTERN ./testdata/grepinput ./testdata/grepinputx) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 11 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -vn pattern ./testdata/grepinputx) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 12 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -ix pattern ./testdata/grepinputx) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 13 -----------------------------" >>testtrygrep +echo seventeen >testtemp1grep +(cd $srcdir; $valgrind $pcregrep -f./testdata/greplist -f $builddir/testtemp1grep ./testdata/grepinputx) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 14 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -w pat ./testdata/grepinput ./testdata/grepinputx) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 15 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep 'abc^*' ./testdata/grepinput) 2>>testtrygrep >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 16 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep abc ./testdata/grepinput ./testdata/nonexistfile) 2>>testtrygrep >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 17 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -M 'the\noutput' ./testdata/grepinput) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 18 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -Mn '(the\noutput|dog\.\n--)' ./testdata/grepinput) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 19 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -Mix 'Pattern' ./testdata/grepinputx) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 20 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -Mixn 'complete pair\nof lines' ./testdata/grepinputx) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 21 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -nA3 'four' ./testdata/grepinputx) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 22 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -nB3 'four' ./testdata/grepinputx) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 23 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -C3 'four' ./testdata/grepinputx) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 24 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -A9 'four' ./testdata/grepinputx) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 25 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -nB9 'four' ./testdata/grepinputx) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 26 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -A9 -B9 'four' ./testdata/grepinputx) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 27 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -A10 'four' ./testdata/grepinputx) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 28 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -nB10 'four' ./testdata/grepinputx) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 29 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -C12 -B10 'four' ./testdata/grepinputx) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 30 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -inB3 'pattern' ./testdata/grepinput ./testdata/grepinputx) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 31 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -inA3 'pattern' ./testdata/grepinput ./testdata/grepinputx) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 32 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -L 'fox' ./testdata/grepinput ./testdata/grepinputx) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 33 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep 'fox' ./testdata/grepnonexist) >>testtrygrep 2>&1 +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 34 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -s 'fox' ./testdata/grepnonexist) >>testtrygrep 2>&1 +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 35 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -L -r --include=grepinputx --include grepinput8 --exclude-dir='^\.' 'fox' ./testdata | sort) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 36 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -L -r --include=grepinput --exclude 'grepinput$' --exclude=grepinput8 --exclude-dir='^\.' 'fox' ./testdata | sort) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 37 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep '^(a+)*\d' ./testdata/grepinput) >>testtrygrep 2>teststderrgrep +echo "RC=$?" >>testtrygrep +echo "======== STDERR ========" >>testtrygrep +cat teststderrgrep >>testtrygrep + +echo "---------------------------- Test 38 ------------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep '>\x00<' ./testdata/grepinput) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 39 ------------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -A1 'before the binary zero' ./testdata/grepinput) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 40 ------------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -B1 'after the binary zero' ./testdata/grepinput) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 41 ------------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -B1 -o '\w+ the binary zero' ./testdata/grepinput) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 42 ------------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -B1 -onH '\w+ the binary zero' ./testdata/grepinput) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 43 ------------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -on 'before|zero|after' ./testdata/grepinput) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 44 ------------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -on -e before -ezero -e after ./testdata/grepinput) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 45 ------------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -on -f ./testdata/greplist -e binary ./testdata/grepinput) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 46 ------------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -eabc -e '(unclosed' ./testdata/grepinput) 2>>testtrygrep >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 47 ------------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -Fx "AB.VE +elephant" ./testdata/grepinput) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 48 ------------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -F "AB.VE +elephant" ./testdata/grepinput) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 49 ------------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -F -e DATA -e "AB.VE +elephant" ./testdata/grepinput) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 50 ------------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep "^(abc|def|ghi|jkl)" ./testdata/grepinputx) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 51 ------------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -Mv "brown\sfox" ./testdata/grepinputv) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 52 ------------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep --colour=always jumps ./testdata/grepinputv) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 53 ------------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep --file-offsets 'before|zero|after' ./testdata/grepinput) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 54 ------------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep --line-offsets 'before|zero|after' ./testdata/grepinput) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 55 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -f./testdata/greplist --color=always ./testdata/grepinputx) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 56 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -c lazy ./testdata/grepinput*) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 57 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -c -l lazy ./testdata/grepinput*) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 58 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep --regex=PATTERN ./testdata/grepinput) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 59 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep --regexp=PATTERN ./testdata/grepinput) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 60 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep --regex PATTERN ./testdata/grepinput) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 61 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep --regexp PATTERN ./testdata/grepinput) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 62 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep --match-limit=1000 --no-jit -M 'This is a file(.|\R)*file.' ./testdata/grepinput) >>testtrygrep 2>&1 +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 63 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep --recursion-limit=1000 --no-jit -M 'This is a file(.|\R)*file.' ./testdata/grepinput) >>testtrygrep 2>&1 +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 64 ------------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -o1 '(?<=PAT)TERN (ap(pear)s)' ./testdata/grepinput) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 65 ------------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -o2 '(?<=PAT)TERN (ap(pear)s)' ./testdata/grepinput) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 66 ------------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -o3 '(?<=PAT)TERN (ap(pear)s)' ./testdata/grepinput) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 67 ------------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -o12 '(?<=PAT)TERN (ap(pear)s)' ./testdata/grepinput) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 68 ------------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep --only-matching=2 '(?<=PAT)TERN (ap(pear)s)' ./testdata/grepinput) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 69 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -vn --colour=always pattern ./testdata/grepinputx) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 70 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep --color=always -M "triple:\t.*\n\n" ./testdata/grepinput3) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 71 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -o "^01|^02|^03" ./testdata/grepinput) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 72 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep --color=always "^01|^02|^03" ./testdata/grepinput) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 73 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -o --colour=always "^01|^02|^03" ./testdata/grepinput) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 74 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -o "^01|02|^03" ./testdata/grepinput) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 75 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep --color=always "^01|02|^03" ./testdata/grepinput) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 76 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -o --colour=always "^01|02|^03" ./testdata/grepinput) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 77 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -o "^01|^02|03" ./testdata/grepinput) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 78 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep --color=always "^01|^02|03" ./testdata/grepinput) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 79 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -o --colour=always "^01|^02|03" ./testdata/grepinput) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 80 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -o "\b01|\b02" ./testdata/grepinput) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 81 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep --color=always "\\b01|\\b02" ./testdata/grepinput) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 82 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -o --colour=always "\\b01|\\b02" ./testdata/grepinput) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 83 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep --buffer-size=100 "^a" ./testdata/grepinput3) >>testtrygrep 2>&1 +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 84 -----------------------------" >>testtrygrep +echo testdata/grepinput3 >testtemp1grep +(cd $srcdir; $valgrind $pcregrep --file-list ./testdata/grepfilelist --file-list $builddir/testtemp1grep "fox|complete|t7") >>testtrygrep 2>&1 +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 85 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep --file-list=./testdata/grepfilelist "dolor" ./testdata/grepinput3) >>testtrygrep 2>&1 +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 86 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep "dog" ./testdata/grepbinary) >>testtrygrep 2>&1 +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 87 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep "cat" ./testdata/grepbinary) >>testtrygrep 2>&1 +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 88 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -v "cat" ./testdata/grepbinary) >>testtrygrep 2>&1 +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 89 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -I "dog" ./testdata/grepbinary) >>testtrygrep 2>&1 +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 90 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep --binary-files=without-match "dog" ./testdata/grepbinary) >>testtrygrep 2>&1 +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 91 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -a "dog" ./testdata/grepbinary) >>testtrygrep 2>&1 +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 92 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep --binary-files=text "dog" ./testdata/grepbinary) >>testtrygrep 2>&1 +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 93 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep --text "dog" ./testdata/grepbinary) >>testtrygrep 2>&1 +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 94 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -L -r --include=grepinputx --include grepinput8 'fox' ./testdata/grepinput* | sort) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 95 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep --file-list ./testdata/grepfilelist --exclude grepinputv "fox|complete") >>testtrygrep 2>&1 +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 96 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -L -r --include-dir=testdata --exclude '^(?!grepinput)' 'fox' ./test* | sort) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 97 -----------------------------" >>testtrygrep +echo "grepinput$" >testtemp1grep +echo "grepinput8" >>testtemp1grep +(cd $srcdir; $valgrind $pcregrep -L -r --include=grepinput --exclude-from $builddir/testtemp1grep --exclude-dir='^\.' 'fox' ./testdata | sort) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 98 -----------------------------" >>testtrygrep +echo "grepinput$" >testtemp1grep +echo "grepinput8" >>testtemp1grep +(cd $srcdir; $valgrind $pcregrep -L -r --exclude=grepinput3 --include=grepinput --exclude-from $builddir/testtemp1grep --exclude-dir='^\.' 'fox' ./testdata | sort) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 99 -----------------------------" >>testtrygrep +echo "grepinput$" >testtemp1grep +echo "grepinput8" >testtemp2grep +(cd $srcdir; $valgrind $pcregrep -L -r --include grepinput --exclude-from $builddir/testtemp1grep --exclude-from=$builddir/testtemp2grep --exclude-dir='^\.' 'fox' ./testdata | sort) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 100 ------------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -Ho2 --only-matching=1 -o3 '(\w+) binary (\w+)(\.)?' ./testdata/grepinput) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 101 ------------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -o3 -Ho2 -o12 --only-matching=1 -o3 --colour=always --om-separator='|' '(\w+) binary (\w+)(\.)?' ./testdata/grepinput) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 102 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -n "^$" ./testdata/grepinput3) >>testtrygrep 2>&1 +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 103 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep --only-matching "^$" ./testdata/grepinput3) >>testtrygrep 2>&1 +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 104 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -n --only-matching "^$" ./testdata/grepinput3) >>testtrygrep 2>&1 +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 105 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep --colour=always "ipsum|" ./testdata/grepinput3) >>testtrygrep 2>&1 +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 106 -----------------------------" >>testtrygrep +(cd $srcdir; echo "a" | $valgrind $pcregrep -M "|a" ) >>testtrygrep 2>&1 +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 107 -----------------------------" >>testtrygrep +echo "a" >testtemp1grep +echo "aaaaa" >>testtemp1grep +(cd $srcdir; $valgrind $pcregrep --line-offsets '(?<=\Ka)' $builddir/testtemp1grep) >>testtrygrep 2>&1 +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 108 ------------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -lq PATTERN ./testdata/grepinput ./testdata/grepinputx) >>testtrygrep +echo "RC=$?" >>testtrygrep + +echo "---------------------------- Test 109 -----------------------------" >>testtrygrep +(cd $srcdir; $valgrind $pcregrep -cq lazy ./testdata/grepinput*) >>testtrygrep +echo "RC=$?" >>testtrygrep + +# Now compare the results. + +$cf $srcdir/testdata/grepoutput testtrygrep +if [ $? != 0 ] ; then exit 1; fi + + +# These tests require UTF-8 support + +if [ $utf8 -ne 0 ] ; then + echo "Testing pcregrep UTF-8 features" + + echo "---------------------------- Test U1 ------------------------------" >testtrygrep + (cd $srcdir; $valgrind $pcregrep -n -u --newline=any "^X" ./testdata/grepinput8) >>testtrygrep + echo "RC=$?" >>testtrygrep + + echo "---------------------------- Test U2 ------------------------------" >>testtrygrep + (cd $srcdir; $valgrind $pcregrep -n -u -C 3 --newline=any "Match" ./testdata/grepinput8) >>testtrygrep + echo "RC=$?" >>testtrygrep + + $cf $srcdir/testdata/grepoutput8 testtrygrep + if [ $? != 0 ] ; then exit 1; fi + +else + echo "Skipping pcregrep UTF-8 tests: no UTF-8 support in PCRE library" +fi + + +# We go to some contortions to try to ensure that the tests for the various +# newline settings will work in environments where the normal newline sequence +# is not \n. Do not use exported files, whose line endings might be changed. +# Instead, create an input file using printf so that its contents are exactly +# what we want. Note the messy fudge to get printf to write a string that +# starts with a hyphen. These tests are run in the build directory. + +echo "Testing pcregrep newline settings" +printf "abc\rdef\r\nghi\njkl" >testNinputgrep + +printf "%c--------------------------- Test N1 ------------------------------\r\n" - >testtrygrep +$valgrind $pcregrep -n -N CR "^(abc|def|ghi|jkl)" testNinputgrep >>testtrygrep + +printf "%c--------------------------- Test N2 ------------------------------\r\n" - >>testtrygrep +$valgrind $pcregrep -n --newline=crlf "^(abc|def|ghi|jkl)" testNinputgrep >>testtrygrep + +printf "%c--------------------------- Test N3 ------------------------------\r\n" - >>testtrygrep +pattern=`printf 'def\rjkl'` +$valgrind $pcregrep -n --newline=cr -F "$pattern" testNinputgrep >>testtrygrep + +printf "%c--------------------------- Test N4 ------------------------------\r\n" - >>testtrygrep +$valgrind $pcregrep -n --newline=crlf -F -f $srcdir/testdata/greppatN4 testNinputgrep >>testtrygrep + +printf "%c--------------------------- Test N5 ------------------------------\r\n" - >>testtrygrep +$valgrind $pcregrep -n --newline=any "^(abc|def|ghi|jkl)" testNinputgrep >>testtrygrep + +printf "%c--------------------------- Test N6 ------------------------------\r\n" - >>testtrygrep +$valgrind $pcregrep -n --newline=anycrlf "^(abc|def|ghi|jkl)" testNinputgrep >>testtrygrep + +$cf $srcdir/testdata/grepoutputN testtrygrep +if [ $? != 0 ] ; then exit 1; fi + +exit 0 + +# End diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/RunTest b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/RunTest new file mode 100755 index 000000000..357a739b7 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/RunTest @@ -0,0 +1,1014 @@ +#! /bin/sh + +############################################################################### +# Run the PCRE tests using the pcretest program. The appropriate tests are +# selected, depending on which build-time options were used. +# +# All tests are now run both with and without -s, to ensure that everything is +# tested with and without studying. However, there are some tests that produce +# different output after studying, typically when we are tracing the actual +# matching process (for example, using auto-callouts). In these few cases, the +# tests are duplicated in the files, one with /S to force studying always, and +# one with /SS to force *not* studying always. The use of -s doesn't then make +# any difference to their output. There is also one test which compiles invalid +# UTF-8 with the UTF-8 check turned off; for this, studying must also be +# disabled with /SS. +# +# When JIT support is available, all appropriate tests are also run with -s+ to +# test (again, almost) everything with studying and the JIT option, unless +# "nojit" is given on the command line. There are also two tests for +# JIT-specific features, one to be run when JIT support is available (unless +# "nojit" is specified), and one when it is not. +# +# Whichever of the 8-, 16- and 32-bit libraries exist are tested. It is also +# possible to select which to test by giving "-8", "-16" or "-32" on the +# command line. +# +# As well as "nojit", "-8", "-16", and "-32", arguments for this script are +# individual test numbers, ranges of tests such as 3-6 or 3- (meaning 3 to the +# end), or a number preceded by ~ to exclude a test. For example, "3-15 ~10" +# runs tests 3 to 15, excluding test 10, and just "~10" runs all the tests +# except test 10. Whatever order the arguments are in, the tests are always run +# in numerical order. +# +# The special argument "3S" runs test 3, stopping if it fails. Test 3 is the +# locale test, and failure usually means there's an issue with the locale +# rather than a bug in PCRE, so normally subsequent tests are run. "3S" is +# useful when you want to debug or update the test. +# +# Inappropriate tests are automatically skipped (with a comment to say so): for +# example, if JIT support is not compiled, test 12 is skipped, whereas if JIT +# support is compiled, test 13 is skipped. +# +# Other arguments can be one of the words "valgrind", "valgrind-log", or "sim" +# followed by an argument to run cross-compiled executables under a simulator, +# for example: +# +# RunTest 3 sim "qemu-arm -s 8388608" +# +# There are two special cases where only one argument is allowed: +# +# If the first and only argument is "ebcdic", the script runs the special +# EBCDIC test that can be useful for checking certain EBCDIC features, even +# when run in an ASCII environment. +# +# If the script is obeyed as "RunTest list", a list of available tests is +# output, but none of them are run. +############################################################################### + +# Define test titles in variables so that they can be output as a list. Some +# of them are modified (e.g. with -8 or -16) when used in the actual tests. + +title1="Test 1: Main functionality (Compatible with Perl >= 5.10)" +title2="Test 2: API, errors, internals, and non-Perl stuff" +title3="Test 3: Locale-specific features" +title4A="Test 4: UTF" +title4B=" support (Compatible with Perl >= 5.10)" +title5="Test 5: API, internals, and non-Perl stuff for UTF" +title6="Test 6: Unicode property support (Compatible with Perl >= 5.10)" +title7="Test 7: API, internals, and non-Perl stuff for Unicode property support" +title8="Test 8: DFA matching main functionality" +title9="Test 9: DFA matching with UTF" +title10="Test 10: DFA matching with Unicode properties" +title11="Test 11: Internal offsets and code size tests" +title12="Test 12: JIT-specific features (when JIT is available)" +title13="Test 13: JIT-specific features (when JIT is not available)" +title14="Test 14: Specials for the basic 8-bit library" +title15="Test 15: Specials for the 8-bit library with UTF-8 support" +title16="Test 16: Specials for the 8-bit library with Unicode propery support" +title17="Test 17: Specials for the basic 16/32-bit library" +title18="Test 18: Specials for the 16/32-bit library with UTF-16/32 support" +title19="Test 19: Specials for the 16/32-bit library with Unicode property support" +title20="Test 20: DFA specials for the basic 16/32-bit library" +title21="Test 21: Reloads for the basic 16/32-bit library" +title22="Test 22: Reloads for the 16/32-bit library with UTF-16/32 support" +title23="Test 23: Specials for the 16-bit library" +title24="Test 24: Specials for the 16-bit library with UTF-16 support" +title25="Test 25: Specials for the 32-bit library" +title26="Test 26: Specials for the 32-bit library with UTF-32 support" + +maxtest=26 + +if [ $# -eq 1 -a "$1" = "list" ]; then + echo $title1 + echo $title2 "(not UTF)" + echo $title3 + echo $title4A $title4B + echo $title5 support + echo $title6 + echo $title7 + echo $title8 + echo $title9 + echo $title10 + echo $title11 + echo $title12 + echo $title13 + echo $title14 + echo $title15 + echo $title16 + echo $title17 + echo $title18 + echo $title19 + echo $title20 + echo $title21 + echo $title22 + echo $title23 + echo $title24 + echo $title25 + echo $title26 + exit 0 +fi + +# Set up a suitable "diff" command for comparison. Some systems +# have a diff that lacks a -u option. Try to deal with this. + +cf="diff" +diff -u /dev/null /dev/null 2>/dev/null && cf="diff -u" + +# Find the test data + +if [ -n "$srcdir" -a -d "$srcdir" ] ; then + testdata="$srcdir/testdata" +elif [ -d "./testdata" ] ; then + testdata=./testdata +elif [ -d "../testdata" ] ; then + testdata=../testdata +else + echo "Cannot find the testdata directory" + exit 1 +fi + + +# ------ Special EBCDIC Test ------- + +if [ $# -eq 1 -a "$1" = "ebcdic" ]; then + ./pcretest -C ebcdic >/dev/null + ebcdic=$? + if [ $ebcdic -ne 1 ] ; then + echo "Cannot run EBCDIC tests: EBCDIC support not compiled" + exit 1 + fi + + for opt in "" "-s" "-dfa" "-s -dfa"; do + ./pcretest -q $opt $testdata/testinputEBC >testtry + if [ $? = 0 ] ; then + $cf $testdata/testoutputEBC testtry + if [ $? != 0 ] ; then exit 1; fi + else exit 1 + fi + if [ "$opt" = "-s" ] ; then echo " OK with study" + elif [ "$opt" = "-dfa" ] ; then echo " OK using DFA" + elif [ "$opt" = "-s -dfa" ] ; then echo " OK using DFA with study" + else echo " OK" + fi + done + +exit 0 +fi + + +# ------ Normal Tests ------ + +# Default values + +arg8= +arg16= +arg32= +nojit= +sim= +skip= +valgrind= +vjs= + +# This is in case the caller has set aliases (as I do - PH) +unset cp ls mv rm + +# Process options and select which tests to run; for those that are explicitly +# requested, check that the necessary optional facilities are available. + +do1=no +do2=no +do3=no +do4=no +do5=no +do6=no +do7=no +do8=no +do9=no +do10=no +do11=no +do12=no +do13=no +do14=no +do15=no +do16=no +do17=no +do18=no +do19=no +do20=no +do21=no +do22=no +do23=no +do24=no +do25=no +do26=no + +while [ $# -gt 0 ] ; do + case $1 in + 1) do1=yes;; + 2) do2=yes;; + 3) do3=yes;; + 4) do4=yes;; + 5) do5=yes;; + 6) do6=yes;; + 7) do7=yes;; + 8) do8=yes;; + 9) do9=yes;; + 10) do10=yes;; + 11) do11=yes;; + 12) do12=yes;; + 13) do13=yes;; + 14) do14=yes;; + 15) do15=yes;; + 16) do16=yes;; + 17) do17=yes;; + 18) do18=yes;; + 19) do19=yes;; + 20) do20=yes;; + 21) do21=yes;; + 22) do22=yes;; + 23) do23=yes;; + 24) do24=yes;; + 25) do25=yes;; + 26) do26=yes;; + -8) arg8=yes;; + -16) arg16=yes;; + -32) arg32=yes;; + nojit) nojit=yes;; + sim) shift; sim=$1;; + valgrind) valgrind="valgrind --tool=memcheck -q --smc-check=all";; + valgrind-log) valgrind="valgrind --tool=memcheck --num-callers=30 --leak-check=no --error-limit=no --smc-check=all --log-file=report.%p ";; + ~*) + if expr "$1" : '~[0-9][0-9]*$' >/dev/null; then + skip="$skip `expr "$1" : '~\([0-9]*\)*$'`" + else + echo "Unknown option or test selector '$1'"; exit 1 + fi + ;; + *-*) + if expr "$1" : '[0-9][0-9]*-[0-9]*$' >/dev/null; then + tf=`expr "$1" : '\([0-9]*\)'` + tt=`expr "$1" : '.*-\([0-9]*\)'` + if [ "$tt" = "" ] ; then tt=$maxtest; fi + if expr \( "$tf" "<" 1 \) \| \( "$tt" ">" "$maxtest" \) >/dev/null; then + echo "Invalid test range '$1'"; exit 1 + fi + while expr "$tf" "<=" "$tt" >/dev/null; do + eval do${tf}=yes + tf=`expr $tf + 1` + done + else + echo "Invalid test range '$1'"; exit 1 + fi + ;; + *) echo "Unknown option or test selector '$1'"; exit 1;; + esac + shift +done + +# Find which optional facilities are available. + +$sim ./pcretest -C linksize >/dev/null +link_size=$? +if [ $link_size -lt 2 ] ; then + echo "Failed to find internal link size" + exit 1 +fi +if [ $link_size -gt 4 ] ; then + echo "Failed to find internal link size" + exit 1 +fi + +# All of 8-bit, 16-bit, and 32-bit character strings may be supported, but only +# one need be. + +$sim ./pcretest -C pcre8 >/dev/null +support8=$? +$sim ./pcretest -C pcre16 >/dev/null +support16=$? +$sim ./pcretest -C pcre32 >/dev/null +support32=$? + +# Initialize all bitsizes skipped + +test8=skip +test16=skip +test32=skip + +# If no bitsize arguments, select all that are available + +if [ "$arg8$arg16$arg32" = "" ] ; then + if [ $support8 -ne 0 ] ; then + test8= + fi + if [ $support16 -ne 0 ] ; then + test16=-16 + fi + if [ $support32 -ne 0 ] ; then + test32=-32 + fi + +# Select requested bit sizes + +else + if [ "$arg8" = yes ] ; then + if [ $support8 -eq 0 ] ; then + echo "Cannot run 8-bit library tests: 8-bit library not compiled" + exit 1 + fi + test8= + fi + if [ "$arg16" = yes ] ; then + if [ $support16 -eq 0 ] ; then + echo "Cannot run 16-bit library tests: 16-bit library not compiled" + exit 1 + fi + test16=-16 + fi + if [ "$arg32" = yes ] ; then + if [ $support32 -eq 0 ] ; then + echo "Cannot run 32-bit library tests: 32-bit library not compiled" + exit 1 + fi + test32=-32 + fi +fi + +# UTF support always applies to all bit sizes if both are supported; we can't +# have UTF-8 support without UTF-16 support (for example). + +$sim ./pcretest -C utf >/dev/null +utf=$? + +$sim ./pcretest -C ucp >/dev/null +ucp=$? + +jitopt= +$sim ./pcretest -C jit >/dev/null +jit=$? +if [ $jit -ne 0 -a "$nojit" != "yes" ] ; then + jitopt=-s+ + if [ "$valgrind" != "" ] ; then + vjs="--suppressions=$testdata/valgrind-jit.supp" + fi +fi + +# If no specific tests were requested, select all. Those that are not +# relevant will be automatically skipped. + +if [ $do1 = no -a $do2 = no -a $do3 = no -a $do4 = no -a \ + $do5 = no -a $do6 = no -a $do7 = no -a $do8 = no -a \ + $do9 = no -a $do10 = no -a $do11 = no -a $do12 = no -a \ + $do13 = no -a $do14 = no -a $do15 = no -a $do16 = no -a \ + $do17 = no -a $do18 = no -a $do19 = no -a $do20 = no -a \ + $do21 = no -a $do22 = no -a $do23 = no -a $do24 = no -a \ + $do25 = no -a $do26 = no ] ; then + do1=yes + do2=yes + do3=yes + do4=yes + do5=yes + do6=yes + do7=yes + do8=yes + do9=yes + do10=yes + do11=yes + do12=yes + do13=yes + do14=yes + do15=yes + do16=yes + do17=yes + do18=yes + do19=yes + do20=yes + do21=yes + do22=yes + do23=yes + do24=yes + do25=yes + do26=yes +fi + +# Handle any explicit skips at this stage, so that an argument list may consist +# only of explicit skips. + +for i in $skip; do eval do$i=no; done + +# Show which release and which test data + +echo "" +echo PCRE C library tests using test data from $testdata +$sim ./pcretest /dev/null + +for bmode in "$test8" "$test16" "$test32"; do + case "$bmode" in + skip) continue;; + -16) if [ "$test8$test32" != "skipskip" ] ; then echo ""; fi + bits=16; echo "---- Testing 16-bit library ----"; echo "";; + -32) if [ "$test8$test16" != "skipskip" ] ; then echo ""; fi + bits=32; echo "---- Testing 32-bit library ----"; echo "";; + *) bits=8; echo "---- Testing 8-bit library ----"; echo "";; + esac + +# Primary test, compatible with JIT and all versions of Perl >= 5.8 + +if [ $do1 = yes ] ; then + echo $title1 + for opt in "" "-s" $jitopt; do + $sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $testdata/testinput1 testtry + if [ $? = 0 ] ; then + $cf $testdata/testoutput1 testtry + if [ $? != 0 ] ; then exit 1; fi + else exit 1 + fi + if [ "$opt" = "-s" ] ; then echo " OK with study" + elif [ "$opt" = "-s+" ] ; then echo " OK with JIT study" + else echo " OK" + fi + done +fi + +# PCRE tests that are not JIT or Perl-compatible: API, errors, internals + +if [ $do2 = yes ] ; then + echo $title2 "(not UTF-$bits)" + for opt in "" "-s" $jitopt; do + $sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $testdata/testinput2 testtry + if [ $? = 0 ] ; then + $cf $testdata/testoutput2 testtry + if [ $? != 0 ] ; then exit 1; fi + else + echo " " + echo "** Test 2 requires a lot of stack. If it has crashed with a" + echo "** segmentation fault, it may be that you do not have enough" + echo "** stack available by default. Please see the 'pcrestack' man" + echo "** page for a discussion of PCRE's stack usage." + echo " " + exit 1 + fi + if [ "$opt" = "-s" ] ; then echo " OK with study" + elif [ "$opt" = "-s+" ] ; then echo " OK with JIT study" + else echo " OK" + fi + done +fi + +# Locale-specific tests, provided that either the "fr_FR" or the "french" +# locale is available. The former is the Unix-like standard; the latter is +# for Windows. Another possibility is "fr". Unfortunately, different versions +# of the French locale give different outputs for some items. This test passes +# if the output matches any one of the alternative output files. + +if [ $do3 = yes ] ; then + locale -a | grep '^fr_FR$' >/dev/null + if [ $? -eq 0 ] ; then + locale=fr_FR + infile=$testdata/testinput3 + outfile=$testdata/testoutput3 + outfile2=$testdata/testoutput3A + outfile3=$testdata/testoutput3B + else + infile=test3input + outfile=test3output + outfile2=test3outputA + outfile3=test3outputB + locale -a | grep '^french$' >/dev/null + if [ $? -eq 0 ] ; then + locale=french + sed 's/fr_FR/french/' $testdata/testinput3 >test3input + sed 's/fr_FR/french/' $testdata/testoutput3 >test3output + sed 's/fr_FR/french/' $testdata/testoutput3A >test3outputA + sed 's/fr_FR/french/' $testdata/testoutput3B >test3outputB + else + locale -a | grep '^fr$' >/dev/null + if [ $? -eq 0 ] ; then + locale=fr + sed 's/fr_FR/fr/' $testdata/intestinput3 >test3input + sed 's/fr_FR/fr/' $testdata/intestoutput3 >test3output + sed 's/fr_FR/fr/' $testdata/intestoutput3A >test3outputA + sed 's/fr_FR/fr/' $testdata/intestoutput3B >test3outputB + else + locale= + fi + fi + fi + + if [ "$locale" != "" ] ; then + echo $title3 "(using '$locale' locale)" + for opt in "" "-s" $jitopt; do + $sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $infile testtry + if [ $? = 0 ] ; then + if $cf $outfile testtry >teststdout || \ + $cf $outfile2 testtry >teststdout || \ + $cf $outfile3 testtry >teststdout + then + if [ "$opt" = "-s" ] ; then echo " OK with study" + elif [ "$opt" = "-s+" ] ; then echo " OK with JIT study" + else echo " OK" + fi + else + echo "** Locale test did not run successfully. The output did not match" + echo " $outfile, $outfile2 or $outfile3." + echo " This may mean that there is a problem with the locale settings rather" + echo " than a bug in PCRE." + exit 1 + fi + else exit 1 + fi + done + else + echo "Cannot test locale-specific features - none of the 'fr_FR', 'fr' or" + echo "'french' locales exist, or the \"locale\" command is not available" + echo "to check for them." + echo " " + fi +fi + +# Additional tests for UTF support + +if [ $do4 = yes ] ; then + echo ${title4A}-${bits}${title4B} + if [ $utf -eq 0 ] ; then + echo " Skipped because UTF-$bits support is not available" + else + for opt in "" "-s" $jitopt; do + $sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $testdata/testinput4 testtry + if [ $? = 0 ] ; then + $cf $testdata/testoutput4 testtry + if [ $? != 0 ] ; then exit 1; fi + else exit 1 + fi + if [ "$opt" = "-s" ] ; then echo " OK with study" + elif [ "$opt" = "-s+" ] ; then echo " OK with JIT study" + else echo " OK" + fi + done + fi +fi + +if [ $do5 = yes ] ; then + echo ${title5}-${bits} support + if [ $utf -eq 0 ] ; then + echo " Skipped because UTF-$bits support is not available" + else + for opt in "" "-s" $jitopt; do + $sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $testdata/testinput5 testtry + if [ $? = 0 ] ; then + $cf $testdata/testoutput5 testtry + if [ $? != 0 ] ; then exit 1; fi + else exit 1 + fi + if [ "$opt" = "-s" ] ; then echo " OK with study" + elif [ "$opt" = "-s+" ] ; then echo " OK with JIT study" + else echo " OK" + fi + done + fi +fi + +if [ $do6 = yes ] ; then + echo $title6 + if [ $utf -eq 0 -o $ucp -eq 0 ] ; then + echo " Skipped because Unicode property support is not available" + else + for opt in "" "-s" $jitopt; do + $sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $testdata/testinput6 testtry + if [ $? = 0 ] ; then + $cf $testdata/testoutput6 testtry + if [ $? != 0 ] ; then exit 1; fi + else exit 1 + fi + if [ "$opt" = "-s" ] ; then echo " OK with study" + elif [ "$opt" = "-s+" ] ; then echo " OK with JIT study" + else echo " OK" + fi + done + fi +fi + +# Test non-Perl-compatible Unicode property support + +if [ $do7 = yes ] ; then + echo $title7 + if [ $utf -eq 0 -o $ucp -eq 0 ] ; then + echo " Skipped because Unicode property support is not available" + else + for opt in "" "-s" $jitopt; do + $sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $testdata/testinput7 testtry + if [ $? = 0 ] ; then + $cf $testdata/testoutput7 testtry + if [ $? != 0 ] ; then exit 1; fi + else exit 1 + fi + if [ "$opt" = "-s" ] ; then echo " OK with study" + elif [ "$opt" = "-s+" ] ; then echo " OK with JIT study" + else echo " OK" + fi + done + fi +fi + +# Tests for DFA matching support + +if [ $do8 = yes ] ; then + echo $title8 + for opt in "" "-s"; do + $sim $valgrind ./pcretest -q $bmode $opt -dfa $testdata/testinput8 testtry + if [ $? = 0 ] ; then + $cf $testdata/testoutput8 testtry + if [ $? != 0 ] ; then exit 1; fi + else exit 1 + fi + if [ "$opt" = "-s" ] ; then echo " OK with study" ; else echo " OK"; fi + done +fi + +if [ $do9 = yes ] ; then + echo ${title9}-${bits} + if [ $utf -eq 0 ] ; then + echo " Skipped because UTF-$bits support is not available" + else + for opt in "" "-s"; do + $sim $valgrind ./pcretest -q $bmode $opt -dfa $testdata/testinput9 testtry + if [ $? = 0 ] ; then + $cf $testdata/testoutput9 testtry + if [ $? != 0 ] ; then exit 1; fi + else exit 1 + fi + if [ "$opt" = "-s" ] ; then echo " OK with study" ; else echo " OK"; fi + done + fi +fi + +if [ $do10 = yes ] ; then + echo $title10 + if [ $utf -eq 0 -o $ucp -eq 0 ] ; then + echo " Skipped because Unicode property support is not available" + else + for opt in "" "-s"; do + $sim $valgrind ./pcretest -q $bmode $opt -dfa $testdata/testinput10 testtry + if [ $? = 0 ] ; then + $cf $testdata/testoutput10 testtry + if [ $? != 0 ] ; then exit 1; fi + else exit 1 + fi + if [ "$opt" = "-s" ] ; then echo " OK with study" ; else echo " OK"; fi + done + fi +fi + +# Test of internal offsets and code sizes. This test is run only when there +# is Unicode property support and the link size is 2. The actual tests are +# mostly the same as in some of the above, but in this test we inspect some +# offsets and sizes that require a known link size. This is a doublecheck for +# the maintainer, just in case something changes unexpectely. The output from +# this test is not the same in 8-bit and 16-bit modes. + +if [ $do11 = yes ] ; then + echo $title11 + if [ $link_size -ne 2 ] ; then + echo " Skipped because link size is not 2" + elif [ $ucp -eq 0 ] ; then + echo " Skipped because Unicode property support is not available" + else + for opt in "" "-s"; do + $sim $valgrind ./pcretest -q $bmode $opt $testdata/testinput11 testtry + if [ $? = 0 ] ; then + $cf $testdata/testoutput11-$bits testtry + if [ $? != 0 ] ; then exit 1; fi + else exit 1 + fi + if [ "$opt" = "-s" ] ; then echo " OK with study" ; else echo " OK"; fi + done + fi +fi + +# Test JIT-specific features when JIT is available + +if [ $do12 = yes ] ; then + echo $title12 + if [ $jit -eq 0 -o "$nojit" = "yes" ] ; then + echo " Skipped because JIT is not available or not usable" + else + $sim $valgrind $vjs ./pcretest -q $bmode $testdata/testinput12 testtry + if [ $? = 0 ] ; then + $cf $testdata/testoutput12 testtry + if [ $? != 0 ] ; then exit 1; fi + else exit 1 + fi + echo " OK" + fi +fi + +# Test JIT-specific features when JIT is not available + +if [ $do13 = yes ] ; then + echo $title13 + if [ $jit -ne 0 ] ; then + echo " Skipped because JIT is available" + else + $sim $valgrind ./pcretest -q $bmode $testdata/testinput13 testtry + if [ $? = 0 ] ; then + $cf $testdata/testoutput13 testtry + if [ $? != 0 ] ; then exit 1; fi + else exit 1 + fi + echo " OK" + fi +fi + +# Tests for 8-bit-specific features + +if [ "$do14" = yes ] ; then + echo $title14 + if [ "$bits" = "16" -o "$bits" = "32" ] ; then + echo " Skipped when running 16/32-bit tests" + else + cp -f $testdata/saved16 testsaved16 + cp -f $testdata/saved32 testsaved32 + for opt in "" "-s" $jitopt; do + $sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $testdata/testinput14 testtry + if [ $? = 0 ] ; then + $cf $testdata/testoutput14 testtry + if [ $? != 0 ] ; then exit 1; fi + else exit 1 + fi + if [ "$opt" = "-s" ] ; then echo " OK with study" + elif [ "$opt" = "-s+" ] ; then echo " OK with JIT study" + else echo " OK" + fi + done + fi +fi + +# Tests for 8-bit-specific features (needs UTF-8 support) + +if [ "$do15" = yes ] ; then + echo $title15 + if [ "$bits" = "16" -o "$bits" = "32" ] ; then + echo " Skipped when running 16/32-bit tests" + elif [ $utf -eq 0 ] ; then + echo " Skipped because UTF-$bits support is not available" + else + for opt in "" "-s" $jitopt; do + $sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $testdata/testinput15 testtry + if [ $? = 0 ] ; then + $cf $testdata/testoutput15 testtry + if [ $? != 0 ] ; then exit 1; fi + else exit 1 + fi + if [ "$opt" = "-s" ] ; then echo " OK with study" + elif [ "$opt" = "-s+" ] ; then echo " OK with JIT study" + else echo " OK" + fi + done + fi +fi + +# Tests for 8-bit-specific features (Unicode property support) + +if [ $do16 = yes ] ; then + echo $title16 + if [ "$bits" = "16" -o "$bits" = "32" ] ; then + echo " Skipped when running 16/32-bit tests" + elif [ $ucp -eq 0 ] ; then + echo " Skipped because Unicode property support is not available" + else + for opt in "" "-s" $jitopt; do + $sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $testdata/testinput16 testtry + if [ $? = 0 ] ; then + $cf $testdata/testoutput16 testtry + if [ $? != 0 ] ; then exit 1; fi + else exit 1 + fi + if [ "$opt" = "-s" ] ; then echo " OK with study" + elif [ "$opt" = "-s+" ] ; then echo " OK with JIT study" + else echo " OK" + fi + done + fi +fi + +# Tests for 16/32-bit-specific features + +if [ $do17 = yes ] ; then + echo $title17 + if [ "$bits" = "8" ] ; then + echo " Skipped when running 8-bit tests" + else + for opt in "" "-s" $jitopt; do + $sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $testdata/testinput17 testtry + if [ $? = 0 ] ; then + $cf $testdata/testoutput17 testtry + if [ $? != 0 ] ; then exit 1; fi + else exit 1 + fi + if [ "$opt" = "-s" ] ; then echo " OK with study" + elif [ "$opt" = "-s+" ] ; then echo " OK with JIT study" + else echo " OK" + fi + done + fi +fi + +# Tests for 16/32-bit-specific features (UTF-16/32 support) + +if [ $do18 = yes ] ; then + echo $title18 + if [ "$bits" = "8" ] ; then + echo " Skipped when running 8-bit tests" + elif [ $utf -eq 0 ] ; then + echo " Skipped because UTF-$bits support is not available" + else + for opt in "" "-s" $jitopt; do + $sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $testdata/testinput18 testtry + if [ $? = 0 ] ; then + $cf $testdata/testoutput18-$bits testtry + if [ $? != 0 ] ; then exit 1; fi + else exit 1 + fi + if [ "$opt" = "-s" ] ; then echo " OK with study" + elif [ "$opt" = "-s+" ] ; then echo " OK with JIT study" + else echo " OK" + fi + done + fi +fi + +# Tests for 16/32-bit-specific features (Unicode property support) + +if [ $do19 = yes ] ; then + echo $title19 + if [ "$bits" = "8" ] ; then + echo " Skipped when running 8-bit tests" + elif [ $ucp -eq 0 ] ; then + echo " Skipped because Unicode property support is not available" + else + for opt in "" "-s" $jitopt; do + $sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $testdata/testinput19 testtry + if [ $? = 0 ] ; then + $cf $testdata/testoutput19 testtry + if [ $? != 0 ] ; then exit 1; fi + else exit 1 + fi + if [ "$opt" = "-s" ] ; then echo " OK with study" + elif [ "$opt" = "-s+" ] ; then echo " OK with JIT study" + else echo " OK" + fi + done + fi +fi + +# Tests for 16/32-bit-specific features in DFA non-UTF-16/32 mode + +if [ $do20 = yes ] ; then + echo $title20 + if [ "$bits" = "8" ] ; then + echo " Skipped when running 8-bit tests" + else + for opt in "" "-s"; do + $sim $valgrind ./pcretest -q $bmode $opt -dfa $testdata/testinput20 testtry + if [ $? = 0 ] ; then + $cf $testdata/testoutput20 testtry + if [ $? != 0 ] ; then exit 1; fi + else exit 1 + fi + if [ "$opt" = "-s" ] ; then echo " OK with study" + else echo " OK" + fi + done + fi +fi + +# Tests for reloads with 16/32-bit library + +if [ $do21 = yes ] ; then + echo $title21 + if [ "$bits" = "8" ] ; then + echo " Skipped when running 8-bit tests" + elif [ $link_size -ne 2 ] ; then + echo " Skipped because link size is not 2" + else + cp -f $testdata/saved8 testsaved8 + cp -f $testdata/saved16LE-1 testsaved16LE-1 + cp -f $testdata/saved16BE-1 testsaved16BE-1 + cp -f $testdata/saved32LE-1 testsaved32LE-1 + cp -f $testdata/saved32BE-1 testsaved32BE-1 + $sim $valgrind ./pcretest -q $bmode $testdata/testinput21 testtry + if [ $? = 0 ] ; then + $cf $testdata/testoutput21-$bits testtry + if [ $? != 0 ] ; then exit 1; fi + else exit 1 + fi + echo " OK" + fi +fi + +# Tests for reloads with 16/32-bit library (UTF-16 support) + +if [ $do22 = yes ] ; then + echo $title22 + if [ "$bits" = "8" ] ; then + echo " Skipped when running 8-bit tests" + elif [ $utf -eq 0 ] ; then + echo " Skipped because UTF-$bits support is not available" + elif [ $link_size -ne 2 ] ; then + echo " Skipped because link size is not 2" + else + cp -f $testdata/saved16LE-2 testsaved16LE-2 + cp -f $testdata/saved16BE-2 testsaved16BE-2 + cp -f $testdata/saved32LE-2 testsaved32LE-2 + cp -f $testdata/saved32BE-2 testsaved32BE-2 + $sim $valgrind ./pcretest -q $bmode $testdata/testinput22 testtry + if [ $? = 0 ] ; then + $cf $testdata/testoutput22-$bits testtry + if [ $? != 0 ] ; then exit 1; fi + else exit 1 + fi + echo " OK" + fi +fi + +if [ $do23 = yes ] ; then + echo $title23 + if [ "$bits" = "8" -o "$bits" = "32" ] ; then + echo " Skipped when running 8/32-bit tests" + else + $sim $valgrind ./pcretest -q $bmode $testdata/testinput23 testtry + if [ $? = 0 ] ; then + $cf $testdata/testoutput23 testtry + if [ $? != 0 ] ; then exit 1; fi + else exit 1 + fi + echo " OK" + fi +fi + +if [ $do24 = yes ] ; then + echo $title24 + if [ "$bits" = "8" -o "$bits" = "32" ] ; then + echo " Skipped when running 8/32-bit tests" + elif [ $utf -eq 0 ] ; then + echo " Skipped because UTF-$bits support is not available" + else + $sim $valgrind ./pcretest -q $bmode $testdata/testinput24 testtry + if [ $? = 0 ] ; then + $cf $testdata/testoutput24 testtry + if [ $? != 0 ] ; then exit 1; fi + else exit 1 + fi + echo " OK" + fi +fi + +if [ $do25 = yes ] ; then + echo $title25 + if [ "$bits" = "8" -o "$bits" = "16" ] ; then + echo " Skipped when running 8/16-bit tests" + else + $sim $valgrind ./pcretest -q $bmode $testdata/testinput25 testtry + if [ $? = 0 ] ; then + $cf $testdata/testoutput25 testtry + if [ $? != 0 ] ; then exit 1; fi + else exit 1 + fi + echo " OK" + fi +fi + +if [ $do26 = yes ] ; then + echo $title26 + if [ "$bits" = "8" -o "$bits" = "16" ] ; then + echo " Skipped when running 8/16-bit tests" + elif [ $utf -eq 0 ] ; then + echo " Skipped because UTF-$bits support is not available" + else + $sim $valgrind ./pcretest -q $bmode $testdata/testinput26 testtry + if [ $? = 0 ] ; then + $cf $testdata/testoutput26 testtry + if [ $? != 0 ] ; then exit 1; fi + else exit 1 + fi + echo " OK" + fi +fi + +# End of loop for 8/16/32-bit tests +done + +# Clean up local working files +rm -f test3input test3output test3outputA testNinput testsaved* teststderr teststdout testtry + +# End diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/RunTest.bat b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/RunTest.bat new file mode 100755 index 000000000..8f290f591 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/RunTest.bat @@ -0,0 +1,616 @@ +@echo off +@rem This file must use CRLF linebreaks to function properly +@rem and requires both pcretest and pcregrep +@rem This file was originally contributed by Ralf Junker, and touched up by +@rem Daniel Richard G. Tests 10-12 added by Philip H. +@rem Philip H also changed test 3 to use "wintest" files. +@rem +@rem Updated by Tom Fortmann to support explicit test numbers on the command line. +@rem Added argument validation and added error reporting. +@rem +@rem MS Windows batch file to run pcretest on testfiles with the correct +@rem options. +@rem +@rem Sheri Pierce added logic to skip feature dependent tests +@rem tests 4 5 9 15 and 18 require utf support +@rem tests 6 7 10 16 and 19 require ucp support +@rem 11 requires ucp and link size 2 +@rem 12 requires presence of jit support +@rem 13 requires absence of jit support +@rem Sheri P also added override tests for study and jit testing +@rem Zoltan Herczeg added libpcre16 support +@rem Zoltan Herczeg added libpcre32 support + +setlocal enabledelayedexpansion +if [%srcdir%]==[] ( +if exist testdata\ set srcdir=.) +if [%srcdir%]==[] ( +if exist ..\testdata\ set srcdir=..) +if [%srcdir%]==[] ( +if exist ..\..\testdata\ set srcdir=..\..) +if NOT exist %srcdir%\testdata\ ( +Error: echo distribution testdata folder not found! +call :conferror +exit /b 1 +goto :eof +) + +if [%pcretest%]==[] set pcretest=.\pcretest.exe + +echo source dir is %srcdir% +echo pcretest=%pcretest% + +if NOT exist %pcretest% ( +echo Error: %pcretest% not found! +echo. +call :conferror +exit /b 1 +) + +%pcretest% -C linksize >NUL +set link_size=%ERRORLEVEL% +%pcretest% -C pcre8 >NUL +set support8=%ERRORLEVEL% +%pcretest% -C pcre16 >NUL +set support16=%ERRORLEVEL% +%pcretest% -C pcre32 >NUL +set support32=%ERRORLEVEL% +%pcretest% -C utf >NUL +set utf=%ERRORLEVEL% +%pcretest% -C ucp >NUL +set ucp=%ERRORLEVEL% +%pcretest% -C jit >NUL +set jit=%ERRORLEVEL% + +if %support8% EQU 1 ( +if not exist testout8 md testout8 +if not exist testoutstudy8 md testoutstudy8 +if not exist testoutjit8 md testoutjit8 +) + +if %support16% EQU 1 ( +if not exist testout16 md testout16 +if not exist testoutstudy16 md testoutstudy16 +if not exist testoutjit16 md testoutjit16 +) + +if %support16% EQU 1 ( +if not exist testout32 md testout32 +if not exist testoutstudy32 md testoutstudy32 +if not exist testoutjit32 md testoutjit32 +) + +set do1=no +set do2=no +set do3=no +set do4=no +set do5=no +set do6=no +set do7=no +set do8=no +set do9=no +set do10=no +set do11=no +set do12=no +set do13=no +set do14=no +set do15=no +set do16=no +set do17=no +set do18=no +set do19=no +set do20=no +set do21=no +set do22=no +set do23=no +set do24=no +set do25=no +set do26=no +set all=yes + +for %%a in (%*) do ( + set valid=no + for %%v in (1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26) do if %%v == %%a set valid=yes + if "!valid!" == "yes" ( + set do%%a=yes + set all=no +) else ( + echo Invalid test number - %%a! + echo Usage %0 [ test_number ] ... + echo Where test_number is one or more optional test numbers 1 through 26, default is all tests. + exit /b 1 +) +) +set failed="no" + +if "%all%" == "yes" ( + set do1=yes + set do2=yes + set do3=yes + set do4=yes + set do5=yes + set do6=yes + set do7=yes + set do8=yes + set do9=yes + set do10=yes + set do11=yes + set do12=yes + set do13=yes + set do14=yes + set do15=yes + set do16=yes + set do17=yes + set do18=yes + set do19=yes + set do20=yes + set do21=yes + set do22=yes + set do23=yes + set do24=yes + set do25=yes + set do26=yes +) + +@echo RunTest.bat's pcretest output is written to newly created subfolders named +@echo testout, testoutstudy and testoutjit. +@echo. + +set mode= +set bits=8 + +:nextMode +if "%mode%" == "" ( + if %support8% EQU 0 goto modeSkip + echo. + echo ---- Testing 8-bit library ---- + echo. +) +if "%mode%" == "-16" ( + if %support16% EQU 0 goto modeSkip + echo. + echo ---- Testing 16-bit library ---- + echo. +) +if "%mode%" == "-32" ( + if %support32% EQU 0 goto modeSkip + echo. + echo ---- Testing 32-bit library ---- + echo. +) +if "%do1%" == "yes" call :do1 +if "%do2%" == "yes" call :do2 +if "%do3%" == "yes" call :do3 +if "%do4%" == "yes" call :do4 +if "%do5%" == "yes" call :do5 +if "%do6%" == "yes" call :do6 +if "%do7%" == "yes" call :do7 +if "%do8%" == "yes" call :do8 +if "%do9%" == "yes" call :do9 +if "%do10%" == "yes" call :do10 +if "%do11%" == "yes" call :do11 +if "%do12%" == "yes" call :do12 +if "%do13%" == "yes" call :do13 +if "%do14%" == "yes" call :do14 +if "%do15%" == "yes" call :do15 +if "%do16%" == "yes" call :do16 +if "%do17%" == "yes" call :do17 +if "%do18%" == "yes" call :do18 +if "%do19%" == "yes" call :do19 +if "%do20%" == "yes" call :do20 +if "%do21%" == "yes" call :do21 +if "%do22%" == "yes" call :do22 +if "%do23%" == "yes" call :do23 +if "%do24%" == "yes" call :do24 +if "%do25%" == "yes" call :do25 +if "%do26%" == "yes" call :do26 +:modeSkip +if "%mode%" == "" ( + set mode=-16 + set bits=16 + goto nextMode +) +if "%mode%" == "-16" ( + set mode=-32 + set bits=32 + goto nextMode +) + +@rem If mode is -32, testing is finished +if %failed% == "yes" ( +echo In above output, one or more of the various tests failed! +exit /b 1 +) +echo All OK +goto :eof + +:runsub +@rem Function to execute pcretest and compare the output +@rem Arguments are as follows: +@rem +@rem 1 = test number +@rem 2 = outputdir +@rem 3 = test name use double quotes +@rem 4 - 9 = pcretest options + +if [%1] == [] ( + echo Missing test number argument! + exit /b 1 +) + +if [%2] == [] ( + echo Missing outputdir! + exit /b 1 +) + +if [%3] == [] ( + echo Missing test name argument! + exit /b 1 +) + +set testinput=testinput%1 +set testoutput=testoutput%1 +if exist %srcdir%\testdata\win%testinput% ( + set testinput=wintestinput%1 + set testoutput=wintestoutput%1 +) + +echo Test %1: %3 +%pcretest% %mode% %4 %5 %6 %7 %8 %9 %srcdir%\testdata\%testinput% >%2%bits%\%testoutput% +if errorlevel 1 ( + echo. failed executing command-line: + echo. %pcretest% %mode% %4 %5 %6 %7 %8 %9 %srcdir%\testdata\%testinput% ^>%2%bits%\%testoutput% + set failed="yes" + goto :eof +) + +set type= +if [%1]==[11] ( + set type=-%bits% +) +if [%1]==[18] ( + set type=-%bits% +) +if [%1]==[21] ( + set type=-%bits% +) +if [%1]==[22] ( + set type=-%bits% +) + +fc /n %srcdir%\testdata\%testoutput%%type% %2%bits%\%testoutput% >NUL + +if errorlevel 1 ( + echo. failed comparison: fc /n %srcdir%\testdata\%testoutput% %2%bits%\%testoutput% + if [%1]==[2] ( + echo. + echo ** Test 2 requires a lot of stack. PCRE can be configured to + echo ** use heap for recursion. Otherwise, to pass Test 2 + echo ** you generally need to allocate 8 mb stack to PCRE. + echo ** See the 'pcrestack' page for a discussion of PCRE's + echo ** stack usage. + echo. +) + if [%1]==[3] ( + echo. + echo ** Test 3 failure usually means french locale is not + echo ** available on the system, rather than a bug or problem with PCRE. + echo. + goto :eof +) + + set failed="yes" + goto :eof +) + +echo. Passed. +goto :eof + +:do1 +call :runsub 1 testout "Main functionality (Compatible with Perl >= 5.10)" -q +call :runsub 1 testoutstudy "Test with Study Override" -q -s +if %jit% EQU 1 call :runsub 1 testoutjit "Test with JIT Override" -q -s+ +goto :eof + +:do2 + call :runsub 2 testout "API, errors, internals, and non-Perl stuff" -q + call :runsub 2 testoutstudy "Test with Study Override" -q -s + if %jit% EQU 1 call :runsub 2 testoutjit "Test with JIT Override" -q -s+ +goto :eof + +:do3 + call :runsub 3 testout "Locale-specific features" -q + call :runsub 3 testoutstudy "Test with Study Override" -q -s + if %jit% EQU 1 call :runsub 3 testoutjit "Test with JIT Override" -q -s+ +goto :eof + +:do4 +if %utf% EQU 0 ( + echo Test 4 Skipped due to absence of UTF-%bits% support. + goto :eof +) + call :runsub 4 testout "UTF-%bits% support - (Compatible with Perl >= 5.10)" -q + call :runsub 4 testoutstudy "Test with Study Override" -q -s + if %jit% EQU 1 call :runsub 4 testoutjit "Test with JIT Override" -q -s+ +goto :eof + +:do5 +if %utf% EQU 0 ( + echo Test 5 Skipped due to absence of UTF-%bits% support. + goto :eof +) + call :runsub 5 testout "API, internals, and non-Perl stuff for UTF-%bits%" -q + call :runsub 5 testoutstudy "Test with Study Override" -q -s + if %jit% EQU 1 call :runsub 5 testoutjit "Test with JIT Override" -q -s+ +goto :eof + +:do6 +if %ucp% EQU 0 ( + echo Test 6 Skipped due to absence of Unicode property support. + goto :eof +) + call :runsub 6 testout "Unicode property support (Compatible with Perl >= 5.10)" -q + call :runsub 6 testoutstudy "Test with Study Override" -q -s + if %jit% EQU 1 call :runsub 6 testoutjit "Test with JIT Override" -q -s+ +goto :eof + +:do7 +if %ucp% EQU 0 ( + echo Test 7 Skipped due to absence of Unicode property support. + goto :eof +) + call :runsub 7 testout "API, internals, and non-Perl stuff for Unicode property support" -q + call :runsub 7 testoutstudy "Test with Study Override" -q -s + if %jit% EQU 1 call :runsub 7 testoutjit "Test with JIT Override" -q -s+ +goto :eof + +:do8 + call :runsub 8 testout "DFA matching main functionality" -q -dfa + call :runsub 8 testoutstudy "Test with Study Override" -q -dfa -s +goto :eof + +:do9 +if %utf% EQU 0 ( + echo Test 9 Skipped due to absence of UTF-%bits% support. + goto :eof +) + call :runsub 9 testout "DFA matching with UTF-%bits%" -q -dfa + call :runsub 9 testoutstudy "Test with Study Override" -q -dfa -s + goto :eof + +:do10 +if %ucp% EQU 0 ( + echo Test 10 Skipped due to absence of Unicode property support. + goto :eof +) + call :runsub 10 testout "DFA matching with Unicode properties" -q -dfa + call :runsub 10 testoutstudy "Test with Study Override" -q -dfa -s +goto :eof + +:do11 +if NOT %link_size% EQU 2 ( + echo Test 11 Skipped because link size is not 2. + goto :eof +) +if %ucp% EQU 0 ( + echo Test 11 Skipped due to absence of Unicode property support. + goto :eof +) + call :runsub 11 testout "Internal offsets and code size tests" -q + call :runsub 11 testoutstudy "Test with Study Override" -q -s +goto :eof + +:do12 +if %jit% EQU 0 ( + echo Test 12 Skipped due to absence of JIT support. + goto :eof +) + call :runsub 12 testout "JIT-specific features (JIT available)" -q +goto :eof + +:do13 +if %jit% EQU 1 ( + echo Test 13 Skipped due to presence of JIT support. + goto :eof +) + call :runsub 13 testout "JIT-specific features (JIT not available)" -q +goto :eof + +:do14 +if NOT %bits% EQU 8 ( + echo Test 14 Skipped when running 16/32-bit tests. + goto :eof +) + copy /Y %srcdir%\testdata\saved16 testsaved16 + copy /Y %srcdir%\testdata\saved32 testsaved32 + call :runsub 14 testout "Specials for the basic 8-bit library" -q + call :runsub 14 testoutstudy "Test with Study Override" -q -s + if %jit% EQU 1 call :runsub 14 testoutjit "Test with JIT Override" -q -s+ +goto :eof + +:do15 +if NOT %bits% EQU 8 ( + echo Test 15 Skipped when running 16/32-bit tests. + goto :eof +) +if %utf% EQU 0 ( + echo Test 15 Skipped due to absence of UTF-%bits% support. + goto :eof +) + call :runsub 15 testout "Specials for the 8-bit library with UTF-%bits% support" -q + call :runsub 15 testoutstudy "Test with Study Override" -q -s + if %jit% EQU 1 call :runsub 15 testoutjit "Test with JIT Override" -q -s+ +goto :eof + +:do16 +if NOT %bits% EQU 8 ( + echo Test 16 Skipped when running 16/32-bit tests. + goto :eof +) +if %ucp% EQU 0 ( + echo Test 16 Skipped due to absence of Unicode property support. + goto :eof +) + call :runsub 16 testout "Specials for the 8-bit library with Unicode propery support" -q + call :runsub 16 testoutstudy "Test with Study Override" -q -s + if %jit% EQU 1 call :runsub 16 testoutjit "Test with JIT Override" -q -s+ +goto :eof + +:do17 +if %bits% EQU 8 ( + echo Test 17 Skipped when running 8-bit tests. + goto :eof +) + call :runsub 17 testout "Specials for the basic 16/32-bit library" -q + call :runsub 17 testoutstudy "Test with Study Override" -q -s + if %jit% EQU 1 call :runsub 17 testoutjit "Test with JIT Override" -q -s+ +goto :eof + +:do18 +if %bits% EQU 8 ( + echo Test 18 Skipped when running 8-bit tests. + goto :eof +) +if %utf% EQU 0 ( + echo Test 18 Skipped due to absence of UTF-%bits% support. + goto :eof +) + call :runsub 18 testout "Specials for the 16/32-bit library with UTF-%bits% support" -q + call :runsub 18 testoutstudy "Test with Study Override" -q -s + if %jit% EQU 1 call :runsub 18 testoutjit "Test with JIT Override" -q -s+ +goto :eof + +:do19 +if %bits% EQU 8 ( + echo Test 19 Skipped when running 8-bit tests. + goto :eof +) +if %ucp% EQU 0 ( + echo Test 19 Skipped due to absence of Unicode property support. + goto :eof +) + call :runsub 19 testout "Specials for the 16/32-bit library with Unicode property support" -q + call :runsub 19 testoutstudy "Test with Study Override" -q -s + if %jit% EQU 1 call :runsub 19 testoutjit "Test with JIT Override" -q -s+ +goto :eof + +:do20 +if %bits% EQU 8 ( + echo Test 20 Skipped when running 8-bit tests. + goto :eof +) + call :runsub 20 testout "DFA specials for the basic 16/32-bit library" -q -dfa + call :runsub 20 testoutstudy "Test with Study Override" -q -dfa -s +goto :eof + +:do21 +if %bits% EQU 8 ( + echo Test 21 Skipped when running 8-bit tests. + goto :eof +) +if NOT %link_size% EQU 2 ( + echo Test 21 Skipped because link size is not 2. + goto :eof +) +copy /Y %srcdir%\testdata\saved8 testsaved8 +copy /Y %srcdir%\testdata\saved16LE-1 testsaved16LE-1 +copy /Y %srcdir%\testdata\saved16BE-1 testsaved16BE-1 +copy /Y %srcdir%\testdata\saved32LE-1 testsaved32LE-1 +copy /Y %srcdir%\testdata\saved32BE-1 testsaved32BE-1 +call :runsub 21 testout "Reloads for the basic 16/32-bit library" -q +call :runsub 21 testoutstudy "Test with Study Override" -q -s +if %jit% EQU 1 call :runsub 21 testoutjit "Test with JIT Override" -q -s+ +goto :eof + +:do22 +if %bits% EQU 8 ( + echo Test 22 Skipped when running 8-bit tests. + goto :eof +) +if %utf% EQU 0 ( + echo Test 22 Skipped due to absence of UTF-%bits% support. + goto :eof +) +if NOT %link_size% EQU 2 ( + echo Test 22 Skipped because link size is not 2. + goto :eof +) +copy /Y %srcdir%\testdata\saved16LE-2 testsaved16LE-2 +copy /Y %srcdir%\testdata\saved16BE-2 testsaved16BE-2 +copy /Y %srcdir%\testdata\saved32LE-2 testsaved32LE-2 +copy /Y %srcdir%\testdata\saved32BE-2 testsaved32BE-2 +call :runsub 22 testout "Reloads for the 16/32-bit library with UTF-16/32 support" -q +call :runsub 22 testoutstudy "Test with Study Override" -q -s +if %jit% EQU 1 call :runsub 22 testoutjit "Test with JIT Override" -q -s+ +goto :eof + +:do23 +if NOT %bits% EQU 16 ( + echo Test 23 Skipped when running 8/32-bit tests. + goto :eof +) +call :runsub 23 testout "Specials for the 16-bit library" -q +call :runsub 23 testoutstudy "Test with Study Override" -q -s +if %jit% EQU 1 call :runsub 23 testoutjit "Test with JIT Override" -q -s+ +goto :eof + +:do24 +if NOT %bits% EQU 16 ( + echo Test 24 Skipped when running 8/32-bit tests. + goto :eof +) +if %utf% EQU 0 ( + echo Test 24 Skipped due to absence of UTF-%bits% support. + goto :eof +) +call :runsub 24 testout "Specials for the 16-bit library with UTF-16 support" -q +call :runsub 24 testoutstudy "Test with Study Override" -q -s +if %jit% EQU 1 call :runsub 24 testoutjit "Test with JIT Override" -q -s+ +goto :eof + +:do25 +if NOT %bits% EQU 32 ( + echo Test 25 Skipped when running 8/16-bit tests. + goto :eof +) +call :runsub 25 testout "Specials for the 32-bit library" -q +call :runsub 25 testoutstudy "Test with Study Override" -q -s +if %jit% EQU 1 call :runsub 25 testoutjit "Test with JIT Override" -q -s+ +goto :eof + +:do26 +if NOT %bits% EQU 32 ( + echo Test 26 Skipped when running 8/16-bit tests. + goto :eof +) +if %utf% EQU 0 ( + echo Test 26 Skipped due to absence of UTF-%bits% support. + goto :eof +) +call :runsub 26 testout "Specials for the 32-bit library with UTF-32 support" -q +call :runsub 26 testoutstudy "Test with Study Override" -q -s +if %jit% EQU 1 call :runsub 26 testoutjit "Test with JIT Override" -q -s+ +goto :eof + +:conferror +@echo. +@echo Either your build is incomplete or you have a configuration error. +@echo. +@echo If configured with cmake and executed via "make test" or the MSVC "RUN_TESTS" +@echo project, pcre_test.bat defines variables and automatically calls RunTest.bat. +@echo For manual testing of all available features, after configuring with cmake +@echo and building, you can run the built pcre_test.bat. For best results with +@echo cmake builds and tests avoid directories with full path names that include +@echo spaces for source or build. +@echo. +@echo Otherwise, if the build dir is in a subdir of the source dir, testdata needed +@echo for input and verification should be found automatically when (from the +@echo location of the the built exes) you call RunTest.bat. By default RunTest.bat +@echo runs all tests compatible with the linked pcre library but it can be given +@echo a test number as an argument. +@echo. +@echo If the build dir is not under the source dir you can either copy your exes +@echo to the source folder or copy RunTest.bat and the testdata folder to the +@echo location of your built exes and then run RunTest.bat. +@echo. +goto :eof diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/aclocal.m4 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/aclocal.m4 new file mode 100755 index 000000000..85368ab87 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/aclocal.m4 @@ -0,0 +1,1546 @@ +# generated automatically by aclocal 1.16.1 -*- Autoconf -*- + +# Copyright (C) 1996-2018 Free Software Foundation, Inc. + +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, +[m4_warning([this file was generated for autoconf 2.69. +You have another version of autoconf. It may work, but is not guaranteed to. +If you have problems, you may need to regenerate the build system entirely. +To do so, use the procedure documented by the package, typically 'autoreconf'.])]) + +# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- +# serial 11 (pkg-config-0.29.1) + +dnl Copyright © 2004 Scott James Remnant . +dnl Copyright © 2012-2015 Dan Nicholson +dnl +dnl This program is free software; you can redistribute it and/or modify +dnl it under the terms of the GNU General Public License as published by +dnl the Free Software Foundation; either version 2 of the License, or +dnl (at your option) any later version. +dnl +dnl This program is distributed in the hope that it will be useful, but +dnl WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +dnl General Public License for more details. +dnl +dnl You should have received a copy of the GNU General Public License +dnl along with this program; if not, write to the Free Software +dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +dnl 02111-1307, USA. +dnl +dnl As a special exception to the GNU General Public License, if you +dnl distribute this file as part of a program that contains a +dnl configuration script generated by Autoconf, you may include it under +dnl the same distribution terms that you use for the rest of that +dnl program. + +dnl PKG_PREREQ(MIN-VERSION) +dnl ----------------------- +dnl Since: 0.29 +dnl +dnl Verify that the version of the pkg-config macros are at least +dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's +dnl installed version of pkg-config, this checks the developer's version +dnl of pkg.m4 when generating configure. +dnl +dnl To ensure that this macro is defined, also add: +dnl m4_ifndef([PKG_PREREQ], +dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])]) +dnl +dnl See the "Since" comment for each macro you use to see what version +dnl of the macros you require. +m4_defun([PKG_PREREQ], +[m4_define([PKG_MACROS_VERSION], [0.29.1]) +m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, + [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) +])dnl PKG_PREREQ + +dnl PKG_PROG_PKG_CONFIG([MIN-VERSION]) +dnl ---------------------------------- +dnl Since: 0.16 +dnl +dnl Search for the pkg-config tool and set the PKG_CONFIG variable to +dnl first found in the path. Checks that the version of pkg-config found +dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is +dnl used since that's the first version where most current features of +dnl pkg-config existed. +AC_DEFUN([PKG_PROG_PKG_CONFIG], +[m4_pattern_forbid([^_?PKG_[A-Z_]+$]) +m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) +m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) +AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) +AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) +AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) + +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=m4_default([$1], [0.9.0]) + AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + PKG_CONFIG="" + fi +fi[]dnl +])dnl PKG_PROG_PKG_CONFIG + +dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +dnl ------------------------------------------------------------------- +dnl Since: 0.18 +dnl +dnl Check to see whether a particular set of modules exists. Similar to +dnl PKG_CHECK_MODULES(), but does not set variables or print errors. +dnl +dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +dnl only at the first occurence in configure.ac, so if the first place +dnl it's called might be skipped (such as if it is within an "if", you +dnl have to call PKG_CHECK_EXISTS manually +AC_DEFUN([PKG_CHECK_EXISTS], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +if test -n "$PKG_CONFIG" && \ + AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then + m4_default([$2], [:]) +m4_ifvaln([$3], [else + $3])dnl +fi]) + +dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) +dnl --------------------------------------------- +dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting +dnl pkg_failed based on the result. +m4_define([_PKG_CONFIG], +[if test -n "$$1"; then + pkg_cv_[]$1="$$1" + elif test -n "$PKG_CONFIG"; then + PKG_CHECK_EXISTS([$3], + [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes ], + [pkg_failed=yes]) + else + pkg_failed=untried +fi[]dnl +])dnl _PKG_CONFIG + +dnl _PKG_SHORT_ERRORS_SUPPORTED +dnl --------------------------- +dnl Internal check to see if pkg-config supports short errors. +AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi[]dnl +])dnl _PKG_SHORT_ERRORS_SUPPORTED + + +dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +dnl [ACTION-IF-NOT-FOUND]) +dnl -------------------------------------------------------------- +dnl Since: 0.4.0 +dnl +dnl Note that if there is a possibility the first call to +dnl PKG_CHECK_MODULES might not happen, you should be sure to include an +dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac +AC_DEFUN([PKG_CHECK_MODULES], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl +AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl + +pkg_failed=no +AC_MSG_CHECKING([for $1]) + +_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) +_PKG_CONFIG([$1][_LIBS], [libs], [$2]) + +m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS +and $1[]_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details.]) + +if test $pkg_failed = yes; then + AC_MSG_RESULT([no]) + _PKG_SHORT_ERRORS_SUPPORTED + if test $_pkg_short_errors_supported = yes; then + $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` + else + $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD + + m4_default([$4], [AC_MSG_ERROR( +[Package requirements ($2) were not met: + +$$1_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +_PKG_TEXT])[]dnl + ]) +elif test $pkg_failed = untried; then + AC_MSG_RESULT([no]) + m4_default([$4], [AC_MSG_FAILURE( +[The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +_PKG_TEXT + +To get pkg-config, see .])[]dnl + ]) +else + $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS + $1[]_LIBS=$pkg_cv_[]$1[]_LIBS + AC_MSG_RESULT([yes]) + $3 +fi[]dnl +])dnl PKG_CHECK_MODULES + + +dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +dnl [ACTION-IF-NOT-FOUND]) +dnl --------------------------------------------------------------------- +dnl Since: 0.29 +dnl +dnl Checks for existence of MODULES and gathers its build flags with +dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags +dnl and VARIABLE-PREFIX_LIBS from --libs. +dnl +dnl Note that if there is a possibility the first call to +dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to +dnl include an explicit call to PKG_PROG_PKG_CONFIG in your +dnl configure.ac. +AC_DEFUN([PKG_CHECK_MODULES_STATIC], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +_save_PKG_CONFIG=$PKG_CONFIG +PKG_CONFIG="$PKG_CONFIG --static" +PKG_CHECK_MODULES($@) +PKG_CONFIG=$_save_PKG_CONFIG[]dnl +])dnl PKG_CHECK_MODULES_STATIC + + +dnl PKG_INSTALLDIR([DIRECTORY]) +dnl ------------------------- +dnl Since: 0.27 +dnl +dnl Substitutes the variable pkgconfigdir as the location where a module +dnl should install pkg-config .pc files. By default the directory is +dnl $libdir/pkgconfig, but the default can be changed by passing +dnl DIRECTORY. The user can override through the --with-pkgconfigdir +dnl parameter. +AC_DEFUN([PKG_INSTALLDIR], +[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) +m4_pushdef([pkg_description], + [pkg-config installation directory @<:@]pkg_default[@:>@]) +AC_ARG_WITH([pkgconfigdir], + [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, + [with_pkgconfigdir=]pkg_default) +AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) +m4_popdef([pkg_default]) +m4_popdef([pkg_description]) +])dnl PKG_INSTALLDIR + + +dnl PKG_NOARCH_INSTALLDIR([DIRECTORY]) +dnl -------------------------------- +dnl Since: 0.27 +dnl +dnl Substitutes the variable noarch_pkgconfigdir as the location where a +dnl module should install arch-independent pkg-config .pc files. By +dnl default the directory is $datadir/pkgconfig, but the default can be +dnl changed by passing DIRECTORY. The user can override through the +dnl --with-noarch-pkgconfigdir parameter. +AC_DEFUN([PKG_NOARCH_INSTALLDIR], +[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) +m4_pushdef([pkg_description], + [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) +AC_ARG_WITH([noarch-pkgconfigdir], + [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, + [with_noarch_pkgconfigdir=]pkg_default) +AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) +m4_popdef([pkg_default]) +m4_popdef([pkg_description]) +])dnl PKG_NOARCH_INSTALLDIR + + +dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, +dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +dnl ------------------------------------------- +dnl Since: 0.28 +dnl +dnl Retrieves the value of the pkg-config variable for the given module. +AC_DEFUN([PKG_CHECK_VAR], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl + +_PKG_CONFIG([$1], [variable="][$3]["], [$2]) +AS_VAR_COPY([$1], [pkg_cv_][$1]) + +AS_VAR_IF([$1], [""], [$5], [$4])dnl +])dnl PKG_CHECK_VAR + +dnl PKG_WITH_MODULES(VARIABLE-PREFIX, MODULES, +dnl [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND], +dnl [DESCRIPTION], [DEFAULT]) +dnl ------------------------------------------ +dnl +dnl Prepare a "--with-" configure option using the lowercase +dnl [VARIABLE-PREFIX] name, merging the behaviour of AC_ARG_WITH and +dnl PKG_CHECK_MODULES in a single macro. +AC_DEFUN([PKG_WITH_MODULES], +[ +m4_pushdef([with_arg], m4_tolower([$1])) + +m4_pushdef([description], + [m4_default([$5], [build with ]with_arg[ support])]) + +m4_pushdef([def_arg], [m4_default([$6], [auto])]) +m4_pushdef([def_action_if_found], [AS_TR_SH([with_]with_arg)=yes]) +m4_pushdef([def_action_if_not_found], [AS_TR_SH([with_]with_arg)=no]) + +m4_case(def_arg, + [yes],[m4_pushdef([with_without], [--without-]with_arg)], + [m4_pushdef([with_without],[--with-]with_arg)]) + +AC_ARG_WITH(with_arg, + AS_HELP_STRING(with_without, description[ @<:@default=]def_arg[@:>@]),, + [AS_TR_SH([with_]with_arg)=def_arg]) + +AS_CASE([$AS_TR_SH([with_]with_arg)], + [yes],[PKG_CHECK_MODULES([$1],[$2],$3,$4)], + [auto],[PKG_CHECK_MODULES([$1],[$2], + [m4_n([def_action_if_found]) $3], + [m4_n([def_action_if_not_found]) $4])]) + +m4_popdef([with_arg]) +m4_popdef([description]) +m4_popdef([def_arg]) + +])dnl PKG_WITH_MODULES + +dnl PKG_HAVE_WITH_MODULES(VARIABLE-PREFIX, MODULES, +dnl [DESCRIPTION], [DEFAULT]) +dnl ----------------------------------------------- +dnl +dnl Convenience macro to trigger AM_CONDITIONAL after PKG_WITH_MODULES +dnl check._[VARIABLE-PREFIX] is exported as make variable. +AC_DEFUN([PKG_HAVE_WITH_MODULES], +[ +PKG_WITH_MODULES([$1],[$2],,,[$3],[$4]) + +AM_CONDITIONAL([HAVE_][$1], + [test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"]) +])dnl PKG_HAVE_WITH_MODULES + +dnl PKG_HAVE_DEFINE_WITH_MODULES(VARIABLE-PREFIX, MODULES, +dnl [DESCRIPTION], [DEFAULT]) +dnl ------------------------------------------------------ +dnl +dnl Convenience macro to run AM_CONDITIONAL and AC_DEFINE after +dnl PKG_WITH_MODULES check. HAVE_[VARIABLE-PREFIX] is exported as make +dnl and preprocessor variable. +AC_DEFUN([PKG_HAVE_DEFINE_WITH_MODULES], +[ +PKG_HAVE_WITH_MODULES([$1],[$2],[$3],[$4]) + +AS_IF([test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"], + [AC_DEFINE([HAVE_][$1], 1, [Enable ]m4_tolower([$1])[ support])]) +])dnl PKG_HAVE_DEFINE_WITH_MODULES + +# Copyright (C) 2002-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +# (This private macro should not be called outside this file.) +AC_DEFUN([AM_AUTOMAKE_VERSION], +[am__api_version='1.16' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.16.1], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) + +# _AM_AUTOCONF_VERSION(VERSION) +# ----------------------------- +# aclocal traces this macro to find the Autoconf version. +# This is a private macro too. Using m4_define simplifies +# the logic in aclocal, which can simply ignore this definition. +m4_define([_AM_AUTOCONF_VERSION], []) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. +# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], +[AM_AUTOMAKE_VERSION([1.16.1])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) + +# Copyright (C) 2011-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_AR([ACT-IF-FAIL]) +# ------------------------- +# Try to determine the archiver interface, and trigger the ar-lib wrapper +# if it is needed. If the detection of archiver interface fails, run +# ACT-IF-FAIL (default is to abort configure with a proper error message). +AC_DEFUN([AM_PROG_AR], +[AC_BEFORE([$0], [LT_INIT])dnl +AC_BEFORE([$0], [AC_PROG_LIBTOOL])dnl +AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([ar-lib])dnl +AC_CHECK_TOOLS([AR], [ar lib "link -lib"], [false]) +: ${AR=ar} + +AC_CACHE_CHECK([the archiver ($AR) interface], [am_cv_ar_interface], + [AC_LANG_PUSH([C]) + am_cv_ar_interface=ar + AC_COMPILE_IFELSE([AC_LANG_SOURCE([[int some_variable = 0;]])], + [am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&AS_MESSAGE_LOG_FD' + AC_TRY_EVAL([am_ar_try]) + if test "$ac_status" -eq 0; then + am_cv_ar_interface=ar + else + am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&AS_MESSAGE_LOG_FD' + AC_TRY_EVAL([am_ar_try]) + if test "$ac_status" -eq 0; then + am_cv_ar_interface=lib + else + am_cv_ar_interface=unknown + fi + fi + rm -f conftest.lib libconftest.a + ]) + AC_LANG_POP([C])]) + +case $am_cv_ar_interface in +ar) + ;; +lib) + # Microsoft lib, so override with the ar-lib wrapper script. + # FIXME: It is wrong to rewrite AR. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__AR in this case, + # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something + # similar. + AR="$am_aux_dir/ar-lib $AR" + ;; +unknown) + m4_default([$1], + [AC_MSG_ERROR([could not determine $AR interface])]) + ;; +esac +AC_SUBST([AR])dnl +]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# Copyright (C) 2001-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to +# '$srcdir', '$srcdir/..', or '$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is '.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ([2.52])dnl + m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl +m4_define([_AM_COND_VALUE_$1], [$2])dnl +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) + +# Copyright (C) 1999-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + + +# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], + [$1], [CXX], [depcc="$CXX" am_compiler_list=], + [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], + [$1], [UPC], [depcc="$UPC" am_compiler_list=], + [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + am__universal=false + m4_case([$1], [CC], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac], + [CXX], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac]) + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES. +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE([dependency-tracking], [dnl +AS_HELP_STRING( + [--enable-dependency-tracking], + [do not reject slow dependency extractors]) +AS_HELP_STRING( + [--disable-dependency-tracking], + [speeds up one-time build])]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +AC_SUBST([am__nodep])dnl +_AM_SUBST_NOTMAKE([am__nodep])dnl +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[{ + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + # TODO: see whether this extra hack can be removed once we start + # requiring Autoconf 2.70 or later. + AS_CASE([$CONFIG_FILES], + [*\'*], [eval set x "$CONFIG_FILES"], + [*], [set x $CONFIG_FILES]) + shift + # Used to flag and report bootstrapping failures. + am_rc=0 + for am_mf + do + # Strip MF so we end up with the name of the file. + am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile which includes + # dependency-tracking related rules and includes. + # Grep'ing the whole file directly is not great: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ + || continue + am_dirpart=`AS_DIRNAME(["$am_mf"])` + am_filepart=`AS_BASENAME(["$am_mf"])` + AM_RUN_LOG([cd "$am_dirpart" \ + && sed -e '/# am--include-marker/d' "$am_filepart" \ + | $MAKE -f - am--depfiles]) || am_rc=$? + done + if test $am_rc -ne 0; then + AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments + for automatic dependency tracking. Try re-running configure with the + '--disable-dependency-tracking' option to at least be able to build + the package (albeit without support for automatic dependency tracking).]) + fi + AS_UNSET([am_dirpart]) + AS_UNSET([am_filepart]) + AS_UNSET([am_mf]) + AS_UNSET([am_rc]) + rm -f conftest-deps.mk +} +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking is enabled. +# This creates each '.Po' and '.Plo' makefile fragment that we'll need in +# order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"])]) + +# Do all the work for Automake. -*- Autoconf -*- + +# Copyright (C) 1996-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This macro actually does too much. Some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. +m4_define([AC_PROG_CC], +m4_defn([AC_PROG_CC]) +[_AM_PROG_CC_C_O +]) + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.65])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[AC_DIAGNOSE([obsolete], + [$0: two- and three-arguments forms are deprecated.]) +m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if( + m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), + [ok:ok],, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) + AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) +AM_MISSING_PROG([AUTOCONF], [autoconf]) +AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) +AM_MISSING_PROG([AUTOHEADER], [autoheader]) +AM_MISSING_PROG([MAKEINFO], [makeinfo]) +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +AC_SUBST([mkdir_p], ['$(MKDIR_P)']) +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES([CC])], + [m4_define([AC_PROG_CC], + m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES([CXX])], + [m4_define([AC_PROG_CXX], + m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES([OBJC])], + [m4_define([AC_PROG_OBJC], + m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], + [_AM_DEPENDENCIES([OBJCXX])], + [m4_define([AC_PROG_OBJCXX], + m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl +]) +AC_REQUIRE([AM_SILENT_RULES])dnl +dnl The testsuite driver may need to know about EXEEXT, so add the +dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This +dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_CONFIG_COMMANDS_PRE(dnl +[m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) + fi +fi +dnl The trailing newline in this macro's definition is deliberate, for +dnl backward compatibility and to allow trailing 'dnl'-style comments +dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. +]) + +dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further +dnl mangled by Autoconf and run in a shell conditional statement. +m4_define([_AC_COMPILER_EXEEXT], +m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_arg=$1 +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) + +# Copyright (C) 2001-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +if test x"${install_sh+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi +AC_SUBST([install_sh])]) + +# Copyright (C) 2003-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MAKE_INCLUDE() +# ----------------- +# Check whether make has an 'include' directive that can support all +# the idioms we need for our automatic dependency tracking code. +AC_DEFUN([AM_MAKE_INCLUDE], +[AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive]) +cat > confinc.mk << 'END' +am__doit: + @echo this is the am__doit target >confinc.out +.PHONY: am__doit +END +am__include="#" +am__quote= +# BSD make does it like this. +echo '.include "confinc.mk" # ignored' > confmf.BSD +# Other make implementations (GNU, Solaris 10, AIX) do it like this. +echo 'include confinc.mk # ignored' > confmf.GNU +_am_result=no +for s in GNU BSD; do + AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out]) + AS_CASE([$?:`cat confinc.out 2>/dev/null`], + ['0:this is the am__doit target'], + [AS_CASE([$s], + [BSD], [am__include='.include' am__quote='"'], + [am__include='include' am__quote=''])]) + if test "$am__include" != "#"; then + _am_result="yes ($s style)" + break + fi +done +rm -f confinc.* confmf.* +AC_MSG_RESULT([${_am_result}]) +AC_SUBST([am__include])]) +AC_SUBST([am__quote])]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it is modern enough. +# If it is, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + AC_MSG_WARN(['missing' script is too old or missing]) +fi +]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# -------------------- +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), [1])]) + +# _AM_SET_OPTIONS(OPTIONS) +# ------------------------ +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# Copyright (C) 1999-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_CC_C_O +# --------------- +# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC +# to automatically call this. +AC_DEFUN([_AM_PROG_CC_C_O], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([compile])dnl +AC_LANG_PUSH([C])dnl +AC_CACHE_CHECK( + [whether $CC understands -c and -o together], + [am_cv_prog_cc_c_o], + [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i]) +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +AC_LANG_POP([C])]) + +# For backward compatibility. +AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) + +# Copyright (C) 2001-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_RUN_LOG(COMMAND) +# ------------------- +# Run COMMAND, save the exit status in ac_status, and log it. +# (This has been adapted from Autoconf's _AC_RUN_LOG macro.) +AC_DEFUN([AM_RUN_LOG], +[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD + ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + (exit $ac_status); }]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[[\\\"\#\$\&\'\`$am_lf]]*) + AC_MSG_ERROR([unsafe absolute working directory name]);; +esac +case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) + AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken + alias in your environment]) + fi + if test "$[2]" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT([yes]) +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi +AC_CONFIG_COMMANDS_PRE( + [AC_MSG_CHECKING([that generated files are newer than configure]) + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + AC_MSG_RESULT([done])]) +rm -f conftest.file +]) + +# Copyright (C) 2009-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SILENT_RULES([DEFAULT]) +# -------------------------- +# Enable less verbose build rules; with the default set to DEFAULT +# ("yes" being less verbose, "no" or empty being verbose). +AC_DEFUN([AM_SILENT_RULES], +[AC_ARG_ENABLE([silent-rules], [dnl +AS_HELP_STRING( + [--enable-silent-rules], + [less verbose build output (undo: "make V=1")]) +AS_HELP_STRING( + [--disable-silent-rules], + [verbose build output (undo: "make V=0")])dnl +]) +case $enable_silent_rules in @%:@ ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; +esac +dnl +dnl A few 'make' implementations (e.g., NonStop OS and NextStep) +dnl do not support nested variable expansions. +dnl See automake bug#9928 and bug#10237. +am_make=${MAKE-make} +AC_CACHE_CHECK([whether $am_make supports nested variables], + [am_cv_make_support_nested_variables], + [if AS_ECHO([['TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi]) +if test $am_cv_make_support_nested_variables = yes; then + dnl Using '$V' instead of '$(V)' breaks IRIX make. + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AC_SUBST([AM_V])dnl +AM_SUBST_NOTMAKE([AM_V])dnl +AC_SUBST([AM_DEFAULT_V])dnl +AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl +AC_SUBST([AM_DEFAULT_VERBOSITY])dnl +AM_BACKSLASH='\' +AC_SUBST([AM_BACKSLASH])dnl +_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl +]) + +# Copyright (C) 2001-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_STRIP +# --------------------- +# One issue with vendor 'install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in "make install-strip", and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# Copyright (C) 2006-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. +# This macro is traced by Automake. +AC_DEFUN([_AM_SUBST_NOTMAKE]) + +# AM_SUBST_NOTMAKE(VARIABLE) +# -------------------------- +# Public sister of _AM_SUBST_NOTMAKE. +AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) + +# Check how to create a tarball. -*- Autoconf -*- + +# Copyright (C) 2004-2018 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_TAR(FORMAT) +# -------------------- +# Check how to create a tarball in format FORMAT. +# FORMAT should be one of 'v7', 'ustar', or 'pax'. +# +# Substitute a variable $(am__tar) that is a command +# writing to stdout a FORMAT-tarball containing the directory +# $tardir. +# tardir=directory && $(am__tar) > result.tar +# +# Substitute a variable $(am__untar) that extract such +# a tarball read from stdin. +# $(am__untar) < result.tar +# +AC_DEFUN([_AM_PROG_TAR], +[# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AC_SUBST([AMTAR], ['$${TAR-tar}']) + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' + +m4_if([$1], [v7], + [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], + + [m4_case([$1], + [ustar], + [# The POSIX 1988 'ustar' format is defined with fixed-size fields. + # There is notably a 21 bits limit for the UID and the GID. In fact, + # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 + # and bug#13588). + am_max_uid=2097151 # 2^21 - 1 + am_max_gid=$am_max_uid + # The $UID and $GID variables are not portable, so we need to resort + # to the POSIX-mandated id(1) utility. Errors in the 'id' calls + # below are definitely unexpected, so allow the users to see them + # (that is, avoid stderr redirection). + am_uid=`id -u || echo unknown` + am_gid=`id -g || echo unknown` + AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) + if test $am_uid -le $am_max_uid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi + AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) + if test $am_gid -le $am_max_gid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi], + + [pax], + [], + + [m4_fatal([Unknown tar format])]) + + AC_MSG_CHECKING([how to create a $1 tar archive]) + + # Go ahead even if we have the value already cached. We do so because we + # need to set the values for the 'am__tar' and 'am__untar' variables. + _am_tools=${am_cv_prog_tar_$1-$_am_tools} + + for _am_tool in $_am_tools; do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works. + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi + done + rm -rf conftest.dir + + AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) + AC_MSG_RESULT([$am_cv_prog_tar_$1])]) + +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) # _AM_PROG_TAR + +m4_include([m4/ax_pthread.m4]) +m4_include([m4/libtool.m4]) +m4_include([m4/ltoptions.m4]) +m4_include([m4/ltsugar.m4]) +m4_include([m4/ltversion.m4]) +m4_include([m4/lt~obsolete.m4]) +m4_include([m4/pcre_visibility.m4]) diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/ar-lib b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/ar-lib new file mode 100755 index 000000000..0baa4f607 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/ar-lib @@ -0,0 +1,270 @@ +#! /bin/sh +# Wrapper for Microsoft lib.exe + +me=ar-lib +scriptversion=2012-03-01.08; # UTC + +# Copyright (C) 2010-2018 Free Software Foundation, Inc. +# Written by Peter Rosin . +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + + +# func_error message +func_error () +{ + echo "$me: $1" 1>&2 + exit 1 +} + +file_conv= + +# func_file_conv build_file +# Convert a $build file to $host form and store it in $file +# Currently only supports Windows hosts. +func_file_conv () +{ + file=$1 + case $file in + / | /[!/]*) # absolute file, and not a UNC file + if test -z "$file_conv"; then + # lazily determine how to convert abs files + case `uname -s` in + MINGW*) + file_conv=mingw + ;; + CYGWIN*) + file_conv=cygwin + ;; + *) + file_conv=wine + ;; + esac + fi + case $file_conv in + mingw) + file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` + ;; + cygwin) + file=`cygpath -m "$file" || echo "$file"` + ;; + wine) + file=`winepath -w "$file" || echo "$file"` + ;; + esac + ;; + esac +} + +# func_at_file at_file operation archive +# Iterate over all members in AT_FILE performing OPERATION on ARCHIVE +# for each of them. +# When interpreting the content of the @FILE, do NOT use func_file_conv, +# since the user would need to supply preconverted file names to +# binutils ar, at least for MinGW. +func_at_file () +{ + operation=$2 + archive=$3 + at_file_contents=`cat "$1"` + eval set x "$at_file_contents" + shift + + for member + do + $AR -NOLOGO $operation:"$member" "$archive" || exit $? + done +} + +case $1 in + '') + func_error "no command. Try '$0 --help' for more information." + ;; + -h | --h*) + cat <_FOUND variable. +# The package is found if all variables listed are TRUE. +# Example: +# +# FIND_PACKAGE_HANDLE_STANDARD_ARGS(LibXml2 DEFAULT_MSG LIBXML2_LIBRARIES LIBXML2_INCLUDE_DIR) +# +# LibXml2 is considered to be found, if both LIBXML2_LIBRARIES and +# LIBXML2_INCLUDE_DIR are valid. Then also LIBXML2_FOUND is set to TRUE. +# If it is not found and REQUIRED was used, it fails with FATAL_ERROR, +# independent whether QUIET was used or not. +# If it is found, the location is reported using the VAR1 argument, so +# here a message "Found LibXml2: /usr/lib/libxml2.so" will be printed out. +# If the second argument is DEFAULT_MSG, the message in the failure case will +# be "Could NOT find LibXml2", if you don't like this message you can specify +# your own custom failure message there. + +MACRO(FIND_PACKAGE_HANDLE_STANDARD_ARGS _NAME _FAIL_MSG _VAR1 ) + + IF("${_FAIL_MSG}" STREQUAL "DEFAULT_MSG") + IF (${_NAME}_FIND_REQUIRED) + SET(_FAIL_MESSAGE "Could not find REQUIRED package ${_NAME}") + ELSE (${_NAME}_FIND_REQUIRED) + SET(_FAIL_MESSAGE "Could not find OPTIONAL package ${_NAME}") + ENDIF (${_NAME}_FIND_REQUIRED) + ELSE("${_FAIL_MSG}" STREQUAL "DEFAULT_MSG") + SET(_FAIL_MESSAGE "${_FAIL_MSG}") + ENDIF("${_FAIL_MSG}" STREQUAL "DEFAULT_MSG") + + STRING(TOUPPER ${_NAME} _NAME_UPPER) + + SET(${_NAME_UPPER}_FOUND TRUE) + IF(NOT ${_VAR1}) + SET(${_NAME_UPPER}_FOUND FALSE) + ENDIF(NOT ${_VAR1}) + + FOREACH(_CURRENT_VAR ${ARGN}) + IF(NOT ${_CURRENT_VAR}) + SET(${_NAME_UPPER}_FOUND FALSE) + ENDIF(NOT ${_CURRENT_VAR}) + ENDFOREACH(_CURRENT_VAR) + + IF (${_NAME_UPPER}_FOUND) + IF (NOT ${_NAME}_FIND_QUIETLY) + MESSAGE(STATUS "Found ${_NAME}: ${${_VAR1}}") + ENDIF (NOT ${_NAME}_FIND_QUIETLY) + ELSE (${_NAME_UPPER}_FOUND) + IF (${_NAME}_FIND_REQUIRED) + MESSAGE(FATAL_ERROR "${_FAIL_MESSAGE}") + ELSE (${_NAME}_FIND_REQUIRED) + IF (NOT ${_NAME}_FIND_QUIETLY) + MESSAGE(STATUS "${_FAIL_MESSAGE}") + ENDIF (NOT ${_NAME}_FIND_QUIETLY) + ENDIF (${_NAME}_FIND_REQUIRED) + ENDIF (${_NAME_UPPER}_FOUND) +ENDMACRO(FIND_PACKAGE_HANDLE_STANDARD_ARGS) diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/cmake/FindReadline.cmake b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/cmake/FindReadline.cmake new file mode 100755 index 000000000..1d4cc5584 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/cmake/FindReadline.cmake @@ -0,0 +1,29 @@ +# from http://websvn.kde.org/trunk/KDE/kdeedu/cmake/modules/FindReadline.cmake +# http://websvn.kde.org/trunk/KDE/kdeedu/cmake/modules/COPYING-CMAKE-SCRIPTS +# --> BSD licensed +# +# GNU Readline library finder +if(READLINE_INCLUDE_DIR AND READLINE_LIBRARY AND NCURSES_LIBRARY) + set(READLINE_FOUND TRUE) +else(READLINE_INCLUDE_DIR AND READLINE_LIBRARY AND NCURSES_LIBRARY) + FIND_PATH(READLINE_INCLUDE_DIR readline/readline.h + /usr/include/readline + ) + +# 2008-04-22 The next clause used to read like this: +# +# FIND_LIBRARY(READLINE_LIBRARY NAMES readline) +# FIND_LIBRARY(NCURSES_LIBRARY NAMES ncurses ) +# include(FindPackageHandleStandardArgs) +# FIND_PACKAGE_HANDLE_STANDARD_ARGS(Readline DEFAULT_MSG NCURSES_LIBRARY READLINE_INCLUDE_DIR READLINE_LIBRARY ) +# +# I was advised to modify it such that it will find an ncurses library if +# required, but not if one was explicitly given, that is, it allows the +# default to be overridden. PH + + FIND_LIBRARY(READLINE_LIBRARY NAMES readline) + include(FindPackageHandleStandardArgs) + FIND_PACKAGE_HANDLE_STANDARD_ARGS(Readline DEFAULT_MSG READLINE_INCLUDE_DIR READLINE_LIBRARY ) + + MARK_AS_ADVANCED(READLINE_INCLUDE_DIR READLINE_LIBRARY) +endif(READLINE_INCLUDE_DIR AND READLINE_LIBRARY AND NCURSES_LIBRARY) diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/compile b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/compile new file mode 100755 index 000000000..99e50524b --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/compile @@ -0,0 +1,348 @@ +#! /bin/sh +# Wrapper for compilers which do not understand '-c -o'. + +scriptversion=2018-03-07.03; # UTC + +# Copyright (C) 1999-2018 Free Software Foundation, Inc. +# Written by Tom Tromey . +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +nl=' +' + +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent tools from complaining about whitespace usage. +IFS=" "" $nl" + +file_conv= + +# func_file_conv build_file lazy +# Convert a $build file to $host form and store it in $file +# Currently only supports Windows hosts. If the determined conversion +# type is listed in (the comma separated) LAZY, no conversion will +# take place. +func_file_conv () +{ + file=$1 + case $file in + / | /[!/]*) # absolute file, and not a UNC file + if test -z "$file_conv"; then + # lazily determine how to convert abs files + case `uname -s` in + MINGW*) + file_conv=mingw + ;; + CYGWIN*) + file_conv=cygwin + ;; + *) + file_conv=wine + ;; + esac + fi + case $file_conv/,$2, in + *,$file_conv,*) + ;; + mingw/*) + file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` + ;; + cygwin/*) + file=`cygpath -m "$file" || echo "$file"` + ;; + wine/*) + file=`winepath -w "$file" || echo "$file"` + ;; + esac + ;; + esac +} + +# func_cl_dashL linkdir +# Make cl look for libraries in LINKDIR +func_cl_dashL () +{ + func_file_conv "$1" + if test -z "$lib_path"; then + lib_path=$file + else + lib_path="$lib_path;$file" + fi + linker_opts="$linker_opts -LIBPATH:$file" +} + +# func_cl_dashl library +# Do a library search-path lookup for cl +func_cl_dashl () +{ + lib=$1 + found=no + save_IFS=$IFS + IFS=';' + for dir in $lib_path $LIB + do + IFS=$save_IFS + if $shared && test -f "$dir/$lib.dll.lib"; then + found=yes + lib=$dir/$lib.dll.lib + break + fi + if test -f "$dir/$lib.lib"; then + found=yes + lib=$dir/$lib.lib + break + fi + if test -f "$dir/lib$lib.a"; then + found=yes + lib=$dir/lib$lib.a + break + fi + done + IFS=$save_IFS + + if test "$found" != yes; then + lib=$lib.lib + fi +} + +# func_cl_wrapper cl arg... +# Adjust compile command to suit cl +func_cl_wrapper () +{ + # Assume a capable shell + lib_path= + shared=: + linker_opts= + for arg + do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + eat=1 + case $2 in + *.o | *.[oO][bB][jJ]) + func_file_conv "$2" + set x "$@" -Fo"$file" + shift + ;; + *) + func_file_conv "$2" + set x "$@" -Fe"$file" + shift + ;; + esac + ;; + -I) + eat=1 + func_file_conv "$2" mingw + set x "$@" -I"$file" + shift + ;; + -I*) + func_file_conv "${1#-I}" mingw + set x "$@" -I"$file" + shift + ;; + -l) + eat=1 + func_cl_dashl "$2" + set x "$@" "$lib" + shift + ;; + -l*) + func_cl_dashl "${1#-l}" + set x "$@" "$lib" + shift + ;; + -L) + eat=1 + func_cl_dashL "$2" + ;; + -L*) + func_cl_dashL "${1#-L}" + ;; + -static) + shared=false + ;; + -Wl,*) + arg=${1#-Wl,} + save_ifs="$IFS"; IFS=',' + for flag in $arg; do + IFS="$save_ifs" + linker_opts="$linker_opts $flag" + done + IFS="$save_ifs" + ;; + -Xlinker) + eat=1 + linker_opts="$linker_opts $2" + ;; + -*) + set x "$@" "$1" + shift + ;; + *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) + func_file_conv "$1" + set x "$@" -Tp"$file" + shift + ;; + *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) + func_file_conv "$1" mingw + set x "$@" "$file" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift + done + if test -n "$linker_opts"; then + linker_opts="-link$linker_opts" + fi + exec "$@" $linker_opts + exit 1 +} + +eat= + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: compile [--help] [--version] PROGRAM [ARGS] + +Wrapper for compilers which do not understand '-c -o'. +Remove '-o dest.o' from ARGS, run PROGRAM with the remaining +arguments, and rename the output as expected. + +If you are trying to build a whole package this is not the +right script to run: please start by reading the file 'INSTALL'. + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "compile $scriptversion" + exit $? + ;; + cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ + icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) + func_cl_wrapper "$@" # Doesn't return... + ;; +esac + +ofile= +cfile= + +for arg +do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + # So we strip '-o arg' only if arg is an object. + eat=1 + case $2 in + *.o | *.obj) + ofile=$2 + ;; + *) + set x "$@" -o "$2" + shift + ;; + esac + ;; + *.c) + cfile=$1 + set x "$@" "$1" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift +done + +if test -z "$ofile" || test -z "$cfile"; then + # If no '-o' option was seen then we might have been invoked from a + # pattern rule where we don't need one. That is ok -- this is a + # normal compilation that the losing compiler can handle. If no + # '.c' file was seen then we are probably linking. That is also + # ok. + exec "$@" +fi + +# Name of file we expect compiler to create. +cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` + +# Create the lock directory. +# Note: use '[/\\:.-]' here to ensure that we don't use the same name +# that we are using for the .o file. Also, base the name on the expected +# object file name, since that is what matters with a parallel build. +lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d +while true; do + if mkdir "$lockdir" >/dev/null 2>&1; then + break + fi + sleep 1 +done +# FIXME: race condition here if user kills between mkdir and trap. +trap "rmdir '$lockdir'; exit 1" 1 2 15 + +# Run the compile. +"$@" +ret=$? + +if test -f "$cofile"; then + test "$cofile" = "$ofile" || mv "$cofile" "$ofile" +elif test -f "${cofile}bj"; then + test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" +fi + +rmdir "$lockdir" +exit $ret + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/config-cmake.h.in b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/config-cmake.h.in new file mode 100755 index 000000000..77d901165 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/config-cmake.h.in @@ -0,0 +1,57 @@ +/* config.h for CMake builds */ + +#cmakedefine HAVE_DIRENT_H 1 +#cmakedefine HAVE_SYS_STAT_H 1 +#cmakedefine HAVE_SYS_TYPES_H 1 +#cmakedefine HAVE_UNISTD_H 1 +#cmakedefine HAVE_WINDOWS_H 1 +#cmakedefine HAVE_STDINT_H 1 +#cmakedefine HAVE_INTTYPES_H 1 + +#cmakedefine HAVE_TYPE_TRAITS_H 1 +#cmakedefine HAVE_BITS_TYPE_TRAITS_H 1 + +#cmakedefine HAVE_BCOPY 1 +#cmakedefine HAVE_MEMMOVE 1 +#cmakedefine HAVE_STRERROR 1 +#cmakedefine HAVE_STRTOLL 1 +#cmakedefine HAVE_STRTOQ 1 +#cmakedefine HAVE__STRTOI64 1 + +#cmakedefine PCRE_STATIC 1 + +#cmakedefine SUPPORT_PCRE8 1 +#cmakedefine SUPPORT_PCRE16 1 +#cmakedefine SUPPORT_PCRE32 1 +#cmakedefine SUPPORT_JIT 1 +#cmakedefine SUPPORT_PCREGREP_JIT 1 +#cmakedefine SUPPORT_UTF 1 +#cmakedefine SUPPORT_UCP 1 +#cmakedefine EBCDIC 1 +#cmakedefine EBCDIC_NL25 1 +#cmakedefine BSR_ANYCRLF 1 +#cmakedefine NO_RECURSE 1 + +#cmakedefine HAVE_LONG_LONG 1 +#cmakedefine HAVE_UNSIGNED_LONG_LONG 1 + +#cmakedefine SUPPORT_LIBBZ2 1 +#cmakedefine SUPPORT_LIBZ 1 +#cmakedefine SUPPORT_LIBEDIT 1 +#cmakedefine SUPPORT_LIBREADLINE 1 + +#cmakedefine SUPPORT_VALGRIND 1 +#cmakedefine SUPPORT_GCOV 1 + +#define NEWLINE @NEWLINE@ +#define POSIX_MALLOC_THRESHOLD @PCRE_POSIX_MALLOC_THRESHOLD@ +#define LINK_SIZE @PCRE_LINK_SIZE@ +#define PARENS_NEST_LIMIT @PCRE_PARENS_NEST_LIMIT@ +#define MATCH_LIMIT @PCRE_MATCH_LIMIT@ +#define MATCH_LIMIT_RECURSION @PCRE_MATCH_LIMIT_RECURSION@ +#define PCREGREP_BUFSIZE @PCREGREP_BUFSIZE@ + +#define MAX_NAME_SIZE 32 +#define MAX_NAME_COUNT 10000 + +/* end config.h for CMake builds */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/config.guess b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/config.guess new file mode 100755 index 000000000..256083a70 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/config.guess @@ -0,0 +1,1476 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright 1992-2018 Free Software Foundation, Inc. + +timestamp='2018-03-08' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). +# +# Originally written by Per Bothner; maintained since 2000 by Ben Elliston. +# +# You can get the latest version of this script from: +# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess +# +# Please send patches to . + + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Options: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright 1992-2018 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > "$dummy.c" ; + for c in cc gcc c89 c99 ; do + if ($c -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ; set_cc_for_build= ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +case "$UNAME_SYSTEM" in +Linux|GNU|GNU/*) + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + LIBC=gnu + + eval "$set_cc_for_build" + cat <<-EOF > "$dummy.c" + #include + #if defined(__UCLIBC__) + LIBC=uclibc + #elif defined(__dietlibc__) + LIBC=dietlibc + #else + LIBC=gnu + #endif + EOF + eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`" + + # If ldd exists, use it to detect musl libc. + if command -v ldd >/dev/null && \ + ldd --version 2>&1 | grep -q ^musl + then + LIBC=musl + fi + ;; +esac + +# Note: order is significant - the case branches are not exclusive. + +case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ + "/sbin/$sysctl" 2>/dev/null || \ + "/usr/sbin/$sysctl" 2>/dev/null || \ + echo unknown)` + case "$UNAME_MACHINE_ARCH" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + earmv*) + arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` + endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` + machine="${arch}${endian}"-unknown + ;; + *) machine="$UNAME_MACHINE_ARCH"-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently (or will in the future) and ABI. + case "$UNAME_MACHINE_ARCH" in + earm*) + os=netbsdelf + ;; + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval "$set_cc_for_build" + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # Determine ABI tags. + case "$UNAME_MACHINE_ARCH" in + earm*) + expr='s/^earmv[0-9]/-eabi/;s/eb$//' + abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "$UNAME_VERSION" in + Debian*) + release='-gnu' + ;; + *) + release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "$machine-${os}${release}${abi}" + exit ;; + *:Bitrig:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` + echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE" + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE" + exit ;; + *:LibertyBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` + echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE" + exit ;; + *:MidnightBSD:*:*) + echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE" + exit ;; + *:ekkoBSD:*:*) + echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE" + exit ;; + *:SolidBSD:*:*) + echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE" + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd"$UNAME_RELEASE" + exit ;; + *:MirBSD:*:*) + echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE" + exit ;; + *:Sortix:*:*) + echo "$UNAME_MACHINE"-unknown-sortix + exit ;; + *:Redox:*:*) + echo "$UNAME_MACHINE"-unknown-redox + exit ;; + mips:OSF1:*.*) + echo mips-dec-osf1 + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE=alpha ;; + "EV4.5 (21064)") + UNAME_MACHINE=alpha ;; + "LCA4 (21066/21068)") + UNAME_MACHINE=alpha ;; + "EV5 (21164)") + UNAME_MACHINE=alphaev5 ;; + "EV5.6 (21164A)") + UNAME_MACHINE=alphaev56 ;; + "EV5.6 (21164PC)") + UNAME_MACHINE=alphapca56 ;; + "EV5.7 (21164PC)") + UNAME_MACHINE=alphapca57 ;; + "EV6 (21264)") + UNAME_MACHINE=alphaev6 ;; + "EV6.7 (21264A)") + UNAME_MACHINE=alphaev67 ;; + "EV6.8CB (21264C)") + UNAME_MACHINE=alphaev68 ;; + "EV6.8AL (21264B)") + UNAME_MACHINE=alphaev68 ;; + "EV6.8CX (21264D)") + UNAME_MACHINE=alphaev68 ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE=alphaev69 ;; + "EV7 (21364)") + UNAME_MACHINE=alphaev7 ;; + "EV7.9 (21364A)") + UNAME_MACHINE=alphaev79 ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo "$UNAME_MACHINE"-dec-osf"`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`" + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + exitcode=$? + trap '' 0 + exit $exitcode ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo "$UNAME_MACHINE"-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo "$UNAME_MACHINE"-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix"$UNAME_RELEASE" + exit ;; + arm*:riscos:*:*|arm*:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + s390x:SunOS:*:*) + echo "$UNAME_MACHINE"-ibm-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" + exit ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" + exit ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + echo i386-pc-auroraux"$UNAME_RELEASE" + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + eval "$set_cc_for_build" + SUN_ARCH=i386 + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH=x86_64 + fi + fi + echo "$SUN_ARCH"-pc-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos"`echo "$UNAME_RELEASE"|sed -e 's/-/_/'`" + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos"$UNAME_RELEASE" + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos"$UNAME_RELEASE" + ;; + sun4) + echo sparc-sun-sunos"$UNAME_RELEASE" + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos"$UNAME_RELEASE" + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint"$UNAME_RELEASE" + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint"$UNAME_RELEASE" + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint"$UNAME_RELEASE" + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint"$UNAME_RELEASE" + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint"$UNAME_RELEASE" + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint"$UNAME_RELEASE" + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten"$UNAME_RELEASE" + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten"$UNAME_RELEASE" + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix"$UNAME_RELEASE" + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix"$UNAME_RELEASE" + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix"$UNAME_RELEASE" + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval "$set_cc_for_build" + sed 's/^ //' << EOF > "$dummy.c" +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && + dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`"$dummy" "$dummyarg"` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos"$UNAME_RELEASE" + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ "$UNAME_PROCESSOR" = mc88100 ] || [ "$UNAME_PROCESSOR" = mc88110 ] + then + if [ "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx ] || \ + [ "$TARGET_BINARY_INTERFACE"x = x ] + then + echo m88k-dg-dgux"$UNAME_RELEASE" + else + echo m88k-dg-dguxbcs"$UNAME_RELEASE" + fi + else + echo i586-dg-dgux"$UNAME_RELEASE" + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix"`echo "$UNAME_RELEASE"|sed -e 's/-/_/g'`" + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" + fi + echo "$UNAME_MACHINE"-ibm-aix"$IBM_REV" + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval "$set_cc_for_build" + sed 's/^ //' << EOF > "$dummy.c" + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[4567]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/lslpp ] ; then + IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | + awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` + else + IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" + fi + echo "$IBM_ARCH"-ibm-aix"$IBM_REV" + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd"$UNAME_RELEASE" # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` + case "$UNAME_MACHINE" in + 9000/31?) HP_ARCH=m68000 ;; + 9000/[34]??) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "$sc_cpu_version" in + 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 + 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "$sc_kernel_bits" in + 32) HP_ARCH=hppa2.0n ;; + 64) HP_ARCH=hppa2.0w ;; + '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "$HP_ARCH" = "" ]; then + eval "$set_cc_for_build" + sed 's/^ //' << EOF > "$dummy.c" + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ "$HP_ARCH" = hppa2.0w ] + then + eval "$set_cc_for_build" + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ + then + HP_ARCH=hppa2.0w + else + HP_ARCH=hppa64 + fi + fi + echo "$HP_ARCH"-hp-hpux"$HPUX_REV" + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux"$HPUX_REV" + exit ;; + 3050*:HI-UX:*:*) + eval "$set_cc_for_build" + sed 's/^ //' << EOF > "$dummy.c" + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo "$UNAME_MACHINE"-unknown-osf1mk + else + echo "$UNAME_MACHINE"-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE" + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi"$UNAME_RELEASE" + exit ;; + *:BSD/OS:*:*) + echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE" + exit ;; + *:FreeBSD:*:*) + UNAME_PROCESSOR=`/usr/bin/uname -p` + case "$UNAME_PROCESSOR" in + amd64) + UNAME_PROCESSOR=x86_64 ;; + i386) + UNAME_PROCESSOR=i586 ;; + esac + echo "$UNAME_PROCESSOR"-unknown-freebsd"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" + exit ;; + i*:CYGWIN*:*) + echo "$UNAME_MACHINE"-pc-cygwin + exit ;; + *:MINGW64*:*) + echo "$UNAME_MACHINE"-pc-mingw64 + exit ;; + *:MINGW*:*) + echo "$UNAME_MACHINE"-pc-mingw32 + exit ;; + *:MSYS*:*) + echo "$UNAME_MACHINE"-pc-msys + exit ;; + i*:PW*:*) + echo "$UNAME_MACHINE"-pc-pw32 + exit ;; + *:Interix*:*) + case "$UNAME_MACHINE" in + x86) + echo i586-pc-interix"$UNAME_RELEASE" + exit ;; + authenticamd | genuineintel | EM64T) + echo x86_64-unknown-interix"$UNAME_RELEASE" + exit ;; + IA64) + echo ia64-unknown-interix"$UNAME_RELEASE" + exit ;; + esac ;; + i*:UWIN*:*) + echo "$UNAME_MACHINE"-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + *:GNU:*:*) + # the GNU system + echo "`echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,'`-unknown-$LIBC`echo "$UNAME_RELEASE"|sed -e 's,/.*$,,'`" + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo "$UNAME_MACHINE-unknown-`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC" + exit ;; + i*86:Minix:*:*) + echo "$UNAME_MACHINE"-pc-minix + exit ;; + aarch64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + aarch64_be:Linux:*:*) + UNAME_MACHINE=aarch64_be + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC=gnulibc1 ; fi + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + arc:Linux:*:* | arceb:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + arm*:Linux:*:*) + eval "$set_cc_for_build" + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + else + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi + else + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf + fi + fi + exit ;; + avr32*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + cris:Linux:*:*) + echo "$UNAME_MACHINE"-axis-linux-"$LIBC" + exit ;; + crisv32:Linux:*:*) + echo "$UNAME_MACHINE"-axis-linux-"$LIBC" + exit ;; + e2k:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + frv:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + hexagon:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + i*86:Linux:*:*) + echo "$UNAME_MACHINE"-pc-linux-"$LIBC" + exit ;; + ia64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + k1om:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + m32r*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + m68*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + mips:Linux:*:* | mips64:Linux:*:*) + eval "$set_cc_for_build" + sed 's/^ //' << EOF > "$dummy.c" + #undef CPU + #undef ${UNAME_MACHINE} + #undef ${UNAME_MACHINE}el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=${UNAME_MACHINE}el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=${UNAME_MACHINE} + #else + CPU= + #endif + #endif +EOF + eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU'`" + test "x$CPU" != x && { echo "$CPU-unknown-linux-$LIBC"; exit; } + ;; + mips64el:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + openrisc*:Linux:*:*) + echo or1k-unknown-linux-"$LIBC" + exit ;; + or32:Linux:*:* | or1k*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-"$LIBC" + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-"$LIBC" + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;; + PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;; + *) echo hppa-unknown-linux-"$LIBC" ;; + esac + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-"$LIBC" + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-"$LIBC" + exit ;; + ppc64le:Linux:*:*) + echo powerpc64le-unknown-linux-"$LIBC" + exit ;; + ppcle:Linux:*:*) + echo powerpcle-unknown-linux-"$LIBC" + exit ;; + riscv32:Linux:*:* | riscv64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo "$UNAME_MACHINE"-ibm-linux-"$LIBC" + exit ;; + sh64*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + sh*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + tile*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + vax:Linux:*:*) + echo "$UNAME_MACHINE"-dec-linux-"$LIBC" + exit ;; + x86_64:Linux:*:*) + echo "$UNAME_MACHINE"-pc-linux-"$LIBC" + exit ;; + xtensa*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION" + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo "$UNAME_MACHINE"-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo "$UNAME_MACHINE"-unknown-stop + exit ;; + i*86:atheos:*:*) + echo "$UNAME_MACHINE"-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo "$UNAME_MACHINE"-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + echo i386-unknown-lynxos"$UNAME_RELEASE" + exit ;; + i*86:*DOS:*:*) + echo "$UNAME_MACHINE"-pc-msdosdjgpp + exit ;; + i*86:*:4.*:*) + UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL" + else + echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL" + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}{$UNAME_VERSION}" + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL" + else + echo "$UNAME_MACHINE"-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configure will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv"$UNAME_RELEASE" # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv"$UNAME_RELEASE" # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos"$UNAME_RELEASE" + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos"$UNAME_RELEASE" + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos"$UNAME_RELEASE" + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + echo powerpc-unknown-lynxos"$UNAME_RELEASE" + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv"$UNAME_RELEASE" + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo "$UNAME_MACHINE"-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo "$UNAME_MACHINE"-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux"$UNAME_RELEASE" + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv"$UNAME_RELEASE" + else + echo mips-unknown-sysv"$UNAME_RELEASE" + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; + x86_64:Haiku:*:*) + echo x86_64-unknown-haiku + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux"$UNAME_RELEASE" + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux"$UNAME_RELEASE" + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux"$UNAME_RELEASE" + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux"$UNAME_RELEASE" + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux"$UNAME_RELEASE" + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux"$UNAME_RELEASE" + exit ;; + SX-ACE:SUPER-UX:*:*) + echo sxace-nec-superux"$UNAME_RELEASE" + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody"$UNAME_RELEASE" + exit ;; + *:Rhapsody:*:*) + echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE" + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + eval "$set_cc_for_build" + if test "$UNAME_PROCESSOR" = unknown ; then + UNAME_PROCESSOR=powerpc + fi + if test "`echo "$UNAME_RELEASE" | sed -e 's/\..*//'`" -le 10 ; then + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc + if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_PPC >/dev/null + then + UNAME_PROCESSOR=powerpc + fi + fi + elif test "$UNAME_PROCESSOR" = i386 ; then + # Avoid executing cc on OS X 10.9, as it ships with a stub + # that puts up a graphical alert prompting to install + # developer tools. Any system running Mac OS X 10.7 or + # later (Darwin 11 and later) is required to have a 64-bit + # processor. This is not true of the ARM version of Darwin + # that Apple uses in portable devices. + UNAME_PROCESSOR=x86_64 + fi + echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE" + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = x86; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE" + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NEO-*:NONSTOP_KERNEL:*:*) + echo neo-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSE-*:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSR-*:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSV-*:NONSTOP_KERNEL:*:*) + echo nsv-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSX-*:NONSTOP_KERNEL:*:*) + echo nsx-tandem-nsk"$UNAME_RELEASE" + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE" + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = 386; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo "$UNAME_MACHINE"-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux"$UNAME_RELEASE" + exit ;; + *:DragonFly:*:*) + echo "$UNAME_MACHINE"-unknown-dragonfly"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "$UNAME_MACHINE" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo "$UNAME_MACHINE"-pc-skyos"`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`" + exit ;; + i*86:rdos:*:*) + echo "$UNAME_MACHINE"-pc-rdos + exit ;; + i*86:AROS:*:*) + echo "$UNAME_MACHINE"-pc-aros + exit ;; + x86_64:VMkernel:*:*) + echo "$UNAME_MACHINE"-unknown-esx + exit ;; + amd64:Isilon\ OneFS:*:*) + echo x86_64-unknown-onefs + exit ;; +esac + +echo "$0: unable to guess system type" >&2 + +case "$UNAME_MACHINE:$UNAME_SYSTEM" in + mips:Linux | mips64:Linux) + # If we got here on MIPS GNU/Linux, output extra information. + cat >&2 <&2 </dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = "$UNAME_MACHINE" +UNAME_RELEASE = "$UNAME_RELEASE" +UNAME_SYSTEM = "$UNAME_SYSTEM" +UNAME_VERSION = "$UNAME_VERSION" +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/config.h.generic b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/config.h.generic new file mode 100755 index 000000000..1da2ac160 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/config.h.generic @@ -0,0 +1,349 @@ +/* config.h. Generated from config.h.in by configure. */ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* PCRE is written in Standard C, but there are a few non-standard things it +can cope with, allowing it to run on SunOS4 and other "close to standard" +systems. + +In environments that support the GNU autotools, config.h.in is converted into +config.h by the "configure" script. In environments that use CMake, +config-cmake.in is converted into config.h. If you are going to build PCRE "by +hand" without using "configure" or CMake, you should copy the distributed +config.h.generic to config.h, and edit the macro definitions to be the way you +need them. You must then add -DHAVE_CONFIG_H to all of your compile commands, +so that config.h is included at the start of every source. + +Alternatively, you can avoid editing by using -D on the compiler command line +to set the macro values. In this case, you do not have to set -DHAVE_CONFIG_H, +but if you do, default values will be taken from config.h for non-boolean +macros that are not defined on the command line. + +Boolean macros such as HAVE_STDLIB_H and SUPPORT_PCRE8 should either be defined +(conventionally to 1) for TRUE, and not defined at all for FALSE. All such +macros are listed as a commented #undef in config.h.generic. Macros such as +MATCH_LIMIT, whose actual value is relevant, have defaults defined, but are +surrounded by #ifndef/#endif lines so that the value can be overridden by -D. + +PCRE uses memmove() if HAVE_MEMMOVE is defined; otherwise it uses bcopy() if +HAVE_BCOPY is defined. If your system has neither bcopy() nor memmove(), make +sure both macros are undefined; an emulation function will then be used. */ + +/* By default, the \R escape sequence matches any Unicode line ending + character or sequence of characters. If BSR_ANYCRLF is defined (to any + value), this is changed so that backslash-R matches only CR, LF, or CRLF. + The build-time default can be overridden by the user of PCRE at runtime. */ +/* #undef BSR_ANYCRLF */ + +/* If you are compiling for a system that uses EBCDIC instead of ASCII + character codes, define this macro to any value. You must also edit the + NEWLINE macro below to set a suitable EBCDIC newline, commonly 21 (0x15). + On systems that can use "configure" or CMake to set EBCDIC, NEWLINE is + automatically adjusted. When EBCDIC is set, PCRE assumes that all input + strings are in EBCDIC. If you do not define this macro, PCRE will assume + input strings are ASCII or UTF-8/16/32 Unicode. It is not possible to build + a version of PCRE that supports both EBCDIC and UTF-8/16/32. */ +/* #undef EBCDIC */ + +/* In an EBCDIC environment, define this macro to any value to arrange for the + NL character to be 0x25 instead of the default 0x15. NL plays the role that + LF does in an ASCII/Unicode environment. The value must also be set in the + NEWLINE macro below. On systems that can use "configure" or CMake to set + EBCDIC_NL25, the adjustment of NEWLINE is automatic. */ +/* #undef EBCDIC_NL25 */ + +/* Define to 1 if you have the `bcopy' function. */ +/* #undef HAVE_BCOPY */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_BITS_TYPE_TRAITS_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_BZLIB_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_DIRENT_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_DLFCN_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_EDITLINE_READLINE_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_EDIT_READLINE_READLINE_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_INTTYPES_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_LIMITS_H */ + +/* Define to 1 if the system has the type `long long'. */ +/* #undef HAVE_LONG_LONG */ + +/* Define to 1 if you have the `memmove' function. */ +/* #undef HAVE_MEMMOVE */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_MEMORY_H */ + +/* Define if you have POSIX threads libraries and header files. */ +/* #undef HAVE_PTHREAD */ + +/* Have PTHREAD_PRIO_INHERIT. */ +/* #undef HAVE_PTHREAD_PRIO_INHERIT */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_READLINE_HISTORY_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_READLINE_READLINE_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_STDINT_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_STDLIB_H */ + +/* Define to 1 if you have the `strerror' function. */ +/* #undef HAVE_STRERROR */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_STRING */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_STRINGS_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_STRING_H */ + +/* Define to 1 if you have `strtoimax'. */ +/* #undef HAVE_STRTOIMAX */ + +/* Define to 1 if you have `strtoll'. */ +/* #undef HAVE_STRTOLL */ + +/* Define to 1 if you have `strtoq'. */ +/* #undef HAVE_STRTOQ */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_STAT_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_TYPES_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_TYPE_TRAITS_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_UNISTD_H */ + +/* Define to 1 if the system has the type `unsigned long long'. */ +/* #undef HAVE_UNSIGNED_LONG_LONG */ + +/* Define to 1 if the compiler supports simple visibility declarations. */ +/* #undef HAVE_VISIBILITY */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_WINDOWS_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_ZLIB_H */ + +/* Define to 1 if you have `_strtoi64'. */ +/* #undef HAVE__STRTOI64 */ + +/* The value of LINK_SIZE determines the number of bytes used to store links + as offsets within the compiled regex. The default is 2, which allows for + compiled patterns up to 64K long. This covers the vast majority of cases. + However, PCRE can also be compiled to use 3 or 4 bytes instead. This allows + for longer patterns in extreme cases. */ +#ifndef LINK_SIZE +#define LINK_SIZE 2 +#endif + +/* Define to the sub-directory where libtool stores uninstalled libraries. */ +/* This is ignored unless you are using libtool. */ +#ifndef LT_OBJDIR +#define LT_OBJDIR ".libs/" +#endif + +/* The value of MATCH_LIMIT determines the default number of times the + internal match() function can be called during a single execution of + pcre_exec(). There is a runtime interface for setting a different limit. + The limit exists in order to catch runaway regular expressions that take + for ever to determine that they do not match. The default is set very large + so that it does not accidentally catch legitimate cases. */ +#ifndef MATCH_LIMIT +#define MATCH_LIMIT 10000000 +#endif + +/* The above limit applies to all calls of match(), whether or not they + increase the recursion depth. In some environments it is desirable to limit + the depth of recursive calls of match() more strictly, in order to restrict + the maximum amount of stack (or heap, if NO_RECURSE is defined) that is + used. The value of MATCH_LIMIT_RECURSION applies only to recursive calls of + match(). To have any useful effect, it must be less than the value of + MATCH_LIMIT. The default is to use the same value as MATCH_LIMIT. There is + a runtime method for setting a different limit. */ +#ifndef MATCH_LIMIT_RECURSION +#define MATCH_LIMIT_RECURSION MATCH_LIMIT +#endif + +/* This limit is parameterized just in case anybody ever wants to change it. + Care must be taken if it is increased, because it guards against integer + overflow caused by enormously large patterns. */ +#ifndef MAX_NAME_COUNT +#define MAX_NAME_COUNT 10000 +#endif + +/* This limit is parameterized just in case anybody ever wants to change it. + Care must be taken if it is increased, because it guards against integer + overflow caused by enormously large patterns. */ +#ifndef MAX_NAME_SIZE +#define MAX_NAME_SIZE 32 +#endif + +/* The value of NEWLINE determines the default newline character sequence. + PCRE client programs can override this by selecting other values at run + time. In ASCII environments, the value can be 10 (LF), 13 (CR), or 3338 + (CRLF); in EBCDIC environments the value can be 21 or 37 (LF), 13 (CR), or + 3349 or 3365 (CRLF) because there are two alternative codepoints (0x15 and + 0x25) that are used as the NL line terminator that is equivalent to ASCII + LF. In both ASCII and EBCDIC environments the value can also be -1 (ANY), + or -2 (ANYCRLF). */ +#ifndef NEWLINE +#define NEWLINE 10 +#endif + +/* PCRE uses recursive function calls to handle backtracking while matching. + This can sometimes be a problem on systems that have stacks of limited + size. Define NO_RECURSE to any value to get a version that doesn't use + recursion in the match() function; instead it creates its own stack by + steam using pcre_recurse_malloc() to obtain memory from the heap. For more + detail, see the comments and other stuff just above the match() function. + */ +/* #undef NO_RECURSE */ + +/* Name of package */ +#define PACKAGE "pcre" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "PCRE" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "PCRE 8.44" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "pcre" + +/* Define to the home page for this package. */ +#define PACKAGE_URL "" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "8.44" + +/* The value of PARENS_NEST_LIMIT specifies the maximum depth of nested + parentheses (of any kind) in a pattern. This limits the amount of system + stack that is used while compiling a pattern. */ +#ifndef PARENS_NEST_LIMIT +#define PARENS_NEST_LIMIT 250 +#endif + +/* The value of PCREGREP_BUFSIZE determines the size of buffer used by + pcregrep to hold parts of the file it is searching. This is also the + minimum value. The actual amount of memory used by pcregrep is three times + this number, because it allows for the buffering of "before" and "after" + lines. */ +#ifndef PCREGREP_BUFSIZE +#define PCREGREP_BUFSIZE 20480 +#endif + +/* If you are compiling for a system other than a Unix-like system or + Win32, and it needs some magic to be inserted before the definition + of a function that is exported by the library, define this macro to + contain the relevant magic. If you do not define this macro, a suitable + __declspec value is used for Windows systems; in other environments + "extern" is used for a C compiler and "extern C" for a C++ compiler. + This macro apears at the start of every exported function that is part + of the external API. It does not appear on functions that are "external" + in the C sense, but which are internal to the library. */ +/* #undef PCRE_EXP_DEFN */ + +/* Define to any value if linking statically (TODO: make nice with Libtool) */ +/* #undef PCRE_STATIC */ + +/* When calling PCRE via the POSIX interface, additional working storage is + required for holding the pointers to capturing substrings because PCRE + requires three integers per substring, whereas the POSIX interface provides + only two. If the number of expected substrings is small, the wrapper + function uses space on the stack, because this is faster than using + malloc() for each call. The threshold above which the stack is no longer + used is defined by POSIX_MALLOC_THRESHOLD. */ +#ifndef POSIX_MALLOC_THRESHOLD +#define POSIX_MALLOC_THRESHOLD 10 +#endif + +/* Define to necessary symbol if this constant uses a non-standard name on + your system. */ +/* #undef PTHREAD_CREATE_JOINABLE */ + +/* Define to 1 if you have the ANSI C header files. */ +/* #undef STDC_HEADERS */ + +/* Define to any value to enable support for Just-In-Time compiling. */ +/* #undef SUPPORT_JIT */ + +/* Define to any value to allow pcregrep to be linked with libbz2, so that it + is able to handle .bz2 files. */ +/* #undef SUPPORT_LIBBZ2 */ + +/* Define to any value to allow pcretest to be linked with libedit. */ +/* #undef SUPPORT_LIBEDIT */ + +/* Define to any value to allow pcretest to be linked with libreadline. */ +/* #undef SUPPORT_LIBREADLINE */ + +/* Define to any value to allow pcregrep to be linked with libz, so that it is + able to handle .gz files. */ +/* #undef SUPPORT_LIBZ */ + +/* Define to any value to enable the 16 bit PCRE library. */ +/* #undef SUPPORT_PCRE16 */ + +/* Define to any value to enable the 32 bit PCRE library. */ +/* #undef SUPPORT_PCRE32 */ + +/* Define to any value to enable the 8 bit PCRE library. */ +/* #undef SUPPORT_PCRE8 */ + +/* Define to any value to enable JIT support in pcregrep. */ +/* #undef SUPPORT_PCREGREP_JIT */ + +/* Define to any value to enable support for Unicode properties. */ +/* #undef SUPPORT_UCP */ + +/* Define to any value to enable support for the UTF-8/16/32 Unicode encoding. + This will work even in an EBCDIC environment, but it is incompatible with + the EBCDIC macro. That is, PCRE can support *either* EBCDIC code *or* + ASCII/UTF-8/16/32, but not both at once. */ +/* #undef SUPPORT_UTF */ + +/* Define to any value for valgrind support to find invalid memory reads. */ +/* #undef SUPPORT_VALGRIND */ + +/* Version number of package */ +#define VERSION "8.44" + +/* Define to empty if `const' does not conform to ANSI C. */ +/* #undef const */ + +/* Define to the type of a signed integer type of width exactly 64 bits if + such a type exists and the standard includes do not define it. */ +/* #undef int64_t */ + +/* Define to `unsigned int' if does not define. */ +/* #undef size_t */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/config.h.in b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/config.h.in new file mode 100755 index 000000000..0b2f45d4d --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/config.h.in @@ -0,0 +1,347 @@ +/* config.h.in. Generated from configure.ac by autoheader. */ + + +/* PCRE is written in Standard C, but there are a few non-standard things it +can cope with, allowing it to run on SunOS4 and other "close to standard" +systems. + +In environments that support the GNU autotools, config.h.in is converted into +config.h by the "configure" script. In environments that use CMake, +config-cmake.in is converted into config.h. If you are going to build PCRE "by +hand" without using "configure" or CMake, you should copy the distributed +config.h.generic to config.h, and edit the macro definitions to be the way you +need them. You must then add -DHAVE_CONFIG_H to all of your compile commands, +so that config.h is included at the start of every source. + +Alternatively, you can avoid editing by using -D on the compiler command line +to set the macro values. In this case, you do not have to set -DHAVE_CONFIG_H, +but if you do, default values will be taken from config.h for non-boolean +macros that are not defined on the command line. + +Boolean macros such as HAVE_STDLIB_H and SUPPORT_PCRE8 should either be defined +(conventionally to 1) for TRUE, and not defined at all for FALSE. All such +macros are listed as a commented #undef in config.h.generic. Macros such as +MATCH_LIMIT, whose actual value is relevant, have defaults defined, but are +surrounded by #ifndef/#endif lines so that the value can be overridden by -D. + +PCRE uses memmove() if HAVE_MEMMOVE is defined; otherwise it uses bcopy() if +HAVE_BCOPY is defined. If your system has neither bcopy() nor memmove(), make +sure both macros are undefined; an emulation function will then be used. */ + +/* By default, the \R escape sequence matches any Unicode line ending + character or sequence of characters. If BSR_ANYCRLF is defined (to any + value), this is changed so that backslash-R matches only CR, LF, or CRLF. + The build-time default can be overridden by the user of PCRE at runtime. */ +#undef BSR_ANYCRLF + +/* If you are compiling for a system that uses EBCDIC instead of ASCII + character codes, define this macro to any value. You must also edit the + NEWLINE macro below to set a suitable EBCDIC newline, commonly 21 (0x15). + On systems that can use "configure" or CMake to set EBCDIC, NEWLINE is + automatically adjusted. When EBCDIC is set, PCRE assumes that all input + strings are in EBCDIC. If you do not define this macro, PCRE will assume + input strings are ASCII or UTF-8/16/32 Unicode. It is not possible to build + a version of PCRE that supports both EBCDIC and UTF-8/16/32. */ +#undef EBCDIC + +/* In an EBCDIC environment, define this macro to any value to arrange for the + NL character to be 0x25 instead of the default 0x15. NL plays the role that + LF does in an ASCII/Unicode environment. The value must also be set in the + NEWLINE macro below. On systems that can use "configure" or CMake to set + EBCDIC_NL25, the adjustment of NEWLINE is automatic. */ +#undef EBCDIC_NL25 + +/* Define to 1 if you have the `bcopy' function. */ +#undef HAVE_BCOPY + +/* Define to 1 if you have the header file. */ +#undef HAVE_BITS_TYPE_TRAITS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_BZLIB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_DIRENT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_DLFCN_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_EDITLINE_READLINE_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_EDIT_READLINE_READLINE_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_LIMITS_H + +/* Define to 1 if the system has the type `long long'. */ +#undef HAVE_LONG_LONG + +/* Define to 1 if you have the `memmove' function. */ +#undef HAVE_MEMMOVE + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define if you have POSIX threads libraries and header files. */ +#undef HAVE_PTHREAD + +/* Have PTHREAD_PRIO_INHERIT. */ +#undef HAVE_PTHREAD_PRIO_INHERIT + +/* Define to 1 if you have the header file. */ +#undef HAVE_READLINE_HISTORY_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_READLINE_READLINE_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the `strerror' function. */ +#undef HAVE_STRERROR + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have `strtoimax'. */ +#undef HAVE_STRTOIMAX + +/* Define to 1 if you have `strtoll'. */ +#undef HAVE_STRTOLL + +/* Define to 1 if you have `strtoq'. */ +#undef HAVE_STRTOQ + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_TYPE_TRAITS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define to 1 if the system has the type `unsigned long long'. */ +#undef HAVE_UNSIGNED_LONG_LONG + +/* Define to 1 if the compiler supports simple visibility declarations. */ +#undef HAVE_VISIBILITY + +/* Define to 1 if you have the header file. */ +#undef HAVE_WINDOWS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_ZLIB_H + +/* Define to 1 if you have `_strtoi64'. */ +#undef HAVE__STRTOI64 + +/* The value of LINK_SIZE determines the number of bytes used to store links + as offsets within the compiled regex. The default is 2, which allows for + compiled patterns up to 64K long. This covers the vast majority of cases. + However, PCRE can also be compiled to use 3 or 4 bytes instead. This allows + for longer patterns in extreme cases. */ +#undef LINK_SIZE + +/* Define to the sub-directory where libtool stores uninstalled libraries. */ +#undef LT_OBJDIR + +/* The value of MATCH_LIMIT determines the default number of times the + internal match() function can be called during a single execution of + pcre_exec(). There is a runtime interface for setting a different limit. + The limit exists in order to catch runaway regular expressions that take + for ever to determine that they do not match. The default is set very large + so that it does not accidentally catch legitimate cases. */ +#undef MATCH_LIMIT + +/* The above limit applies to all calls of match(), whether or not they + increase the recursion depth. In some environments it is desirable to limit + the depth of recursive calls of match() more strictly, in order to restrict + the maximum amount of stack (or heap, if NO_RECURSE is defined) that is + used. The value of MATCH_LIMIT_RECURSION applies only to recursive calls of + match(). To have any useful effect, it must be less than the value of + MATCH_LIMIT. The default is to use the same value as MATCH_LIMIT. There is + a runtime method for setting a different limit. */ +#undef MATCH_LIMIT_RECURSION + +/* This limit is parameterized just in case anybody ever wants to change it. + Care must be taken if it is increased, because it guards against integer + overflow caused by enormously large patterns. */ +#undef MAX_NAME_COUNT + +/* This limit is parameterized just in case anybody ever wants to change it. + Care must be taken if it is increased, because it guards against integer + overflow caused by enormously large patterns. */ +#undef MAX_NAME_SIZE + +/* The value of NEWLINE determines the default newline character sequence. + PCRE client programs can override this by selecting other values at run + time. In ASCII environments, the value can be 10 (LF), 13 (CR), or 3338 + (CRLF); in EBCDIC environments the value can be 21 or 37 (LF), 13 (CR), or + 3349 or 3365 (CRLF) because there are two alternative codepoints (0x15 and + 0x25) that are used as the NL line terminator that is equivalent to ASCII + LF. In both ASCII and EBCDIC environments the value can also be -1 (ANY), + or -2 (ANYCRLF). */ +#undef NEWLINE + +/* PCRE uses recursive function calls to handle backtracking while matching. + This can sometimes be a problem on systems that have stacks of limited + size. Define NO_RECURSE to any value to get a version that doesn't use + recursion in the match() function; instead it creates its own stack by + steam using pcre_recurse_malloc() to obtain memory from the heap. For more + detail, see the comments and other stuff just above the match() function. + */ +#undef NO_RECURSE + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* The value of PARENS_NEST_LIMIT specifies the maximum depth of nested + parentheses (of any kind) in a pattern. This limits the amount of system + stack that is used while compiling a pattern. */ +#undef PARENS_NEST_LIMIT + +/* to make a symbol visible */ +#undef PCRECPP_EXP_DECL + +/* to make a symbol visible */ +#undef PCRECPP_EXP_DEFN + +/* The value of PCREGREP_BUFSIZE determines the size of buffer used by + pcregrep to hold parts of the file it is searching. This is also the + minimum value. The actual amount of memory used by pcregrep is three times + this number, because it allows for the buffering of "before" and "after" + lines. */ +#undef PCREGREP_BUFSIZE + +/* to make a symbol visible */ +#undef PCREPOSIX_EXP_DECL + +/* to make a symbol visible */ +#undef PCREPOSIX_EXP_DEFN + +/* to make a symbol visible */ +#undef PCRE_EXP_DATA_DEFN + +/* to make a symbol visible */ +#undef PCRE_EXP_DECL + + +/* If you are compiling for a system other than a Unix-like system or + Win32, and it needs some magic to be inserted before the definition + of a function that is exported by the library, define this macro to + contain the relevant magic. If you do not define this macro, a suitable + __declspec value is used for Windows systems; in other environments + "extern" is used for a C compiler and "extern C" for a C++ compiler. + This macro apears at the start of every exported function that is part + of the external API. It does not appear on functions that are "external" + in the C sense, but which are internal to the library. */ +#undef PCRE_EXP_DEFN + +/* Define to any value if linking statically (TODO: make nice with Libtool) */ +#undef PCRE_STATIC + +/* When calling PCRE via the POSIX interface, additional working storage is + required for holding the pointers to capturing substrings because PCRE + requires three integers per substring, whereas the POSIX interface provides + only two. If the number of expected substrings is small, the wrapper + function uses space on the stack, because this is faster than using + malloc() for each call. The threshold above which the stack is no longer + used is defined by POSIX_MALLOC_THRESHOLD. */ +#undef POSIX_MALLOC_THRESHOLD + +/* Define to necessary symbol if this constant uses a non-standard name on + your system. */ +#undef PTHREAD_CREATE_JOINABLE + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Define to any value to enable support for Just-In-Time compiling. */ +#undef SUPPORT_JIT + +/* Define to any value to allow pcregrep to be linked with libbz2, so that it + is able to handle .bz2 files. */ +#undef SUPPORT_LIBBZ2 + +/* Define to any value to allow pcretest to be linked with libedit. */ +#undef SUPPORT_LIBEDIT + +/* Define to any value to allow pcretest to be linked with libreadline. */ +#undef SUPPORT_LIBREADLINE + +/* Define to any value to allow pcregrep to be linked with libz, so that it is + able to handle .gz files. */ +#undef SUPPORT_LIBZ + +/* Define to any value to enable the 16 bit PCRE library. */ +#undef SUPPORT_PCRE16 + +/* Define to any value to enable the 32 bit PCRE library. */ +#undef SUPPORT_PCRE32 + +/* Define to any value to enable the 8 bit PCRE library. */ +#undef SUPPORT_PCRE8 + +/* Define to any value to enable JIT support in pcregrep. */ +#undef SUPPORT_PCREGREP_JIT + +/* Define to any value to enable support for Unicode properties. */ +#undef SUPPORT_UCP + +/* Define to any value to enable support for the UTF-8/16/32 Unicode encoding. + This will work even in an EBCDIC environment, but it is incompatible with + the EBCDIC macro. That is, PCRE can support *either* EBCDIC code *or* + ASCII/UTF-8/16/32, but not both at once. */ +#undef SUPPORT_UTF + +/* Define to any value for valgrind support to find invalid memory reads. */ +#undef SUPPORT_VALGRIND + +/* Version number of package */ +#undef VERSION + +/* Define to empty if `const' does not conform to ANSI C. */ +#undef const + +/* Define to the type of a signed integer type of width exactly 64 bits if + such a type exists and the standard includes do not define it. */ +#undef int64_t + +/* Define to `unsigned int' if does not define. */ +#undef size_t diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/config.sub b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/config.sub new file mode 100755 index 000000000..9ccf09a7a --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/config.sub @@ -0,0 +1,1801 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright 1992-2018 Free Software Foundation, Inc. + +timestamp='2018-03-08' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). + + +# Please send patches to . +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# You can get the latest version of this script from: +# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS + +Canonicalize a configuration name. + +Options: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright 1992-2018 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo "$1" + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ + linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ + knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \ + kopensolaris*-gnu* | cloudabi*-eabi* | \ + storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + android-linux) + os=-linux-android + basic_machine=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown + ;; + *) + basic_machine=`echo "$1" | sed 's/-[^-]*$//'` + if [ "$basic_machine" != "$1" ] + then os=`echo "$1" | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray | -microblaze*) + os= + basic_machine=$1 + ;; + -bluegene*) + os=-cnk + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco6) + os=-sco5v6 + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` + ;; + -sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*178) + os=-lynxos178 + ;; + -lynx*5) + os=-lynxos5 + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo "$1" | sed -e 's/86-.*/86-sequent/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | aarch64 | aarch64_be \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arceb \ + | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ + | avr | avr32 \ + | ba \ + | be32 | be64 \ + | bfin \ + | c4x | c8051 | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | e2k | epiphany \ + | fido | fr30 | frv | ft32 \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | hexagon \ + | i370 | i860 | i960 | ia16 | ia64 \ + | ip2k | iq2000 \ + | k1om \ + | le32 | le64 \ + | lm32 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ + | mips64r5900 | mips64r5900el \ + | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa32r6 | mipsisa32r6el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64r6 | mipsisa64r6el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipsr5900 | mipsr5900el \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | moxie \ + | mt \ + | msp430 \ + | nds32 | nds32le | nds32be \ + | nios | nios2 | nios2eb | nios2el \ + | ns16k | ns32k \ + | open8 | or1k | or1knd | or32 \ + | pdp10 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle \ + | pru \ + | pyramid \ + | riscv32 | riscv64 \ + | rl78 | rx \ + | score \ + | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ + | spu \ + | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ + | ubicom32 \ + | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ + | visium \ + | wasm32 \ + | x86 | xc16x | xstormy16 | xtensa \ + | z8k | z80) + basic_machine=$basic_machine-unknown + ;; + c54x) + basic_machine=tic54x-unknown + ;; + c55x) + basic_machine=tic55x-unknown + ;; + c6x) + basic_machine=tic6x-unknown + ;; + leon|leon[3-9]) + basic_machine=sparc-$basic_machine + ;; + m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65) + ;; + ms1) + basic_machine=mt-unknown + ;; + + strongarm | thumb | xscale) + basic_machine=arm-unknown + ;; + xgate) + basic_machine=$basic_machine-unknown + os=-none + ;; + xscaleeb) + basic_machine=armeb-unknown + ;; + + xscaleel) + basic_machine=armel-unknown + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`"$1"\': machine \`"$basic_machine"\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | aarch64-* | aarch64_be-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* | avr32-* \ + | ba-* \ + | be32-* | be64-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* \ + | c8051-* | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | e2k-* | elxsi-* \ + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | hexagon-* \ + | i*86-* | i860-* | i960-* | ia16-* | ia64-* \ + | ip2k-* | iq2000-* \ + | k1om-* \ + | le32-* | le64-* \ + | lm32-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ + | microblaze-* | microblazeel-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64octeon-* | mips64octeonel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64r5900-* | mips64r5900el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa32r6-* | mipsisa32r6el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64r6-* | mipsisa64r6el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipsr5900-* | mipsr5900el-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | nds32-* | nds32le-* | nds32be-* \ + | nios-* | nios2-* | nios2eb-* | nios2el-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | open8-* \ + | or1k*-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ + | pru-* \ + | pyramid-* \ + | riscv32-* | riscv64-* \ + | rl78-* | romp-* | rs6000-* | rx-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \ + | tahoe-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tile*-* \ + | tron-* \ + | ubicom32-* \ + | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ + | vax-* \ + | visium-* \ + | wasm32-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* \ + | xstormy16-* | xtensa*-* \ + | ymp-* \ + | z8k-* | z80-*) + ;; + # Recognize the basic CPU types without company name, with glob match. + xtensa*) + basic_machine=$basic_machine-unknown + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-pc + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aros) + basic_machine=i386-pc + os=-aros + ;; + asmjs) + basic_machine=asmjs-unknown + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + blackfin) + basic_machine=bfin-unknown + os=-linux + ;; + blackfin-*) + basic_machine=bfin-`echo "$basic_machine" | sed 's/^[^-]*-//'` + os=-linux + ;; + bluegene*) + basic_machine=powerpc-ibm + os=-cnk + ;; + c54x-*) + basic_machine=tic54x-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + c55x-*) + basic_machine=tic55x-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + c6x-*) + basic_machine=tic6x-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + cegcc) + basic_machine=arm-unknown + os=-cegcc + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16 | cr16-*) + basic_machine=cr16-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dicos) + basic_machine=i686-pc + os=-dicos + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2*) + basic_machine=m68k-bull + os=-sysv3 + ;; + e500v[12]) + basic_machine=powerpc-unknown + os=$os"spe" + ;; + e500v[12]-*) + basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'` + os=$os"spe" + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; + i*86v32) + basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + leon-*|leon[3-9]-*) + basic_machine=sparc-`echo "$basic_machine" | sed 's/-.*//'` + ;; + m68knommu) + basic_machine=m68k-unknown + os=-linux + ;; + m68knommu-*) + basic_machine=m68k-`echo "$basic_machine" | sed 's/^[^-]*-//'` + os=-linux + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + microblaze*) + basic_machine=microblaze-xilinx + ;; + mingw64) + basic_machine=x86_64-pc + os=-mingw64 + ;; + mingw32) + basic_machine=i686-pc + os=-mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + os=-mingw32ce + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + moxiebox) + basic_machine=moxie-unknown + os=-moxiebox + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + ms1-*) + basic_machine=`echo "$basic_machine" | sed -e 's/ms1-/mt-/'` + ;; + msys) + basic_machine=i686-pc + os=-msys + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + nacl) + basic_machine=le32-unknown + os=-nacl + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + neo-tandem) + basic_machine=neo-tandem + ;; + nse-tandem) + basic_machine=nse-tandem + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + nsv-tandem) + basic_machine=nsv-tandem + ;; + nsx-tandem) + basic_machine=nsx-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + openrisc | openrisc-*) + basic_machine=or32-unknown + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + parisc) + basic_machine=hppa-unknown + os=-linux + ;; + parisc-*) + basic_machine=hppa-`echo "$basic_machine" | sed 's/^[^-]*-//'` + os=-linux + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pc98) + basic_machine=i386-pc + ;; + pc98-*) + basic_machine=i386-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc | ppcbe) basic_machine=powerpc-unknown + ;; + ppc-* | ppcbe-*) + basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rdos | rdos64) + basic_machine=x86_64-pc + os=-rdos + ;; + rdos32) + basic_machine=i386-pc + os=-rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sde) + basic_machine=mipsisa32-sde + os=-elf + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh5el) + basic_machine=sh5le-unknown + ;; + simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + strongarm-* | thumb-*) + basic_machine=arm-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tile*) + basic_machine=$basic_machine-unknown + os=-linux-gnu + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + x64) + basic_machine=x86_64-pc + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + xscale-* | xscalee[bl]-*) + basic_machine=`echo "$basic_machine" | sed 's/^xscale/arm/'` + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + mmix) + basic_machine=mmix-knuth + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`"$1"\': machine \`"$basic_machine"\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo "$basic_machine" | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo "$basic_machine" | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases that might get confused + # with valid system types. + # -solaris* is a basic system type, with this one exception. + -auroraux) + os=-auroraux + ;; + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # es1800 is here to avoid being matched by es* (a different OS) + -es1800*) + os=-ose + ;; + # Now accept the basic system types. + # The portable systems comes first. + # Each alternative MUST end in a * to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ + | -sym* | -kopensolaris* | -plan9* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* | -aros* | -cloudabi* | -sortix* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -knetbsd* | -mirbsd* | -netbsd* \ + | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* | -hcos* \ + | -chorusos* | -chorusrdb* | -cegcc* | -glidix* \ + | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ + | -linux-newlib* | -linux-musl* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \ + | -onefs* | -tirtos* | -phoenix* | -fuchsia* | -redox* | -bme* \ + | -midnightbsd*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -xray | -os68k* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo "$os" | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo "$os" | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo "$os" | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4*) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -zvmoe) + os=-zvmoe + ;; + -dicos*) + os=-dicos + ;; + -pikeos*) + # Until real need of OS specific support for + # particular features comes up, bare metal + # configurations are quite functional. + case $basic_machine in + arm*) + os=-eabi + ;; + *) + os=-elf + ;; + esac + ;; + -nacl*) + ;; + -ios) + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`"$1"\': system \`"$os"\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + score-*) + os=-elf + ;; + spu-*) + os=-elf + ;; + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + c8051-*) + os=-elf + ;; + hexagon-*) + os=-elf + ;; + tic54x-*) + os=-coff + ;; + tic55x-*) + os=-coff + ;; + tic6x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + ;; + m68*-cisco) + os=-aout + ;; + mep-*) + os=-elf + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + pru-*) + os=-elf + ;; + *-be) + os=-beos + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -cnk*|-aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo "$basic_machine" | sed "s/unknown/$vendor/"` + ;; +esac + +echo "$basic_machine$os" +exit + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/configure b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/configure new file mode 100755 index 000000000..6d2a48e20 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/configure @@ -0,0 +1,22875 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.69 for PCRE 8.44. +# +# +# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +as_fn_exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1 +test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1 + + test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ + || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, +$0: including any error possibly output before this +$0: message. Then install a modern shell, or manually run +$0: the script under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + +SHELL=${CONFIG_SHELL-/bin/sh} + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='PCRE' +PACKAGE_TARNAME='pcre' +PACKAGE_VERSION='8.44' +PACKAGE_STRING='PCRE 8.44' +PACKAGE_BUGREPORT='' +PACKAGE_URL='' + +ac_unique_file="pcre.h.in" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +LIBOBJS +WITH_GCOV_FALSE +WITH_GCOV_TRUE +GCOV_LIBS +GCOV_CXXFLAGS +GCOV_CFLAGS +GENHTML +LCOV +SHTOOL +VALGRIND_LIBS +VALGRIND_CFLAGS +PKG_CONFIG_LIBDIR +PKG_CONFIG_PATH +PKG_CONFIG +LIBBZ2 +LIBZ +DISTCHECK_CONFIGURE_FLAGS +EXTRA_LIBPCRECPP_LDFLAGS +EXTRA_LIBPCREPOSIX_LDFLAGS +EXTRA_LIBPCRE32_LDFLAGS +EXTRA_LIBPCRE16_LDFLAGS +EXTRA_LIBPCRE_LDFLAGS +PTHREAD_CFLAGS +PTHREAD_LIBS +PTHREAD_CC +ax_pthread_config +PCRE_STATIC_CFLAG +LIBREADLINE +WITH_VALGRIND_FALSE +WITH_VALGRIND_TRUE +WITH_UTF_FALSE +WITH_UTF_TRUE +WITH_JIT_FALSE +WITH_JIT_TRUE +WITH_REBUILD_CHARTABLES_FALSE +WITH_REBUILD_CHARTABLES_TRUE +WITH_PCRE_CPP_FALSE +WITH_PCRE_CPP_TRUE +WITH_PCRE32_FALSE +WITH_PCRE32_TRUE +WITH_PCRE16_FALSE +WITH_PCRE16_TRUE +WITH_PCRE8_FALSE +WITH_PCRE8_TRUE +pcre_have_bits_type_traits +pcre_have_type_traits +pcre_have_ulong_long +pcre_have_long_long +enable_cpp +enable_pcre32 +enable_pcre16 +enable_pcre8 +PCRE_DATE +PCRE_PRERELEASE +PCRE_MINOR +PCRE_MAJOR +HAVE_VISIBILITY +VISIBILITY_CXXFLAGS +VISIBILITY_CFLAGS +CXXCPP +LT_SYS_LIBRARY_PATH +OTOOL64 +OTOOL +LIPO +NMEDIT +DSYMUTIL +MANIFEST_TOOL +RANLIB +LN_S +NM +ac_ct_DUMPBIN +DUMPBIN +LD +FGREP +SED +LIBTOOL +OBJDUMP +DLLTOOL +AS +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +EGREP +GREP +CPP +am__fastdepCXX_FALSE +am__fastdepCXX_TRUE +CXXDEPMODE +ac_ct_CXX +CXXFLAGS +CXX +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +am__nodep +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +ac_ct_AR +AR +AM_BACKSLASH +AM_DEFAULT_VERBOSITY +AM_DEFAULT_V +AM_V +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +MKDIR_P +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +am__isrc +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL +am__quote' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_silent_rules +enable_dependency_tracking +enable_shared +enable_static +with_pic +enable_fast_install +with_aix_soname +with_gnu_ld +with_sysroot +enable_libtool_lock +enable_pcre8 +enable_pcre16 +enable_pcre32 +enable_cpp +enable_jit +enable_pcregrep_jit +enable_rebuild_chartables +enable_utf8 +enable_utf +enable_unicode_properties +enable_newline_is_cr +enable_newline_is_lf +enable_newline_is_crlf +enable_newline_is_anycrlf +enable_newline_is_any +enable_bsr_anycrlf +enable_ebcdic +enable_ebcdic_nl25 +enable_stack_for_recursion +enable_pcregrep_libz +enable_pcregrep_libbz2 +with_pcregrep_bufsize +enable_pcretest_libedit +enable_pcretest_libreadline +with_posix_malloc_threshold +with_link_size +with_parens_nest_limit +with_match_limit +with_match_limit_recursion +enable_valgrind +enable_coverage +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CXX +CXXFLAGS +CCC +CPP +LT_SYS_LIBRARY_PATH +CXXCPP +PKG_CONFIG +PKG_CONFIG_PATH +PKG_CONFIG_LIBDIR +VALGRIND_CFLAGS +VALGRIND_LIBS +LCOV +GENHTML' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures PCRE 8.44 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/pcre] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of PCRE 8.44:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-silent-rules less verbose build output (undo: "make V=1") + --disable-silent-rules verbose build output (undo: "make V=0") + --enable-dependency-tracking + do not reject slow dependency extractors + --disable-dependency-tracking + speeds up one-time build + --enable-shared[=PKGS] build shared libraries [default=yes] + --enable-static[=PKGS] build static libraries [default=yes] + --enable-fast-install[=PKGS] + optimize for fast installation [default=yes] + --disable-libtool-lock avoid locking (might break parallel builds) + --disable-pcre8 disable 8 bit character support + --enable-pcre16 enable 16 bit character support + --enable-pcre32 enable 32 bit character support + --disable-cpp disable C++ support + --enable-jit enable Just-In-Time compiling support + --disable-pcregrep-jit disable JIT support in pcregrep + --enable-rebuild-chartables + rebuild character tables in current locale + --enable-utf8 another name for --enable-utf. Kept only for + compatibility reasons + --enable-utf enable UTF-8/16/32 support (incompatible with + --enable-ebcdic) + --enable-unicode-properties + enable Unicode properties support (implies + --enable-utf) + --enable-newline-is-cr use CR as newline character + --enable-newline-is-lf use LF as newline character (default) + --enable-newline-is-crlf + use CRLF as newline sequence + --enable-newline-is-anycrlf + use CR, LF, or CRLF as newline sequence + --enable-newline-is-any use any valid Unicode newline sequence + --enable-bsr-anycrlf \R matches only CR, LF, CRLF by default + --enable-ebcdic assume EBCDIC coding rather than ASCII; incompatible + with --enable-utf; use only in (uncommon) EBCDIC + environments; it implies --enable-rebuild-chartables + --enable-ebcdic-nl25 set EBCDIC code for NL to 0x25 instead of 0x15; it + implies --enable-ebcdic + --disable-stack-for-recursion + don't use stack recursion when matching + --enable-pcregrep-libz link pcregrep with libz to handle .gz files + --enable-pcregrep-libbz2 + link pcregrep with libbz2 to handle .bz2 files + --enable-pcretest-libedit + link pcretest with libedit + --enable-pcretest-libreadline + link pcretest with libreadline + --enable-valgrind valgrind support + --enable-coverage enable code coverage reports using gcov + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use + both] + --with-aix-soname=aix|svr4|both + shared library versioning (aka "SONAME") variant to + provide on AIX, [default=aix]. + --with-gnu-ld assume the C compiler uses GNU ld [default=no] + --with-sysroot[=DIR] Search for dependent libraries within DIR (or the + compiler's sysroot if not specified). + --with-pcregrep-bufsize=N + pcregrep buffer size (default=20480, minimum=8192) + --with-posix-malloc-threshold=NBYTES + threshold for POSIX malloc usage (default=10) + --with-link-size=N internal link size (2, 3, or 4 allowed; default=2) + --with-parens-nest-limit=N + nested parentheses limit (default=250) + --with-match-limit=N default limit on internal looping (default=10000000) + --with-match-limit-recursion=N + default limit on internal recursion + (default=MATCH_LIMIT) + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CXX C++ compiler command + CXXFLAGS C++ compiler flags + CPP C preprocessor + LT_SYS_LIBRARY_PATH + User-defined run-time library search path. + CXXCPP C++ preprocessor + PKG_CONFIG path to pkg-config utility + PKG_CONFIG_PATH + directories to add to pkg-config's search path + PKG_CONFIG_LIBDIR + path overriding pkg-config's built-in search path + VALGRIND_CFLAGS + C compiler flags for VALGRIND, overriding pkg-config + VALGRIND_LIBS + linker flags for VALGRIND, overriding pkg-config + LCOV the ltp lcov program + GENHTML the ltp genhtml program + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to the package provider. +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +PCRE configure 8.44 +generated by GNU Autoconf 2.69 + +Copyright (C) 2012 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_cxx_try_compile LINENO +# ---------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_compile + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile + +# ac_fn_c_find_intX_t LINENO BITS VAR +# ----------------------------------- +# Finds a signed integer type with width BITS, setting cache variable VAR +# accordingly. +ac_fn_c_find_intX_t () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for int$2_t" >&5 +$as_echo_n "checking for int$2_t... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + # Order is important - never check a type that is potentially smaller + # than half of the expected target width. + for ac_type in int$2_t 'int' 'long int' \ + 'long long int' 'short int' 'signed char'; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default + enum { N = $2 / 2 - 1 }; +int +main () +{ +static int test_array [1 - 2 * !(0 < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1))]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default + enum { N = $2 / 2 - 1 }; +int +main () +{ +static int test_array [1 - 2 * !(($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1) + < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 2))]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + case $ac_type in #( + int$2_t) : + eval "$3=yes" ;; #( + *) : + eval "$3=\$ac_type" ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + if eval test \"x\$"$3"\" = x"no"; then : + +else + break +fi + done +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_find_intX_t + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func + +# ac_fn_cxx_try_cpp LINENO +# ------------------------ +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_cpp + +# ac_fn_cxx_try_link LINENO +# ------------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_link + +# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists, giving a warning if it cannot be compiled using +# the include files in INCLUDES and setting the cache variable VAR +# accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_mongrel + +# ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES +# --------------------------------------------------------- +# Tests whether HEADER exists, giving a warning if it cannot be compiled using +# the include files in INCLUDES and setting the cache variable VAR +# accordingly. +ac_fn_cxx_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_cxx_check_header_mongrel + +# ac_fn_cxx_check_type LINENO TYPE VAR INCLUDES +# --------------------------------------------- +# Tests whether TYPE exists after having included INCLUDES, setting cache +# variable VAR accordingly. +ac_fn_cxx_check_type () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof ($2)) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof (($2))) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + +else + eval "$3=yes" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_cxx_check_type + +# ac_fn_c_check_type LINENO TYPE VAR INCLUDES +# ------------------------------------------- +# Tests whether TYPE exists after having included INCLUDES, setting cache +# variable VAR accordingly. +ac_fn_c_check_type () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof ($2)) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof (($2))) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + eval "$3=yes" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_type +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by PCRE $as_me 8.44, which was +generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +am__api_version='1.16' + +ac_aux_dir= +for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if ${ac_cv_path_install+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken + alias in your environment" "$LINENO" 5 + fi + if test "$2" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi + +rm -f conftest.file + +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` + +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} +fi + +if test x"${install_sh+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 +$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if ${ac_cv_path_mkdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue + case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir (GNU coreutils) '* | \ + 'mkdir (coreutils) '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + break 3;; + esac + done + done + done +IFS=$as_save_IFS + +fi + + test -d ./--version && rmdir ./--version + if test "${ac_cv_path_mkdir+set}" = set; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +$as_echo "$MKDIR_P" >&6; } + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AWK+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +# Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=1;; +esac +am_make=${MAKE-make} +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +$as_echo_n "checking whether $am_make supports nested variables... " >&6; } +if ${am_cv_make_support_nested_variables+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $as_echo 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +$as_echo "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='pcre' + VERSION='8.44' + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define VERSION "$VERSION" +_ACEOF + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +mkdir_p='$(MKDIR_P)' + +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. +# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AMTAR='$${TAR-tar}' + + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar pax cpio none' + +am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' + + + + + + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 + fi +fi + +# Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=0;; +esac +am_make=${MAKE-make} +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +$as_echo_n "checking whether $am_make supports nested variables... " >&6; } +if ${am_cv_make_support_nested_variables+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $as_echo 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +$as_echo "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + +ac_config_headers="$ac_config_headers config.h" + + +# This is a new thing required to stop a warning from automake 1.12 +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5 +$as_echo_n "checking whether ${MAKE-make} supports the include directive... " >&6; } +cat > confinc.mk << 'END' +am__doit: + @echo this is the am__doit target >confinc.out +.PHONY: am__doit +END +am__include="#" +am__quote= +# BSD make does it like this. +echo '.include "confinc.mk" # ignored' > confmf.BSD +# Other make implementations (GNU, Solaris 10, AIX) do it like this. +echo 'include confinc.mk # ignored' > confmf.GNU +_am_result=no +for s in GNU BSD; do + { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5 + (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + case $?:`cat confinc.out 2>/dev/null` in #( + '0:this is the am__doit target') : + case $s in #( + BSD) : + am__include='.include' am__quote='"' ;; #( + *) : + am__include='include' am__quote='' ;; +esac ;; #( + *) : + ;; +esac + if test "$am__include" != "#"; then + _am_result="yes ($s style)" + break + fi +done +rm -f confinc.* confmf.* +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5 +$as_echo "${_am_result}" >&6; } + +# Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then : + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if ${ac_cv_objext+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } +if ${am_cv_prog_cc_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +$as_echo "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + + +if test -n "$ac_tool_prefix"; then + for ac_prog in ar lib "link -lib" + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AR" && break + done +fi +if test -z "$AR"; then + ac_ct_AR=$AR + for ac_prog in ar lib "link -lib" +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_AR" && break +done + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +fi + +: ${AR=ar} + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the archiver ($AR) interface" >&5 +$as_echo_n "checking the archiver ($AR) interface... " >&6; } +if ${am_cv_ar_interface+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + am_cv_ar_interface=ar + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int some_variable = 0; +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5 + (eval $am_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -eq 0; then + am_cv_ar_interface=ar + else + am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5 + (eval $am_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -eq 0; then + am_cv_ar_interface=lib + else + am_cv_ar_interface=unknown + fi + fi + rm -f conftest.lib libconftest.a + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_ar_interface" >&5 +$as_echo "$am_cv_ar_interface" >&6; } + +case $am_cv_ar_interface in +ar) + ;; +lib) + # Microsoft lib, so override with the ar-lib wrapper script. + # FIXME: It is wrong to rewrite AR. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__AR in this case, + # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something + # similar. + AR="$am_aux_dir/ar-lib $AR" + ;; +unknown) + as_fn_error $? "could not determine $AR interface" "$LINENO" 5 + ;; +esac + + +# This was added at the suggestion of libtoolize (03-Jan-10) + + +# The default CFLAGS and CXXFLAGS in Autoconf are "-g -O2" for gcc and just +# "-g" for any other compiler. There doesn't seem to be a standard way of +# getting rid of the -g (which I don't think is needed for a production +# library). This fudge seems to achieve the necessary. First, we remember the +# externally set values of CFLAGS and CXXFLAGS. Then call the AC_PROG_CC and +# AC_PROG_CXX macros to find the compilers - if CFLAGS and CXXFLAGS are not +# set, they will be set to Autoconf's defaults. Afterwards, if the original +# values were not set, remove the -g from the Autoconf defaults. +# (PH 02-May-07) + +remember_set_CFLAGS="$CFLAGS" +remember_set_CXXFLAGS="$CXXFLAGS" + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } +if ${am_cv_prog_cc_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +$as_echo "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 +$as_echo "$CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 +$as_echo "$ac_ct_CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi +fi + + fi +fi +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 +$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } +if ${ac_cv_cxx_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +$as_echo_n "checking whether $CXX accepts -g... " >&6; } +if ${ac_cv_prog_cxx_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +else + CXXFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + +else + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +$as_echo "$ac_cv_prog_cxx_g" >&6; } +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CXX" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CXX_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' +else + am__fastdepCXX_TRUE='#' + am__fastdepCXX_FALSE= +fi + + + + +if test "x$remember_set_CFLAGS" = "x" +then + if test "$CFLAGS" = "-g -O2" + then + CFLAGS="-O2" + elif test "$CFLAGS" = "-g" + then + CFLAGS="" + fi +fi + +if test "x$remember_set_CXXFLAGS" = "x" +then + if test "$CXXFLAGS" = "-g -O2" + then + CXXFLAGS="-O2" + elif test "$CXXFLAGS" = "-g" + then + CXXFLAGS="" + fi +fi + +# AC_PROG_CXX will return "g++" even if no c++ compiler is installed. +# Check for that case, and just disable c++ code if g++ doesn't run. +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + +else + CXX=""; CXXCP=""; CXXFLAGS="" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# Check for a 64-bit integer type +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_GREP" || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if ${ac_cv_path_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP" || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +ac_fn_c_find_intX_t "$LINENO" "64" "ac_cv_c_int64_t" +case $ac_cv_c_int64_t in #( + no|yes) ;; #( + *) + +cat >>confdefs.h <<_ACEOF +#define int64_t $ac_cv_c_int64_t +_ACEOF +;; +esac + + + +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if ${ac_cv_build+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if ${ac_cv_host+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + +enable_win32_dll=yes + +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. +set dummy ${ac_tool_prefix}as; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AS+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AS"; then + ac_cv_prog_AS="$AS" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AS="${ac_tool_prefix}as" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AS=$ac_cv_prog_AS +if test -n "$AS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 +$as_echo "$AS" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_AS"; then + ac_ct_AS=$AS + # Extract the first word of "as", so it can be a program name with args. +set dummy as; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AS+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AS"; then + ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AS="as" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AS=$ac_cv_prog_ac_ct_AS +if test -n "$ac_ct_AS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 +$as_echo "$ac_ct_AS" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_AS" = x; then + AS="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AS=$ac_ct_AS + fi +else + AS="$ac_cv_prog_AS" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +$as_echo "$DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +$as_echo "$ac_ct_DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +$as_echo "$OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +$as_echo "$ac_ct_OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + + ;; +esac + +test -z "$AS" && AS=as + + + + + +test -z "$DLLTOOL" && DLLTOOL=dlltool + + + + + +test -z "$OBJDUMP" && OBJDUMP=objdump + + + + + + + +case `pwd` in + *\ * | *\ *) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 +$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; +esac + + + +macro_version='2.4.6.42-b88ce' +macro_revision='2.4.6.42' + + + + + + + + + + + + + +ltmain=$ac_aux_dir/ltmain.sh + +# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 +$as_echo_n "checking how to print strings... " >&6; } +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "" +} + +case $ECHO in + printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 +$as_echo "printf" >&6; } ;; + print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 +$as_echo "print -r" >&6; } ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 +$as_echo "cat" >&6; } ;; +esac + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if ${ac_cv_path_SED+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for ac_i in 1 2 3 4 5 6 7; do + ac_script="$ac_script$as_nl$ac_script" + done + echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed + { ac_script=; unset ac_script;} + if test -z "$SED"; then + ac_path_SED_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_SED" || continue +# Check for GNU ac_path_SED and select it if it is found. + # Check for GNU $ac_path_SED +case `"$ac_path_SED" --version 2>&1` in +*GNU*) + ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo '' >> "conftest.nl" + "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_SED_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_SED="$ac_path_SED" + ac_path_SED_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_SED_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_SED"; then + as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 + fi +else + ac_cv_path_SED=$SED +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +$as_echo "$ac_cv_path_SED" >&6; } + SED="$ac_cv_path_SED" + rm -f conftest.sed + +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 +$as_echo_n "checking for fgrep... " >&6; } +if ${ac_cv_path_FGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 + then ac_cv_path_FGREP="$GREP -F" + else + if test -z "$FGREP"; then + ac_path_FGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in fgrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_FGREP" || continue +# Check for GNU ac_path_FGREP and select it if it is found. + # Check for GNU $ac_path_FGREP +case `"$ac_path_FGREP" --version 2>&1` in +*GNU*) + ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'FGREP' >> "conftest.nl" + "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_FGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_FGREP="$ac_path_FGREP" + ac_path_FGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_FGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_FGREP"; then + as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_FGREP=$FGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 +$as_echo "$ac_cv_path_FGREP" >&6; } + FGREP="$ac_cv_path_FGREP" + + +test -z "$GREP" && GREP=grep + + + + + + + + + + + + + + + + + + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test yes = "$GCC"; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return, which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD=$ac_prog + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test yes = "$with_gnu_ld"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD=$ac_dir/$ac_prog + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 +$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } +if ${lt_cv_path_NM+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM=$NM +else + lt_nm_to_check=${ac_tool_prefix}nm + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + tmp_nm=$ac_dir/$lt_tmp_nm + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the 'sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty + case $build_os in + mingw*) lt_bad_file=conftest.nm/nofile ;; + *) lt_bad_file=/dev/null ;; + esac + case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in + *$lt_bad_file* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break 2 + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break 2 + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS=$lt_save_ifs + done + : ${lt_cv_path_NM=no} +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 +$as_echo "$lt_cv_path_NM" >&6; } +if test no != "$lt_cv_path_NM"; then + NM=$lt_cv_path_NM +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + if test -n "$ac_tool_prefix"; then + for ac_prog in dumpbin "link -dump" + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DUMPBIN"; then + ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DUMPBIN=$ac_cv_prog_DUMPBIN +if test -n "$DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 +$as_echo "$DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$DUMPBIN" && break + done +fi +if test -z "$DUMPBIN"; then + ac_ct_DUMPBIN=$DUMPBIN + for ac_prog in dumpbin "link -dump" +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DUMPBIN"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN +if test -n "$ac_ct_DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 +$as_echo "$ac_ct_DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_DUMPBIN" && break +done + + if test "x$ac_ct_DUMPBIN" = x; then + DUMPBIN=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DUMPBIN=$ac_ct_DUMPBIN + fi +fi + + case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols -headers" + ;; + *) + DUMPBIN=: + ;; + esac + fi + + if test : != "$DUMPBIN"; then + NM=$DUMPBIN + fi +fi +test -z "$NM" && NM=nm + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 +$as_echo_n "checking the name lister ($NM) interface... " >&6; } +if ${lt_cv_nm_interface+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: output\"" >&5) + cat conftest.out >&5 + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 +$as_echo "$lt_cv_nm_interface" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +$as_echo "no, using $LN_S" >&6; } +fi + +# find the maximum length of command line arguments +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 +$as_echo_n "checking the maximum length of command line arguments... " >&6; } +if ${lt_cv_sys_max_cmd_len+:} false; then : + $as_echo_n "(cached) " >&6 +else + i=0 + teststring=ABCD + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len" && \ + test undefined != "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test X`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test 17 != "$i" # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac + +fi + +if test -n "$lt_cv_sys_max_cmd_len"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 +$as_echo "$lt_cv_sys_max_cmd_len" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 +$as_echo "none" >&6; } +fi +max_cmd_len=$lt_cv_sys_max_cmd_len + + + + + + +: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi + + + + + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 +$as_echo_n "checking how to convert $build file names to $host format... " >&6; } +if ${lt_cv_to_host_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac + +fi + +to_host_file_cmd=$lt_cv_to_host_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 +$as_echo "$lt_cv_to_host_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 +$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } +if ${lt_cv_to_tool_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + #assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac + +fi + +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 +$as_echo "$lt_cv_to_tool_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 +$as_echo_n "checking for $LD option to reload object files... " >&6; } +if ${lt_cv_ld_reload_flag+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_reload_flag='-r' +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 +$as_echo "$lt_cv_ld_reload_flag" >&6; } +reload_flag=$lt_cv_ld_reload_flag +case $reload_flag in +"" | " "*) ;; +*) reload_flag=" $reload_flag" ;; +esac +reload_cmds='$LD$reload_flag -o $output$reload_objs' +case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + if test yes != "$GCC"; then + reload_cmds=false + fi + ;; + darwin*) + if test yes = "$GCC"; then + reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs' + else + reload_cmds='$LD$reload_flag -o $output$reload_objs' + fi + ;; +esac + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +$as_echo "$OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +$as_echo "$ac_ct_OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + +test -z "$OBJDUMP" && OBJDUMP=objdump + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 +$as_echo_n "checking how to recognize dependent libraries... " >&6; } +if ${lt_cv_deplibs_check_method+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# 'unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# that responds to the $file_magic_cmd with a given extended regex. +# If you have 'file' or equivalent on your system and you're not sure +# whether 'pass_all' will *always* work, you probably want this one. + +case $host_os in +aix[4-9]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[45]*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + if ( file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[3-9]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd* | bitrig*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +os2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 +$as_echo "$lt_cv_deplibs_check_method" >&6; } + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + + + + + + + + + + + + + + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +$as_echo "$DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +$as_echo "$ac_ct_DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + +test -z "$DLLTOOL" && DLLTOOL=dlltool + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 +$as_echo_n "checking how to associate runtime and link libraries... " >&6; } +if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh; + # decide which one to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd=$ECHO + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 +$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + + + + + + + +if test -n "$ac_tool_prefix"; then + for ac_prog in ar + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AR" && break + done +fi +if test -z "$AR"; then + ac_ct_AR=$AR + for ac_prog in ar +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_AR" && break +done + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +fi + +: ${AR=ar} + + + + + + +# Use ARFLAGS variable as AR's operation code to sync the variable naming with +# Automake. If both AR_FLAGS and ARFLAGS are specified, AR_FLAGS should have +# higher priority because thats what people were doing historically (setting +# ARFLAGS for automake and AR_FLAGS for libtool). FIXME: Make the AR_FLAGS +# variable obsoleted/removed. + +test ${AR_FLAGS+y} || AR_FLAGS=${ARFLAGS-cr} +lt_ar_flags=$AR_FLAGS + + + + + + +# Make AR_FLAGS overridable by 'make ARFLAGS='. Don't try to run-time override +# by AR_FLAGS because that was never working and AR_FLAGS is about to die. + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 +$as_echo_n "checking for archiver @FILE support... " >&6; } +if ${lt_cv_ar_at_file+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ar_at_file=no + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test 0 -eq "$ac_status"; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test 0 -ne "$ac_status"; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 +$as_echo "$lt_cv_ar_at_file" >&6; } + +if test no = "$lt_cv_ar_at_file"; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +test -z "$STRIP" && STRIP=: + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +test -z "$RANLIB" && RANLIB=: + + + + + + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + bitrig* | openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Check for command to grab the raw symbol name followed by C symbol from nm. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 +$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } +if ${lt_cv_sys_global_symbol_pipe+:} false; then : + $as_echo_n "(cached) " >&6 +else + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[BCDEGRST]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([_A-Za-z][_A-Za-z0-9]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[ABCDGISTW]' + ;; +hpux*) + if test ia64 = "$host_cpu"; then + symcode='[ABCDEGRST]' + fi + ;; +irix* | nonstopux*) + symcode='[BCDEGRST]' + ;; +osf*) + symcode='[BCDEGQRST]' + ;; +solaris*) + symcode='[BDRT]' + ;; +sco3.2v5*) + symcode='[DT]' + ;; +sysv4.2uw2*) + symcode='[DT]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[ABDT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[ABCDGIRSTW]' ;; +esac + +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Gets list of data symbols to import. + lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" + # Adjust the below global symbol transforms to fixup imported variables. + lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" + lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" + lt_c_name_lib_hook="\ + -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ + -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" +else + # Disable hooks by default. + lt_cv_sys_global_symbol_to_import= + lt_cdecl_hook= + lt_c_name_hook= + lt_c_name_lib_hook= +fi + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n"\ +$lt_cdecl_hook\ +" -e 's/^T .* \(.*\)$/extern int \1();/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ +$lt_c_name_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" + +# Transform an extracted symbol line into symbol name with lib prefix and +# symbol address. +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ +$lt_c_name_lib_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function, + # D for any global variable and I for any imported variable. + # Also find C++ and __fastcall symbols from MSVC++ or ICC, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK '"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ +" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ +" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ +" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ +" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Now try to grab the symbols. + nlist=conftest.nm + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 + (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS=conftstm.$ac_objext + CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest$ac_exeext; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test yes = "$pipe_works"; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done + +fi + +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 +$as_echo "failed" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +$as_echo "ok" >&6; } +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 +$as_echo_n "checking for sysroot... " >&6; } + +# Check whether --with-sysroot was given. +if test "${with_sysroot+set}" = set; then : + withval=$with_sysroot; +else + with_sysroot=no +fi + + +lt_sysroot= +case $with_sysroot in #( + yes) + if test yes = "$GCC"; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5 +$as_echo "$with_sysroot" >&6; } + as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 + ;; +esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 +$as_echo "${lt_sysroot:-no}" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5 +$as_echo_n "checking for a working dd... " >&6; } +if ${ac_cv_path_lt_DD+:} false; then : + $as_echo_n "(cached) " >&6 +else + printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +: ${lt_DD:=$DD} +if test -z "$lt_DD"; then + ac_path_lt_DD_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in dd; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_lt_DD="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_lt_DD" || continue +if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: +fi + $ac_path_lt_DD_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_lt_DD"; then + : + fi +else + ac_cv_path_lt_DD=$lt_DD +fi + +rm -f conftest.i conftest2.i conftest.out +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 +$as_echo "$ac_cv_path_lt_DD" >&6; } + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5 +$as_echo_n "checking how to truncate binary pipes... " >&6; } +if ${lt_cv_truncate_bin+:} false; then : + $as_echo_n "(cached) " >&6 +else + printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +lt_cv_truncate_bin= +if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" +fi +rm -f conftest.i conftest2.i conftest.out +test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 +$as_echo "$lt_cv_truncate_bin" >&6; } + + + + + + + +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in $*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} + +# Check whether --enable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then : + enableval=$enable_libtool_lock; +fi + +test no = "$enable_libtool_lock" || enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out what ABI is being produced by ac_compile, and set mode + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE=32 + ;; + *ELF-64*) + HPUX_IA64_MODE=64 + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + if test yes = "$lt_cv_prog_gnu_ld"; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +mips64*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + emul=elf + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + emul="${emul}32" + ;; + *64-bit*) + emul="${emul}64" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *MSB*) + emul="${emul}btsmip" + ;; + *LSB*) + emul="${emul}ltsmip" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *N32*) + emul="${emul}n32" + ;; + esac + LD="${LD-ld} -m $emul" + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. Note that the listed cases only cover the + # situations where additional linker options are needed (such as when + # doing 32-bit compilation for a host where ld defaults to 64-bit, or + # vice versa); the common cases where no linker options are needed do + # not appear in the list. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + case `/usr/bin/file conftest.o` in + *x86-64*) + LD="${LD-ld} -m elf32_x86_64" + ;; + *) + LD="${LD-ld} -m elf_i386" + ;; + esac + ;; + powerpc64le-*linux*) + LD="${LD-ld} -m elf32lppclinux" + ;; + powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + powerpcle-*linux*) + LD="${LD-ld} -m elf64lppc" + ;; + powerpc-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS -belf" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 +$as_echo_n "checking whether the C compiler needs -belf... " >&6; } +if ${lt_cv_cc_needs_belf+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_cc_needs_belf=yes +else + lt_cv_cc_needs_belf=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 +$as_echo "$lt_cv_cc_needs_belf" >&6; } + if test yes != "$lt_cv_cc_needs_belf"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS=$SAVE_CFLAGS + fi + ;; +*-*solaris*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*|x86_64-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD=${LD-ld}_sol2 + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks=$enable_libtool_lock + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. +set dummy ${ac_tool_prefix}mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$MANIFEST_TOOL"; then + ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL +if test -n "$MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 +$as_echo "$MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_MANIFEST_TOOL"; then + ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL + # Extract the first word of "mt", so it can be a program name with args. +set dummy mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_MANIFEST_TOOL"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL +if test -n "$ac_ct_MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 +$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_MANIFEST_TOOL" = x; then + MANIFEST_TOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL + fi +else + MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" +fi + +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 +$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } +if ${lt_cv_path_mainfest_tool+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&5 + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 +$as_echo "$lt_cv_path_mainfest_tool" >&6; } +if test yes != "$lt_cv_path_mainfest_tool"; then + MANIFEST_TOOL=: +fi + + + + + + + case $host_os in + rhapsody* | darwin*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. +set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DSYMUTIL"; then + ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DSYMUTIL=$ac_cv_prog_DSYMUTIL +if test -n "$DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 +$as_echo "$DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DSYMUTIL"; then + ac_ct_DSYMUTIL=$DSYMUTIL + # Extract the first word of "dsymutil", so it can be a program name with args. +set dummy dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DSYMUTIL"; then + ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL +if test -n "$ac_ct_DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 +$as_echo "$ac_ct_DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DSYMUTIL" = x; then + DSYMUTIL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DSYMUTIL=$ac_ct_DSYMUTIL + fi +else + DSYMUTIL="$ac_cv_prog_DSYMUTIL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. +set dummy ${ac_tool_prefix}nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NMEDIT"; then + ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +NMEDIT=$ac_cv_prog_NMEDIT +if test -n "$NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 +$as_echo "$NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_NMEDIT"; then + ac_ct_NMEDIT=$NMEDIT + # Extract the first word of "nmedit", so it can be a program name with args. +set dummy nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_NMEDIT"; then + ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_NMEDIT="nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT +if test -n "$ac_ct_NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 +$as_echo "$ac_ct_NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_NMEDIT" = x; then + NMEDIT=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + NMEDIT=$ac_ct_NMEDIT + fi +else + NMEDIT="$ac_cv_prog_NMEDIT" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. +set dummy ${ac_tool_prefix}lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$LIPO"; then + ac_cv_prog_LIPO="$LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_LIPO="${ac_tool_prefix}lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +LIPO=$ac_cv_prog_LIPO +if test -n "$LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 +$as_echo "$LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_LIPO"; then + ac_ct_LIPO=$LIPO + # Extract the first word of "lipo", so it can be a program name with args. +set dummy lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_LIPO"; then + ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_LIPO="lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO +if test -n "$ac_ct_LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 +$as_echo "$ac_ct_LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_LIPO" = x; then + LIPO=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + LIPO=$ac_ct_LIPO + fi +else + LIPO="$ac_cv_prog_LIPO" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL"; then + ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL="${ac_tool_prefix}otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL=$ac_cv_prog_OTOOL +if test -n "$OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 +$as_echo "$OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL"; then + ac_ct_OTOOL=$OTOOL + # Extract the first word of "otool", so it can be a program name with args. +set dummy otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL"; then + ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL="otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL +if test -n "$ac_ct_OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 +$as_echo "$ac_ct_OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL" = x; then + OTOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL=$ac_ct_OTOOL + fi +else + OTOOL="$ac_cv_prog_OTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL64"; then + ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL64=$ac_cv_prog_OTOOL64 +if test -n "$OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 +$as_echo "$OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL64"; then + ac_ct_OTOOL64=$OTOOL64 + # Extract the first word of "otool64", so it can be a program name with args. +set dummy otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL64"; then + ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL64="otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 +if test -n "$ac_ct_OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 +$as_echo "$ac_ct_OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL64" = x; then + OTOOL64=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL64=$ac_ct_OTOOL64 + fi +else + OTOOL64="$ac_cv_prog_OTOOL64" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 +$as_echo_n "checking for -single_module linker flag... " >&6; } +if ${lt_cv_apple_cc_single_mod+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_apple_cc_single_mod=no + if test -z "$LT_MULTI_MODULE"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&5 + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test 0 = "$_lt_result"; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&5 + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 +$as_echo "$lt_cv_apple_cc_single_mod" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 +$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } +if ${lt_cv_ld_exported_symbols_list+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_ld_exported_symbols_list=yes +else + lt_cv_ld_exported_symbols_list=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 +$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 +$as_echo_n "checking for -force_load linker flag... " >&6; } +if ${lt_cv_ld_force_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 + echo "$AR $AR_FLAGS libconftest.a conftest.o" >&5 + $AR $AR_FLAGS libconftest.a conftest.o 2>&5 + echo "$RANLIB libconftest.a" >&5 + $RANLIB libconftest.a 2>&5 + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&5 + elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&5 + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 +$as_echo "$lt_cv_ld_force_load" >&6; } + case $host_os in + rhapsody* | darwin1.[012]) + _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[91]*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + 10.[012][,.]*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test yes = "$lt_cv_apple_cc_single_mod"; then + _lt_dar_single_mod='$single_module' + fi + if test yes = "$lt_cv_ld_exported_symbols_list"; then + _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' + fi + if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac + +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x$2 in + x) + ;; + *:) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" + ;; + x:*) + eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" + ;; + *) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" + ;; + esac +} + +for ac_header in dlfcn.h +do : + ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default +" +if test "x$ac_cv_header_dlfcn_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_DLFCN_H 1 +_ACEOF + +fi + +done + + + +func_stripname_cnf () +{ + case $2 in + .*) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%\\\\$2\$%%"`;; + *) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%$2\$%%"`;; + esac +} # func_stripname_cnf + + + + + +# Set options + + + + enable_dlopen=no + + + + # Check whether --enable-shared was given. +if test "${enable_shared+set}" = set; then : + enableval=$enable_shared; p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else + enable_shared=yes +fi + + + + + + + + + + # Check whether --enable-static was given. +if test "${enable_static+set}" = set; then : + enableval=$enable_static; p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else + enable_static=yes +fi + + + + + + + + + + +# Check whether --with-pic was given. +if test "${with_pic+set}" = set; then : + withval=$with_pic; lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for lt_pkg in $withval; do + IFS=$lt_save_ifs + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else + pic_mode=default +fi + + + + + + + + + # Check whether --enable-fast-install was given. +if test "${enable_fast_install+set}" = set; then : + enableval=$enable_fast_install; p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else + enable_fast_install=yes +fi + + + + + + + + + shared_archive_member_spec= +case $host,$enable_shared in +power*-*-aix[5-9]*,yes) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5 +$as_echo_n "checking which variant of shared library versioning to provide... " >&6; } + +# Check whether --with-aix-soname was given. +if test "${with_aix_soname+set}" = set; then : + withval=$with_aix_soname; case $withval in + aix|svr4|both) + ;; + *) + as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5 + ;; + esac + lt_cv_with_aix_soname=$with_aix_soname +else + if ${lt_cv_with_aix_soname+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_with_aix_soname=aix +fi + + with_aix_soname=$lt_cv_with_aix_soname +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 +$as_echo "$with_aix_soname" >&6; } + if test aix != "$with_aix_soname"; then + # For the AIX way of multilib, we name the shared archive member + # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', + # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. + # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, + # the AIX toolchain works better with OBJECT_MODE set (default 32). + if test 64 = "${OBJECT_MODE-32}"; then + shared_archive_member_spec=shr_64 + else + shared_archive_member_spec=shr + fi + fi + ;; +*) + with_aix_soname=aix + ;; +esac + + + + + + + + + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS=$ltmain + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +test -z "$LN_S" && LN_S="ln -s" + + + + + + + + + + + + + + +if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 +$as_echo_n "checking for objdir... " >&6; } +if ${lt_cv_objdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 +$as_echo "$lt_cv_objdir" >&6; } +objdir=$lt_cv_objdir + + + + + +cat >>confdefs.h <<_ACEOF +#define LT_OBJDIR "$lt_cv_objdir/" +_ACEOF + + + + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a '.a' archive for static linking (except MSVC and +# ICC, which need '.lib'). +libext=a + +with_gnu_ld=$lt_cv_prog_gnu_ld + +old_CC=$CC +old_CFLAGS=$CFLAGS + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +func_cc_basename $compiler +cc_basename=$func_cc_basename_result + + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 +$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/${ac_tool_prefix}file"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD=$lt_cv_path_MAGIC_CMD + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD + ;; +esac +fi + +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + + +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 +$as_echo_n "checking for file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/file"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD=$lt_cv_path_MAGIC_CMD + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD + ;; +esac +fi + +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + else + MAGIC_CMD=: + fi +fi + + fi + ;; +esac + +# Use C for the default configuration in the libtool script + +lt_save_CC=$CC +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +objext=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + +lt_prog_compiler_no_builtin_flag= + +if test yes = "$GCC"; then + case $cc_basename in + nvcc*) + lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; + *) + lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; + esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } + +if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then + lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" +else + : +fi + +fi + + + + + + + lt_prog_compiler_wl= +lt_prog_compiler_pic= +lt_prog_compiler_static= + + + if test yes = "$GCC"; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi + lt_prog_compiler_pic='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static='$wl-static' + ;; + esac + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + ;; + + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic=-Kconform_pic + fi + ;; + + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + lt_prog_compiler_wl='-Xlinker ' + if test -n "$lt_prog_compiler_pic"; then + lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl='-Wl,' + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + else + lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + case $cc_basename in + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static='$wl-static' + ;; + esac + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static='$wl-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + # old Intel for x86_64, which still supported -KPIC. + ecc*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='--shared' + lt_prog_compiler_static='--static' + ;; + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-qpic' + lt_prog_compiler_static='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='' + ;; + *Sun\ F* | *Sun*Fortran*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Wl,' + ;; + *Intel*\ [CF]*Compiler*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + *Portland\ Group*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + + rdos*) + lt_prog_compiler_static='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + lt_prog_compiler_wl='-Qoption ld ';; + *) + lt_prog_compiler_wl='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl='-Qoption ld ' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic='-Kconform_pic' + lt_prog_compiler_static='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_can_build_shared=no + ;; + + uts4*) + lt_prog_compiler_pic='-pic' + lt_prog_compiler_static='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared=no + ;; + esac + fi + +case $host_os in + # For platforms that do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= + ;; + *) + lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +if ${lt_cv_prog_compiler_pic+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic=$lt_prog_compiler_pic +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 +$as_echo "$lt_cv_prog_compiler_pic" >&6; } +lt_prog_compiler_pic=$lt_cv_prog_compiler_pic + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +if ${lt_cv_prog_compiler_pic_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic -DPIC" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } + +if test yes = "$lt_cv_prog_compiler_pic_works"; then + case $lt_prog_compiler_pic in + "" | " "*) ;; + *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; + esac +else + lt_prog_compiler_pic= + lt_prog_compiler_can_build_shared=no +fi + +fi + + + + + + + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if ${lt_cv_prog_compiler_static_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works=yes + fi + else + lt_cv_prog_compiler_static_works=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 +$as_echo "$lt_cv_prog_compiler_static_works" >&6; } + +if test yes = "$lt_cv_prog_compiler_static_works"; then + : +else + lt_prog_compiler_static= +fi + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + +hard_links=nottested +if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test no = "$hard_links"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag= + always_export_symbols=no + archive_cmds= + archive_expsym_cmds= + compiler_needs_object=no + enable_shared_with_static_runtimes=no + export_dynamic_flag_spec= + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + hardcode_automatic=no + hardcode_direct=no + hardcode_direct_absolute=no + hardcode_libdir_flag_spec= + hardcode_libdir_separator= + hardcode_minus_L=no + hardcode_shlibpath_var=unsupported + inherit_rpath=no + link_all_deplibs=unknown + module_cmds= + module_expsym_cmds= + old_archive_from_new_cmds= + old_archive_from_expsyms_cmds= + thread_safe_flag_spec= + whole_archive_flag_spec= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ' (' and ')$', so one must not match beginning or + # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', + # as well as any symbol that contains 'd'. + exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ and ICC port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++ or Intel C++ Compiler. + if test yes != "$GCC"; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++ or ICC) + with_gnu_ld=yes + ;; + openbsd* | bitrig*) + with_gnu_ld=no + ;; + esac + + ld_shlibs=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test yes = "$with_gnu_ld"; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; + *\ \(GNU\ Binutils\)\ [3-9]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test yes = "$lt_use_gnu_ld_interface"; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='$wl' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + export_dynamic_flag_spec='$wl--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + whole_archive_flag_spec= + fi + supports_anon_versioning=no + case `$LD -v | $SED -e 's/(^)\+)\s\+//' 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test ia64 != "$host_cpu"; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + export_dynamic_flag_spec='$wl--export-all-symbols' + allow_undefined_flag=unsupported + always_export_symbols=no + enable_shared_with_static_runtimes=yes + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs=no + fi + ;; + + haiku*) + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + link_all_deplibs=yes + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + shrext_cmds=.dll + archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes=yes + file_list_spec='@' + ;; + + interix[3-9]*) + hardcode_direct=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + export_dynamic_flag_spec='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test linux-dietlibc = "$host_os"; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test no = "$tmp_diet" + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + whole_archive_flag_spec= + tmp_sharedflag='--shared' ;; + nagfor*) # NAGFOR 5.3 + tmp_sharedflag='-Wl,-shared' ;; + xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + tcc*) + export_dynamic_flag_spec='-rdynamic' + ;; + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test no = "$ld_shlibs"; then + runpath_var= + hardcode_libdir_flag_spec= + export_dynamic_flag_spec= + whole_archive_flag_spec= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix[4-9]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then + aix_use_runtimelinking=yes + break + fi + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds='' + hardcode_direct=yes + hardcode_direct_absolute=yes + hardcode_libdir_separator=':' + link_all_deplibs=yes + file_list_spec='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # traditional, no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + hardcode_direct=no + hardcode_direct_absolute=no + ;; + esac + + if test yes = "$GCC"; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + ;; + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag="$shared_flag "'$wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + export_dynamic_flag_spec='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag=' $wl-bernotok' + allow_undefined_flag=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec='$convenience' + fi + archive_cmds_need_lc=yes + archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + bsdi[45]*) + export_dynamic_flag_spec=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++ or Intel C++ Compiler. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl* | icl*) + # Native MSVC or ICC + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + always_export_symbols=yes + file_list_spec='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, )='true' + enable_shared_with_static_runtimes=yes + exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + old_postinstall_cmds='chmod 644 $oldlib' + postlink_cmds='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC and ICC wrapper + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' + enable_shared_with_static_runtimes=yes + ;; + esac + ;; + + darwin* | rhapsody*) + + + archive_cmds_need_lc=no + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + if test yes = "$lt_cv_ld_force_load"; then + whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + + else + whole_archive_flag_spec='' + fi + link_all_deplibs=yes + allow_undefined_flag=$_lt_dar_allow_undefined + case $cc_basename in + ifort*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; then + output_verbose_link_cmd=func_echo_all + archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + archive_expsym_cmds="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + module_expsym_cmds="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" + + else + ld_shlibs=no + fi + + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9*) + if test yes = "$GCC"; then + archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + export_dynamic_flag_spec='$wl-E' + ;; + + hpux10*) + if test yes,no = "$GCC,$with_gnu_ld"; then + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='$wl-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + fi + ;; + + hpux11*) + if test yes,no = "$GCC,$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 +$as_echo_n "checking if $CC understands -b... " >&6; } +if ${lt_cv_prog_compiler__b+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler__b=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -b" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler__b=yes + fi + else + lt_cv_prog_compiler__b=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 +$as_echo "$lt_cv_prog_compiler__b" >&6; } + +if test yes = "$lt_cv_prog_compiler__b"; then + archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' +else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' +fi + + ;; + esac + fi + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct=no + hardcode_shlibpath_var=no + ;; + *) + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='$wl-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test yes = "$GCC"; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 +$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } +if ${lt_cv_irix_exported_symbol+:} false; then : + $as_echo_n "(cached) " >&6 +else + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int foo (void) { return 0; } +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_irix_exported_symbol=yes +else + lt_cv_irix_exported_symbol=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 +$as_echo "$lt_cv_irix_exported_symbol" >&6; } + if test yes = "$lt_cv_irix_exported_symbol"; then + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' + fi + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + inherit_rpath=yes + link_all_deplibs=yes + ;; + + linux*) + case $cc_basename in + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + ld_shlibs=yes + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + + *nto* | *qnx*) + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + hardcode_direct=yes + hardcode_shlibpath_var=no + hardcode_direct_absolute=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + export_dynamic_flag_spec='$wl-E' + else + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + fi + else + ld_shlibs=no + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + shrext_cmds=.dll + archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes=yes + file_list_spec='@' + ;; + + osf3*) + if test yes = "$GCC"; then + allow_undefined_flag=' $wl-expect_unresolved $wl\*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test yes = "$GCC"; then + allow_undefined_flag=' $wl-expect_unresolved $wl\*' + archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + archive_cmds_need_lc='no' + hardcode_libdir_separator=: + ;; + + solaris*) + no_undefined_flag=' -z defs' + if test yes = "$GCC"; then + wlarc='$wl' + archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='$wl' + archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. GCC discards it without '$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test yes = "$GCC"; then + whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + else + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' + fi + ;; + esac + link_all_deplibs=yes + ;; + + sunos4*) + if test sequent = "$host_vendor"; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds='$CC -r -o $output$reload_objs' + hardcode_direct=no + ;; + motorola) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag='$wl-z,text' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag='$wl-z,text' + allow_undefined_flag='$wl-z,nodefs' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='$wl-R,$libdir' + hardcode_libdir_separator=':' + link_all_deplibs=yes + export_dynamic_flag_spec='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac + + if test sni = "$host_vendor"; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + export_dynamic_flag_spec='$wl-Blargedynsym' + ;; + esac + fi + fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 +$as_echo "$ld_shlibs" >&6; } +test no = "$ld_shlibs" && can_build_shared=no + +with_gnu_ld=$with_gnu_ld + + + + + + + + + + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc=yes + + if test yes,yes = "$GCC,$enable_shared"; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +if ${lt_cv_archive_cmds_need_lc+:} false; then : + $as_echo_n "(cached) " >&6 +else + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl + pic_flag=$lt_prog_compiler_pic + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc=no + else + lt_cv_archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 +$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } + archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +if test yes = "$GCC"; then + case $host_os in + darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; + *) lt_awk_arg='/^libraries:/' ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;; + *) lt_sed_strip_eq='s|=/|/|g' ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary... + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + # ...but if some path component already ends with the multilib dir we assume + # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). + case "$lt_multi_os_dir; $lt_search_path_spec " in + "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) + lt_multi_os_dir= + ;; + esac + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" + elif test -n "$lt_multi_os_dir"; then + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS = " "; FS = "/|\n";} { + lt_foo = ""; + lt_count = 0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo = "/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[lt_foo]++; } + if (lt_freq[lt_foo] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's|/\([A-Za-z]:\)|\1|g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=.so +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + + + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='$libname$release$shared_ext$major' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test ia64 = "$host_cpu"; then + # AIX 5 supports IA64 + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line '#! .'. This would cause the generated library to + # depend on '.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a(lib.so.V)' + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='$libname$shared_ext' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl* | *,icl*) + # Native MSVC or ICC + libname_spec='$name' + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec=$LIB + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC and ICC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' + soname_spec='$libname$release$major$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + if test 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test yes = "$lt_cv_prog_gnu_ld"; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + hardcode_libdir_flag_spec='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if ${lt_cv_shlibpath_overrides_runpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec; then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' + soname_spec='$libname$shared_ext.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=sco + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || + test -n "$runpath_var" || + test yes = "$hardcode_automatic"; then + + # We can hardcode non-existent directories. + if test no != "$hardcode_direct" && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" && + test no != "$hardcode_minus_L"; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 +$as_echo "$hardcode_action" >&6; } + +if test relink = "$hardcode_action" || + test yes = "$inherit_rpath"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + if test yes != "$enable_dlopen"; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen=load_add_on + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen=LoadLibrary + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl +else + + lt_cv_dlopen=dyld + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + tpf*) + # Don't try to run any link tests for TPF. We know it's impossible + # because TPF is a cross-compiler, and we know how we open DSOs. + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + lt_cv_dlopen_self=no + ;; + + *) + ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +if test "x$ac_cv_func_shl_load" = xyes; then : + lt_cv_dlopen=shl_load +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +$as_echo_n "checking for shl_load in -ldld... " >&6; } +if ${ac_cv_lib_dld_shl_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load (); +int +main () +{ +return shl_load (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_shl_load=yes +else + ac_cv_lib_dld_shl_load=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +$as_echo "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = xyes; then : + lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld +else + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +if test "x$ac_cv_func_dlopen" = xyes; then : + lt_cv_dlopen=dlopen +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +$as_echo_n "checking for dlopen in -lsvld... " >&6; } +if ${ac_cv_lib_svld_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_svld_dlopen=yes +else + ac_cv_lib_svld_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +$as_echo "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = xyes; then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +$as_echo_n "checking for dld_link in -ldld... " >&6; } +if ${ac_cv_lib_dld_dld_link+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dld_link (); +int +main () +{ +return dld_link (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_dld_link=yes +else + ac_cv_lib_dld_dld_link=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +$as_echo "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = xyes; then : + lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test no = "$lt_cv_dlopen"; then + enable_dlopen=no + else + enable_dlopen=yes + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS=$CPPFLAGS + test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS=$LDFLAGS + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS=$LIBS + LIBS="$lt_cv_dlopen_libs $LIBS" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +$as_echo_n "checking whether a program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test yes = "$cross_compiling"; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +$as_echo "$lt_cv_dlopen_self" >&6; } + + if test yes = "$lt_cv_dlopen_self"; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self_static+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test yes = "$cross_compiling"; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +$as_echo "$lt_cv_dlopen_self_static" >&6; } + fi + + CPPFLAGS=$save_CPPFLAGS + LDFLAGS=$save_LDFLAGS + LIBS=$save_LIBS + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + + + + + + + + + + + + + + + + +striplib= +old_striplib= +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +$as_echo_n "checking whether stripping libraries is possible... " >&6; } +if test -z "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +else + if $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + old_striplib="$STRIP --strip-debug" + striplib="$STRIP --strip-unneeded" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + case $host_os in + darwin*) + # FIXME - insert some real tests, host_os isn't really good enough + striplib="$STRIP -x" + old_striplib="$STRIP -S" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + ;; + freebsd*) + if $STRIP -V 2>&1 | $GREP "elftoolchain" >/dev/null; then + old_striplib="$STRIP --strip-debug" + striplib="$STRIP --strip-unneeded" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ;; + esac + fi +fi + + + + + + + + + + + + + # Report what library types will actually be built + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +$as_echo_n "checking if libtool supports shared libraries... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +$as_echo "$can_build_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +$as_echo_n "checking whether to build shared libraries... " >&6; } + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[4-9]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +$as_echo "$enable_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +$as_echo_n "checking whether to build static libraries... " >&6; } + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +$as_echo "$enable_static" >&6; } + + + + +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC=$lt_save_CC + + if test -n "$CXX" && ( test no != "$CXX" && + ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || + (test g++ != "$CXX"))); then + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 +$as_echo_n "checking how to run the C++ preprocessor... " >&6; } +if test -z "$CXXCPP"; then + if ${ac_cv_prog_CXXCPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CXXCPP needs to be expanded + for CXXCPP in "$CXX -E" "/lib/cpp" + do + ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CXXCPP=$CXXCPP + +fi + CXXCPP=$ac_cv_prog_CXXCPP +else + ac_cv_prog_CXXCPP=$CXXCPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 +$as_echo "$CXXCPP" >&6; } +ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +else + _lt_caught_CXX_error=yes +fi + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +archive_cmds_need_lc_CXX=no +allow_undefined_flag_CXX= +always_export_symbols_CXX=no +archive_expsym_cmds_CXX= +compiler_needs_object_CXX=no +export_dynamic_flag_spec_CXX= +hardcode_direct_CXX=no +hardcode_direct_absolute_CXX=no +hardcode_libdir_flag_spec_CXX= +hardcode_libdir_separator_CXX= +hardcode_minus_L_CXX=no +hardcode_shlibpath_var_CXX=unsupported +hardcode_automatic_CXX=no +inherit_rpath_CXX=no +module_cmds_CXX= +module_expsym_cmds_CXX= +link_all_deplibs_CXX=unknown +old_archive_cmds_CXX=$old_archive_cmds +reload_flag_CXX=$reload_flag +reload_cmds_CXX=$reload_cmds +no_undefined_flag_CXX= +whole_archive_flag_spec_CXX= +enable_shared_with_static_runtimes_CXX=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +objext_CXX=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_caught_CXX_error"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + + # save warnings/boilerplate of simple test code + ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + + ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_CFLAGS=$CFLAGS + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + CFLAGS=$CXXFLAGS + compiler=$CC + compiler_CXX=$CC + func_cc_basename $compiler +cc_basename=$func_cc_basename_result + + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test yes = "$GXX"; then + lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' + else + lt_prog_compiler_no_builtin_flag_CXX= + fi + + if test yes = "$GXX"; then + # Set up default GNU C++ configuration + + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test yes = "$GCC"; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return, which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD=$ac_prog + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test yes = "$with_gnu_ld"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD=$ac_dir/$ac_prog + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test yes = "$with_gnu_ld"; then + archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='$wl' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + whole_archive_flag_spec_CXX= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + ld_shlibs_CXX=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aix[4-9]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_CXX='' + hardcode_direct_CXX=yes + hardcode_direct_absolute_CXX=yes + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + file_list_spec_CXX='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + hardcode_direct_CXX=no + hardcode_direct_absolute_CXX=no + ;; + esac + + if test yes = "$GXX"; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct_CXX=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_CXX=yes + hardcode_libdir_flag_spec_CXX='-L$libdir' + hardcode_libdir_separator_CXX= + fi + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag=$shared_flag' $wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + export_dynamic_flag_spec_CXX='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + always_export_symbols_CXX=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + # The "-G" linker flag allows undefined symbols. + no_undefined_flag_CXX='-bernotok' + # Determine the default libpath from the value encoded in an empty + # executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath__CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__CXX +fi + + hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath" + + archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + hardcode_libdir_flag_spec_CXX='$wl-R $libdir:/usr/lib:/lib' + allow_undefined_flag_CXX="-z nodefs" + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath__CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__CXX +fi + + hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_CXX=' $wl-bernotok' + allow_undefined_flag_CXX=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_CXX='$convenience' + fi + archive_cmds_need_lc_CXX=yes + archive_expsym_cmds_CXX='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared + # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. + archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_CXX=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + ld_shlibs_CXX=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + case $GXX,$cc_basename in + ,cl* | no,cl* | ,icl* | no,icl*) + # Native MSVC or ICC + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec_CXX=' ' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=yes + file_list_spec_CXX='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' + enable_shared_with_static_runtimes_CXX=yes + # Don't use ranlib + old_postinstall_cmds_CXX='chmod 644 $oldlib' + postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # g++ + # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_CXX='-L$libdir' + export_dynamic_flag_spec_CXX='$wl--export-all-symbols' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=no + enable_shared_with_static_runtimes_CXX=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs_CXX=no + fi + ;; + esac + ;; + darwin* | rhapsody*) + + + archive_cmds_need_lc_CXX=no + hardcode_direct_CXX=no + hardcode_automatic_CXX=yes + hardcode_shlibpath_var_CXX=unsupported + if test yes = "$lt_cv_ld_force_load"; then + whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + + else + whole_archive_flag_spec_CXX='' + fi + link_all_deplibs_CXX=yes + allow_undefined_flag_CXX=$_lt_dar_allow_undefined + case $cc_basename in + ifort*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; then + output_verbose_link_cmd=func_echo_all + archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + module_expsym_cmds_CXX="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" + if test yes != "$lt_cv_apple_cc_single_mod"; then + archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" + archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" + fi + + else + ld_shlibs_CXX=no + fi + + ;; + + os2*) + hardcode_libdir_flag_spec_CXX='-L$libdir' + hardcode_minus_L_CXX=yes + allow_undefined_flag_CXX=unsupported + shrext_cmds=.dll + archive_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds_CXX='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes_CXX=yes + file_list_spec_CXX='@' + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + freebsd2.*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + ld_shlibs_CXX=no + ;; + + freebsd-elf*) + archive_cmds_need_lc_CXX=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + ld_shlibs_CXX=yes + ;; + + haiku*) + archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + link_all_deplibs_CXX=yes + ;; + + hpux9*) + hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir' + hardcode_libdir_separator_CXX=: + export_dynamic_flag_spec_CXX='$wl-E' + hardcode_direct_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir' + hardcode_libdir_separator_CXX=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + export_dynamic_flag_spec_CXX='$wl-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + ;; + *) + hardcode_direct_CXX=yes + hardcode_direct_absolute_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + interix[3-9]*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + export_dynamic_flag_spec_CXX='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds_CXX='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' + fi + fi + link_all_deplibs_CXX=yes + ;; + esac + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + hardcode_libdir_separator_CXX=: + inherit_rpath_CXX=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + archive_cmds_need_lc_CXX=no + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [1-5].* | *pgcpp\ [1-5].*) + prelink_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + old_archive_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' + archive_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 6 and above use weak symbols + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + + hardcode_libdir_flag_spec_CXX='$wl--rpath $wl$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + whole_archive_flag_spec_CXX='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + ;; + cxx*) + # Compaq C++ + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + ;; + xl* | mpixl* | bgxl*) + # IBM XL 8.0 on PPC, with GNU ld + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' + hardcode_libdir_flag_spec_CXX='-R$libdir' + whole_archive_flag_spec_CXX='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object_CXX=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + ld_shlibs_CXX=yes + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + hardcode_direct_absolute_CXX=yes + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' + export_dynamic_flag_spec_CXX='$wl-E' + whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + fi + output_verbose_link_cmd=func_echo_all + else + ld_shlibs_CXX=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + hardcode_libdir_separator_CXX=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + cxx*) + case $host in + osf3*) + allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*' + archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + ;; + *) + allow_undefined_flag_CXX=' -expect_unresolved \*' + archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ + $RM $lib.exp' + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + ;; + esac + + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes,no = "$GXX,$with_gnu_ld"; then + allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*' + case $host in + osf3*) + archive_cmds_CXX='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + *) + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + esac + + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + archive_cmds_need_lc_CXX=yes + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_shlibpath_var_CXX=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' + ;; + esac + link_all_deplibs_CXX=yes + + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test yes,no = "$GXX,$with_gnu_ld"; then + no_undefined_flag_CXX=' $wl-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + else + # g++ 2.7 appears to require '-G' NOT '-shared' on this + # platform. + archive_cmds_CXX='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + fi + + hardcode_libdir_flag_spec_CXX='$wl-R $wl$libdir' + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + whole_archive_flag_spec_CXX='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag_CXX='$wl-z,text' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag_CXX='$wl-z,text' + allow_undefined_flag_CXX='$wl-z,nodefs' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='$wl-R,$libdir' + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + export_dynamic_flag_spec_CXX='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ + '"$old_archive_cmds_CXX" + reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ + '"$reload_cmds_CXX" + ;; + *) + archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +$as_echo "$ld_shlibs_CXX" >&6; } + test no = "$ld_shlibs_CXX" && can_build_shared=no + + GCC_CXX=$GXX + LD_CXX=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + # Dependencies to place before and after the object being linked: +predep_objects_CXX= +postdep_objects_CXX= +predeps_CXX= +postdeps_CXX= +compiler_lib_search_path_CXX= + +cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF + + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; +esac + +if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case $prev$p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test x-L = "$p" || + test x-R = "$p"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test no = "$pre_test_object_deps_done"; then + case $prev in + -L | -R) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$compiler_lib_search_path_CXX"; then + compiler_lib_search_path_CXX=$prev$p + else + compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} $prev$p" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$postdeps_CXX"; then + postdeps_CXX=$prev$p + else + postdeps_CXX="${postdeps_CXX} $prev$p" + fi + fi + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test no = "$pre_test_object_deps_done"; then + if test -z "$predep_objects_CXX"; then + predep_objects_CXX=$p + else + predep_objects_CXX="$predep_objects_CXX $p" + fi + else + if test -z "$postdep_objects_CXX"; then + postdep_objects_CXX=$p + else + postdep_objects_CXX="$postdep_objects_CXX $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling CXX test program" +fi + +$RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken +case $host_os in +interix[3-9]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + predep_objects_CXX= + postdep_objects_CXX= + postdeps_CXX= + ;; +esac + + +case " $postdeps_CXX " in +*" -lc "*) archive_cmds_need_lc_CXX=no ;; +esac + compiler_lib_search_dirs_CXX= +if test -n "${compiler_lib_search_path_CXX}"; then + compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | $SED -e 's! -L! !g' -e 's!^ !!'` +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + lt_prog_compiler_wl_CXX= +lt_prog_compiler_pic_CXX= +lt_prog_compiler_static_CXX= + + + # C++ specific cases for pic, static, wl, etc. + if test yes = "$GXX"; then + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + fi + lt_prog_compiler_pic_CXX='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic_CXX='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static_CXX='$wl-static' + ;; + esac + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_CXX='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + lt_prog_compiler_pic_CXX= + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static_CXX= + ;; + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_CXX=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + else + case $host_os in + aix[4-9]*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + else + lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + ;; + dgux*) + case $cc_basename in + ec++*) + lt_prog_compiler_pic_CXX='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='$wl-a ${wl}archive' + if test ia64 != "$host_cpu"; then + lt_prog_compiler_pic_CXX='+Z' + fi + ;; + aCC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='$wl-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_CXX='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # KAI C++ Compiler + lt_prog_compiler_wl_CXX='--backend -Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64, which still supported -KPIC. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + lt_prog_compiler_static_CXX='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fpic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-qpic' + lt_prog_compiler_static_CXX='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + lt_prog_compiler_pic_CXX='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + lt_prog_compiler_wl_CXX='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + lt_prog_compiler_pic_CXX='-pic' + ;; + cxx*) + # Digital/Compaq C++ + lt_prog_compiler_wl_CXX='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + lt_prog_compiler_pic_CXX='-pic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + lcc*) + # Lucid + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + lt_prog_compiler_pic_CXX='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + lt_prog_compiler_can_build_shared_CXX=no + ;; + esac + fi + +case $host_os in + # For platforms that do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_CXX= + ;; + *) + lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +if ${lt_cv_prog_compiler_pic_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } +lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } +if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works_CXX=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works_CXX=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } + +if test yes = "$lt_cv_prog_compiler_pic_works_CXX"; then + case $lt_prog_compiler_pic_CXX in + "" | " "*) ;; + *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; + esac +else + lt_prog_compiler_pic_CXX= + lt_prog_compiler_can_build_shared_CXX=no +fi + +fi + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works_CXX=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works_CXX=yes + fi + else + lt_cv_prog_compiler_static_works_CXX=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } + +if test yes = "$lt_cv_prog_compiler_static_works_CXX"; then + : +else + lt_prog_compiler_static_CXX= +fi + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_CXX=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_CXX=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + +hard_links=nottested +if test no = "$lt_cv_prog_compiler_c_o_CXX" && test no != "$need_locks"; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test no = "$hard_links"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + case $host_os in + aix[4-9]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_CXX='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + export_symbols_cmds_CXX=$ltdll_cmds + ;; + cygwin* | mingw* | cegcc*) + case $cc_basename in + cl* | icl*) + exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + ;; + esac + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +$as_echo "$ld_shlibs_CXX" >&6; } +test no = "$ld_shlibs_CXX" && can_build_shared=no + +with_gnu_ld_CXX=$with_gnu_ld + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_CXX" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_CXX=yes + + if test yes,yes = "$GCC,$enable_shared"; then + case $archive_cmds_CXX in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_CXX + pic_flag=$lt_prog_compiler_pic_CXX + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_CXX + allow_undefined_flag_CXX= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc_CXX=no + else + lt_cv_archive_cmds_need_lc_CXX=yes + fi + allow_undefined_flag_CXX=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 +$as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } + archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=.so +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + + + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='$libname$release$shared_ext$major' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test ia64 = "$host_cpu"; then + # AIX 5 supports IA64 + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line '#! .'. This would cause the generated library to + # depend on '.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a(lib.so.V)' + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='$libname$shared_ext' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl* | *,icl*) + # Native MSVC or ICC + libname_spec='$name' + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec=$LIB + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC and ICC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' + soname_spec='$libname$release$major$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + if test 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test yes = "$lt_cv_prog_gnu_ld"; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + hardcode_libdir_flag_spec_CXX='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if ${lt_cv_shlibpath_overrides_runpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec; then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' + soname_spec='$libname$shared_ext.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=sco + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action_CXX= +if test -n "$hardcode_libdir_flag_spec_CXX" || + test -n "$runpath_var_CXX" || + test yes = "$hardcode_automatic_CXX"; then + + # We can hardcode non-existent directories. + if test no != "$hardcode_direct_CXX" && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" && + test no != "$hardcode_minus_L_CXX"; then + # Linking always hardcodes the temporary library directory. + hardcode_action_CXX=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_CXX=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_CXX=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 +$as_echo "$hardcode_action_CXX" >&6; } + +if test relink = "$hardcode_action_CXX" || + test yes = "$inherit_rpath_CXX"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + + fi # test -n "$compiler" + + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test yes != "$_lt_caught_CXX_error" + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + + + + + + + + + + + + ac_config_commands="$ac_config_commands libtool" + + + + +# Only expand once: + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +$as_echo "no, using $LN_S" >&6; } +fi + + +# Check for GCC visibility feature + + + + VISIBILITY_CFLAGS= + VISIBILITY_CXXFLAGS= + HAVE_VISIBILITY=0 + if test -n "$GCC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the -Werror option is usable" >&5 +$as_echo_n "checking whether the -Werror option is usable... " >&6; } + if ${pcre_cv_cc_vis_werror+:} false; then : + $as_echo_n "(cached) " >&6 +else + + pcre_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -Werror" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + pcre_cv_cc_vis_werror=yes +else + pcre_cv_cc_vis_werror=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS="$pcre_save_CFLAGS" +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pcre_cv_cc_vis_werror" >&5 +$as_echo "$pcre_cv_cc_vis_werror" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for simple visibility declarations" >&5 +$as_echo_n "checking for simple visibility declarations... " >&6; } + if ${pcre_cv_cc_visibility+:} false; then : + $as_echo_n "(cached) " >&6 +else + + pcre_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -fvisibility=hidden" + if test $pcre_cv_cc_vis_werror = yes; then + CFLAGS="$CFLAGS -Werror" + fi + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +extern __attribute__((__visibility__("hidden"))) int hiddenvar; + extern __attribute__((__visibility__("default"))) int exportedvar; + extern __attribute__((__visibility__("hidden"))) int hiddenfunc (void); + extern __attribute__((__visibility__("default"))) int exportedfunc (void); + void dummyfunc (void) {} + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + pcre_cv_cc_visibility=yes +else + pcre_cv_cc_visibility=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS="$pcre_save_CFLAGS" +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pcre_cv_cc_visibility" >&5 +$as_echo "$pcre_cv_cc_visibility" >&6; } + if test $pcre_cv_cc_visibility = yes; then + VISIBILITY_CFLAGS="-fvisibility=hidden" + VISIBILITY_CXXFLAGS="-fvisibility=hidden -fvisibility-inlines-hidden" + HAVE_VISIBILITY=1 + +$as_echo "#define PCRE_EXP_DECL extern __attribute__ ((visibility (\"default\")))" >>confdefs.h + + +$as_echo "#define PCRE_EXP_DEFN __attribute__ ((visibility (\"default\")))" >>confdefs.h + + +$as_echo "#define PCRE_EXP_DATA_DEFN __attribute__ ((visibility (\"default\")))" >>confdefs.h + + +$as_echo "#define PCREPOSIX_EXP_DECL extern __attribute__ ((visibility (\"default\")))" >>confdefs.h + + +$as_echo "#define PCREPOSIX_EXP_DEFN extern __attribute__ ((visibility (\"default\")))" >>confdefs.h + + +$as_echo "#define PCRECPP_EXP_DECL extern __attribute__ ((visibility (\"default\")))" >>confdefs.h + + +$as_echo "#define PCRECPP_EXP_DEFN __attribute__ ((visibility (\"default\")))" >>confdefs.h + + fi + fi + + + + +cat >>confdefs.h <<_ACEOF +#define HAVE_VISIBILITY $HAVE_VISIBILITY +_ACEOF + + + +# Versioning + +PCRE_MAJOR="8" +PCRE_MINOR="44" +PCRE_PRERELEASE="" +PCRE_DATE="2020-02-12" + +if test "$PCRE_MINOR" = "08" -o "$PCRE_MINOR" = "09" +then + echo "***" + echo "*** Minor version number $PCRE_MINOR must not be used. ***" + echo "*** Use only 01 to 07 or 10 onwards, to avoid octal issues. ***" + echo "***" + exit 1 +fi + + + + + + +# Set a more sensible default value for $(htmldir). +if test "x$htmldir" = 'x${docdir}' +then + htmldir='${docdir}/html' +fi + +# Handle --disable-pcre8 (enabled by default) +# Check whether --enable-pcre8 was given. +if test "${enable_pcre8+set}" = set; then : + enableval=$enable_pcre8; +else + enable_pcre8=unset +fi + + + +# Handle --enable-pcre16 (disabled by default) +# Check whether --enable-pcre16 was given. +if test "${enable_pcre16+set}" = set; then : + enableval=$enable_pcre16; +else + enable_pcre16=unset +fi + + + +# Handle --enable-pcre32 (disabled by default) +# Check whether --enable-pcre32 was given. +if test "${enable_pcre32+set}" = set; then : + enableval=$enable_pcre32; +else + enable_pcre32=unset +fi + + + +# Handle --disable-cpp. The substitution of enable_cpp is needed for use in +# pcre-config. +# Check whether --enable-cpp was given. +if test "${enable_cpp+set}" = set; then : + enableval=$enable_cpp; +else + enable_cpp=unset +fi + + + +# Handle --enable-jit (disabled by default) +# Check whether --enable-jit was given. +if test "${enable_jit+set}" = set; then : + enableval=$enable_jit; +else + enable_jit=no +fi + + +# This code enables JIT if the hardware supports it. + +if test "$enable_jit" = "auto"; then + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + SAVE_CPPFLAGS=$CPPFLAGS + CPPFLAGS=-I$srcdir + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #define SLJIT_CONFIG_AUTO 1 + #include "sljit/sljitConfigInternal.h" + #if (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED) + #error unsupported + #endif +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + enable_jit=yes +else + enable_jit=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CPPFLAGS=$SAVE_CPPFLAGS +fi + +# Handle --disable-pcregrep-jit (enabled by default) +# Check whether --enable-pcregrep-jit was given. +if test "${enable_pcregrep_jit+set}" = set; then : + enableval=$enable_pcregrep_jit; +else + enable_pcregrep_jit=yes +fi + + +# Handle --enable-rebuild-chartables +# Check whether --enable-rebuild-chartables was given. +if test "${enable_rebuild_chartables+set}" = set; then : + enableval=$enable_rebuild_chartables; +else + enable_rebuild_chartables=no +fi + + +# Handle --enable-utf8 (disabled by default) +# Check whether --enable-utf8 was given. +if test "${enable_utf8+set}" = set; then : + enableval=$enable_utf8; +else + enable_utf8=unset +fi + + +# Handle --enable-utf (disabled by default) +# Check whether --enable-utf was given. +if test "${enable_utf+set}" = set; then : + enableval=$enable_utf; +else + enable_utf=unset +fi + + +# Handle --enable-unicode-properties +# Check whether --enable-unicode-properties was given. +if test "${enable_unicode_properties+set}" = set; then : + enableval=$enable_unicode_properties; +else + enable_unicode_properties=no +fi + + +# Handle newline options +ac_pcre_newline=lf +# Check whether --enable-newline-is-cr was given. +if test "${enable_newline_is_cr+set}" = set; then : + enableval=$enable_newline_is_cr; ac_pcre_newline=cr +fi + +# Check whether --enable-newline-is-lf was given. +if test "${enable_newline_is_lf+set}" = set; then : + enableval=$enable_newline_is_lf; ac_pcre_newline=lf +fi + +# Check whether --enable-newline-is-crlf was given. +if test "${enable_newline_is_crlf+set}" = set; then : + enableval=$enable_newline_is_crlf; ac_pcre_newline=crlf +fi + +# Check whether --enable-newline-is-anycrlf was given. +if test "${enable_newline_is_anycrlf+set}" = set; then : + enableval=$enable_newline_is_anycrlf; ac_pcre_newline=anycrlf +fi + +# Check whether --enable-newline-is-any was given. +if test "${enable_newline_is_any+set}" = set; then : + enableval=$enable_newline_is_any; ac_pcre_newline=any +fi + +enable_newline="$ac_pcre_newline" + +# Handle --enable-bsr-anycrlf +# Check whether --enable-bsr-anycrlf was given. +if test "${enable_bsr_anycrlf+set}" = set; then : + enableval=$enable_bsr_anycrlf; +else + enable_bsr_anycrlf=no +fi + + +# Handle --enable-ebcdic +# Check whether --enable-ebcdic was given. +if test "${enable_ebcdic+set}" = set; then : + enableval=$enable_ebcdic; +else + enable_ebcdic=no +fi + + +# Handle --enable-ebcdic-nl25 +# Check whether --enable-ebcdic-nl25 was given. +if test "${enable_ebcdic_nl25+set}" = set; then : + enableval=$enable_ebcdic_nl25; +else + enable_ebcdic_nl25=no +fi + + +# Handle --disable-stack-for-recursion +# Check whether --enable-stack-for-recursion was given. +if test "${enable_stack_for_recursion+set}" = set; then : + enableval=$enable_stack_for_recursion; +else + enable_stack_for_recursion=yes +fi + + +# Handle --enable-pcregrep-libz +# Check whether --enable-pcregrep-libz was given. +if test "${enable_pcregrep_libz+set}" = set; then : + enableval=$enable_pcregrep_libz; +else + enable_pcregrep_libz=no +fi + + +# Handle --enable-pcregrep-libbz2 +# Check whether --enable-pcregrep-libbz2 was given. +if test "${enable_pcregrep_libbz2+set}" = set; then : + enableval=$enable_pcregrep_libbz2; +else + enable_pcregrep_libbz2=no +fi + + +# Handle --with-pcregrep-bufsize=N + +# Check whether --with-pcregrep-bufsize was given. +if test "${with_pcregrep_bufsize+set}" = set; then : + withval=$with_pcregrep_bufsize; +else + with_pcregrep_bufsize=20480 +fi + + +# Handle --enable-pcretest-libedit +# Check whether --enable-pcretest-libedit was given. +if test "${enable_pcretest_libedit+set}" = set; then : + enableval=$enable_pcretest_libedit; +else + enable_pcretest_libedit=no +fi + + +# Handle --enable-pcretest-libreadline +# Check whether --enable-pcretest-libreadline was given. +if test "${enable_pcretest_libreadline+set}" = set; then : + enableval=$enable_pcretest_libreadline; +else + enable_pcretest_libreadline=no +fi + + +# Handle --with-posix-malloc-threshold=NBYTES + +# Check whether --with-posix-malloc-threshold was given. +if test "${with_posix_malloc_threshold+set}" = set; then : + withval=$with_posix_malloc_threshold; +else + with_posix_malloc_threshold=10 +fi + + +# Handle --with-link-size=N + +# Check whether --with-link-size was given. +if test "${with_link_size+set}" = set; then : + withval=$with_link_size; +else + with_link_size=2 +fi + + +# Handle --with-parens-nest-limit=N + +# Check whether --with-parens-nest-limit was given. +if test "${with_parens_nest_limit+set}" = set; then : + withval=$with_parens_nest_limit; +else + with_parens_nest_limit=250 +fi + + +# Handle --with-match-limit=N + +# Check whether --with-match-limit was given. +if test "${with_match_limit+set}" = set; then : + withval=$with_match_limit; +else + with_match_limit=10000000 +fi + + +# Handle --with-match-limit_recursion=N +# +# Note: In config.h, the default is to define MATCH_LIMIT_RECURSION +# symbolically as MATCH_LIMIT, which in turn is defined to be some numeric +# value (e.g. 10000000). MATCH_LIMIT_RECURSION can otherwise be set to some +# different numeric value (or even the same numeric value as MATCH_LIMIT, +# though no longer defined in terms of the latter). +# + +# Check whether --with-match-limit-recursion was given. +if test "${with_match_limit_recursion+set}" = set; then : + withval=$with_match_limit_recursion; +else + with_match_limit_recursion=MATCH_LIMIT +fi + + +# Handle --enable-valgrind +# Check whether --enable-valgrind was given. +if test "${enable_valgrind+set}" = set; then : + enableval=$enable_valgrind; +else + enable_valgrind=no +fi + + +# Enable code coverage reports using gcov +# Check whether --enable-coverage was given. +if test "${enable_coverage+set}" = set; then : + enableval=$enable_coverage; +else + enable_coverage=no +fi + + +# Copy enable_utf8 value to enable_utf for compatibility reasons +if test "x$enable_utf8" != "xunset" +then + if test "x$enable_utf" != "xunset" + then + as_fn_error $? "--enable/disable-utf8 is kept only for compatibility reasons and its value is copied to --enable/disable-utf. Newer code must use --enable/disable-utf alone." "$LINENO" 5 + fi + enable_utf=$enable_utf8 +fi + +# Set the default value for pcre8 +if test "x$enable_pcre8" = "xunset" +then + enable_pcre8=yes +fi + +# Set the default value for pcre16 +if test "x$enable_pcre16" = "xunset" +then + enable_pcre16=no +fi + +# Set the default value for pcre32 +if test "x$enable_pcre32" = "xunset" +then + enable_pcre32=no +fi + +# Make sure enable_pcre8 or enable_pcre16 was set +if test "x$enable_pcre8$enable_pcre16$enable_pcre32" = "xnonono" +then + as_fn_error $? "At least one of 8, 16 or 32 bit pcre library must be enabled" "$LINENO" 5 +fi + +# Make sure that if enable_unicode_properties was set, that UTF support is enabled. +if test "x$enable_unicode_properties" = "xyes" +then + if test "x$enable_utf" = "xno" + then + as_fn_error $? "support for Unicode properties requires UTF-8/16/32 support" "$LINENO" 5 + fi + enable_utf=yes +fi + +# enable_utf is disabled by default. +if test "x$enable_utf" = "xunset" +then + enable_utf=no +fi + +# enable_cpp copies the value of enable_pcre8 by default +if test "x$enable_cpp" = "xunset" +then + enable_cpp=$enable_pcre8 +fi + +# Make sure that if enable_cpp was set, that enable_pcre8 support is enabled +if test "x$enable_cpp" = "xyes" +then + if test "x$enable_pcre8" = "xno" + then + as_fn_error $? "C++ library requires pcre library with 8 bit characters" "$LINENO" 5 + fi +fi + +# Convert the newline identifier into the appropriate integer value. The first +# three are ASCII values 0x0a, 0x0d, and 0x0d0a, but if EBCDIC is enabled, they +# are changed below. + +case "$enable_newline" in + lf) ac_pcre_newline_value=10 ;; + cr) ac_pcre_newline_value=13 ;; + crlf) ac_pcre_newline_value=3338 ;; + anycrlf) ac_pcre_newline_value=-2 ;; + any) ac_pcre_newline_value=-1 ;; + *) + as_fn_error $? "invalid argument \"$enable_newline\" to --enable-newline option" "$LINENO" 5 + ;; +esac + +# --enable-ebcdic-nl25 implies --enable-ebcdic +if test "x$enable_ebcdic_nl25" = "xyes"; then + enable_ebcdic=yes +fi + +# Make sure that if enable_ebcdic is set, rebuild_chartables is also enabled, +# and the newline value is adjusted appropriately (CR is still 13, but LF is +# 21 or 37). Also check that UTF support is not requested, because PCRE cannot +# handle EBCDIC and UTF in the same build. To do so it would need to use +# different character constants depending on the mode. +# +if test "x$enable_ebcdic" = "xyes"; then + enable_rebuild_chartables=yes + + if test "x$enable_utf" = "xyes"; then + as_fn_error $? "support for EBCDIC and UTF-8/16/32 cannot be enabled at the same time" "$LINENO" 5 + fi + + if test "x$enable_ebcdic_nl25" = "xno"; then + case "$ac_pcre_newline_value" in + 10) ac_pcre_newline_value=21 ;; + 3338) ac_pcre_newline_value=3349 ;; + esac + else + case "$ac_pcre_newline_value" in + 10) ac_pcre_newline_value=37 ;; + 3338) ac_pcre_newline_value=3365 ;; + esac + fi +fi + +# Check argument to --with-link-size +case "$with_link_size" in + 2|3|4) ;; + *) + as_fn_error $? "invalid argument \"$with_link_size\" to --with-link-size option" "$LINENO" 5 + ;; +esac + + + +# Checks for header files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +for ac_header in limits.h sys/types.h sys/stat.h dirent.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + +for ac_header in windows.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "windows.h" "ac_cv_header_windows_h" "$ac_includes_default" +if test "x$ac_cv_header_windows_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_WINDOWS_H 1 +_ACEOF + HAVE_WINDOWS_H=1 +fi + +done + + +# The files below are C++ header files. +pcre_have_type_traits="0" +pcre_have_bits_type_traits="0" + +if test "x$enable_cpp" = "xyes" -a -z "$CXX"; then + as_fn_error $? "Invalid C++ compiler or C++ compiler flags" "$LINENO" 5 +fi + +if test "x$enable_cpp" = "xyes" -a -n "$CXX" +then +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + +# Older versions of pcre defined pcrecpp::no_arg, but in new versions +# it's called pcrecpp::RE::no_arg. For backwards ABI compatibility, +# we want to make one an alias for the other. Different systems do +# this in different ways. Some systems, for instance, can do it via +# a linker flag: -alias (for os x 10.5) or -i (for os x <=10.4). +OLD_LDFLAGS="$LDFLAGS" +for flag in "-alias,__ZN7pcrecpp2RE6no_argE,__ZN7pcrecpp6no_argE" \ + "-i__ZN7pcrecpp6no_argE:__ZN7pcrecpp2RE6no_argE"; do + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for alias support in the linker" >&5 +$as_echo_n "checking for alias support in the linker... " >&6; } + LDFLAGS="$OLD_LDFLAGS -Wl,$flag" + # We try to run the linker with this new ld flag. If the link fails, + # we give up and remove the new flag from LDFLAGS. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +namespace pcrecpp { + class RE { static int no_arg; }; + int RE::no_arg; + } +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; }; + EXTRA_LIBPCRECPP_LDFLAGS="$EXTRA_LIBPCRECPP_LDFLAGS -Wl,$flag"; + break; +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +done +LDFLAGS="$OLD_LDFLAGS" + +# We could be more clever here, given we're doing AC_SUBST with this +# (eg set a var to be the name of the include file we want). But we're not +# so it's easy to change back to 'regular' autoconf vars if we needed to. + +for ac_header in string +do : + ac_fn_cxx_check_header_mongrel "$LINENO" "string" "ac_cv_header_string" "$ac_includes_default" +if test "x$ac_cv_header_string" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_STRING 1 +_ACEOF + pcre_have_cpp_headers="1" +else + pcre_have_cpp_headers="0" +fi + +done + +for ac_header in bits/type_traits.h +do : + ac_fn_cxx_check_header_mongrel "$LINENO" "bits/type_traits.h" "ac_cv_header_bits_type_traits_h" "$ac_includes_default" +if test "x$ac_cv_header_bits_type_traits_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_BITS_TYPE_TRAITS_H 1 +_ACEOF + pcre_have_bits_type_traits="1" +else + pcre_have_bits_type_traits="0" +fi + +done + +for ac_header in type_traits.h +do : + ac_fn_cxx_check_header_mongrel "$LINENO" "type_traits.h" "ac_cv_header_type_traits_h" "$ac_includes_default" +if test "x$ac_cv_header_type_traits_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_TYPE_TRAITS_H 1 +_ACEOF + pcre_have_type_traits="1" +else + pcre_have_type_traits="0" +fi + +done + + +# (This isn't c++-specific, but is only used in pcrecpp.cc, so try this +# in a c++ context. This matters becuase strtoimax is C99 and may not +# be supported by the C++ compiler.) +# Figure out how to create a longlong from a string: strtoll and +# equiv. It's not enough to call AC_CHECK_FUNCS: hpux has a +# strtoll, for instance, but it only takes 2 args instead of 3! +# We have to call AH_TEMPLATE since AC_DEFINE_UNQUOTED below is complex. + + + + +have_strto_fn=0 +for fn in strtoq strtoll _strtoi64 strtoimax; do + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $fn" >&5 +$as_echo_n "checking for $fn... " >&6; } + if test "$fn" = strtoimax; then + include=stdint.h + else + include=stdlib.h + fi + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$include> +int +main () +{ +char* e; return $fn("100", &e, 10) + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +cat >>confdefs.h <<_ACEOF +#define HAVE_`echo $fn | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ` 1 +_ACEOF + + have_strto_fn=1 + break +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done + +if test "$have_strto_fn" = 1; then + ac_fn_cxx_check_type "$LINENO" "long long" "ac_cv_type_long_long" "$ac_includes_default" +if test "x$ac_cv_type_long_long" = xyes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_LONG_LONG 1 +_ACEOF + +pcre_have_long_long="1" +else + pcre_have_long_long="0" +fi + + ac_fn_cxx_check_type "$LINENO" "unsigned long long" "ac_cv_type_unsigned_long_long" "$ac_includes_default" +if test "x$ac_cv_type_unsigned_long_long" = xyes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_UNSIGNED_LONG_LONG 1 +_ACEOF + +pcre_have_ulong_long="1" +else + pcre_have_ulong_long="0" +fi + +else + pcre_have_long_long="0" + pcre_have_ulong_long="0" +fi + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +# Using AC_SUBST eliminates the need to include config.h in a public .h file + + + +# Conditional compilation + if test "x$enable_pcre8" = "xyes"; then + WITH_PCRE8_TRUE= + WITH_PCRE8_FALSE='#' +else + WITH_PCRE8_TRUE='#' + WITH_PCRE8_FALSE= +fi + + if test "x$enable_pcre16" = "xyes"; then + WITH_PCRE16_TRUE= + WITH_PCRE16_FALSE='#' +else + WITH_PCRE16_TRUE='#' + WITH_PCRE16_FALSE= +fi + + if test "x$enable_pcre32" = "xyes"; then + WITH_PCRE32_TRUE= + WITH_PCRE32_FALSE='#' +else + WITH_PCRE32_TRUE='#' + WITH_PCRE32_FALSE= +fi + + if test "x$enable_cpp" = "xyes"; then + WITH_PCRE_CPP_TRUE= + WITH_PCRE_CPP_FALSE='#' +else + WITH_PCRE_CPP_TRUE='#' + WITH_PCRE_CPP_FALSE= +fi + + if test "x$enable_rebuild_chartables" = "xyes"; then + WITH_REBUILD_CHARTABLES_TRUE= + WITH_REBUILD_CHARTABLES_FALSE='#' +else + WITH_REBUILD_CHARTABLES_TRUE='#' + WITH_REBUILD_CHARTABLES_FALSE= +fi + + if test "x$enable_jit" = "xyes"; then + WITH_JIT_TRUE= + WITH_JIT_FALSE='#' +else + WITH_JIT_TRUE='#' + WITH_JIT_FALSE= +fi + + if test "x$enable_utf" = "xyes"; then + WITH_UTF_TRUE= + WITH_UTF_FALSE='#' +else + WITH_UTF_TRUE='#' + WITH_UTF_FALSE= +fi + + if test "x$enable_valgrind" = "xyes"; then + WITH_VALGRIND_TRUE= + WITH_VALGRIND_FALSE='#' +else + WITH_VALGRIND_TRUE='#' + WITH_VALGRIND_FALSE= +fi + + +# Checks for typedefs, structures, and compiler characteristics. + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 +$as_echo_n "checking for an ANSI C-conforming const... " >&6; } +if ${ac_cv_c_const+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + +#ifndef __cplusplus + /* Ultrix mips cc rejects this sort of thing. */ + typedef int charset[2]; + const charset cs = { 0, 0 }; + /* SunOS 4.1.1 cc rejects this. */ + char const *const *pcpcc; + char **ppc; + /* NEC SVR4.0.2 mips cc rejects this. */ + struct point {int x, y;}; + static struct point const zero = {0,0}; + /* AIX XL C 1.02.0.0 rejects this. + It does not let you subtract one const X* pointer from another in + an arm of an if-expression whose if-part is not a constant + expression */ + const char *g = "string"; + pcpcc = &g + (g ? g-g : 0); + /* HPUX 7.0 cc rejects these. */ + ++pcpcc; + ppc = (char**) pcpcc; + pcpcc = (char const *const *) ppc; + { /* SCO 3.2v4 cc rejects this sort of thing. */ + char tx; + char *t = &tx; + char const *s = 0 ? (char *) 0 : (char const *) 0; + + *t++ = 0; + if (s) return 0; + } + { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ + int x[] = {25, 17}; + const int *foo = &x[0]; + ++foo; + } + { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ + typedef const int *iptr; + iptr p = 0; + ++p; + } + { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying + "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ + struct s { int j; const int *ap[3]; } bx; + struct s *b = &bx; b->j = 5; + } + { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; + if (!foo) return 0; + } + return !cs[0] && !zero.x; +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_const=yes +else + ac_cv_c_const=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 +$as_echo "$ac_cv_c_const" >&6; } +if test $ac_cv_c_const = no; then + +$as_echo "#define const /**/" >>confdefs.h + +fi + +ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" +if test "x$ac_cv_type_size_t" = xyes; then : + +else + +cat >>confdefs.h <<_ACEOF +#define size_t unsigned int +_ACEOF + +fi + + +# Checks for library functions. + +for ac_func in bcopy memmove strerror +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + +# Check for the availability of libz (aka zlib) + +for ac_header in zlib.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default" +if test "x$ac_cv_header_zlib_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_ZLIB_H 1 +_ACEOF + HAVE_ZLIB_H=1 +fi + +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gzopen in -lz" >&5 +$as_echo_n "checking for gzopen in -lz... " >&6; } +if ${ac_cv_lib_z_gzopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lz $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gzopen (); +int +main () +{ +return gzopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_z_gzopen=yes +else + ac_cv_lib_z_gzopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_gzopen" >&5 +$as_echo "$ac_cv_lib_z_gzopen" >&6; } +if test "x$ac_cv_lib_z_gzopen" = xyes; then : + HAVE_LIBZ=1 +fi + + +# Check for the availability of libbz2. Originally we just used AC_CHECK_LIB, +# as for libz. However, this had the following problem, diagnosed and fixed by +# a user: +# +# - libbz2 uses the Pascal calling convention (WINAPI) for the functions +# under Win32. +# - The standard autoconf AC_CHECK_LIB fails to include "bzlib.h", +# therefore missing the function definition. +# - The compiler thus generates a "C" signature for the test function. +# - The linker fails to find the "C" function. +# - PCRE fails to configure if asked to do so against libbz2. +# +# Solution: +# +# - Replace the AC_CHECK_LIB test with a custom test. + +for ac_header in bzlib.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "bzlib.h" "ac_cv_header_bzlib_h" "$ac_includes_default" +if test "x$ac_cv_header_bzlib_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_BZLIB_H 1 +_ACEOF + HAVE_BZLIB_H=1 +fi + +done + +# Original test +# AC_CHECK_LIB([bz2], [BZ2_bzopen], [HAVE_LIBBZ2=1]) +# +# Custom test follows + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libbz2" >&5 +$as_echo_n "checking for libbz2... " >&6; } +OLD_LIBS="$LIBS" +LIBS="$LIBS -lbz2" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#ifdef HAVE_BZLIB_H +#include +#endif +int +main () +{ +return (int)BZ2_bzopen("conftest", "rb"); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; };HAVE_LIBBZ2=1; break; +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS="$OLD_LIBS" + +# Check for the availabiity of libreadline + +if test "$enable_pcretest_libreadline" = "yes"; then + for ac_header in readline/readline.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "readline/readline.h" "ac_cv_header_readline_readline_h" "$ac_includes_default" +if test "x$ac_cv_header_readline_readline_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_READLINE_READLINE_H 1 +_ACEOF + HAVE_READLINE_H=1 +fi + +done + + for ac_header in readline/history.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "readline/history.h" "ac_cv_header_readline_history_h" "$ac_includes_default" +if test "x$ac_cv_header_readline_history_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_READLINE_HISTORY_H 1 +_ACEOF + HAVE_HISTORY_H=1 +fi + +done + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for readline in -lreadline" >&5 +$as_echo_n "checking for readline in -lreadline... " >&6; } +if ${ac_cv_lib_readline_readline+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lreadline $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char readline (); +int +main () +{ +return readline (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_readline_readline=yes +else + ac_cv_lib_readline_readline=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_readline" >&5 +$as_echo "$ac_cv_lib_readline_readline" >&6; } +if test "x$ac_cv_lib_readline_readline" = xyes; then : + LIBREADLINE="-lreadline" +else + unset ac_cv_lib_readline_readline; + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for readline in -lreadline" >&5 +$as_echo_n "checking for readline in -lreadline... " >&6; } +if ${ac_cv_lib_readline_readline+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lreadline -ltinfo $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char readline (); +int +main () +{ +return readline (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_readline_readline=yes +else + ac_cv_lib_readline_readline=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_readline" >&5 +$as_echo "$ac_cv_lib_readline_readline" >&6; } +if test "x$ac_cv_lib_readline_readline" = xyes; then : + LIBREADLINE="-ltinfo" +else + unset ac_cv_lib_readline_readline; + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for readline in -lreadline" >&5 +$as_echo_n "checking for readline in -lreadline... " >&6; } +if ${ac_cv_lib_readline_readline+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lreadline -lcurses $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char readline (); +int +main () +{ +return readline (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_readline_readline=yes +else + ac_cv_lib_readline_readline=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_readline" >&5 +$as_echo "$ac_cv_lib_readline_readline" >&6; } +if test "x$ac_cv_lib_readline_readline" = xyes; then : + LIBREADLINE="-lcurses" +else + unset ac_cv_lib_readline_readline; + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for readline in -lreadline" >&5 +$as_echo_n "checking for readline in -lreadline... " >&6; } +if ${ac_cv_lib_readline_readline+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lreadline -lncurses $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char readline (); +int +main () +{ +return readline (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_readline_readline=yes +else + ac_cv_lib_readline_readline=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_readline" >&5 +$as_echo "$ac_cv_lib_readline_readline" >&6; } +if test "x$ac_cv_lib_readline_readline" = xyes; then : + LIBREADLINE="-lncurses" +else + unset ac_cv_lib_readline_readline; + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for readline in -lreadline" >&5 +$as_echo_n "checking for readline in -lreadline... " >&6; } +if ${ac_cv_lib_readline_readline+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lreadline -lncursesw $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char readline (); +int +main () +{ +return readline (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_readline_readline=yes +else + ac_cv_lib_readline_readline=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_readline" >&5 +$as_echo "$ac_cv_lib_readline_readline" >&6; } +if test "x$ac_cv_lib_readline_readline" = xyes; then : + LIBREADLINE="-lncursesw" +else + unset ac_cv_lib_readline_readline; + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for readline in -lreadline" >&5 +$as_echo_n "checking for readline in -lreadline... " >&6; } +if ${ac_cv_lib_readline_readline+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lreadline -ltermcap $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char readline (); +int +main () +{ +return readline (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_readline_readline=yes +else + ac_cv_lib_readline_readline=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_readline" >&5 +$as_echo "$ac_cv_lib_readline_readline" >&6; } +if test "x$ac_cv_lib_readline_readline" = xyes; then : + LIBREADLINE="-ltermcap" +else + LIBREADLINE="" +fi + +fi + +fi + +fi + +fi + +fi + + + if test -n "$LIBREADLINE"; then + if test "$LIBREADLINE" != "-lreadline"; then + echo "-lreadline needs $LIBREADLINE" + LIBREADLINE="-lreadline $LIBREADLINE" + fi + fi +fi + + +# Check for the availability of libedit. Different distributions put its +# headers in different places. Try to cover the most common ones. + +if test "$enable_pcretest_libedit" = "yes"; then + for ac_header in editline/readline.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "editline/readline.h" "ac_cv_header_editline_readline_h" "$ac_includes_default" +if test "x$ac_cv_header_editline_readline_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_EDITLINE_READLINE_H 1 +_ACEOF + HAVE_EDITLINE_READLINE_H=1 +else + for ac_header in edit/readline/readline.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "edit/readline/readline.h" "ac_cv_header_edit_readline_readline_h" "$ac_includes_default" +if test "x$ac_cv_header_edit_readline_readline_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_EDIT_READLINE_READLINE_H 1 +_ACEOF + HAVE_READLINE_READLINE_H=1 +else + for ac_header in readline/readline.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "readline/readline.h" "ac_cv_header_readline_readline_h" "$ac_includes_default" +if test "x$ac_cv_header_readline_readline_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_READLINE_READLINE_H 1 +_ACEOF + HAVE_READLINE_READLINE_H=1 +fi + +done + +fi + +done + +fi + +done + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for readline in -ledit" >&5 +$as_echo_n "checking for readline in -ledit... " >&6; } +if ${ac_cv_lib_edit_readline+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ledit $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char readline (); +int +main () +{ +return readline (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_edit_readline=yes +else + ac_cv_lib_edit_readline=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_edit_readline" >&5 +$as_echo "$ac_cv_lib_edit_readline" >&6; } +if test "x$ac_cv_lib_edit_readline" = xyes; then : + LIBEDIT="-ledit" +fi + +fi + +# This facilitates -ansi builds under Linux + +PCRE_STATIC_CFLAG="" +if test "x$enable_shared" = "xno" ; then + +$as_echo "#define PCRE_STATIC 1" >>confdefs.h + + PCRE_STATIC_CFLAG="-DPCRE_STATIC" +fi + + +# Here is where pcre specific defines are handled + +if test "$enable_pcre8" = "yes"; then + +$as_echo "#define SUPPORT_PCRE8 /**/" >>confdefs.h + +fi + +if test "$enable_pcre16" = "yes"; then + +$as_echo "#define SUPPORT_PCRE16 /**/" >>confdefs.h + +fi + +if test "$enable_pcre32" = "yes"; then + +$as_echo "#define SUPPORT_PCRE32 /**/" >>confdefs.h + +fi + +# Unless running under Windows, JIT support requires pthreads. + +if test "$enable_jit" = "yes"; then + if test "$HAVE_WINDOWS_H" != "1"; then + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ax_pthread_ok=no + +# We used to check for pthread.h first, but this fails if pthread.h +# requires special compiler flags (e.g. on True64 or Sequent). +# It gets checked for in the link test anyway. + +# First of all, check if the user has set any of the PTHREAD_LIBS, +# etcetera environment variables, and if threads linking works using +# them: +if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS" >&5 +$as_echo_n "checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char pthread_join (); +int +main () +{ +return pthread_join (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ax_pthread_ok=yes +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 +$as_echo "$ax_pthread_ok" >&6; } + if test x"$ax_pthread_ok" = xno; then + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" + fi + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" +fi + +# We must check for the threads library under a number of different +# names; the ordering is very important because some systems +# (e.g. DEC) have both -lpthread and -lpthreads, where one of the +# libraries is broken (non-POSIX). + +# Create a list of thread flags to try. Items starting with a "-" are +# C compiler flags, and other items are library names, except for "none" +# which indicates that we try without any flags at all, and "pthread-config" +# which is a program returning the flags for the Pth emulation library. + +ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" + +# The ordering *is* (sometimes) important. Some notes on the +# individual items follow: + +# pthreads: AIX (must check this before -lpthread) +# none: in case threads are in libc; should be tried before -Kthread and +# other compiler flags to prevent continual compiler warnings +# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) +# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) +# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) +# -pthreads: Solaris/gcc +# -mthreads: Mingw32/gcc, Lynx/gcc +# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it +# doesn't hurt to check since this sometimes defines pthreads too; +# also defines -D_REENTRANT) +# ... -mt is also the pthreads flag for HP/aCC +# pthread: Linux, etcetera +# --thread-safe: KAI C++ +# pthread-config: use pthread-config program (for GNU Pth library) + +case ${host_os} in + solaris*) + + # On Solaris (at least, for some versions), libc contains stubbed + # (non-functional) versions of the pthreads routines, so link-based + # tests will erroneously succeed. (We need to link with -pthreads/-mt/ + # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather + # a function called by this macro, so we could check for that, but + # who knows whether they'll stub that too in a future libc.) So, + # we'll just look for -pthreads and -lpthread first: + + ax_pthread_flags="-pthreads pthread -mt -pthread $ax_pthread_flags" + ;; + + darwin*) + ax_pthread_flags="-pthread $ax_pthread_flags" + ;; +esac + +if test x"$ax_pthread_ok" = xno; then +for flag in $ax_pthread_flags; do + + case $flag in + none) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5 +$as_echo_n "checking whether pthreads work without any flags... " >&6; } + ;; + + -*) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $flag" >&5 +$as_echo_n "checking whether pthreads work with $flag... " >&6; } + PTHREAD_CFLAGS="$flag" + ;; + + pthread-config) + # Extract the first word of "pthread-config", so it can be a program name with args. +set dummy pthread-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ax_pthread_config+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ax_pthread_config"; then + ac_cv_prog_ax_pthread_config="$ax_pthread_config" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ax_pthread_config="yes" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_prog_ax_pthread_config" && ac_cv_prog_ax_pthread_config="no" +fi +fi +ax_pthread_config=$ac_cv_prog_ax_pthread_config +if test -n "$ax_pthread_config"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_config" >&5 +$as_echo "$ax_pthread_config" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test x"$ax_pthread_config" = xno; then continue; fi + PTHREAD_CFLAGS="`pthread-config --cflags`" + PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" + ;; + + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$flag" >&5 +$as_echo_n "checking for the pthreads library -l$flag... " >&6; } + PTHREAD_LIBS="-l$flag" + ;; + esac + + save_LIBS="$LIBS" + save_CFLAGS="$CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Check for various functions. We must include pthread.h, + # since some functions may be macros. (On the Sequent, we + # need a special flag -Kthread to make this header compile.) + # We check for pthread_join because it is in -lpthread on IRIX + # while pthread_create is in libc. We check for pthread_attr_init + # due to DEC craziness with -lpthreads. We check for + # pthread_cleanup_push because it is one of the few pthread + # functions on Solaris that doesn't have a non-functional libc stub. + # We try pthread_create on general principles. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + static void routine(void *a) { a = 0; } + static void *start_routine(void *a) { return a; } +int +main () +{ +pthread_t th; pthread_attr_t attr; + pthread_create(&th, 0, start_routine, 0); + pthread_join(th, 0); + pthread_attr_init(&attr); + pthread_cleanup_push(routine, 0); + pthread_cleanup_pop(0) /* ; */ + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ax_pthread_ok=yes +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 +$as_echo "$ax_pthread_ok" >&6; } + if test "x$ax_pthread_ok" = xyes; then + break; + fi + + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" +done +fi + +# Various other checks: +if test "x$ax_pthread_ok" = xyes; then + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5 +$as_echo_n "checking for joinable pthread attribute... " >&6; } + attr_name=unknown + for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +int attr = $attr; return attr /* ; */ + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + attr_name=$attr; break +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + done + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $attr_name" >&5 +$as_echo "$attr_name" >&6; } + if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then + +cat >>confdefs.h <<_ACEOF +#define PTHREAD_CREATE_JOINABLE $attr_name +_ACEOF + + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if more special flags are required for pthreads" >&5 +$as_echo_n "checking if more special flags are required for pthreads... " >&6; } + flag=no + case ${host_os} in + aix* | freebsd* | darwin*) flag="-D_THREAD_SAFE";; + osf* | hpux*) flag="-D_REENTRANT";; + solaris*) + if test "$GCC" = "yes"; then + flag="-D_REENTRANT" + else + flag="-mt -D_REENTRANT" + fi + ;; + esac + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${flag}" >&5 +$as_echo "${flag}" >&6; } + if test "x$flag" != xno; then + PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PTHREAD_PRIO_INHERIT" >&5 +$as_echo_n "checking for PTHREAD_PRIO_INHERIT... " >&6; } +if ${ax_cv_PTHREAD_PRIO_INHERIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include +int +main () +{ +int i = PTHREAD_PRIO_INHERIT; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ax_cv_PTHREAD_PRIO_INHERIT=yes +else + ax_cv_PTHREAD_PRIO_INHERIT=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_PRIO_INHERIT" >&5 +$as_echo "$ax_cv_PTHREAD_PRIO_INHERIT" >&6; } + if test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes"; then : + +$as_echo "#define HAVE_PTHREAD_PRIO_INHERIT 1" >>confdefs.h + +fi + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + # More AIX lossage: must compile with xlc_r or cc_r + if test x"$GCC" != xyes; then + for ac_prog in xlc_r cc_r +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_PTHREAD_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$PTHREAD_CC"; then + ac_cv_prog_PTHREAD_CC="$PTHREAD_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_PTHREAD_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +PTHREAD_CC=$ac_cv_prog_PTHREAD_CC +if test -n "$PTHREAD_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5 +$as_echo "$PTHREAD_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$PTHREAD_CC" && break +done +test -n "$PTHREAD_CC" || PTHREAD_CC="${CC}" + + else + PTHREAD_CC=$CC + fi +else + PTHREAD_CC="$CC" +fi + + + + + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test x"$ax_pthread_ok" = xyes; then + +$as_echo "#define HAVE_PTHREAD 1" >>confdefs.h + + : +else + ax_pthread_ok=no + as_fn_error $? "JIT support requires pthreads" "$LINENO" 5 +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + CC="$PTHREAD_CC" + CFLAGS="$PTHREAD_CFLAGS $CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + fi + +$as_echo "#define SUPPORT_JIT /**/" >>confdefs.h + +else + enable_pcregrep_jit="no" +fi + +if test "$enable_pcregrep_jit" = "yes"; then + +$as_echo "#define SUPPORT_PCREGREP_JIT /**/" >>confdefs.h + +fi + +if test "$enable_utf" = "yes"; then + +$as_echo "#define SUPPORT_UTF /**/" >>confdefs.h + +fi + +if test "$enable_unicode_properties" = "yes"; then + +$as_echo "#define SUPPORT_UCP /**/" >>confdefs.h + +fi + +if test "$enable_stack_for_recursion" = "no"; then + +$as_echo "#define NO_RECURSE /**/" >>confdefs.h + +fi + +if test "$enable_pcregrep_libz" = "yes"; then + +$as_echo "#define SUPPORT_LIBZ /**/" >>confdefs.h + +fi + +if test "$enable_pcregrep_libbz2" = "yes"; then + +$as_echo "#define SUPPORT_LIBBZ2 /**/" >>confdefs.h + +fi + +if test $with_pcregrep_bufsize -lt 8192 ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $with_pcregrep_bufsize is too small for --with-pcregrep-bufsize; using 8192" >&5 +$as_echo "$as_me: WARNING: $with_pcregrep_bufsize is too small for --with-pcregrep-bufsize; using 8192" >&2;} + with_pcregrep_bufsize="8192" +else + if test $? -gt 1 ; then + as_fn_error $? "Bad value for --with-pcregrep-bufsize" "$LINENO" 5 + fi +fi + + +cat >>confdefs.h <<_ACEOF +#define PCREGREP_BUFSIZE $with_pcregrep_bufsize +_ACEOF + + +if test "$enable_pcretest_libedit" = "yes"; then + +$as_echo "#define SUPPORT_LIBEDIT /**/" >>confdefs.h + + LIBREADLINE="$LIBEDIT" +elif test "$enable_pcretest_libreadline" = "yes"; then + +$as_echo "#define SUPPORT_LIBREADLINE /**/" >>confdefs.h + +fi + + +cat >>confdefs.h <<_ACEOF +#define NEWLINE $ac_pcre_newline_value +_ACEOF + + +if test "$enable_bsr_anycrlf" = "yes"; then + +$as_echo "#define BSR_ANYCRLF /**/" >>confdefs.h + +fi + + +cat >>confdefs.h <<_ACEOF +#define LINK_SIZE $with_link_size +_ACEOF + + + +cat >>confdefs.h <<_ACEOF +#define POSIX_MALLOC_THRESHOLD $with_posix_malloc_threshold +_ACEOF + + + +cat >>confdefs.h <<_ACEOF +#define PARENS_NEST_LIMIT $with_parens_nest_limit +_ACEOF + + + +cat >>confdefs.h <<_ACEOF +#define MATCH_LIMIT $with_match_limit +_ACEOF + + + +cat >>confdefs.h <<_ACEOF +#define MATCH_LIMIT_RECURSION $with_match_limit_recursion +_ACEOF + + + +$as_echo "#define MAX_NAME_SIZE 32" >>confdefs.h + + + +$as_echo "#define MAX_NAME_COUNT 10000" >>confdefs.h + + + + +if test "$enable_ebcdic" = "yes"; then + +cat >>confdefs.h <<_ACEOF +#define EBCDIC /**/ +_ACEOF + +fi + +if test "$enable_ebcdic_nl25" = "yes"; then + +cat >>confdefs.h <<_ACEOF +#define EBCDIC_NL25 /**/ +_ACEOF + +fi + +if test "$enable_valgrind" = "yes"; then + +cat >>confdefs.h <<_ACEOF +#define SUPPORT_VALGRIND /**/ +_ACEOF + +fi + +# Platform specific issues +NO_UNDEFINED= +EXPORT_ALL_SYMBOLS= +case $host_os in + cygwin* | mingw* ) + if test X"$enable_shared" = Xyes; then + NO_UNDEFINED="-no-undefined" + EXPORT_ALL_SYMBOLS="-Wl,--export-all-symbols" + fi + ;; +esac + +# The extra LDFLAGS for each particular library +# (Note: The libpcre*_version bits are m4 variables, assigned above) + +EXTRA_LIBPCRE_LDFLAGS="$EXTRA_LIBPCRE_LDFLAGS \ + $NO_UNDEFINED -version-info 3:12:2" + +EXTRA_LIBPCRE16_LDFLAGS="$EXTRA_LIBPCRE16_LDFLAGS \ + $NO_UNDEFINED -version-info 2:12:2" + +EXTRA_LIBPCRE32_LDFLAGS="$EXTRA_LIBPCRE32_LDFLAGS \ + $NO_UNDEFINED -version-info 0:12:0" + +EXTRA_LIBPCREPOSIX_LDFLAGS="$EXTRA_LIBPCREPOSIX_LDFLAGS \ + $NO_UNDEFINED -version-info 0:7:0" + +EXTRA_LIBPCRECPP_LDFLAGS="$EXTRA_LIBPCRECPP_LDFLAGS \ + $NO_UNDEFINED -version-info 0:2:0 \ + $EXPORT_ALL_SYMBOLS" + + + + + + + +# When we run 'make distcheck', use these arguments. Turning off compiler +# optimization makes it run faster. +DISTCHECK_CONFIGURE_FLAGS="CFLAGS='' CXXFLAGS='' --enable-pcre16 --enable-pcre32 --enable-jit --enable-cpp --enable-unicode-properties" + + +# Check that, if --enable-pcregrep-libz or --enable-pcregrep-libbz2 is +# specified, the relevant library is available. + +if test "$enable_pcregrep_libz" = "yes"; then + if test "$HAVE_ZLIB_H" != "1"; then + echo "** Cannot --enable-pcregrep-libz because zlib.h was not found" + exit 1 + fi + if test "$HAVE_LIBZ" != "1"; then + echo "** Cannot --enable-pcregrep-libz because libz was not found" + exit 1 + fi + LIBZ="-lz" +fi + + +if test "$enable_pcregrep_libbz2" = "yes"; then + if test "$HAVE_BZLIB_H" != "1"; then + echo "** Cannot --enable-pcregrep-libbz2 because bzlib.h was not found" + exit 1 + fi + if test "$HAVE_LIBBZ2" != "1"; then + echo "** Cannot --enable-pcregrep-libbz2 because libbz2 was not found" + exit 1 + fi + LIBBZ2="-lbz2" +fi + + +# Similarly for --enable-pcretest-readline + +if test "$enable_pcretest_libedit" = "yes"; then + if test "$enable_pcretest_libreadline" = "yes"; then + echo "** Cannot use both --enable-pcretest-libedit and --enable-pcretest-readline" + exit 1 + fi + if test "$HAVE_EDITLINE_READLINE_H" != "1" -a \ + "$HAVE_READLINE_READLINE_H" != "1"; then + echo "** Cannot --enable-pcretest-libedit because neither editline/readline.h" + echo "** nor readline/readline.h was found." + exit 1 + fi + if test -z "$LIBEDIT"; then + echo "** Cannot --enable-pcretest-libedit because libedit library was not found." + exit 1 + fi +fi + +if test "$enable_pcretest_libreadline" = "yes"; then + if test "$HAVE_READLINE_H" != "1"; then + echo "** Cannot --enable-pcretest-readline because readline/readline.h was not found." + exit 1 + fi + if test "$HAVE_HISTORY_H" != "1"; then + echo "** Cannot --enable-pcretest-readline because readline/history.h was not found." + exit 1 + fi + if test -z "$LIBREADLINE"; then + echo "** Cannot --enable-pcretest-readline because readline library was not found." + exit 1 + fi +fi + +# Handle valgrind support + +if test "$enable_valgrind" = "yes"; then + + + + + + + +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. +set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_PKG_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +PKG_CONFIG=$ac_cv_path_PKG_CONFIG +if test -n "$PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 +$as_echo "$PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_PKG_CONFIG"; then + ac_pt_PKG_CONFIG=$PKG_CONFIG + # Extract the first word of "pkg-config", so it can be a program name with args. +set dummy pkg-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG +if test -n "$ac_pt_PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 +$as_echo "$ac_pt_PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_PKG_CONFIG" = x; then + PKG_CONFIG="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + PKG_CONFIG=$ac_pt_PKG_CONFIG + fi +else + PKG_CONFIG="$ac_cv_path_PKG_CONFIG" +fi + +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=0.9.0 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 +$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + PKG_CONFIG="" + fi +fi + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for VALGRIND" >&5 +$as_echo_n "checking for VALGRIND... " >&6; } + +if test -n "$VALGRIND_CFLAGS"; then + pkg_cv_VALGRIND_CFLAGS="$VALGRIND_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"valgrind\""; } >&5 + ($PKG_CONFIG --exists --print-errors "valgrind") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_VALGRIND_CFLAGS=`$PKG_CONFIG --cflags "valgrind" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$VALGRIND_LIBS"; then + pkg_cv_VALGRIND_LIBS="$VALGRIND_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"valgrind\""; } >&5 + ($PKG_CONFIG --exists --print-errors "valgrind") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_VALGRIND_LIBS=`$PKG_CONFIG --libs "valgrind" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + VALGRIND_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "valgrind" 2>&1` + else + VALGRIND_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "valgrind" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$VALGRIND_PKG_ERRORS" >&5 + + as_fn_error $? "Package requirements (valgrind) were not met: + +$VALGRIND_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +Alternatively, you may set the environment variables VALGRIND_CFLAGS +and VALGRIND_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details." "$LINENO" 5 +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +Alternatively, you may set the environment variables VALGRIND_CFLAGS +and VALGRIND_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details. + +To get pkg-config, see . +See \`config.log' for more details" "$LINENO" 5; } +else + VALGRIND_CFLAGS=$pkg_cv_VALGRIND_CFLAGS + VALGRIND_LIBS=$pkg_cv_VALGRIND_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +fi +fi + +# Handle code coverage reporting support +if test "$enable_coverage" = "yes"; then + if test "x$GCC" != "xyes"; then + as_fn_error $? "Code coverage reports can only be generated when using GCC" "$LINENO" 5 + fi + + # ccache is incompatible with gcov + # Extract the first word of "shtool", so it can be a program name with args. +set dummy shtool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_SHTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $SHTOOL in + [\\/]* | ?:[\\/]*) + ac_cv_path_SHTOOL="$SHTOOL" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_SHTOOL="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_SHTOOL" && ac_cv_path_SHTOOL="false" + ;; +esac +fi +SHTOOL=$ac_cv_path_SHTOOL +if test -n "$SHTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SHTOOL" >&5 +$as_echo "$SHTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + case `$SHTOOL path $CC` in + *ccache*) cc_ccache=yes;; + *) cc_ccache=no;; + esac + + if test "$cc_ccache" = "yes"; then + if test -z "$CCACHE_DISABLE" -o "$CCACHE_DISABLE" != "1"; then + as_fn_error $? "must export CCACHE_DISABLE=1 to disable ccache for code coverage" "$LINENO" 5 + fi + fi + + + # Extract the first word of "lcov", so it can be a program name with args. +set dummy lcov; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_LCOV+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $LCOV in + [\\/]* | ?:[\\/]*) + ac_cv_path_LCOV="$LCOV" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_LCOV="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_LCOV" && ac_cv_path_LCOV="false" + ;; +esac +fi +LCOV=$ac_cv_path_LCOV +if test -n "$LCOV"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LCOV" >&5 +$as_echo "$LCOV" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test "x$LCOV" = "xfalse"; then + as_fn_error $? "lcov not found" "$LINENO" 5 + fi + + + # Extract the first word of "genhtml", so it can be a program name with args. +set dummy genhtml; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_GENHTML+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $GENHTML in + [\\/]* | ?:[\\/]*) + ac_cv_path_GENHTML="$GENHTML" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_GENHTML="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_GENHTML" && ac_cv_path_GENHTML="false" + ;; +esac +fi +GENHTML=$ac_cv_path_GENHTML +if test -n "$GENHTML"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GENHTML" >&5 +$as_echo "$GENHTML" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test "x$GENHTML" = "xfalse"; then + as_fn_error $? "genhtml not found" "$LINENO" 5 + fi + + # Set flags needed for gcov + GCOV_CFLAGS="-O0 -ggdb3 -fprofile-arcs -ftest-coverage" + GCOV_CXXFLAGS="-O0 -ggdb3 -fprofile-arcs -ftest-coverage" + GCOV_LIBS="-lgcov" + + + +fi # enable_coverage + + if test "x$enable_coverage" = "xyes"; then + WITH_GCOV_TRUE= + WITH_GCOV_FALSE='#' +else + WITH_GCOV_TRUE='#' + WITH_GCOV_FALSE= +fi + + +# Produce these files, in addition to config.h. +ac_config_files="$ac_config_files Makefile libpcre.pc libpcre16.pc libpcre32.pc libpcreposix.pc libpcrecpp.pc pcre-config pcre.h pcre_stringpiece.h pcrecpparg.h" + + +# Make the generated script files executable. +ac_config_commands="$ac_config_commands script-chmod" + + +# Make sure that pcre_chartables.c is removed in case the method for +# creating it was changed by reconfiguration. +ac_config_commands="$ac_config_commands delete-old-chartables" + + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 +$as_echo_n "checking that generated files are newer than configure... " >&6; } + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 +$as_echo "done" >&6; } + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= +fi + +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${WITH_PCRE8_TRUE}" && test -z "${WITH_PCRE8_FALSE}"; then + as_fn_error $? "conditional \"WITH_PCRE8\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${WITH_PCRE16_TRUE}" && test -z "${WITH_PCRE16_FALSE}"; then + as_fn_error $? "conditional \"WITH_PCRE16\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${WITH_PCRE32_TRUE}" && test -z "${WITH_PCRE32_FALSE}"; then + as_fn_error $? "conditional \"WITH_PCRE32\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${WITH_PCRE_CPP_TRUE}" && test -z "${WITH_PCRE_CPP_FALSE}"; then + as_fn_error $? "conditional \"WITH_PCRE_CPP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${WITH_REBUILD_CHARTABLES_TRUE}" && test -z "${WITH_REBUILD_CHARTABLES_FALSE}"; then + as_fn_error $? "conditional \"WITH_REBUILD_CHARTABLES\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${WITH_JIT_TRUE}" && test -z "${WITH_JIT_FALSE}"; then + as_fn_error $? "conditional \"WITH_JIT\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${WITH_UTF_TRUE}" && test -z "${WITH_UTF_FALSE}"; then + as_fn_error $? "conditional \"WITH_UTF\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${WITH_VALGRIND_TRUE}" && test -z "${WITH_VALGRIND_FALSE}"; then + as_fn_error $? "conditional \"WITH_VALGRIND\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${WITH_GCOV_TRUE}" && test -z "${WITH_GCOV_FALSE}"; then + as_fn_error $? "conditional \"WITH_GCOV\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by PCRE $as_me 8.44, which was +generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to the package provider." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +PCRE config.status 8.44 +configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2012 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}" + + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +AS='`$ECHO "$AS" | $SED "$delay_single_quote_subst"`' +DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' +OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' +macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' +macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' +enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' +enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' +pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' +enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' +shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`' +SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' +ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' +PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' +host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' +host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' +host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' +build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' +build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' +build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' +SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' +Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' +GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' +EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' +FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' +LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' +NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' +LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' +max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' +ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' +exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' +lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' +lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' +lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' +lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' +lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' +reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' +reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' +deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' +file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' +file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' +want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' +sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' +AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' +lt_ar_flags='`$ECHO "$lt_ar_flags" | $SED "$delay_single_quote_subst"`' +AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' +archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' +STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' +RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' +old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' +old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' +lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' +CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' +CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' +compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' +GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' +lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`' +nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' +lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' +lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`' +objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' +MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' +need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' +MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' +DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' +NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' +LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' +OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' +OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' +libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' +shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' +extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' +compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' +module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' +with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' +no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' +hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' +hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' +inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' +link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' +always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' +exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' +include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' +prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' +postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' +file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' +variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' +need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' +need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' +version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' +runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' +libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' +library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' +soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' +install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' +postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' +postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' +finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' +hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' +sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' +configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`' +configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`' +hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' +enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' +old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' +striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' +predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' +postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' +predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' +postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' +LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' +reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' +reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' +compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' +GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' +archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' +module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' +with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' +no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' +inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' +link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' +always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' +exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' +include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' +prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' +postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' +file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' +predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' +postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' +predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' +postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' + +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in AS \ +DLLTOOL \ +OBJDUMP \ +SHELL \ +ECHO \ +PATH_SEPARATOR \ +SED \ +GREP \ +EGREP \ +FGREP \ +LD \ +NM \ +LN_S \ +lt_SP2NL \ +lt_NL2SP \ +reload_flag \ +deplibs_check_method \ +file_magic_cmd \ +file_magic_glob \ +want_nocaseglob \ +sharedlib_from_linklib_cmd \ +AR \ +archiver_list_spec \ +STRIP \ +RANLIB \ +CC \ +CFLAGS \ +compiler \ +lt_cv_sys_global_symbol_pipe \ +lt_cv_sys_global_symbol_to_cdecl \ +lt_cv_sys_global_symbol_to_import \ +lt_cv_sys_global_symbol_to_c_name_address \ +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ +lt_cv_nm_interface \ +nm_file_list_spec \ +lt_cv_truncate_bin \ +lt_prog_compiler_no_builtin_flag \ +lt_prog_compiler_pic \ +lt_prog_compiler_wl \ +lt_prog_compiler_static \ +lt_cv_prog_compiler_c_o \ +need_locks \ +MANIFEST_TOOL \ +DSYMUTIL \ +NMEDIT \ +LIPO \ +OTOOL \ +OTOOL64 \ +shrext_cmds \ +export_dynamic_flag_spec \ +whole_archive_flag_spec \ +compiler_needs_object \ +with_gnu_ld \ +allow_undefined_flag \ +no_undefined_flag \ +hardcode_libdir_flag_spec \ +hardcode_libdir_separator \ +exclude_expsyms \ +include_expsyms \ +file_list_spec \ +variables_saved_for_relink \ +libname_spec \ +library_names_spec \ +soname_spec \ +install_override_mode \ +finish_eval \ +old_striplib \ +striplib \ +compiler_lib_search_dirs \ +predep_objects \ +postdep_objects \ +predeps \ +postdeps \ +compiler_lib_search_path \ +LD_CXX \ +reload_flag_CXX \ +compiler_CXX \ +lt_prog_compiler_no_builtin_flag_CXX \ +lt_prog_compiler_pic_CXX \ +lt_prog_compiler_wl_CXX \ +lt_prog_compiler_static_CXX \ +lt_cv_prog_compiler_c_o_CXX \ +export_dynamic_flag_spec_CXX \ +whole_archive_flag_spec_CXX \ +compiler_needs_object_CXX \ +with_gnu_ld_CXX \ +allow_undefined_flag_CXX \ +no_undefined_flag_CXX \ +hardcode_libdir_flag_spec_CXX \ +hardcode_libdir_separator_CXX \ +exclude_expsyms_CXX \ +include_expsyms_CXX \ +file_list_spec_CXX \ +compiler_lib_search_dirs_CXX \ +predep_objects_CXX \ +postdep_objects_CXX \ +predeps_CXX \ +postdeps_CXX \ +compiler_lib_search_path_CXX; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in reload_cmds \ +old_postinstall_cmds \ +old_postuninstall_cmds \ +old_archive_cmds \ +extract_expsyms_cmds \ +old_archive_from_new_cmds \ +old_archive_from_expsyms_cmds \ +archive_cmds \ +archive_expsym_cmds \ +module_cmds \ +module_expsym_cmds \ +export_symbols_cmds \ +prelink_cmds \ +postlink_cmds \ +postinstall_cmds \ +postuninstall_cmds \ +finish_cmds \ +sys_lib_search_path_spec \ +configure_time_dlsearch_path \ +configure_time_lt_sys_library_path \ +reload_cmds_CXX \ +old_archive_cmds_CXX \ +old_archive_from_new_cmds_CXX \ +old_archive_from_expsyms_cmds_CXX \ +archive_cmds_CXX \ +archive_expsym_cmds_CXX \ +module_cmds_CXX \ +module_expsym_cmds_CXX \ +export_symbols_cmds_CXX \ +prelink_cmds_CXX \ +postlink_cmds_CXX; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +ac_aux_dir='$ac_aux_dir' + +# See if we are running on zsh, and set the options that allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + + + PACKAGE='$PACKAGE' + VERSION='$VERSION' + RM='$RM' + ofile='$ofile' + + + + + + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "libpcre.pc") CONFIG_FILES="$CONFIG_FILES libpcre.pc" ;; + "libpcre16.pc") CONFIG_FILES="$CONFIG_FILES libpcre16.pc" ;; + "libpcre32.pc") CONFIG_FILES="$CONFIG_FILES libpcre32.pc" ;; + "libpcreposix.pc") CONFIG_FILES="$CONFIG_FILES libpcreposix.pc" ;; + "libpcrecpp.pc") CONFIG_FILES="$CONFIG_FILES libpcrecpp.pc" ;; + "pcre-config") CONFIG_FILES="$CONFIG_FILES pcre-config" ;; + "pcre.h") CONFIG_FILES="$CONFIG_FILES pcre.h" ;; + "pcre_stringpiece.h") CONFIG_FILES="$CONFIG_FILES pcre_stringpiece.h" ;; + "pcrecpparg.h") CONFIG_FILES="$CONFIG_FILES pcrecpparg.h" ;; + "script-chmod") CONFIG_COMMANDS="$CONFIG_COMMANDS script-chmod" ;; + "delete-old-chartables") CONFIG_COMMANDS="$CONFIG_COMMANDS delete-old-chartables" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi +# Compute "$ac_file"'s index in $config_headers. +_am_arg="$ac_file" +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || +$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$_am_arg" : 'X\(//\)[^/]' \| \ + X"$_am_arg" : 'X\(//\)$' \| \ + X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$_am_arg" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + # TODO: see whether this extra hack can be removed once we start + # requiring Autoconf 2.70 or later. + case $CONFIG_FILES in #( + *\'*) : + eval set x "$CONFIG_FILES" ;; #( + *) : + set x $CONFIG_FILES ;; #( + *) : + ;; +esac + shift + # Used to flag and report bootstrapping failures. + am_rc=0 + for am_mf + do + # Strip MF so we end up with the name of the file. + am_mf=`$as_echo "$am_mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile which includes + # dependency-tracking related rules and includes. + # Grep'ing the whole file directly is not great: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ + || continue + am_dirpart=`$as_dirname -- "$am_mf" || +$as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$am_mf" : 'X\(//\)[^/]' \| \ + X"$am_mf" : 'X\(//\)$' \| \ + X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$am_mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + am_filepart=`$as_basename -- "$am_mf" || +$as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \ + X"$am_mf" : 'X\(//\)$' \| \ + X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$am_mf" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + { echo "$as_me:$LINENO: cd "$am_dirpart" \ + && sed -e '/# am--include-marker/d' "$am_filepart" \ + | $MAKE -f - am--depfiles" >&5 + (cd "$am_dirpart" \ + && sed -e '/# am--include-marker/d' "$am_filepart" \ + | $MAKE -f - am--depfiles) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } || am_rc=$? + done + if test $am_rc -ne 0; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "Something went wrong bootstrapping makefile fragments + for automatic dependency tracking. Try re-running configure with the + '--disable-dependency-tracking' option to at least be able to build + the package (albeit without support for automatic dependency tracking). +See \`config.log' for more details" "$LINENO" 5; } + fi + { am_dirpart=; unset am_dirpart;} + { am_filepart=; unset am_filepart;} + { am_mf=; unset am_mf;} + { am_rc=; unset am_rc;} + rm -f conftest-deps.mk +} + ;; + "libtool":C) + + # See if we are running on zsh, and set the options that allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST + fi + + cfgfile=${ofile}T + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL +# Generated automatically by $as_me ($PACKAGE) $VERSION +# NOTE: Changes made to this file will be lost: look at ltmain.sh. + +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit, 1996 + +# Copyright (C) 2014 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program or library that is built +# using GNU Libtool, you may include this file under the same +# distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +# The names of the tagged configurations supported by this script. +available_tags='CXX ' + +# Configured defaults for sys_lib_dlsearch_path munging. +: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} + +# ### BEGIN LIBTOOL CONFIG + +# Assembler program. +AS=$lt_AS + +# DLL creation program. +DLLTOOL=$lt_DLLTOOL + +# Object dumper program. +OBJDUMP=$lt_OBJDUMP + +# Which release of libtool.m4 was used? +macro_version=$macro_version +macro_revision=$macro_revision + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# What type of objects to build. +pic_mode=$pic_mode + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# Shared archive member basename,for filename based shared library versioning on AIX. +shared_archive_member_spec=$shared_archive_member_spec + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# An echo program that protects backslashes. +ECHO=$lt_ECHO + +# The PATH separator for the build system. +PATH_SEPARATOR=$lt_PATH_SEPARATOR + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="\$SED -e 1s/^X//" + +# A grep program that handles long lines. +GREP=$lt_GREP + +# An ERE matcher. +EGREP=$lt_EGREP + +# A literal string matcher. +FGREP=$lt_FGREP + +# A BSD- or MS-compatible name lister. +NM=$lt_NM + +# Whether we need soft or hard links. +LN_S=$lt_LN_S + +# What is the maximum length of a command? +max_cmd_len=$max_cmd_len + +# Object file suffix (normally "o"). +objext=$ac_objext + +# Executable file suffix (normally ""). +exeext=$exeext + +# whether the shell understands "unset". +lt_unset=$lt_unset + +# turn spaces into newlines. +SP2NL=$lt_lt_SP2NL + +# turn newlines into spaces. +NL2SP=$lt_lt_NL2SP + +# convert \$build file names to \$host format. +to_host_file_cmd=$lt_cv_to_host_file_cmd + +# convert \$build files to toolchain format. +to_tool_file_cmd=$lt_cv_to_tool_file_cmd + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method = "file_magic". +file_magic_cmd=$lt_file_magic_cmd + +# How to find potential files when deplibs_check_method = "file_magic". +file_magic_glob=$lt_file_magic_glob + +# Find potential files using nocaseglob when deplibs_check_method = "file_magic". +want_nocaseglob=$lt_want_nocaseglob + +# Command to associate shared and link libraries. +sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd + +# The archiver. +AR=$lt_AR + +# Flags to create an archive (by configure). +lt_ar_flags=$lt_ar_flags + +# Flags to create an archive. +AR_FLAGS=\${ARFLAGS-"\$lt_ar_flags"} + +# How to feed a file listing to the archiver. +archiver_list_spec=$lt_archiver_list_spec + +# A symbol stripping program. +STRIP=$lt_STRIP + +# Commands used to install an old-style archive. +RANLIB=$lt_RANLIB +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Whether to use a lock for old archive extraction. +lock_old_archive_extraction=$lock_old_archive_extraction + +# A C compiler. +LTCC=$lt_CC + +# LTCC compiler flags. +LTCFLAGS=$lt_CFLAGS + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration. +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm into a list of symbols to manually relocate. +global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import + +# Transform the output of nm in a C name address pair. +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# Transform the output of nm in a C name address pair when lib prefix is needed. +global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix + +# The name lister interface. +nm_interface=$lt_lt_cv_nm_interface + +# Specify filename containing input files for \$NM. +nm_file_list_spec=$lt_nm_file_list_spec + +# The root where to search for dependent libraries,and where our libraries should be installed. +lt_sysroot=$lt_sysroot + +# Command to truncate a binary pipe. +lt_truncate_bin=$lt_lt_cv_truncate_bin + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# Used to examine libraries when file_magic_cmd begins with "file". +MAGIC_CMD=$MAGIC_CMD + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Manifest tool. +MANIFEST_TOOL=$lt_MANIFEST_TOOL + +# Tool to manipulate archived DWARF debug symbol files on Mac OS X. +DSYMUTIL=$lt_DSYMUTIL + +# Tool to change global to local symbols on Mac OS X. +NMEDIT=$lt_NMEDIT + +# Tool to manipulate fat objects and archives on Mac OS X. +LIPO=$lt_LIPO + +# ldd/readelf like tool for Mach-O binaries on Mac OS X. +OTOOL=$lt_OTOOL + +# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. +OTOOL64=$lt_OTOOL64 + +# Old archive suffix (normally "a"). +libext=$libext + +# Shared library suffix (normally ".so"). +shrext_cmds=$lt_shrext_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at link time. +variables_saved_for_relink=$lt_variables_saved_for_relink + +# Do we need the "lib" prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Library versioning type. +version_type=$version_type + +# Shared library runtime path variable. +runpath_var=$runpath_var + +# Shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Permission mode override for installation of shared libraries. +install_override_mode=$lt_install_override_mode + +# Command to use after installation of a shared archive. +postinstall_cmds=$lt_postinstall_cmds + +# Command to use after uninstallation of a shared archive. +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# As "finish_cmds", except a single script fragment to be evaled but +# not shown. +finish_eval=$lt_finish_eval + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Compile-time system search path for libraries. +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Detected run-time system search path for libraries. +sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path + +# Explicit LT_SYS_LIBRARY_PATH set during ./configure time. +configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + + +# The linker used to build libraries. +LD=$lt_LD + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds + +# A language specific compiler. +CC=$lt_compiler + +# Is the compiler the GNU compiler? +with_gcc=$GCC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds +module_expsym_cmds=$lt_module_expsym_cmds + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \$shlibpath_var if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects +postdep_objects=$lt_postdep_objects +predeps=$lt_predeps +postdeps=$lt_postdeps + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path + +# ### END LIBTOOL CONFIG + +_LT_EOF + + cat <<'_LT_EOF' >> "$cfgfile" + +# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE + +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x$2 in + x) + ;; + *:) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" + ;; + x:*) + eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" + ;; + *) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" + ;; + esac +} + + +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in $*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} + + +# ### END FUNCTIONS SHARED WITH CONFIGURE + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + +ltmain=$ac_aux_dir/ltmain.sh + + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + + + cat <<_LT_EOF >> "$ofile" + +# ### BEGIN LIBTOOL TAG CONFIG: CXX + +# The linker used to build libraries. +LD=$lt_LD_CXX + +# How to create reloadable object files. +reload_flag=$lt_reload_flag_CXX +reload_cmds=$lt_reload_cmds_CXX + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds_CXX + +# A language specific compiler. +CC=$lt_compiler_CXX + +# Is the compiler the GNU compiler? +with_gcc=$GCC_CXX + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_CXX + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_CXX + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_CXX + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_CXX + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object_CXX + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds_CXX +archive_expsym_cmds=$lt_archive_expsym_cmds_CXX + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds_CXX +module_expsym_cmds=$lt_module_expsym_cmds_CXX + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld_CXX + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_CXX + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_CXX + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct_CXX + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \$shlibpath_var if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute_CXX + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L_CXX + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic_CXX + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath_CXX + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_CXX + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols_CXX + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_CXX + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_CXX + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_CXX + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds_CXX + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds_CXX + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec_CXX + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_CXX + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects_CXX +postdep_objects=$lt_postdep_objects_CXX +predeps=$lt_predeps_CXX +postdeps=$lt_postdeps_CXX + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_CXX + +# ### END LIBTOOL TAG CONFIG: CXX +_LT_EOF + + ;; + "script-chmod":C) chmod a+x pcre-config ;; + "delete-old-chartables":C) rm -f pcre_chartables.c ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + + +# Print out a nice little message after configure is run displaying the +# chosen options. + +ebcdic_nl_code=n/a +if test "$enable_ebcdic_nl25" = "yes"; then + ebcdic_nl_code=0x25 +elif test "$enable_ebcdic" = "yes"; then + ebcdic_nl_code=0x15 +fi + +cat <], + [char* e; return $fn("100", &e, 10)])], + [AC_MSG_RESULT(yes) + AC_DEFINE_UNQUOTED(HAVE_`echo $fn | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`, 1, + [Define to 1 if you have `$fn'.]) + have_strto_fn=1 + break], + [AC_MSG_RESULT(no)]) +done + +if test "$have_strto_fn" = 1; then + AC_CHECK_TYPES([long long], + [pcre_have_long_long="1"], + [pcre_have_long_long="0"]) + AC_CHECK_TYPES([unsigned long long], + [pcre_have_ulong_long="1"], + [pcre_have_ulong_long="0"]) +else + pcre_have_long_long="0" + pcre_have_ulong_long="0" +fi +AC_SUBST(pcre_have_long_long) +AC_SUBST(pcre_have_ulong_long) + +AC_LANG_POP +fi +# Using AC_SUBST eliminates the need to include config.h in a public .h file +AC_SUBST(pcre_have_type_traits) +AC_SUBST(pcre_have_bits_type_traits) + +# Conditional compilation +AM_CONDITIONAL(WITH_PCRE8, test "x$enable_pcre8" = "xyes") +AM_CONDITIONAL(WITH_PCRE16, test "x$enable_pcre16" = "xyes") +AM_CONDITIONAL(WITH_PCRE32, test "x$enable_pcre32" = "xyes") +AM_CONDITIONAL(WITH_PCRE_CPP, test "x$enable_cpp" = "xyes") +AM_CONDITIONAL(WITH_REBUILD_CHARTABLES, test "x$enable_rebuild_chartables" = "xyes") +AM_CONDITIONAL(WITH_JIT, test "x$enable_jit" = "xyes") +AM_CONDITIONAL(WITH_UTF, test "x$enable_utf" = "xyes") +AM_CONDITIONAL(WITH_VALGRIND, test "x$enable_valgrind" = "xyes") + +# Checks for typedefs, structures, and compiler characteristics. + +AC_C_CONST +AC_TYPE_SIZE_T + +# Checks for library functions. + +AC_CHECK_FUNCS(bcopy memmove strerror) + +# Check for the availability of libz (aka zlib) + +AC_CHECK_HEADERS([zlib.h], [HAVE_ZLIB_H=1]) +AC_CHECK_LIB([z], [gzopen], [HAVE_LIBZ=1]) + +# Check for the availability of libbz2. Originally we just used AC_CHECK_LIB, +# as for libz. However, this had the following problem, diagnosed and fixed by +# a user: +# +# - libbz2 uses the Pascal calling convention (WINAPI) for the functions +# under Win32. +# - The standard autoconf AC_CHECK_LIB fails to include "bzlib.h", +# therefore missing the function definition. +# - The compiler thus generates a "C" signature for the test function. +# - The linker fails to find the "C" function. +# - PCRE fails to configure if asked to do so against libbz2. +# +# Solution: +# +# - Replace the AC_CHECK_LIB test with a custom test. + +AC_CHECK_HEADERS([bzlib.h], [HAVE_BZLIB_H=1]) +# Original test +# AC_CHECK_LIB([bz2], [BZ2_bzopen], [HAVE_LIBBZ2=1]) +# +# Custom test follows + +AC_MSG_CHECKING([for libbz2]) +OLD_LIBS="$LIBS" +LIBS="$LIBS -lbz2" +AC_LINK_IFELSE([AC_LANG_PROGRAM([[ +#ifdef HAVE_BZLIB_H +#include +#endif]], +[[return (int)BZ2_bzopen("conftest", "rb");]])], +[AC_MSG_RESULT([yes]);HAVE_LIBBZ2=1; break;], +AC_MSG_RESULT([no])) +LIBS="$OLD_LIBS" + +# Check for the availabiity of libreadline + +if test "$enable_pcretest_libreadline" = "yes"; then + AC_CHECK_HEADERS([readline/readline.h], [HAVE_READLINE_H=1]) + AC_CHECK_HEADERS([readline/history.h], [HAVE_HISTORY_H=1]) + AC_CHECK_LIB([readline], [readline], [LIBREADLINE="-lreadline"], + [unset ac_cv_lib_readline_readline; + AC_CHECK_LIB([readline], [readline], [LIBREADLINE="-ltinfo"], + [unset ac_cv_lib_readline_readline; + AC_CHECK_LIB([readline], [readline], [LIBREADLINE="-lcurses"], + [unset ac_cv_lib_readline_readline; + AC_CHECK_LIB([readline], [readline], [LIBREADLINE="-lncurses"], + [unset ac_cv_lib_readline_readline; + AC_CHECK_LIB([readline], [readline], [LIBREADLINE="-lncursesw"], + [unset ac_cv_lib_readline_readline; + AC_CHECK_LIB([readline], [readline], [LIBREADLINE="-ltermcap"], + [LIBREADLINE=""], + [-ltermcap])], + [-lncursesw])], + [-lncurses])], + [-lcurses])], + [-ltinfo])]) + AC_SUBST(LIBREADLINE) + if test -n "$LIBREADLINE"; then + if test "$LIBREADLINE" != "-lreadline"; then + echo "-lreadline needs $LIBREADLINE" + LIBREADLINE="-lreadline $LIBREADLINE" + fi + fi +fi + + +# Check for the availability of libedit. Different distributions put its +# headers in different places. Try to cover the most common ones. + +if test "$enable_pcretest_libedit" = "yes"; then + AC_CHECK_HEADERS([editline/readline.h], [HAVE_EDITLINE_READLINE_H=1], + [AC_CHECK_HEADERS([edit/readline/readline.h], [HAVE_READLINE_READLINE_H=1], + [AC_CHECK_HEADERS([readline/readline.h], [HAVE_READLINE_READLINE_H=1])])]) + AC_CHECK_LIB([edit], [readline], [LIBEDIT="-ledit"]) +fi + +# This facilitates -ansi builds under Linux +dnl AC_DEFINE([_GNU_SOURCE], [], [Enable GNU extensions in glibc]) + +PCRE_STATIC_CFLAG="" +if test "x$enable_shared" = "xno" ; then + AC_DEFINE([PCRE_STATIC], [1], [ + Define to any value if linking statically (TODO: make nice with Libtool)]) + PCRE_STATIC_CFLAG="-DPCRE_STATIC" +fi +AC_SUBST(PCRE_STATIC_CFLAG) + +# Here is where pcre specific defines are handled + +if test "$enable_pcre8" = "yes"; then + AC_DEFINE([SUPPORT_PCRE8], [], [ + Define to any value to enable the 8 bit PCRE library.]) +fi + +if test "$enable_pcre16" = "yes"; then + AC_DEFINE([SUPPORT_PCRE16], [], [ + Define to any value to enable the 16 bit PCRE library.]) +fi + +if test "$enable_pcre32" = "yes"; then + AC_DEFINE([SUPPORT_PCRE32], [], [ + Define to any value to enable the 32 bit PCRE library.]) +fi + +# Unless running under Windows, JIT support requires pthreads. + +if test "$enable_jit" = "yes"; then + if test "$HAVE_WINDOWS_H" != "1"; then + AX_PTHREAD([], [AC_MSG_ERROR([JIT support requires pthreads])]) + CC="$PTHREAD_CC" + CFLAGS="$PTHREAD_CFLAGS $CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + fi + AC_DEFINE([SUPPORT_JIT], [], [ + Define to any value to enable support for Just-In-Time compiling.]) +else + enable_pcregrep_jit="no" +fi + +if test "$enable_pcregrep_jit" = "yes"; then + AC_DEFINE([SUPPORT_PCREGREP_JIT], [], [ + Define to any value to enable JIT support in pcregrep.]) +fi + +if test "$enable_utf" = "yes"; then + AC_DEFINE([SUPPORT_UTF], [], [ + Define to any value to enable support for the UTF-8/16/32 Unicode encoding. + This will work even in an EBCDIC environment, but it is incompatible + with the EBCDIC macro. That is, PCRE can support *either* EBCDIC + code *or* ASCII/UTF-8/16/32, but not both at once.]) +fi + +if test "$enable_unicode_properties" = "yes"; then + AC_DEFINE([SUPPORT_UCP], [], [ + Define to any value to enable support for Unicode properties.]) +fi + +if test "$enable_stack_for_recursion" = "no"; then + AC_DEFINE([NO_RECURSE], [], [ + PCRE uses recursive function calls to handle backtracking while + matching. This can sometimes be a problem on systems that have + stacks of limited size. Define NO_RECURSE to any value to get a + version that doesn't use recursion in the match() function; instead + it creates its own stack by steam using pcre_recurse_malloc() to obtain + memory from the heap. For more detail, see the comments and other stuff + just above the match() function.]) +fi + +if test "$enable_pcregrep_libz" = "yes"; then + AC_DEFINE([SUPPORT_LIBZ], [], [ + Define to any value to allow pcregrep to be linked with libz, so that it is + able to handle .gz files.]) +fi + +if test "$enable_pcregrep_libbz2" = "yes"; then + AC_DEFINE([SUPPORT_LIBBZ2], [], [ + Define to any value to allow pcregrep to be linked with libbz2, so that it + is able to handle .bz2 files.]) +fi + +if test $with_pcregrep_bufsize -lt 8192 ; then + AC_MSG_WARN([$with_pcregrep_bufsize is too small for --with-pcregrep-bufsize; using 8192]) + with_pcregrep_bufsize="8192" +else + if test $? -gt 1 ; then + AC_MSG_ERROR([Bad value for --with-pcregrep-bufsize]) + fi +fi + +AC_DEFINE_UNQUOTED([PCREGREP_BUFSIZE], [$with_pcregrep_bufsize], [ + The value of PCREGREP_BUFSIZE determines the size of buffer used by pcregrep + to hold parts of the file it is searching. This is also the minimum value. + The actual amount of memory used by pcregrep is three times this number, + because it allows for the buffering of "before" and "after" lines.]) + +if test "$enable_pcretest_libedit" = "yes"; then + AC_DEFINE([SUPPORT_LIBEDIT], [], [ + Define to any value to allow pcretest to be linked with libedit.]) + LIBREADLINE="$LIBEDIT" +elif test "$enable_pcretest_libreadline" = "yes"; then + AC_DEFINE([SUPPORT_LIBREADLINE], [], [ + Define to any value to allow pcretest to be linked with libreadline.]) +fi + +AC_DEFINE_UNQUOTED([NEWLINE], [$ac_pcre_newline_value], [ + The value of NEWLINE determines the default newline character sequence. PCRE + client programs can override this by selecting other values at run time. In + ASCII environments, the value can be 10 (LF), 13 (CR), or 3338 (CRLF); in + EBCDIC environments the value can be 21 or 37 (LF), 13 (CR), or 3349 or 3365 + (CRLF) because there are two alternative codepoints (0x15 and 0x25) that are + used as the NL line terminator that is equivalent to ASCII LF. In both ASCII + and EBCDIC environments the value can also be -1 (ANY), or -2 (ANYCRLF).]) + +if test "$enable_bsr_anycrlf" = "yes"; then + AC_DEFINE([BSR_ANYCRLF], [], [ + By default, the \R escape sequence matches any Unicode line ending + character or sequence of characters. If BSR_ANYCRLF is defined (to any + value), this is changed so that backslash-R matches only CR, LF, or CRLF. + The build-time default can be overridden by the user of PCRE at runtime.]) +fi + +AC_DEFINE_UNQUOTED([LINK_SIZE], [$with_link_size], [ + The value of LINK_SIZE determines the number of bytes used to store + links as offsets within the compiled regex. The default is 2, which + allows for compiled patterns up to 64K long. This covers the vast + majority of cases. However, PCRE can also be compiled to use 3 or 4 + bytes instead. This allows for longer patterns in extreme cases.]) + +AC_DEFINE_UNQUOTED([POSIX_MALLOC_THRESHOLD], [$with_posix_malloc_threshold], [ + When calling PCRE via the POSIX interface, additional working storage + is required for holding the pointers to capturing substrings because + PCRE requires three integers per substring, whereas the POSIX + interface provides only two. If the number of expected substrings is + small, the wrapper function uses space on the stack, because this is + faster than using malloc() for each call. The threshold above which + the stack is no longer used is defined by POSIX_MALLOC_THRESHOLD.]) + +AC_DEFINE_UNQUOTED([PARENS_NEST_LIMIT], [$with_parens_nest_limit], [ + The value of PARENS_NEST_LIMIT specifies the maximum depth of nested + parentheses (of any kind) in a pattern. This limits the amount of system + stack that is used while compiling a pattern.]) + +AC_DEFINE_UNQUOTED([MATCH_LIMIT], [$with_match_limit], [ + The value of MATCH_LIMIT determines the default number of times the + internal match() function can be called during a single execution of + pcre_exec(). There is a runtime interface for setting a different + limit. The limit exists in order to catch runaway regular + expressions that take for ever to determine that they do not match. + The default is set very large so that it does not accidentally catch + legitimate cases.]) + +AC_DEFINE_UNQUOTED([MATCH_LIMIT_RECURSION], [$with_match_limit_recursion], [ + The above limit applies to all calls of match(), whether or not they + increase the recursion depth. In some environments it is desirable + to limit the depth of recursive calls of match() more strictly, in + order to restrict the maximum amount of stack (or heap, if + NO_RECURSE is defined) that is used. The value of + MATCH_LIMIT_RECURSION applies only to recursive calls of match(). To + have any useful effect, it must be less than the value of + MATCH_LIMIT. The default is to use the same value as MATCH_LIMIT. + There is a runtime method for setting a different limit.]) + +AC_DEFINE([MAX_NAME_SIZE], [32], [ + This limit is parameterized just in case anybody ever wants to + change it. Care must be taken if it is increased, because it guards + against integer overflow caused by enormously large patterns.]) + +AC_DEFINE([MAX_NAME_COUNT], [10000], [ + This limit is parameterized just in case anybody ever wants to + change it. Care must be taken if it is increased, because it guards + against integer overflow caused by enormously large patterns.]) + +AH_VERBATIM([PCRE_EXP_DEFN], [ +/* If you are compiling for a system other than a Unix-like system or + Win32, and it needs some magic to be inserted before the definition + of a function that is exported by the library, define this macro to + contain the relevant magic. If you do not define this macro, a suitable + __declspec value is used for Windows systems; in other environments + "extern" is used for a C compiler and "extern C" for a C++ compiler. + This macro apears at the start of every exported function that is part + of the external API. It does not appear on functions that are "external" + in the C sense, but which are internal to the library. */ +#undef PCRE_EXP_DEFN]) + +if test "$enable_ebcdic" = "yes"; then + AC_DEFINE_UNQUOTED([EBCDIC], [], [ + If you are compiling for a system that uses EBCDIC instead of ASCII + character codes, define this macro to any value. You must also edit the + NEWLINE macro below to set a suitable EBCDIC newline, commonly 21 (0x15). + On systems that can use "configure" or CMake to set EBCDIC, NEWLINE is + automatically adjusted. When EBCDIC is set, PCRE assumes that all input + strings are in EBCDIC. If you do not define this macro, PCRE will assume + input strings are ASCII or UTF-8/16/32 Unicode. It is not possible to build + a version of PCRE that supports both EBCDIC and UTF-8/16/32.]) +fi + +if test "$enable_ebcdic_nl25" = "yes"; then + AC_DEFINE_UNQUOTED([EBCDIC_NL25], [], [ + In an EBCDIC environment, define this macro to any value to arrange for + the NL character to be 0x25 instead of the default 0x15. NL plays the role + that LF does in an ASCII/Unicode environment. The value must also be set in + the NEWLINE macro below. On systems that can use "configure" or CMake to + set EBCDIC_NL25, the adjustment of NEWLINE is automatic.]) +fi + +if test "$enable_valgrind" = "yes"; then + AC_DEFINE_UNQUOTED([SUPPORT_VALGRIND], [], [ + Define to any value for valgrind support to find invalid memory reads.]) +fi + +# Platform specific issues +NO_UNDEFINED= +EXPORT_ALL_SYMBOLS= +case $host_os in + cygwin* | mingw* ) + if test X"$enable_shared" = Xyes; then + NO_UNDEFINED="-no-undefined" + EXPORT_ALL_SYMBOLS="-Wl,--export-all-symbols" + fi + ;; +esac + +# The extra LDFLAGS for each particular library +# (Note: The libpcre*_version bits are m4 variables, assigned above) + +EXTRA_LIBPCRE_LDFLAGS="$EXTRA_LIBPCRE_LDFLAGS \ + $NO_UNDEFINED -version-info libpcre_version" + +EXTRA_LIBPCRE16_LDFLAGS="$EXTRA_LIBPCRE16_LDFLAGS \ + $NO_UNDEFINED -version-info libpcre16_version" + +EXTRA_LIBPCRE32_LDFLAGS="$EXTRA_LIBPCRE32_LDFLAGS \ + $NO_UNDEFINED -version-info libpcre32_version" + +EXTRA_LIBPCREPOSIX_LDFLAGS="$EXTRA_LIBPCREPOSIX_LDFLAGS \ + $NO_UNDEFINED -version-info libpcreposix_version" + +EXTRA_LIBPCRECPP_LDFLAGS="$EXTRA_LIBPCRECPP_LDFLAGS \ + $NO_UNDEFINED -version-info libpcrecpp_version \ + $EXPORT_ALL_SYMBOLS" + +AC_SUBST(EXTRA_LIBPCRE_LDFLAGS) +AC_SUBST(EXTRA_LIBPCRE16_LDFLAGS) +AC_SUBST(EXTRA_LIBPCRE32_LDFLAGS) +AC_SUBST(EXTRA_LIBPCREPOSIX_LDFLAGS) +AC_SUBST(EXTRA_LIBPCRECPP_LDFLAGS) + +# When we run 'make distcheck', use these arguments. Turning off compiler +# optimization makes it run faster. +DISTCHECK_CONFIGURE_FLAGS="CFLAGS='' CXXFLAGS='' --enable-pcre16 --enable-pcre32 --enable-jit --enable-cpp --enable-unicode-properties" +AC_SUBST(DISTCHECK_CONFIGURE_FLAGS) + +# Check that, if --enable-pcregrep-libz or --enable-pcregrep-libbz2 is +# specified, the relevant library is available. + +if test "$enable_pcregrep_libz" = "yes"; then + if test "$HAVE_ZLIB_H" != "1"; then + echo "** Cannot --enable-pcregrep-libz because zlib.h was not found" + exit 1 + fi + if test "$HAVE_LIBZ" != "1"; then + echo "** Cannot --enable-pcregrep-libz because libz was not found" + exit 1 + fi + LIBZ="-lz" +fi +AC_SUBST(LIBZ) + +if test "$enable_pcregrep_libbz2" = "yes"; then + if test "$HAVE_BZLIB_H" != "1"; then + echo "** Cannot --enable-pcregrep-libbz2 because bzlib.h was not found" + exit 1 + fi + if test "$HAVE_LIBBZ2" != "1"; then + echo "** Cannot --enable-pcregrep-libbz2 because libbz2 was not found" + exit 1 + fi + LIBBZ2="-lbz2" +fi +AC_SUBST(LIBBZ2) + +# Similarly for --enable-pcretest-readline + +if test "$enable_pcretest_libedit" = "yes"; then + if test "$enable_pcretest_libreadline" = "yes"; then + echo "** Cannot use both --enable-pcretest-libedit and --enable-pcretest-readline" + exit 1 + fi + if test "$HAVE_EDITLINE_READLINE_H" != "1" -a \ + "$HAVE_READLINE_READLINE_H" != "1"; then + echo "** Cannot --enable-pcretest-libedit because neither editline/readline.h" + echo "** nor readline/readline.h was found." + exit 1 + fi + if test -z "$LIBEDIT"; then + echo "** Cannot --enable-pcretest-libedit because libedit library was not found." + exit 1 + fi +fi + +if test "$enable_pcretest_libreadline" = "yes"; then + if test "$HAVE_READLINE_H" != "1"; then + echo "** Cannot --enable-pcretest-readline because readline/readline.h was not found." + exit 1 + fi + if test "$HAVE_HISTORY_H" != "1"; then + echo "** Cannot --enable-pcretest-readline because readline/history.h was not found." + exit 1 + fi + if test -z "$LIBREADLINE"; then + echo "** Cannot --enable-pcretest-readline because readline library was not found." + exit 1 + fi +fi + +# Handle valgrind support + +if test "$enable_valgrind" = "yes"; then + m4_ifdef([PKG_CHECK_MODULES], + [PKG_CHECK_MODULES([VALGRIND],[valgrind])], + [AC_MSG_ERROR([pkg-config not supported])]) +fi + +# Handle code coverage reporting support +if test "$enable_coverage" = "yes"; then + if test "x$GCC" != "xyes"; then + AC_MSG_ERROR([Code coverage reports can only be generated when using GCC]) + fi + + # ccache is incompatible with gcov + AC_PATH_PROG([SHTOOL],[shtool],[false]) + case `$SHTOOL path $CC` in + *ccache*) cc_ccache=yes;; + *) cc_ccache=no;; + esac + + if test "$cc_ccache" = "yes"; then + if test -z "$CCACHE_DISABLE" -o "$CCACHE_DISABLE" != "1"; then + AC_MSG_ERROR([must export CCACHE_DISABLE=1 to disable ccache for code coverage]) + fi + fi + + AC_ARG_VAR([LCOV],[the ltp lcov program]) + AC_PATH_PROG([LCOV],[lcov],[false]) + if test "x$LCOV" = "xfalse"; then + AC_MSG_ERROR([lcov not found]) + fi + + AC_ARG_VAR([GENHTML],[the ltp genhtml program]) + AC_PATH_PROG([GENHTML],[genhtml],[false]) + if test "x$GENHTML" = "xfalse"; then + AC_MSG_ERROR([genhtml not found]) + fi + + # Set flags needed for gcov + GCOV_CFLAGS="-O0 -ggdb3 -fprofile-arcs -ftest-coverage" + GCOV_CXXFLAGS="-O0 -ggdb3 -fprofile-arcs -ftest-coverage" + GCOV_LIBS="-lgcov" + AC_SUBST([GCOV_CFLAGS]) + AC_SUBST([GCOV_CXXFLAGS]) + AC_SUBST([GCOV_LIBS]) +fi # enable_coverage + +AM_CONDITIONAL([WITH_GCOV],[test "x$enable_coverage" = "xyes"]) + +# Produce these files, in addition to config.h. +AC_CONFIG_FILES( + Makefile + libpcre.pc + libpcre16.pc + libpcre32.pc + libpcreposix.pc + libpcrecpp.pc + pcre-config + pcre.h + pcre_stringpiece.h + pcrecpparg.h +) + +# Make the generated script files executable. +AC_CONFIG_COMMANDS([script-chmod], [chmod a+x pcre-config]) + +# Make sure that pcre_chartables.c is removed in case the method for +# creating it was changed by reconfiguration. +AC_CONFIG_COMMANDS([delete-old-chartables], [rm -f pcre_chartables.c]) + +AC_OUTPUT + +# Print out a nice little message after configure is run displaying the +# chosen options. + +ebcdic_nl_code=n/a +if test "$enable_ebcdic_nl25" = "yes"; then + ebcdic_nl_code=0x25 +elif test "$enable_ebcdic" = "yes"; then + ebcdic_nl_code=0x15 +fi + +cat <. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva . + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: depcomp [--help] [--version] PROGRAM [ARGS] + +Run PROGRAMS ARGS to compile a file, generating dependencies +as side-effects. + +Environment variables: + depmode Dependency tracking mode. + source Source file read by 'PROGRAMS ARGS'. + object Object file output by 'PROGRAMS ARGS'. + DEPDIR directory where to store dependencies. + depfile Dependency file to output. + tmpdepfile Temporary file to use when outputting dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit $? + ;; +esac + +# Get the directory component of the given path, and save it in the +# global variables '$dir'. Note that this directory component will +# be either empty or ending with a '/' character. This is deliberate. +set_dir_from () +{ + case $1 in + */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; + *) dir=;; + esac +} + +# Get the suffix-stripped basename of the given path, and save it the +# global variable '$base'. +set_base_from () +{ + base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` +} + +# If no dependency file was actually created by the compiler invocation, +# we still have to create a dummy depfile, to avoid errors with the +# Makefile "include basename.Plo" scheme. +make_dummy_depfile () +{ + echo "#dummy" > "$depfile" +} + +# Factor out some common post-processing of the generated depfile. +# Requires the auxiliary global variable '$tmpdepfile' to be set. +aix_post_process_depfile () +{ + # If the compiler actually managed to produce a dependency file, + # post-process it. + if test -f "$tmpdepfile"; then + # Each line is of the form 'foo.o: dependency.h'. + # Do two passes, one to just change these to + # $object: dependency.h + # and one to simply output + # dependency.h: + # which is needed to avoid the deleted-header problem. + { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" + sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" + } > "$depfile" + rm -f "$tmpdepfile" + else + make_dummy_depfile + fi +} + +# A tabulation character. +tab=' ' +# A newline character. +nl=' +' +# Character ranges might be problematic outside the C locale. +# These definitions help. +upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ +lower=abcdefghijklmnopqrstuvwxyz +digits=0123456789 +alpha=${upper}${lower} + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi + +# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. +depfile=${depfile-`echo "$object" | + sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Avoid interferences from the environment. +gccflag= dashmflag= + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +cygpath_u="cygpath -u -f -" +if test "$depmode" = msvcmsys; then + # This is just like msvisualcpp but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvisualcpp +fi + +if test "$depmode" = msvc7msys; then + # This is just like msvc7 but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvc7 +fi + +if test "$depmode" = xlc; then + # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. + gccflag=-qmakedep=gcc,-MF + depmode=gcc +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. +## Unfortunately, FreeBSD c89 acceptance of flags depends upon +## the command line argument order; so add the flags where they +## appear in depend2.am. Note that the slowdown incurred here +## affects only configure: in makefiles, %FASTDEP% shortcuts this. + for arg + do + case $arg in + -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; + *) set fnord "$@" "$arg" ;; + esac + shift # fnord + shift # $arg + done + "$@" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. +## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. +## (see the conditional assignment to $gccflag above). +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). Also, it might not be +## supported by the other compilers which use the 'gcc' depmode. +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The second -e expression handles DOS-style file names with drive + # letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the "deleted header file" problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. +## Some versions of gcc put a space before the ':'. On the theory +## that the space means something, we add a space to the output as +## well. hp depmode also adds that space, but also prefixes the VPATH +## to the object. Take care to not repeat it in the output. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like '#:fec' to the end of the + # dependency line. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ + | tr "$nl" ' ' >> "$depfile" + echo >> "$depfile" + # The second pass generates a dummy entry for each header file. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" + ;; + +xlc) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the + # current directory. Also, the AIX compiler puts '$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.u + tmpdepfile2=$base.u + tmpdepfile3=$dir.libs/$base.u + "$@" -Wc,-M + else + tmpdepfile1=$dir$base.u + tmpdepfile2=$dir$base.u + tmpdepfile3=$dir$base.u + "$@" -M + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + aix_post_process_depfile + ;; + +tcc) + # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 + # FIXME: That version still under development at the moment of writing. + # Make that this statement remains true also for stable, released + # versions. + # It will wrap lines (doesn't matter whether long or short) with a + # trailing '\', as in: + # + # foo.o : \ + # foo.c \ + # foo.h \ + # + # It will put a trailing '\' even on the last line, and will use leading + # spaces rather than leading tabs (at least since its commit 0394caf7 + # "Emit spaces for -MD"). + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. + # We have to change lines of the first kind to '$object: \'. + sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" + # And for each line of the second kind, we have to emit a 'dep.h:' + # dummy dependency, to avoid the deleted-header problem. + sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" + rm -f "$tmpdepfile" + ;; + +## The order of this option in the case statement is important, since the +## shell code in configure will try each of these formats in the order +## listed in this file. A plain '-MD' option would be understood by many +## compilers, so we must ensure this comes after the gcc and icc options. +pgcc) + # Portland's C compiler understands '-MD'. + # Will always output deps to 'file.d' where file is the root name of the + # source file under compilation, even if file resides in a subdirectory. + # The object file name does not affect the name of the '.d' file. + # pgcc 10.2 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using '\' : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + set_dir_from "$object" + # Use the source, not the object, to determine the base name, since + # that's sadly what pgcc will do too. + set_base_from "$source" + tmpdepfile=$base.d + + # For projects that build the same source file twice into different object + # files, the pgcc approach of using the *source* file root name can cause + # problems in parallel builds. Use a locking strategy to avoid stomping on + # the same $tmpdepfile. + lockdir=$base.d-lock + trap " + echo '$0: caught signal, cleaning up...' >&2 + rmdir '$lockdir' + exit 1 + " 1 2 13 15 + numtries=100 + i=$numtries + while test $i -gt 0; do + # mkdir is a portable test-and-set. + if mkdir "$lockdir" 2>/dev/null; then + # This process acquired the lock. + "$@" -MD + stat=$? + # Release the lock. + rmdir "$lockdir" + break + else + # If the lock is being held by a different process, wait + # until the winning process is done or we timeout. + while test -d "$lockdir" && test $i -gt 0; do + sleep 1 + i=`expr $i - 1` + done + fi + i=`expr $i - 1` + done + trap - 1 2 13 15 + if test $i -le 0; then + echo "$0: failed to acquire lock after $numtries attempts" >&2 + echo "$0: check lockdir '$lockdir'" >&2 + exit 1 + fi + + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp2) + # The "hp" stanza above does not work with aCC (C++) and HP's ia64 + # compilers, which have integrated preprocessors. The correct option + # to use with these is +Maked; it writes dependencies to a file named + # 'foo.d', which lands next to the object file, wherever that + # happens to be. + # Much of this is similar to the tru64 case; see comments there. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir.libs/$base.d + "$@" -Wc,+Maked + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + "$@" +Maked + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" + # Add 'dependent.h:' lines. + sed -ne '2,${ + s/^ *// + s/ \\*$// + s/$/:/ + p + }' "$tmpdepfile" >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" "$tmpdepfile2" + ;; + +tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in 'foo.d' instead, so we check for that too. + # Subdirectories are respected. + set_dir_from "$object" + set_base_from "$object" + + if test "$libtool" = yes; then + # Libtool generates 2 separate objects for the 2 libraries. These + # two compilations output dependencies in $dir.libs/$base.o.d and + # in $dir$base.o.d. We have to check for both files, because + # one of the two compilations can be disabled. We should prefer + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is + # automatically cleaned when .libs/ is deleted, while ignoring + # the former would cause a distcleancheck panic. + tmpdepfile1=$dir$base.o.d # libtool 1.5 + tmpdepfile2=$dir.libs/$base.o.d # Likewise. + tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + # Same post-processing that is required for AIX mode. + aix_post_process_depfile + ;; + +msvc7) + if test "$libtool" = yes; then + showIncludes=-Wc,-showIncludes + else + showIncludes=-showIncludes + fi + "$@" $showIncludes > "$tmpdepfile" + stat=$? + grep -v '^Note: including file: ' "$tmpdepfile" + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The first sed program below extracts the file names and escapes + # backslashes for cygpath. The second sed program outputs the file + # name when reading, but also accumulates all include files in the + # hold buffer in order to output them again at the end. This only + # works with sed implementations that can handle large buffers. + sed < "$tmpdepfile" -n ' +/^Note: including file: *\(.*\)/ { + s//\1/ + s/\\/\\\\/g + p +}' | $cygpath_u | sort -u | sed -n ' +s/ /\\ /g +s/\(.*\)/'"$tab"'\1 \\/p +s/.\(.*\) \\/\1:/ +H +$ { + s/.*/'"$tab"'/ + G + p +}' >> "$depfile" + echo >> "$depfile" # make sure the fragment doesn't end with a backslash + rm -f "$tmpdepfile" + ;; + +msvc7msys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for ':' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. + "$@" $dashmflag | + sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this sed invocation + # correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no eat=no + for arg + do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + if test $eat = yes; then + eat=no + continue + fi + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -arch) + eat=yes ;; + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix=`echo "$object" | sed 's/^.*\././'` + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + # makedepend may prepend the VPATH from the source file name to the object. + # No need to regex-escape $object, excess matching of '.' is harmless. + sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process the last invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed '1,2d' "$tmpdepfile" \ + | tr ' ' "$nl" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E \ + | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + | sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + IFS=" " + for arg + do + case "$arg" in + -o) + shift + ;; + $object) + shift + ;; + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E 2>/dev/null | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" + echo "$tab" >> "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvcmsys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/dftables.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/dftables.c new file mode 100755 index 000000000..1fdc8e0f2 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/dftables.c @@ -0,0 +1,212 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + + +/* This is a freestanding support program to generate a file containing +character tables for PCRE. The tables are built according to the current +locale. Now that pcre_maketables is a function visible to the outside world, we +make use of its code from here in order to be consistent. */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include + +#include "pcre_internal.h" + +#define DFTABLES /* pcre_maketables.c notices this */ +#include "pcre_maketables.c" + + +int main(int argc, char **argv) +{ +FILE *f; +int i = 1; +const unsigned char *tables; +const unsigned char *base_of_tables; + +/* By default, the default C locale is used rather than what the building user +happens to have set. However, if the -L option is given, set the locale from +the LC_xxx environment variables. */ + +if (argc > 1 && strcmp(argv[1], "-L") == 0) + { + setlocale(LC_ALL, ""); /* Set from environment variables */ + i++; + } + +if (argc < i + 1) + { + fprintf(stderr, "dftables: one filename argument is required\n"); + return 1; + } + +tables = pcre_maketables(); +base_of_tables = tables; + +f = fopen(argv[i], "wb"); +if (f == NULL) + { + fprintf(stderr, "dftables: failed to open %s for writing\n", argv[1]); + return 1; + } + +/* There are several fprintf() calls here, because gcc in pedantic mode +complains about the very long string otherwise. */ + +fprintf(f, + "/*************************************************\n" + "* Perl-Compatible Regular Expressions *\n" + "*************************************************/\n\n" + "/* This file was automatically written by the dftables auxiliary\n" + "program. It contains character tables that are used when no external\n" + "tables are passed to PCRE by the application that calls it. The tables\n" + "are used only for characters whose code values are less than 256.\n\n"); +fprintf(f, + "The following #includes are present because without them gcc 4.x may remove\n" + "the array definition from the final binary if PCRE is built into a static\n" + "library and dead code stripping is activated. This leads to link errors.\n" + "Pulling in the header ensures that the array gets flagged as \"someone\n" + "outside this compilation unit might reference this\" and so it will always\n" + "be supplied to the linker. */\n\n"); + +/* Force config.h in z/OS */ + +#if defined NATIVE_ZOS +fprintf(f, + "/* For z/OS, config.h is forced */\n" + "#ifndef HAVE_CONFIG_H\n" + "#define HAVE_CONFIG_H 1\n" + "#endif\n\n"); +#endif + +fprintf(f, + "#ifdef HAVE_CONFIG_H\n" + "#include \"config.h\"\n" + "#endif\n\n" + "#include \"pcre_internal.h\"\n\n"); + +fprintf(f, + "const pcre_uint8 PRIV(default_tables)[] = {\n\n" + "/* This table is a lower casing table. */\n\n"); + +fprintf(f, " "); +for (i = 0; i < 256; i++) + { + if ((i & 7) == 0 && i != 0) fprintf(f, "\n "); + fprintf(f, "%3d", *tables++); + if (i != 255) fprintf(f, ","); + } +fprintf(f, ",\n\n"); + +fprintf(f, "/* This table is a case flipping table. */\n\n"); + +fprintf(f, " "); +for (i = 0; i < 256; i++) + { + if ((i & 7) == 0 && i != 0) fprintf(f, "\n "); + fprintf(f, "%3d", *tables++); + if (i != 255) fprintf(f, ","); + } +fprintf(f, ",\n\n"); + +fprintf(f, + "/* This table contains bit maps for various character classes.\n" + "Each map is 32 bytes long and the bits run from the least\n" + "significant end of each byte. The classes that have their own\n" + "maps are: space, xdigit, digit, upper, lower, word, graph\n" + "print, punct, and cntrl. Other classes are built from combinations. */\n\n"); + +fprintf(f, " "); +for (i = 0; i < cbit_length; i++) + { + if ((i & 7) == 0 && i != 0) + { + if ((i & 31) == 0) fprintf(f, "\n"); + fprintf(f, "\n "); + } + fprintf(f, "0x%02x", *tables++); + if (i != cbit_length - 1) fprintf(f, ","); + } +fprintf(f, ",\n\n"); + +fprintf(f, + "/* This table identifies various classes of character by individual bits:\n" + " 0x%02x white space character\n" + " 0x%02x letter\n" + " 0x%02x decimal digit\n" + " 0x%02x hexadecimal digit\n" + " 0x%02x alphanumeric or '_'\n" + " 0x%02x regular expression metacharacter or binary zero\n*/\n\n", + ctype_space, ctype_letter, ctype_digit, ctype_xdigit, ctype_word, + ctype_meta); + +fprintf(f, " "); +for (i = 0; i < 256; i++) + { + if ((i & 7) == 0 && i != 0) + { + fprintf(f, " /* "); + if (isprint(i-8)) fprintf(f, " %c -", i-8); + else fprintf(f, "%3d-", i-8); + if (isprint(i-1)) fprintf(f, " %c ", i-1); + else fprintf(f, "%3d", i-1); + fprintf(f, " */\n "); + } + fprintf(f, "0x%02x", *tables++); + if (i != 255) fprintf(f, ","); + } + +fprintf(f, "};/* "); +if (isprint(i-8)) fprintf(f, " %c -", i-8); + else fprintf(f, "%3d-", i-8); +if (isprint(i-1)) fprintf(f, " %c ", i-1); + else fprintf(f, "%3d", i-1); +fprintf(f, " */\n\n/* End of pcre_chartables.c */\n"); + +fclose(f); +free((void *)base_of_tables); +return 0; +} + +/* End of dftables.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/NON-AUTOTOOLS-BUILD.txt b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/NON-AUTOTOOLS-BUILD.txt new file mode 100755 index 000000000..37f616447 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/NON-AUTOTOOLS-BUILD.txt @@ -0,0 +1,773 @@ +Building PCRE without using autotools +------------------------------------- + +NOTE: This document relates to PCRE releases that use the original API, with +library names libpcre, libpcre16, and libpcre32. January 2015 saw the first +release of a new API, known as PCRE2, with release numbers starting at 10.00 +and library names libpcre2-8, libpcre2-16, and libpcre2-32. The old libraries +(now called PCRE1) are still being maintained for bug fixes, but there will be +no new development. New projects are advised to use the new PCRE2 libraries. + + +This document contains the following sections: + + General + Generic instructions for the PCRE C library + The C++ wrapper functions + Building for virtual Pascal + Stack size in Windows environments + Linking programs in Windows environments + Calling conventions in Windows environments + Comments about Win32 builds + Building PCRE on Windows with CMake + Use of relative paths with CMake on Windows + Testing with RunTest.bat + Building under Windows CE with Visual Studio 200x + Building under Windows with BCC5.5 + Building using Borland C++ Builder 2007 (CB2007) and higher + Building PCRE on OpenVMS + Building PCRE on Stratus OpenVOS + Building PCRE on native z/OS and z/VM + + +GENERAL + +I (Philip Hazel) have no experience of Windows or VMS sytems and how their +libraries work. The items in the PCRE distribution and Makefile that relate to +anything other than Linux systems are untested by me. + +There are some other comments and files (including some documentation in CHM +format) in the Contrib directory on the FTP site: + + ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/Contrib + +The basic PCRE library consists entirely of code written in Standard C, and so +should compile successfully on any system that has a Standard C compiler and +library. The C++ wrapper functions are a separate issue (see below). + +The PCRE distribution includes a "configure" file for use by the configure/make +(autotools) build system, as found in many Unix-like environments. The README +file contains information about the options for "configure". + +There is also support for CMake, which some users prefer, especially in Windows +environments, though it can also be run in Unix-like environments. See the +section entitled "Building PCRE on Windows with CMake" below. + +Versions of config.h and pcre.h are distributed in the PCRE tarballs under the +names config.h.generic and pcre.h.generic. These are provided for those who +build PCRE without using "configure" or CMake. If you use "configure" or CMake, +the .generic versions are not used. + + +GENERIC INSTRUCTIONS FOR THE PCRE C LIBRARY + +The following are generic instructions for building the PCRE C library "by +hand". If you are going to use CMake, this section does not apply to you; you +can skip ahead to the CMake section. + + (1) Copy or rename the file config.h.generic as config.h, and edit the macro + settings that it contains to whatever is appropriate for your environment. + + In particular, you can alter the definition of the NEWLINE macro to + specify what character(s) you want to be interpreted as line terminators. + In an EBCDIC environment, you MUST change NEWLINE, because its default + value is 10, an ASCII LF. The usual EBCDIC newline character is 21 (0x15, + NL), though in some cases it may be 37 (0x25). + + When you compile any of the PCRE modules, you must specify -DHAVE_CONFIG_H + to your compiler so that config.h is included in the sources. + + An alternative approach is not to edit config.h, but to use -D on the + compiler command line to make any changes that you need to the + configuration options. In this case -DHAVE_CONFIG_H must not be set. + + NOTE: There have been occasions when the way in which certain parameters + in config.h are used has changed between releases. (In the configure/make + world, this is handled automatically.) When upgrading to a new release, + you are strongly advised to review config.h.generic before re-using what + you had previously. + + (2) Copy or rename the file pcre.h.generic as pcre.h. + + (3) EITHER: + Copy or rename file pcre_chartables.c.dist as pcre_chartables.c. + + OR: + Compile dftables.c as a stand-alone program (using -DHAVE_CONFIG_H if + you have set up config.h), and then run it with the single argument + "pcre_chartables.c". This generates a set of standard character tables + and writes them to that file. The tables are generated using the default + C locale for your system. If you want to use a locale that is specified + by LC_xxx environment variables, add the -L option to the dftables + command. You must use this method if you are building on a system that + uses EBCDIC code. + + The tables in pcre_chartables.c are defaults. The caller of PCRE can + specify alternative tables at run time. + + (4) Ensure that you have the following header files: + + pcre_internal.h + ucp.h + + (5) For an 8-bit library, compile the following source files, setting + -DHAVE_CONFIG_H as a compiler option if you have set up config.h with your + configuration, or else use other -D settings to change the configuration + as required. + + pcre_byte_order.c + pcre_chartables.c + pcre_compile.c + pcre_config.c + pcre_dfa_exec.c + pcre_exec.c + pcre_fullinfo.c + pcre_get.c + pcre_globals.c + pcre_jit_compile.c + pcre_maketables.c + pcre_newline.c + pcre_ord2utf8.c + pcre_refcount.c + pcre_string_utils.c + pcre_study.c + pcre_tables.c + pcre_ucd.c + pcre_valid_utf8.c + pcre_version.c + pcre_xclass.c + + Make sure that you include -I. in the compiler command (or equivalent for + an unusual compiler) so that all included PCRE header files are first + sought in the current directory. Otherwise you run the risk of picking up + a previously-installed file from somewhere else. + + Note that you must still compile pcre_jit_compile.c, even if you have not + defined SUPPORT_JIT in config.h, because when JIT support is not + configured, dummy functions are compiled. When JIT support IS configured, + pcre_jit_compile.c #includes sources from the sljit subdirectory, where + there should be 16 files, all of whose names begin with "sljit". + + (6) Now link all the compiled code into an object library in whichever form + your system keeps such libraries. This is the basic PCRE C 8-bit library. + If your system has static and shared libraries, you may have to do this + once for each type. + + (7) If you want to build a 16-bit library (as well as, or instead of the 8-bit + or 32-bit libraries) repeat steps 5-6 with the following files: + + pcre16_byte_order.c + pcre16_chartables.c + pcre16_compile.c + pcre16_config.c + pcre16_dfa_exec.c + pcre16_exec.c + pcre16_fullinfo.c + pcre16_get.c + pcre16_globals.c + pcre16_jit_compile.c + pcre16_maketables.c + pcre16_newline.c + pcre16_ord2utf16.c + pcre16_refcount.c + pcre16_string_utils.c + pcre16_study.c + pcre16_tables.c + pcre16_ucd.c + pcre16_utf16_utils.c + pcre16_valid_utf16.c + pcre16_version.c + pcre16_xclass.c + + (8) If you want to build a 32-bit library (as well as, or instead of the 8-bit + or 16-bit libraries) repeat steps 5-6 with the following files: + + pcre32_byte_order.c + pcre32_chartables.c + pcre32_compile.c + pcre32_config.c + pcre32_dfa_exec.c + pcre32_exec.c + pcre32_fullinfo.c + pcre32_get.c + pcre32_globals.c + pcre32_jit_compile.c + pcre32_maketables.c + pcre32_newline.c + pcre32_ord2utf32.c + pcre32_refcount.c + pcre32_string_utils.c + pcre32_study.c + pcre32_tables.c + pcre32_ucd.c + pcre32_utf32_utils.c + pcre32_valid_utf32.c + pcre32_version.c + pcre32_xclass.c + + (9) If you want to build the POSIX wrapper functions (which apply only to the + 8-bit library), ensure that you have the pcreposix.h file and then compile + pcreposix.c (remembering -DHAVE_CONFIG_H if necessary). Link the result + (on its own) as the pcreposix library. + +(10) The pcretest program can be linked with any combination of the 8-bit, + 16-bit and 32-bit libraries (depending on what you selected in config.h). + Compile pcretest.c and pcre_printint.c (again, don't forget + -DHAVE_CONFIG_H) and link them together with the appropriate library/ies. + If you compiled an 8-bit library, pcretest also needs the pcreposix + wrapper library unless you compiled it with -DNOPOSIX. + +(11) Run pcretest on the testinput files in the testdata directory, and check + that the output matches the corresponding testoutput files. There are + comments about what each test does in the section entitled "Testing PCRE" + in the README file. If you compiled more than one of the 8-bit, 16-bit and + 32-bit libraries, you need to run pcretest with the -16 option to do + 16-bit tests and with the -32 option to do 32-bit tests. + + Some tests are relevant only when certain build-time options are selected. + For example, test 4 is for UTF-8/UTF-16/UTF-32 support, and will not run + if you have built PCRE without it. See the comments at the start of each + testinput file. If you have a suitable Unix-like shell, the RunTest script + will run the appropriate tests for you. The command "RunTest list" will + output a list of all the tests. + + Note that the supplied files are in Unix format, with just LF characters + as line terminators. You may need to edit them to change this if your + system uses a different convention. If you are using Windows, you probably + should use the wintestinput3 file instead of testinput3 (and the + corresponding output file). This is a locale test; wintestinput3 sets the + locale to "french" rather than "fr_FR", and there some minor output + differences. + +(12) If you have built PCRE with SUPPORT_JIT, the JIT features will be tested + by the testdata files. However, you might also like to build and run + the freestanding JIT test program, pcre_jit_test.c. + +(13) If you want to use the pcregrep command, compile and link pcregrep.c; it + uses only the basic 8-bit PCRE library (it does not need the pcreposix + library). + + +THE C++ WRAPPER FUNCTIONS + +The PCRE distribution also contains some C++ wrapper functions and tests, +applicable to the 8-bit library, which were contributed by Google Inc. On a +system that can use "configure" and "make", the functions are automatically +built into a library called pcrecpp. It should be straightforward to compile +the .cc files manually on other systems. The files called xxx_unittest.cc are +test programs for each of the corresponding xxx.cc files. + + +BUILDING FOR VIRTUAL PASCAL + +A script for building PCRE using Borland's C++ compiler for use with VPASCAL +was contributed by Alexander Tokarev. Stefan Weber updated the script and added +additional files. The following files in the distribution are for building PCRE +for use with VP/Borland: makevp_c.txt, makevp_l.txt, makevp.bat, pcregexp.pas. + + +STACK SIZE IN WINDOWS ENVIRONMENTS + +The default processor stack size of 1Mb in some Windows environments is too +small for matching patterns that need much recursion. In particular, test 2 may +fail because of this. Normally, running out of stack causes a crash, but there +have been cases where the test program has just died silently. See your linker +documentation for how to increase stack size if you experience problems. The +Linux default of 8Mb is a reasonable choice for the stack, though even that can +be too small for some pattern/subject combinations. + +PCRE has a compile configuration option to disable the use of stack for +recursion so that heap is used instead. However, pattern matching is +significantly slower when this is done. There is more about stack usage in the +"pcrestack" documentation. + + +LINKING PROGRAMS IN WINDOWS ENVIRONMENTS + +If you want to statically link a program against a PCRE library in the form of +a non-dll .a file, you must define PCRE_STATIC before including pcre.h or +pcrecpp.h, otherwise the pcre_malloc() and pcre_free() exported functions will +be declared __declspec(dllimport), with unwanted results. + + +CALLING CONVENTIONS IN WINDOWS ENVIRONMENTS + +It is possible to compile programs to use different calling conventions using +MSVC. Search the web for "calling conventions" for more information. To make it +easier to change the calling convention for the exported functions in the +PCRE library, the macro PCRE_CALL_CONVENTION is present in all the external +definitions. It can be set externally when compiling (e.g. in CFLAGS). If it is +not set, it defaults to empty; the default calling convention is then used +(which is what is wanted most of the time). + + +COMMENTS ABOUT WIN32 BUILDS (see also "BUILDING PCRE ON WINDOWS WITH CMAKE") + +There are two ways of building PCRE using the "configure, make, make install" +paradigm on Windows systems: using MinGW or using Cygwin. These are not at all +the same thing; they are completely different from each other. There is also +support for building using CMake, which some users find a more straightforward +way of building PCRE under Windows. + +The MinGW home page (http://www.mingw.org/) says this: + + MinGW: A collection of freely available and freely distributable Windows + specific header files and import libraries combined with GNU toolsets that + allow one to produce native Windows programs that do not rely on any + 3rd-party C runtime DLLs. + +The Cygwin home page (http://www.cygwin.com/) says this: + + Cygwin is a Linux-like environment for Windows. It consists of two parts: + + . A DLL (cygwin1.dll) which acts as a Linux API emulation layer providing + substantial Linux API functionality + + . A collection of tools which provide Linux look and feel. + + The Cygwin DLL currently works with all recent, commercially released x86 32 + bit and 64 bit versions of Windows, with the exception of Windows CE. + +On both MinGW and Cygwin, PCRE should build correctly using: + + ./configure && make && make install + +This should create two libraries called libpcre and libpcreposix, and, if you +have enabled building the C++ wrapper, a third one called libpcrecpp. These are +independent libraries: when you link with libpcreposix or libpcrecpp you must +also link with libpcre, which contains the basic functions. (Some earlier +releases of PCRE included the basic libpcre functions in libpcreposix. This no +longer happens.) + +A user submitted a special-purpose patch that makes it easy to create +"pcre.dll" under mingw32 using the "msys" environment. It provides "pcre.dll" +as a special target. If you use this target, no other files are built, and in +particular, the pcretest and pcregrep programs are not built. An example of how +this might be used is: + + ./configure --enable-utf --disable-cpp CFLAGS="-03 -s"; make pcre.dll + +Using Cygwin's compiler generates libraries and executables that depend on +cygwin1.dll. If a library that is generated this way is distributed, +cygwin1.dll has to be distributed as well. Since cygwin1.dll is under the GPL +licence, this forces not only PCRE to be under the GPL, but also the entire +application. A distributor who wants to keep their own code proprietary must +purchase an appropriate Cygwin licence. + +MinGW has no such restrictions. The MinGW compiler generates a library or +executable that can run standalone on Windows without any third party dll or +licensing issues. + +But there is more complication: + +If a Cygwin user uses the -mno-cygwin Cygwin gcc flag, what that really does is +to tell Cygwin's gcc to use the MinGW gcc. Cygwin's gcc is only acting as a +front end to MinGW's gcc (if you install Cygwin's gcc, you get both Cygwin's +gcc and MinGW's gcc). So, a user can: + +. Build native binaries by using MinGW or by getting Cygwin and using + -mno-cygwin. + +. Build binaries that depend on cygwin1.dll by using Cygwin with the normal + compiler flags. + +The test files that are supplied with PCRE are in UNIX format, with LF +characters as line terminators. Unless your PCRE library uses a default newline +option that includes LF as a valid newline, it may be necessary to change the +line terminators in the test files to get some of the tests to work. + + +BUILDING PCRE ON WINDOWS WITH CMAKE + +CMake is an alternative configuration facility that can be used instead of +"configure". CMake creates project files (make files, solution files, etc.) +tailored to numerous development environments, including Visual Studio, +Borland, Msys, MinGW, NMake, and Unix. If possible, use short paths with no +spaces in the names for your CMake installation and your PCRE source and build +directories. + +The following instructions were contributed by a PCRE user. If they are not +followed exactly, errors may occur. In the event that errors do occur, it is +recommended that you delete the CMake cache before attempting to repeat the +CMake build process. In the CMake GUI, the cache can be deleted by selecting +"File > Delete Cache". + +1. Install the latest CMake version available from http://www.cmake.org/, and + ensure that cmake\bin is on your path. + +2. Unzip (retaining folder structure) the PCRE source tree into a source + directory such as C:\pcre. You should ensure your local date and time + is not earlier than the file dates in your source dir if the release is + very new. + +3. Create a new, empty build directory, preferably a subdirectory of the + source dir. For example, C:\pcre\pcre-xx\build. + +4. Run cmake-gui from the Shell envirornment of your build tool, for example, + Msys for Msys/MinGW or Visual Studio Command Prompt for VC/VC++. Do not try + to start Cmake from the Windows Start menu, as this can lead to errors. + +5. Enter C:\pcre\pcre-xx and C:\pcre\pcre-xx\build for the source and build + directories, respectively. + +6. Hit the "Configure" button. + +7. Select the particular IDE / build tool that you are using (Visual + Studio, MSYS makefiles, MinGW makefiles, etc.) + +8. The GUI will then list several configuration options. This is where + you can enable UTF-8 support or other PCRE optional features. + +9. Hit "Configure" again. The adjacent "Generate" button should now be + active. + +10. Hit "Generate". + +11. The build directory should now contain a usable build system, be it a + solution file for Visual Studio, makefiles for MinGW, etc. Exit from + cmake-gui and use the generated build system with your compiler or IDE. + E.g., for MinGW you can run "make", or for Visual Studio, open the PCRE + solution, select the desired configuration (Debug, or Release, etc.) and + build the ALL_BUILD project. + +12. If during configuration with cmake-gui you've elected to build the test + programs, you can execute them by building the test project. E.g., for + MinGW: "make test"; for Visual Studio build the RUN_TESTS project. The + most recent build configuration is targeted by the tests. A summary of + test results is presented. Complete test output is subsequently + available for review in Testing\Temporary under your build dir. + + +USE OF RELATIVE PATHS WITH CMAKE ON WINDOWS + +A PCRE user comments as follows: I thought that others may want to know the +current state of CMAKE_USE_RELATIVE_PATHS support on Windows. Here it is: + +-- AdditionalIncludeDirectories is only partially modified (only the + first path - see below) +-- Only some of the contained file paths are modified - shown below for + pcre.vcproj +-- It properly modifies + +I am sure CMake people can fix that if they want to. Until then one will +need to replace existing absolute paths in project files with relative +paths manually (e.g. from VS) - relative to project file location. I did +just that before being told to try CMAKE_USE_RELATIVE_PATHS. Not a big +deal. + +AdditionalIncludeDirectories="E:\builds\pcre\build;E:\builds\pcre\pcre-7.5;" +AdditionalIncludeDirectories=".;E:\builds\pcre\pcre-7.5;" + +RelativePath="pcre.h" +RelativePath="pcre_chartables.c" +RelativePath="pcre_chartables.c.rule" + + +TESTING WITH RUNTEST.BAT + +If configured with CMake, building the test project ("make test" or building +ALL_TESTS in Visual Studio) creates (and runs) pcre_test.bat (and depending +on your configuration options, possibly other test programs) in the build +directory. Pcre_test.bat runs RunTest.Bat with correct source and exe paths. + +For manual testing with RunTest.bat, provided the build dir is a subdirectory +of the source directory: Open command shell window. Chdir to the location +of your pcretest.exe and pcregrep.exe programs. Call RunTest.bat with +"..\RunTest.Bat" or "..\..\RunTest.bat" as appropriate. + +To run only a particular test with RunTest.Bat provide a test number argument. + +Otherwise: + +1. Copy RunTest.bat into the directory where pcretest.exe and pcregrep.exe + have been created. + +2. Edit RunTest.bat to indentify the full or relative location of + the pcre source (wherein which the testdata folder resides), e.g.: + + set srcdir=C:\pcre\pcre-8.20 + +3. In a Windows command environment, chdir to the location of your bat and + exe programs. + +4. Run RunTest.bat. Test outputs will automatically be compared to expected + results, and discrepancies will be identified in the console output. + +To independently test the just-in-time compiler, run pcre_jit_test.exe. +To test pcrecpp, run pcrecpp_unittest.exe, pcre_stringpiece_unittest.exe and +pcre_scanner_unittest.exe. + + +BUILDING UNDER WINDOWS CE WITH VISUAL STUDIO 200x + +Vincent Richomme sent a zip archive of files to help with this process. They +can be found in the file "pcre-vsbuild.zip" in the Contrib directory of the FTP +site. + + +BUILDING UNDER WINDOWS WITH BCC5.5 + +Michael Roy sent these comments about building PCRE under Windows with BCC5.5: + +Some of the core BCC libraries have a version of PCRE from 1998 built in, which +can lead to pcre_exec() giving an erroneous PCRE_ERROR_NULL from a version +mismatch. I'm including an easy workaround below, if you'd like to include it +in the non-unix instructions: + +When linking a project with BCC5.5, pcre.lib must be included before any of the +libraries cw32.lib, cw32i.lib, cw32mt.lib, and cw32mti.lib on the command line. + + +BUILDING USING BORLAND C++ BUILDER 2007 (CB2007) AND HIGHER + +A PCRE user sent these comments about this environment (see also the comment +from another user that follows them): + +The XE versions of C++ Builder come with a RegularExpressionsCore class which +contain a version of TPerlRegEx. However, direct use of the C PCRE library may +be desirable. + +The default makevp.bat, however, supplied with PCRE builds a version of PCRE +that is not usable with any version of C++ Builder because the compiler ships +with an embedded version of PCRE, version 2.01 from 1998! [See also the note +about BCC5.5 above.] If you want to use PCRE you'll need to rename the +functions (pcre_compile to pcre_compile_bcc, etc) or do as I have done and just +use the 16 bit versions. I'm using std::wstring everywhere anyway. Since the +embedded version of PCRE does not have the 16 bit function names, there is no +conflict. + +Building PCRE using a C++ Builder static library project file (recommended): + +1. Rename or remove pcre.h, pcreposi.h, and pcreposix.h from your C++ Builder +original include path. + +2. Download PCRE from pcre.org and extract to a directory. + +3. Rename pcre_chartables.c.dist to pcre_chartables.c, pcre.h.generic to +pcre.h, and config.h.generic to config.h. + +4. Edit pcre.h and pcre_config.c so that they include config.h. + +5. Edit config.h like so: + +Comment out the following lines: +#define PACKAGE "pcre" +#define PACKAGE_BUGREPORT "" +#define PACKAGE_NAME "PCRE" +#define PACKAGE_STRING "PCRE 8.32" +#define PACKAGE_TARNAME "pcre" +#define PACKAGE_URL "" +#define PACKAGE_VERSION "8.32" + +Add the following lines: +#ifndef SUPPORT_UTF +#define SUPPORT_UTF 100 // any value is fine +#endif + +#ifndef SUPPORT_UCP +#define SUPPORT_UCP 101 // any value is fine +#endif + +#ifndef SUPPORT_UCP +#define SUPPORT_PCRE16 102 // any value is fine +#endif + +#ifndef SUPPORT_UTF8 +#define SUPPORT_UTF8 103 // any value is fine +#endif + +6. Build a C++ Builder project using the IDE. Go to File / New / Other and +choose Static Library. You can name it pcre.cbproj or whatever. Now set your +paths by going to Project / Options. Set the Include path. Do this from the +"Base" option to apply to both Release and Debug builds. Now add the following +files to the project: + +pcre.h +pcre16_byte_order.c +pcre16_chartables.c +pcre16_compile.c +pcre16_config.c +pcre16_dfa_exec.c +pcre16_exec.c +pcre16_fullinfo.c +pcre16_get.c +pcre16_globals.c +pcre16_maketables.c +pcre16_newline.c +pcre16_ord2utf16.c +pcre16_printint.c +pcre16_refcount.c +pcre16_string_utils.c +pcre16_study.c +pcre16_tables.c +pcre16_ucd.c +pcre16_utf16_utils.c +pcre16_valid_utf16.c +pcre16_version.c +pcre16_xclass.c + +//Optional +pcre_version.c + +7. After compiling the .lib file, copy the .lib and header files to a project +you want to use PCRE with. Enjoy. + +Optional ... Building PCRE using the makevp.bat file: + +1. Edit makevp_c.txt and makevp_l.txt and change all the names to the 16 bit +versions. + +2. Edit makevp.bat and set the path to C++ Builder. Run makevp.bat. + +Another PCRE user added this comment: + +Another approach I successfully used for some years with BCB 5 and 6 was to +make sure that include and library paths of PCRE are configured before the +default paths of the IDE in the dialogs where one can manage those paths. +Afterwards one can open the project files using a text editor and manually add +the self created library for pcre itself, pcrecpp doesn't ship with the IDE, in +the library nodes where the IDE manages its own libraries to link against in +front of the IDE-own libraries. This way one can use the default PCRE function +names without getting access violations on runtime. + + + + +BUILDING PCRE ON OPENVMS + +Stephen Hoffman sent the following, in December 2012: + +"Here is a very short write-up on the +OpenVMS port and here + + + +is a zip with the OpenVMS files, and with one modified testing-related PCRE +file." This is a port of PCRE 8.32. + +Earlier, Dan Mooney sent the following comments about building PCRE on OpenVMS. +They relate to an older version of PCRE that used fewer source files, so the +exact commands will need changing. See the current list of source files above. + +"It was quite easy to compile and link the library. I don't have a formal +make file but the attached file [reproduced below] contains the OpenVMS DCL +commands I used to build the library. I had to add #define +POSIX_MALLOC_THRESHOLD 10 to pcre.h since it was not defined anywhere. + +The library was built on: +O/S: HP OpenVMS v7.3-1 +Compiler: Compaq C v6.5-001-48BCD +Linker: vA13-01 + +The test results did not match 100% due to the issues you mention in your +documentation regarding isprint(), iscntrl(), isgraph() and ispunct(). I +modified some of the character tables temporarily and was able to get the +results to match. Tests using the fr locale did not match since I don't have +that locale loaded. The study size was always reported to be 3 less than the +value in the standard test output files." + +========================= +$! This DCL procedure builds PCRE on OpenVMS +$! +$! I followed the instructions in the non-unix-use file in the distribution. +$! +$ COMPILE == "CC/LIST/NOMEMBER_ALIGNMENT/PREFIX_LIBRARY_ENTRIES=ALL_ENTRIES +$ COMPILE DFTABLES.C +$ LINK/EXE=DFTABLES.EXE DFTABLES.OBJ +$ RUN DFTABLES.EXE/OUTPUT=CHARTABLES.C +$ COMPILE MAKETABLES.C +$ COMPILE GET.C +$ COMPILE STUDY.C +$! I had to set POSIX_MALLOC_THRESHOLD to 10 in PCRE.H since the symbol +$! did not seem to be defined anywhere. +$! I edited pcre.h and added #DEFINE SUPPORT_UTF8 to enable UTF8 support. +$ COMPILE PCRE.C +$ LIB/CREATE PCRE MAKETABLES.OBJ, GET.OBJ, STUDY.OBJ, PCRE.OBJ +$! I had to set POSIX_MALLOC_THRESHOLD to 10 in PCRE.H since the symbol +$! did not seem to be defined anywhere. +$ COMPILE PCREPOSIX.C +$ LIB/CREATE PCREPOSIX PCREPOSIX.OBJ +$ COMPILE PCRETEST.C +$ LINK/EXE=PCRETEST.EXE PCRETEST.OBJ, PCRE/LIB, PCREPOSIX/LIB +$! C programs that want access to command line arguments must be +$! defined as a symbol +$ PCRETEST :== "$ SYS$ROADSUSERS:[DMOONEY.REGEXP]PCRETEST.EXE" +$! Arguments must be enclosed in quotes. +$ PCRETEST "-C" +$! Test results: +$! +$! The test results did not match 100%. The functions isprint(), iscntrl(), +$! isgraph() and ispunct() on OpenVMS must not produce the same results +$! as the system that built the test output files provided with the +$! distribution. +$! +$! The study size did not match and was always 3 less on OpenVMS. +$! +$! Locale could not be set to fr +$! +========================= + + +BUILDING PCRE ON STRATUS OPENVOS + +These notes on the port of PCRE to VOS (lightly edited) were supplied by +Ashutosh Warikoo, whose email address has the local part awarikoo and the +domain nse.co.in. The port was for version 7.9 in August 2009. + +1. Building PCRE + +I built pcre on OpenVOS Release 17.0.1at using GNU Tools 3.4a without any +problems. I used the following packages to build PCRE: + + ftp://ftp.stratus.com/pub/vos/posix/ga/posix.save.evf.gz + +Please read and follow the instructions that come with these packages. To start +the build of pcre, from the root of the package type: + + ./build.sh + +2. Installing PCRE + +Once you have successfully built PCRE, login to the SysAdmin group, switch to +the root user, and type + + [ !create_dir (master_disk)>usr --if needed ] + [ !create_dir (master_disk)>usr>local --if needed ] + !gmake install + +This installs PCRE and its man pages into /usr/local. You can add +(master_disk)>usr>local>bin to your command search paths, or if you are in +BASH, add /usr/local/bin to the PATH environment variable. + +4. Restrictions + +This port requires readline library optionally. However during the build I +faced some yet unexplored errors while linking with readline. As it was an +optional component I chose to disable it. + +5. Known Problems + +I ran the test suite, but you will have to be your own judge of whether this +command, and this port, suits your purposes. If you find any problems that +appear to be related to the port itself, please let me know. Please see the +build.log file in the root of the package also. + + +BUILDING PCRE ON NATIVE Z/OS AND Z/VM + +z/OS and z/VM are operating systems for mainframe computers, produced by IBM. +The character code used is EBCDIC, not ASCII or Unicode. In z/OS, UNIX APIs and +applications can be supported through UNIX System Services, and in such an +environment PCRE can be built in the same way as in other systems. However, in +native z/OS (without UNIX System Services) and in z/VM, special ports are +required. PCRE1 version 8.39 is available in file 882 on this site: + + http://www.cbttape.org + +Everything, source and executable, is in EBCDIC and native z/OS file formats. +However, this software is not maintained and will not be upgraded. If you are +new to PCRE you should be looking at PCRE2 (version 10.30 or later). + +=============================== +Last Updated: 13 September 2017 +=============================== diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/README.txt b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/README.txt new file mode 100755 index 000000000..334362b3e --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/README.txt @@ -0,0 +1,1003 @@ +README file for PCRE (Perl-compatible regular expression library) +----------------------------------------------------------------- + +NOTE: This set of files relates to PCRE releases that use the original API, +with library names libpcre, libpcre16, and libpcre32. January 2015 saw the +first release of a new API, known as PCRE2, with release numbers starting at +10.00 and library names libpcre2-8, libpcre2-16, and libpcre2-32. The old +libraries (now called PCRE1) are still being maintained for bug fixes, but +there will be no new development. New projects are advised to use the new PCRE2 +libraries. + + +The latest release of PCRE1 is always available in three alternative formats +from: + + https://ftp.pcre.org/pub/pcre/pcre-x.xx.tar.gz + https://ftp.pcre.org/pub/pcre/pcre-x.xx.tar.bz2 + https://ftp.pcre.org/pub/pcre/pcre-x.xx.tar.zip + + +There is a mailing list for discussion about the development of PCRE at +pcre-dev@exim.org. You can access the archives and subscribe or manage your +subscription here: + + https://lists.exim.org/mailman/listinfo/pcre-dev + +Please read the NEWS file if you are upgrading from a previous release. +The contents of this README file are: + + The PCRE APIs + Documentation for PCRE + Contributions by users of PCRE + Building PCRE on non-Unix-like systems + Building PCRE without using autotools + Building PCRE using autotools + Retrieving configuration information + Shared libraries + Cross-compiling using autotools + Using HP's ANSI C++ compiler (aCC) + Compiling in Tru64 using native compilers + Using Sun's compilers for Solaris + Using PCRE from MySQL + Making new tarballs + Testing PCRE + Character tables + File manifest + + +The PCRE APIs +------------- + +PCRE is written in C, and it has its own API. There are three sets of +functions, one for the 8-bit library, which processes strings of bytes, one for +the 16-bit library, which processes strings of 16-bit values, and one for the +32-bit library, which processes strings of 32-bit values. The distribution also +includes a set of C++ wrapper functions (see the pcrecpp man page for details), +courtesy of Google Inc., which can be used to call the 8-bit PCRE library from +C++. Other C++ wrappers have been created from time to time. See, for example: +https://github.com/YasserAsmi/regexp, which aims to be simple and similar in +style to the C API. + +The distribution also contains a set of C wrapper functions (again, just for +the 8-bit library) that are based on the POSIX regular expression API (see the +pcreposix man page). These end up in the library called libpcreposix. Note that +this just provides a POSIX calling interface to PCRE; the regular expressions +themselves still follow Perl syntax and semantics. The POSIX API is restricted, +and does not give full access to all of PCRE's facilities. + +The header file for the POSIX-style functions is called pcreposix.h. The +official POSIX name is regex.h, but I did not want to risk possible problems +with existing files of that name by distributing it that way. To use PCRE with +an existing program that uses the POSIX API, pcreposix.h will have to be +renamed or pointed at by a link. + +If you are using the POSIX interface to PCRE and there is already a POSIX regex +library installed on your system, as well as worrying about the regex.h header +file (as mentioned above), you must also take care when linking programs to +ensure that they link with PCRE's libpcreposix library. Otherwise they may pick +up the POSIX functions of the same name from the other library. + +One way of avoiding this confusion is to compile PCRE with the addition of +-Dregcomp=PCREregcomp (and similarly for the other POSIX functions) to the +compiler flags (CFLAGS if you are using "configure" -- see below). This has the +effect of renaming the functions so that the names no longer clash. Of course, +you have to do the same thing for your applications, or write them using the +new names. + + +Documentation for PCRE +---------------------- + +If you install PCRE in the normal way on a Unix-like system, you will end up +with a set of man pages whose names all start with "pcre". The one that is just +called "pcre" lists all the others. In addition to these man pages, the PCRE +documentation is supplied in two other forms: + + 1. There are files called doc/pcre.txt, doc/pcregrep.txt, and + doc/pcretest.txt in the source distribution. The first of these is a + concatenation of the text forms of all the section 3 man pages except + the listing of pcredemo.c and those that summarize individual functions. + The other two are the text forms of the section 1 man pages for the + pcregrep and pcretest commands. These text forms are provided for ease of + scanning with text editors or similar tools. They are installed in + /share/doc/pcre, where is the installation prefix + (defaulting to /usr/local). + + 2. A set of files containing all the documentation in HTML form, hyperlinked + in various ways, and rooted in a file called index.html, is distributed in + doc/html and installed in /share/doc/pcre/html. + +Users of PCRE have contributed files containing the documentation for various +releases in CHM format. These can be found in the Contrib directory of the FTP +site (see next section). + + +Contributions by users of PCRE +------------------------------ + +You can find contributions from PCRE users in the directory + + ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/Contrib + +There is a README file giving brief descriptions of what they are. Some are +complete in themselves; others are pointers to URLs containing relevant files. +Some of this material is likely to be well out-of-date. Several of the earlier +contributions provided support for compiling PCRE on various flavours of +Windows (I myself do not use Windows). Nowadays there is more Windows support +in the standard distribution, so these contibutions have been archived. + +A PCRE user maintains downloadable Windows binaries of the pcregrep and +pcretest programs here: + + http://www.rexegg.com/pcregrep-pcretest.html + + +Building PCRE on non-Unix-like systems +-------------------------------------- + +For a non-Unix-like system, please read the comments in the file +NON-AUTOTOOLS-BUILD, though if your system supports the use of "configure" and +"make" you may be able to build PCRE using autotools in the same way as for +many Unix-like systems. + +PCRE can also be configured using the GUI facility provided by CMake's +cmake-gui command. This creates Makefiles, solution files, etc. The file +NON-AUTOTOOLS-BUILD has information about CMake. + +PCRE has been compiled on many different operating systems. It should be +straightforward to build PCRE on any system that has a Standard C compiler and +library, because it uses only Standard C functions. + + +Building PCRE without using autotools +------------------------------------- + +The use of autotools (in particular, libtool) is problematic in some +environments, even some that are Unix or Unix-like. See the NON-AUTOTOOLS-BUILD +file for ways of building PCRE without using autotools. + + +Building PCRE using autotools +----------------------------- + +If you are using HP's ANSI C++ compiler (aCC), please see the special note +in the section entitled "Using HP's ANSI C++ compiler (aCC)" below. + +The following instructions assume the use of the widely used "configure; make; +make install" (autotools) process. + +To build PCRE on system that supports autotools, first run the "configure" +command from the PCRE distribution directory, with your current directory set +to the directory where you want the files to be created. This command is a +standard GNU "autoconf" configuration script, for which generic instructions +are supplied in the file INSTALL. + +Most commonly, people build PCRE within its own distribution directory, and in +this case, on many systems, just running "./configure" is sufficient. However, +the usual methods of changing standard defaults are available. For example: + +CFLAGS='-O2 -Wall' ./configure --prefix=/opt/local + +This command specifies that the C compiler should be run with the flags '-O2 +-Wall' instead of the default, and that "make install" should install PCRE +under /opt/local instead of the default /usr/local. + +If you want to build in a different directory, just run "configure" with that +directory as current. For example, suppose you have unpacked the PCRE source +into /source/pcre/pcre-xxx, but you want to build it in /build/pcre/pcre-xxx: + +cd /build/pcre/pcre-xxx +/source/pcre/pcre-xxx/configure + +PCRE is written in C and is normally compiled as a C library. However, it is +possible to build it as a C++ library, though the provided building apparatus +does not have any features to support this. + +There are some optional features that can be included or omitted from the PCRE +library. They are also documented in the pcrebuild man page. + +. By default, both shared and static libraries are built. You can change this + by adding one of these options to the "configure" command: + + --disable-shared + --disable-static + + (See also "Shared libraries on Unix-like systems" below.) + +. By default, only the 8-bit library is built. If you add --enable-pcre16 to + the "configure" command, the 16-bit library is also built. If you add + --enable-pcre32 to the "configure" command, the 32-bit library is also built. + If you want only the 16-bit or 32-bit library, use --disable-pcre8 to disable + building the 8-bit library. + +. If you are building the 8-bit library and want to suppress the building of + the C++ wrapper library, you can add --disable-cpp to the "configure" + command. Otherwise, when "configure" is run without --disable-pcre8, it will + try to find a C++ compiler and C++ header files, and if it succeeds, it will + try to build the C++ wrapper. + +. If you want to include support for just-in-time compiling, which can give + large performance improvements on certain platforms, add --enable-jit to the + "configure" command. This support is available only for certain hardware + architectures. If you try to enable it on an unsupported architecture, there + will be a compile time error. + +. When JIT support is enabled, pcregrep automatically makes use of it, unless + you add --disable-pcregrep-jit to the "configure" command. + +. If you want to make use of the support for UTF-8 Unicode character strings in + the 8-bit library, or UTF-16 Unicode character strings in the 16-bit library, + or UTF-32 Unicode character strings in the 32-bit library, you must add + --enable-utf to the "configure" command. Without it, the code for handling + UTF-8, UTF-16 and UTF-8 is not included in the relevant library. Even + when --enable-utf is included, the use of a UTF encoding still has to be + enabled by an option at run time. When PCRE is compiled with this option, its + input can only either be ASCII or UTF-8/16/32, even when running on EBCDIC + platforms. It is not possible to use both --enable-utf and --enable-ebcdic at + the same time. + +. There are no separate options for enabling UTF-8, UTF-16 and UTF-32 + independently because that would allow ridiculous settings such as requesting + UTF-16 support while building only the 8-bit library. However, the option + --enable-utf8 is retained for backwards compatibility with earlier releases + that did not support 16-bit or 32-bit character strings. It is synonymous with + --enable-utf. It is not possible to configure one library with UTF support + and the other without in the same configuration. + +. If, in addition to support for UTF-8/16/32 character strings, you want to + include support for the \P, \p, and \X sequences that recognize Unicode + character properties, you must add --enable-unicode-properties to the + "configure" command. This adds about 30K to the size of the library (in the + form of a property table); only the basic two-letter properties such as Lu + are supported. + +. You can build PCRE to recognize either CR or LF or the sequence CRLF or any + of the preceding, or any of the Unicode newline sequences as indicating the + end of a line. Whatever you specify at build time is the default; the caller + of PCRE can change the selection at run time. The default newline indicator + is a single LF character (the Unix standard). You can specify the default + newline indicator by adding --enable-newline-is-cr or --enable-newline-is-lf + or --enable-newline-is-crlf or --enable-newline-is-anycrlf or + --enable-newline-is-any to the "configure" command, respectively. + + If you specify --enable-newline-is-cr or --enable-newline-is-crlf, some of + the standard tests will fail, because the lines in the test files end with + LF. Even if the files are edited to change the line endings, there are likely + to be some failures. With --enable-newline-is-anycrlf or + --enable-newline-is-any, many tests should succeed, but there may be some + failures. + +. By default, the sequence \R in a pattern matches any Unicode line ending + sequence. This is independent of the option specifying what PCRE considers to + be the end of a line (see above). However, the caller of PCRE can restrict \R + to match only CR, LF, or CRLF. You can make this the default by adding + --enable-bsr-anycrlf to the "configure" command (bsr = "backslash R"). + +. When called via the POSIX interface, PCRE uses malloc() to get additional + storage for processing capturing parentheses if there are more than 10 of + them in a pattern. You can increase this threshold by setting, for example, + + --with-posix-malloc-threshold=20 + + on the "configure" command. + +. PCRE has a counter that limits the depth of nesting of parentheses in a + pattern. This limits the amount of system stack that a pattern uses when it + is compiled. The default is 250, but you can change it by setting, for + example, + + --with-parens-nest-limit=500 + +. PCRE has a counter that can be set to limit the amount of resources it uses + when matching a pattern. If the limit is exceeded during a match, the match + fails. The default is ten million. You can change the default by setting, for + example, + + --with-match-limit=500000 + + on the "configure" command. This is just the default; individual calls to + pcre_exec() can supply their own value. There is more discussion on the + pcreapi man page. + +. There is a separate counter that limits the depth of recursive function calls + during a matching process. This also has a default of ten million, which is + essentially "unlimited". You can change the default by setting, for example, + + --with-match-limit-recursion=500000 + + Recursive function calls use up the runtime stack; running out of stack can + cause programs to crash in strange ways. There is a discussion about stack + sizes in the pcrestack man page. + +. The default maximum compiled pattern size is around 64K. You can increase + this by adding --with-link-size=3 to the "configure" command. In the 8-bit + library, PCRE then uses three bytes instead of two for offsets to different + parts of the compiled pattern. In the 16-bit library, --with-link-size=3 is + the same as --with-link-size=4, which (in both libraries) uses four-byte + offsets. Increasing the internal link size reduces performance. In the 32-bit + library, the only supported link size is 4. + +. You can build PCRE so that its internal match() function that is called from + pcre_exec() does not call itself recursively. Instead, it uses memory blocks + obtained from the heap via the special functions pcre_stack_malloc() and + pcre_stack_free() to save data that would otherwise be saved on the stack. To + build PCRE like this, use + + --disable-stack-for-recursion + + on the "configure" command. PCRE runs more slowly in this mode, but it may be + necessary in environments with limited stack sizes. This applies only to the + normal execution of the pcre_exec() function; if JIT support is being + successfully used, it is not relevant. Equally, it does not apply to + pcre_dfa_exec(), which does not use deeply nested recursion. There is a + discussion about stack sizes in the pcrestack man page. + +. For speed, PCRE uses four tables for manipulating and identifying characters + whose code point values are less than 256. By default, it uses a set of + tables for ASCII encoding that is part of the distribution. If you specify + + --enable-rebuild-chartables + + a program called dftables is compiled and run in the default C locale when + you obey "make". It builds a source file called pcre_chartables.c. If you do + not specify this option, pcre_chartables.c is created as a copy of + pcre_chartables.c.dist. See "Character tables" below for further information. + +. It is possible to compile PCRE for use on systems that use EBCDIC as their + character code (as opposed to ASCII/Unicode) by specifying + + --enable-ebcdic + + This automatically implies --enable-rebuild-chartables (see above). However, + when PCRE is built this way, it always operates in EBCDIC. It cannot support + both EBCDIC and UTF-8/16/32. There is a second option, --enable-ebcdic-nl25, + which specifies that the code value for the EBCDIC NL character is 0x25 + instead of the default 0x15. + +. In environments where valgrind is installed, if you specify + + --enable-valgrind + + PCRE will use valgrind annotations to mark certain memory regions as + unaddressable. This allows it to detect invalid memory accesses, and is + mostly useful for debugging PCRE itself. + +. In environments where the gcc compiler is used and lcov version 1.6 or above + is installed, if you specify + + --enable-coverage + + the build process implements a code coverage report for the test suite. The + report is generated by running "make coverage". If ccache is installed on + your system, it must be disabled when building PCRE for coverage reporting. + You can do this by setting the environment variable CCACHE_DISABLE=1 before + running "make" to build PCRE. There is more information about coverage + reporting in the "pcrebuild" documentation. + +. The pcregrep program currently supports only 8-bit data files, and so + requires the 8-bit PCRE library. It is possible to compile pcregrep to use + libz and/or libbz2, in order to read .gz and .bz2 files (respectively), by + specifying one or both of + + --enable-pcregrep-libz + --enable-pcregrep-libbz2 + + Of course, the relevant libraries must be installed on your system. + +. The default size (in bytes) of the internal buffer used by pcregrep can be + set by, for example: + + --with-pcregrep-bufsize=51200 + + The value must be a plain integer. The default is 20480. + +. It is possible to compile pcretest so that it links with the libreadline + or libedit libraries, by specifying, respectively, + + --enable-pcretest-libreadline or --enable-pcretest-libedit + + If this is done, when pcretest's input is from a terminal, it reads it using + the readline() function. This provides line-editing and history facilities. + Note that libreadline is GPL-licenced, so if you distribute a binary of + pcretest linked in this way, there may be licensing issues. These can be + avoided by linking with libedit (which has a BSD licence) instead. + + Enabling libreadline causes the -lreadline option to be added to the pcretest + build. In many operating environments with a sytem-installed readline + library this is sufficient. However, in some environments (e.g. if an + unmodified distribution version of readline is in use), it may be necessary + to specify something like LIBS="-lncurses" as well. This is because, to quote + the readline INSTALL, "Readline uses the termcap functions, but does not link + with the termcap or curses library itself, allowing applications which link + with readline the to choose an appropriate library." If you get error + messages about missing functions tgetstr, tgetent, tputs, tgetflag, or tgoto, + this is the problem, and linking with the ncurses library should fix it. + +The "configure" script builds the following files for the basic C library: + +. Makefile the makefile that builds the library +. config.h build-time configuration options for the library +. pcre.h the public PCRE header file +. pcre-config script that shows the building settings such as CFLAGS + that were set for "configure" +. libpcre.pc ) data for the pkg-config command +. libpcre16.pc ) +. libpcre32.pc ) +. libpcreposix.pc ) +. libtool script that builds shared and/or static libraries + +Versions of config.h and pcre.h are distributed in the PCRE tarballs under the +names config.h.generic and pcre.h.generic. These are provided for those who +have to built PCRE without using "configure" or CMake. If you use "configure" +or CMake, the .generic versions are not used. + +When building the 8-bit library, if a C++ compiler is found, the following +files are also built: + +. libpcrecpp.pc data for the pkg-config command +. pcrecpparg.h header file for calling PCRE via the C++ wrapper +. pcre_stringpiece.h header for the C++ "stringpiece" functions + +The "configure" script also creates config.status, which is an executable +script that can be run to recreate the configuration, and config.log, which +contains compiler output from tests that "configure" runs. + +Once "configure" has run, you can run "make". This builds the the libraries +libpcre, libpcre16 and/or libpcre32, and a test program called pcretest. If you +enabled JIT support with --enable-jit, a test program called pcre_jit_test is +built as well. + +If the 8-bit library is built, libpcreposix and the pcregrep command are also +built, and if a C++ compiler was found on your system, and you did not disable +it with --disable-cpp, "make" builds the C++ wrapper library, which is called +libpcrecpp, as well as some test programs called pcrecpp_unittest, +pcre_scanner_unittest, and pcre_stringpiece_unittest. + +The command "make check" runs all the appropriate tests. Details of the PCRE +tests are given below in a separate section of this document. + +You can use "make install" to install PCRE into live directories on your +system. The following are installed (file names are all relative to the + that is set when "configure" is run): + + Commands (bin): + pcretest + pcregrep (if 8-bit support is enabled) + pcre-config + + Libraries (lib): + libpcre16 (if 16-bit support is enabled) + libpcre32 (if 32-bit support is enabled) + libpcre (if 8-bit support is enabled) + libpcreposix (if 8-bit support is enabled) + libpcrecpp (if 8-bit and C++ support is enabled) + + Configuration information (lib/pkgconfig): + libpcre16.pc + libpcre32.pc + libpcre.pc + libpcreposix.pc + libpcrecpp.pc (if C++ support is enabled) + + Header files (include): + pcre.h + pcreposix.h + pcre_scanner.h ) + pcre_stringpiece.h ) if C++ support is enabled + pcrecpp.h ) + pcrecpparg.h ) + + Man pages (share/man/man{1,3}): + pcregrep.1 + pcretest.1 + pcre-config.1 + pcre.3 + pcre*.3 (lots more pages, all starting "pcre") + + HTML documentation (share/doc/pcre/html): + index.html + *.html (lots more pages, hyperlinked from index.html) + + Text file documentation (share/doc/pcre): + AUTHORS + COPYING + ChangeLog + LICENCE + NEWS + README + pcre.txt (a concatenation of the man(3) pages) + pcretest.txt the pcretest man page + pcregrep.txt the pcregrep man page + pcre-config.txt the pcre-config man page + +If you want to remove PCRE from your system, you can run "make uninstall". +This removes all the files that "make install" installed. However, it does not +remove any directories, because these are often shared with other programs. + + +Retrieving configuration information +------------------------------------ + +Running "make install" installs the command pcre-config, which can be used to +recall information about the PCRE configuration and installation. For example: + + pcre-config --version + +prints the version number, and + + pcre-config --libs + +outputs information about where the library is installed. This command can be +included in makefiles for programs that use PCRE, saving the programmer from +having to remember too many details. + +The pkg-config command is another system for saving and retrieving information +about installed libraries. Instead of separate commands for each library, a +single command is used. For example: + + pkg-config --cflags pcre + +The data is held in *.pc files that are installed in a directory called +/lib/pkgconfig. + + +Shared libraries +---------------- + +The default distribution builds PCRE as shared libraries and static libraries, +as long as the operating system supports shared libraries. Shared library +support relies on the "libtool" script which is built as part of the +"configure" process. + +The libtool script is used to compile and link both shared and static +libraries. They are placed in a subdirectory called .libs when they are newly +built. The programs pcretest and pcregrep are built to use these uninstalled +libraries (by means of wrapper scripts in the case of shared libraries). When +you use "make install" to install shared libraries, pcregrep and pcretest are +automatically re-built to use the newly installed shared libraries before being +installed themselves. However, the versions left in the build directory still +use the uninstalled libraries. + +To build PCRE using static libraries only you must use --disable-shared when +configuring it. For example: + +./configure --prefix=/usr/gnu --disable-shared + +Then run "make" in the usual way. Similarly, you can use --disable-static to +build only shared libraries. + + +Cross-compiling using autotools +------------------------------- + +You can specify CC and CFLAGS in the normal way to the "configure" command, in +order to cross-compile PCRE for some other host. However, you should NOT +specify --enable-rebuild-chartables, because if you do, the dftables.c source +file is compiled and run on the local host, in order to generate the inbuilt +character tables (the pcre_chartables.c file). This will probably not work, +because dftables.c needs to be compiled with the local compiler, not the cross +compiler. + +When --enable-rebuild-chartables is not specified, pcre_chartables.c is created +by making a copy of pcre_chartables.c.dist, which is a default set of tables +that assumes ASCII code. Cross-compiling with the default tables should not be +a problem. + +If you need to modify the character tables when cross-compiling, you should +move pcre_chartables.c.dist out of the way, then compile dftables.c by hand and +run it on the local host to make a new version of pcre_chartables.c.dist. +Then when you cross-compile PCRE this new version of the tables will be used. + + +Using HP's ANSI C++ compiler (aCC) +---------------------------------- + +Unless C++ support is disabled by specifying the "--disable-cpp" option of the +"configure" script, you must include the "-AA" option in the CXXFLAGS +environment variable in order for the C++ components to compile correctly. + +Also, note that the aCC compiler on PA-RISC platforms may have a defect whereby +needed libraries fail to get included when specifying the "-AA" compiler +option. If you experience unresolved symbols when linking the C++ programs, +use the workaround of specifying the following environment variable prior to +running the "configure" script: + + CXXLDFLAGS="-lstd_v2 -lCsup_v2" + + +Compiling in Tru64 using native compilers +----------------------------------------- + +The following error may occur when compiling with native compilers in the Tru64 +operating system: + + CXX libpcrecpp_la-pcrecpp.lo +cxx: Error: /usr/lib/cmplrs/cxx/V7.1-006/include/cxx/iosfwd, line 58: #error + directive: "cannot include iosfwd -- define __USE_STD_IOSTREAM to + override default - see section 7.1.2 of the C++ Using Guide" +#error "cannot include iosfwd -- define __USE_STD_IOSTREAM to override default +- see section 7.1.2 of the C++ Using Guide" + +This may be followed by other errors, complaining that 'namespace "std" has no +member'. The solution to this is to add the line + +#define __USE_STD_IOSTREAM 1 + +to the config.h file. + + +Using Sun's compilers for Solaris +--------------------------------- + +A user reports that the following configurations work on Solaris 9 sparcv9 and +Solaris 9 x86 (32-bit): + + Solaris 9 sparcv9: ./configure --disable-cpp CC=/bin/cc CFLAGS="-m64 -g" + Solaris 9 x86: ./configure --disable-cpp CC=/bin/cc CFLAGS="-g" + + +Using PCRE from MySQL +--------------------- + +On systems where both PCRE and MySQL are installed, it is possible to make use +of PCRE from within MySQL, as an alternative to the built-in pattern matching. +There is a web page that tells you how to do this: + + http://www.mysqludf.org/lib_mysqludf_preg/index.php + + +Making new tarballs +------------------- + +The command "make dist" creates three PCRE tarballs, in tar.gz, tar.bz2, and +zip formats. The command "make distcheck" does the same, but then does a trial +build of the new distribution to ensure that it works. + +If you have modified any of the man page sources in the doc directory, you +should first run the PrepareRelease script before making a distribution. This +script creates the .txt and HTML forms of the documentation from the man pages. + + +Testing PCRE +------------ + +To test the basic PCRE library on a Unix-like system, run the RunTest script. +There is another script called RunGrepTest that tests the options of the +pcregrep command. If the C++ wrapper library is built, three test programs +called pcrecpp_unittest, pcre_scanner_unittest, and pcre_stringpiece_unittest +are also built. When JIT support is enabled, another test program called +pcre_jit_test is built. + +Both the scripts and all the program tests are run if you obey "make check" or +"make test". For other environments, see the instructions in +NON-AUTOTOOLS-BUILD. + +The RunTest script runs the pcretest test program (which is documented in its +own man page) on each of the relevant testinput files in the testdata +directory, and compares the output with the contents of the corresponding +testoutput files. RunTest uses a file called testtry to hold the main output +from pcretest. Other files whose names begin with "test" are used as working +files in some tests. + +Some tests are relevant only when certain build-time options were selected. For +example, the tests for UTF-8/16/32 support are run only if --enable-utf was +used. RunTest outputs a comment when it skips a test. + +Many of the tests that are not skipped are run up to three times. The second +run forces pcre_study() to be called for all patterns except for a few in some +tests that are marked "never study" (see the pcretest program for how this is +done). If JIT support is available, the non-DFA tests are run a third time, +this time with a forced pcre_study() with the PCRE_STUDY_JIT_COMPILE option. +This testing can be suppressed by putting "nojit" on the RunTest command line. + +The entire set of tests is run once for each of the 8-bit, 16-bit and 32-bit +libraries that are enabled. If you want to run just one set of tests, call +RunTest with either the -8, -16 or -32 option. + +If valgrind is installed, you can run the tests under it by putting "valgrind" +on the RunTest command line. To run pcretest on just one or more specific test +files, give their numbers as arguments to RunTest, for example: + + RunTest 2 7 11 + +You can also specify ranges of tests such as 3-6 or 3- (meaning 3 to the +end), or a number preceded by ~ to exclude a test. For example: + + Runtest 3-15 ~10 + +This runs tests 3 to 15, excluding test 10, and just ~13 runs all the tests +except test 13. Whatever order the arguments are in, the tests are always run +in numerical order. + +You can also call RunTest with the single argument "list" to cause it to output +a list of tests. + +The first test file can be fed directly into the perltest.pl script to check +that Perl gives the same results. The only difference you should see is in the +first few lines, where the Perl version is given instead of the PCRE version. + +The second set of tests check pcre_fullinfo(), pcre_study(), +pcre_copy_substring(), pcre_get_substring(), pcre_get_substring_list(), error +detection, and run-time flags that are specific to PCRE, as well as the POSIX +wrapper API. It also uses the debugging flags to check some of the internals of +pcre_compile(). + +If you build PCRE with a locale setting that is not the standard C locale, the +character tables may be different (see next paragraph). In some cases, this may +cause failures in the second set of tests. For example, in a locale where the +isprint() function yields TRUE for characters in the range 128-255, the use of +[:isascii:] inside a character class defines a different set of characters, and +this shows up in this test as a difference in the compiled code, which is being +listed for checking. Where the comparison test output contains [\x00-\x7f] the +test will contain [\x00-\xff], and similarly in some other cases. This is not a +bug in PCRE. + +The third set of tests checks pcre_maketables(), the facility for building a +set of character tables for a specific locale and using them instead of the +default tables. The tests make use of the "fr_FR" (French) locale. Before +running the test, the script checks for the presence of this locale by running +the "locale" command. If that command fails, or if it doesn't include "fr_FR" +in the list of available locales, the third test cannot be run, and a comment +is output to say why. If running this test produces instances of the error + + ** Failed to set locale "fr_FR" + +in the comparison output, it means that locale is not available on your system, +despite being listed by "locale". This does not mean that PCRE is broken. + +[If you are trying to run this test on Windows, you may be able to get it to +work by changing "fr_FR" to "french" everywhere it occurs. Alternatively, use +RunTest.bat. The version of RunTest.bat included with PCRE 7.4 and above uses +Windows versions of test 2. More info on using RunTest.bat is included in the +document entitled NON-UNIX-USE.] + +The fourth and fifth tests check the UTF-8/16/32 support and error handling and +internal UTF features of PCRE that are not relevant to Perl, respectively. The +sixth and seventh tests do the same for Unicode character properties support. + +The eighth, ninth, and tenth tests check the pcre_dfa_exec() alternative +matching function, in non-UTF-8/16/32 mode, UTF-8/16/32 mode, and UTF-8/16/32 +mode with Unicode property support, respectively. + +The eleventh test checks some internal offsets and code size features; it is +run only when the default "link size" of 2 is set (in other cases the sizes +change) and when Unicode property support is enabled. + +The twelfth test is run only when JIT support is available, and the thirteenth +test is run only when JIT support is not available. They test some JIT-specific +features such as information output from pcretest about JIT compilation. + +The fourteenth, fifteenth, and sixteenth tests are run only in 8-bit mode, and +the seventeenth, eighteenth, and nineteenth tests are run only in 16/32-bit +mode. These are tests that generate different output in the two modes. They are +for general cases, UTF-8/16/32 support, and Unicode property support, +respectively. + +The twentieth test is run only in 16/32-bit mode. It tests some specific +16/32-bit features of the DFA matching engine. + +The twenty-first and twenty-second tests are run only in 16/32-bit mode, when +the link size is set to 2 for the 16-bit library. They test reloading +pre-compiled patterns. + +The twenty-third and twenty-fourth tests are run only in 16-bit mode. They are +for general cases, and UTF-16 support, respectively. + +The twenty-fifth and twenty-sixth tests are run only in 32-bit mode. They are +for general cases, and UTF-32 support, respectively. + + +Character tables +---------------- + +For speed, PCRE uses four tables for manipulating and identifying characters +whose code point values are less than 256. The final argument of the +pcre_compile() function is a pointer to a block of memory containing the +concatenated tables. A call to pcre_maketables() can be used to generate a set +of tables in the current locale. If the final argument for pcre_compile() is +passed as NULL, a set of default tables that is built into the binary is used. + +The source file called pcre_chartables.c contains the default set of tables. By +default, this is created as a copy of pcre_chartables.c.dist, which contains +tables for ASCII coding. However, if --enable-rebuild-chartables is specified +for ./configure, a different version of pcre_chartables.c is built by the +program dftables (compiled from dftables.c), which uses the ANSI C character +handling functions such as isalnum(), isalpha(), isupper(), islower(), etc. to +build the table sources. This means that the default C locale which is set for +your system will control the contents of these default tables. You can change +the default tables by editing pcre_chartables.c and then re-building PCRE. If +you do this, you should take care to ensure that the file does not get +automatically re-generated. The best way to do this is to move +pcre_chartables.c.dist out of the way and replace it with your customized +tables. + +When the dftables program is run as a result of --enable-rebuild-chartables, +it uses the default C locale that is set on your system. It does not pay +attention to the LC_xxx environment variables. In other words, it uses the +system's default locale rather than whatever the compiling user happens to have +set. If you really do want to build a source set of character tables in a +locale that is specified by the LC_xxx variables, you can run the dftables +program by hand with the -L option. For example: + + ./dftables -L pcre_chartables.c.special + +The first two 256-byte tables provide lower casing and case flipping functions, +respectively. The next table consists of three 32-byte bit maps which identify +digits, "word" characters, and white space, respectively. These are used when +building 32-byte bit maps that represent character classes for code points less +than 256. + +The final 256-byte table has bits indicating various character types, as +follows: + + 1 white space character + 2 letter + 4 decimal digit + 8 hexadecimal digit + 16 alphanumeric or '_' + 128 regular expression metacharacter or binary zero + +You should not alter the set of characters that contain the 128 bit, as that +will cause PCRE to malfunction. + + +File manifest +------------- + +The distribution should contain the files listed below. Where a file name is +given as pcre[16|32]_xxx it means that there are three files, one with the name +pcre_xxx, one with the name pcre16_xx, and a third with the name pcre32_xxx. + +(A) Source files of the PCRE library functions and their headers: + + dftables.c auxiliary program for building pcre_chartables.c + when --enable-rebuild-chartables is specified + + pcre_chartables.c.dist a default set of character tables that assume ASCII + coding; used, unless --enable-rebuild-chartables is + specified, by copying to pcre[16]_chartables.c + + pcreposix.c ) + pcre[16|32]_byte_order.c ) + pcre[16|32]_compile.c ) + pcre[16|32]_config.c ) + pcre[16|32]_dfa_exec.c ) + pcre[16|32]_exec.c ) + pcre[16|32]_fullinfo.c ) + pcre[16|32]_get.c ) sources for the functions in the library, + pcre[16|32]_globals.c ) and some internal functions that they use + pcre[16|32]_jit_compile.c ) + pcre[16|32]_maketables.c ) + pcre[16|32]_newline.c ) + pcre[16|32]_refcount.c ) + pcre[16|32]_string_utils.c ) + pcre[16|32]_study.c ) + pcre[16|32]_tables.c ) + pcre[16|32]_ucd.c ) + pcre[16|32]_version.c ) + pcre[16|32]_xclass.c ) + pcre_ord2utf8.c ) + pcre_valid_utf8.c ) + pcre16_ord2utf16.c ) + pcre16_utf16_utils.c ) + pcre16_valid_utf16.c ) + pcre32_utf32_utils.c ) + pcre32_valid_utf32.c ) + + pcre[16|32]_printint.c ) debugging function that is used by pcretest, + ) and can also be #included in pcre_compile() + + pcre.h.in template for pcre.h when built by "configure" + pcreposix.h header for the external POSIX wrapper API + pcre_internal.h header for internal use + sljit/* 16 files that make up the JIT compiler + ucp.h header for Unicode property handling + + config.h.in template for config.h, which is built by "configure" + + pcrecpp.h public header file for the C++ wrapper + pcrecpparg.h.in template for another C++ header file + pcre_scanner.h public header file for C++ scanner functions + pcrecpp.cc ) + pcre_scanner.cc ) source for the C++ wrapper library + + pcre_stringpiece.h.in template for pcre_stringpiece.h, the header for the + C++ stringpiece functions + pcre_stringpiece.cc source for the C++ stringpiece functions + +(B) Source files for programs that use PCRE: + + pcredemo.c simple demonstration of coding calls to PCRE + pcregrep.c source of a grep utility that uses PCRE + pcretest.c comprehensive test program + +(C) Auxiliary files: + + 132html script to turn "man" pages into HTML + AUTHORS information about the author of PCRE + ChangeLog log of changes to the code + CleanTxt script to clean nroff output for txt man pages + Detrail script to remove trailing spaces + HACKING some notes about the internals of PCRE + INSTALL generic installation instructions + LICENCE conditions for the use of PCRE + COPYING the same, using GNU's standard name + Makefile.in ) template for Unix Makefile, which is built by + ) "configure" + Makefile.am ) the automake input that was used to create + ) Makefile.in + NEWS important changes in this release + NON-UNIX-USE the previous name for NON-AUTOTOOLS-BUILD + NON-AUTOTOOLS-BUILD notes on building PCRE without using autotools + PrepareRelease script to make preparations for "make dist" + README this file + RunTest a Unix shell script for running tests + RunGrepTest a Unix shell script for pcregrep tests + aclocal.m4 m4 macros (generated by "aclocal") + config.guess ) files used by libtool, + config.sub ) used only when building a shared library + configure a configuring shell script (built by autoconf) + configure.ac ) the autoconf input that was used to build + ) "configure" and config.h + depcomp ) script to find program dependencies, generated by + ) automake + doc/*.3 man page sources for PCRE + doc/*.1 man page sources for pcregrep and pcretest + doc/index.html.src the base HTML page + doc/html/* HTML documentation + doc/pcre.txt plain text version of the man pages + doc/pcretest.txt plain text documentation of test program + doc/perltest.txt plain text documentation of Perl test program + install-sh a shell script for installing files + libpcre16.pc.in template for libpcre16.pc for pkg-config + libpcre32.pc.in template for libpcre32.pc for pkg-config + libpcre.pc.in template for libpcre.pc for pkg-config + libpcreposix.pc.in template for libpcreposix.pc for pkg-config + libpcrecpp.pc.in template for libpcrecpp.pc for pkg-config + ltmain.sh file used to build a libtool script + missing ) common stub for a few missing GNU programs while + ) installing, generated by automake + mkinstalldirs script for making install directories + perltest.pl Perl test program + pcre-config.in source of script which retains PCRE information + pcre_jit_test.c test program for the JIT compiler + pcrecpp_unittest.cc ) + pcre_scanner_unittest.cc ) test programs for the C++ wrapper + pcre_stringpiece_unittest.cc ) + testdata/testinput* test data for main library tests + testdata/testoutput* expected test results + testdata/grep* input and output for pcregrep tests + testdata/* other supporting test files + +(D) Auxiliary files for cmake support + + cmake/COPYING-CMAKE-SCRIPTS + cmake/FindPackageHandleStandardArgs.cmake + cmake/FindEditline.cmake + cmake/FindReadline.cmake + CMakeLists.txt + config-cmake.h.in + +(E) Auxiliary files for VPASCAL + + makevp.bat + makevp_c.txt + makevp_l.txt + pcregexp.pas + +(F) Auxiliary files for building PCRE "by hand" + + pcre.h.generic ) a version of the public PCRE header file + ) for use in non-"configure" environments + config.h.generic ) a version of config.h for use in non-"configure" + ) environments + +(F) Miscellaneous + + RunTest.bat a script for running tests under Windows + +Philip Hazel +Email local part: ph10 +Email domain: cam.ac.uk +Last updated: 12 February 2020 diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/index.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/index.html new file mode 100755 index 000000000..352c55df2 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/index.html @@ -0,0 +1,185 @@ + + + +PCRE specification + + +

Perl-compatible Regular Expressions (PCRE)

+

+The HTML documentation for PCRE consists of a number of pages that are listed +below in alphabetical order. If you are new to PCRE, please read the first one +first. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
pcre  Introductory page
pcre-config  Information about the installation configuration
pcre16  Discussion of the 16-bit PCRE library
pcre32  Discussion of the 32-bit PCRE library
pcreapi  PCRE's native API
pcrebuild  Building PCRE
pcrecallout  The callout facility
pcrecompat  Compability with Perl
pcrecpp  The C++ wrapper for the PCRE library
pcredemo  A demonstration C program that uses the PCRE library
pcregrep  The pcregrep command
pcrejit  Discussion of the just-in-time optimization support
pcrelimits  Details of size and other limits
pcrematching  Discussion of the two matching algorithms
pcrepartial  Using PCRE for partial matching
pcrepattern  Specification of the regular expressions supported by PCRE
pcreperform  Some comments on performance
pcreposix  The POSIX API to the PCRE 8-bit library
pcreprecompile  How to save and re-use compiled patterns
pcresample  Discussion of the pcredemo program
pcrestack  Discussion of PCRE's stack usage
pcresyntax  Syntax quick-reference summary
pcretest  The pcretest command for testing PCRE
pcreunicode  Discussion of Unicode and UTF-8/UTF-16/UTF-32 support
+ +

+There are also individual pages that summarize the interface for each function +in the library. There is a single page for each triple of 8-bit/16-bit/32-bit +functions. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
pcre_assign_jit_stack  Assign stack for JIT matching
pcre_compile  Compile a regular expression
pcre_compile2  Compile a regular expression (alternate interface)
pcre_config  Show build-time configuration options
pcre_copy_named_substring  Extract named substring into given buffer
pcre_copy_substring  Extract numbered substring into given buffer
pcre_dfa_exec  Match a compiled pattern to a subject string + (DFA algorithm; not Perl compatible)
pcre_exec  Match a compiled pattern to a subject string + (Perl compatible)
pcre_free_study  Free study data
pcre_free_substring  Free extracted substring
pcre_free_substring_list  Free list of extracted substrings
pcre_fullinfo  Extract information about a pattern
pcre_get_named_substring  Extract named substring into new memory
pcre_get_stringnumber  Convert captured string name to number
pcre_get_stringtable_entries  Find table entries for given string name
pcre_get_substring  Extract numbered substring into new memory
pcre_get_substring_list  Extract all substrings into new memory
pcre_jit_exec  Fast path interface to JIT matching
pcre_jit_stack_alloc  Create a stack for JIT matching
pcre_jit_stack_free  Free a JIT matching stack
pcre_maketables  Build character tables in current locale
pcre_pattern_to_host_byte_order  Convert compiled pattern to host byte order if necessary
pcre_refcount  Maintain reference count in compiled pattern
pcre_study  Study a compiled pattern
pcre_utf16_to_host_byte_order  Convert UTF-16 string to host byte order if necessary
pcre_utf32_to_host_byte_order  Convert UTF-32 string to host byte order if necessary
pcre_version  Return PCRE version and release date
+ + diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre-config.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre-config.html new file mode 100755 index 000000000..56a806049 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre-config.html @@ -0,0 +1,109 @@ + + +pcre-config specification + + +

pcre-config man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+

+
SYNOPSIS
+

+pcre-config [--prefix] [--exec-prefix] [--version] [--libs] + [--libs16] [--libs32] [--libs-cpp] [--libs-posix] + [--cflags] [--cflags-posix] +

+
DESCRIPTION
+

+pcre-config returns the configuration of the installed PCRE +libraries and the options required to compile a program to use them. Some of +the options apply only to the 8-bit, or 16-bit, or 32-bit libraries, +respectively, and are +not available if only one of those libraries has been built. If an unavailable +option is encountered, the "usage" information is output. +

+
OPTIONS
+

+--prefix +Writes the directory prefix used in the PCRE installation for architecture +independent files (/usr on many systems, /usr/local on some +systems) to the standard output. +

+

+--exec-prefix +Writes the directory prefix used in the PCRE installation for architecture +dependent files (normally the same as --prefix) to the standard output. +

+

+--version +Writes the version number of the installed PCRE libraries to the standard +output. +

+

+--libs +Writes to the standard output the command line options required to link +with the 8-bit PCRE library (-lpcre on many systems). +

+

+--libs16 +Writes to the standard output the command line options required to link +with the 16-bit PCRE library (-lpcre16 on many systems). +

+

+--libs32 +Writes to the standard output the command line options required to link +with the 32-bit PCRE library (-lpcre32 on many systems). +

+

+--libs-cpp +Writes to the standard output the command line options required to link with +PCRE's C++ wrapper library (-lpcrecpp -lpcre on many +systems). +

+

+--libs-posix +Writes to the standard output the command line options required to link with +PCRE's POSIX API wrapper library (-lpcreposix -lpcre on many +systems). +

+

+--cflags +Writes to the standard output the command line options required to compile +files that use PCRE (this may include some -I options, but is blank on +many systems). +

+

+--cflags-posix +Writes to the standard output the command line options required to compile +files that use PCRE's POSIX API wrapper library (this may include some -I +options, but is blank on many systems). +

+
SEE ALSO
+

+pcre(3) +

+
AUTHOR
+

+This manual page was originally written by Mark Baker for the Debian GNU/Linux +system. It has been subsequently revised as a generic PCRE man page. +

+
REVISION
+

+Last updated: 24 June 2012 +
+

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre.html new file mode 100755 index 000000000..0db75e448 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre.html @@ -0,0 +1,224 @@ + + +pcre specification + + +

pcre man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+

+
PLEASE TAKE NOTE
+

+This document relates to PCRE releases that use the original API, +with library names libpcre, libpcre16, and libpcre32. January 2015 saw the +first release of a new API, known as PCRE2, with release numbers starting at +10.00 and library names libpcre2-8, libpcre2-16, and libpcre2-32. The old +libraries (now called PCRE1) are still being maintained for bug fixes, but +there will be no new development. New projects are advised to use the new PCRE2 +libraries. +

+
INTRODUCTION
+

+The PCRE library is a set of functions that implement regular expression +pattern matching using the same syntax and semantics as Perl, with just a few +differences. Some features that appeared in Python and PCRE before they +appeared in Perl are also available using the Python syntax, there is some +support for one or two .NET and Oniguruma syntax items, and there is an option +for requesting some minor changes that give better JavaScript compatibility. +

+

+Starting with release 8.30, it is possible to compile two separate PCRE +libraries: the original, which supports 8-bit character strings (including +UTF-8 strings), and a second library that supports 16-bit character strings +(including UTF-16 strings). The build process allows either one or both to be +built. The majority of the work to make this possible was done by Zoltan +Herczeg. +

+

+Starting with release 8.32 it is possible to compile a third separate PCRE +library that supports 32-bit character strings (including UTF-32 strings). The +build process allows any combination of the 8-, 16- and 32-bit libraries. The +work to make this possible was done by Christian Persch. +

+

+The three libraries contain identical sets of functions, except that the names +in the 16-bit library start with pcre16_ instead of pcre_, and the +names in the 32-bit library start with pcre32_ instead of pcre_. To +avoid over-complication and reduce the documentation maintenance load, most of +the documentation describes the 8-bit library, with the differences for the +16-bit and 32-bit libraries described separately in the +pcre16 +and +pcre32 +pages. References to functions or structures of the form pcre[16|32]_xxx +should be read as meaning "pcre_xxx when using the 8-bit library, +pcre16_xxx when using the 16-bit library, or pcre32_xxx when using +the 32-bit library". +

+

+The current implementation of PCRE corresponds approximately with Perl 5.12, +including support for UTF-8/16/32 encoded strings and Unicode general category +properties. However, UTF-8/16/32 and Unicode support has to be explicitly +enabled; it is not the default. The Unicode tables correspond to Unicode +release 6.3.0. +

+

+In addition to the Perl-compatible matching function, PCRE contains an +alternative function that matches the same compiled patterns in a different +way. In certain circumstances, the alternative function has some advantages. +For a discussion of the two matching algorithms, see the +pcrematching +page. +

+

+PCRE is written in C and released as a C library. A number of people have +written wrappers and interfaces of various kinds. In particular, Google Inc. +have provided a comprehensive C++ wrapper for the 8-bit library. This is now +included as part of the PCRE distribution. The +pcrecpp +page has details of this interface. Other people's contributions can be found +in the Contrib directory at the primary FTP site, which is: +ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre +

+

+Details of exactly which Perl regular expression features are and are not +supported by PCRE are given in separate documents. See the +pcrepattern +and +pcrecompat +pages. There is a syntax summary in the +pcresyntax +page. +

+

+Some features of PCRE can be included, excluded, or changed when the library is +built. The +pcre_config() +function makes it possible for a client to discover which features are +available. The features themselves are described in the +pcrebuild +page. Documentation about building PCRE for various operating systems can be +found in the +README +and +NON-AUTOTOOLS_BUILD +files in the source distribution. +

+

+The libraries contains a number of undocumented internal functions and data +tables that are used by more than one of the exported external functions, but +which are not intended for use by external callers. Their names all begin with +"_pcre_" or "_pcre16_" or "_pcre32_", which hopefully will not provoke any name +clashes. In some environments, it is possible to control which external symbols +are exported when a shared library is built, and in these cases the +undocumented symbols are not exported. +

+
SECURITY CONSIDERATIONS
+

+If you are using PCRE in a non-UTF application that permits users to supply +arbitrary patterns for compilation, you should be aware of a feature that +allows users to turn on UTF support from within a pattern, provided that PCRE +was built with UTF support. For example, an 8-bit pattern that begins with +"(*UTF8)" or "(*UTF)" turns on UTF-8 mode, which interprets patterns and +subjects as strings of UTF-8 characters instead of individual 8-bit characters. +This causes both the pattern and any data against which it is matched to be +checked for UTF-8 validity. If the data string is very long, such a check might +use sufficiently many resources as to cause your application to lose +performance. +

+

+One way of guarding against this possibility is to use the +pcre_fullinfo() function to check the compiled pattern's options for UTF. +Alternatively, from release 8.33, you can set the PCRE_NEVER_UTF option at +compile time. This causes a compile time error if a pattern contains a +UTF-setting sequence. +

+

+If your application is one that supports UTF, be aware that validity checking +can take time. If the same data string is to be matched many times, you can use +the PCRE_NO_UTF[8|16|32]_CHECK option for the second and subsequent matches to +save redundant checks. +

+

+Another way that performance can be hit is by running a pattern that has a very +large search tree against a string that will never match. Nested unlimited +repeats in a pattern are a common example. PCRE provides some protection +against this: see the PCRE_EXTRA_MATCH_LIMIT feature in the +pcreapi +page. +

+
USER DOCUMENTATION
+

+The user documentation for PCRE comprises a number of different sections. In +the "man" format, each of these is a separate "man page". In the HTML format, +each is a separate page, linked from the index page. In the plain text format, +the descriptions of the pcregrep and pcretest programs are in files +called pcregrep.txt and pcretest.txt, respectively. The remaining +sections, except for the pcredemo section (which is a program listing), +are concatenated in pcre.txt, for ease of searching. The sections are as +follows: +

+  pcre              this document
+  pcre-config       show PCRE installation configuration information
+  pcre16            details of the 16-bit library
+  pcre32            details of the 32-bit library
+  pcreapi           details of PCRE's native C API
+  pcrebuild         building PCRE
+  pcrecallout       details of the callout feature
+  pcrecompat        discussion of Perl compatibility
+  pcrecpp           details of the C++ wrapper for the 8-bit library
+  pcredemo          a demonstration C program that uses PCRE
+  pcregrep          description of the pcregrep command (8-bit only)
+  pcrejit           discussion of the just-in-time optimization support
+  pcrelimits        details of size and other limits
+  pcrematching      discussion of the two matching algorithms
+  pcrepartial       details of the partial matching facility
+  pcrepattern       syntax and semantics of supported regular expressions
+  pcreperform       discussion of performance issues
+  pcreposix         the POSIX-compatible C API for the 8-bit library
+  pcreprecompile    details of saving and re-using precompiled patterns
+  pcresample        discussion of the pcredemo program
+  pcrestack         discussion of stack usage
+  pcresyntax        quick syntax reference
+  pcretest          description of the pcretest testing command
+  pcreunicode       discussion of Unicode and UTF-8/16/32 support
+
+In the "man" and HTML formats, there is also a short page for each C library +function, listing its arguments and results. +

+
AUTHOR
+

+Philip Hazel +
+University Computing Service +
+Cambridge CB2 3QH, England. +
+

+

+Putting an actual email address here seems to have been a spam magnet, so I've +taken it away. If you want to email me, use my two initials, followed by the +two digits 10, at the domain cam.ac.uk. +

+
REVISION
+

+Last updated: 10 February 2015 +
+Copyright © 1997-2015 University of Cambridge. +
+

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre16.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre16.html new file mode 100755 index 000000000..f00859f05 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre16.html @@ -0,0 +1,384 @@ + + +pcre16 specification + + +

pcre16 man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+

+

+#include <pcre.h> +

+
PCRE 16-BIT API BASIC FUNCTIONS
+

+pcre16 *pcre16_compile(PCRE_SPTR16 pattern, int options, + const char **errptr, int *erroffset, + const unsigned char *tableptr); +
+
+pcre16 *pcre16_compile2(PCRE_SPTR16 pattern, int options, + int *errorcodeptr, + const char **errptr, int *erroffset, + const unsigned char *tableptr); +
+
+pcre16_extra *pcre16_study(const pcre16 *code, int options, + const char **errptr); +
+
+void pcre16_free_study(pcre16_extra *extra); +
+
+int pcre16_exec(const pcre16 *code, const pcre16_extra *extra, + PCRE_SPTR16 subject, int length, int startoffset, + int options, int *ovector, int ovecsize); +
+
+int pcre16_dfa_exec(const pcre16 *code, const pcre16_extra *extra, + PCRE_SPTR16 subject, int length, int startoffset, + int options, int *ovector, int ovecsize, + int *workspace, int wscount); +

+
PCRE 16-BIT API STRING EXTRACTION FUNCTIONS
+

+int pcre16_copy_named_substring(const pcre16 *code, + PCRE_SPTR16 subject, int *ovector, + int stringcount, PCRE_SPTR16 stringname, + PCRE_UCHAR16 *buffer, int buffersize); +
+
+int pcre16_copy_substring(PCRE_SPTR16 subject, int *ovector, + int stringcount, int stringnumber, PCRE_UCHAR16 *buffer, + int buffersize); +
+
+int pcre16_get_named_substring(const pcre16 *code, + PCRE_SPTR16 subject, int *ovector, + int stringcount, PCRE_SPTR16 stringname, + PCRE_SPTR16 *stringptr); +
+
+int pcre16_get_stringnumber(const pcre16 *code, +" PCRE_SPTR16 name); +
+
+int pcre16_get_stringtable_entries(const pcre16 *code, + PCRE_SPTR16 name, PCRE_UCHAR16 **first, PCRE_UCHAR16 **last); +
+
+int pcre16_get_substring(PCRE_SPTR16 subject, int *ovector, + int stringcount, int stringnumber, + PCRE_SPTR16 *stringptr); +
+
+int pcre16_get_substring_list(PCRE_SPTR16 subject, + int *ovector, int stringcount, PCRE_SPTR16 **listptr); +
+
+void pcre16_free_substring(PCRE_SPTR16 stringptr); +
+
+void pcre16_free_substring_list(PCRE_SPTR16 *stringptr); +

+
PCRE 16-BIT API AUXILIARY FUNCTIONS
+

+pcre16_jit_stack *pcre16_jit_stack_alloc(int startsize, int maxsize); +
+
+void pcre16_jit_stack_free(pcre16_jit_stack *stack); +
+
+void pcre16_assign_jit_stack(pcre16_extra *extra, + pcre16_jit_callback callback, void *data); +
+
+const unsigned char *pcre16_maketables(void); +
+
+int pcre16_fullinfo(const pcre16 *code, const pcre16_extra *extra, + int what, void *where); +
+
+int pcre16_refcount(pcre16 *code, int adjust); +
+
+int pcre16_config(int what, void *where); +
+
+const char *pcre16_version(void); +
+
+int pcre16_pattern_to_host_byte_order(pcre16 *code, + pcre16_extra *extra, const unsigned char *tables); +

+
PCRE 16-BIT API INDIRECTED FUNCTIONS
+

+void *(*pcre16_malloc)(size_t); +
+
+void (*pcre16_free)(void *); +
+
+void *(*pcre16_stack_malloc)(size_t); +
+
+void (*pcre16_stack_free)(void *); +
+
+int (*pcre16_callout)(pcre16_callout_block *); +

+
PCRE 16-BIT API 16-BIT-ONLY FUNCTION
+

+int pcre16_utf16_to_host_byte_order(PCRE_UCHAR16 *output, + PCRE_SPTR16 input, int length, int *byte_order, + int keep_boms); +

+
THE PCRE 16-BIT LIBRARY
+

+Starting with release 8.30, it is possible to compile a PCRE library that +supports 16-bit character strings, including UTF-16 strings, as well as or +instead of the original 8-bit library. The majority of the work to make this +possible was done by Zoltan Herczeg. The two libraries contain identical sets +of functions, used in exactly the same way. Only the names of the functions and +the data types of their arguments and results are different. To avoid +over-complication and reduce the documentation maintenance load, most of the +PCRE documentation describes the 8-bit library, with only occasional references +to the 16-bit library. This page describes what is different when you use the +16-bit library. +

+

+WARNING: A single application can be linked with both libraries, but you must +take care when processing any particular pattern to use functions from just one +library. For example, if you want to study a pattern that was compiled with +pcre16_compile(), you must do so with pcre16_study(), not +pcre_study(), and you must free the study data with +pcre16_free_study(). +

+
THE HEADER FILE
+

+There is only one header file, pcre.h. It contains prototypes for all the +functions in all libraries, as well as definitions of flags, structures, error +codes, etc. +

+
THE LIBRARY NAME
+

+In Unix-like systems, the 16-bit library is called libpcre16, and can +normally be accesss by adding -lpcre16 to the command for linking an +application that uses PCRE. +

+
STRING TYPES
+

+In the 8-bit library, strings are passed to PCRE library functions as vectors +of bytes with the C type "char *". In the 16-bit library, strings are passed as +vectors of unsigned 16-bit quantities. The macro PCRE_UCHAR16 specifies an +appropriate data type, and PCRE_SPTR16 is defined as "const PCRE_UCHAR16 *". In +very many environments, "short int" is a 16-bit data type. When PCRE is built, +it defines PCRE_UCHAR16 as "unsigned short int", but checks that it really is a +16-bit data type. If it is not, the build fails with an error message telling +the maintainer to modify the definition appropriately. +

+
STRUCTURE TYPES
+

+The types of the opaque structures that are used for compiled 16-bit patterns +and JIT stacks are pcre16 and pcre16_jit_stack respectively. The +type of the user-accessible structure that is returned by pcre16_study() +is pcre16_extra, and the type of the structure that is used for passing +data to a callout function is pcre16_callout_block. These structures +contain the same fields, with the same names, as their 8-bit counterparts. The +only difference is that pointers to character strings are 16-bit instead of +8-bit types. +

+
16-BIT FUNCTIONS
+

+For every function in the 8-bit library there is a corresponding function in +the 16-bit library with a name that starts with pcre16_ instead of +pcre_. The prototypes are listed above. In addition, there is one extra +function, pcre16_utf16_to_host_byte_order(). This is a utility function +that converts a UTF-16 character string to host byte order if necessary. The +other 16-bit functions expect the strings they are passed to be in host byte +order. +

+

+The input and output arguments of +pcre16_utf16_to_host_byte_order() may point to the same address, that is, +conversion in place is supported. The output buffer must be at least as long as +the input. +

+

+The length argument specifies the number of 16-bit data units in the +input string; a negative value specifies a zero-terminated string. +

+

+If byte_order is NULL, it is assumed that the string starts off in host +byte order. This may be changed by byte-order marks (BOMs) anywhere in the +string (commonly as the first character). +

+

+If byte_order is not NULL, a non-zero value of the integer to which it +points means that the input starts off in host byte order, otherwise the +opposite order is assumed. Again, BOMs in the string can change this. The final +byte order is passed back at the end of processing. +

+

+If keep_boms is not zero, byte-order mark characters (0xfeff) are copied +into the output string. Otherwise they are discarded. +

+

+The result of the function is the number of 16-bit units placed into the output +buffer, including the zero terminator if the string was zero-terminated. +

+
SUBJECT STRING OFFSETS
+

+The lengths and starting offsets of subject strings must be specified in 16-bit +data units, and the offsets within subject strings that are returned by the +matching functions are in also 16-bit units rather than bytes. +

+
NAMED SUBPATTERNS
+

+The name-to-number translation table that is maintained for named subpatterns +uses 16-bit characters. The pcre16_get_stringtable_entries() function +returns the length of each entry in the table as the number of 16-bit data +units. +

+
OPTION NAMES
+

+There are two new general option names, PCRE_UTF16 and PCRE_NO_UTF16_CHECK, +which correspond to PCRE_UTF8 and PCRE_NO_UTF8_CHECK in the 8-bit library. In +fact, these new options define the same bits in the options word. There is a +discussion about the +validity of UTF-16 strings +in the +pcreunicode +page. +

+

+For the pcre16_config() function there is an option PCRE_CONFIG_UTF16 +that returns 1 if UTF-16 support is configured, otherwise 0. If this option is +given to pcre_config() or pcre32_config(), or if the +PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF32 option is given to pcre16_config(), +the result is the PCRE_ERROR_BADOPTION error. +

+
CHARACTER CODES
+

+In 16-bit mode, when PCRE_UTF16 is not set, character values are treated in the +same way as in 8-bit, non UTF-8 mode, except, of course, that they can range +from 0 to 0xffff instead of 0 to 0xff. Character types for characters less than +0xff can therefore be influenced by the locale in the same way as before. +Characters greater than 0xff have only one case, and no "type" (such as letter +or digit). +

+

+In UTF-16 mode, the character code is Unicode, in the range 0 to 0x10ffff, with +the exception of values in the range 0xd800 to 0xdfff because those are +"surrogate" values that are used in pairs to encode values greater than 0xffff. +

+

+A UTF-16 string can indicate its endianness by special code knows as a +byte-order mark (BOM). The PCRE functions do not handle this, expecting strings +to be in host byte order. A utility function called +pcre16_utf16_to_host_byte_order() is provided to help with this (see +above). +

+
ERROR NAMES
+

+The errors PCRE_ERROR_BADUTF16_OFFSET and PCRE_ERROR_SHORTUTF16 correspond to +their 8-bit counterparts. The error PCRE_ERROR_BADMODE is given when a compiled +pattern is passed to a function that processes patterns in the other +mode, for example, if a pattern compiled with pcre_compile() is passed to +pcre16_exec(). +

+

+There are new error codes whose names begin with PCRE_UTF16_ERR for invalid +UTF-16 strings, corresponding to the PCRE_UTF8_ERR codes for UTF-8 strings that +are described in the section entitled +"Reason codes for invalid UTF-8 strings" +in the main +pcreapi +page. The UTF-16 errors are: +

+  PCRE_UTF16_ERR1  Missing low surrogate at end of string
+  PCRE_UTF16_ERR2  Invalid low surrogate follows high surrogate
+  PCRE_UTF16_ERR3  Isolated low surrogate
+  PCRE_UTF16_ERR4  Non-character
+
+

+
ERROR TEXTS
+

+If there is an error while compiling a pattern, the error text that is passed +back by pcre16_compile() or pcre16_compile2() is still an 8-bit +character string, zero-terminated. +

+
CALLOUTS
+

+The subject and mark fields in the callout block that is passed to +a callout function point to 16-bit vectors. +

+
TESTING
+

+The pcretest program continues to operate with 8-bit input and output +files, but it can be used for testing the 16-bit library. If it is run with the +command line option -16, patterns and subject strings are converted from +8-bit to 16-bit before being passed to PCRE, and the 16-bit library functions +are used instead of the 8-bit ones. Returned 16-bit strings are converted to +8-bit for output. If both the 8-bit and the 32-bit libraries were not compiled, +pcretest defaults to 16-bit and the -16 option is ignored. +

+

+When PCRE is being built, the RunTest script that is called by "make +check" uses the pcretest -C option to discover which of the 8-bit, +16-bit and 32-bit libraries has been built, and runs the tests appropriately. +

+
NOT SUPPORTED IN 16-BIT MODE
+

+Not all the features of the 8-bit library are available with the 16-bit +library. The C++ and POSIX wrapper functions support only the 8-bit library, +and the pcregrep program is at present 8-bit only. +

+
AUTHOR
+

+Philip Hazel +
+University Computing Service +
+Cambridge CB2 3QH, England. +
+

+
REVISION
+

+Last updated: 12 May 2013 +
+Copyright © 1997-2013 University of Cambridge. +
+

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre32.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre32.html new file mode 100755 index 000000000..f96876e75 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre32.html @@ -0,0 +1,382 @@ + + +pcre32 specification + + +

pcre32 man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+

+

+#include <pcre.h> +

+
PCRE 32-BIT API BASIC FUNCTIONS
+

+pcre32 *pcre32_compile(PCRE_SPTR32 pattern, int options, + const char **errptr, int *erroffset, + const unsigned char *tableptr); +
+
+pcre32 *pcre32_compile2(PCRE_SPTR32 pattern, int options, + int *errorcodeptr, + const unsigned char *tableptr); +
+
+pcre32_extra *pcre32_study(const pcre32 *code, int options, + const char **errptr); +
+
+void pcre32_free_study(pcre32_extra *extra); +
+
+int pcre32_exec(const pcre32 *code, const pcre32_extra *extra, + PCRE_SPTR32 subject, int length, int startoffset, + int options, int *ovector, int ovecsize); +
+
+int pcre32_dfa_exec(const pcre32 *code, const pcre32_extra *extra, + PCRE_SPTR32 subject, int length, int startoffset, + int options, int *ovector, int ovecsize, + int *workspace, int wscount); +

+
PCRE 32-BIT API STRING EXTRACTION FUNCTIONS
+

+int pcre32_copy_named_substring(const pcre32 *code, + PCRE_SPTR32 subject, int *ovector, + int stringcount, PCRE_SPTR32 stringname, + PCRE_UCHAR32 *buffer, int buffersize); +
+
+int pcre32_copy_substring(PCRE_SPTR32 subject, int *ovector, + int stringcount, int stringnumber, PCRE_UCHAR32 *buffer, + int buffersize); +
+
+int pcre32_get_named_substring(const pcre32 *code, + PCRE_SPTR32 subject, int *ovector, + int stringcount, PCRE_SPTR32 stringname, + PCRE_SPTR32 *stringptr); +
+
+int pcre32_get_stringnumber(const pcre32 *code, + PCRE_SPTR32 name); +
+
+int pcre32_get_stringtable_entries(const pcre32 *code, + PCRE_SPTR32 name, PCRE_UCHAR32 **first, PCRE_UCHAR32 **last); +
+
+int pcre32_get_substring(PCRE_SPTR32 subject, int *ovector, + int stringcount, int stringnumber, + PCRE_SPTR32 *stringptr); +
+
+int pcre32_get_substring_list(PCRE_SPTR32 subject, + int *ovector, int stringcount, PCRE_SPTR32 **listptr); +
+
+void pcre32_free_substring(PCRE_SPTR32 stringptr); +
+
+void pcre32_free_substring_list(PCRE_SPTR32 *stringptr); +

+
PCRE 32-BIT API AUXILIARY FUNCTIONS
+

+pcre32_jit_stack *pcre32_jit_stack_alloc(int startsize, int maxsize); +
+
+void pcre32_jit_stack_free(pcre32_jit_stack *stack); +
+
+void pcre32_assign_jit_stack(pcre32_extra *extra, + pcre32_jit_callback callback, void *data); +
+
+const unsigned char *pcre32_maketables(void); +
+
+int pcre32_fullinfo(const pcre32 *code, const pcre32_extra *extra, + int what, void *where); +
+
+int pcre32_refcount(pcre32 *code, int adjust); +
+
+int pcre32_config(int what, void *where); +
+
+const char *pcre32_version(void); +
+
+int pcre32_pattern_to_host_byte_order(pcre32 *code, + pcre32_extra *extra, const unsigned char *tables); +

+
PCRE 32-BIT API INDIRECTED FUNCTIONS
+

+void *(*pcre32_malloc)(size_t); +
+
+void (*pcre32_free)(void *); +
+
+void *(*pcre32_stack_malloc)(size_t); +
+
+void (*pcre32_stack_free)(void *); +
+
+int (*pcre32_callout)(pcre32_callout_block *); +

+
PCRE 32-BIT API 32-BIT-ONLY FUNCTION
+

+int pcre32_utf32_to_host_byte_order(PCRE_UCHAR32 *output, + PCRE_SPTR32 input, int length, int *byte_order, + int keep_boms); +

+
THE PCRE 32-BIT LIBRARY
+

+Starting with release 8.32, it is possible to compile a PCRE library that +supports 32-bit character strings, including UTF-32 strings, as well as or +instead of the original 8-bit library. This work was done by Christian Persch, +based on the work done by Zoltan Herczeg for the 16-bit library. All three +libraries contain identical sets of functions, used in exactly the same way. +Only the names of the functions and the data types of their arguments and +results are different. To avoid over-complication and reduce the documentation +maintenance load, most of the PCRE documentation describes the 8-bit library, +with only occasional references to the 16-bit and 32-bit libraries. This page +describes what is different when you use the 32-bit library. +

+

+WARNING: A single application can be linked with all or any of the three +libraries, but you must take care when processing any particular pattern +to use functions from just one library. For example, if you want to study +a pattern that was compiled with pcre32_compile(), you must do so +with pcre32_study(), not pcre_study(), and you must free the +study data with pcre32_free_study(). +

+
THE HEADER FILE
+

+There is only one header file, pcre.h. It contains prototypes for all the +functions in all libraries, as well as definitions of flags, structures, error +codes, etc. +

+
THE LIBRARY NAME
+

+In Unix-like systems, the 32-bit library is called libpcre32, and can +normally be accesss by adding -lpcre32 to the command for linking an +application that uses PCRE. +

+
STRING TYPES
+

+In the 8-bit library, strings are passed to PCRE library functions as vectors +of bytes with the C type "char *". In the 32-bit library, strings are passed as +vectors of unsigned 32-bit quantities. The macro PCRE_UCHAR32 specifies an +appropriate data type, and PCRE_SPTR32 is defined as "const PCRE_UCHAR32 *". In +very many environments, "unsigned int" is a 32-bit data type. When PCRE is +built, it defines PCRE_UCHAR32 as "unsigned int", but checks that it really is +a 32-bit data type. If it is not, the build fails with an error message telling +the maintainer to modify the definition appropriately. +

+
STRUCTURE TYPES
+

+The types of the opaque structures that are used for compiled 32-bit patterns +and JIT stacks are pcre32 and pcre32_jit_stack respectively. The +type of the user-accessible structure that is returned by pcre32_study() +is pcre32_extra, and the type of the structure that is used for passing +data to a callout function is pcre32_callout_block. These structures +contain the same fields, with the same names, as their 8-bit counterparts. The +only difference is that pointers to character strings are 32-bit instead of +8-bit types. +

+
32-BIT FUNCTIONS
+

+For every function in the 8-bit library there is a corresponding function in +the 32-bit library with a name that starts with pcre32_ instead of +pcre_. The prototypes are listed above. In addition, there is one extra +function, pcre32_utf32_to_host_byte_order(). This is a utility function +that converts a UTF-32 character string to host byte order if necessary. The +other 32-bit functions expect the strings they are passed to be in host byte +order. +

+

+The input and output arguments of +pcre32_utf32_to_host_byte_order() may point to the same address, that is, +conversion in place is supported. The output buffer must be at least as long as +the input. +

+

+The length argument specifies the number of 32-bit data units in the +input string; a negative value specifies a zero-terminated string. +

+

+If byte_order is NULL, it is assumed that the string starts off in host +byte order. This may be changed by byte-order marks (BOMs) anywhere in the +string (commonly as the first character). +

+

+If byte_order is not NULL, a non-zero value of the integer to which it +points means that the input starts off in host byte order, otherwise the +opposite order is assumed. Again, BOMs in the string can change this. The final +byte order is passed back at the end of processing. +

+

+If keep_boms is not zero, byte-order mark characters (0xfeff) are copied +into the output string. Otherwise they are discarded. +

+

+The result of the function is the number of 32-bit units placed into the output +buffer, including the zero terminator if the string was zero-terminated. +

+
SUBJECT STRING OFFSETS
+

+The lengths and starting offsets of subject strings must be specified in 32-bit +data units, and the offsets within subject strings that are returned by the +matching functions are in also 32-bit units rather than bytes. +

+
NAMED SUBPATTERNS
+

+The name-to-number translation table that is maintained for named subpatterns +uses 32-bit characters. The pcre32_get_stringtable_entries() function +returns the length of each entry in the table as the number of 32-bit data +units. +

+
OPTION NAMES
+

+There are two new general option names, PCRE_UTF32 and PCRE_NO_UTF32_CHECK, +which correspond to PCRE_UTF8 and PCRE_NO_UTF8_CHECK in the 8-bit library. In +fact, these new options define the same bits in the options word. There is a +discussion about the +validity of UTF-32 strings +in the +pcreunicode +page. +

+

+For the pcre32_config() function there is an option PCRE_CONFIG_UTF32 +that returns 1 if UTF-32 support is configured, otherwise 0. If this option is +given to pcre_config() or pcre16_config(), or if the +PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF16 option is given to pcre32_config(), +the result is the PCRE_ERROR_BADOPTION error. +

+
CHARACTER CODES
+

+In 32-bit mode, when PCRE_UTF32 is not set, character values are treated in the +same way as in 8-bit, non UTF-8 mode, except, of course, that they can range +from 0 to 0x7fffffff instead of 0 to 0xff. Character types for characters less +than 0xff can therefore be influenced by the locale in the same way as before. +Characters greater than 0xff have only one case, and no "type" (such as letter +or digit). +

+

+In UTF-32 mode, the character code is Unicode, in the range 0 to 0x10ffff, with +the exception of values in the range 0xd800 to 0xdfff because those are +"surrogate" values that are ill-formed in UTF-32. +

+

+A UTF-32 string can indicate its endianness by special code knows as a +byte-order mark (BOM). The PCRE functions do not handle this, expecting strings +to be in host byte order. A utility function called +pcre32_utf32_to_host_byte_order() is provided to help with this (see +above). +

+
ERROR NAMES
+

+The error PCRE_ERROR_BADUTF32 corresponds to its 8-bit counterpart. +The error PCRE_ERROR_BADMODE is given when a compiled +pattern is passed to a function that processes patterns in the other +mode, for example, if a pattern compiled with pcre_compile() is passed to +pcre32_exec(). +

+

+There are new error codes whose names begin with PCRE_UTF32_ERR for invalid +UTF-32 strings, corresponding to the PCRE_UTF8_ERR codes for UTF-8 strings that +are described in the section entitled +"Reason codes for invalid UTF-8 strings" +in the main +pcreapi +page. The UTF-32 errors are: +

+  PCRE_UTF32_ERR1  Surrogate character (range from 0xd800 to 0xdfff)
+  PCRE_UTF32_ERR2  Non-character
+  PCRE_UTF32_ERR3  Character > 0x10ffff
+
+

+
ERROR TEXTS
+

+If there is an error while compiling a pattern, the error text that is passed +back by pcre32_compile() or pcre32_compile2() is still an 8-bit +character string, zero-terminated. +

+
CALLOUTS
+

+The subject and mark fields in the callout block that is passed to +a callout function point to 32-bit vectors. +

+
TESTING
+

+The pcretest program continues to operate with 8-bit input and output +files, but it can be used for testing the 32-bit library. If it is run with the +command line option -32, patterns and subject strings are converted from +8-bit to 32-bit before being passed to PCRE, and the 32-bit library functions +are used instead of the 8-bit ones. Returned 32-bit strings are converted to +8-bit for output. If both the 8-bit and the 16-bit libraries were not compiled, +pcretest defaults to 32-bit and the -32 option is ignored. +

+

+When PCRE is being built, the RunTest script that is called by "make +check" uses the pcretest -C option to discover which of the 8-bit, +16-bit and 32-bit libraries has been built, and runs the tests appropriately. +

+
NOT SUPPORTED IN 32-BIT MODE
+

+Not all the features of the 8-bit library are available with the 32-bit +library. The C++ and POSIX wrapper functions support only the 8-bit library, +and the pcregrep program is at present 8-bit only. +

+
AUTHOR
+

+Philip Hazel +
+University Computing Service +
+Cambridge CB2 3QH, England. +
+

+
REVISION
+

+Last updated: 12 May 2013 +
+Copyright © 1997-2013 University of Cambridge. +
+

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_assign_jit_stack.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_assign_jit_stack.html new file mode 100755 index 000000000..b2eef704d --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_assign_jit_stack.html @@ -0,0 +1,76 @@ + + +pcre_assign_jit_stack specification + + +

pcre_assign_jit_stack man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+
+SYNOPSIS +
+

+#include <pcre.h> +

+

+void pcre_assign_jit_stack(pcre_extra *extra, + pcre_jit_callback callback, void *data); +
+
+void pcre16_assign_jit_stack(pcre16_extra *extra, + pcre16_jit_callback callback, void *data); +
+
+void pcre32_assign_jit_stack(pcre32_extra *extra, + pcre32_jit_callback callback, void *data); +

+
+DESCRIPTION +
+

+This function provides control over the memory used as a stack at run-time by a +call to pcre[16|32]_exec() with a pattern that has been successfully +compiled with JIT optimization. The arguments are: +

+  extra     the data pointer returned by pcre[16|32]_study()
+  callback  a callback function
+  data      a JIT stack or a value to be passed to the callback
+              function
+
+

+

+If callback is NULL and data is NULL, an internal 32K block on +the machine stack is used. +

+

+If callback is NULL and data is not NULL, data must +be a valid JIT stack, the result of calling pcre[16|32]_jit_stack_alloc(). +

+

+If callback not NULL, it is called with data as an argument at +the start of matching, in order to set up a JIT stack. If the result is NULL, +the internal 32K stack is used; otherwise the return value must be a valid JIT +stack, the result of calling pcre[16|32]_jit_stack_alloc(). +

+

+You may safely assign the same JIT stack to multiple patterns, as long as they +are all matched in the same thread. In a multithread application, each thread +must use its own JIT stack. For more details, see the +pcrejit +page. +

+

+There is a complete description of the PCRE native API in the +pcreapi +page and a description of the POSIX API in the +pcreposix +page. +

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_compile.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_compile.html new file mode 100755 index 000000000..95b4bec63 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_compile.html @@ -0,0 +1,111 @@ + + +pcre_compile specification + + +

pcre_compile man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+
+SYNOPSIS +
+

+#include <pcre.h> +

+

+pcre *pcre_compile(const char *pattern, int options, + const char **errptr, int *erroffset, + const unsigned char *tableptr); +
+
+pcre16 *pcre16_compile(PCRE_SPTR16 pattern, int options, + const char **errptr, int *erroffset, + const unsigned char *tableptr); +
+
+pcre32 *pcre32_compile(PCRE_SPTR32 pattern, int options, + const char **errptr, int *erroffset, + const unsigned char *tableptr); +

+
+DESCRIPTION +
+

+This function compiles a regular expression into an internal form. It is the +same as pcre[16|32]_compile2(), except for the absence of the +errorcodeptr argument. Its arguments are: +

+  pattern       A zero-terminated string containing the
+                  regular expression to be compiled
+  options       Zero or more option bits
+  errptr        Where to put an error message
+  erroffset     Offset in pattern where error was found
+  tableptr      Pointer to character tables, or NULL to
+                  use the built-in default
+
+The option bits are: +
+  PCRE_ANCHORED           Force pattern anchoring
+  PCRE_AUTO_CALLOUT       Compile automatic callouts
+  PCRE_BSR_ANYCRLF        \R matches only CR, LF, or CRLF
+  PCRE_BSR_UNICODE        \R matches all Unicode line endings
+  PCRE_CASELESS           Do caseless matching
+  PCRE_DOLLAR_ENDONLY     $ not to match newline at end
+  PCRE_DOTALL             . matches anything including NL
+  PCRE_DUPNAMES           Allow duplicate names for subpatterns
+  PCRE_EXTENDED           Ignore white space and # comments
+  PCRE_EXTRA              PCRE extra features
+                            (not much use currently)
+  PCRE_FIRSTLINE          Force matching to be before newline
+  PCRE_JAVASCRIPT_COMPAT  JavaScript compatibility
+  PCRE_MULTILINE          ^ and $ match newlines within data
+  PCRE_NEVER_UTF          Lock out UTF, e.g. via (*UTF)
+  PCRE_NEWLINE_ANY        Recognize any Unicode newline sequence
+  PCRE_NEWLINE_ANYCRLF    Recognize CR, LF, and CRLF as newline
+                            sequences
+  PCRE_NEWLINE_CR         Set CR as the newline sequence
+  PCRE_NEWLINE_CRLF       Set CRLF as the newline sequence
+  PCRE_NEWLINE_LF         Set LF as the newline sequence
+  PCRE_NO_AUTO_CAPTURE    Disable numbered capturing paren-
+                            theses (named ones available)
+  PCRE_NO_AUTO_POSSESS    Disable auto-possessification
+  PCRE_NO_START_OPTIMIZE  Disable match-time start optimizations
+  PCRE_NO_UTF16_CHECK     Do not check the pattern for UTF-16
+                            validity (only relevant if
+                            PCRE_UTF16 is set)
+  PCRE_NO_UTF32_CHECK     Do not check the pattern for UTF-32
+                            validity (only relevant if
+                            PCRE_UTF32 is set)
+  PCRE_NO_UTF8_CHECK      Do not check the pattern for UTF-8
+                            validity (only relevant if
+                            PCRE_UTF8 is set)
+  PCRE_UCP                Use Unicode properties for \d, \w, etc.
+  PCRE_UNGREEDY           Invert greediness of quantifiers
+  PCRE_UTF16              Run in pcre16_compile() UTF-16 mode
+  PCRE_UTF32              Run in pcre32_compile() UTF-32 mode
+  PCRE_UTF8               Run in pcre_compile() UTF-8 mode
+
+PCRE must be built with UTF support in order to use PCRE_UTF8/16/32 and +PCRE_NO_UTF8/16/32_CHECK, and with UCP support if PCRE_UCP is used. +

+

+The yield of the function is a pointer to a private data structure that +contains the compiled pattern, or NULL if an error was detected. Note that +compiling regular expressions with one version of PCRE for use with a different +version is not guaranteed to work and may cause crashes. +

+

+There is a complete description of the PCRE native API in the +pcreapi +page and a description of the POSIX API in the +pcreposix +page. +

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_compile2.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_compile2.html new file mode 100755 index 000000000..9cd56a237 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_compile2.html @@ -0,0 +1,115 @@ + + +pcre_compile2 specification + + +

pcre_compile2 man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+
+SYNOPSIS +
+

+#include <pcre.h> +

+

+pcre *pcre_compile2(const char *pattern, int options, + int *errorcodeptr, + const char **errptr, int *erroffset, + const unsigned char *tableptr); +
+
+pcre16 *pcre16_compile2(PCRE_SPTR16 pattern, int options, + int *errorcodeptr, + const char **errptr, int *erroffset, + const unsigned char *tableptr); +
+
+pcre32 *pcre32_compile2(PCRE_SPTR32 pattern, int options, +" int *errorcodeptr,£ + const char **errptr, int *erroffset, + const unsigned char *tableptr); +

+
+DESCRIPTION +
+

+This function compiles a regular expression into an internal form. It is the +same as pcre[16|32]_compile(), except for the addition of the +errorcodeptr argument. The arguments are: +

+  pattern       A zero-terminated string containing the
+                  regular expression to be compiled
+  options       Zero or more option bits
+  errorcodeptr  Where to put an error code
+  errptr        Where to put an error message
+  erroffset     Offset in pattern where error was found
+  tableptr      Pointer to character tables, or NULL to
+                  use the built-in default
+
+The option bits are: +
+  PCRE_ANCHORED           Force pattern anchoring
+  PCRE_AUTO_CALLOUT       Compile automatic callouts
+  PCRE_BSR_ANYCRLF        \R matches only CR, LF, or CRLF
+  PCRE_BSR_UNICODE        \R matches all Unicode line endings
+  PCRE_CASELESS           Do caseless matching
+  PCRE_DOLLAR_ENDONLY     $ not to match newline at end
+  PCRE_DOTALL             . matches anything including NL
+  PCRE_DUPNAMES           Allow duplicate names for subpatterns
+  PCRE_EXTENDED           Ignore white space and # comments
+  PCRE_EXTRA              PCRE extra features
+                            (not much use currently)
+  PCRE_FIRSTLINE          Force matching to be before newline
+  PCRE_JAVASCRIPT_COMPAT  JavaScript compatibility
+  PCRE_MULTILINE          ^ and $ match newlines within data
+  PCRE_NEVER_UTF          Lock out UTF, e.g. via (*UTF)
+  PCRE_NEWLINE_ANY        Recognize any Unicode newline sequence
+  PCRE_NEWLINE_ANYCRLF    Recognize CR, LF, and CRLF as newline
+                            sequences
+  PCRE_NEWLINE_CR         Set CR as the newline sequence
+  PCRE_NEWLINE_CRLF       Set CRLF as the newline sequence
+  PCRE_NEWLINE_LF         Set LF as the newline sequence
+  PCRE_NO_AUTO_CAPTURE    Disable numbered capturing paren-
+                            theses (named ones available)
+  PCRE_NO_AUTO_POSSESS    Disable auto-possessification
+  PCRE_NO_START_OPTIMIZE  Disable match-time start optimizations
+  PCRE_NO_UTF16_CHECK     Do not check the pattern for UTF-16
+                            validity (only relevant if
+                            PCRE_UTF16 is set)
+  PCRE_NO_UTF32_CHECK     Do not check the pattern for UTF-32
+                            validity (only relevant if
+                            PCRE_UTF32 is set)
+  PCRE_NO_UTF8_CHECK      Do not check the pattern for UTF-8
+                            validity (only relevant if
+                            PCRE_UTF8 is set)
+  PCRE_UCP                Use Unicode properties for \d, \w, etc.
+  PCRE_UNGREEDY           Invert greediness of quantifiers
+  PCRE_UTF16              Run pcre16_compile() in UTF-16 mode
+  PCRE_UTF32              Run pcre32_compile() in UTF-32 mode
+  PCRE_UTF8               Run pcre_compile() in UTF-8 mode
+
+PCRE must be built with UTF support in order to use PCRE_UTF8/16/32 and +PCRE_NO_UTF8/16/32_CHECK, and with UCP support if PCRE_UCP is used. +

+

+The yield of the function is a pointer to a private data structure that +contains the compiled pattern, or NULL if an error was detected. Note that +compiling regular expressions with one version of PCRE for use with a different +version is not guaranteed to work and may cause crashes. +

+

+There is a complete description of the PCRE native API in the +pcreapi +page and a description of the POSIX API in the +pcreposix +page. +

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_config.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_config.html new file mode 100755 index 000000000..72fb9caa1 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_config.html @@ -0,0 +1,94 @@ + + +pcre_config specification + + +

pcre_config man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+
+SYNOPSIS +
+

+#include <pcre.h> +

+

+int pcre_config(int what, void *where); +

+

+int pcre16_config(int what, void *where); +

+

+int pcre32_config(int what, void *where); +

+
+DESCRIPTION +
+

+This function makes it possible for a client program to find out which optional +features are available in the version of the PCRE library it is using. The +arguments are as follows: +

+  what     A code specifying what information is required
+  where    Points to where to put the data
+
+The where argument must point to an integer variable, except for +PCRE_CONFIG_MATCH_LIMIT, PCRE_CONFIG_MATCH_LIMIT_RECURSION, and +PCRE_CONFIG_PARENS_LIMIT, when it must point to an unsigned long integer, +and for PCRE_CONFIG_JITTARGET, when it must point to a const char*. +The available codes are: +
+  PCRE_CONFIG_JIT           Availability of just-in-time compiler
+                              support (1=yes 0=no)
+  PCRE_CONFIG_JITTARGET     String containing information about the
+                              target architecture for the JIT compiler,
+                              or NULL if there is no JIT support
+  PCRE_CONFIG_LINK_SIZE     Internal link size: 2, 3, or 4
+  PCRE_CONFIG_PARENS_LIMIT  Parentheses nesting limit
+  PCRE_CONFIG_MATCH_LIMIT   Internal resource limit
+  PCRE_CONFIG_MATCH_LIMIT_RECURSION
+                            Internal recursion depth limit
+  PCRE_CONFIG_NEWLINE       Value of the default newline sequence:
+                                13 (0x000d)    for CR
+                                10 (0x000a)    for LF
+                              3338 (0x0d0a)    for CRLF
+                                -2             for ANYCRLF
+                                -1             for ANY
+  PCRE_CONFIG_BSR           Indicates what \R matches by default:
+                                 0             all Unicode line endings
+                                 1             CR, LF, or CRLF only
+  PCRE_CONFIG_POSIX_MALLOC_THRESHOLD
+                            Threshold of return slots, above which
+                              malloc() is used by the POSIX API
+  PCRE_CONFIG_STACKRECURSE  Recursion implementation (1=stack 0=heap)
+  PCRE_CONFIG_UTF16         Availability of UTF-16 support (1=yes
+                               0=no); option for pcre16_config()
+  PCRE_CONFIG_UTF32         Availability of UTF-32 support (1=yes
+                               0=no); option for pcre32_config()
+  PCRE_CONFIG_UTF8          Availability of UTF-8 support (1=yes 0=no);
+                              option for pcre_config()
+  PCRE_CONFIG_UNICODE_PROPERTIES
+                            Availability of Unicode property support
+                              (1=yes 0=no)
+
+The function yields 0 on success or PCRE_ERROR_BADOPTION otherwise. That error +is also given if PCRE_CONFIG_UTF16 or PCRE_CONFIG_UTF32 is passed to +pcre_config(), if PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF32 is passed to +pcre16_config(), or if PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF16 is passed to +pcre32_config(). +

+

+There is a complete description of the PCRE native API in the +pcreapi +page and a description of the POSIX API in the +pcreposix +page. +

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_copy_named_substring.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_copy_named_substring.html new file mode 100755 index 000000000..77b48043c --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_copy_named_substring.html @@ -0,0 +1,65 @@ + + +pcre_copy_named_substring specification + + +

pcre_copy_named_substring man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+
+SYNOPSIS +
+

+#include <pcre.h> +

+

+int pcre_copy_named_substring(const pcre *code, + const char *subject, int *ovector, + int stringcount, const char *stringname, + char *buffer, int buffersize); +
+
+int pcre16_copy_named_substring(const pcre16 *code, + PCRE_SPTR16 subject, int *ovector, + int stringcount, PCRE_SPTR16 stringname, + PCRE_UCHAR16 *buffer, int buffersize); +
+
+int pcre32_copy_named_substring(const pcre32 *code, + PCRE_SPTR32 subject, int *ovector, + int stringcount, PCRE_SPTR32 stringname, + PCRE_UCHAR32 *buffer, int buffersize); +

+
+DESCRIPTION +
+

+This is a convenience function for extracting a captured substring, identified +by name, into a given buffer. The arguments are: +

+  code          Pattern that was successfully matched
+  subject       Subject that has been successfully matched
+  ovector       Offset vector that pcre[16|32]_exec() used
+  stringcount   Value returned by pcre[16|32]_exec()
+  stringname    Name of the required substring
+  buffer        Buffer to receive the string
+  buffersize    Size of buffer
+
+The yield is the length of the substring, PCRE_ERROR_NOMEMORY if the buffer was +too small, or PCRE_ERROR_NOSUBSTRING if the string name is invalid. +

+

+There is a complete description of the PCRE native API in the +pcreapi +page and a description of the POSIX API in the +pcreposix +page. +

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_copy_substring.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_copy_substring.html new file mode 100755 index 000000000..ecaebe853 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_copy_substring.html @@ -0,0 +1,61 @@ + + +pcre_copy_substring specification + + +

pcre_copy_substring man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+
+SYNOPSIS +
+

+#include <pcre.h> +

+

+int pcre_copy_substring(const char *subject, int *ovector, + int stringcount, int stringnumber, char *buffer, + int buffersize); +
+
+int pcre16_copy_substring(PCRE_SPTR16 subject, int *ovector, + int stringcount, int stringnumber, PCRE_UCHAR16 *buffer, + int buffersize); +
+
+int pcre32_copy_substring(PCRE_SPTR32 subject, int *ovector, + int stringcount, int stringnumber, PCRE_UCHAR32 *buffer, + int buffersize); +

+
+DESCRIPTION +
+

+This is a convenience function for extracting a captured substring into a given +buffer. The arguments are: +

+  subject       Subject that has been successfully matched
+  ovector       Offset vector that pcre[16|32]_exec() used
+  stringcount   Value returned by pcre[16|32]_exec()
+  stringnumber  Number of the required substring
+  buffer        Buffer to receive the string
+  buffersize    Size of buffer
+
+The yield is the length of the string, PCRE_ERROR_NOMEMORY if the buffer was +too small, or PCRE_ERROR_NOSUBSTRING if the string number is invalid. +

+

+There is a complete description of the PCRE native API in the +pcreapi +page and a description of the POSIX API in the +pcreposix +page. +

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_dfa_exec.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_dfa_exec.html new file mode 100755 index 000000000..5fff6a7e0 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_dfa_exec.html @@ -0,0 +1,129 @@ + + +pcre_dfa_exec specification + + +

pcre_dfa_exec man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+
+SYNOPSIS +
+

+#include <pcre.h> +

+

+int pcre_dfa_exec(const pcre *code, const pcre_extra *extra, + const char *subject, int length, int startoffset, + int options, int *ovector, int ovecsize, + int *workspace, int wscount); +
+
+int pcre16_dfa_exec(const pcre16 *code, const pcre16_extra *extra, + PCRE_SPTR16 subject, int length, int startoffset, + int options, int *ovector, int ovecsize, + int *workspace, int wscount); +
+
+int pcre32_dfa_exec(const pcre32 *code, const pcre32_extra *extra, + PCRE_SPTR32 subject, int length, int startoffset, + int options, int *ovector, int ovecsize, + int *workspace, int wscount); +

+
+DESCRIPTION +
+

+This function matches a compiled regular expression against a given subject +string, using an alternative matching algorithm that scans the subject string +just once (not Perl-compatible). Note that the main, Perl-compatible, +matching function is pcre[16|32]_exec(). The arguments for this function +are: +

+  code         Points to the compiled pattern
+  extra        Points to an associated pcre[16|32]_extra structure,
+                 or is NULL
+  subject      Points to the subject string
+  length       Length of the subject string
+  startoffset  Offset in the subject at which to start matching
+  options      Option bits
+  ovector      Points to a vector of ints for result offsets
+  ovecsize     Number of elements in the vector
+  workspace    Points to a vector of ints used as working space
+  wscount      Number of elements in the vector
+
+The units for length and startoffset are bytes for +pcre_exec(), 16-bit data items for pcre16_exec(), and 32-bit items +for pcre32_exec(). The options are: +
+  PCRE_ANCHORED          Match only at the first position
+  PCRE_BSR_ANYCRLF       \R matches only CR, LF, or CRLF
+  PCRE_BSR_UNICODE       \R matches all Unicode line endings
+  PCRE_NEWLINE_ANY       Recognize any Unicode newline sequence
+  PCRE_NEWLINE_ANYCRLF   Recognize CR, LF, & CRLF as newline sequences
+  PCRE_NEWLINE_CR        Recognize CR as the only newline sequence
+  PCRE_NEWLINE_CRLF      Recognize CRLF as the only newline sequence
+  PCRE_NEWLINE_LF        Recognize LF as the only newline sequence
+  PCRE_NOTBOL            Subject is not the beginning of a line
+  PCRE_NOTEOL            Subject is not the end of a line
+  PCRE_NOTEMPTY          An empty string is not a valid match
+  PCRE_NOTEMPTY_ATSTART  An empty string at the start of the subject
+                           is not a valid match
+  PCRE_NO_START_OPTIMIZE Do not do "start-match" optimizations
+  PCRE_NO_UTF16_CHECK    Do not check the subject for UTF-16
+                           validity (only relevant if PCRE_UTF16
+                           was set at compile time)
+  PCRE_NO_UTF32_CHECK    Do not check the subject for UTF-32
+                           validity (only relevant if PCRE_UTF32
+                           was set at compile time)
+  PCRE_NO_UTF8_CHECK     Do not check the subject for UTF-8
+                           validity (only relevant if PCRE_UTF8
+                           was set at compile time)
+  PCRE_PARTIAL           ) Return PCRE_ERROR_PARTIAL for a partial
+  PCRE_PARTIAL_SOFT      )   match if no full matches are found
+  PCRE_PARTIAL_HARD      Return PCRE_ERROR_PARTIAL for a partial match
+                           even if there is a full match as well
+  PCRE_DFA_SHORTEST      Return only the shortest match
+  PCRE_DFA_RESTART       Restart after a partial match
+
+There are restrictions on what may appear in a pattern when using this matching +function. Details are given in the +pcrematching +documentation. For details of partial matching, see the +pcrepartial +page. +

+

+A pcre[16|32]_extra structure contains the following fields: +

+  flags            Bits indicating which fields are set
+  study_data       Opaque data from pcre[16|32]_study()
+  match_limit      Limit on internal resource use
+  match_limit_recursion  Limit on internal recursion depth
+  callout_data     Opaque data passed back to callouts
+  tables           Points to character tables or is NULL
+  mark             For passing back a *MARK pointer
+  executable_jit   Opaque data from JIT compilation
+
+The flag bits are PCRE_EXTRA_STUDY_DATA, PCRE_EXTRA_MATCH_LIMIT, +PCRE_EXTRA_MATCH_LIMIT_RECURSION, PCRE_EXTRA_CALLOUT_DATA, +PCRE_EXTRA_TABLES, PCRE_EXTRA_MARK and PCRE_EXTRA_EXECUTABLE_JIT. For this +matching function, the match_limit and match_limit_recursion fields +are not used, and must not be set. The PCRE_EXTRA_EXECUTABLE_JIT flag and +the corresponding variable are ignored. +

+

+There is a complete description of the PCRE native API in the +pcreapi +page and a description of the POSIX API in the +pcreposix +page. +

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_exec.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_exec.html new file mode 100755 index 000000000..18e1a13ff --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_exec.html @@ -0,0 +1,111 @@ + + +pcre_exec specification + + +

pcre_exec man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+
+SYNOPSIS +
+

+#include <pcre.h> +

+

+int pcre_exec(const pcre *code, const pcre_extra *extra, + const char *subject, int length, int startoffset, + int options, int *ovector, int ovecsize); +
+
+int pcre16_exec(const pcre16 *code, const pcre16_extra *extra, + PCRE_SPTR16 subject, int length, int startoffset, + int options, int *ovector, int ovecsize); +
+
+int pcre32_exec(const pcre32 *code, const pcre32_extra *extra, + PCRE_SPTR32 subject, int length, int startoffset, + int options, int *ovector, int ovecsize); +

+
+DESCRIPTION +
+

+This function matches a compiled regular expression against a given subject +string, using a matching algorithm that is similar to Perl's. It returns +offsets to captured substrings. Its arguments are: +

+  code         Points to the compiled pattern
+  extra        Points to an associated pcre[16|32]_extra structure,
+                 or is NULL
+  subject      Points to the subject string
+  length       Length of the subject string
+  startoffset  Offset in the subject at which to start matching
+  options      Option bits
+  ovector      Points to a vector of ints for result offsets
+  ovecsize     Number of elements in the vector (a multiple of 3)
+
+The units for length and startoffset are bytes for +pcre_exec(), 16-bit data items for pcre16_exec(), and 32-bit items +for pcre32_exec(). The options are: +
+  PCRE_ANCHORED          Match only at the first position
+  PCRE_BSR_ANYCRLF       \R matches only CR, LF, or CRLF
+  PCRE_BSR_UNICODE       \R matches all Unicode line endings
+  PCRE_NEWLINE_ANY       Recognize any Unicode newline sequence
+  PCRE_NEWLINE_ANYCRLF   Recognize CR, LF, & CRLF as newline sequences
+  PCRE_NEWLINE_CR        Recognize CR as the only newline sequence
+  PCRE_NEWLINE_CRLF      Recognize CRLF as the only newline sequence
+  PCRE_NEWLINE_LF        Recognize LF as the only newline sequence
+  PCRE_NOTBOL            Subject string is not the beginning of a line
+  PCRE_NOTEOL            Subject string is not the end of a line
+  PCRE_NOTEMPTY          An empty string is not a valid match
+  PCRE_NOTEMPTY_ATSTART  An empty string at the start of the subject
+                           is not a valid match
+  PCRE_NO_START_OPTIMIZE Do not do "start-match" optimizations
+  PCRE_NO_UTF16_CHECK    Do not check the subject for UTF-16
+                           validity (only relevant if PCRE_UTF16
+                           was set at compile time)
+  PCRE_NO_UTF32_CHECK    Do not check the subject for UTF-32
+                           validity (only relevant if PCRE_UTF32
+                           was set at compile time)
+  PCRE_NO_UTF8_CHECK     Do not check the subject for UTF-8
+                           validity (only relevant if PCRE_UTF8
+                           was set at compile time)
+  PCRE_PARTIAL           ) Return PCRE_ERROR_PARTIAL for a partial
+  PCRE_PARTIAL_SOFT      )   match if no full matches are found
+  PCRE_PARTIAL_HARD      Return PCRE_ERROR_PARTIAL for a partial match
+                           if that is found before a full match
+
+For details of partial matching, see the +pcrepartial +page. A pcre_extra structure contains the following fields: +
+  flags            Bits indicating which fields are set
+  study_data       Opaque data from pcre[16|32]_study()
+  match_limit      Limit on internal resource use
+  match_limit_recursion  Limit on internal recursion depth
+  callout_data     Opaque data passed back to callouts
+  tables           Points to character tables or is NULL
+  mark             For passing back a *MARK pointer
+  executable_jit   Opaque data from JIT compilation
+
+The flag bits are PCRE_EXTRA_STUDY_DATA, PCRE_EXTRA_MATCH_LIMIT, +PCRE_EXTRA_MATCH_LIMIT_RECURSION, PCRE_EXTRA_CALLOUT_DATA, +PCRE_EXTRA_TABLES, PCRE_EXTRA_MARK and PCRE_EXTRA_EXECUTABLE_JIT. +

+

+There is a complete description of the PCRE native API in the +pcreapi +page and a description of the POSIX API in the +pcreposix +page. +

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_free_study.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_free_study.html new file mode 100755 index 000000000..7f9e10e86 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_free_study.html @@ -0,0 +1,46 @@ + + +pcre_free_study specification + + +

pcre_free_study man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+
+SYNOPSIS +
+

+#include <pcre.h> +

+

+void pcre_free_study(pcre_extra *extra); +

+

+void pcre16_free_study(pcre16_extra *extra); +

+

+void pcre32_free_study(pcre32_extra *extra); +

+
+DESCRIPTION +
+

+This function is used to free the memory used for the data generated by a call +to pcre[16|32]_study() when it is no longer needed. The argument must be the +result of such a call. +

+

+There is a complete description of the PCRE native API in the +pcreapi +page and a description of the POSIX API in the +pcreposix +page. +

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_free_substring.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_free_substring.html new file mode 100755 index 000000000..1fe661074 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_free_substring.html @@ -0,0 +1,46 @@ + + +pcre_free_substring specification + + +

pcre_free_substring man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+
+SYNOPSIS +
+

+#include <pcre.h> +

+

+void pcre_free_substring(const char *stringptr); +

+

+void pcre16_free_substring(PCRE_SPTR16 stringptr); +

+

+void pcre32_free_substring(PCRE_SPTR32 stringptr); +

+
+DESCRIPTION +
+

+This is a convenience function for freeing the store obtained by a previous +call to pcre[16|32]_get_substring() or pcre[16|32]_get_named_substring(). +Its only argument is a pointer to the string. +

+

+There is a complete description of the PCRE native API in the +pcreapi +page and a description of the POSIX API in the +pcreposix +page. +

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_free_substring_list.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_free_substring_list.html new file mode 100755 index 000000000..c0861780b --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_free_substring_list.html @@ -0,0 +1,46 @@ + + +pcre_free_substring_list specification + + +

pcre_free_substring_list man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+
+SYNOPSIS +
+

+#include <pcre.h> +

+

+void pcre_free_substring_list(const char **stringptr); +

+

+void pcre16_free_substring_list(PCRE_SPTR16 *stringptr); +

+

+void pcre32_free_substring_list(PCRE_SPTR32 *stringptr); +

+
+DESCRIPTION +
+

+This is a convenience function for freeing the store obtained by a previous +call to pcre[16|32]_get_substring_list(). Its only argument is a pointer to +the list of string pointers. +

+

+There is a complete description of the PCRE native API in the +pcreapi +page and a description of the POSIX API in the +pcreposix +page. +

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_fullinfo.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_fullinfo.html new file mode 100755 index 000000000..2b7c72b3b --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_fullinfo.html @@ -0,0 +1,118 @@ + + +pcre_fullinfo specification + + +

pcre_fullinfo man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+
+SYNOPSIS +
+

+#include <pcre.h> +

+

+int pcre_fullinfo(const pcre *code, const pcre_extra *extra, + int what, void *where); +
+
+int pcre16_fullinfo(const pcre16 *code, const pcre16_extra *extra, + int what, void *where); +
+
+int pcre32_fullinfo(const pcre32 *code, const pcre32_extra *extra, + int what, void *where); +

+
+DESCRIPTION +
+

+This function returns information about a compiled pattern. Its arguments are: +

+  code                      Compiled regular expression
+  extra                     Result of pcre[16|32]_study() or NULL
+  what                      What information is required
+  where                     Where to put the information
+
+The following information is available: +
+  PCRE_INFO_BACKREFMAX      Number of highest back reference
+  PCRE_INFO_CAPTURECOUNT    Number of capturing subpatterns
+  PCRE_INFO_DEFAULT_TABLES  Pointer to default tables
+  PCRE_INFO_FIRSTBYTE       Fixed first data unit for a match, or
+                              -1 for start of string
+                                 or after newline, or
+                              -2 otherwise
+  PCRE_INFO_FIRSTTABLE      Table of first data units (after studying)
+  PCRE_INFO_HASCRORLF       Return 1 if explicit CR or LF matches exist
+  PCRE_INFO_JCHANGED        Return 1 if (?J) or (?-J) was used
+  PCRE_INFO_JIT             Return 1 after successful JIT compilation
+  PCRE_INFO_JITSIZE         Size of JIT compiled code
+  PCRE_INFO_LASTLITERAL     Literal last data unit required
+  PCRE_INFO_MINLENGTH       Lower bound length of matching strings
+  PCRE_INFO_MATCHEMPTY      Return 1 if the pattern can match an empty string,
+                               0 otherwise
+  PCRE_INFO_MATCHLIMIT      Match limit if set, otherwise PCRE_RROR_UNSET
+  PCRE_INFO_MAXLOOKBEHIND   Length (in characters) of the longest lookbehind assertion
+  PCRE_INFO_NAMECOUNT       Number of named subpatterns
+  PCRE_INFO_NAMEENTRYSIZE   Size of name table entry
+  PCRE_INFO_NAMETABLE       Pointer to name table
+  PCRE_INFO_OKPARTIAL       Return 1 if partial matching can be tried
+                              (always returns 1 after release 8.00)
+  PCRE_INFO_OPTIONS         Option bits used for compilation
+  PCRE_INFO_SIZE            Size of compiled pattern
+  PCRE_INFO_STUDYSIZE       Size of study data
+  PCRE_INFO_FIRSTCHARACTER      Fixed first data unit for a match
+  PCRE_INFO_FIRSTCHARACTERFLAGS Returns
+                                  1 if there is a first data character set, which can
+                                    then be retrieved using PCRE_INFO_FIRSTCHARACTER,
+                                  2 if the first character is at the start of the data
+                                    string or after a newline, and
+                                  0 otherwise
+  PCRE_INFO_RECURSIONLIMIT    Recursion limit if set, otherwise PCRE_ERROR_UNSET
+  PCRE_INFO_REQUIREDCHAR      Literal last data unit required
+  PCRE_INFO_REQUIREDCHARFLAGS Returns 1 if the last data character is set (which can then
+                              be retrieved using PCRE_INFO_REQUIREDCHAR); 0 otherwise
+
+The where argument must point to an integer variable, except for the +following what values: +
+  PCRE_INFO_DEFAULT_TABLES  const uint8_t *
+  PCRE_INFO_FIRSTCHARACTER  uint32_t
+  PCRE_INFO_FIRSTTABLE      const uint8_t *
+  PCRE_INFO_JITSIZE         size_t
+  PCRE_INFO_MATCHLIMIT      uint32_t
+  PCRE_INFO_NAMETABLE       PCRE_SPTR16           (16-bit library)
+  PCRE_INFO_NAMETABLE       PCRE_SPTR32           (32-bit library)
+  PCRE_INFO_NAMETABLE       const unsigned char * (8-bit library)
+  PCRE_INFO_OPTIONS         unsigned long int
+  PCRE_INFO_SIZE            size_t
+  PCRE_INFO_STUDYSIZE       size_t
+  PCRE_INFO_RECURSIONLIMIT  uint32_t
+  PCRE_INFO_REQUIREDCHAR    uint32_t
+
+The yield of the function is zero on success or: +
+  PCRE_ERROR_NULL           the argument code was NULL
+                            the argument where was NULL
+  PCRE_ERROR_BADMAGIC       the "magic number" was not found
+  PCRE_ERROR_BADOPTION      the value of what was invalid
+  PCRE_ERROR_UNSET          the option was not set
+
+

+

+There is a complete description of the PCRE native API in the +pcreapi +page and a description of the POSIX API in the +pcreposix +page. +

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_get_named_substring.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_get_named_substring.html new file mode 100755 index 000000000..72924d9b2 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_get_named_substring.html @@ -0,0 +1,68 @@ + + +pcre_get_named_substring specification + + +

pcre_get_named_substring man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+
+SYNOPSIS +
+

+#include <pcre.h> +

+

+int pcre_get_named_substring(const pcre *code, + const char *subject, int *ovector, + int stringcount, const char *stringname, + const char **stringptr); +
+
+int pcre16_get_named_substring(const pcre16 *code, + PCRE_SPTR16 subject, int *ovector, + int stringcount, PCRE_SPTR16 stringname, + PCRE_SPTR16 *stringptr); +
+
+int pcre32_get_named_substring(const pcre32 *code, + PCRE_SPTR32 subject, int *ovector, + int stringcount, PCRE_SPTR32 stringname, + PCRE_SPTR32 *stringptr); +

+
+DESCRIPTION +
+

+This is a convenience function for extracting a captured substring by name. The +arguments are: +

+  code          Compiled pattern
+  subject       Subject that has been successfully matched
+  ovector       Offset vector that pcre[16|32]_exec() used
+  stringcount   Value returned by pcre[16|32]_exec()
+  stringname    Name of the required substring
+  stringptr     Where to put the string pointer
+
+The memory in which the substring is placed is obtained by calling +pcre[16|32]_malloc(). The convenience function +pcre[16|32]_free_substring() can be used to free it when it is no longer +needed. The yield of the function is the length of the extracted substring, +PCRE_ERROR_NOMEMORY if sufficient memory could not be obtained, or +PCRE_ERROR_NOSUBSTRING if the string name is invalid. +

+

+There is a complete description of the PCRE native API in the +pcreapi +page and a description of the POSIX API in the +pcreposix +page. +

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_get_stringnumber.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_get_stringnumber.html new file mode 100755 index 000000000..7324d782e --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_get_stringnumber.html @@ -0,0 +1,57 @@ + + +pcre_get_stringnumber specification + + +

pcre_get_stringnumber man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+
+SYNOPSIS +
+

+#include <pcre.h> +

+

+int pcre_get_stringnumber(const pcre *code, + const char *name); +
+
+int pcre16_get_stringnumber(const pcre16 *code, + PCRE_SPTR16 name); +
+
+int pcre32_get_stringnumber(const pcre32 *code, + PCRE_SPTR32 name); +

+
+DESCRIPTION +
+

+This convenience function finds the number of a named substring capturing +parenthesis in a compiled pattern. Its arguments are: +

+  code    Compiled regular expression
+  name    Name whose number is required
+
+The yield of the function is the number of the parenthesis if the name is +found, or PCRE_ERROR_NOSUBSTRING otherwise. When duplicate names are allowed +(PCRE_DUPNAMES is set), it is not defined which of the numbers is returned by +pcre[16|32]_get_stringnumber(). You can obtain the complete list by calling +pcre[16|32]_get_stringtable_entries(). +

+

+There is a complete description of the PCRE native API in the +pcreapi +page and a description of the POSIX API in the +pcreposix +page. +

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_get_stringtable_entries.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_get_stringtable_entries.html new file mode 100755 index 000000000..79906798e --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_get_stringtable_entries.html @@ -0,0 +1,60 @@ + + +pcre_get_stringtable_entries specification + + +

pcre_get_stringtable_entries man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+
+SYNOPSIS +
+

+#include <pcre.h> +

+

+int pcre_get_stringtable_entries(const pcre *code, + const char *name, char **first, char **last); +
+
+int pcre16_get_stringtable_entries(const pcre16 *code, + PCRE_SPTR16 name, PCRE_UCHAR16 **first, PCRE_UCHAR16 **last); +
+
+int pcre32_get_stringtable_entries(const pcre32 *code, + PCRE_SPTR32 name, PCRE_UCHAR32 **first, PCRE_UCHAR32 **last); +

+
+DESCRIPTION +
+

+This convenience function finds, for a compiled pattern, the first and last +entries for a given name in the table that translates capturing parenthesis +names into numbers. When names are required to be unique (PCRE_DUPNAMES is +not set), it is usually easier to use pcre[16|32]_get_stringnumber() +instead. +

+  code    Compiled regular expression
+  name    Name whose entries required
+  first   Where to return a pointer to the first entry
+  last    Where to return a pointer to the last entry
+
+The yield of the function is the length of each entry, or +PCRE_ERROR_NOSUBSTRING if none are found. +

+

+There is a complete description of the PCRE native API, including the format of +the table entries, in the +pcreapi +page, and a description of the POSIX API in the +pcreposix +page. +

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_get_substring.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_get_substring.html new file mode 100755 index 000000000..1a8e4f5a4 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_get_substring.html @@ -0,0 +1,64 @@ + + +pcre_get_substring specification + + +

pcre_get_substring man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+
+SYNOPSIS +
+

+#include <pcre.h> +

+

+int pcre_get_substring(const char *subject, int *ovector, + int stringcount, int stringnumber, + const char **stringptr); +
+
+int pcre16_get_substring(PCRE_SPTR16 subject, int *ovector, + int stringcount, int stringnumber, + PCRE_SPTR16 *stringptr); +
+
+int pcre32_get_substring(PCRE_SPTR32 subject, int *ovector, + int stringcount, int stringnumber, + PCRE_SPTR32 *stringptr); +

+
+DESCRIPTION +
+

+This is a convenience function for extracting a captured substring. The +arguments are: +

+  subject       Subject that has been successfully matched
+  ovector       Offset vector that pcre[16|32]_exec() used
+  stringcount   Value returned by pcre[16|32]_exec()
+  stringnumber  Number of the required substring
+  stringptr     Where to put the string pointer
+
+The memory in which the substring is placed is obtained by calling +pcre[16|32]_malloc(). The convenience function +pcre[16|32]_free_substring() can be used to free it when it is no longer +needed. The yield of the function is the length of the substring, +PCRE_ERROR_NOMEMORY if sufficient memory could not be obtained, or +PCRE_ERROR_NOSUBSTRING if the string number is invalid. +

+

+There is a complete description of the PCRE native API in the +pcreapi +page and a description of the POSIX API in the +pcreposix +page. +

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_get_substring_list.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_get_substring_list.html new file mode 100755 index 000000000..7e8c6bc85 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_get_substring_list.html @@ -0,0 +1,61 @@ + + +pcre_get_substring_list specification + + +

pcre_get_substring_list man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+
+SYNOPSIS +
+

+#include <pcre.h> +

+

+int pcre_get_substring_list(const char *subject, + int *ovector, int stringcount, const char ***listptr); +
+
+int pcre16_get_substring_list(PCRE_SPTR16 subject, + int *ovector, int stringcount, PCRE_SPTR16 **listptr); +
+
+int pcre32_get_substring_list(PCRE_SPTR32 subject, + int *ovector, int stringcount, PCRE_SPTR32 **listptr); +

+
+DESCRIPTION +
+

+This is a convenience function for extracting a list of all the captured +substrings. The arguments are: +

+  subject       Subject that has been successfully matched
+  ovector       Offset vector that pcre[16|32]_exec used
+  stringcount   Value returned by pcre[16|32]_exec
+  listptr       Where to put a pointer to the list
+
+The memory in which the substrings and the list are placed is obtained by +calling pcre[16|32]_malloc(). The convenience function +pcre[16|32]_free_substring_list() can be used to free it when it is no +longer needed. A pointer to a list of pointers is put in the variable whose +address is in listptr. The list is terminated by a NULL pointer. The +yield of the function is zero on success or PCRE_ERROR_NOMEMORY if sufficient +memory could not be obtained. +

+

+There is a complete description of the PCRE native API in the +pcreapi +page and a description of the POSIX API in the +pcreposix +page. +

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_jit_exec.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_jit_exec.html new file mode 100755 index 000000000..4ebb0cbca --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_jit_exec.html @@ -0,0 +1,108 @@ + + +pcre_jit_exec specification + + +

pcre_jit_exec man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+
+SYNOPSIS +
+

+#include <pcre.h> +

+

+int pcre_jit_exec(const pcre *code, const pcre_extra *extra, + const char *subject, int length, int startoffset, + int options, int *ovector, int ovecsize, + pcre_jit_stack *jstack); +
+
+int pcre16_jit_exec(const pcre16 *code, const pcre16_extra *extra, + PCRE_SPTR16 subject, int length, int startoffset, + int options, int *ovector, int ovecsize, + pcre_jit_stack *jstack); +
+
+int pcre32_jit_exec(const pcre32 *code, const pcre32_extra *extra, + PCRE_SPTR32 subject, int length, int startoffset, + int options, int *ovector, int ovecsize, + pcre_jit_stack *jstack); +

+
+DESCRIPTION +
+

+This function matches a compiled regular expression that has been successfully +studied with one of the JIT options against a given subject string, using a +matching algorithm that is similar to Perl's. It is a "fast path" interface to +JIT, and it bypasses some of the sanity checks that pcre_exec() applies. +It returns offsets to captured substrings. Its arguments are: +

+  code         Points to the compiled pattern
+  extra        Points to an associated pcre[16|32]_extra structure,
+                 or is NULL
+  subject      Points to the subject string
+  length       Length of the subject string, in bytes
+  startoffset  Offset in bytes in the subject at which to
+                 start matching
+  options      Option bits
+  ovector      Points to a vector of ints for result offsets
+  ovecsize     Number of elements in the vector (a multiple of 3)
+  jstack       Pointer to a JIT stack
+
+The allowed options are: +
+  PCRE_NOTBOL            Subject string is not the beginning of a line
+  PCRE_NOTEOL            Subject string is not the end of a line
+  PCRE_NOTEMPTY          An empty string is not a valid match
+  PCRE_NOTEMPTY_ATSTART  An empty string at the start of the subject
+                           is not a valid match
+  PCRE_NO_UTF16_CHECK    Do not check the subject for UTF-16
+                           validity (only relevant if PCRE_UTF16
+                           was set at compile time)
+  PCRE_NO_UTF32_CHECK    Do not check the subject for UTF-32
+                           validity (only relevant if PCRE_UTF32
+                           was set at compile time)
+  PCRE_NO_UTF8_CHECK     Do not check the subject for UTF-8
+                           validity (only relevant if PCRE_UTF8
+                           was set at compile time)
+  PCRE_PARTIAL           ) Return PCRE_ERROR_PARTIAL for a partial
+  PCRE_PARTIAL_SOFT      )   match if no full matches are found
+  PCRE_PARTIAL_HARD      Return PCRE_ERROR_PARTIAL for a partial match
+                           if that is found before a full match
+
+However, the PCRE_NO_UTF[8|16|32]_CHECK options have no effect, as this check +is never applied. For details of partial matching, see the +pcrepartial +page. A pcre_extra structure contains the following fields: +
+  flags            Bits indicating which fields are set
+  study_data       Opaque data from pcre[16|32]_study()
+  match_limit      Limit on internal resource use
+  match_limit_recursion  Limit on internal recursion depth
+  callout_data     Opaque data passed back to callouts
+  tables           Points to character tables or is NULL
+  mark             For passing back a *MARK pointer
+  executable_jit   Opaque data from JIT compilation
+
+The flag bits are PCRE_EXTRA_STUDY_DATA, PCRE_EXTRA_MATCH_LIMIT, +PCRE_EXTRA_MATCH_LIMIT_RECURSION, PCRE_EXTRA_CALLOUT_DATA, +PCRE_EXTRA_TABLES, PCRE_EXTRA_MARK and PCRE_EXTRA_EXECUTABLE_JIT. +

+

+There is a complete description of the PCRE native API in the +pcreapi +page and a description of the JIT API in the +pcrejit +page. +

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_jit_stack_alloc.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_jit_stack_alloc.html new file mode 100755 index 000000000..23ba45075 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_jit_stack_alloc.html @@ -0,0 +1,55 @@ + + +pcre_jit_stack_alloc specification + + +

pcre_jit_stack_alloc man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+
+SYNOPSIS +
+

+#include <pcre.h> +

+

+pcre_jit_stack *pcre_jit_stack_alloc(int startsize, + int maxsize); +
+
+pcre16_jit_stack *pcre16_jit_stack_alloc(int startsize, + int maxsize); +
+
+pcre32_jit_stack *pcre32_jit_stack_alloc(int startsize, + int maxsize); +

+
+DESCRIPTION +
+

+This function is used to create a stack for use by the code compiled by the JIT +optimization of pcre[16|32]_study(). The arguments are a starting size for +the stack, and a maximum size to which it is allowed to grow. The result can be +passed to the JIT run-time code by pcre[16|32]_assign_jit_stack(), or that +function can set up a callback for obtaining a stack. A maximum stack size of +512K to 1M should be more than enough for any pattern. For more details, see +the +pcrejit +page. +

+

+There is a complete description of the PCRE native API in the +pcreapi +page and a description of the POSIX API in the +pcreposix +page. +

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_jit_stack_free.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_jit_stack_free.html new file mode 100755 index 000000000..8bd06e465 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_jit_stack_free.html @@ -0,0 +1,48 @@ + + +pcre_jit_stack_free specification + + +

pcre_jit_stack_free man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+
+SYNOPSIS +
+

+#include <pcre.h> +

+

+void pcre_jit_stack_free(pcre_jit_stack *stack); +

+

+void pcre16_jit_stack_free(pcre16_jit_stack *stack); +

+

+void pcre32_jit_stack_free(pcre32_jit_stack *stack); +

+
+DESCRIPTION +
+

+This function is used to free a JIT stack that was created by +pcre[16|32]_jit_stack_alloc() when it is no longer needed. For more details, +see the +pcrejit +page. +

+

+There is a complete description of the PCRE native API in the +pcreapi +page and a description of the POSIX API in the +pcreposix +page. +

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_maketables.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_maketables.html new file mode 100755 index 000000000..3a7b5ebc4 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_maketables.html @@ -0,0 +1,48 @@ + + +pcre_maketables specification + + +

pcre_maketables man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+
+SYNOPSIS +
+

+#include <pcre.h> +

+

+const unsigned char *pcre_maketables(void); +

+

+const unsigned char *pcre16_maketables(void); +

+

+const unsigned char *pcre32_maketables(void); +

+
+DESCRIPTION +
+

+This function builds a set of character tables for character values less than +256. These can be passed to pcre[16|32]_compile() to override PCRE's +internal, built-in tables (which were made by pcre[16|32]_maketables() when +PCRE was compiled). You might want to do this if you are using a non-standard +locale. The function yields a pointer to the tables. +

+

+There is a complete description of the PCRE native API in the +pcreapi +page and a description of the POSIX API in the +pcreposix +page. +

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_pattern_to_host_byte_order.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_pattern_to_host_byte_order.html new file mode 100755 index 000000000..1b1c80372 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_pattern_to_host_byte_order.html @@ -0,0 +1,58 @@ + + +pcre_pattern_to_host_byte_order specification + + +

pcre_pattern_to_host_byte_order man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+
+SYNOPSIS +
+

+#include <pcre.h> +

+

+int pcre_pattern_to_host_byte_order(pcre *code, + pcre_extra *extra, const unsigned char *tables); +
+
+int pcre16_pattern_to_host_byte_order(pcre16 *code, + pcre16_extra *extra, const unsigned char *tables); +
+
+int pcre32_pattern_to_host_byte_order(pcre32 *code, + pcre32_extra *extra, const unsigned char *tables); +

+
+DESCRIPTION +
+

+This function ensures that the bytes in 2-byte and 4-byte values in a compiled +pattern are in the correct order for the current host. It is useful when a +pattern that has been compiled on one host is transferred to another that might +have different endianness. The arguments are: +

+  code         A compiled regular expression
+  extra        Points to an associated pcre[16|32]_extra structure,
+                 or is NULL
+  tables       Pointer to character tables, or NULL to
+                 set the built-in default
+
+The result is 0 for success, a negative PCRE_ERROR_xxx value otherwise. +

+

+There is a complete description of the PCRE native API in the +pcreapi +page and a description of the POSIX API in the +pcreposix +page. +

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_refcount.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_refcount.html new file mode 100755 index 000000000..bfb92e6d8 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_refcount.html @@ -0,0 +1,51 @@ + + +pcre_refcount specification + + +

pcre_refcount man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+
+SYNOPSIS +
+

+#include <pcre.h> +

+

+int pcre_refcount(pcre *code, int adjust); +

+

+int pcre16_refcount(pcre16 *code, int adjust); +

+

+int pcre32_refcount(pcre32 *code, int adjust); +

+
+DESCRIPTION +
+

+This function is used to maintain a reference count inside a data block that +contains a compiled pattern. Its arguments are: +

+  code                      Compiled regular expression
+  adjust                    Adjustment to reference value
+
+The yield of the function is the adjusted reference value, which is constrained +to lie between 0 and 65535. +

+

+There is a complete description of the PCRE native API in the +pcreapi +page and a description of the POSIX API in the +pcreposix +page. +

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_study.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_study.html new file mode 100755 index 000000000..af82f1140 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_study.html @@ -0,0 +1,68 @@ + + +pcre_study specification + + +

pcre_study man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+
+SYNOPSIS +
+

+#include <pcre.h> +

+

+pcre_extra *pcre_study(const pcre *code, int options, + const char **errptr); +
+
+pcre16_extra *pcre16_study(const pcre16 *code, int options, + const char **errptr); +
+
+pcre32_extra *pcre32_study(const pcre32 *code, int options, + const char **errptr); +

+
+DESCRIPTION +
+

+This function studies a compiled pattern, to see if additional information can +be extracted that might speed up matching. Its arguments are: +

+  code       A compiled regular expression
+  options    Options for pcre[16|32]_study()
+  errptr     Where to put an error message
+
+If the function succeeds, it returns a value that can be passed to +pcre[16|32]_exec() or pcre[16|32]_dfa_exec() via their extra +arguments. +

+

+If the function returns NULL, either it could not find any additional +information, or there was an error. You can tell the difference by looking at +the error value. It is NULL in first case. +

+

+The only option is PCRE_STUDY_JIT_COMPILE. It requests just-in-time compilation +if possible. If PCRE has been compiled without JIT support, this option is +ignored. See the +pcrejit +page for further details. +

+

+There is a complete description of the PCRE native API in the +pcreapi +page and a description of the POSIX API in the +pcreposix +page. +

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_utf16_to_host_byte_order.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_utf16_to_host_byte_order.html new file mode 100755 index 000000000..18e7788f6 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_utf16_to_host_byte_order.html @@ -0,0 +1,57 @@ + + +pcre_utf16_to_host_byte_order specification + + +

pcre_utf16_to_host_byte_order man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+
+SYNOPSIS +
+

+#include <pcre.h> +

+

+int pcre16_utf16_to_host_byte_order(PCRE_UCHAR16 *output, + PCRE_SPTR16 input, int length, int *host_byte_order, + int keep_boms); +

+
+DESCRIPTION +
+

+This function, which exists only in the 16-bit library, converts a UTF-16 +string to the correct order for the current host, taking account of any byte +order marks (BOMs) within the string. Its arguments are: +

+  output           pointer to output buffer, may be the same as input
+  input            pointer to input buffer
+  length           number of 16-bit units in the input, or negative for
+                     a zero-terminated string
+  host_byte_order  a NULL value or a non-zero value pointed to means
+                     start in host byte order
+  keep_boms        if non-zero, BOMs are copied to the output string
+
+The result of the function is the number of 16-bit units placed into the output +buffer, including the zero terminator if the string was zero-terminated. +

+

+If host_byte_order is not NULL, it is set to indicate the byte order that +is current at the end of the string. +

+

+There is a complete description of the PCRE native API in the +pcreapi +page and a description of the POSIX API in the +pcreposix +page. +

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_utf32_to_host_byte_order.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_utf32_to_host_byte_order.html new file mode 100755 index 000000000..772ae40cd --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_utf32_to_host_byte_order.html @@ -0,0 +1,57 @@ + + +pcre_utf32_to_host_byte_order specification + + +

pcre_utf32_to_host_byte_order man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+
+SYNOPSIS +
+

+#include <pcre.h> +

+

+int pcre32_utf32_to_host_byte_order(PCRE_UCHAR32 *output, + PCRE_SPTR32 input, int length, int *host_byte_order, + int keep_boms); +

+
+DESCRIPTION +
+

+This function, which exists only in the 32-bit library, converts a UTF-32 +string to the correct order for the current host, taking account of any byte +order marks (BOMs) within the string. Its arguments are: +

+  output           pointer to output buffer, may be the same as input
+  input            pointer to input buffer
+  length           number of 32-bit units in the input, or negative for
+                     a zero-terminated string
+  host_byte_order  a NULL value or a non-zero value pointed to means
+                     start in host byte order
+  keep_boms        if non-zero, BOMs are copied to the output string
+
+The result of the function is the number of 32-bit units placed into the output +buffer, including the zero terminator if the string was zero-terminated. +

+

+If host_byte_order is not NULL, it is set to indicate the byte order that +is current at the end of the string. +

+

+There is a complete description of the PCRE native API in the +pcreapi +page and a description of the POSIX API in the +pcreposix +page. +

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_version.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_version.html new file mode 100755 index 000000000..d33e71895 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcre_version.html @@ -0,0 +1,46 @@ + + +pcre_version specification + + +

pcre_version man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+
+SYNOPSIS +
+

+#include <pcre.h> +

+

+const char *pcre_version(void); +

+

+const char *pcre16_version(void); +

+

+const char *pcre32_version(void); +

+
+DESCRIPTION +
+

+This function (even in the 16-bit and 32-bit libraries) returns a +zero-terminated, 8-bit character string that gives the version number of the +PCRE library and the date of its release. +

+

+There is a complete description of the PCRE native API in the +pcreapi +page and a description of the POSIX API in the +pcreposix +page. +

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcreapi.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcreapi.html new file mode 100755 index 000000000..2fdfbff5c --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcreapi.html @@ -0,0 +1,2921 @@ + + +pcreapi specification + + +

pcreapi man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+

+

+#include <pcre.h> +

+
PCRE NATIVE API BASIC FUNCTIONS
+

+pcre *pcre_compile(const char *pattern, int options, + const char **errptr, int *erroffset, + const unsigned char *tableptr); +
+
+pcre *pcre_compile2(const char *pattern, int options, + int *errorcodeptr, + const char **errptr, int *erroffset, + const unsigned char *tableptr); +
+
+pcre_extra *pcre_study(const pcre *code, int options, + const char **errptr); +
+
+void pcre_free_study(pcre_extra *extra); +
+
+int pcre_exec(const pcre *code, const pcre_extra *extra, + const char *subject, int length, int startoffset, + int options, int *ovector, int ovecsize); +
+
+int pcre_dfa_exec(const pcre *code, const pcre_extra *extra, + const char *subject, int length, int startoffset, + int options, int *ovector, int ovecsize, + int *workspace, int wscount); +

+
PCRE NATIVE API STRING EXTRACTION FUNCTIONS
+

+int pcre_copy_named_substring(const pcre *code, + const char *subject, int *ovector, + int stringcount, const char *stringname, + char *buffer, int buffersize); +
+
+int pcre_copy_substring(const char *subject, int *ovector, + int stringcount, int stringnumber, char *buffer, + int buffersize); +
+
+int pcre_get_named_substring(const pcre *code, + const char *subject, int *ovector, + int stringcount, const char *stringname, + const char **stringptr); +
+
+int pcre_get_stringnumber(const pcre *code, + const char *name); +
+
+int pcre_get_stringtable_entries(const pcre *code, + const char *name, char **first, char **last); +
+
+int pcre_get_substring(const char *subject, int *ovector, + int stringcount, int stringnumber, + const char **stringptr); +
+
+int pcre_get_substring_list(const char *subject, + int *ovector, int stringcount, const char ***listptr); +
+
+void pcre_free_substring(const char *stringptr); +
+
+void pcre_free_substring_list(const char **stringptr); +

+
PCRE NATIVE API AUXILIARY FUNCTIONS
+

+int pcre_jit_exec(const pcre *code, const pcre_extra *extra, + const char *subject, int length, int startoffset, + int options, int *ovector, int ovecsize, + pcre_jit_stack *jstack); +
+
+pcre_jit_stack *pcre_jit_stack_alloc(int startsize, int maxsize); +
+
+void pcre_jit_stack_free(pcre_jit_stack *stack); +
+
+void pcre_assign_jit_stack(pcre_extra *extra, + pcre_jit_callback callback, void *data); +
+
+const unsigned char *pcre_maketables(void); +
+
+int pcre_fullinfo(const pcre *code, const pcre_extra *extra, + int what, void *where); +
+
+int pcre_refcount(pcre *code, int adjust); +
+
+int pcre_config(int what, void *where); +
+
+const char *pcre_version(void); +
+
+int pcre_pattern_to_host_byte_order(pcre *code, + pcre_extra *extra, const unsigned char *tables); +

+
PCRE NATIVE API INDIRECTED FUNCTIONS
+

+void *(*pcre_malloc)(size_t); +
+
+void (*pcre_free)(void *); +
+
+void *(*pcre_stack_malloc)(size_t); +
+
+void (*pcre_stack_free)(void *); +
+
+int (*pcre_callout)(pcre_callout_block *); +
+
+int (*pcre_stack_guard)(void); +

+
PCRE 8-BIT, 16-BIT, AND 32-BIT LIBRARIES
+

+As well as support for 8-bit character strings, PCRE also supports 16-bit +strings (from release 8.30) and 32-bit strings (from release 8.32), by means of +two additional libraries. They can be built as well as, or instead of, the +8-bit library. To avoid too much complication, this document describes the +8-bit versions of the functions, with only occasional references to the 16-bit +and 32-bit libraries. +

+

+The 16-bit and 32-bit functions operate in the same way as their 8-bit +counterparts; they just use different data types for their arguments and +results, and their names start with pcre16_ or pcre32_ instead of +pcre_. For every option that has UTF8 in its name (for example, +PCRE_UTF8), there are corresponding 16-bit and 32-bit names with UTF8 replaced +by UTF16 or UTF32, respectively. This facility is in fact just cosmetic; the +16-bit and 32-bit option names define the same bit values. +

+

+References to bytes and UTF-8 in this document should be read as references to +16-bit data units and UTF-16 when using the 16-bit library, or 32-bit data +units and UTF-32 when using the 32-bit library, unless specified otherwise. +More details of the specific differences for the 16-bit and 32-bit libraries +are given in the +pcre16 +and +pcre32 +pages. +

+
PCRE API OVERVIEW
+

+PCRE has its own native API, which is described in this document. There are +also some wrapper functions (for the 8-bit library only) that correspond to the +POSIX regular expression API, but they do not give access to all the +functionality. They are described in the +pcreposix +documentation. Both of these APIs define a set of C function calls. A C++ +wrapper (again for the 8-bit library only) is also distributed with PCRE. It is +documented in the +pcrecpp +page. +

+

+The native API C function prototypes are defined in the header file +pcre.h, and on Unix-like systems the (8-bit) library itself is called +libpcre. It can normally be accessed by adding -lpcre to the +command for linking an application that uses PCRE. The header file defines the +macros PCRE_MAJOR and PCRE_MINOR to contain the major and minor release numbers +for the library. Applications can use these to include support for different +releases of PCRE. +

+

+In a Windows environment, if you want to statically link an application program +against a non-dll pcre.a file, you must define PCRE_STATIC before +including pcre.h or pcrecpp.h, because otherwise the +pcre_malloc() and pcre_free() exported functions will be declared +__declspec(dllimport), with unwanted results. +

+

+The functions pcre_compile(), pcre_compile2(), pcre_study(), +and pcre_exec() are used for compiling and matching regular expressions +in a Perl-compatible manner. A sample program that demonstrates the simplest +way of using them is provided in the file called pcredemo.c in the PCRE +source distribution. A listing of this program is given in the +pcredemo +documentation, and the +pcresample +documentation describes how to compile and run it. +

+

+Just-in-time compiler support is an optional feature of PCRE that can be built +in appropriate hardware environments. It greatly speeds up the matching +performance of many patterns. Simple programs can easily request that it be +used if available, by setting an option that is ignored when it is not +relevant. More complicated programs might need to make use of the functions +pcre_jit_stack_alloc(), pcre_jit_stack_free(), and +pcre_assign_jit_stack() in order to control the JIT code's memory usage. +

+

+From release 8.32 there is also a direct interface for JIT execution, which +gives improved performance. The JIT-specific functions are discussed in the +pcrejit +documentation. +

+

+A second matching function, pcre_dfa_exec(), which is not +Perl-compatible, is also provided. This uses a different algorithm for the +matching. The alternative algorithm finds all possible matches (at a given +point in the subject), and scans the subject just once (unless there are +lookbehind assertions). However, this algorithm does not return captured +substrings. A description of the two matching algorithms and their advantages +and disadvantages is given in the +pcrematching +documentation. +

+

+In addition to the main compiling and matching functions, there are convenience +functions for extracting captured substrings from a subject string that is +matched by pcre_exec(). They are: +

+  pcre_copy_substring()
+  pcre_copy_named_substring()
+  pcre_get_substring()
+  pcre_get_named_substring()
+  pcre_get_substring_list()
+  pcre_get_stringnumber()
+  pcre_get_stringtable_entries()
+
+pcre_free_substring() and pcre_free_substring_list() are also +provided, to free the memory used for extracted strings. +

+

+The function pcre_maketables() is used to build a set of character tables +in the current locale for passing to pcre_compile(), pcre_exec(), +or pcre_dfa_exec(). This is an optional facility that is provided for +specialist use. Most commonly, no special tables are passed, in which case +internal tables that are generated when PCRE is built are used. +

+

+The function pcre_fullinfo() is used to find out information about a +compiled pattern. The function pcre_version() returns a pointer to a +string containing the version of PCRE and its date of release. +

+

+The function pcre_refcount() maintains a reference count in a data block +containing a compiled pattern. This is provided for the benefit of +object-oriented applications. +

+

+The global variables pcre_malloc and pcre_free initially contain +the entry points of the standard malloc() and free() functions, +respectively. PCRE calls the memory management functions via these variables, +so a calling program can replace them if it wishes to intercept the calls. This +should be done before calling any PCRE functions. +

+

+The global variables pcre_stack_malloc and pcre_stack_free are also +indirections to memory management functions. These special functions are used +only when PCRE is compiled to use the heap for remembering data, instead of +recursive function calls, when running the pcre_exec() function. See the +pcrebuild +documentation for details of how to do this. It is a non-standard way of +building PCRE, for use in environments that have limited stacks. Because of the +greater use of memory management, it runs more slowly. Separate functions are +provided so that special-purpose external code can be used for this case. When +used, these functions always allocate memory blocks of the same size. There is +a discussion about PCRE's stack usage in the +pcrestack +documentation. +

+

+The global variable pcre_callout initially contains NULL. It can be set +by the caller to a "callout" function, which PCRE will then call at specified +points during a matching operation. Details are given in the +pcrecallout +documentation. +

+

+The global variable pcre_stack_guard initially contains NULL. It can be +set by the caller to a function that is called by PCRE whenever it starts +to compile a parenthesized part of a pattern. When parentheses are nested, PCRE +uses recursive function calls, which use up the system stack. This function is +provided so that applications with restricted stacks can force a compilation +error if the stack runs out. The function should return zero if all is well, or +non-zero to force an error. +

+
NEWLINES
+

+PCRE supports five different conventions for indicating line breaks in +strings: a single CR (carriage return) character, a single LF (linefeed) +character, the two-character sequence CRLF, any of the three preceding, or any +Unicode newline sequence. The Unicode newline sequences are the three just +mentioned, plus the single characters VT (vertical tab, U+000B), FF (form feed, +U+000C), NEL (next line, U+0085), LS (line separator, U+2028), and PS +(paragraph separator, U+2029). +

+

+Each of the first three conventions is used by at least one operating system as +its standard newline sequence. When PCRE is built, a default can be specified. +The default default is LF, which is the Unix standard. When PCRE is run, the +default can be overridden, either when a pattern is compiled, or when it is +matched. +

+

+At compile time, the newline convention can be specified by the options +argument of pcre_compile(), or it can be specified by special text at the +start of the pattern itself; this overrides any other settings. See the +pcrepattern +page for details of the special character sequences. +

+

+In the PCRE documentation the word "newline" is used to mean "the character or +pair of characters that indicate a line break". The choice of newline +convention affects the handling of the dot, circumflex, and dollar +metacharacters, the handling of #-comments in /x mode, and, when CRLF is a +recognized line ending sequence, the match position advancement for a +non-anchored pattern. There is more detail about this in the +section on pcre_exec() options +below. +

+

+The choice of newline convention does not affect the interpretation of +the \n or \r escape sequences, nor does it affect what \R matches, which is +controlled in a similar way, but by separate options. +

+
MULTITHREADING
+

+The PCRE functions can be used in multi-threading applications, with the +proviso that the memory management functions pointed to by pcre_malloc, +pcre_free, pcre_stack_malloc, and pcre_stack_free, and the +callout and stack-checking functions pointed to by pcre_callout and +pcre_stack_guard, are shared by all threads. +

+

+The compiled form of a regular expression is not altered during matching, so +the same compiled pattern can safely be used by several threads at once. +

+

+If the just-in-time optimization feature is being used, it needs separate +memory stack areas for each thread. See the +pcrejit +documentation for more details. +

+
SAVING PRECOMPILED PATTERNS FOR LATER USE
+

+The compiled form of a regular expression can be saved and re-used at a later +time, possibly by a different program, and even on a host other than the one on +which it was compiled. Details are given in the +pcreprecompile +documentation, which includes a description of the +pcre_pattern_to_host_byte_order() function. However, compiling a regular +expression with one version of PCRE for use with a different version is not +guaranteed to work and may cause crashes. +

+
CHECKING BUILD-TIME OPTIONS
+

+int pcre_config(int what, void *where); +

+

+The function pcre_config() makes it possible for a PCRE client to +discover which optional features have been compiled into the PCRE library. The +pcrebuild +documentation has more details about these optional features. +

+

+The first argument for pcre_config() is an integer, specifying which +information is required; the second argument is a pointer to a variable into +which the information is placed. The returned value is zero on success, or the +negative error code PCRE_ERROR_BADOPTION if the value in the first argument is +not recognized. The following information is available: +

+  PCRE_CONFIG_UTF8
+
+The output is an integer that is set to one if UTF-8 support is available; +otherwise it is set to zero. This value should normally be given to the 8-bit +version of this function, pcre_config(). If it is given to the 16-bit +or 32-bit version of this function, the result is PCRE_ERROR_BADOPTION. +
+  PCRE_CONFIG_UTF16
+
+The output is an integer that is set to one if UTF-16 support is available; +otherwise it is set to zero. This value should normally be given to the 16-bit +version of this function, pcre16_config(). If it is given to the 8-bit +or 32-bit version of this function, the result is PCRE_ERROR_BADOPTION. +
+  PCRE_CONFIG_UTF32
+
+The output is an integer that is set to one if UTF-32 support is available; +otherwise it is set to zero. This value should normally be given to the 32-bit +version of this function, pcre32_config(). If it is given to the 8-bit +or 16-bit version of this function, the result is PCRE_ERROR_BADOPTION. +
+  PCRE_CONFIG_UNICODE_PROPERTIES
+
+The output is an integer that is set to one if support for Unicode character +properties is available; otherwise it is set to zero. +
+  PCRE_CONFIG_JIT
+
+The output is an integer that is set to one if support for just-in-time +compiling is available; otherwise it is set to zero. +
+  PCRE_CONFIG_JITTARGET
+
+The output is a pointer to a zero-terminated "const char *" string. If JIT +support is available, the string contains the name of the architecture for +which the JIT compiler is configured, for example "x86 32bit (little endian + +unaligned)". If JIT support is not available, the result is NULL. +
+  PCRE_CONFIG_NEWLINE
+
+The output is an integer whose value specifies the default character sequence +that is recognized as meaning "newline". The values that are supported in +ASCII/Unicode environments are: 10 for LF, 13 for CR, 3338 for CRLF, -2 for +ANYCRLF, and -1 for ANY. In EBCDIC environments, CR, ANYCRLF, and ANY yield the +same values. However, the value for LF is normally 21, though some EBCDIC +environments use 37. The corresponding values for CRLF are 3349 and 3365. The +default should normally correspond to the standard sequence for your operating +system. +
+  PCRE_CONFIG_BSR
+
+The output is an integer whose value indicates what character sequences the \R +escape sequence matches by default. A value of 0 means that \R matches any +Unicode line ending sequence; a value of 1 means that \R matches only CR, LF, +or CRLF. The default can be overridden when a pattern is compiled or matched. +
+  PCRE_CONFIG_LINK_SIZE
+
+The output is an integer that contains the number of bytes used for internal +linkage in compiled regular expressions. For the 8-bit library, the value can +be 2, 3, or 4. For the 16-bit library, the value is either 2 or 4 and is still +a number of bytes. For the 32-bit library, the value is either 2 or 4 and is +still a number of bytes. The default value of 2 is sufficient for all but the +most massive patterns, since it allows the compiled pattern to be up to 64K in +size. Larger values allow larger regular expressions to be compiled, at the +expense of slower matching. +
+  PCRE_CONFIG_POSIX_MALLOC_THRESHOLD
+
+The output is an integer that contains the threshold above which the POSIX +interface uses malloc() for output vectors. Further details are given in +the +pcreposix +documentation. +
+  PCRE_CONFIG_PARENS_LIMIT
+
+The output is a long integer that gives the maximum depth of nesting of +parentheses (of any kind) in a pattern. This limit is imposed to cap the amount +of system stack used when a pattern is compiled. It is specified when PCRE is +built; the default is 250. This limit does not take into account the stack that +may already be used by the calling application. For finer control over +compilation stack usage, you can set a pointer to an external checking function +in pcre_stack_guard. +
+  PCRE_CONFIG_MATCH_LIMIT
+
+The output is a long integer that gives the default limit for the number of +internal matching function calls in a pcre_exec() execution. Further +details are given with pcre_exec() below. +
+  PCRE_CONFIG_MATCH_LIMIT_RECURSION
+
+The output is a long integer that gives the default limit for the depth of +recursion when calling the internal matching function in a pcre_exec() +execution. Further details are given with pcre_exec() below. +
+  PCRE_CONFIG_STACKRECURSE
+
+The output is an integer that is set to one if internal recursion when running +pcre_exec() is implemented by recursive function calls that use the stack +to remember their state. This is the usual way that PCRE is compiled. The +output is zero if PCRE was compiled to use blocks of data on the heap instead +of recursive function calls. In this case, pcre_stack_malloc and +pcre_stack_free are called to manage memory blocks on the heap, thus +avoiding the use of the stack. +

+
COMPILING A PATTERN
+

+pcre *pcre_compile(const char *pattern, int options, + const char **errptr, int *erroffset, + const unsigned char *tableptr); +
+
+pcre *pcre_compile2(const char *pattern, int options, + int *errorcodeptr, + const char **errptr, int *erroffset, + const unsigned char *tableptr); +

+

+Either of the functions pcre_compile() or pcre_compile2() can be +called to compile a pattern into an internal form. The only difference between +the two interfaces is that pcre_compile2() has an additional argument, +errorcodeptr, via which a numerical error code can be returned. To avoid +too much repetition, we refer just to pcre_compile() below, but the +information applies equally to pcre_compile2(). +

+

+The pattern is a C string terminated by a binary zero, and is passed in the +pattern argument. A pointer to a single block of memory that is obtained +via pcre_malloc is returned. This contains the compiled code and related +data. The pcre type is defined for the returned block; this is a typedef +for a structure whose contents are not externally defined. It is up to the +caller to free the memory (via pcre_free) when it is no longer required. +

+

+Although the compiled code of a PCRE regex is relocatable, that is, it does not +depend on memory location, the complete pcre data block is not +fully relocatable, because it may contain a copy of the tableptr +argument, which is an address (see below). +

+

+The options argument contains various bit settings that affect the +compilation. It should be zero if no options are required. The available +options are described below. Some of them (in particular, those that are +compatible with Perl, but some others as well) can also be set and unset from +within the pattern (see the detailed description in the +pcrepattern +documentation). For those options that can be different in different parts of +the pattern, the contents of the options argument specifies their +settings at the start of compilation and execution. The PCRE_ANCHORED, +PCRE_BSR_xxx, PCRE_NEWLINE_xxx, PCRE_NO_UTF8_CHECK, and +PCRE_NO_START_OPTIMIZE options can be set at the time of matching as well as at +compile time. +

+

+If errptr is NULL, pcre_compile() returns NULL immediately. +Otherwise, if compilation of a pattern fails, pcre_compile() returns +NULL, and sets the variable pointed to by errptr to point to a textual +error message. This is a static string that is part of the library. You must +not try to free it. Normally, the offset from the start of the pattern to the +data unit that was being processed when the error was discovered is placed in +the variable pointed to by erroffset, which must not be NULL (if it is, +an immediate error is given). However, for an invalid UTF-8 or UTF-16 string, +the offset is that of the first data unit of the failing character. +

+

+Some errors are not detected until the whole pattern has been scanned; in these +cases, the offset passed back is the length of the pattern. Note that the +offset is in data units, not characters, even in a UTF mode. It may sometimes +point into the middle of a UTF-8 or UTF-16 character. +

+

+If pcre_compile2() is used instead of pcre_compile(), and the +errorcodeptr argument is not NULL, a non-zero error code number is +returned via this argument in the event of an error. This is in addition to the +textual error message. Error codes and messages are listed below. +

+

+If the final argument, tableptr, is NULL, PCRE uses a default set of +character tables that are built when PCRE is compiled, using the default C +locale. Otherwise, tableptr must be an address that is the result of a +call to pcre_maketables(). This value is stored with the compiled +pattern, and used again by pcre_exec() and pcre_dfa_exec() when the +pattern is matched. For more discussion, see the section on locale support +below. +

+

+This code fragment shows a typical straightforward call to pcre_compile(): +

+  pcre *re;
+  const char *error;
+  int erroffset;
+  re = pcre_compile(
+    "^A.*Z",          /* the pattern */
+    0,                /* default options */
+    &error,           /* for error message */
+    &erroffset,       /* for error offset */
+    NULL);            /* use default character tables */
+
+The following names for option bits are defined in the pcre.h header +file: +
+  PCRE_ANCHORED
+
+If this bit is set, the pattern is forced to be "anchored", that is, it is +constrained to match only at the first matching point in the string that is +being searched (the "subject string"). This effect can also be achieved by +appropriate constructs in the pattern itself, which is the only way to do it in +Perl. +
+  PCRE_AUTO_CALLOUT
+
+If this bit is set, pcre_compile() automatically inserts callout items, +all with number 255, before each pattern item. For discussion of the callout +facility, see the +pcrecallout +documentation. +
+  PCRE_BSR_ANYCRLF
+  PCRE_BSR_UNICODE
+
+These options (which are mutually exclusive) control what the \R escape +sequence matches. The choice is either to match only CR, LF, or CRLF, or to +match any Unicode newline sequence. The default is specified when PCRE is +built. It can be overridden from within the pattern, or by setting an option +when a compiled pattern is matched. +
+  PCRE_CASELESS
+
+If this bit is set, letters in the pattern match both upper and lower case +letters. It is equivalent to Perl's /i option, and it can be changed within a +pattern by a (?i) option setting. In UTF-8 mode, PCRE always understands the +concept of case for characters whose values are less than 128, so caseless +matching is always possible. For characters with higher values, the concept of +case is supported if PCRE is compiled with Unicode property support, but not +otherwise. If you want to use caseless matching for characters 128 and above, +you must ensure that PCRE is compiled with Unicode property support as well as +with UTF-8 support. +
+  PCRE_DOLLAR_ENDONLY
+
+If this bit is set, a dollar metacharacter in the pattern matches only at the +end of the subject string. Without this option, a dollar also matches +immediately before a newline at the end of the string (but not before any other +newlines). The PCRE_DOLLAR_ENDONLY option is ignored if PCRE_MULTILINE is set. +There is no equivalent to this option in Perl, and no way to set it within a +pattern. +
+  PCRE_DOTALL
+
+If this bit is set, a dot metacharacter in the pattern matches a character of +any value, including one that indicates a newline. However, it only ever +matches one character, even if newlines are coded as CRLF. Without this option, +a dot does not match when the current position is at a newline. This option is +equivalent to Perl's /s option, and it can be changed within a pattern by a +(?s) option setting. A negative class such as [^a] always matches newline +characters, independent of the setting of this option. +
+  PCRE_DUPNAMES
+
+If this bit is set, names used to identify capturing subpatterns need not be +unique. This can be helpful for certain types of pattern when it is known that +only one instance of the named subpattern can ever be matched. There are more +details of named subpatterns below; see also the +pcrepattern +documentation. +
+  PCRE_EXTENDED
+
+If this bit is set, most white space characters in the pattern are totally +ignored except when escaped or inside a character class. However, white space +is not allowed within sequences such as (?> that introduce various +parenthesized subpatterns, nor within a numerical quantifier such as {1,3}. +However, ignorable white space is permitted between an item and a following +quantifier and between a quantifier and a following + that indicates +possessiveness. +

+

+White space did not used to include the VT character (code 11), because Perl +did not treat this character as white space. However, Perl changed at release +5.18, so PCRE followed at release 8.34, and VT is now treated as white space. +

+

+PCRE_EXTENDED also causes characters between an unescaped # outside a character +class and the next newline, inclusive, to be ignored. PCRE_EXTENDED is +equivalent to Perl's /x option, and it can be changed within a pattern by a +(?x) option setting. +

+

+Which characters are interpreted as newlines is controlled by the options +passed to pcre_compile() or by a special sequence at the start of the +pattern, as described in the section entitled +"Newline conventions" +in the pcrepattern documentation. Note that the end of this type of +comment is a literal newline sequence in the pattern; escape sequences that +happen to represent a newline do not count. +

+

+This option makes it possible to include comments inside complicated patterns. +Note, however, that this applies only to data characters. White space characters +may never appear within special character sequences in a pattern, for example +within the sequence (?( that introduces a conditional subpattern. +

+  PCRE_EXTRA
+
+This option was invented in order to turn on additional functionality of PCRE +that is incompatible with Perl, but it is currently of very little use. When +set, any backslash in a pattern that is followed by a letter that has no +special meaning causes an error, thus reserving these combinations for future +expansion. By default, as in Perl, a backslash followed by a letter with no +special meaning is treated as a literal. (Perl can, however, be persuaded to +give an error for this, by running it with the -w option.) There are at present +no other features controlled by this option. It can also be set by a (?X) +option setting within a pattern. +
+  PCRE_FIRSTLINE
+
+If this option is set, an unanchored pattern is required to match before or at +the first newline in the subject string, though the matched text may continue +over the newline. +
+  PCRE_JAVASCRIPT_COMPAT
+
+If this option is set, PCRE's behaviour is changed in some ways so that it is +compatible with JavaScript rather than Perl. The changes are as follows: +

+

+(1) A lone closing square bracket in a pattern causes a compile-time error, +because this is illegal in JavaScript (by default it is treated as a data +character). Thus, the pattern AB]CD becomes illegal when this option is set. +

+

+(2) At run time, a back reference to an unset subpattern group matches an empty +string (by default this causes the current matching alternative to fail). A +pattern such as (\1)(a) succeeds when this option is set (assuming it can find +an "a" in the subject), whereas it fails by default, for Perl compatibility. +

+

+(3) \U matches an upper case "U" character; by default \U causes a compile +time error (Perl uses \U to upper case subsequent characters). +

+

+(4) \u matches a lower case "u" character unless it is followed by four +hexadecimal digits, in which case the hexadecimal number defines the code point +to match. By default, \u causes a compile time error (Perl uses it to upper +case the following character). +

+

+(5) \x matches a lower case "x" character unless it is followed by two +hexadecimal digits, in which case the hexadecimal number defines the code point +to match. By default, as in Perl, a hexadecimal number is always expected after +\x, but it may have zero, one, or two digits (so, for example, \xz matches a +binary zero character followed by z). +

+  PCRE_MULTILINE
+
+By default, for the purposes of matching "start of line" and "end of line", +PCRE treats the subject string as consisting of a single line of characters, +even if it actually contains newlines. The "start of line" metacharacter (^) +matches only at the start of the string, and the "end of line" metacharacter +($) matches only at the end of the string, or before a terminating newline +(except when PCRE_DOLLAR_ENDONLY is set). Note, however, that unless +PCRE_DOTALL is set, the "any character" metacharacter (.) does not match at a +newline. This behaviour (for ^, $, and dot) is the same as Perl. +

+

+When PCRE_MULTILINE it is set, the "start of line" and "end of line" constructs +match immediately following or immediately before internal newlines in the +subject string, respectively, as well as at the very start and end. This is +equivalent to Perl's /m option, and it can be changed within a pattern by a +(?m) option setting. If there are no newlines in a subject string, or no +occurrences of ^ or $ in a pattern, setting PCRE_MULTILINE has no effect. +

+  PCRE_NEVER_UTF
+
+This option locks out interpretation of the pattern as UTF-8 (or UTF-16 or +UTF-32 in the 16-bit and 32-bit libraries). In particular, it prevents the +creator of the pattern from switching to UTF interpretation by starting the +pattern with (*UTF). This may be useful in applications that process patterns +from external sources. The combination of PCRE_UTF8 and PCRE_NEVER_UTF also +causes an error. +
+  PCRE_NEWLINE_CR
+  PCRE_NEWLINE_LF
+  PCRE_NEWLINE_CRLF
+  PCRE_NEWLINE_ANYCRLF
+  PCRE_NEWLINE_ANY
+
+These options override the default newline definition that was chosen when PCRE +was built. Setting the first or the second specifies that a newline is +indicated by a single character (CR or LF, respectively). Setting +PCRE_NEWLINE_CRLF specifies that a newline is indicated by the two-character +CRLF sequence. Setting PCRE_NEWLINE_ANYCRLF specifies that any of the three +preceding sequences should be recognized. Setting PCRE_NEWLINE_ANY specifies +that any Unicode newline sequence should be recognized. +

+

+In an ASCII/Unicode environment, the Unicode newline sequences are the three +just mentioned, plus the single characters VT (vertical tab, U+000B), FF (form +feed, U+000C), NEL (next line, U+0085), LS (line separator, U+2028), and PS +(paragraph separator, U+2029). For the 8-bit library, the last two are +recognized only in UTF-8 mode. +

+

+When PCRE is compiled to run in an EBCDIC (mainframe) environment, the code for +CR is 0x0d, the same as ASCII. However, the character code for LF is normally +0x15, though in some EBCDIC environments 0x25 is used. Whichever of these is +not LF is made to correspond to Unicode's NEL character. EBCDIC codes are all +less than 256. For more details, see the +pcrebuild +documentation. +

+

+The newline setting in the options word uses three bits that are treated +as a number, giving eight possibilities. Currently only six are used (default +plus the five values above). This means that if you set more than one newline +option, the combination may or may not be sensible. For example, +PCRE_NEWLINE_CR with PCRE_NEWLINE_LF is equivalent to PCRE_NEWLINE_CRLF, but +other combinations may yield unused numbers and cause an error. +

+

+The only time that a line break in a pattern is specially recognized when +compiling is when PCRE_EXTENDED is set. CR and LF are white space characters, +and so are ignored in this mode. Also, an unescaped # outside a character class +indicates a comment that lasts until after the next line break sequence. In +other circumstances, line break sequences in patterns are treated as literal +data. +

+

+The newline option that is set at compile time becomes the default that is used +for pcre_exec() and pcre_dfa_exec(), but it can be overridden. +

+  PCRE_NO_AUTO_CAPTURE
+
+If this option is set, it disables the use of numbered capturing parentheses in +the pattern. Any opening parenthesis that is not followed by ? behaves as if it +were followed by ?: but named parentheses can still be used for capturing (and +they acquire numbers in the usual way). There is no equivalent of this option +in Perl. +
+  PCRE_NO_AUTO_POSSESS
+
+If this option is set, it disables "auto-possessification". This is an +optimization that, for example, turns a+b into a++b in order to avoid +backtracks into a+ that can never be successful. However, if callouts are in +use, auto-possessification means that some of them are never taken. You can set +this option if you want the matching functions to do a full unoptimized search +and run all the callouts, but it is mainly provided for testing purposes. +
+  PCRE_NO_START_OPTIMIZE
+
+This is an option that acts at matching time; that is, it is really an option +for pcre_exec() or pcre_dfa_exec(). If it is set at compile time, +it is remembered with the compiled pattern and assumed at matching time. This +is necessary if you want to use JIT execution, because the JIT compiler needs +to know whether or not this option is set. For details see the discussion of +PCRE_NO_START_OPTIMIZE +below. +
+  PCRE_UCP
+
+This option changes the way PCRE processes \B, \b, \D, \d, \S, \s, \W, +\w, and some of the POSIX character classes. By default, only ASCII characters +are recognized, but if PCRE_UCP is set, Unicode properties are used instead to +classify characters. More details are given in the section on +generic character types +in the +pcrepattern +page. If you set PCRE_UCP, matching one of the items it affects takes much +longer. The option is available only if PCRE has been compiled with Unicode +property support. +
+  PCRE_UNGREEDY
+
+This option inverts the "greediness" of the quantifiers so that they are not +greedy by default, but become greedy if followed by "?". It is not compatible +with Perl. It can also be set by a (?U) option setting within the pattern. +
+  PCRE_UTF8
+
+This option causes PCRE to regard both the pattern and the subject as strings +of UTF-8 characters instead of single-byte strings. However, it is available +only when PCRE is built to include UTF support. If not, the use of this option +provokes an error. Details of how this option changes the behaviour of PCRE are +given in the +pcreunicode +page. +
+  PCRE_NO_UTF8_CHECK
+
+When PCRE_UTF8 is set, the validity of the pattern as a UTF-8 string is +automatically checked. There is a discussion about the +validity of UTF-8 strings +in the +pcreunicode +page. If an invalid UTF-8 sequence is found, pcre_compile() returns an +error. If you already know that your pattern is valid, and you want to skip +this check for performance reasons, you can set the PCRE_NO_UTF8_CHECK option. +When it is set, the effect of passing an invalid UTF-8 string as a pattern is +undefined. It may cause your program to crash or loop. Note that this option +can also be passed to pcre_exec() and pcre_dfa_exec(), to suppress +the validity checking of subject strings only. If the same string is being +matched many times, the option can be safely set for the second and subsequent +matchings to improve performance. +

+
COMPILATION ERROR CODES
+

+The following table lists the error codes than may be returned by +pcre_compile2(), along with the error messages that may be returned by +both compiling functions. Note that error messages are always 8-bit ASCII +strings, even in 16-bit or 32-bit mode. As PCRE has developed, some error codes +have fallen out of use. To avoid confusion, they have not been re-used. +

+   0  no error
+   1  \ at end of pattern
+   2  \c at end of pattern
+   3  unrecognized character follows \
+   4  numbers out of order in {} quantifier
+   5  number too big in {} quantifier
+   6  missing terminating ] for character class
+   7  invalid escape sequence in character class
+   8  range out of order in character class
+   9  nothing to repeat
+  10  [this code is not in use]
+  11  internal error: unexpected repeat
+  12  unrecognized character after (? or (?-
+  13  POSIX named classes are supported only within a class
+  14  missing )
+  15  reference to non-existent subpattern
+  16  erroffset passed as NULL
+  17  unknown option bit(s) set
+  18  missing ) after comment
+  19  [this code is not in use]
+  20  regular expression is too large
+  21  failed to get memory
+  22  unmatched parentheses
+  23  internal error: code overflow
+  24  unrecognized character after (?<
+  25  lookbehind assertion is not fixed length
+  26  malformed number or name after (?(
+  27  conditional group contains more than two branches
+  28  assertion expected after (?(
+  29  (?R or (?[+-]digits must be followed by )
+  30  unknown POSIX class name
+  31  POSIX collating elements are not supported
+  32  this version of PCRE is compiled without UTF support
+  33  [this code is not in use]
+  34  character value in \x{} or \o{} is too large
+  35  invalid condition (?(0)
+  36  \C not allowed in lookbehind assertion
+  37  PCRE does not support \L, \l, \N{name}, \U, or \u
+  38  number after (?C is > 255
+  39  closing ) for (?C expected
+  40  recursive call could loop indefinitely
+  41  unrecognized character after (?P
+  42  syntax error in subpattern name (missing terminator)
+  43  two named subpatterns have the same name
+  44  invalid UTF-8 string (specifically UTF-8)
+  45  support for \P, \p, and \X has not been compiled
+  46  malformed \P or \p sequence
+  47  unknown property name after \P or \p
+  48  subpattern name is too long (maximum 32 characters)
+  49  too many named subpatterns (maximum 10000)
+  50  [this code is not in use]
+  51  octal value is greater than \377 in 8-bit non-UTF-8 mode
+  52  internal error: overran compiling workspace
+  53  internal error: previously-checked referenced subpattern
+        not found
+  54  DEFINE group contains more than one branch
+  55  repeating a DEFINE group is not allowed
+  56  inconsistent NEWLINE options
+  57  \g is not followed by a braced, angle-bracketed, or quoted
+        name/number or by a plain number
+  58  a numbered reference must not be zero
+  59  an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)
+  60  (*VERB) not recognized or malformed
+  61  number is too big
+  62  subpattern name expected
+  63  digit expected after (?+
+  64  ] is an invalid data character in JavaScript compatibility mode
+  65  different names for subpatterns of the same number are
+        not allowed
+  66  (*MARK) must have an argument
+  67  this version of PCRE is not compiled with Unicode property
+        support
+  68  \c must be followed by an ASCII character
+  69  \k is not followed by a braced, angle-bracketed, or quoted name
+  70  internal error: unknown opcode in find_fixedlength()
+  71  \N is not supported in a class
+  72  too many forward references
+  73  disallowed Unicode code point (>= 0xd800 && <= 0xdfff)
+  74  invalid UTF-16 string (specifically UTF-16)
+  75  name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)
+  76  character value in \u.... sequence is too large
+  77  invalid UTF-32 string (specifically UTF-32)
+  78  setting UTF is disabled by the application
+  79  non-hex character in \x{} (closing brace missing?)
+  80  non-octal character in \o{} (closing brace missing?)
+  81  missing opening brace after \o
+  82  parentheses are too deeply nested
+  83  invalid range in character class
+  84  group name must start with a non-digit
+  85  parentheses are too deeply nested (stack check)
+
+The numbers 32 and 10000 in errors 48 and 49 are defaults; different values may +be used if the limits were changed when PCRE was built. +

+
STUDYING A PATTERN
+

+pcre_extra *pcre_study(const pcre *code, int options, + const char **errptr); +

+

+If a compiled pattern is going to be used several times, it is worth spending +more time analyzing it in order to speed up the time taken for matching. The +function pcre_study() takes a pointer to a compiled pattern as its first +argument. If studying the pattern produces additional information that will +help speed up matching, pcre_study() returns a pointer to a +pcre_extra block, in which the study_data field points to the +results of the study. +

+

+The returned value from pcre_study() can be passed directly to +pcre_exec() or pcre_dfa_exec(). However, a pcre_extra block +also contains other fields that can be set by the caller before the block is +passed; these are described +below +in the section on matching a pattern. +

+

+If studying the pattern does not produce any useful information, +pcre_study() returns NULL by default. In that circumstance, if the +calling program wants to pass any of the other fields to pcre_exec() or +pcre_dfa_exec(), it must set up its own pcre_extra block. However, +if pcre_study() is called with the PCRE_STUDY_EXTRA_NEEDED option, it +returns a pcre_extra block even if studying did not find any additional +information. It may still return NULL, however, if an error occurs in +pcre_study(). +

+

+The second argument of pcre_study() contains option bits. There are three +further options in addition to PCRE_STUDY_EXTRA_NEEDED: +

+  PCRE_STUDY_JIT_COMPILE
+  PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE
+  PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE
+
+If any of these are set, and the just-in-time compiler is available, the +pattern is further compiled into machine code that executes much faster than +the pcre_exec() interpretive matching function. If the just-in-time +compiler is not available, these options are ignored. All undefined bits in the +options argument must be zero. +

+

+JIT compilation is a heavyweight optimization. It can take some time for +patterns to be analyzed, and for one-off matches and simple patterns the +benefit of faster execution might be offset by a much slower study time. +Not all patterns can be optimized by the JIT compiler. For those that cannot be +handled, matching automatically falls back to the pcre_exec() +interpreter. For more details, see the +pcrejit +documentation. +

+

+The third argument for pcre_study() is a pointer for an error message. If +studying succeeds (even if no data is returned), the variable it points to is +set to NULL. Otherwise it is set to point to a textual error message. This is a +static string that is part of the library. You must not try to free it. You +should test the error pointer for NULL after calling pcre_study(), to be +sure that it has run successfully. +

+

+When you are finished with a pattern, you can free the memory used for the +study data by calling pcre_free_study(). This function was added to the +API for release 8.20. For earlier versions, the memory could be freed with +pcre_free(), just like the pattern itself. This will still work in cases +where JIT optimization is not used, but it is advisable to change to the new +function when convenient. +

+

+This is a typical way in which pcre_study() is used (except that in a +real application there should be tests for errors): +

+  int rc;
+  pcre *re;
+  pcre_extra *sd;
+  re = pcre_compile("pattern", 0, &error, &erroroffset, NULL);
+  sd = pcre_study(
+    re,             /* result of pcre_compile() */
+    0,              /* no options */
+    &error);        /* set to NULL or points to a message */
+  rc = pcre_exec(   /* see below for details of pcre_exec() options */
+    re, sd, "subject", 7, 0, 0, ovector, 30);
+  ...
+  pcre_free_study(sd);
+  pcre_free(re);
+
+Studying a pattern does two things: first, a lower bound for the length of +subject string that is needed to match the pattern is computed. This does not +mean that there are any strings of that length that match, but it does +guarantee that no shorter strings match. The value is used to avoid wasting +time by trying to match strings that are shorter than the lower bound. You can +find out the value in a calling program via the pcre_fullinfo() function. +

+

+Studying a pattern is also useful for non-anchored patterns that do not have a +single fixed starting character. A bitmap of possible starting bytes is +created. This speeds up finding a position in the subject at which to start +matching. (In 16-bit mode, the bitmap is used for 16-bit values less than 256. +In 32-bit mode, the bitmap is used for 32-bit values less than 256.) +

+

+These two optimizations apply to both pcre_exec() and +pcre_dfa_exec(), and the information is also used by the JIT compiler. +The optimizations can be disabled by setting the PCRE_NO_START_OPTIMIZE option. +You might want to do this if your pattern contains callouts or (*MARK) and you +want to make use of these facilities in cases where matching fails. +

+

+PCRE_NO_START_OPTIMIZE can be specified at either compile time or execution +time. However, if PCRE_NO_START_OPTIMIZE is passed to pcre_exec(), (that +is, after any JIT compilation has happened) JIT execution is disabled. For JIT +execution to work with PCRE_NO_START_OPTIMIZE, the option must be set at +compile time. +

+

+There is a longer discussion of PCRE_NO_START_OPTIMIZE +below. +

+
LOCALE SUPPORT
+

+PCRE handles caseless matching, and determines whether characters are letters, +digits, or whatever, by reference to a set of tables, indexed by character +code point. When running in UTF-8 mode, or in the 16- or 32-bit libraries, this +applies only to characters with code points less than 256. By default, +higher-valued code points never match escapes such as \w or \d. However, if +PCRE is built with Unicode property support, all characters can be tested with +\p and \P, or, alternatively, the PCRE_UCP option can be set when a pattern +is compiled; this causes \w and friends to use Unicode property support +instead of the built-in tables. +

+

+The use of locales with Unicode is discouraged. If you are handling characters +with code points greater than 128, you should either use Unicode support, or +use locales, but not try to mix the two. +

+

+PCRE contains an internal set of tables that are used when the final argument +of pcre_compile() is NULL. These are sufficient for many applications. +Normally, the internal tables recognize only ASCII characters. However, when +PCRE is built, it is possible to cause the internal tables to be rebuilt in the +default "C" locale of the local system, which may cause them to be different. +

+

+The internal tables can always be overridden by tables supplied by the +application that calls PCRE. These may be created in a different locale from +the default. As more and more applications change to using Unicode, the need +for this locale support is expected to die away. +

+

+External tables are built by calling the pcre_maketables() function, +which has no arguments, in the relevant locale. The result can then be passed +to pcre_compile() as often as necessary. For example, to build and use +tables that are appropriate for the French locale (where accented characters +with values greater than 128 are treated as letters), the following code could +be used: +

+  setlocale(LC_CTYPE, "fr_FR");
+  tables = pcre_maketables();
+  re = pcre_compile(..., tables);
+
+The locale name "fr_FR" is used on Linux and other Unix-like systems; if you +are using Windows, the name for the French locale is "french". +

+

+When pcre_maketables() runs, the tables are built in memory that is +obtained via pcre_malloc. It is the caller's responsibility to ensure +that the memory containing the tables remains available for as long as it is +needed. +

+

+The pointer that is passed to pcre_compile() is saved with the compiled +pattern, and the same tables are used via this pointer by pcre_study() +and also by pcre_exec() and pcre_dfa_exec(). Thus, for any single +pattern, compilation, studying and matching all happen in the same locale, but +different patterns can be processed in different locales. +

+

+It is possible to pass a table pointer or NULL (indicating the use of the +internal tables) to pcre_exec() or pcre_dfa_exec() (see the +discussion below in the section on matching a pattern). This facility is +provided for use with pre-compiled patterns that have been saved and reloaded. +Character tables are not saved with patterns, so if a non-standard table was +used at compile time, it must be provided again when the reloaded pattern is +matched. Attempting to use this facility to match a pattern in a different +locale from the one in which it was compiled is likely to lead to anomalous +(usually incorrect) results. +

+
INFORMATION ABOUT A PATTERN
+

+int pcre_fullinfo(const pcre *code, const pcre_extra *extra, + int what, void *where); +

+

+The pcre_fullinfo() function returns information about a compiled +pattern. It replaces the pcre_info() function, which was removed from the +library at version 8.30, after more than 10 years of obsolescence. +

+

+The first argument for pcre_fullinfo() is a pointer to the compiled +pattern. The second argument is the result of pcre_study(), or NULL if +the pattern was not studied. The third argument specifies which piece of +information is required, and the fourth argument is a pointer to a variable +to receive the data. The yield of the function is zero for success, or one of +the following negative numbers: +

+  PCRE_ERROR_NULL           the argument code was NULL
+                            the argument where was NULL
+  PCRE_ERROR_BADMAGIC       the "magic number" was not found
+  PCRE_ERROR_BADENDIANNESS  the pattern was compiled with different
+                            endianness
+  PCRE_ERROR_BADOPTION      the value of what was invalid
+  PCRE_ERROR_UNSET          the requested field is not set
+
+The "magic number" is placed at the start of each compiled pattern as a simple +check against passing an arbitrary memory pointer. The endianness error can +occur if a compiled pattern is saved and reloaded on a different host. Here is +a typical call of pcre_fullinfo(), to obtain the length of the compiled +pattern: +
+  int rc;
+  size_t length;
+  rc = pcre_fullinfo(
+    re,               /* result of pcre_compile() */
+    sd,               /* result of pcre_study(), or NULL */
+    PCRE_INFO_SIZE,   /* what is required */
+    &length);         /* where to put the data */
+
+The possible values for the third argument are defined in pcre.h, and are +as follows: +
+  PCRE_INFO_BACKREFMAX
+
+Return the number of the highest back reference in the pattern. The fourth +argument should point to an int variable. Zero is returned if there are +no back references. +
+  PCRE_INFO_CAPTURECOUNT
+
+Return the number of capturing subpatterns in the pattern. The fourth argument +should point to an int variable. +
+  PCRE_INFO_DEFAULT_TABLES
+
+Return a pointer to the internal default character tables within PCRE. The +fourth argument should point to an unsigned char * variable. This +information call is provided for internal use by the pcre_study() +function. External callers can cause PCRE to use its internal tables by passing +a NULL table pointer. +
+  PCRE_INFO_FIRSTBYTE (deprecated)
+
+Return information about the first data unit of any matched string, for a +non-anchored pattern. The name of this option refers to the 8-bit library, +where data units are bytes. The fourth argument should point to an int +variable. Negative values are used for special cases. However, this means that +when the 32-bit library is in non-UTF-32 mode, the full 32-bit range of +characters cannot be returned. For this reason, this value is deprecated; use +PCRE_INFO_FIRSTCHARACTERFLAGS and PCRE_INFO_FIRSTCHARACTER instead. +

+

+If there is a fixed first value, for example, the letter "c" from a pattern +such as (cat|cow|coyote), its value is returned. In the 8-bit library, the +value is always less than 256. In the 16-bit library the value can be up to +0xffff. In the 32-bit library the value can be up to 0x10ffff. +

+

+If there is no fixed first value, and if either +
+
+(a) the pattern was compiled with the PCRE_MULTILINE option, and every branch +starts with "^", or +
+
+(b) every branch of the pattern starts with ".*" and PCRE_DOTALL is not set +(if it were set, the pattern would be anchored), +
+
+-1 is returned, indicating that the pattern matches only at the start of a +subject string or after any newline within the string. Otherwise -2 is +returned. For anchored patterns, -2 is returned. +

+  PCRE_INFO_FIRSTCHARACTER
+
+Return the value of the first data unit (non-UTF character) of any matched +string in the situation where PCRE_INFO_FIRSTCHARACTERFLAGS returns 1; +otherwise return 0. The fourth argument should point to a uint_t +variable. +

+

+In the 8-bit library, the value is always less than 256. In the 16-bit library +the value can be up to 0xffff. In the 32-bit library in UTF-32 mode the value +can be up to 0x10ffff, and up to 0xffffffff when not using UTF-32 mode. +

+  PCRE_INFO_FIRSTCHARACTERFLAGS
+
+Return information about the first data unit of any matched string, for a +non-anchored pattern. The fourth argument should point to an int +variable. +

+

+If there is a fixed first value, for example, the letter "c" from a pattern +such as (cat|cow|coyote), 1 is returned, and the character value can be +retrieved using PCRE_INFO_FIRSTCHARACTER. If there is no fixed first value, and +if either +
+
+(a) the pattern was compiled with the PCRE_MULTILINE option, and every branch +starts with "^", or +
+
+(b) every branch of the pattern starts with ".*" and PCRE_DOTALL is not set +(if it were set, the pattern would be anchored), +
+
+2 is returned, indicating that the pattern matches only at the start of a +subject string or after any newline within the string. Otherwise 0 is +returned. For anchored patterns, 0 is returned. +

+  PCRE_INFO_FIRSTTABLE
+
+If the pattern was studied, and this resulted in the construction of a 256-bit +table indicating a fixed set of values for the first data unit in any matching +string, a pointer to the table is returned. Otherwise NULL is returned. The +fourth argument should point to an unsigned char * variable. +
+  PCRE_INFO_HASCRORLF
+
+Return 1 if the pattern contains any explicit matches for CR or LF characters, +otherwise 0. The fourth argument should point to an int variable. An +explicit match is either a literal CR or LF character, or \r or \n. +
+  PCRE_INFO_JCHANGED
+
+Return 1 if the (?J) or (?-J) option setting is used in the pattern, otherwise +0. The fourth argument should point to an int variable. (?J) and +(?-J) set and unset the local PCRE_DUPNAMES option, respectively. +
+  PCRE_INFO_JIT
+
+Return 1 if the pattern was studied with one of the JIT options, and +just-in-time compiling was successful. The fourth argument should point to an +int variable. A return value of 0 means that JIT support is not available +in this version of PCRE, or that the pattern was not studied with a JIT option, +or that the JIT compiler could not handle this particular pattern. See the +pcrejit +documentation for details of what can and cannot be handled. +
+  PCRE_INFO_JITSIZE
+
+If the pattern was successfully studied with a JIT option, return the size of +the JIT compiled code, otherwise return zero. The fourth argument should point +to a size_t variable. +
+  PCRE_INFO_LASTLITERAL
+
+Return the value of the rightmost literal data unit that must exist in any +matched string, other than at its start, if such a value has been recorded. The +fourth argument should point to an int variable. If there is no such +value, -1 is returned. For anchored patterns, a last literal value is recorded +only if it follows something of variable length. For example, for the pattern +/^a\d+z\d+/ the returned value is "z", but for /^a\dz\d/ the returned value +is -1. +

+

+Since for the 32-bit library using the non-UTF-32 mode, this function is unable +to return the full 32-bit range of characters, this value is deprecated; +instead the PCRE_INFO_REQUIREDCHARFLAGS and PCRE_INFO_REQUIREDCHAR values should +be used. +

+  PCRE_INFO_MATCH_EMPTY
+
+Return 1 if the pattern can match an empty string, otherwise 0. The fourth +argument should point to an int variable. +
+  PCRE_INFO_MATCHLIMIT
+
+If the pattern set a match limit by including an item of the form +(*LIMIT_MATCH=nnnn) at the start, the value is returned. The fourth argument +should point to an unsigned 32-bit integer. If no such value has been set, the +call to pcre_fullinfo() returns the error PCRE_ERROR_UNSET. +
+  PCRE_INFO_MAXLOOKBEHIND
+
+Return the number of characters (NB not data units) in the longest lookbehind +assertion in the pattern. This information is useful when doing multi-segment +matching using the partial matching facilities. Note that the simple assertions +\b and \B require a one-character lookbehind. \A also registers a +one-character lookbehind, though it does not actually inspect the previous +character. This is to ensure that at least one character from the old segment +is retained when a new segment is processed. Otherwise, if there are no +lookbehinds in the pattern, \A might match incorrectly at the start of a new +segment. +
+  PCRE_INFO_MINLENGTH
+
+If the pattern was studied and a minimum length for matching subject strings +was computed, its value is returned. Otherwise the returned value is -1. The +value is a number of characters, which in UTF mode may be different from the +number of data units. The fourth argument should point to an int +variable. A non-negative value is a lower bound to the length of any matching +string. There may not be any strings of that length that do actually match, but +every string that does match is at least that long. +
+  PCRE_INFO_NAMECOUNT
+  PCRE_INFO_NAMEENTRYSIZE
+  PCRE_INFO_NAMETABLE
+
+PCRE supports the use of named as well as numbered capturing parentheses. The +names are just an additional way of identifying the parentheses, which still +acquire numbers. Several convenience functions such as +pcre_get_named_substring() are provided for extracting captured +substrings by name. It is also possible to extract the data directly, by first +converting the name to a number in order to access the correct pointers in the +output vector (described with pcre_exec() below). To do the conversion, +you need to use the name-to-number map, which is described by these three +values. +

+

+The map consists of a number of fixed-size entries. PCRE_INFO_NAMECOUNT gives +the number of entries, and PCRE_INFO_NAMEENTRYSIZE gives the size of each +entry; both of these return an int value. The entry size depends on the +length of the longest name. PCRE_INFO_NAMETABLE returns a pointer to the first +entry of the table. This is a pointer to char in the 8-bit library, where +the first two bytes of each entry are the number of the capturing parenthesis, +most significant byte first. In the 16-bit library, the pointer points to +16-bit data units, the first of which contains the parenthesis number. In the +32-bit library, the pointer points to 32-bit data units, the first of which +contains the parenthesis number. The rest of the entry is the corresponding +name, zero terminated. +

+

+The names are in alphabetical order. If (?| is used to create multiple groups +with the same number, as described in the +section on duplicate subpattern numbers +in the +pcrepattern +page, the groups may be given the same name, but there is only one entry in the +table. Different names for groups of the same number are not permitted. +Duplicate names for subpatterns with different numbers are permitted, +but only if PCRE_DUPNAMES is set. They appear in the table in the order in +which they were found in the pattern. In the absence of (?| this is the order +of increasing number; when (?| is used this is not necessarily the case because +later subpatterns may have lower numbers. +

+

+As a simple example of the name/number table, consider the following pattern +after compilation by the 8-bit library (assume PCRE_EXTENDED is set, so white +space - including newlines - is ignored): +

+  (?<date> (?<year>(\d\d)?\d\d) - (?<month>\d\d) - (?<day>\d\d) )
+
+There are four named subpatterns, so the table has four entries, and each entry +in the table is eight bytes long. The table is as follows, with non-printing +bytes shows in hexadecimal, and undefined bytes shown as ??: +
+  00 01 d  a  t  e  00 ??
+  00 05 d  a  y  00 ?? ??
+  00 04 m  o  n  t  h  00
+  00 02 y  e  a  r  00 ??
+
+When writing code to extract data from named subpatterns using the +name-to-number map, remember that the length of the entries is likely to be +different for each compiled pattern. +
+  PCRE_INFO_OKPARTIAL
+
+Return 1 if the pattern can be used for partial matching with +pcre_exec(), otherwise 0. The fourth argument should point to an +int variable. From release 8.00, this always returns 1, because the +restrictions that previously applied to partial matching have been lifted. The +pcrepartial +documentation gives details of partial matching. +
+  PCRE_INFO_OPTIONS
+
+Return a copy of the options with which the pattern was compiled. The fourth +argument should point to an unsigned long int variable. These option bits +are those specified in the call to pcre_compile(), modified by any +top-level option settings at the start of the pattern itself. In other words, +they are the options that will be in force when matching starts. For example, +if the pattern /(?im)abc(?-i)d/ is compiled with the PCRE_EXTENDED option, the +result is PCRE_CASELESS, PCRE_MULTILINE, and PCRE_EXTENDED. +

+

+A pattern is automatically anchored by PCRE if all of its top-level +alternatives begin with one of the following: +

+  ^     unless PCRE_MULTILINE is set
+  \A    always
+  \G    always
+  .*    if PCRE_DOTALL is set and there are no back references to the subpattern in which .* appears
+
+For such patterns, the PCRE_ANCHORED bit is set in the options returned by +pcre_fullinfo(). +
+  PCRE_INFO_RECURSIONLIMIT
+
+If the pattern set a recursion limit by including an item of the form +(*LIMIT_RECURSION=nnnn) at the start, the value is returned. The fourth +argument should point to an unsigned 32-bit integer. If no such value has been +set, the call to pcre_fullinfo() returns the error PCRE_ERROR_UNSET. +
+  PCRE_INFO_SIZE
+
+Return the size of the compiled pattern in bytes (for all three libraries). The +fourth argument should point to a size_t variable. This value does not +include the size of the pcre structure that is returned by +pcre_compile(). The value that is passed as the argument to +pcre_malloc() when pcre_compile() is getting memory in which to +place the compiled data is the value returned by this option plus the size of +the pcre structure. Studying a compiled pattern, with or without JIT, +does not alter the value returned by this option. +
+  PCRE_INFO_STUDYSIZE
+
+Return the size in bytes (for all three libraries) of the data block pointed to +by the study_data field in a pcre_extra block. If pcre_extra +is NULL, or there is no study data, zero is returned. The fourth argument +should point to a size_t variable. The study_data field is set by +pcre_study() to record information that will speed up matching (see the +section entitled +"Studying a pattern" +above). The format of the study_data block is private, but its length +is made available via this option so that it can be saved and restored (see the +pcreprecompile +documentation for details). +
+  PCRE_INFO_REQUIREDCHARFLAGS
+
+Returns 1 if there is a rightmost literal data unit that must exist in any +matched string, other than at its start. The fourth argument should point to +an int variable. If there is no such value, 0 is returned. If returning +1, the character value itself can be retrieved using PCRE_INFO_REQUIREDCHAR. +

+

+For anchored patterns, a last literal value is recorded only if it follows +something of variable length. For example, for the pattern /^a\d+z\d+/ the +returned value 1 (with "z" returned from PCRE_INFO_REQUIREDCHAR), but for +/^a\dz\d/ the returned value is 0. +

+  PCRE_INFO_REQUIREDCHAR
+
+Return the value of the rightmost literal data unit that must exist in any +matched string, other than at its start, if such a value has been recorded. The +fourth argument should point to a uint32_t variable. If there is no such +value, 0 is returned. +

+
REFERENCE COUNTS
+

+int pcre_refcount(pcre *code, int adjust); +

+

+The pcre_refcount() function is used to maintain a reference count in the +data block that contains a compiled pattern. It is provided for the benefit of +applications that operate in an object-oriented manner, where different parts +of the application may be using the same compiled pattern, but you want to free +the block when they are all done. +

+

+When a pattern is compiled, the reference count field is initialized to zero. +It is changed only by calling this function, whose action is to add the +adjust value (which may be positive or negative) to it. The yield of the +function is the new value. However, the value of the count is constrained to +lie between 0 and 65535, inclusive. If the new value is outside these limits, +it is forced to the appropriate limit value. +

+

+Except when it is zero, the reference count is not correctly preserved if a +pattern is compiled on one host and then transferred to a host whose byte-order +is different. (This seems a highly unlikely scenario.) +

+
MATCHING A PATTERN: THE TRADITIONAL FUNCTION
+

+int pcre_exec(const pcre *code, const pcre_extra *extra, + const char *subject, int length, int startoffset, + int options, int *ovector, int ovecsize); +

+

+The function pcre_exec() is called to match a subject string against a +compiled pattern, which is passed in the code argument. If the +pattern was studied, the result of the study should be passed in the +extra argument. You can call pcre_exec() with the same code +and extra arguments as many times as you like, in order to match +different subject strings with the same pattern. +

+

+This function is the main matching facility of the library, and it operates in +a Perl-like manner. For specialist use there is also an alternative matching +function, which is described +below +in the section about the pcre_dfa_exec() function. +

+

+In most applications, the pattern will have been compiled (and optionally +studied) in the same process that calls pcre_exec(). However, it is +possible to save compiled patterns and study data, and then use them later +in different processes, possibly even on different hosts. For a discussion +about this, see the +pcreprecompile +documentation. +

+

+Here is an example of a simple call to pcre_exec(): +

+  int rc;
+  int ovector[30];
+  rc = pcre_exec(
+    re,             /* result of pcre_compile() */
+    NULL,           /* we didn't study the pattern */
+    "some string",  /* the subject string */
+    11,             /* the length of the subject string */
+    0,              /* start at offset 0 in the subject */
+    0,              /* default options */
+    ovector,        /* vector of integers for substring information */
+    30);            /* number of elements (NOT size in bytes) */
+
+

+
+Extra data for pcre_exec() +
+

+If the extra argument is not NULL, it must point to a pcre_extra +data block. The pcre_study() function returns such a block (when it +doesn't return NULL), but you can also create one for yourself, and pass +additional information in it. The pcre_extra block contains the following +fields (not necessarily in this order): +

+  unsigned long int flags;
+  void *study_data;
+  void *executable_jit;
+  unsigned long int match_limit;
+  unsigned long int match_limit_recursion;
+  void *callout_data;
+  const unsigned char *tables;
+  unsigned char **mark;
+
+In the 16-bit version of this structure, the mark field has type +"PCRE_UCHAR16 **". +
+
+In the 32-bit version of this structure, the mark field has type +"PCRE_UCHAR32 **". +

+

+The flags field is used to specify which of the other fields are set. The +flag bits are: +

+  PCRE_EXTRA_CALLOUT_DATA
+  PCRE_EXTRA_EXECUTABLE_JIT
+  PCRE_EXTRA_MARK
+  PCRE_EXTRA_MATCH_LIMIT
+  PCRE_EXTRA_MATCH_LIMIT_RECURSION
+  PCRE_EXTRA_STUDY_DATA
+  PCRE_EXTRA_TABLES
+
+Other flag bits should be set to zero. The study_data field and sometimes +the executable_jit field are set in the pcre_extra block that is +returned by pcre_study(), together with the appropriate flag bits. You +should not set these yourself, but you may add to the block by setting other +fields and their corresponding flag bits. +

+

+The match_limit field provides a means of preventing PCRE from using up a +vast amount of resources when running patterns that are not going to match, +but which have a very large number of possibilities in their search trees. The +classic example is a pattern that uses nested unlimited repeats. +

+

+Internally, pcre_exec() uses a function called match(), which it +calls repeatedly (sometimes recursively). The limit set by match_limit is +imposed on the number of times this function is called during a match, which +has the effect of limiting the amount of backtracking that can take place. For +patterns that are not anchored, the count restarts from zero for each position +in the subject string. +

+

+When pcre_exec() is called with a pattern that was successfully studied +with a JIT option, the way that the matching is executed is entirely different. +However, there is still the possibility of runaway matching that goes on for a +very long time, and so the match_limit value is also used in this case +(but in a different way) to limit how long the matching can continue. +

+

+The default value for the limit can be set when PCRE is built; the default +default is 10 million, which handles all but the most extreme cases. You can +override the default by suppling pcre_exec() with a pcre_extra +block in which match_limit is set, and PCRE_EXTRA_MATCH_LIMIT is set in +the flags field. If the limit is exceeded, pcre_exec() returns +PCRE_ERROR_MATCHLIMIT. +

+

+A value for the match limit may also be supplied by an item at the start of a +pattern of the form +

+  (*LIMIT_MATCH=d)
+
+where d is a decimal number. However, such a setting is ignored unless d is +less than the limit set by the caller of pcre_exec() or, if no such limit +is set, less than the default. +

+

+The match_limit_recursion field is similar to match_limit, but +instead of limiting the total number of times that match() is called, it +limits the depth of recursion. The recursion depth is a smaller number than the +total number of calls, because not all calls to match() are recursive. +This limit is of use only if it is set smaller than match_limit. +

+

+Limiting the recursion depth limits the amount of machine stack that can be +used, or, when PCRE has been compiled to use memory on the heap instead of the +stack, the amount of heap memory that can be used. This limit is not relevant, +and is ignored, when matching is done using JIT compiled code. +

+

+The default value for match_limit_recursion can be set when PCRE is +built; the default default is the same value as the default for +match_limit. You can override the default by suppling pcre_exec() +with a pcre_extra block in which match_limit_recursion is set, and +PCRE_EXTRA_MATCH_LIMIT_RECURSION is set in the flags field. If the limit +is exceeded, pcre_exec() returns PCRE_ERROR_RECURSIONLIMIT. +

+

+A value for the recursion limit may also be supplied by an item at the start of +a pattern of the form +

+  (*LIMIT_RECURSION=d)
+
+where d is a decimal number. However, such a setting is ignored unless d is +less than the limit set by the caller of pcre_exec() or, if no such limit +is set, less than the default. +

+

+The callout_data field is used in conjunction with the "callout" feature, +and is described in the +pcrecallout +documentation. +

+

+The tables field is provided for use with patterns that have been +pre-compiled using custom character tables, saved to disc or elsewhere, and +then reloaded, because the tables that were used to compile a pattern are not +saved with it. See the +pcreprecompile +documentation for a discussion of saving compiled patterns for later use. If +NULL is passed using this mechanism, it forces PCRE's internal tables to be +used. +

+

+Warning: The tables that pcre_exec() uses must be the same as those +that were used when the pattern was compiled. If this is not the case, the +behaviour of pcre_exec() is undefined. Therefore, when a pattern is +compiled and matched in the same process, this field should never be set. In +this (the most common) case, the correct table pointer is automatically passed +with the compiled pattern from pcre_compile() to pcre_exec(). +

+

+If PCRE_EXTRA_MARK is set in the flags field, the mark field must +be set to point to a suitable variable. If the pattern contains any +backtracking control verbs such as (*MARK:NAME), and the execution ends up with +a name to pass back, a pointer to the name string (zero terminated) is placed +in the variable pointed to by the mark field. The names are within the +compiled pattern; if you wish to retain such a name you must copy it before +freeing the memory of a compiled pattern. If there is no name to pass back, the +variable pointed to by the mark field is set to NULL. For details of the +backtracking control verbs, see the section entitled +"Backtracking control" +in the +pcrepattern +documentation. +

+
+Option bits for pcre_exec() +
+

+The unused bits of the options argument for pcre_exec() must be +zero. The only bits that may be set are PCRE_ANCHORED, PCRE_NEWLINE_xxx, +PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, +PCRE_NO_START_OPTIMIZE, PCRE_NO_UTF8_CHECK, PCRE_PARTIAL_HARD, and +PCRE_PARTIAL_SOFT. +

+

+If the pattern was successfully studied with one of the just-in-time (JIT) +compile options, the only supported options for JIT execution are +PCRE_NO_UTF8_CHECK, PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, +PCRE_NOTEMPTY_ATSTART, PCRE_PARTIAL_HARD, and PCRE_PARTIAL_SOFT. If an +unsupported option is used, JIT execution is disabled and the normal +interpretive code in pcre_exec() is run. +

+  PCRE_ANCHORED
+
+The PCRE_ANCHORED option limits pcre_exec() to matching at the first +matching position. If a pattern was compiled with PCRE_ANCHORED, or turned out +to be anchored by virtue of its contents, it cannot be made unachored at +matching time. +
+  PCRE_BSR_ANYCRLF
+  PCRE_BSR_UNICODE
+
+These options (which are mutually exclusive) control what the \R escape +sequence matches. The choice is either to match only CR, LF, or CRLF, or to +match any Unicode newline sequence. These options override the choice that was +made or defaulted when the pattern was compiled. +
+  PCRE_NEWLINE_CR
+  PCRE_NEWLINE_LF
+  PCRE_NEWLINE_CRLF
+  PCRE_NEWLINE_ANYCRLF
+  PCRE_NEWLINE_ANY
+
+These options override the newline definition that was chosen or defaulted when +the pattern was compiled. For details, see the description of +pcre_compile() above. During matching, the newline choice affects the +behaviour of the dot, circumflex, and dollar metacharacters. It may also alter +the way the match position is advanced after a match failure for an unanchored +pattern. +

+

+When PCRE_NEWLINE_CRLF, PCRE_NEWLINE_ANYCRLF, or PCRE_NEWLINE_ANY is set, and a +match attempt for an unanchored pattern fails when the current position is at a +CRLF sequence, and the pattern contains no explicit matches for CR or LF +characters, the match position is advanced by two characters instead of one, in +other words, to after the CRLF. +

+

+The above rule is a compromise that makes the most common cases work as +expected. For example, if the pattern is .+A (and the PCRE_DOTALL option is not +set), it does not match the string "\r\nA" because, after failing at the +start, it skips both the CR and the LF before retrying. However, the pattern +[\r\n]A does match that string, because it contains an explicit CR or LF +reference, and so advances only by one character after the first failure. +

+

+An explicit match for CR of LF is either a literal appearance of one of those +characters, or one of the \r or \n escape sequences. Implicit matches such as +[^X] do not count, nor does \s (which includes CR and LF in the characters +that it matches). +

+

+Notwithstanding the above, anomalous effects may still occur when CRLF is a +valid newline sequence and explicit \r or \n escapes appear in the pattern. +

+  PCRE_NOTBOL
+
+This option specifies that first character of the subject string is not the +beginning of a line, so the circumflex metacharacter should not match before +it. Setting this without PCRE_MULTILINE (at compile time) causes circumflex +never to match. This option affects only the behaviour of the circumflex +metacharacter. It does not affect \A. +
+  PCRE_NOTEOL
+
+This option specifies that the end of the subject string is not the end of a +line, so the dollar metacharacter should not match it nor (except in multiline +mode) a newline immediately before it. Setting this without PCRE_MULTILINE (at +compile time) causes dollar never to match. This option affects only the +behaviour of the dollar metacharacter. It does not affect \Z or \z. +
+  PCRE_NOTEMPTY
+
+An empty string is not considered to be a valid match if this option is set. If +there are alternatives in the pattern, they are tried. If all the alternatives +match the empty string, the entire match fails. For example, if the pattern +
+  a?b?
+
+is applied to a string not beginning with "a" or "b", it matches an empty +string at the start of the subject. With PCRE_NOTEMPTY set, this match is not +valid, so PCRE searches further into the string for occurrences of "a" or "b". +
+  PCRE_NOTEMPTY_ATSTART
+
+This is like PCRE_NOTEMPTY, except that an empty string match that is not at +the start of the subject is permitted. If the pattern is anchored, such a match +can occur only if the pattern contains \K. +

+

+Perl has no direct equivalent of PCRE_NOTEMPTY or PCRE_NOTEMPTY_ATSTART, but it +does make a special case of a pattern match of the empty string within its +split() function, and when using the /g modifier. It is possible to +emulate Perl's behaviour after matching a null string by first trying the match +again at the same offset with PCRE_NOTEMPTY_ATSTART and PCRE_ANCHORED, and then +if that fails, by advancing the starting offset (see below) and trying an +ordinary match again. There is some code that demonstrates how to do this in +the +pcredemo +sample program. In the most general case, you have to check to see if the +newline convention recognizes CRLF as a newline, and if so, and the current +character is CR followed by LF, advance the starting offset by two characters +instead of one. +

+  PCRE_NO_START_OPTIMIZE
+
+There are a number of optimizations that pcre_exec() uses at the start of +a match, in order to speed up the process. For example, if it is known that an +unanchored match must start with a specific character, it searches the subject +for that character, and fails immediately if it cannot find it, without +actually running the main matching function. This means that a special item +such as (*COMMIT) at the start of a pattern is not considered until after a +suitable starting point for the match has been found. Also, when callouts or +(*MARK) items are in use, these "start-up" optimizations can cause them to be +skipped if the pattern is never actually used. The start-up optimizations are +in effect a pre-scan of the subject that takes place before the pattern is run. +

+

+The PCRE_NO_START_OPTIMIZE option disables the start-up optimizations, possibly +causing performance to suffer, but ensuring that in cases where the result is +"no match", the callouts do occur, and that items such as (*COMMIT) and (*MARK) +are considered at every possible starting position in the subject string. If +PCRE_NO_START_OPTIMIZE is set at compile time, it cannot be unset at matching +time. The use of PCRE_NO_START_OPTIMIZE at matching time (that is, passing it +to pcre_exec()) disables JIT execution; in this situation, matching is +always done using interpretively. +

+

+Setting PCRE_NO_START_OPTIMIZE can change the outcome of a matching operation. +Consider the pattern +

+  (*COMMIT)ABC
+
+When this is compiled, PCRE records the fact that a match must start with the +character "A". Suppose the subject string is "DEFABC". The start-up +optimization scans along the subject, finds "A" and runs the first match +attempt from there. The (*COMMIT) item means that the pattern must match the +current starting position, which in this case, it does. However, if the same +match is run with PCRE_NO_START_OPTIMIZE set, the initial scan along the +subject string does not happen. The first match attempt is run starting from +"D" and when this fails, (*COMMIT) prevents any further matches being tried, so +the overall result is "no match". If the pattern is studied, more start-up +optimizations may be used. For example, a minimum length for the subject may be +recorded. Consider the pattern +
+  (*MARK:A)(X|Y)
+
+The minimum length for a match is one character. If the subject is "ABC", there +will be attempts to match "ABC", "BC", "C", and then finally an empty string. +If the pattern is studied, the final attempt does not take place, because PCRE +knows that the subject is too short, and so the (*MARK) is never encountered. +In this case, studying the pattern does not affect the overall match result, +which is still "no match", but it does affect the auxiliary information that is +returned. +
+  PCRE_NO_UTF8_CHECK
+
+When PCRE_UTF8 is set at compile time, the validity of the subject as a UTF-8 +string is automatically checked when pcre_exec() is subsequently called. +The entire string is checked before any other processing takes place. The value +of startoffset is also checked to ensure that it points to the start of a +UTF-8 character. There is a discussion about the +validity of UTF-8 strings +in the +pcreunicode +page. If an invalid sequence of bytes is found, pcre_exec() returns the +error PCRE_ERROR_BADUTF8 or, if PCRE_PARTIAL_HARD is set and the problem is a +truncated character at the end of the subject, PCRE_ERROR_SHORTUTF8. In both +cases, information about the precise nature of the error may also be returned +(see the descriptions of these errors in the section entitled \fIError return +values from\fP pcre_exec() +below). +If startoffset contains a value that does not point to the start of a +UTF-8 character (or to the end of the subject), PCRE_ERROR_BADUTF8_OFFSET is +returned. +

+

+If you already know that your subject is valid, and you want to skip these +checks for performance reasons, you can set the PCRE_NO_UTF8_CHECK option when +calling pcre_exec(). You might want to do this for the second and +subsequent calls to pcre_exec() if you are making repeated calls to find +all the matches in a single subject string. However, you should be sure that +the value of startoffset points to the start of a character (or the end +of the subject). When PCRE_NO_UTF8_CHECK is set, the effect of passing an +invalid string as a subject or an invalid value of startoffset is +undefined. Your program may crash or loop. +

+  PCRE_PARTIAL_HARD
+  PCRE_PARTIAL_SOFT
+
+These options turn on the partial matching feature. For backwards +compatibility, PCRE_PARTIAL is a synonym for PCRE_PARTIAL_SOFT. A partial match +occurs if the end of the subject string is reached successfully, but there are +not enough subject characters to complete the match. If this happens when +PCRE_PARTIAL_SOFT (but not PCRE_PARTIAL_HARD) is set, matching continues by +testing any remaining alternatives. Only if no complete match can be found is +PCRE_ERROR_PARTIAL returned instead of PCRE_ERROR_NOMATCH. In other words, +PCRE_PARTIAL_SOFT says that the caller is prepared to handle a partial match, +but only if no complete match can be found. +

+

+If PCRE_PARTIAL_HARD is set, it overrides PCRE_PARTIAL_SOFT. In this case, if a +partial match is found, pcre_exec() immediately returns +PCRE_ERROR_PARTIAL, without considering any other alternatives. In other words, +when PCRE_PARTIAL_HARD is set, a partial match is considered to be more +important that an alternative complete match. +

+

+In both cases, the portion of the string that was inspected when the partial +match was found is set as the first matching string. There is a more detailed +discussion of partial and multi-segment matching, with examples, in the +pcrepartial +documentation. +

+
+The string to be matched by pcre_exec() +
+

+The subject string is passed to pcre_exec() as a pointer in +subject, a length in length, and a starting offset in +startoffset. The units for length and startoffset are bytes +for the 8-bit library, 16-bit data items for the 16-bit library, and 32-bit +data items for the 32-bit library. +

+

+If startoffset is negative or greater than the length of the subject, +pcre_exec() returns PCRE_ERROR_BADOFFSET. When the starting offset is +zero, the search for a match starts at the beginning of the subject, and this +is by far the most common case. In UTF-8 or UTF-16 mode, the offset must point +to the start of a character, or the end of the subject (in UTF-32 mode, one +data unit equals one character, so all offsets are valid). Unlike the pattern +string, the subject may contain binary zeroes. +

+

+A non-zero starting offset is useful when searching for another match in the +same subject by calling pcre_exec() again after a previous success. +Setting startoffset differs from just passing over a shortened string and +setting PCRE_NOTBOL in the case of a pattern that begins with any kind of +lookbehind. For example, consider the pattern +

+  \Biss\B
+
+which finds occurrences of "iss" in the middle of words. (\B matches only if +the current position in the subject is not a word boundary.) When applied to +the string "Mississipi" the first call to pcre_exec() finds the first +occurrence. If pcre_exec() is called again with just the remainder of the +subject, namely "issipi", it does not match, because \B is always false at the +start of the subject, which is deemed to be a word boundary. However, if +pcre_exec() is passed the entire string again, but with startoffset +set to 4, it finds the second occurrence of "iss" because it is able to look +behind the starting point to discover that it is preceded by a letter. +

+

+Finding all the matches in a subject is tricky when the pattern can match an +empty string. It is possible to emulate Perl's /g behaviour by first trying the +match again at the same offset, with the PCRE_NOTEMPTY_ATSTART and +PCRE_ANCHORED options, and then if that fails, advancing the starting offset +and trying an ordinary match again. There is some code that demonstrates how to +do this in the +pcredemo +sample program. In the most general case, you have to check to see if the +newline convention recognizes CRLF as a newline, and if so, and the current +character is CR followed by LF, advance the starting offset by two characters +instead of one. +

+

+If a non-zero starting offset is passed when the pattern is anchored, one +attempt to match at the given offset is made. This can only succeed if the +pattern does not require the match to be at the start of the subject. +

+
+How pcre_exec() returns captured substrings +
+

+In general, a pattern matches a certain portion of the subject, and in +addition, further substrings from the subject may be picked out by parts of the +pattern. Following the usage in Jeffrey Friedl's book, this is called +"capturing" in what follows, and the phrase "capturing subpattern" is used for +a fragment of a pattern that picks out a substring. PCRE supports several other +kinds of parenthesized subpattern that do not cause substrings to be captured. +

+

+Captured substrings are returned to the caller via a vector of integers whose +address is passed in ovector. The number of elements in the vector is +passed in ovecsize, which must be a non-negative number. Note: this +argument is NOT the size of ovector in bytes. +

+

+The first two-thirds of the vector is used to pass back captured substrings, +each substring using a pair of integers. The remaining third of the vector is +used as workspace by pcre_exec() while matching capturing subpatterns, +and is not available for passing back information. The number passed in +ovecsize should always be a multiple of three. If it is not, it is +rounded down. +

+

+When a match is successful, information about captured substrings is returned +in pairs of integers, starting at the beginning of ovector, and +continuing up to two-thirds of its length at the most. The first element of +each pair is set to the offset of the first character in a substring, and the +second is set to the offset of the first character after the end of a +substring. These values are always data unit offsets, even in UTF mode. They +are byte offsets in the 8-bit library, 16-bit data item offsets in the 16-bit +library, and 32-bit data item offsets in the 32-bit library. Note: they +are not character counts. +

+

+The first pair of integers, ovector[0] and ovector[1], identify the +portion of the subject string matched by the entire pattern. The next pair is +used for the first capturing subpattern, and so on. The value returned by +pcre_exec() is one more than the highest numbered pair that has been set. +For example, if two substrings have been captured, the returned value is 3. If +there are no capturing subpatterns, the return value from a successful match is +1, indicating that just the first pair of offsets has been set. +

+

+If a capturing subpattern is matched repeatedly, it is the last portion of the +string that it matched that is returned. +

+

+If the vector is too small to hold all the captured substring offsets, it is +used as far as possible (up to two-thirds of its length), and the function +returns a value of zero. If neither the actual string matched nor any captured +substrings are of interest, pcre_exec() may be called with ovector +passed as NULL and ovecsize as zero. However, if the pattern contains +back references and the ovector is not big enough to remember the related +substrings, PCRE has to get additional memory for use during matching. Thus it +is usually advisable to supply an ovector of reasonable size. +

+

+There are some cases where zero is returned (indicating vector overflow) when +in fact the vector is exactly the right size for the final match. For example, +consider the pattern +

+  (a)(?:(b)c|bd)
+
+If a vector of 6 elements (allowing for only 1 captured substring) is given +with subject string "abd", pcre_exec() will try to set the second +captured string, thereby recording a vector overflow, before failing to match +"c" and backing up to try the second alternative. The zero return, however, +does correctly indicate that the maximum number of slots (namely 2) have been +filled. In similar cases where there is temporary overflow, but the final +number of used slots is actually less than the maximum, a non-zero value is +returned. +

+

+The pcre_fullinfo() function can be used to find out how many capturing +subpatterns there are in a compiled pattern. The smallest size for +ovector that will allow for n captured substrings, in addition to +the offsets of the substring matched by the whole pattern, is (n+1)*3. +

+

+It is possible for capturing subpattern number n+1 to match some part of +the subject when subpattern n has not been used at all. For example, if +the string "abc" is matched against the pattern (a|(z))(bc) the return from the +function is 4, and subpatterns 1 and 3 are matched, but 2 is not. When this +happens, both values in the offset pairs corresponding to unused subpatterns +are set to -1. +

+

+Offset values that correspond to unused subpatterns at the end of the +expression are also set to -1. For example, if the string "abc" is matched +against the pattern (abc)(x(yz)?)? subpatterns 2 and 3 are not matched. The +return from the function is 2, because the highest used capturing subpattern +number is 1, and the offsets for for the second and third capturing subpatterns +(assuming the vector is large enough, of course) are set to -1. +

+

+Note: Elements in the first two-thirds of ovector that do not +correspond to capturing parentheses in the pattern are never changed. That is, +if a pattern contains n capturing parentheses, no more than +ovector[0] to ovector[2n+1] are set by pcre_exec(). The other +elements (in the first two-thirds) retain whatever values they previously had. +

+

+Some convenience functions are provided for extracting the captured substrings +as separate strings. These are described below. +

+
+Error return values from pcre_exec() +
+

+If pcre_exec() fails, it returns a negative number. The following are +defined in the header file: +

+  PCRE_ERROR_NOMATCH        (-1)
+
+The subject string did not match the pattern. +
+  PCRE_ERROR_NULL           (-2)
+
+Either code or subject was passed as NULL, or ovector was +NULL and ovecsize was not zero. +
+  PCRE_ERROR_BADOPTION      (-3)
+
+An unrecognized bit was set in the options argument. +
+  PCRE_ERROR_BADMAGIC       (-4)
+
+PCRE stores a 4-byte "magic number" at the start of the compiled code, to catch +the case when it is passed a junk pointer and to detect when a pattern that was +compiled in an environment of one endianness is run in an environment with the +other endianness. This is the error that PCRE gives when the magic number is +not present. +
+  PCRE_ERROR_UNKNOWN_OPCODE (-5)
+
+While running the pattern match, an unknown item was encountered in the +compiled pattern. This error could be caused by a bug in PCRE or by overwriting +of the compiled pattern. +
+  PCRE_ERROR_NOMEMORY       (-6)
+
+If a pattern contains back references, but the ovector that is passed to +pcre_exec() is not big enough to remember the referenced substrings, PCRE +gets a block of memory at the start of matching to use for this purpose. If the +call via pcre_malloc() fails, this error is given. The memory is +automatically freed at the end of matching. +

+

+This error is also given if pcre_stack_malloc() fails in +pcre_exec(). This can happen only when PCRE has been compiled with +--disable-stack-for-recursion. +

+  PCRE_ERROR_NOSUBSTRING    (-7)
+
+This error is used by the pcre_copy_substring(), +pcre_get_substring(), and pcre_get_substring_list() functions (see +below). It is never returned by pcre_exec(). +
+  PCRE_ERROR_MATCHLIMIT     (-8)
+
+The backtracking limit, as specified by the match_limit field in a +pcre_extra structure (or defaulted) was reached. See the description +above. +
+  PCRE_ERROR_CALLOUT        (-9)
+
+This error is never generated by pcre_exec() itself. It is provided for +use by callout functions that want to yield a distinctive error code. See the +pcrecallout +documentation for details. +
+  PCRE_ERROR_BADUTF8        (-10)
+
+A string that contains an invalid UTF-8 byte sequence was passed as a subject, +and the PCRE_NO_UTF8_CHECK option was not set. If the size of the output vector +(ovecsize) is at least 2, the byte offset to the start of the the invalid +UTF-8 character is placed in the first element, and a reason code is placed in +the second element. The reason codes are listed in the +following section. +For backward compatibility, if PCRE_PARTIAL_HARD is set and the problem is a +truncated UTF-8 character at the end of the subject (reason codes 1 to 5), +PCRE_ERROR_SHORTUTF8 is returned instead of PCRE_ERROR_BADUTF8. +
+  PCRE_ERROR_BADUTF8_OFFSET (-11)
+
+The UTF-8 byte sequence that was passed as a subject was checked and found to +be valid (the PCRE_NO_UTF8_CHECK option was not set), but the value of +startoffset did not point to the beginning of a UTF-8 character or the +end of the subject. +
+  PCRE_ERROR_PARTIAL        (-12)
+
+The subject string did not match, but it did match partially. See the +pcrepartial +documentation for details of partial matching. +
+  PCRE_ERROR_BADPARTIAL     (-13)
+
+This code is no longer in use. It was formerly returned when the PCRE_PARTIAL +option was used with a compiled pattern containing items that were not +supported for partial matching. From release 8.00 onwards, there are no +restrictions on partial matching. +
+  PCRE_ERROR_INTERNAL       (-14)
+
+An unexpected internal error has occurred. This error could be caused by a bug +in PCRE or by overwriting of the compiled pattern. +
+  PCRE_ERROR_BADCOUNT       (-15)
+
+This error is given if the value of the ovecsize argument is negative. +
+  PCRE_ERROR_RECURSIONLIMIT (-21)
+
+The internal recursion limit, as specified by the match_limit_recursion +field in a pcre_extra structure (or defaulted) was reached. See the +description above. +
+  PCRE_ERROR_BADNEWLINE     (-23)
+
+An invalid combination of PCRE_NEWLINE_xxx options was given. +
+  PCRE_ERROR_BADOFFSET      (-24)
+
+The value of startoffset was negative or greater than the length of the +subject, that is, the value in length. +
+  PCRE_ERROR_SHORTUTF8      (-25)
+
+This error is returned instead of PCRE_ERROR_BADUTF8 when the subject string +ends with a truncated UTF-8 character and the PCRE_PARTIAL_HARD option is set. +Information about the failure is returned as for PCRE_ERROR_BADUTF8. It is in +fact sufficient to detect this case, but this special error code for +PCRE_PARTIAL_HARD precedes the implementation of returned information; it is +retained for backwards compatibility. +
+  PCRE_ERROR_RECURSELOOP    (-26)
+
+This error is returned when pcre_exec() detects a recursion loop within +the pattern. Specifically, it means that either the whole pattern or a +subpattern has been called recursively for the second time at the same position +in the subject string. Some simple patterns that might do this are detected and +faulted at compile time, but more complicated cases, in particular mutual +recursions between two different subpatterns, cannot be detected until run +time. +
+  PCRE_ERROR_JIT_STACKLIMIT (-27)
+
+This error is returned when a pattern that was successfully studied using a +JIT compile option is being matched, but the memory available for the +just-in-time processing stack is not large enough. See the +pcrejit +documentation for more details. +
+  PCRE_ERROR_BADMODE        (-28)
+
+This error is given if a pattern that was compiled by the 8-bit library is +passed to a 16-bit or 32-bit library function, or vice versa. +
+  PCRE_ERROR_BADENDIANNESS  (-29)
+
+This error is given if a pattern that was compiled and saved is reloaded on a +host with different endianness. The utility function +pcre_pattern_to_host_byte_order() can be used to convert such a pattern +so that it runs on the new host. +
+  PCRE_ERROR_JIT_BADOPTION
+
+This error is returned when a pattern that was successfully studied using a JIT +compile option is being matched, but the matching mode (partial or complete +match) does not correspond to any JIT compilation mode. When the JIT fast path +function is used, this error may be also given for invalid options. See the +pcrejit +documentation for more details. +
+  PCRE_ERROR_BADLENGTH      (-32)
+
+This error is given if pcre_exec() is called with a negative value for +the length argument. +

+

+Error numbers -16 to -20, -22, and 30 are not used by pcre_exec(). +

+
+Reason codes for invalid UTF-8 strings +
+

+This section applies only to the 8-bit library. The corresponding information +for the 16-bit and 32-bit libraries is given in the +pcre16 +and +pcre32 +pages. +

+

+When pcre_exec() returns either PCRE_ERROR_BADUTF8 or +PCRE_ERROR_SHORTUTF8, and the size of the output vector (ovecsize) is at +least 2, the offset of the start of the invalid UTF-8 character is placed in +the first output vector element (ovector[0]) and a reason code is placed +in the second element (ovector[1]). The reason codes are given names in +the pcre.h header file: +

+  PCRE_UTF8_ERR1
+  PCRE_UTF8_ERR2
+  PCRE_UTF8_ERR3
+  PCRE_UTF8_ERR4
+  PCRE_UTF8_ERR5
+
+The string ends with a truncated UTF-8 character; the code specifies how many +bytes are missing (1 to 5). Although RFC 3629 restricts UTF-8 characters to be +no longer than 4 bytes, the encoding scheme (originally defined by RFC 2279) +allows for up to 6 bytes, and this is checked first; hence the possibility of +4 or 5 missing bytes. +
+  PCRE_UTF8_ERR6
+  PCRE_UTF8_ERR7
+  PCRE_UTF8_ERR8
+  PCRE_UTF8_ERR9
+  PCRE_UTF8_ERR10
+
+The two most significant bits of the 2nd, 3rd, 4th, 5th, or 6th byte of the +character do not have the binary value 0b10 (that is, either the most +significant bit is 0, or the next bit is 1). +
+  PCRE_UTF8_ERR11
+  PCRE_UTF8_ERR12
+
+A character that is valid by the RFC 2279 rules is either 5 or 6 bytes long; +these code points are excluded by RFC 3629. +
+  PCRE_UTF8_ERR13
+
+A 4-byte character has a value greater than 0x10fff; these code points are +excluded by RFC 3629. +
+  PCRE_UTF8_ERR14
+
+A 3-byte character has a value in the range 0xd800 to 0xdfff; this range of +code points are reserved by RFC 3629 for use with UTF-16, and so are excluded +from UTF-8. +
+  PCRE_UTF8_ERR15
+  PCRE_UTF8_ERR16
+  PCRE_UTF8_ERR17
+  PCRE_UTF8_ERR18
+  PCRE_UTF8_ERR19
+
+A 2-, 3-, 4-, 5-, or 6-byte character is "overlong", that is, it codes for a +value that can be represented by fewer bytes, which is invalid. For example, +the two bytes 0xc0, 0xae give the value 0x2e, whose correct coding uses just +one byte. +
+  PCRE_UTF8_ERR20
+
+The two most significant bits of the first byte of a character have the binary +value 0b10 (that is, the most significant bit is 1 and the second is 0). Such a +byte can only validly occur as the second or subsequent byte of a multi-byte +character. +
+  PCRE_UTF8_ERR21
+
+The first byte of a character has the value 0xfe or 0xff. These values can +never occur in a valid UTF-8 string. +
+  PCRE_UTF8_ERR22
+
+This error code was formerly used when the presence of a so-called +"non-character" caused an error. Unicode corrigendum #9 makes it clear that +such characters should not cause a string to be rejected, and so this code is +no longer in use and is never returned. +

+
EXTRACTING CAPTURED SUBSTRINGS BY NUMBER
+

+int pcre_copy_substring(const char *subject, int *ovector, + int stringcount, int stringnumber, char *buffer, + int buffersize); +
+
+int pcre_get_substring(const char *subject, int *ovector, + int stringcount, int stringnumber, + const char **stringptr); +
+
+int pcre_get_substring_list(const char *subject, + int *ovector, int stringcount, const char ***listptr); +

+

+Captured substrings can be accessed directly by using the offsets returned by +pcre_exec() in ovector. For convenience, the functions +pcre_copy_substring(), pcre_get_substring(), and +pcre_get_substring_list() are provided for extracting captured substrings +as new, separate, zero-terminated strings. These functions identify substrings +by number. The next section describes functions for extracting named +substrings. +

+

+A substring that contains a binary zero is correctly extracted and has a +further zero added on the end, but the result is not, of course, a C string. +However, you can process such a string by referring to the length that is +returned by pcre_copy_substring() and pcre_get_substring(). +Unfortunately, the interface to pcre_get_substring_list() is not adequate +for handling strings containing binary zeros, because the end of the final +string is not independently indicated. +

+

+The first three arguments are the same for all three of these functions: +subject is the subject string that has just been successfully matched, +ovector is a pointer to the vector of integer offsets that was passed to +pcre_exec(), and stringcount is the number of substrings that were +captured by the match, including the substring that matched the entire regular +expression. This is the value returned by pcre_exec() if it is greater +than zero. If pcre_exec() returned zero, indicating that it ran out of +space in ovector, the value passed as stringcount should be the +number of elements in the vector divided by three. +

+

+The functions pcre_copy_substring() and pcre_get_substring() +extract a single substring, whose number is given as stringnumber. A +value of zero extracts the substring that matched the entire pattern, whereas +higher values extract the captured substrings. For pcre_copy_substring(), +the string is placed in buffer, whose length is given by +buffersize, while for pcre_get_substring() a new block of memory is +obtained via pcre_malloc, and its address is returned via +stringptr. The yield of the function is the length of the string, not +including the terminating zero, or one of these error codes: +

+  PCRE_ERROR_NOMEMORY       (-6)
+
+The buffer was too small for pcre_copy_substring(), or the attempt to get +memory failed for pcre_get_substring(). +
+  PCRE_ERROR_NOSUBSTRING    (-7)
+
+There is no substring whose number is stringnumber. +

+

+The pcre_get_substring_list() function extracts all available substrings +and builds a list of pointers to them. All this is done in a single block of +memory that is obtained via pcre_malloc. The address of the memory block +is returned via listptr, which is also the start of the list of string +pointers. The end of the list is marked by a NULL pointer. The yield of the +function is zero if all went well, or the error code +

+  PCRE_ERROR_NOMEMORY       (-6)
+
+if the attempt to get the memory block failed. +

+

+When any of these functions encounter a substring that is unset, which can +happen when capturing subpattern number n+1 matches some part of the +subject, but subpattern n has not been used at all, they return an empty +string. This can be distinguished from a genuine zero-length substring by +inspecting the appropriate offset in ovector, which is negative for unset +substrings. +

+

+The two convenience functions pcre_free_substring() and +pcre_free_substring_list() can be used to free the memory returned by +a previous call of pcre_get_substring() or +pcre_get_substring_list(), respectively. They do nothing more than call +the function pointed to by pcre_free, which of course could be called +directly from a C program. However, PCRE is used in some situations where it is +linked via a special interface to another programming language that cannot use +pcre_free directly; it is for these cases that the functions are +provided. +

+
EXTRACTING CAPTURED SUBSTRINGS BY NAME
+

+int pcre_get_stringnumber(const pcre *code, + const char *name); +
+
+int pcre_copy_named_substring(const pcre *code, + const char *subject, int *ovector, + int stringcount, const char *stringname, + char *buffer, int buffersize); +
+
+int pcre_get_named_substring(const pcre *code, + const char *subject, int *ovector, + int stringcount, const char *stringname, + const char **stringptr); +

+

+To extract a substring by name, you first have to find associated number. +For example, for this pattern +

+  (a+)b(?<xxx>\d+)...
+
+the number of the subpattern called "xxx" is 2. If the name is known to be +unique (PCRE_DUPNAMES was not set), you can find the number from the name by +calling pcre_get_stringnumber(). The first argument is the compiled +pattern, and the second is the name. The yield of the function is the +subpattern number, or PCRE_ERROR_NOSUBSTRING (-7) if there is no subpattern of +that name. +

+

+Given the number, you can extract the substring directly, or use one of the +functions described in the previous section. For convenience, there are also +two functions that do the whole job. +

+

+Most of the arguments of pcre_copy_named_substring() and +pcre_get_named_substring() are the same as those for the similarly named +functions that extract by number. As these are described in the previous +section, they are not re-described here. There are just two differences: +

+

+First, instead of a substring number, a substring name is given. Second, there +is an extra argument, given at the start, which is a pointer to the compiled +pattern. This is needed in order to gain access to the name-to-number +translation table. +

+

+These functions call pcre_get_stringnumber(), and if it succeeds, they +then call pcre_copy_substring() or pcre_get_substring(), as +appropriate. NOTE: If PCRE_DUPNAMES is set and there are duplicate names, +the behaviour may not be what you want (see the next section). +

+

+Warning: If the pattern uses the (?| feature to set up multiple +subpatterns with the same number, as described in the +section on duplicate subpattern numbers +in the +pcrepattern +page, you cannot use names to distinguish the different subpatterns, because +names are not included in the compiled code. The matching process uses only +numbers. For this reason, the use of different names for subpatterns of the +same number causes an error at compile time. +

+
DUPLICATE SUBPATTERN NAMES
+

+int pcre_get_stringtable_entries(const pcre *code, + const char *name, char **first, char **last); +

+

+When a pattern is compiled with the PCRE_DUPNAMES option, names for subpatterns +are not required to be unique. (Duplicate names are always allowed for +subpatterns with the same number, created by using the (?| feature. Indeed, if +such subpatterns are named, they are required to use the same names.) +

+

+Normally, patterns with duplicate names are such that in any one match, only +one of the named subpatterns participates. An example is shown in the +pcrepattern +documentation. +

+

+When duplicates are present, pcre_copy_named_substring() and +pcre_get_named_substring() return the first substring corresponding to +the given name that is set. If none are set, PCRE_ERROR_NOSUBSTRING (-7) is +returned; no data is returned. The pcre_get_stringnumber() function +returns one of the numbers that are associated with the name, but it is not +defined which it is. +

+

+If you want to get full details of all captured substrings for a given name, +you must use the pcre_get_stringtable_entries() function. The first +argument is the compiled pattern, and the second is the name. The third and +fourth are pointers to variables which are updated by the function. After it +has run, they point to the first and last entries in the name-to-number table +for the given name. The function itself returns the length of each entry, or +PCRE_ERROR_NOSUBSTRING (-7) if there are none. The format of the table is +described above in the section entitled Information about a pattern +above. +Given all the relevant entries for the name, you can extract each of their +numbers, and hence the captured data, if any. +

+
FINDING ALL POSSIBLE MATCHES
+

+The traditional matching function uses a similar algorithm to Perl, which stops +when it finds the first match, starting at a given point in the subject. If you +want to find all possible matches, or the longest possible match, consider +using the alternative matching function (see below) instead. If you cannot use +the alternative function, but still need to find all possible matches, you +can kludge it up by making use of the callout facility, which is described in +the +pcrecallout +documentation. +

+

+What you have to do is to insert a callout right at the end of the pattern. +When your callout function is called, extract and save the current matched +substring. Then return 1, which forces pcre_exec() to backtrack and try +other alternatives. Ultimately, when it runs out of matches, pcre_exec() +will yield PCRE_ERROR_NOMATCH. +

+
OBTAINING AN ESTIMATE OF STACK USAGE
+

+Matching certain patterns using pcre_exec() can use a lot of process +stack, which in certain environments can be rather limited in size. Some users +find it helpful to have an estimate of the amount of stack that is used by +pcre_exec(), to help them set recursion limits, as described in the +pcrestack +documentation. The estimate that is output by pcretest when called with +the -m and -C options is obtained by calling pcre_exec with +the values NULL, NULL, NULL, -999, and -999 for its first five arguments. +

+

+Normally, if its first argument is NULL, pcre_exec() immediately returns +the negative error code PCRE_ERROR_NULL, but with this special combination of +arguments, it returns instead a negative number whose absolute value is the +approximate stack frame size in bytes. (A negative number is used so that it is +clear that no match has happened.) The value is approximate because in some +cases, recursive calls to pcre_exec() occur when there are one or two +additional variables on the stack. +

+

+If PCRE has been compiled to use the heap instead of the stack for recursion, +the value returned is the size of each block that is obtained from the heap. +

+
MATCHING A PATTERN: THE ALTERNATIVE FUNCTION
+

+int pcre_dfa_exec(const pcre *code, const pcre_extra *extra, + const char *subject, int length, int startoffset, + int options, int *ovector, int ovecsize, + int *workspace, int wscount); +

+

+The function pcre_dfa_exec() is called to match a subject string against +a compiled pattern, using a matching algorithm that scans the subject string +just once, and does not backtrack. This has different characteristics to the +normal algorithm, and is not compatible with Perl. Some of the features of PCRE +patterns are not supported. Nevertheless, there are times when this kind of +matching can be useful. For a discussion of the two matching algorithms, and a +list of features that pcre_dfa_exec() does not support, see the +pcrematching +documentation. +

+

+The arguments for the pcre_dfa_exec() function are the same as for +pcre_exec(), plus two extras. The ovector argument is used in a +different way, and this is described below. The other common arguments are used +in the same way as for pcre_exec(), so their description is not repeated +here. +

+

+The two additional arguments provide workspace for the function. The workspace +vector should contain at least 20 elements. It is used for keeping track of +multiple paths through the pattern tree. More workspace will be needed for +patterns and subjects where there are a lot of potential matches. +

+

+Here is an example of a simple call to pcre_dfa_exec(): +

+  int rc;
+  int ovector[10];
+  int wspace[20];
+  rc = pcre_dfa_exec(
+    re,             /* result of pcre_compile() */
+    NULL,           /* we didn't study the pattern */
+    "some string",  /* the subject string */
+    11,             /* the length of the subject string */
+    0,              /* start at offset 0 in the subject */
+    0,              /* default options */
+    ovector,        /* vector of integers for substring information */
+    10,             /* number of elements (NOT size in bytes) */
+    wspace,         /* working space vector */
+    20);            /* number of elements (NOT size in bytes) */
+
+

+
+Option bits for pcre_dfa_exec() +
+

+The unused bits of the options argument for pcre_dfa_exec() must be +zero. The only bits that may be set are PCRE_ANCHORED, PCRE_NEWLINE_xxx, +PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, +PCRE_NO_UTF8_CHECK, PCRE_BSR_ANYCRLF, PCRE_BSR_UNICODE, PCRE_NO_START_OPTIMIZE, +PCRE_PARTIAL_HARD, PCRE_PARTIAL_SOFT, PCRE_DFA_SHORTEST, and PCRE_DFA_RESTART. +All but the last four of these are exactly the same as for pcre_exec(), +so their description is not repeated here. +

+  PCRE_PARTIAL_HARD
+  PCRE_PARTIAL_SOFT
+
+These have the same general effect as they do for pcre_exec(), but the +details are slightly different. When PCRE_PARTIAL_HARD is set for +pcre_dfa_exec(), it returns PCRE_ERROR_PARTIAL if the end of the subject +is reached and there is still at least one matching possibility that requires +additional characters. This happens even if some complete matches have also +been found. When PCRE_PARTIAL_SOFT is set, the return code PCRE_ERROR_NOMATCH +is converted into PCRE_ERROR_PARTIAL if the end of the subject is reached, +there have been no complete matches, but there is still at least one matching +possibility. The portion of the string that was inspected when the longest +partial match was found is set as the first matching string in both cases. +There is a more detailed discussion of partial and multi-segment matching, with +examples, in the +pcrepartial +documentation. +
+  PCRE_DFA_SHORTEST
+
+Setting the PCRE_DFA_SHORTEST option causes the matching algorithm to stop as +soon as it has found one match. Because of the way the alternative algorithm +works, this is necessarily the shortest possible match at the first possible +matching point in the subject string. +
+  PCRE_DFA_RESTART
+
+When pcre_dfa_exec() returns a partial match, it is possible to call it +again, with additional subject characters, and have it continue with the same +match. The PCRE_DFA_RESTART option requests this action; when it is set, the +workspace and wscount options must reference the same vector as +before because data about the match so far is left in them after a partial +match. There is more discussion of this facility in the +pcrepartial +documentation. +

+
+Successful returns from pcre_dfa_exec() +
+

+When pcre_dfa_exec() succeeds, it may have matched more than one +substring in the subject. Note, however, that all the matches from one run of +the function start at the same point in the subject. The shorter matches are +all initial substrings of the longer matches. For example, if the pattern +

+  <.*>
+
+is matched against the string +
+  This is <something> <something else> <something further> no more
+
+the three matched strings are +
+  <something>
+  <something> <something else>
+  <something> <something else> <something further>
+
+On success, the yield of the function is a number greater than zero, which is +the number of matched substrings. The substrings themselves are returned in +ovector. Each string uses two elements; the first is the offset to the +start, and the second is the offset to the end. In fact, all the strings have +the same start offset. (Space could have been saved by giving this only once, +but it was decided to retain some compatibility with the way pcre_exec() +returns data, even though the meaning of the strings is different.) +

+

+The strings are returned in reverse order of length; that is, the longest +matching string is given first. If there were too many matches to fit into +ovector, the yield of the function is zero, and the vector is filled with +the longest matches. Unlike pcre_exec(), pcre_dfa_exec() can use +the entire ovector for returning matched strings. +

+

+NOTE: PCRE's "auto-possessification" optimization usually applies to character +repeats at the end of a pattern (as well as internally). For example, the +pattern "a\d+" is compiled as if it were "a\d++" because there is no point +even considering the possibility of backtracking into the repeated digits. For +DFA matching, this means that only one possible match is found. If you really +do want multiple matches in such cases, either use an ungreedy repeat +("a\d+?") or set the PCRE_NO_AUTO_POSSESS option when compiling. +

+
+Error returns from pcre_dfa_exec() +
+

+The pcre_dfa_exec() function returns a negative number when it fails. +Many of the errors are the same as for pcre_exec(), and these are +described +above. +There are in addition the following errors that are specific to +pcre_dfa_exec(): +

+  PCRE_ERROR_DFA_UITEM      (-16)
+
+This return is given if pcre_dfa_exec() encounters an item in the pattern +that it does not support, for instance, the use of \C or a back reference. +
+  PCRE_ERROR_DFA_UCOND      (-17)
+
+This return is given if pcre_dfa_exec() encounters a condition item that +uses a back reference for the condition, or a test for recursion in a specific +group. These are not supported. +
+  PCRE_ERROR_DFA_UMLIMIT    (-18)
+
+This return is given if pcre_dfa_exec() is called with an extra +block that contains a setting of the match_limit or +match_limit_recursion fields. This is not supported (these fields are +meaningless for DFA matching). +
+  PCRE_ERROR_DFA_WSSIZE     (-19)
+
+This return is given if pcre_dfa_exec() runs out of space in the +workspace vector. +
+  PCRE_ERROR_DFA_RECURSE    (-20)
+
+When a recursive subpattern is processed, the matching function calls itself +recursively, using private vectors for ovector and workspace. This +error is given if the output vector is not large enough. This should be +extremely rare, as a vector of size 1000 is used. +
+  PCRE_ERROR_DFA_BADRESTART (-30)
+
+When pcre_dfa_exec() is called with the PCRE_DFA_RESTART option, +some plausibility checks are made on the contents of the workspace, which +should contain data about the previous partial match. If any of these checks +fail, this error is given. +

+
SEE ALSO
+

+pcre16(3), pcre32(3), pcrebuild(3), pcrecallout(3), +pcrecpp(3)(3), pcrematching(3), pcrepartial(3), +pcreposix(3), pcreprecompile(3), pcresample(3), +pcrestack(3). +

+
AUTHOR
+

+Philip Hazel +
+University Computing Service +
+Cambridge CB2 3QH, England. +
+

+
REVISION
+

+Last updated: 18 December 2015 +
+Copyright © 1997-2015 University of Cambridge. +
+

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcrebuild.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcrebuild.html new file mode 100755 index 000000000..03c8cbe0b --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcrebuild.html @@ -0,0 +1,534 @@ + + +pcrebuild specification + + +

pcrebuild man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+

+
BUILDING PCRE
+

+PCRE is distributed with a configure script that can be used to build the +library in Unix-like environments using the applications known as Autotools. +Also in the distribution are files to support building using CMake +instead of configure. The text file +README +contains general information about building with Autotools (some of which is +repeated below), and also has some comments about building on various operating +systems. There is a lot more information about building PCRE without using +Autotools (including information about using CMake and building "by +hand") in the text file called +NON-AUTOTOOLS-BUILD. +You should consult this file as well as the +README +file if you are building in a non-Unix-like environment. +

+
PCRE BUILD-TIME OPTIONS
+

+The rest of this document describes the optional features of PCRE that can be +selected when the library is compiled. It assumes use of the configure +script, where the optional features are selected or deselected by providing +options to configure before running the make command. However, the +same options can be selected in both Unix-like and non-Unix-like environments +using the GUI facility of cmake-gui if you are using CMake instead +of configure to build PCRE. +

+

+If you are not using Autotools or CMake, option selection can be done by +editing the config.h file, or by passing parameter settings to the +compiler, as described in +NON-AUTOTOOLS-BUILD. +

+

+The complete list of options for configure (which includes the standard +ones such as the selection of the installation directory) can be obtained by +running +

+  ./configure --help
+
+The following sections include descriptions of options whose names begin with +--enable or --disable. These settings specify changes to the defaults for the +configure command. Because of the way that configure works, +--enable and --disable always come in pairs, so the complementary option always +exists as well, but as it specifies the default, it is not described. +

+
BUILDING 8-BIT, 16-BIT AND 32-BIT LIBRARIES
+

+By default, a library called libpcre is built, containing functions that +take string arguments contained in vectors of bytes, either as single-byte +characters, or interpreted as UTF-8 strings. You can also build a separate +library, called libpcre16, in which strings are contained in vectors of +16-bit data units and interpreted either as single-unit characters or UTF-16 +strings, by adding +

+  --enable-pcre16
+
+to the configure command. You can also build yet another separate +library, called libpcre32, in which strings are contained in vectors of +32-bit data units and interpreted either as single-unit characters or UTF-32 +strings, by adding +
+  --enable-pcre32
+
+to the configure command. If you do not want the 8-bit library, add +
+  --disable-pcre8
+
+as well. At least one of the three libraries must be built. Note that the C++ +and POSIX wrappers are for the 8-bit library only, and that pcregrep is +an 8-bit program. None of these are built if you select only the 16-bit or +32-bit libraries. +

+
BUILDING SHARED AND STATIC LIBRARIES
+

+The Autotools PCRE building process uses libtool to build both shared and +static libraries by default. You can suppress one of these by adding one of +

+  --disable-shared
+  --disable-static
+
+to the configure command, as required. +

+
C++ SUPPORT
+

+By default, if the 8-bit library is being built, the configure script +will search for a C++ compiler and C++ header files. If it finds them, it +automatically builds the C++ wrapper library (which supports only 8-bit +strings). You can disable this by adding +

+  --disable-cpp
+
+to the configure command. +

+
UTF-8, UTF-16 AND UTF-32 SUPPORT
+

+To build PCRE with support for UTF Unicode character strings, add +

+  --enable-utf
+
+to the configure command. This setting applies to all three libraries, +adding support for UTF-8 to the 8-bit library, support for UTF-16 to the 16-bit +library, and support for UTF-32 to the to the 32-bit library. There are no +separate options for enabling UTF-8, UTF-16 and UTF-32 independently because +that would allow ridiculous settings such as requesting UTF-16 support while +building only the 8-bit library. It is not possible to build one library with +UTF support and another without in the same configuration. (For backwards +compatibility, --enable-utf8 is a synonym of --enable-utf.) +

+

+Of itself, this setting does not make PCRE treat strings as UTF-8, UTF-16 or +UTF-32. As well as compiling PCRE with this option, you also have have to set +the PCRE_UTF8, PCRE_UTF16 or PCRE_UTF32 option (as appropriate) when you call +one of the pattern compiling functions. +

+

+If you set --enable-utf when compiling in an EBCDIC environment, PCRE expects +its input to be either ASCII or UTF-8 (depending on the run-time option). It is +not possible to support both EBCDIC and UTF-8 codes in the same version of the +library. Consequently, --enable-utf and --enable-ebcdic are mutually +exclusive. +

+
UNICODE CHARACTER PROPERTY SUPPORT
+

+UTF support allows the libraries to process character codepoints up to 0x10ffff +in the strings that they handle. On its own, however, it does not provide any +facilities for accessing the properties of such characters. If you want to be +able to use the pattern escapes \P, \p, and \X, which refer to Unicode +character properties, you must add +

+  --enable-unicode-properties
+
+to the configure command. This implies UTF support, even if you have +not explicitly requested it. +

+

+Including Unicode property support adds around 30K of tables to the PCRE +library. Only the general category properties such as Lu and Nd are +supported. Details are given in the +pcrepattern +documentation. +

+
JUST-IN-TIME COMPILER SUPPORT
+

+Just-in-time compiler support is included in the build by specifying +

+  --enable-jit
+
+This support is available only for certain hardware architectures. If this +option is set for an unsupported architecture, a compile time error occurs. +See the +pcrejit +documentation for a discussion of JIT usage. When JIT support is enabled, +pcregrep automatically makes use of it, unless you add +
+  --disable-pcregrep-jit
+
+to the "configure" command. +

+
CODE VALUE OF NEWLINE
+

+By default, PCRE interprets the linefeed (LF) character as indicating the end +of a line. This is the normal newline character on Unix-like systems. You can +compile PCRE to use carriage return (CR) instead, by adding +

+  --enable-newline-is-cr
+
+to the configure command. There is also a --enable-newline-is-lf option, +which explicitly specifies linefeed as the newline character. +
+
+Alternatively, you can specify that line endings are to be indicated by the two +character sequence CRLF. If you want this, add +
+  --enable-newline-is-crlf
+
+to the configure command. There is a fourth option, specified by +
+  --enable-newline-is-anycrlf
+
+which causes PCRE to recognize any of the three sequences CR, LF, or CRLF as +indicating a line ending. Finally, a fifth option, specified by +
+  --enable-newline-is-any
+
+causes PCRE to recognize any Unicode newline sequence. +

+

+Whatever line ending convention is selected when PCRE is built can be +overridden when the library functions are called. At build time it is +conventional to use the standard for your operating system. +

+
WHAT \R MATCHES
+

+By default, the sequence \R in a pattern matches any Unicode newline sequence, +whatever has been selected as the line ending sequence. If you specify +

+  --enable-bsr-anycrlf
+
+the default is changed so that \R matches only CR, LF, or CRLF. Whatever is +selected when PCRE is built can be overridden when the library functions are +called. +

+
POSIX MALLOC USAGE
+

+When the 8-bit library is called through the POSIX interface (see the +pcreposix +documentation), additional working storage is required for holding the pointers +to capturing substrings, because PCRE requires three integers per substring, +whereas the POSIX interface provides only two. If the number of expected +substrings is small, the wrapper function uses space on the stack, because this +is faster than using malloc() for each call. The default threshold above +which the stack is no longer used is 10; it can be changed by adding a setting +such as +

+  --with-posix-malloc-threshold=20
+
+to the configure command. +

+
HANDLING VERY LARGE PATTERNS
+

+Within a compiled pattern, offset values are used to point from one part to +another (for example, from an opening parenthesis to an alternation +metacharacter). By default, in the 8-bit and 16-bit libraries, two-byte values +are used for these offsets, leading to a maximum size for a compiled pattern of +around 64K. This is sufficient to handle all but the most gigantic patterns. +Nevertheless, some people do want to process truly enormous patterns, so it is +possible to compile PCRE to use three-byte or four-byte offsets by adding a +setting such as +

+  --with-link-size=3
+
+to the configure command. The value given must be 2, 3, or 4. For the +16-bit library, a value of 3 is rounded up to 4. In these libraries, using +longer offsets slows down the operation of PCRE because it has to load +additional data when handling them. For the 32-bit library the value is always +4 and cannot be overridden; the value of --with-link-size is ignored. +

+
AVOIDING EXCESSIVE STACK USAGE
+

+When matching with the pcre_exec() function, PCRE implements backtracking +by making recursive calls to an internal function called match(). In +environments where the size of the stack is limited, this can severely limit +PCRE's operation. (The Unix environment does not usually suffer from this +problem, but it may sometimes be necessary to increase the maximum stack size. +There is a discussion in the +pcrestack +documentation.) An alternative approach to recursion that uses memory from the +heap to remember data, instead of using recursive function calls, has been +implemented to work round the problem of limited stack size. If you want to +build a version of PCRE that works this way, add +

+  --disable-stack-for-recursion
+
+to the configure command. With this configuration, PCRE will use the +pcre_stack_malloc and pcre_stack_free variables to call memory +management functions. By default these point to malloc() and +free(), but you can replace the pointers so that your own functions are +used instead. +

+

+Separate functions are provided rather than using pcre_malloc and +pcre_free because the usage is very predictable: the block sizes +requested are always the same, and the blocks are always freed in reverse +order. A calling program might be able to implement optimized functions that +perform better than malloc() and free(). PCRE runs noticeably more +slowly when built in this way. This option affects only the pcre_exec() +function; it is not relevant for pcre_dfa_exec(). +

+
LIMITING PCRE RESOURCE USAGE
+

+Internally, PCRE has a function called match(), which it calls repeatedly +(sometimes recursively) when matching a pattern with the pcre_exec() +function. By controlling the maximum number of times this function may be +called during a single matching operation, a limit can be placed on the +resources used by a single call to pcre_exec(). The limit can be changed +at run time, as described in the +pcreapi +documentation. The default is 10 million, but this can be changed by adding a +setting such as +

+  --with-match-limit=500000
+
+to the configure command. This setting has no effect on the +pcre_dfa_exec() matching function. +

+

+In some environments it is desirable to limit the depth of recursive calls of +match() more strictly than the total number of calls, in order to +restrict the maximum amount of stack (or heap, if --disable-stack-for-recursion +is specified) that is used. A second limit controls this; it defaults to the +value that is set for --with-match-limit, which imposes no additional +constraints. However, you can set a lower limit by adding, for example, +

+  --with-match-limit-recursion=10000
+
+to the configure command. This value can also be overridden at run time. +

+
CREATING CHARACTER TABLES AT BUILD TIME
+

+PCRE uses fixed tables for processing characters whose code values are less +than 256. By default, PCRE is built with a set of tables that are distributed +in the file pcre_chartables.c.dist. These tables are for ASCII codes +only. If you add +

+  --enable-rebuild-chartables
+
+to the configure command, the distributed tables are no longer used. +Instead, a program called dftables is compiled and run. This outputs the +source for new set of tables, created in the default locale of your C run-time +system. (This method of replacing the tables does not work if you are cross +compiling, because dftables is run on the local host. If you need to +create alternative tables when cross compiling, you will have to do so "by +hand".) +

+
USING EBCDIC CODE
+

+PCRE assumes by default that it will run in an environment where the character +code is ASCII (or Unicode, which is a superset of ASCII). This is the case for +most computer operating systems. PCRE can, however, be compiled to run in an +EBCDIC environment by adding +

+  --enable-ebcdic
+
+to the configure command. This setting implies +--enable-rebuild-chartables. You should only use it if you know that you are in +an EBCDIC environment (for example, an IBM mainframe operating system). The +--enable-ebcdic option is incompatible with --enable-utf. +

+

+The EBCDIC character that corresponds to an ASCII LF is assumed to have the +value 0x15 by default. However, in some EBCDIC environments, 0x25 is used. In +such an environment you should use +

+  --enable-ebcdic-nl25
+
+as well as, or instead of, --enable-ebcdic. The EBCDIC character for CR has the +same value as in ASCII, namely, 0x0d. Whichever of 0x15 and 0x25 is not +chosen as LF is made to correspond to the Unicode NEL character (which, in +Unicode, is 0x85). +

+

+The options that select newline behaviour, such as --enable-newline-is-cr, +and equivalent run-time options, refer to these character values in an EBCDIC +environment. +

+
PCREGREP OPTIONS FOR COMPRESSED FILE SUPPORT
+

+By default, pcregrep reads all files as plain text. You can build it so +that it recognizes files whose names end in .gz or .bz2, and reads +them with libz or libbz2, respectively, by adding one or both of +

+  --enable-pcregrep-libz
+  --enable-pcregrep-libbz2
+
+to the configure command. These options naturally require that the +relevant libraries are installed on your system. Configuration will fail if +they are not. +

+
PCREGREP BUFFER SIZE
+

+pcregrep uses an internal buffer to hold a "window" on the file it is +scanning, in order to be able to output "before" and "after" lines when it +finds a match. The size of the buffer is controlled by a parameter whose +default value is 20K. The buffer itself is three times this size, but because +of the way it is used for holding "before" lines, the longest line that is +guaranteed to be processable is the parameter size. You can change the default +parameter value by adding, for example, +

+  --with-pcregrep-bufsize=50K
+
+to the configure command. The caller of \fPpcregrep\fP can, however, +override this value by specifying a run-time option. +

+
PCRETEST OPTION FOR LIBREADLINE SUPPORT
+

+If you add +

+  --enable-pcretest-libreadline
+
+to the configure command, pcretest is linked with the +libreadline library, and when its input is from a terminal, it reads it +using the readline() function. This provides line-editing and history +facilities. Note that libreadline is GPL-licensed, so if you distribute a +binary of pcretest linked in this way, there may be licensing issues. +

+

+Setting this option causes the -lreadline option to be added to the +pcretest build. In many operating environments with a sytem-installed +libreadline this is sufficient. However, in some environments (e.g. +if an unmodified distribution version of readline is in use), some extra +configuration may be necessary. The INSTALL file for libreadline says +this: +

+  "Readline uses the termcap functions, but does not link with the
+  termcap or curses library itself, allowing applications which link
+  with readline the to choose an appropriate library."
+
+If your environment has not been set up so that an appropriate library is +automatically included, you may need to add something like +
+  LIBS="-ncurses"
+
+immediately before the configure command. +

+
DEBUGGING WITH VALGRIND SUPPORT
+

+By adding the +

+  --enable-valgrind
+
+option to to the configure command, PCRE will use valgrind annotations +to mark certain memory regions as unaddressable. This allows it to detect +invalid memory accesses, and is mostly useful for debugging PCRE itself. +

+
CODE COVERAGE REPORTING
+

+If your C compiler is gcc, you can build a version of PCRE that can generate a +code coverage report for its test suite. To enable this, you must install +lcov version 1.6 or above. Then specify +

+  --enable-coverage
+
+to the configure command and build PCRE in the usual way. +

+

+Note that using ccache (a caching C compiler) is incompatible with code +coverage reporting. If you have configured ccache to run automatically +on your system, you must set the environment variable +

+  CCACHE_DISABLE=1
+
+before running make to build PCRE, so that ccache is not used. +

+

+When --enable-coverage is used, the following addition targets are added to the +Makefile: +

+  make coverage
+
+This creates a fresh coverage report for the PCRE test suite. It is equivalent +to running "make coverage-reset", "make coverage-baseline", "make check", and +then "make coverage-report". +
+  make coverage-reset
+
+This zeroes the coverage counters, but does nothing else. +
+  make coverage-baseline
+
+This captures baseline coverage information. +
+  make coverage-report
+
+This creates the coverage report. +
+  make coverage-clean-report
+
+This removes the generated coverage report without cleaning the coverage data +itself. +
+  make coverage-clean-data
+
+This removes the captured coverage data without removing the coverage files +created at compile time (*.gcno). +
+  make coverage-clean
+
+This cleans all coverage data including the generated coverage report. For more +information about code coverage, see the gcov and lcov +documentation. +

+
SEE ALSO
+

+pcreapi(3), pcre16, pcre32, pcre_config(3). +

+
AUTHOR
+

+Philip Hazel +
+University Computing Service +
+Cambridge CB2 3QH, England. +
+

+
REVISION
+

+Last updated: 12 May 2013 +
+Copyright © 1997-2013 University of Cambridge. +
+

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcrecallout.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcrecallout.html new file mode 100755 index 000000000..53a937f52 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcrecallout.html @@ -0,0 +1,286 @@ + + +pcrecallout specification + + +

pcrecallout man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+

+
SYNOPSIS
+

+#include <pcre.h> +

+

+int (*pcre_callout)(pcre_callout_block *); +

+

+int (*pcre16_callout)(pcre16_callout_block *); +

+

+int (*pcre32_callout)(pcre32_callout_block *); +

+
DESCRIPTION
+

+PCRE provides a feature called "callout", which is a means of temporarily +passing control to the caller of PCRE in the middle of pattern matching. The +caller of PCRE provides an external function by putting its entry point in the +global variable pcre_callout (pcre16_callout for the 16-bit +library, pcre32_callout for the 32-bit library). By default, this +variable contains NULL, which disables all calling out. +

+

+Within a regular expression, (?C) indicates the points at which the external +function is to be called. Different callout points can be identified by putting +a number less than 256 after the letter C. The default value is zero. +For example, this pattern has two callout points: +

+  (?C1)abc(?C2)def
+
+If the PCRE_AUTO_CALLOUT option bit is set when a pattern is compiled, PCRE +automatically inserts callouts, all with number 255, before each item in the +pattern. For example, if PCRE_AUTO_CALLOUT is used with the pattern +
+  A(\d{2}|--)
+
+it is processed as if it were +
+
+(?C255)A(?C255)((?C255)\d{2}(?C255)|(?C255)-(?C255)-(?C255))(?C255) +
+
+Notice that there is a callout before and after each parenthesis and +alternation bar. If the pattern contains a conditional group whose condition is +an assertion, an automatic callout is inserted immediately before the +condition. Such a callout may also be inserted explicitly, for example: +
+  (?(?C9)(?=a)ab|de)
+
+This applies only to assertion conditions (because they are themselves +independent groups). +

+

+Automatic callouts can be used for tracking the progress of pattern matching. +The +pcretest +program has a pattern qualifier (/C) that sets automatic callouts; when it is +used, the output indicates how the pattern is being matched. This is useful +information when you are trying to optimize the performance of a particular +pattern. +

+
MISSING CALLOUTS
+

+You should be aware that, because of optimizations in the way PCRE compiles and +matches patterns, callouts sometimes do not happen exactly as you might expect. +

+

+At compile time, PCRE "auto-possessifies" repeated items when it knows that +what follows cannot be part of the repeat. For example, a+[bc] is compiled as +if it were a++[bc]. The pcretest output when this pattern is anchored and +then applied with automatic callouts to the string "aaaa" is: +

+  --->aaaa
+   +0 ^        ^
+   +1 ^        a+
+   +3 ^   ^    [bc]
+  No match
+
+This indicates that when matching [bc] fails, there is no backtracking into a+ +and therefore the callouts that would be taken for the backtracks do not occur. +You can disable the auto-possessify feature by passing PCRE_NO_AUTO_POSSESS +to pcre_compile(), or starting the pattern with (*NO_AUTO_POSSESS). If +this is done in pcretest (using the /O qualifier), the output changes to +this: +
+  --->aaaa
+   +0 ^        ^
+   +1 ^        a+
+   +3 ^   ^    [bc]
+   +3 ^  ^     [bc]
+   +3 ^ ^      [bc]
+   +3 ^^       [bc]
+  No match
+
+This time, when matching [bc] fails, the matcher backtracks into a+ and tries +again, repeatedly, until a+ itself fails. +

+

+Other optimizations that provide fast "no match" results also affect callouts. +For example, if the pattern is +

+  ab(?C4)cd
+
+PCRE knows that any matching string must contain the letter "d". If the subject +string is "abyz", the lack of "d" means that matching doesn't ever start, and +the callout is never reached. However, with "abyd", though the result is still +no match, the callout is obeyed. +

+

+If the pattern is studied, PCRE knows the minimum length of a matching string, +and will immediately give a "no match" return without actually running a match +if the subject is not long enough, or, for unanchored patterns, if it has +been scanned far enough. +

+

+You can disable these optimizations by passing the PCRE_NO_START_OPTIMIZE +option to the matching function, or by starting the pattern with +(*NO_START_OPT). This slows down the matching process, but does ensure that +callouts such as the example above are obeyed. +

+
THE CALLOUT INTERFACE
+

+During matching, when PCRE reaches a callout point, the external function +defined by pcre_callout or pcre[16|32]_callout is called (if it is +set). This applies to both normal and DFA matching. The only argument to the +callout function is a pointer to a pcre_callout or +pcre[16|32]_callout block. These structures contains the following +fields: +

+  int           version;
+  int           callout_number;
+  int          *offset_vector;
+  const char   *subject;           (8-bit version)
+  PCRE_SPTR16   subject;           (16-bit version)
+  PCRE_SPTR32   subject;           (32-bit version)
+  int           subject_length;
+  int           start_match;
+  int           current_position;
+  int           capture_top;
+  int           capture_last;
+  void         *callout_data;
+  int           pattern_position;
+  int           next_item_length;
+  const unsigned char *mark;       (8-bit version)
+  const PCRE_UCHAR16  *mark;       (16-bit version)
+  const PCRE_UCHAR32  *mark;       (32-bit version)
+
+The version field is an integer containing the version number of the +block format. The initial version was 0; the current version is 2. The version +number will change again in future if additional fields are added, but the +intention is never to remove any of the existing fields. +

+

+The callout_number field contains the number of the callout, as compiled +into the pattern (that is, the number after ?C for manual callouts, and 255 for +automatically generated callouts). +

+

+The offset_vector field is a pointer to the vector of offsets that was +passed by the caller to the matching function. When pcre_exec() or +pcre[16|32]_exec() is used, the contents can be inspected, in order to +extract substrings that have been matched so far, in the same way as for +extracting substrings after a match has completed. For the DFA matching +functions, this field is not useful. +

+

+The subject and subject_length fields contain copies of the values +that were passed to the matching function. +

+

+The start_match field normally contains the offset within the subject at +which the current match attempt started. However, if the escape sequence \K +has been encountered, this value is changed to reflect the modified starting +point. If the pattern is not anchored, the callout function may be called +several times from the same point in the pattern for different starting points +in the subject. +

+

+The current_position field contains the offset within the subject of the +current match pointer. +

+

+When the pcre_exec() or pcre[16|32]_exec() is used, the +capture_top field contains one more than the number of the highest +numbered captured substring so far. If no substrings have been captured, the +value of capture_top is one. This is always the case when the DFA +functions are used, because they do not support captured substrings. +

+

+The capture_last field contains the number of the most recently captured +substring. However, when a recursion exits, the value reverts to what it was +outside the recursion, as do the values of all captured substrings. If no +substrings have been captured, the value of capture_last is -1. This is +always the case for the DFA matching functions. +

+

+The callout_data field contains a value that is passed to a matching +function specifically so that it can be passed back in callouts. It is passed +in the callout_data field of a pcre_extra or pcre[16|32]_extra +data structure. If no such data was passed, the value of callout_data in +a callout block is NULL. There is a description of the pcre_extra +structure in the +pcreapi +documentation. +

+

+The pattern_position field is present from version 1 of the callout +structure. It contains the offset to the next item to be matched in the pattern +string. +

+

+The next_item_length field is present from version 1 of the callout +structure. It contains the length of the next item to be matched in the pattern +string. When the callout immediately precedes an alternation bar, a closing +parenthesis, or the end of the pattern, the length is zero. When the callout +precedes an opening parenthesis, the length is that of the entire subpattern. +

+

+The pattern_position and next_item_length fields are intended to +help in distinguishing between different automatic callouts, which all have the +same callout number. However, they are set for all callouts. +

+

+The mark field is present from version 2 of the callout structure. In +callouts from pcre_exec() or pcre[16|32]_exec() it contains a +pointer to the zero-terminated name of the most recently passed (*MARK), +(*PRUNE), or (*THEN) item in the match, or NULL if no such items have been +passed. Instances of (*PRUNE) or (*THEN) without a name do not obliterate a +previous (*MARK). In callouts from the DFA matching functions this field always +contains NULL. +

+
RETURN VALUES
+

+The external callout function returns an integer to PCRE. If the value is zero, +matching proceeds as normal. If the value is greater than zero, matching fails +at the current point, but the testing of other matching possibilities goes +ahead, just as if a lookahead assertion had failed. If the value is less than +zero, the match is abandoned, the matching function returns the negative value. +

+

+Negative values should normally be chosen from the set of PCRE_ERROR_xxx +values. In particular, PCRE_ERROR_NOMATCH forces a standard "no match" failure. +The error number PCRE_ERROR_CALLOUT is reserved for use by callout functions; +it will never be used by PCRE itself. +

+
AUTHOR
+

+Philip Hazel +
+University Computing Service +
+Cambridge CB2 3QH, England. +
+

+
REVISION
+

+Last updated: 12 November 2013 +
+Copyright © 1997-2013 University of Cambridge. +
+

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcrecompat.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcrecompat.html new file mode 100755 index 000000000..d95570ef1 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcrecompat.html @@ -0,0 +1,235 @@ + + +pcrecompat specification + + +

pcrecompat man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+
+DIFFERENCES BETWEEN PCRE AND PERL +
+

+This document describes the differences in the ways that PCRE and Perl handle +regular expressions. The differences described here are with respect to Perl +versions 5.10 and above. +

+

+1. PCRE has only a subset of Perl's Unicode support. Details of what it does +have are given in the +pcreunicode +page. +

+

+2. PCRE allows repeat quantifiers only on parenthesized assertions, but they do +not mean what you might think. For example, (?!a){3} does not assert that the +next three characters are not "a". It just asserts that the next character is +not "a" three times (in principle: PCRE optimizes this to run the assertion +just once). Perl allows repeat quantifiers on other assertions such as \b, but +these do not seem to have any use. +

+

+3. Capturing subpatterns that occur inside negative lookahead assertions are +counted, but their entries in the offsets vector are never set. Perl sometimes +(but not always) sets its numerical variables from inside negative assertions. +

+

+4. Though binary zero characters are supported in the subject string, they are +not allowed in a pattern string because it is passed as a normal C string, +terminated by zero. The escape sequence \0 can be used in the pattern to +represent a binary zero. +

+

+5. The following Perl escape sequences are not supported: \l, \u, \L, +\U, and \N when followed by a character name or Unicode value. (\N on its +own, matching a non-newline character, is supported.) In fact these are +implemented by Perl's general string-handling and are not part of its pattern +matching engine. If any of these are encountered by PCRE, an error is +generated by default. However, if the PCRE_JAVASCRIPT_COMPAT option is set, +\U and \u are interpreted as JavaScript interprets them. +

+

+6. The Perl escape sequences \p, \P, and \X are supported only if PCRE is +built with Unicode character property support. The properties that can be +tested with \p and \P are limited to the general category properties such as +Lu and Nd, script names such as Greek or Han, and the derived properties Any +and L&. PCRE does support the Cs (surrogate) property, which Perl does not; the +Perl documentation says "Because Perl hides the need for the user to understand +the internal representation of Unicode characters, there is no need to +implement the somewhat messy concept of surrogates." +

+

+7. PCRE does support the \Q...\E escape for quoting substrings. Characters in +between are treated as literals. This is slightly different from Perl in that $ +and @ are also handled as literals inside the quotes. In Perl, they cause +variable interpolation (but of course PCRE does not have variables). Note the +following examples: +

+    Pattern            PCRE matches      Perl matches
+
+    \Qabc$xyz\E        abc$xyz           abc followed by the contents of $xyz
+    \Qabc\$xyz\E       abc\$xyz          abc\$xyz
+    \Qabc\E\$\Qxyz\E   abc$xyz           abc$xyz
+
+The \Q...\E sequence is recognized both inside and outside character classes. +

+

+8. Fairly obviously, PCRE does not support the (?{code}) and (??{code}) +constructions. However, there is support for recursive patterns. This is not +available in Perl 5.8, but it is in Perl 5.10. Also, the PCRE "callout" +feature allows an external function to be called during pattern matching. See +the +pcrecallout +documentation for details. +

+

+9. Subpatterns that are called as subroutines (whether or not recursively) are +always treated as atomic groups in PCRE. This is like Python, but unlike Perl. +Captured values that are set outside a subroutine call can be reference from +inside in PCRE, but not in Perl. There is a discussion that explains these +differences in more detail in the +section on recursion differences from Perl +in the +pcrepattern +page. +

+

+10. If any of the backtracking control verbs are used in a subpattern that is +called as a subroutine (whether or not recursively), their effect is confined +to that subpattern; it does not extend to the surrounding pattern. This is not +always the case in Perl. In particular, if (*THEN) is present in a group that +is called as a subroutine, its action is limited to that group, even if the +group does not contain any | characters. Note that such subpatterns are +processed as anchored at the point where they are tested. +

+

+11. If a pattern contains more than one backtracking control verb, the first +one that is backtracked onto acts. For example, in the pattern +A(*COMMIT)B(*PRUNE)C a failure in B triggers (*COMMIT), but a failure in C +triggers (*PRUNE). Perl's behaviour is more complex; in many cases it is the +same as PCRE, but there are examples where it differs. +

+

+12. Most backtracking verbs in assertions have their normal actions. They are +not confined to the assertion. +

+

+13. There are some differences that are concerned with the settings of captured +strings when part of a pattern is repeated. For example, matching "aba" against +the pattern /^(a(b)?)+$/ in Perl leaves $2 unset, but in PCRE it is set to "b". +

+

+14. PCRE's handling of duplicate subpattern numbers and duplicate subpattern +names is not as general as Perl's. This is a consequence of the fact the PCRE +works internally just with numbers, using an external table to translate +between numbers and names. In particular, a pattern such as (?|(?<a>A)|(?<b>B), +where the two capturing parentheses have the same number but different names, +is not supported, and causes an error at compile time. If it were allowed, it +would not be possible to distinguish which parentheses matched, because both +names map to capturing subpattern number 1. To avoid this confusing situation, +an error is given at compile time. +

+

+15. Perl recognizes comments in some places that PCRE does not, for example, +between the ( and ? at the start of a subpattern. If the /x modifier is set, +Perl allows white space between ( and ? (though current Perls warn that this is +deprecated) but PCRE never does, even if the PCRE_EXTENDED option is set. +

+

+16. Perl, when in warning mode, gives warnings for character classes such as +[A-\d] or [a-[:digit:]]. It then treats the hyphens as literals. PCRE has no +warning features, so it gives an error in these cases because they are almost +certainly user mistakes. +

+

+17. In PCRE, the upper/lower case character properties Lu and Ll are not +affected when case-independent matching is specified. For example, \p{Lu} +always matches an upper case letter. I think Perl has changed in this respect; +in the release at the time of writing (5.16), \p{Lu} and \p{Ll} match all +letters, regardless of case, when case independence is specified. +

+

+18. PCRE provides some extensions to the Perl regular expression facilities. +Perl 5.10 includes new features that are not in earlier versions of Perl, some +of which (such as named parentheses) have been in PCRE for some time. This list +is with respect to Perl 5.10: +
+
+(a) Although lookbehind assertions in PCRE must match fixed length strings, +each alternative branch of a lookbehind assertion can match a different length +of string. Perl requires them all to have the same length. +
+
+(b) If PCRE_DOLLAR_ENDONLY is set and PCRE_MULTILINE is not set, the $ +meta-character matches only at the very end of the string. +
+
+(c) If PCRE_EXTRA is set, a backslash followed by a letter with no special +meaning is faulted. Otherwise, like Perl, the backslash is quietly ignored. +(Perl can be made to issue a warning.) +
+
+(d) If PCRE_UNGREEDY is set, the greediness of the repetition quantifiers is +inverted, that is, by default they are not greedy, but if followed by a +question mark they are. +
+
+(e) PCRE_ANCHORED can be used at matching time to force a pattern to be tried +only at the first matching position in the subject string. +
+
+(f) The PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, and +PCRE_NO_AUTO_CAPTURE options for pcre_exec() have no Perl equivalents. +
+
+(g) The \R escape sequence can be restricted to match only CR, LF, or CRLF +by the PCRE_BSR_ANYCRLF option. +
+
+(h) The callout facility is PCRE-specific. +
+
+(i) The partial matching facility is PCRE-specific. +
+
+(j) Patterns compiled by PCRE can be saved and re-used at a later time, even on +different hosts that have the other endianness. However, this does not apply to +optimized data created by the just-in-time compiler. +
+
+(k) The alternative matching functions (pcre_dfa_exec(), +pcre16_dfa_exec() and pcre32_dfa_exec(),) match in a different way +and are not Perl-compatible. +
+
+(l) PCRE recognizes some special sequences such as (*CR) at the start of +a pattern that set overall options that cannot be changed within the pattern. +

+
+AUTHOR +
+

+Philip Hazel +
+University Computing Service +
+Cambridge CB2 3QH, England. +
+

+
+REVISION +
+

+Last updated: 10 November 2013 +
+Copyright © 1997-2013 University of Cambridge. +
+

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcrecpp.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcrecpp.html new file mode 100755 index 000000000..b7eac3a3d --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcrecpp.html @@ -0,0 +1,368 @@ + + +pcrecpp specification + + +

pcrecpp man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+

+
SYNOPSIS OF C++ WRAPPER
+

+#include <pcrecpp.h> +

+
DESCRIPTION
+

+The C++ wrapper for PCRE was provided by Google Inc. Some additional +functionality was added by Giuseppe Maxia. This brief man page was constructed +from the notes in the pcrecpp.h file, which should be consulted for +further details. Note that the C++ wrapper supports only the original 8-bit +PCRE library. There is no 16-bit or 32-bit support at present. +

+
MATCHING INTERFACE
+

+The "FullMatch" operation checks that supplied text matches a supplied pattern +exactly. If pointer arguments are supplied, it copies matched sub-strings that +match sub-patterns into them. +

+  Example: successful match
+     pcrecpp::RE re("h.*o");
+     re.FullMatch("hello");
+
+  Example: unsuccessful match (requires full match):
+     pcrecpp::RE re("e");
+     !re.FullMatch("hello");
+
+  Example: creating a temporary RE object:
+     pcrecpp::RE("h.*o").FullMatch("hello");
+
+You can pass in a "const char*" or a "string" for "text". The examples below +tend to use a const char*. You can, as in the different examples above, store +the RE object explicitly in a variable or use a temporary RE object. The +examples below use one mode or the other arbitrarily. Either could correctly be +used for any of these examples. +

+

+You must supply extra pointer arguments to extract matched subpieces. +

+  Example: extracts "ruby" into "s" and 1234 into "i"
+     int i;
+     string s;
+     pcrecpp::RE re("(\\w+):(\\d+)");
+     re.FullMatch("ruby:1234", &s, &i);
+
+  Example: does not try to extract any extra sub-patterns
+     re.FullMatch("ruby:1234", &s);
+
+  Example: does not try to extract into NULL
+     re.FullMatch("ruby:1234", NULL, &i);
+
+  Example: integer overflow causes failure
+     !re.FullMatch("ruby:1234567891234", NULL, &i);
+
+  Example: fails because there aren't enough sub-patterns:
+     !pcrecpp::RE("\\w+:\\d+").FullMatch("ruby:1234", &s);
+
+  Example: fails because string cannot be stored in integer
+     !pcrecpp::RE("(.*)").FullMatch("ruby", &i);
+
+The provided pointer arguments can be pointers to any scalar numeric +type, or one of: +
+   string        (matched piece is copied to string)
+   StringPiece   (StringPiece is mutated to point to matched piece)
+   T             (where "bool T::ParseFrom(const char*, int)" exists)
+   NULL          (the corresponding matched sub-pattern is not copied)
+
+The function returns true iff all of the following conditions are satisfied: +
+  a. "text" matches "pattern" exactly;
+
+  b. The number of matched sub-patterns is >= number of supplied
+     pointers;
+
+  c. The "i"th argument has a suitable type for holding the
+     string captured as the "i"th sub-pattern. If you pass in
+     void * NULL for the "i"th argument, or a non-void * NULL
+     of the correct type, or pass fewer arguments than the
+     number of sub-patterns, "i"th captured sub-pattern is
+     ignored.
+
+CAVEAT: An optional sub-pattern that does not exist in the matched +string is assigned the empty string. Therefore, the following will +return false (because the empty string is not a valid number): +
+   int number;
+   pcrecpp::RE::FullMatch("abc", "[a-z]+(\\d+)?", &number);
+
+The matching interface supports at most 16 arguments per call. +If you need more, consider using the more general interface +pcrecpp::RE::DoMatch. See pcrecpp.h for the signature for +DoMatch. +

+

+NOTE: Do not use no_arg, which is used internally to mark the end of a +list of optional arguments, as a placeholder for missing arguments, as this can +lead to segfaults. +

+
QUOTING METACHARACTERS
+

+You can use the "QuoteMeta" operation to insert backslashes before all +potentially meaningful characters in a string. The returned string, used as a +regular expression, will exactly match the original string. +

+  Example:
+     string quoted = RE::QuoteMeta(unquoted);
+
+Note that it's legal to escape a character even if it has no special meaning in +a regular expression -- so this function does that. (This also makes it +identical to the perl function of the same name; see "perldoc -f quotemeta".) +For example, "1.5-2.0?" becomes "1\.5\-2\.0\?". +

+
PARTIAL MATCHES
+

+You can use the "PartialMatch" operation when you want the pattern +to match any substring of the text. +

+  Example: simple search for a string:
+     pcrecpp::RE("ell").PartialMatch("hello");
+
+  Example: find first number in a string:
+     int number;
+     pcrecpp::RE re("(\\d+)");
+     re.PartialMatch("x*100 + 20", &number);
+     assert(number == 100);
+
+

+
UTF-8 AND THE MATCHING INTERFACE
+

+By default, pattern and text are plain text, one byte per character. The UTF8 +flag, passed to the constructor, causes both pattern and string to be treated +as UTF-8 text, still a byte stream but potentially multiple bytes per +character. In practice, the text is likelier to be UTF-8 than the pattern, but +the match returned may depend on the UTF8 flag, so always use it when matching +UTF8 text. For example, "." will match one byte normally but with UTF8 set may +match up to three bytes of a multi-byte character. +

+  Example:
+     pcrecpp::RE_Options options;
+     options.set_utf8();
+     pcrecpp::RE re(utf8_pattern, options);
+     re.FullMatch(utf8_string);
+
+  Example: using the convenience function UTF8():
+     pcrecpp::RE re(utf8_pattern, pcrecpp::UTF8());
+     re.FullMatch(utf8_string);
+
+NOTE: The UTF8 flag is ignored if pcre was not configured with the +
+      --enable-utf8 flag.
+
+

+
PASSING MODIFIERS TO THE REGULAR EXPRESSION ENGINE
+

+PCRE defines some modifiers to change the behavior of the regular expression +engine. The C++ wrapper defines an auxiliary class, RE_Options, as a vehicle to +pass such modifiers to a RE class. Currently, the following modifiers are +supported: +

+   modifier              description               Perl corresponding
+
+   PCRE_CASELESS         case insensitive match      /i
+   PCRE_MULTILINE        multiple lines match        /m
+   PCRE_DOTALL           dot matches newlines        /s
+   PCRE_DOLLAR_ENDONLY   $ matches only at end       N/A
+   PCRE_EXTRA            strict escape parsing       N/A
+   PCRE_EXTENDED         ignore white spaces         /x
+   PCRE_UTF8             handles UTF8 chars          built-in
+   PCRE_UNGREEDY         reverses * and *?           N/A
+   PCRE_NO_AUTO_CAPTURE  disables capturing parens   N/A (*)
+
+(*) Both Perl and PCRE allow non capturing parentheses by means of the +"?:" modifier within the pattern itself. e.g. (?:ab|cd) does not +capture, while (ab|cd) does. +

+

+For a full account on how each modifier works, please check the +PCRE API reference page. +

+

+For each modifier, there are two member functions whose name is made +out of the modifier in lowercase, without the "PCRE_" prefix. For +instance, PCRE_CASELESS is handled by +

+  bool caseless()
+
+which returns true if the modifier is set, and +
+  RE_Options & set_caseless(bool)
+
+which sets or unsets the modifier. Moreover, PCRE_EXTRA_MATCH_LIMIT can be +accessed through the set_match_limit() and match_limit() member +functions. Setting match_limit to a non-zero value will limit the +execution of pcre to keep it from doing bad things like blowing the stack or +taking an eternity to return a result. A value of 5000 is good enough to stop +stack blowup in a 2MB thread stack. Setting match_limit to zero disables +match limiting. Alternatively, you can call match_limit_recursion() +which uses PCRE_EXTRA_MATCH_LIMIT_RECURSION to limit how much PCRE +recurses. match_limit() limits the number of matches PCRE does; +match_limit_recursion() limits the depth of internal recursion, and +therefore the amount of stack that is used. +

+

+Normally, to pass one or more modifiers to a RE class, you declare +a RE_Options object, set the appropriate options, and pass this +object to a RE constructor. Example: +

+   RE_Options opt;
+   opt.set_caseless(true);
+   if (RE("HELLO", opt).PartialMatch("hello world")) ...
+
+RE_options has two constructors. The default constructor takes no arguments and +creates a set of flags that are off by default. The optional parameter +option_flags is to facilitate transfer of legacy code from C programs. +This lets you do +
+   RE(pattern,
+     RE_Options(PCRE_CASELESS|PCRE_MULTILINE)).PartialMatch(str);
+
+However, new code is better off doing +
+   RE(pattern,
+     RE_Options().set_caseless(true).set_multiline(true))
+       .PartialMatch(str);
+
+If you are going to pass one of the most used modifiers, there are some +convenience functions that return a RE_Options class with the +appropriate modifier already set: CASELESS(), UTF8(), +MULTILINE(), DOTALL(), and EXTENDED(). +

+

+If you need to set several options at once, and you don't want to go through +the pains of declaring a RE_Options object and setting several options, there +is a parallel method that give you such ability on the fly. You can concatenate +several set_xxxxx() member functions, since each of them returns a +reference to its class object. For example, to pass PCRE_CASELESS, +PCRE_EXTENDED, and PCRE_MULTILINE to a RE with one statement, you may write: +

+   RE(" ^ xyz \\s+ .* blah$",
+     RE_Options()
+       .set_caseless(true)
+       .set_extended(true)
+       .set_multiline(true)).PartialMatch(sometext);
+
+
+

+
SCANNING TEXT INCREMENTALLY
+

+The "Consume" operation may be useful if you want to repeatedly +match regular expressions at the front of a string and skip over +them as they match. This requires use of the "StringPiece" type, +which represents a sub-range of a real string. Like RE, StringPiece +is defined in the pcrecpp namespace. +

+  Example: read lines of the form "var = value" from a string.
+     string contents = ...;                 // Fill string somehow
+     pcrecpp::StringPiece input(contents);  // Wrap in a StringPiece
+
+     string var;
+     int value;
+     pcrecpp::RE re("(\\w+) = (\\d+)\n");
+     while (re.Consume(&input, &var, &value)) {
+       ...;
+     }
+
+Each successful call to "Consume" will set "var/value", and also +advance "input" so it points past the matched text. +

+

+The "FindAndConsume" operation is similar to "Consume" but does not +anchor your match at the beginning of the string. For example, you +could extract all words from a string by repeatedly calling +

+  pcrecpp::RE("(\\w+)").FindAndConsume(&input, &word)
+
+

+
PARSING HEX/OCTAL/C-RADIX NUMBERS
+

+By default, if you pass a pointer to a numeric value, the +corresponding text is interpreted as a base-10 number. You can +instead wrap the pointer with a call to one of the operators Hex(), +Octal(), or CRadix() to interpret the text in another base. The +CRadix operator interprets C-style "0" (base-8) and "0x" (base-16) +prefixes, but defaults to base-10. +

+  Example:
+    int a, b, c, d;
+    pcrecpp::RE re("(.*) (.*) (.*) (.*)");
+    re.FullMatch("100 40 0100 0x40",
+                 pcrecpp::Octal(&a), pcrecpp::Hex(&b),
+                 pcrecpp::CRadix(&c), pcrecpp::CRadix(&d));
+
+will leave 64 in a, b, c, and d. +

+
REPLACING PARTS OF STRINGS
+

+You can replace the first match of "pattern" in "str" with "rewrite". +Within "rewrite", backslash-escaped digits (\1 to \9) can be +used to insert text matching corresponding parenthesized group +from the pattern. \0 in "rewrite" refers to the entire matching +text. For example: +

+  string s = "yabba dabba doo";
+  pcrecpp::RE("b+").Replace("d", &s);
+
+will leave "s" containing "yada dabba doo". The result is true if the pattern +matches and a replacement occurs, false otherwise. +

+

+GlobalReplace is like Replace except that it replaces all +occurrences of the pattern in the string with the rewrite. Replacements are +not subject to re-matching. For example: +

+  string s = "yabba dabba doo";
+  pcrecpp::RE("b+").GlobalReplace("d", &s);
+
+will leave "s" containing "yada dada doo". It returns the number of +replacements made. +

+

+Extract is like Replace, except that if the pattern matches, +"rewrite" is copied into "out" (an additional argument) with substitutions. +The non-matching portions of "text" are ignored. Returns true iff a match +occurred and the extraction happened successfully; if no match occurs, the +string is left unaffected. +

+
AUTHOR
+

+The C++ wrapper was contributed by Google Inc. +
+Copyright © 2007 Google Inc. +
+

+
REVISION
+

+Last updated: 08 January 2012 +
+

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcredemo.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcredemo.html new file mode 100755 index 000000000..894a93082 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcredemo.html @@ -0,0 +1,426 @@ + + +pcredemo specification + + +

pcredemo man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+

    +
+
+/*************************************************
+*           PCRE DEMONSTRATION PROGRAM           *
+*************************************************/
+
+/* This is a demonstration program to illustrate the most straightforward ways
+of calling the PCRE regular expression library from a C program. See the
+pcresample documentation for a short discussion ("man pcresample" if you have
+the PCRE man pages installed).
+
+In Unix-like environments, if PCRE is installed in your standard system
+libraries, you should be able to compile this program using this command:
+
+gcc -Wall pcredemo.c -lpcre -o pcredemo
+
+If PCRE is not installed in a standard place, it is likely to be installed with
+support for the pkg-config mechanism. If you have pkg-config, you can compile
+this program using this command:
+
+gcc -Wall pcredemo.c `pkg-config --cflags --libs libpcre` -o pcredemo
+
+If you do not have pkg-config, you may have to use this:
+
+gcc -Wall pcredemo.c -I/usr/local/include -L/usr/local/lib \
+  -R/usr/local/lib -lpcre -o pcredemo
+
+Replace "/usr/local/include" and "/usr/local/lib" with wherever the include and
+library files for PCRE are installed on your system. Only some operating
+systems (e.g. Solaris) use the -R option.
+
+Building under Windows:
+
+If you want to statically link this program against a non-dll .a file, you must
+define PCRE_STATIC before including pcre.h, otherwise the pcre_malloc() and
+pcre_free() exported functions will be declared __declspec(dllimport), with
+unwanted results. So in this environment, uncomment the following line. */
+
+/* #define PCRE_STATIC */
+
+#include <stdio.h>
+#include <string.h>
+#include <pcre.h>
+
+#define OVECCOUNT 30    /* should be a multiple of 3 */
+
+
+int main(int argc, char **argv)
+{
+pcre *re;
+const char *error;
+char *pattern;
+char *subject;
+unsigned char *name_table;
+unsigned int option_bits;
+int erroffset;
+int find_all;
+int crlf_is_newline;
+int namecount;
+int name_entry_size;
+int ovector[OVECCOUNT];
+int subject_length;
+int rc, i;
+int utf8;
+
+
+/**************************************************************************
+* First, sort out the command line. There is only one possible option at  *
+* the moment, "-g" to request repeated matching to find all occurrences,  *
+* like Perl's /g option. We set the variable find_all to a non-zero value *
+* if the -g option is present. Apart from that, there must be exactly two *
+* arguments.                                                              *
+**************************************************************************/
+
+find_all = 0;
+for (i = 1; i < argc; i++)
+  {
+  if (strcmp(argv[i], "-g") == 0) find_all = 1;
+    else break;
+  }
+
+/* After the options, we require exactly two arguments, which are the pattern,
+and the subject string. */
+
+if (argc - i != 2)
+  {
+  printf("Two arguments required: a regex and a subject string\n");
+  return 1;
+  }
+
+pattern = argv[i];
+subject = argv[i+1];
+subject_length = (int)strlen(subject);
+
+
+/*************************************************************************
+* Now we are going to compile the regular expression pattern, and handle *
+* and errors that are detected.                                          *
+*************************************************************************/
+
+re = pcre_compile(
+  pattern,              /* the pattern */
+  0,                    /* default options */
+  &error,               /* for error message */
+  &erroffset,           /* for error offset */
+  NULL);                /* use default character tables */
+
+/* Compilation failed: print the error message and exit */
+
+if (re == NULL)
+  {
+  printf("PCRE compilation failed at offset %d: %s\n", erroffset, error);
+  return 1;
+  }
+
+
+/*************************************************************************
+* If the compilation succeeded, we call PCRE again, in order to do a     *
+* pattern match against the subject string. This does just ONE match. If *
+* further matching is needed, it will be done below.                     *
+*************************************************************************/
+
+rc = pcre_exec(
+  re,                   /* the compiled pattern */
+  NULL,                 /* no extra data - we didn't study the pattern */
+  subject,              /* the subject string */
+  subject_length,       /* the length of the subject */
+  0,                    /* start at offset 0 in the subject */
+  0,                    /* default options */
+  ovector,              /* output vector for substring information */
+  OVECCOUNT);           /* number of elements in the output vector */
+
+/* Matching failed: handle error cases */
+
+if (rc < 0)
+  {
+  switch(rc)
+    {
+    case PCRE_ERROR_NOMATCH: printf("No match\n"); break;
+    /*
+    Handle other special cases if you like
+    */
+    default: printf("Matching error %d\n", rc); break;
+    }
+  pcre_free(re);     /* Release memory used for the compiled pattern */
+  return 1;
+  }
+
+/* Match succeded */
+
+printf("\nMatch succeeded at offset %d\n", ovector[0]);
+
+
+/*************************************************************************
+* We have found the first match within the subject string. If the output *
+* vector wasn't big enough, say so. Then output any substrings that were *
+* captured.                                                              *
+*************************************************************************/
+
+/* The output vector wasn't big enough */
+
+if (rc == 0)
+  {
+  rc = OVECCOUNT/3;
+  printf("ovector only has room for %d captured substrings\n", rc - 1);
+  }
+
+/* Show substrings stored in the output vector by number. Obviously, in a real
+application you might want to do things other than print them. */
+
+for (i = 0; i < rc; i++)
+  {
+  char *substring_start = subject + ovector[2*i];
+  int substring_length = ovector[2*i+1] - ovector[2*i];
+  printf("%2d: %.*s\n", i, substring_length, substring_start);
+  }
+
+
+/**************************************************************************
+* That concludes the basic part of this demonstration program. We have    *
+* compiled a pattern, and performed a single match. The code that follows *
+* shows first how to access named substrings, and then how to code for    *
+* repeated matches on the same subject.                                   *
+**************************************************************************/
+
+/* See if there are any named substrings, and if so, show them by name. First
+we have to extract the count of named parentheses from the pattern. */
+
+(void)pcre_fullinfo(
+  re,                   /* the compiled pattern */
+  NULL,                 /* no extra data - we didn't study the pattern */
+  PCRE_INFO_NAMECOUNT,  /* number of named substrings */
+  &namecount);          /* where to put the answer */
+
+if (namecount <= 0) printf("No named substrings\n"); else
+  {
+  unsigned char *tabptr;
+  printf("Named substrings\n");
+
+  /* Before we can access the substrings, we must extract the table for
+  translating names to numbers, and the size of each entry in the table. */
+
+  (void)pcre_fullinfo(
+    re,                       /* the compiled pattern */
+    NULL,                     /* no extra data - we didn't study the pattern */
+    PCRE_INFO_NAMETABLE,      /* address of the table */
+    &name_table);             /* where to put the answer */
+
+  (void)pcre_fullinfo(
+    re,                       /* the compiled pattern */
+    NULL,                     /* no extra data - we didn't study the pattern */
+    PCRE_INFO_NAMEENTRYSIZE,  /* size of each entry in the table */
+    &name_entry_size);        /* where to put the answer */
+
+  /* Now we can scan the table and, for each entry, print the number, the name,
+  and the substring itself. */
+
+  tabptr = name_table;
+  for (i = 0; i < namecount; i++)
+    {
+    int n = (tabptr[0] << 8) | tabptr[1];
+    printf("(%d) %*s: %.*s\n", n, name_entry_size - 3, tabptr + 2,
+      ovector[2*n+1] - ovector[2*n], subject + ovector[2*n]);
+    tabptr += name_entry_size;
+    }
+  }
+
+
+/*************************************************************************
+* If the "-g" option was given on the command line, we want to continue  *
+* to search for additional matches in the subject string, in a similar   *
+* way to the /g option in Perl. This turns out to be trickier than you   *
+* might think because of the possibility of matching an empty string.    *
+* What happens is as follows:                                            *
+*                                                                        *
+* If the previous match was NOT for an empty string, we can just start   *
+* the next match at the end of the previous one.                         *
+*                                                                        *
+* If the previous match WAS for an empty string, we can't do that, as it *
+* would lead to an infinite loop. Instead, a special call of pcre_exec() *
+* is made with the PCRE_NOTEMPTY_ATSTART and PCRE_ANCHORED flags set.    *
+* The first of these tells PCRE that an empty string at the start of the *
+* subject is not a valid match; other possibilities must be tried. The   *
+* second flag restricts PCRE to one match attempt at the initial string  *
+* position. If this match succeeds, an alternative to the empty string   *
+* match has been found, and we can print it and proceed round the loop,  *
+* advancing by the length of whatever was found. If this match does not  *
+* succeed, we still stay in the loop, advancing by just one character.   *
+* In UTF-8 mode, which can be set by (*UTF8) in the pattern, this may be *
+* more than one byte.                                                    *
+*                                                                        *
+* However, there is a complication concerned with newlines. When the     *
+* newline convention is such that CRLF is a valid newline, we must       *
+* advance by two characters rather than one. The newline convention can  *
+* be set in the regex by (*CR), etc.; if not, we must find the default.  *
+*************************************************************************/
+
+if (!find_all)     /* Check for -g */
+  {
+  pcre_free(re);   /* Release the memory used for the compiled pattern */
+  return 0;        /* Finish unless -g was given */
+  }
+
+/* Before running the loop, check for UTF-8 and whether CRLF is a valid newline
+sequence. First, find the options with which the regex was compiled; extract
+the UTF-8 state, and mask off all but the newline options. */
+
+(void)pcre_fullinfo(re, NULL, PCRE_INFO_OPTIONS, &option_bits);
+utf8 = option_bits & PCRE_UTF8;
+option_bits &= PCRE_NEWLINE_CR|PCRE_NEWLINE_LF|PCRE_NEWLINE_CRLF|
+               PCRE_NEWLINE_ANY|PCRE_NEWLINE_ANYCRLF;
+
+/* If no newline options were set, find the default newline convention from the
+build configuration. */
+
+if (option_bits == 0)
+  {
+  int d;
+  (void)pcre_config(PCRE_CONFIG_NEWLINE, &d);
+  /* Note that these values are always the ASCII ones, even in
+  EBCDIC environments. CR = 13, NL = 10. */
+  option_bits = (d == 13)? PCRE_NEWLINE_CR :
+          (d == 10)? PCRE_NEWLINE_LF :
+          (d == (13<<8 | 10))? PCRE_NEWLINE_CRLF :
+          (d == -2)? PCRE_NEWLINE_ANYCRLF :
+          (d == -1)? PCRE_NEWLINE_ANY : 0;
+  }
+
+/* See if CRLF is a valid newline sequence. */
+
+crlf_is_newline =
+     option_bits == PCRE_NEWLINE_ANY ||
+     option_bits == PCRE_NEWLINE_CRLF ||
+     option_bits == PCRE_NEWLINE_ANYCRLF;
+
+/* Loop for second and subsequent matches */
+
+for (;;)
+  {
+  int options = 0;                 /* Normally no options */
+  int start_offset = ovector[1];   /* Start at end of previous match */
+
+  /* If the previous match was for an empty string, we are finished if we are
+  at the end of the subject. Otherwise, arrange to run another match at the
+  same point to see if a non-empty match can be found. */
+
+  if (ovector[0] == ovector[1])
+    {
+    if (ovector[0] == subject_length) break;
+    options = PCRE_NOTEMPTY_ATSTART | PCRE_ANCHORED;
+    }
+
+  /* Run the next matching operation */
+
+  rc = pcre_exec(
+    re,                   /* the compiled pattern */
+    NULL,                 /* no extra data - we didn't study the pattern */
+    subject,              /* the subject string */
+    subject_length,       /* the length of the subject */
+    start_offset,         /* starting offset in the subject */
+    options,              /* options */
+    ovector,              /* output vector for substring information */
+    OVECCOUNT);           /* number of elements in the output vector */
+
+  /* This time, a result of NOMATCH isn't an error. If the value in "options"
+  is zero, it just means we have found all possible matches, so the loop ends.
+  Otherwise, it means we have failed to find a non-empty-string match at a
+  point where there was a previous empty-string match. In this case, we do what
+  Perl does: advance the matching position by one character, and continue. We
+  do this by setting the "end of previous match" offset, because that is picked
+  up at the top of the loop as the point at which to start again.
+
+  There are two complications: (a) When CRLF is a valid newline sequence, and
+  the current position is just before it, advance by an extra byte. (b)
+  Otherwise we must ensure that we skip an entire UTF-8 character if we are in
+  UTF-8 mode. */
+
+  if (rc == PCRE_ERROR_NOMATCH)
+    {
+    if (options == 0) break;                    /* All matches found */
+    ovector[1] = start_offset + 1;              /* Advance one byte */
+    if (crlf_is_newline &&                      /* If CRLF is newline & */
+        start_offset < subject_length - 1 &&    /* we are at CRLF, */
+        subject[start_offset] == '\r' &&
+        subject[start_offset + 1] == '\n')
+      ovector[1] += 1;                          /* Advance by one more. */
+    else if (utf8)                              /* Otherwise, ensure we */
+      {                                         /* advance a whole UTF-8 */
+      while (ovector[1] < subject_length)       /* character. */
+        {
+        if ((subject[ovector[1]] & 0xc0) != 0x80) break;
+        ovector[1] += 1;
+        }
+      }
+    continue;    /* Go round the loop again */
+    }
+
+  /* Other matching errors are not recoverable. */
+
+  if (rc < 0)
+    {
+    printf("Matching error %d\n", rc);
+    pcre_free(re);    /* Release memory used for the compiled pattern */
+    return 1;
+    }
+
+  /* Match succeded */
+
+  printf("\nMatch succeeded again at offset %d\n", ovector[0]);
+
+  /* The match succeeded, but the output vector wasn't big enough. */
+
+  if (rc == 0)
+    {
+    rc = OVECCOUNT/3;
+    printf("ovector only has room for %d captured substrings\n", rc - 1);
+    }
+
+  /* As before, show substrings stored in the output vector by number, and then
+  also any named substrings. */
+
+  for (i = 0; i < rc; i++)
+    {
+    char *substring_start = subject + ovector[2*i];
+    int substring_length = ovector[2*i+1] - ovector[2*i];
+    printf("%2d: %.*s\n", i, substring_length, substring_start);
+    }
+
+  if (namecount <= 0) printf("No named substrings\n"); else
+    {
+    unsigned char *tabptr = name_table;
+    printf("Named substrings\n");
+    for (i = 0; i < namecount; i++)
+      {
+      int n = (tabptr[0] << 8) | tabptr[1];
+      printf("(%d) %*s: %.*s\n", n, name_entry_size - 3, tabptr + 2,
+        ovector[2*n+1] - ovector[2*n], subject + ovector[2*n]);
+      tabptr += name_entry_size;
+      }
+    }
+  }      /* End of loop to find second and subsequent matches */
+
+printf("\n");
+pcre_free(re);       /* Release memory used for the compiled pattern */
+return 0;
+}
+
+/* End of pcredemo.c */
+

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcregrep.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcregrep.html new file mode 100755 index 000000000..dacbb4998 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcregrep.html @@ -0,0 +1,759 @@ + + +pcregrep specification + + +

pcregrep man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+

+
SYNOPSIS
+

+pcregrep [options] [long options] [pattern] [path1 path2 ...] +

+
DESCRIPTION
+

+pcregrep searches files for character patterns, in the same way as other +grep commands do, but it uses the PCRE regular expression library to support +patterns that are compatible with the regular expressions of Perl 5. See +pcresyntax(3) +for a quick-reference summary of pattern syntax, or +pcrepattern(3) +for a full description of the syntax and semantics of the regular expressions +that PCRE supports. +

+

+Patterns, whether supplied on the command line or in a separate file, are given +without delimiters. For example: +

+  pcregrep Thursday /etc/motd
+
+If you attempt to use delimiters (for example, by surrounding a pattern with +slashes, as is common in Perl scripts), they are interpreted as part of the +pattern. Quotes can of course be used to delimit patterns on the command line +because they are interpreted by the shell, and indeed quotes are required if a +pattern contains white space or shell metacharacters. +

+

+The first argument that follows any option settings is treated as the single +pattern to be matched when neither -e nor -f is present. +Conversely, when one or both of these options are used to specify patterns, all +arguments are treated as path names. At least one of -e, -f, or an +argument pattern must be provided. +

+

+If no files are specified, pcregrep reads the standard input. The +standard input can also be referenced by a name consisting of a single hyphen. +For example: +

+  pcregrep some-pattern /file1 - /file3
+
+By default, each line that matches a pattern is copied to the standard +output, and if there is more than one file, the file name is output at the +start of each line, followed by a colon. However, there are options that can +change how pcregrep behaves. In particular, the -M option makes it +possible to search for patterns that span line boundaries. What defines a line +boundary is controlled by the -N (--newline) option. +

+

+The amount of memory used for buffering files that are being scanned is +controlled by a parameter that can be set by the --buffer-size option. +The default value for this parameter is specified when pcregrep is built, +with the default default being 20K. A block of memory three times this size is +used (to allow for buffering "before" and "after" lines). An error occurs if a +line overflows the buffer. +

+

+Patterns can be no longer than 8K or BUFSIZ bytes, whichever is the greater. +BUFSIZ is defined in <stdio.h>. When there is more than one pattern +(specified by the use of -e and/or -f), each pattern is applied to +each line in the order in which they are defined, except that all the -e +patterns are tried before the -f patterns. +

+

+By default, as soon as one pattern matches a line, no further patterns are +considered. However, if --colour (or --color) is used to colour the +matching substrings, or if --only-matching, --file-offsets, or +--line-offsets is used to output only the part of the line that matched +(either shown literally, or as an offset), scanning resumes immediately +following the match, so that further matches on the same line can be found. If +there are multiple patterns, they are all tried on the remainder of the line, +but patterns that follow the one that matched are not tried on the earlier part +of the line. +

+

+This behaviour means that the order in which multiple patterns are specified +can affect the output when one of the above options is used. This is no longer +the same behaviour as GNU grep, which now manages to display earlier matches +for later patterns (as long as there is no overlap). +

+

+Patterns that can match an empty string are accepted, but empty string +matches are never recognized. An example is the pattern "(super)?(man)?", in +which all components are optional. This pattern finds all occurrences of both +"super" and "man"; the output differs from matching with "super|man" when only +the matching substrings are being shown. +

+

+If the LC_ALL or LC_CTYPE environment variable is set, +pcregrep uses the value to set a locale when calling the PCRE library. +The --locale option can be used to override this. +

+
SUPPORT FOR COMPRESSED FILES
+

+It is possible to compile pcregrep so that it uses libz or +libbz2 to read files whose names end in .gz or .bz2, +respectively. You can find out whether your binary has support for one or both +of these file types by running it with the --help option. If the +appropriate support is not present, files are treated as plain text. The +standard input is always so treated. +

+
BINARY FILES
+

+By default, a file that contains a binary zero byte within the first 1024 bytes +is identified as a binary file, and is processed specially. (GNU grep also +identifies binary files in this manner.) See the --binary-files option +for a means of changing the way binary files are handled. +

+
OPTIONS
+

+The order in which some of the options appear can affect the output. For +example, both the -h and -l options affect the printing of file +names. Whichever comes later in the command line will be the one that takes +effect. Similarly, except where noted below, if an option is given twice, the +later setting is used. Numerical values for options may be followed by K or M, +to signify multiplication by 1024 or 1024*1024 respectively. +

+

+-- +This terminates the list of options. It is useful if the next item on the +command line starts with a hyphen but is not an option. This allows for the +processing of patterns and filenames that start with hyphens. +

+

+-A number, --after-context=number +Output number lines of context after each matching line. If filenames +and/or line numbers are being output, a hyphen separator is used instead of a +colon for the context lines. A line containing "--" is output between each +group of lines, unless they are in fact contiguous in the input file. The value +of number is expected to be relatively small. However, pcregrep +guarantees to have up to 8K of following text available for context output. +

+

+-a, --text +Treat binary files as text. This is equivalent to +--binary-files=text. +

+

+-B number, --before-context=number +Output number lines of context before each matching line. If filenames +and/or line numbers are being output, a hyphen separator is used instead of a +colon for the context lines. A line containing "--" is output between each +group of lines, unless they are in fact contiguous in the input file. The value +of number is expected to be relatively small. However, pcregrep +guarantees to have up to 8K of preceding text available for context output. +

+

+--binary-files=word +Specify how binary files are to be processed. If the word is "binary" (the +default), pattern matching is performed on binary files, but the only output is +"Binary file <name> matches" when a match succeeds. If the word is "text", +which is equivalent to the -a or --text option, binary files are +processed in the same way as any other file. In this case, when a match +succeeds, the output may be binary garbage, which can have nasty effects if +sent to a terminal. If the word is "without-match", which is equivalent to the +-I option, binary files are not processed at all; they are assumed not to +be of interest. +

+

+--buffer-size=number +Set the parameter that controls how much memory is used for buffering files +that are being scanned. +

+

+-C number, --context=number +Output number lines of context both before and after each matching line. +This is equivalent to setting both -A and -B to the same value. +

+

+-c, --count +Do not output individual lines from the files that are being scanned; instead +output the number of lines that would otherwise have been shown. If no lines +are selected, the number zero is output. If several files are are being +scanned, a count is output for each of them. However, if the +--files-with-matches option is also used, only those files whose counts +are greater than zero are listed. When -c is used, the -A, +-B, and -C options are ignored. +

+

+--colour, --color +If this option is given without any data, it is equivalent to "--colour=auto". +If data is required, it must be given in the same shell item, separated by an +equals sign. +

+

+--colour=value, --color=value +This option specifies under what circumstances the parts of a line that matched +a pattern should be coloured in the output. By default, the output is not +coloured. The value (which is optional, see above) may be "never", "always", or +"auto". In the latter case, colouring happens only if the standard output is +connected to a terminal. More resources are used when colouring is enabled, +because pcregrep has to search for all possible matches in a line, not +just one, in order to colour them all. +
+
+The colour that is used can be specified by setting the environment variable +PCREGREP_COLOUR or PCREGREP_COLOR. The value of this variable should be a +string of two numbers, separated by a semicolon. They are copied directly into +the control string for setting colour on a terminal, so it is your +responsibility to ensure that they make sense. If neither of the environment +variables is set, the default is "1;31", which gives red. +

+

+-D action, --devices=action +If an input path is not a regular file or a directory, "action" specifies how +it is to be processed. Valid values are "read" (the default) or "skip" +(silently skip the path). +

+

+-d action, --directories=action +If an input path is a directory, "action" specifies how it is to be processed. +Valid values are "read" (the default in non-Windows environments, for +compatibility with GNU grep), "recurse" (equivalent to the -r option), or +"skip" (silently skip the path, the default in Windows environments). In the +"read" case, directories are read as if they were ordinary files. In some +operating systems the effect of reading a directory like this is an immediate +end-of-file; in others it may provoke an error. +

+

+-e pattern, --regex=pattern, --regexp=pattern +Specify a pattern to be matched. This option can be used multiple times in +order to specify several patterns. It can also be used as a way of specifying a +single pattern that starts with a hyphen. When -e is used, no argument +pattern is taken from the command line; all arguments are treated as file +names. There is no limit to the number of patterns. They are applied to each +line in the order in which they are defined until one matches. +
+
+If -f is used with -e, the command line patterns are matched first, +followed by the patterns from the file(s), independent of the order in which +these options are specified. Note that multiple use of -e is not the same +as a single pattern with alternatives. For example, X|Y finds the first +character in a line that is X or Y, whereas if the two patterns are given +separately, with X first, pcregrep finds X if it is present, even if it +follows Y in the line. It finds Y only if there is no X in the line. This +matters only if you are using -o or --colo(u)r to show the part(s) +of the line that matched. +

+

+--exclude=pattern +Files (but not directories) whose names match the pattern are skipped without +being processed. This applies to all files, whether listed on the command line, +obtained from --file-list, or by scanning a directory. The pattern is a +PCRE regular expression, and is matched against the final component of the file +name, not the entire path. The -F, -w, and -x options do not +apply to this pattern. The option may be given any number of times in order to +specify multiple patterns. If a file name matches both an --include +and an --exclude pattern, it is excluded. There is no short form for this +option. +

+

+--exclude-from=filename +Treat each non-empty line of the file as the data for an --exclude +option. What constitutes a newline when reading the file is the operating +system's default. The --newline option has no effect on this option. This +option may be given more than once in order to specify a number of files to +read. +

+

+--exclude-dir=pattern +Directories whose names match the pattern are skipped without being processed, +whatever the setting of the --recursive option. This applies to all +directories, whether listed on the command line, obtained from +--file-list, or by scanning a parent directory. The pattern is a PCRE +regular expression, and is matched against the final component of the directory +name, not the entire path. The -F, -w, and -x options do not +apply to this pattern. The option may be given any number of times in order to +specify more than one pattern. If a directory matches both --include-dir +and --exclude-dir, it is excluded. There is no short form for this +option. +

+

+-F, --fixed-strings +Interpret each data-matching pattern as a list of fixed strings, separated by +newlines, instead of as a regular expression. What constitutes a newline for +this purpose is controlled by the --newline option. The -w (match +as a word) and -x (match whole line) options can be used with -F. +They apply to each of the fixed strings. A line is selected if any of the fixed +strings are found in it (subject to -w or -x, if present). This +option applies only to the patterns that are matched against the contents of +files; it does not apply to patterns specified by any of the --include or +--exclude options. +

+

+-f filename, --file=filename +Read patterns from the file, one per line, and match them against +each line of input. What constitutes a newline when reading the file is the +operating system's default. The --newline option has no effect on this +option. Trailing white space is removed from each line, and blank lines are +ignored. An empty file contains no patterns and therefore matches nothing. See +also the comments about multiple patterns versus a single pattern with +alternatives in the description of -e above. +
+
+If this option is given more than once, all the specified files are +read. A data line is output if any of the patterns match it. A filename can +be given as "-" to refer to the standard input. When -f is used, patterns +specified on the command line using -e may also be present; they are +tested before the file's patterns. However, no other pattern is taken from the +command line; all arguments are treated as the names of paths to be searched. +

+

+--file-list=filename +Read a list of files and/or directories that are to be scanned from the given +file, one per line. Trailing white space is removed from each line, and blank +lines are ignored. These paths are processed before any that are listed on the +command line. The filename can be given as "-" to refer to the standard input. +If --file and --file-list are both specified as "-", patterns are +read first. This is useful only when the standard input is a terminal, from +which further lines (the list of files) can be read after an end-of-file +indication. If this option is given more than once, all the specified files are +read. +

+

+--file-offsets +Instead of showing lines or parts of lines that match, show each match as an +offset from the start of the file and a length, separated by a comma. In this +mode, no context is shown. That is, the -A, -B, and -C +options are ignored. If there is more than one match in a line, each of them is +shown separately. This option is mutually exclusive with --line-offsets +and --only-matching. +

+

+-H, --with-filename +Force the inclusion of the filename at the start of output lines when searching +a single file. By default, the filename is not shown in this case. For matching +lines, the filename is followed by a colon; for context lines, a hyphen +separator is used. If a line number is also being output, it follows the file +name. +

+

+-h, --no-filename +Suppress the output filenames when searching multiple files. By default, +filenames are shown when multiple files are searched. For matching lines, the +filename is followed by a colon; for context lines, a hyphen separator is used. +If a line number is also being output, it follows the file name. +

+

+--help +Output a help message, giving brief details of the command options and file +type support, and then exit. Anything else on the command line is +ignored. +

+

+-I +Treat binary files as never matching. This is equivalent to +--binary-files=without-match. +

+

+-i, --ignore-case +Ignore upper/lower case distinctions during comparisons. +

+

+--include=pattern +If any --include patterns are specified, the only files that are +processed are those that match one of the patterns (and do not match an +--exclude pattern). This option does not affect directories, but it +applies to all files, whether listed on the command line, obtained from +--file-list, or by scanning a directory. The pattern is a PCRE regular +expression, and is matched against the final component of the file name, not +the entire path. The -F, -w, and -x options do not apply to +this pattern. The option may be given any number of times. If a file name +matches both an --include and an --exclude pattern, it is excluded. +There is no short form for this option. +

+

+--include-from=filename +Treat each non-empty line of the file as the data for an --include +option. What constitutes a newline for this purpose is the operating system's +default. The --newline option has no effect on this option. This option +may be given any number of times; all the files are read. +

+

+--include-dir=pattern +If any --include-dir patterns are specified, the only directories that +are processed are those that match one of the patterns (and do not match an +--exclude-dir pattern). This applies to all directories, whether listed +on the command line, obtained from --file-list, or by scanning a parent +directory. The pattern is a PCRE regular expression, and is matched against the +final component of the directory name, not the entire path. The -F, +-w, and -x options do not apply to this pattern. The option may be +given any number of times. If a directory matches both --include-dir and +--exclude-dir, it is excluded. There is no short form for this option. +

+

+-L, --files-without-match +Instead of outputting lines from the files, just output the names of the files +that do not contain any lines that would have been output. Each file name is +output once, on a separate line. +

+

+-l, --files-with-matches +Instead of outputting lines from the files, just output the names of the files +containing lines that would have been output. Each file name is output +once, on a separate line. Searching normally stops as soon as a matching line +is found in a file. However, if the -c (count) option is also used, +matching continues in order to obtain the correct count, and those files that +have at least one match are listed along with their counts. Using this option +with -c is a way of suppressing the listing of files with no matches. +

+

+--label=name +This option supplies a name to be used for the standard input when file names +are being output. If not supplied, "(standard input)" is used. There is no +short form for this option. +

+

+--line-buffered +When this option is given, input is read and processed line by line, and the +output is flushed after each write. By default, input is read in large chunks, +unless pcregrep can determine that it is reading from a terminal (which +is currently possible only in Unix-like environments). Output to terminal is +normally automatically flushed by the operating system. This option can be +useful when the input or output is attached to a pipe and you do not want +pcregrep to buffer up large amounts of data. However, its use will affect +performance, and the -M (multiline) option ceases to work. +

+

+--line-offsets +Instead of showing lines or parts of lines that match, show each match as a +line number, the offset from the start of the line, and a length. The line +number is terminated by a colon (as usual; see the -n option), and the +offset and length are separated by a comma. In this mode, no context is shown. +That is, the -A, -B, and -C options are ignored. If there is +more than one match in a line, each of them is shown separately. This option is +mutually exclusive with --file-offsets and --only-matching. +

+

+--locale=locale-name +This option specifies a locale to be used for pattern matching. It overrides +the value in the LC_ALL or LC_CTYPE environment variables. If no +locale is specified, the PCRE library's default (usually the "C" locale) is +used. There is no short form for this option. +

+

+--match-limit=number +Processing some regular expression patterns can require a very large amount of +memory, leading in some cases to a program crash if not enough is available. +Other patterns may take a very long time to search for all possible matching +strings. The pcre_exec() function that is called by pcregrep to do +the matching has two parameters that can limit the resources that it uses. +
+
+The --match-limit option provides a means of limiting resource usage +when processing patterns that are not going to match, but which have a very +large number of possibilities in their search trees. The classic example is a +pattern that uses nested unlimited repeats. Internally, PCRE uses a function +called match() which it calls repeatedly (sometimes recursively). The +limit set by --match-limit is imposed on the number of times this +function is called during a match, which has the effect of limiting the amount +of backtracking that can take place. +
+
+The --recursion-limit option is similar to --match-limit, but +instead of limiting the total number of times that match() is called, it +limits the depth of recursive calls, which in turn limits the amount of memory +that can be used. The recursion depth is a smaller number than the total number +of calls, because not all calls to match() are recursive. This limit is +of use only if it is set smaller than --match-limit. +
+
+There are no short forms for these options. The default settings are specified +when the PCRE library is compiled, with the default default being 10 million. +

+

+-M, --multiline +Allow patterns to match more than one line. When this option is given, patterns +may usefully contain literal newline characters and internal occurrences of ^ +and $ characters. The output for a successful match may consist of more than +one line, the last of which is the one in which the match ended. If the matched +string ends with a newline sequence the output ends at the end of that line. +
+
+When this option is set, the PCRE library is called in "multiline" mode. +There is a limit to the number of lines that can be matched, imposed by the way +that pcregrep buffers the input file as it scans it. However, +pcregrep ensures that at least 8K characters or the rest of the document +(whichever is the shorter) are available for forward matching, and similarly +the previous 8K characters (or all the previous characters, if fewer than 8K) +are guaranteed to be available for lookbehind assertions. This option does not +work when input is read line by line (see \fP--line-buffered\fP.) +

+

+-N newline-type, --newline=newline-type +The PCRE library supports five different conventions for indicating +the ends of lines. They are the single-character sequences CR (carriage return) +and LF (linefeed), the two-character sequence CRLF, an "anycrlf" convention, +which recognizes any of the preceding three types, and an "any" convention, in +which any Unicode line ending sequence is assumed to end a line. The Unicode +sequences are the three just mentioned, plus VT (vertical tab, U+000B), FF +(form feed, U+000C), NEL (next line, U+0085), LS (line separator, U+2028), and +PS (paragraph separator, U+2029). +
+
+When the PCRE library is built, a default line-ending sequence is specified. +This is normally the standard sequence for the operating system. Unless +otherwise specified by this option, pcregrep uses the library's default. +The possible values for this option are CR, LF, CRLF, ANYCRLF, or ANY. This +makes it possible to use pcregrep to scan files that have come from other +environments without having to modify their line endings. If the data that is +being scanned does not agree with the convention set by this option, +pcregrep may behave in strange ways. Note that this option does not +apply to files specified by the -f, --exclude-from, or +--include-from options, which are expected to use the operating system's +standard newline sequence. +

+

+-n, --line-number +Precede each output line by its line number in the file, followed by a colon +for matching lines or a hyphen for context lines. If the filename is also being +output, it precedes the line number. This option is forced if +--line-offsets is used. +

+

+--no-jit +If the PCRE library is built with support for just-in-time compiling (which +speeds up matching), pcregrep automatically makes use of this, unless it +was explicitly disabled at build time. This option can be used to disable the +use of JIT at run time. It is provided for testing and working round problems. +It should never be needed in normal use. +

+

+-o, --only-matching +Show only the part of the line that matched a pattern instead of the whole +line. In this mode, no context is shown. That is, the -A, -B, and +-C options are ignored. If there is more than one match in a line, each +of them is shown separately. If -o is combined with -v (invert the +sense of the match to find non-matching lines), no output is generated, but the +return code is set appropriately. If the matched portion of the line is empty, +nothing is output unless the file name or line number are being printed, in +which case they are shown on an otherwise empty line. This option is mutually +exclusive with --file-offsets and --line-offsets. +

+

+-onumber, --only-matching=number +Show only the part of the line that matched the capturing parentheses of the +given number. Up to 32 capturing parentheses are supported, and -o0 is +equivalent to -o without a number. Because these options can be given +without an argument (see above), if an argument is present, it must be given in +the same shell item, for example, -o3 or --only-matching=2. The comments given +for the non-argument case above also apply to this case. If the specified +capturing parentheses do not exist in the pattern, or were not set in the +match, nothing is output unless the file name or line number are being printed. +
+
+If this option is given multiple times, multiple substrings are output, in the +order the options are given. For example, -o3 -o1 -o3 causes the substrings +matched by capturing parentheses 3 and 1 and then 3 again to be output. By +default, there is no separator (but see the next option). +

+

+--om-separator=text +Specify a separating string for multiple occurrences of -o. The default +is an empty string. Separating strings are never coloured. +

+

+-q, --quiet +Work quietly, that is, display nothing except error messages. The exit +status indicates whether or not any matches were found. +

+

+-r, --recursive +If any given path is a directory, recursively scan the files it contains, +taking note of any --include and --exclude settings. By default, a +directory is read as a normal file; in some operating systems this gives an +immediate end-of-file. This option is a shorthand for setting the -d +option to "recurse". +

+

+--recursion-limit=number +See --match-limit above. +

+

+-s, --no-messages +Suppress error messages about non-existent or unreadable files. Such files are +quietly skipped. However, the return code is still 2, even if matches were +found in other files. +

+

+-u, --utf-8 +Operate in UTF-8 mode. This option is available only if PCRE has been compiled +with UTF-8 support. All patterns (including those for any --exclude and +--include options) and all subject lines that are scanned must be valid +strings of UTF-8 characters. +

+

+-V, --version +Write the version numbers of pcregrep and the PCRE library to the +standard output and then exit. Anything else on the command line is +ignored. +

+

+-v, --invert-match +Invert the sense of the match, so that lines which do not match any of +the patterns are the ones that are found. +

+

+-w, --word-regex, --word-regexp +Force the patterns to match only whole words. This is equivalent to having \b +at the start and end of the pattern. This option applies only to the patterns +that are matched against the contents of files; it does not apply to patterns +specified by any of the --include or --exclude options. +

+

+-x, --line-regex, --line-regexp +Force the patterns to be anchored (each must start matching at the beginning of +a line) and in addition, require them to match entire lines. This is equivalent +to having ^ and $ characters at the start and end of each alternative branch in +every pattern. This option applies only to the patterns that are matched +against the contents of files; it does not apply to patterns specified by any +of the --include or --exclude options. +

+
ENVIRONMENT VARIABLES
+

+The environment variables LC_ALL and LC_CTYPE are examined, in that +order, for a locale. The first one that is set is used. This can be overridden +by the --locale option. If no locale is set, the PCRE library's default +(usually the "C" locale) is used. +

+
NEWLINES
+

+The -N (--newline) option allows pcregrep to scan files with +different newline conventions from the default. Any parts of the input files +that are written to the standard output are copied identically, with whatever +newline sequences they have in the input. However, the setting of this option +does not affect the interpretation of files specified by the -f, +--exclude-from, or --include-from options, which are assumed to use +the operating system's standard newline sequence, nor does it affect the way in +which pcregrep writes informational messages to the standard error and +output streams. For these it uses the string "\n" to indicate newlines, +relying on the C I/O library to convert this to an appropriate sequence. +

+
OPTIONS COMPATIBILITY
+

+Many of the short and long forms of pcregrep's options are the same +as in the GNU grep program. Any long option of the form +--xxx-regexp (GNU terminology) is also available as --xxx-regex +(PCRE terminology). However, the --file-list, --file-offsets, +--include-dir, --line-offsets, --locale, --match-limit, +-M, --multiline, -N, --newline, --om-separator, +--recursion-limit, -u, and --utf-8 options are specific to +pcregrep, as is the use of the --only-matching option with a +capturing parentheses number. +

+

+Although most of the common options work the same way, a few are different in +pcregrep. For example, the --include option's argument is a glob +for GNU grep, but a regular expression for pcregrep. If both the +-c and -l options are given, GNU grep lists only file names, +without counts, but pcregrep gives the counts. +

+
OPTIONS WITH DATA
+

+There are four different ways in which an option with data can be specified. +If a short form option is used, the data may follow immediately, or (with one +exception) in the next command line item. For example: +

+  -f/some/file
+  -f /some/file
+
+The exception is the -o option, which may appear with or without data. +Because of this, if data is present, it must follow immediately in the same +item, for example -o3. +

+

+If a long form option is used, the data may appear in the same command line +item, separated by an equals character, or (with two exceptions) it may appear +in the next command line item. For example: +

+  --file=/some/file
+  --file /some/file
+
+Note, however, that if you want to supply a file name beginning with ~ as data +in a shell command, and have the shell expand ~ to a home directory, you must +separate the file name from the option, because the shell does not treat ~ +specially unless it is at the start of an item. +

+

+The exceptions to the above are the --colour (or --color) and +--only-matching options, for which the data is optional. If one of these +options does have data, it must be given in the first form, using an equals +character. Otherwise pcregrep will assume that it has no data. +

+
MATCHING ERRORS
+

+It is possible to supply a regular expression that takes a very long time to +fail to match certain lines. Such patterns normally involve nested indefinite +repeats, for example: (a+)*\d when matched against a line of a's with no final +digit. The PCRE matching function has a resource limit that causes it to abort +in these circumstances. If this happens, pcregrep outputs an error +message and the line that caused the problem to the standard error stream. If +there are more than 20 such errors, pcregrep gives up. +

+

+The --match-limit option of pcregrep can be used to set the overall +resource limit; there is a second option called --recursion-limit that +sets a limit on the amount of memory (usually stack) that is used (see the +discussion of these options above). +

+
DIAGNOSTICS
+

+Exit status is 0 if any matches were found, 1 if no matches were found, and 2 +for syntax errors, overlong lines, non-existent or inaccessible files (even if +matches were found in other files) or too many matching errors. Using the +-s option to suppress error messages about inaccessible files does not +affect the return code. +

+
SEE ALSO
+

+pcrepattern(3), pcresyntax(3), pcretest(1). +

+
AUTHOR
+

+Philip Hazel +
+University Computing Service +
+Cambridge CB2 3QH, England. +
+

+
REVISION
+

+Last updated: 03 April 2014 +
+Copyright © 1997-2014 University of Cambridge. +
+

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcrejit.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcrejit.html new file mode 100755 index 000000000..abb342522 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcrejit.html @@ -0,0 +1,499 @@ + + +pcrejit specification + + +

pcrejit man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+

+
PCRE JUST-IN-TIME COMPILER SUPPORT
+

+Just-in-time compiling is a heavyweight optimization that can greatly speed up +pattern matching. However, it comes at the cost of extra processing before the +match is performed. Therefore, it is of most benefit when the same pattern is +going to be matched many times. This does not necessarily mean many calls of a +matching function; if the pattern is not anchored, matching attempts may take +place many times at various positions in the subject, even for a single call. +Therefore, if the subject string is very long, it may still pay to use JIT for +one-off matches. +

+

+JIT support applies only to the traditional Perl-compatible matching function. +It does not apply when the DFA matching function is being used. The code for +this support was written by Zoltan Herczeg. +

+
8-BIT, 16-BIT AND 32-BIT SUPPORT
+

+JIT support is available for all of the 8-bit, 16-bit and 32-bit PCRE +libraries. To keep this documentation simple, only the 8-bit interface is +described in what follows. If you are using the 16-bit library, substitute the +16-bit functions and 16-bit structures (for example, pcre16_jit_stack +instead of pcre_jit_stack). If you are using the 32-bit library, +substitute the 32-bit functions and 32-bit structures (for example, +pcre32_jit_stack instead of pcre_jit_stack). +

+
AVAILABILITY OF JIT SUPPORT
+

+JIT support is an optional feature of PCRE. The "configure" option --enable-jit +(or equivalent CMake option) must be set when PCRE is built if you want to use +JIT. The support is limited to the following hardware platforms: +

+  ARM v5, v7, and Thumb2
+  Intel x86 32-bit and 64-bit
+  MIPS 32-bit
+  Power PC 32-bit and 64-bit
+  SPARC 32-bit (experimental)
+
+If --enable-jit is set on an unsupported platform, compilation fails. +

+

+A program that is linked with PCRE 8.20 or later can tell if JIT support is +available by calling pcre_config() with the PCRE_CONFIG_JIT option. The +result is 1 when JIT is available, and 0 otherwise. However, a simple program +does not need to check this in order to use JIT. The normal API is implemented +in a way that falls back to the interpretive code if JIT is not available. For +programs that need the best possible performance, there is also a "fast path" +API that is JIT-specific. +

+

+If your program may sometimes be linked with versions of PCRE that are older +than 8.20, but you want to use JIT when it is available, you can test the +values of PCRE_MAJOR and PCRE_MINOR, or the existence of a JIT macro such as +PCRE_CONFIG_JIT, for compile-time control of your code. Also beware that the +pcre_jit_exec() function was not available at all before 8.32, +and may not be available at all if PCRE isn't compiled with +--enable-jit. See the "JIT FAST PATH API" section below for details. +

+
SIMPLE USE OF JIT
+

+You have to do two things to make use of the JIT support in the simplest way: +

+  (1) Call pcre_study() with the PCRE_STUDY_JIT_COMPILE option for
+      each compiled pattern, and pass the resulting pcre_extra block to
+      pcre_exec().
+
+  (2) Use pcre_free_study() to free the pcre_extra block when it is
+      no longer needed, instead of just freeing it yourself. This ensures that
+      any JIT data is also freed.
+
+For a program that may be linked with pre-8.20 versions of PCRE, you can insert +
+  #ifndef PCRE_STUDY_JIT_COMPILE
+  #define PCRE_STUDY_JIT_COMPILE 0
+  #endif
+
+so that no option is passed to pcre_study(), and then use something like +this to free the study data: +
+  #ifdef PCRE_CONFIG_JIT
+      pcre_free_study(study_ptr);
+  #else
+      pcre_free(study_ptr);
+  #endif
+
+PCRE_STUDY_JIT_COMPILE requests the JIT compiler to generate code for complete +matches. If you want to run partial matches using the PCRE_PARTIAL_HARD or +PCRE_PARTIAL_SOFT options of pcre_exec(), you should set one or both of +the following options in addition to, or instead of, PCRE_STUDY_JIT_COMPILE +when you call pcre_study(): +
+  PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE
+  PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE
+
+If using pcre_jit_exec() and supporting a pre-8.32 version of +PCRE, you can insert: +
+   #if PCRE_MAJOR >= 8 && PCRE_MINOR >= 32
+   pcre_jit_exec(...);
+   #else
+   pcre_exec(...)
+   #endif
+
+but as described in the "JIT FAST PATH API" section below this assumes +version 8.32 and later are compiled with --enable-jit, which may +break. +
+
+The JIT compiler generates different optimized code for each of the three +modes (normal, soft partial, hard partial). When pcre_exec() is called, +the appropriate code is run if it is available. Otherwise, the pattern is +matched using interpretive code. +

+

+In some circumstances you may need to call additional functions. These are +described in the section entitled +"Controlling the JIT stack" +below. +

+

+If JIT support is not available, PCRE_STUDY_JIT_COMPILE etc. are ignored, and +no JIT data is created. Otherwise, the compiled pattern is passed to the JIT +compiler, which turns it into machine code that executes much faster than the +normal interpretive code. When pcre_exec() is passed a pcre_extra +block containing a pointer to JIT code of the appropriate mode (normal or +hard/soft partial), it obeys that code instead of running the interpreter. The +result is identical, but the compiled JIT code runs much faster. +

+

+There are some pcre_exec() options that are not supported for JIT +execution. There are also some pattern items that JIT cannot handle. Details +are given below. In both cases, execution automatically falls back to the +interpretive code. If you want to know whether JIT was actually used for a +particular match, you should arrange for a JIT callback function to be set up +as described in the section entitled +"Controlling the JIT stack" +below, even if you do not need to supply a non-default JIT stack. Such a +callback function is called whenever JIT code is about to be obeyed. If the +execution options are not right for JIT execution, the callback function is not +obeyed. +

+

+If the JIT compiler finds an unsupported item, no JIT data is generated. You +can find out if JIT execution is available after studying a pattern by calling +pcre_fullinfo() with the PCRE_INFO_JIT option. A result of 1 means that +JIT compilation was successful. A result of 0 means that JIT support is not +available, or the pattern was not studied with PCRE_STUDY_JIT_COMPILE etc., or +the JIT compiler was not able to handle the pattern. +

+

+Once a pattern has been studied, with or without JIT, it can be used as many +times as you like for matching different subject strings. +

+
UNSUPPORTED OPTIONS AND PATTERN ITEMS
+

+The only pcre_exec() options that are supported for JIT execution are +PCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK, PCRE_NO_UTF32_CHECK, PCRE_NOTBOL, +PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, PCRE_PARTIAL_HARD, and +PCRE_PARTIAL_SOFT. +

+

+The only unsupported pattern items are \C (match a single data unit) when +running in a UTF mode, and a callout immediately before an assertion condition +in a conditional group. +

+
RETURN VALUES FROM JIT EXECUTION
+

+When a pattern is matched using JIT execution, the return values are the same +as those given by the interpretive pcre_exec() code, with the addition of +one new error code: PCRE_ERROR_JIT_STACKLIMIT. This means that the memory used +for the JIT stack was insufficient. See +"Controlling the JIT stack" +below for a discussion of JIT stack usage. For compatibility with the +interpretive pcre_exec() code, no more than two-thirds of the +ovector argument is used for passing back captured substrings. +

+

+The error code PCRE_ERROR_MATCHLIMIT is returned by the JIT code if searching a +very large pattern tree goes on for too long, as it is in the same circumstance +when JIT is not used, but the details of exactly what is counted are not the +same. The PCRE_ERROR_RECURSIONLIMIT error code is never returned by JIT +execution. +

+
SAVING AND RESTORING COMPILED PATTERNS
+

+The code that is generated by the JIT compiler is architecture-specific, and is +also position dependent. For those reasons it cannot be saved (in a file or +database) and restored later like the bytecode and other data of a compiled +pattern. Saving and restoring compiled patterns is not something many people +do. More detail about this facility is given in the +pcreprecompile +documentation. It should be possible to run pcre_study() on a saved and +restored pattern, and thereby recreate the JIT data, but because JIT +compilation uses significant resources, it is probably not worth doing this; +you might as well recompile the original pattern. +

+
CONTROLLING THE JIT STACK
+

+When the compiled JIT code runs, it needs a block of memory to use as a stack. +By default, it uses 32K on the machine stack. However, some large or +complicated patterns need more than this. The error PCRE_ERROR_JIT_STACKLIMIT +is given when there is not enough stack. Three functions are provided for +managing blocks of memory for use as JIT stacks. There is further discussion +about the use of JIT stacks in the section entitled +"JIT stack FAQ" +below. +

+

+The pcre_jit_stack_alloc() function creates a JIT stack. Its arguments +are a starting size and a maximum size, and it returns a pointer to an opaque +structure of type pcre_jit_stack, or NULL if there is an error. The +pcre_jit_stack_free() function can be used to free a stack that is no +longer needed. (For the technically minded: the address space is allocated by +mmap or VirtualAlloc.) +

+

+JIT uses far less memory for recursion than the interpretive code, +and a maximum stack size of 512K to 1M should be more than enough for any +pattern. +

+

+The pcre_assign_jit_stack() function specifies which stack JIT code +should use. Its arguments are as follows: +

+  pcre_extra         *extra
+  pcre_jit_callback  callback
+  void               *data
+
+The extra argument must be the result of studying a pattern with +PCRE_STUDY_JIT_COMPILE etc. There are three cases for the values of the other +two options: +
+  (1) If callback is NULL and data is NULL, an internal 32K block
+      on the machine stack is used.
+
+  (2) If callback is NULL and data is not NULL, data must be
+      a valid JIT stack, the result of calling pcre_jit_stack_alloc().
+
+  (3) If callback is not NULL, it must point to a function that is
+      called with data as an argument at the start of matching, in
+      order to set up a JIT stack. If the return from the callback
+      function is NULL, the internal 32K stack is used; otherwise the
+      return value must be a valid JIT stack, the result of calling
+      pcre_jit_stack_alloc().
+
+A callback function is obeyed whenever JIT code is about to be run; it is not +obeyed when pcre_exec() is called with options that are incompatible for +JIT execution. A callback function can therefore be used to determine whether a +match operation was executed by JIT or by the interpreter. +

+

+You may safely use the same JIT stack for more than one pattern (either by +assigning directly or by callback), as long as the patterns are all matched +sequentially in the same thread. In a multithread application, if you do not +specify a JIT stack, or if you assign or pass back NULL from a callback, that +is thread-safe, because each thread has its own machine stack. However, if you +assign or pass back a non-NULL JIT stack, this must be a different stack for +each thread so that the application is thread-safe. +

+

+Strictly speaking, even more is allowed. You can assign the same non-NULL stack +to any number of patterns as long as they are not used for matching by multiple +threads at the same time. For example, you can assign the same stack to all +compiled patterns, and use a global mutex in the callback to wait until the +stack is available for use. However, this is an inefficient solution, and not +recommended. +

+

+This is a suggestion for how a multithreaded program that needs to set up +non-default JIT stacks might operate: +

+  During thread initalization
+    thread_local_var = pcre_jit_stack_alloc(...)
+
+  During thread exit
+    pcre_jit_stack_free(thread_local_var)
+
+  Use a one-line callback function
+    return thread_local_var
+
+All the functions described in this section do nothing if JIT is not available, +and pcre_assign_jit_stack() does nothing unless the extra argument +is non-NULL and points to a pcre_extra block that is the result of a +successful study with PCRE_STUDY_JIT_COMPILE etc. +

+
JIT STACK FAQ
+

+(1) Why do we need JIT stacks? +
+
+PCRE (and JIT) is a recursive, depth-first engine, so it needs a stack where +the local data of the current node is pushed before checking its child nodes. +Allocating real machine stack on some platforms is difficult. For example, the +stack chain needs to be updated every time if we extend the stack on PowerPC. +Although it is possible, its updating time overhead decreases performance. So +we do the recursion in memory. +

+

+(2) Why don't we simply allocate blocks of memory with malloc()? +
+
+Modern operating systems have a nice feature: they can reserve an address space +instead of allocating memory. We can safely allocate memory pages inside this +address space, so the stack could grow without moving memory data (this is +important because of pointers). Thus we can allocate 1M address space, and use +only a single memory page (usually 4K) if that is enough. However, we can still +grow up to 1M anytime if needed. +

+

+(3) Who "owns" a JIT stack? +
+
+The owner of the stack is the user program, not the JIT studied pattern or +anything else. The user program must ensure that if a stack is used by +pcre_exec(), (that is, it is assigned to the pattern currently running), +that stack must not be used by any other threads (to avoid overwriting the same +memory area). The best practice for multithreaded programs is to allocate a +stack for each thread, and return this stack through the JIT callback function. +

+

+(4) When should a JIT stack be freed? +
+
+You can free a JIT stack at any time, as long as it will not be used by +pcre_exec() again. When you assign the stack to a pattern, only a pointer +is set. There is no reference counting or any other magic. You can free the +patterns and stacks in any order, anytime. Just do not call +pcre_exec() with a pattern pointing to an already freed stack, as that +will cause SEGFAULT. (Also, do not free a stack currently used by +pcre_exec() in another thread). You can also replace the stack for a +pattern at any time. You can even free the previous stack before assigning a +replacement. +

+

+(5) Should I allocate/free a stack every time before/after calling +pcre_exec()? +
+
+No, because this is too costly in terms of resources. However, you could +implement some clever idea which release the stack if it is not used in let's +say two minutes. The JIT callback can help to achieve this without keeping a +list of the currently JIT studied patterns. +

+

+(6) OK, the stack is for long term memory allocation. But what happens if a +pattern causes stack overflow with a stack of 1M? Is that 1M kept until the +stack is freed? +
+
+Especially on embedded sytems, it might be a good idea to release memory +sometimes without freeing the stack. There is no API for this at the moment. +Probably a function call which returns with the currently allocated memory for +any stack and another which allows releasing memory (shrinking the stack) would +be a good idea if someone needs this. +

+

+(7) This is too much of a headache. Isn't there any better solution for JIT +stack handling? +
+
+No, thanks to Windows. If POSIX threads were used everywhere, we could throw +out this complicated API. +

+
EXAMPLE CODE
+

+This is a single-threaded example that specifies a JIT stack without using a +callback. +

+  int rc;
+  int ovector[30];
+  pcre *re;
+  pcre_extra *extra;
+  pcre_jit_stack *jit_stack;
+
+  re = pcre_compile(pattern, 0, &error, &erroffset, NULL);
+  /* Check for errors */
+  extra = pcre_study(re, PCRE_STUDY_JIT_COMPILE, &error);
+  jit_stack = pcre_jit_stack_alloc(32*1024, 512*1024);
+  /* Check for error (NULL) */
+  pcre_assign_jit_stack(extra, NULL, jit_stack);
+  rc = pcre_exec(re, extra, subject, length, 0, 0, ovector, 30);
+  /* Check results */
+  pcre_free(re);
+  pcre_free_study(extra);
+  pcre_jit_stack_free(jit_stack);
+
+
+

+
JIT FAST PATH API
+

+Because the API described above falls back to interpreted execution when JIT is +not available, it is convenient for programs that are written for general use +in many environments. However, calling JIT via pcre_exec() does have a +performance impact. Programs that are written for use where JIT is known to be +available, and which need the best possible performance, can instead use a +"fast path" API to call JIT execution directly instead of calling +pcre_exec() (obviously only for patterns that have been successfully +studied by JIT). +

+

+The fast path function is called pcre_jit_exec(), and it takes exactly +the same arguments as pcre_exec(), plus one additional argument that +must point to a JIT stack. The JIT stack arrangements described above do not +apply. The return values are the same as for pcre_exec(). +

+

+When you call pcre_exec(), as well as testing for invalid options, a +number of other sanity checks are performed on the arguments. For example, if +the subject pointer is NULL, or its length is negative, an immediate error is +given. Also, unless PCRE_NO_UTF[8|16|32] is set, a UTF subject string is tested +for validity. In the interests of speed, these checks do not happen on the JIT +fast path, and if invalid data is passed, the result is undefined. +

+

+Bypassing the sanity checks and the pcre_exec() wrapping can give +speedups of more than 10%. +

+

+Note that the pcre_jit_exec() function is not available in versions of +PCRE before 8.32 (released in November 2012). If you need to support versions +that old you must either use the slower pcre_exec(), or switch between +the two codepaths by checking the values of PCRE_MAJOR and PCRE_MINOR. +

+

+Due to an unfortunate implementation oversight, even in versions 8.32 +and later there will be no pcre_jit_exec() stub function defined +when PCRE is compiled with --disable-jit, which is the default, and +there's no way to detect whether PCRE was compiled with --enable-jit +via a macro. +

+

+If you need to support versions older than 8.32, or versions that may +not build with --enable-jit, you must either use the slower +pcre_exec(), or switch between the two codepaths by checking the +values of PCRE_MAJOR and PCRE_MINOR. +

+

+Switching between the two by checking the version assumes that all the +versions being targeted are built with --enable-jit. To also support +builds that may use --disable-jit either pcre_exec() must be +used, or a compile-time check for JIT via pcre_config() (which +assumes the runtime environment will be the same), or as the Git +project decided to do, simply assume that pcre_jit_exec() is +present in 8.32 or later unless a compile-time flag is provided, see +the "grep: un-break building with PCRE >= 8.32 without --enable-jit" +commit in git.git for an example of that. +

+
SEE ALSO
+

+pcreapi(3) +

+
AUTHOR
+

+Philip Hazel (FAQ by Zoltan Herczeg) +
+University Computing Service +
+Cambridge CB2 3QH, England. +
+

+
REVISION
+

+Last updated: 05 July 2017 +
+Copyright © 1997-2017 University of Cambridge. +
+

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcrelimits.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcrelimits.html new file mode 100755 index 000000000..ee5ebf033 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcrelimits.html @@ -0,0 +1,90 @@ + + +pcrelimits specification + + +

pcrelimits man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+
+SIZE AND OTHER LIMITATIONS +
+

+There are some size limitations in PCRE but it is hoped that they will never in +practice be relevant. +

+

+The maximum length of a compiled pattern is approximately 64K data units (bytes +for the 8-bit library, 16-bit units for the 16-bit library, and 32-bit units for +the 32-bit library) if PCRE is compiled with the default internal linkage size, +which is 2 bytes for the 8-bit and 16-bit libraries, and 4 bytes for the 32-bit +library. If you want to process regular expressions that are truly enormous, +you can compile PCRE with an internal linkage size of 3 or 4 (when building the +16-bit or 32-bit library, 3 is rounded up to 4). See the README file in +the source distribution and the +pcrebuild +documentation for details. In these cases the limit is substantially larger. +However, the speed of execution is slower. +

+

+All values in repeating quantifiers must be less than 65536. +

+

+There is no limit to the number of parenthesized subpatterns, but there can be +no more than 65535 capturing subpatterns. There is, however, a limit to the +depth of nesting of parenthesized subpatterns of all kinds. This is imposed in +order to limit the amount of system stack used at compile time. The limit can +be specified when PCRE is built; the default is 250. +

+

+There is a limit to the number of forward references to subsequent subpatterns +of around 200,000. Repeated forward references with fixed upper limits, for +example, (?2){0,100} when subpattern number 2 is to the right, are included in +the count. There is no limit to the number of backward references. +

+

+The maximum length of name for a named subpattern is 32 characters, and the +maximum number of named subpatterns is 10000. +

+

+The maximum length of a name in a (*MARK), (*PRUNE), (*SKIP), or (*THEN) verb +is 255 for the 8-bit library and 65535 for the 16-bit and 32-bit libraries. +

+

+The maximum length of a subject string is the largest positive number that an +integer variable can hold. However, when using the traditional matching +function, PCRE uses recursion to handle subpatterns and indefinite repetition. +This means that the available stack space may limit the size of a subject +string that can be processed by certain patterns. For a discussion of stack +issues, see the +pcrestack +documentation. +

+
+AUTHOR +
+

+Philip Hazel +
+University Computing Service +
+Cambridge CB2 3QH, England. +
+

+
+REVISION +
+

+Last updated: 05 November 2013 +
+Copyright © 1997-2013 University of Cambridge. +
+

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcrematching.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcrematching.html new file mode 100755 index 000000000..a1af39b68 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcrematching.html @@ -0,0 +1,242 @@ + + +pcrematching specification + + +

pcrematching man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+

+
PCRE MATCHING ALGORITHMS
+

+This document describes the two different algorithms that are available in PCRE +for matching a compiled regular expression against a given subject string. The +"standard" algorithm is the one provided by the pcre_exec(), +pcre16_exec() and pcre32_exec() functions. These work in the same +as as Perl's matching function, and provide a Perl-compatible matching operation. +The just-in-time (JIT) optimization that is described in the +pcrejit +documentation is compatible with these functions. +

+

+An alternative algorithm is provided by the pcre_dfa_exec(), +pcre16_dfa_exec() and pcre32_dfa_exec() functions; they operate in +a different way, and are not Perl-compatible. This alternative has advantages +and disadvantages compared with the standard algorithm, and these are described +below. +

+

+When there is only one possible way in which a given subject string can match a +pattern, the two algorithms give the same answer. A difference arises, however, +when there are multiple possibilities. For example, if the pattern +

+  ^<.*>
+
+is matched against the string +
+  <something> <something else> <something further>
+
+there are three possible answers. The standard algorithm finds only one of +them, whereas the alternative algorithm finds all three. +

+
REGULAR EXPRESSIONS AS TREES
+

+The set of strings that are matched by a regular expression can be represented +as a tree structure. An unlimited repetition in the pattern makes the tree of +infinite size, but it is still a tree. Matching the pattern to a given subject +string (from a given starting point) can be thought of as a search of the tree. +There are two ways to search a tree: depth-first and breadth-first, and these +correspond to the two matching algorithms provided by PCRE. +

+
THE STANDARD MATCHING ALGORITHM
+

+In the terminology of Jeffrey Friedl's book "Mastering Regular +Expressions", the standard algorithm is an "NFA algorithm". It conducts a +depth-first search of the pattern tree. That is, it proceeds along a single +path through the tree, checking that the subject matches what is required. When +there is a mismatch, the algorithm tries any alternatives at the current point, +and if they all fail, it backs up to the previous branch point in the tree, and +tries the next alternative branch at that level. This often involves backing up +(moving to the left) in the subject string as well. The order in which +repetition branches are tried is controlled by the greedy or ungreedy nature of +the quantifier. +

+

+If a leaf node is reached, a matching string has been found, and at that point +the algorithm stops. Thus, if there is more than one possible match, this +algorithm returns the first one that it finds. Whether this is the shortest, +the longest, or some intermediate length depends on the way the greedy and +ungreedy repetition quantifiers are specified in the pattern. +

+

+Because it ends up with a single path through the tree, it is relatively +straightforward for this algorithm to keep track of the substrings that are +matched by portions of the pattern in parentheses. This provides support for +capturing parentheses and back references. +

+
THE ALTERNATIVE MATCHING ALGORITHM
+

+This algorithm conducts a breadth-first search of the tree. Starting from the +first matching point in the subject, it scans the subject string from left to +right, once, character by character, and as it does this, it remembers all the +paths through the tree that represent valid matches. In Friedl's terminology, +this is a kind of "DFA algorithm", though it is not implemented as a +traditional finite state machine (it keeps multiple states active +simultaneously). +

+

+Although the general principle of this matching algorithm is that it scans the +subject string only once, without backtracking, there is one exception: when a +lookaround assertion is encountered, the characters following or preceding the +current point have to be independently inspected. +

+

+The scan continues until either the end of the subject is reached, or there are +no more unterminated paths. At this point, terminated paths represent the +different matching possibilities (if there are none, the match has failed). +Thus, if there is more than one possible match, this algorithm finds all of +them, and in particular, it finds the longest. The matches are returned in +decreasing order of length. There is an option to stop the algorithm after the +first match (which is necessarily the shortest) is found. +

+

+Note that all the matches that are found start at the same point in the +subject. If the pattern +

+  cat(er(pillar)?)?
+
+is matched against the string "the caterpillar catchment", the result will be +the three strings "caterpillar", "cater", and "cat" that start at the fifth +character of the subject. The algorithm does not automatically move on to find +matches that start at later positions. +

+

+PCRE's "auto-possessification" optimization usually applies to character +repeats at the end of a pattern (as well as internally). For example, the +pattern "a\d+" is compiled as if it were "a\d++" because there is no point +even considering the possibility of backtracking into the repeated digits. For +DFA matching, this means that only one possible match is found. If you really +do want multiple matches in such cases, either use an ungreedy repeat +("a\d+?") or set the PCRE_NO_AUTO_POSSESS option when compiling. +

+

+There are a number of features of PCRE regular expressions that are not +supported by the alternative matching algorithm. They are as follows: +

+

+1. Because the algorithm finds all possible matches, the greedy or ungreedy +nature of repetition quantifiers is not relevant. Greedy and ungreedy +quantifiers are treated in exactly the same way. However, possessive +quantifiers can make a difference when what follows could also match what is +quantified, for example in a pattern like this: +

+  ^a++\w!
+
+This pattern matches "aaab!" but not "aaa!", which would be matched by a +non-possessive quantifier. Similarly, if an atomic group is present, it is +matched as if it were a standalone pattern at the current point, and the +longest match is then "locked in" for the rest of the overall pattern. +

+

+2. When dealing with multiple paths through the tree simultaneously, it is not +straightforward to keep track of captured substrings for the different matching +possibilities, and PCRE's implementation of this algorithm does not attempt to +do this. This means that no captured substrings are available. +

+

+3. Because no substrings are captured, back references within the pattern are +not supported, and cause errors if encountered. +

+

+4. For the same reason, conditional expressions that use a backreference as the +condition or test for a specific group recursion are not supported. +

+

+5. Because many paths through the tree may be active, the \K escape sequence, +which resets the start of the match when encountered (but may be on some paths +and not on others), is not supported. It causes an error if encountered. +

+

+6. Callouts are supported, but the value of the capture_top field is +always 1, and the value of the capture_last field is always -1. +

+

+7. The \C escape sequence, which (in the standard algorithm) always matches a +single data unit, even in UTF-8, UTF-16 or UTF-32 modes, is not supported in +these modes, because the alternative algorithm moves through the subject string +one character (not data unit) at a time, for all active paths through the tree. +

+

+8. Except for (*FAIL), the backtracking control verbs such as (*PRUNE) are not +supported. (*FAIL) is supported, and behaves like a failing negative assertion. +

+
ADVANTAGES OF THE ALTERNATIVE ALGORITHM
+

+Using the alternative matching algorithm provides the following advantages: +

+

+1. All possible matches (at a single point in the subject) are automatically +found, and in particular, the longest match is found. To find more than one +match using the standard algorithm, you have to do kludgy things with +callouts. +

+

+2. Because the alternative algorithm scans the subject string just once, and +never needs to backtrack (except for lookbehinds), it is possible to pass very +long subject strings to the matching function in several pieces, checking for +partial matching each time. Although it is possible to do multi-segment +matching using the standard algorithm by retaining partially matched +substrings, it is more complicated. The +pcrepartial +documentation gives details of partial matching and discusses multi-segment +matching. +

+
DISADVANTAGES OF THE ALTERNATIVE ALGORITHM
+

+The alternative algorithm suffers from a number of disadvantages: +

+

+1. It is substantially slower than the standard algorithm. This is partly +because it has to search for all possible matches, but is also because it is +less susceptible to optimization. +

+

+2. Capturing parentheses and back references are not supported. +

+

+3. Although atomic groups are supported, their use does not provide the +performance advantage that it does for the standard algorithm. +

+
AUTHOR
+

+Philip Hazel +
+University Computing Service +
+Cambridge CB2 3QH, England. +
+

+
REVISION
+

+Last updated: 12 November 2013 +
+Copyright © 1997-2012 University of Cambridge. +
+

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcrepartial.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcrepartial.html new file mode 100755 index 000000000..4faeafcb6 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcrepartial.html @@ -0,0 +1,509 @@ + + +pcrepartial specification + + +

pcrepartial man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+

+
PARTIAL MATCHING IN PCRE
+

+In normal use of PCRE, if the subject string that is passed to a matching +function matches as far as it goes, but is too short to match the entire +pattern, PCRE_ERROR_NOMATCH is returned. There are circumstances where it might +be helpful to distinguish this case from other cases in which there is no +match. +

+

+Consider, for example, an application where a human is required to type in data +for a field with specific formatting requirements. An example might be a date +in the form ddmmmyy, defined by this pattern: +

+  ^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$
+
+If the application sees the user's keystrokes one by one, and can check that +what has been typed so far is potentially valid, it is able to raise an error +as soon as a mistake is made, by beeping and not reflecting the character that +has been typed, for example. This immediate feedback is likely to be a better +user interface than a check that is delayed until the entire string has been +entered. Partial matching can also be useful when the subject string is very +long and is not all available at once. +

+

+PCRE supports partial matching by means of the PCRE_PARTIAL_SOFT and +PCRE_PARTIAL_HARD options, which can be set when calling any of the matching +functions. For backwards compatibility, PCRE_PARTIAL is a synonym for +PCRE_PARTIAL_SOFT. The essential difference between the two options is whether +or not a partial match is preferred to an alternative complete match, though +the details differ between the two types of matching function. If both options +are set, PCRE_PARTIAL_HARD takes precedence. +

+

+If you want to use partial matching with just-in-time optimized code, you must +call pcre_study(), pcre16_study() or pcre32_study() with one +or both of these options: +

+  PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE
+  PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE
+
+PCRE_STUDY_JIT_COMPILE should also be set if you are going to run non-partial +matches on the same pattern. If the appropriate JIT study mode has not been set +for a match, the interpretive matching code is used. +

+

+Setting a partial matching option disables two of PCRE's standard +optimizations. PCRE remembers the last literal data unit in a pattern, and +abandons matching immediately if it is not present in the subject string. This +optimization cannot be used for a subject string that might match only +partially. If the pattern was studied, PCRE knows the minimum length of a +matching string, and does not bother to run the matching function on shorter +strings. This optimization is also disabled for partial matching. +

+
PARTIAL MATCHING USING pcre_exec() OR pcre[16|32]_exec()
+

+A partial match occurs during a call to pcre_exec() or +pcre[16|32]_exec() when the end of the subject string is reached +successfully, but matching cannot continue because more characters are needed. +However, at least one character in the subject must have been inspected. This +character need not form part of the final matched string; lookbehind assertions +and the \K escape sequence provide ways of inspecting characters before the +start of a matched substring. The requirement for inspecting at least one +character exists because an empty string can always be matched; without such a +restriction there would always be a partial match of an empty string at the end +of the subject. +

+

+If there are at least two slots in the offsets vector when a partial match is +returned, the first slot is set to the offset of the earliest character that +was inspected. For convenience, the second offset points to the end of the +subject so that a substring can easily be identified. If there are at least +three slots in the offsets vector, the third slot is set to the offset of the +character where matching started. +

+

+For the majority of patterns, the contents of the first and third slots will be +the same. However, for patterns that contain lookbehind assertions, or begin +with \b or \B, characters before the one where matching started may have been +inspected while carrying out the match. For example, consider this pattern: +

+  /(?<=abc)123/
+
+This pattern matches "123", but only if it is preceded by "abc". If the subject +string is "xyzabc12", the first two offsets after a partial match are for the +substring "abc12", because all these characters were inspected. However, the +third offset is set to 6, because that is the offset where matching began. +

+

+What happens when a partial match is identified depends on which of the two +partial matching options are set. +

+
+PCRE_PARTIAL_SOFT WITH pcre_exec() OR pcre[16|32]_exec() +
+

+If PCRE_PARTIAL_SOFT is set when pcre_exec() or pcre[16|32]_exec() +identifies a partial match, the partial match is remembered, but matching +continues as normal, and other alternatives in the pattern are tried. If no +complete match can be found, PCRE_ERROR_PARTIAL is returned instead of +PCRE_ERROR_NOMATCH. +

+

+This option is "soft" because it prefers a complete match over a partial match. +All the various matching items in a pattern behave as if the subject string is +potentially complete. For example, \z, \Z, and $ match at the end of the +subject, as normal, and for \b and \B the end of the subject is treated as a +non-alphanumeric. +

+

+If there is more than one partial match, the first one that was found provides +the data that is returned. Consider this pattern: +

+  /123\w+X|dogY/
+
+If this is matched against the subject string "abc123dog", both +alternatives fail to match, but the end of the subject is reached during +matching, so PCRE_ERROR_PARTIAL is returned. The offsets are set to 3 and 9, +identifying "123dog" as the first partial match that was found. (In this +example, there are two partial matches, because "dog" on its own partially +matches the second alternative.) +

+
+PCRE_PARTIAL_HARD WITH pcre_exec() OR pcre[16|32]_exec() +
+

+If PCRE_PARTIAL_HARD is set for pcre_exec() or pcre[16|32]_exec(), +PCRE_ERROR_PARTIAL is returned as soon as a partial match is found, without +continuing to search for possible complete matches. This option is "hard" +because it prefers an earlier partial match over a later complete match. For +this reason, the assumption is made that the end of the supplied subject string +may not be the true end of the available data, and so, if \z, \Z, \b, \B, +or $ are encountered at the end of the subject, the result is +PCRE_ERROR_PARTIAL, provided that at least one character in the subject has +been inspected. +

+

+Setting PCRE_PARTIAL_HARD also affects the way UTF-8 and UTF-16 +subject strings are checked for validity. Normally, an invalid sequence +causes the error PCRE_ERROR_BADUTF8 or PCRE_ERROR_BADUTF16. However, in the +special case of a truncated character at the end of the subject, +PCRE_ERROR_SHORTUTF8 or PCRE_ERROR_SHORTUTF16 is returned when +PCRE_PARTIAL_HARD is set. +

+
+Comparing hard and soft partial matching +
+

+The difference between the two partial matching options can be illustrated by a +pattern such as: +

+  /dog(sbody)?/
+
+This matches either "dog" or "dogsbody", greedily (that is, it prefers the +longer string if possible). If it is matched against the string "dog" with +PCRE_PARTIAL_SOFT, it yields a complete match for "dog". However, if +PCRE_PARTIAL_HARD is set, the result is PCRE_ERROR_PARTIAL. On the other hand, +if the pattern is made ungreedy the result is different: +
+  /dog(sbody)??/
+
+In this case the result is always a complete match because that is found first, +and matching never continues after finding a complete match. It might be easier +to follow this explanation by thinking of the two patterns like this: +
+  /dog(sbody)?/    is the same as  /dogsbody|dog/
+  /dog(sbody)??/   is the same as  /dog|dogsbody/
+
+The second pattern will never match "dogsbody", because it will always find the +shorter match first. +

+
PARTIAL MATCHING USING pcre_dfa_exec() OR pcre[16|32]_dfa_exec()
+

+The DFA functions move along the subject string character by character, without +backtracking, searching for all possible matches simultaneously. If the end of +the subject is reached before the end of the pattern, there is the possibility +of a partial match, again provided that at least one character has been +inspected. +

+

+When PCRE_PARTIAL_SOFT is set, PCRE_ERROR_PARTIAL is returned only if there +have been no complete matches. Otherwise, the complete matches are returned. +However, if PCRE_PARTIAL_HARD is set, a partial match takes precedence over any +complete matches. The portion of the string that was inspected when the longest +partial match was found is set as the first matching string, provided there are +at least two slots in the offsets vector. +

+

+Because the DFA functions always search for all possible matches, and there is +no difference between greedy and ungreedy repetition, their behaviour is +different from the standard functions when PCRE_PARTIAL_HARD is set. Consider +the string "dog" matched against the ungreedy pattern shown above: +

+  /dog(sbody)??/
+
+Whereas the standard functions stop as soon as they find the complete match for +"dog", the DFA functions also find the partial match for "dogsbody", and so +return that when PCRE_PARTIAL_HARD is set. +

+
PARTIAL MATCHING AND WORD BOUNDARIES
+

+If a pattern ends with one of sequences \b or \B, which test for word +boundaries, partial matching with PCRE_PARTIAL_SOFT can give counter-intuitive +results. Consider this pattern: +

+  /\bcat\b/
+
+This matches "cat", provided there is a word boundary at either end. If the +subject string is "the cat", the comparison of the final "t" with a following +character cannot take place, so a partial match is found. However, normal +matching carries on, and \b matches at the end of the subject when the last +character is a letter, so a complete match is found. The result, therefore, is +not PCRE_ERROR_PARTIAL. Using PCRE_PARTIAL_HARD in this case does yield +PCRE_ERROR_PARTIAL, because then the partial match takes precedence. +

+
FORMERLY RESTRICTED PATTERNS
+

+For releases of PCRE prior to 8.00, because of the way certain internal +optimizations were implemented in the pcre_exec() function, the +PCRE_PARTIAL option (predecessor of PCRE_PARTIAL_SOFT) could not be used with +all patterns. From release 8.00 onwards, the restrictions no longer apply, and +partial matching with can be requested for any pattern. +

+

+Items that were formerly restricted were repeated single characters and +repeated metasequences. If PCRE_PARTIAL was set for a pattern that did not +conform to the restrictions, pcre_exec() returned the error code +PCRE_ERROR_BADPARTIAL (-13). This error code is no longer in use. The +PCRE_INFO_OKPARTIAL call to pcre_fullinfo() to find out if a compiled +pattern can be used for partial matching now always returns 1. +

+
EXAMPLE OF PARTIAL MATCHING USING PCRETEST
+

+If the escape sequence \P is present in a pcretest data line, the +PCRE_PARTIAL_SOFT option is used for the match. Here is a run of pcretest +that uses the date example quoted above: +

+    re> /^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$/
+  data> 25jun04\P
+   0: 25jun04
+   1: jun
+  data> 25dec3\P
+  Partial match: 23dec3
+  data> 3ju\P
+  Partial match: 3ju
+  data> 3juj\P
+  No match
+  data> j\P
+  No match
+
+The first data string is matched completely, so pcretest shows the +matched substrings. The remaining four strings do not match the complete +pattern, but the first two are partial matches. Similar output is obtained +if DFA matching is used. +

+

+If the escape sequence \P is present more than once in a pcretest data +line, the PCRE_PARTIAL_HARD option is set for the match. +

+
MULTI-SEGMENT MATCHING WITH pcre_dfa_exec() OR pcre[16|32]_dfa_exec()
+

+When a partial match has been found using a DFA matching function, it is +possible to continue the match by providing additional subject data and calling +the function again with the same compiled regular expression, this time setting +the PCRE_DFA_RESTART option. You must pass the same working space as before, +because this is where details of the previous partial match are stored. Here is +an example using pcretest, using the \R escape sequence to set the +PCRE_DFA_RESTART option (\D specifies the use of the DFA matching function): +

+    re> /^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$/
+  data> 23ja\P\D
+  Partial match: 23ja
+  data> n05\R\D
+   0: n05
+
+The first call has "23ja" as the subject, and requests partial matching; the +second call has "n05" as the subject for the continued (restarted) match. +Notice that when the match is complete, only the last part is shown; PCRE does +not retain the previously partially-matched string. It is up to the calling +program to do that if it needs to. +

+

+That means that, for an unanchored pattern, if a continued match fails, it is +not possible to try again at a new starting point. All this facility is capable +of doing is continuing with the previous match attempt. In the previous +example, if the second set of data is "ug23" the result is no match, even +though there would be a match for "aug23" if the entire string were given at +once. Depending on the application, this may or may not be what you want. +The only way to allow for starting again at the next character is to retain the +matched part of the subject and try a new complete match. +

+

+You can set the PCRE_PARTIAL_SOFT or PCRE_PARTIAL_HARD options with +PCRE_DFA_RESTART to continue partial matching over multiple segments. This +facility can be used to pass very long subject strings to the DFA matching +functions. +

+
MULTI-SEGMENT MATCHING WITH pcre_exec() OR pcre[16|32]_exec()
+

+From release 8.00, the standard matching functions can also be used to do +multi-segment matching. Unlike the DFA functions, it is not possible to +restart the previous match with a new segment of data. Instead, new data must +be added to the previous subject string, and the entire match re-run, starting +from the point where the partial match occurred. Earlier data can be discarded. +

+

+It is best to use PCRE_PARTIAL_HARD in this situation, because it does not +treat the end of a segment as the end of the subject when matching \z, \Z, +\b, \B, and $. Consider an unanchored pattern that matches dates: +

+    re> /\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d/
+  data> The date is 23ja\P\P
+  Partial match: 23ja
+
+At this stage, an application could discard the text preceding "23ja", add on +text from the next segment, and call the matching function again. Unlike the +DFA matching functions, the entire matching string must always be available, +and the complete matching process occurs for each call, so more memory and more +processing time is needed. +

+

+Note: If the pattern contains lookbehind assertions, or \K, or starts +with \b or \B, the string that is returned for a partial match includes +characters that precede the start of what would be returned for a complete +match, because it contains all the characters that were inspected during the +partial match. +

+
ISSUES WITH MULTI-SEGMENT MATCHING
+

+Certain types of pattern may give problems with multi-segment matching, +whichever matching function is used. +

+

+1. If the pattern contains a test for the beginning of a line, you need to pass +the PCRE_NOTBOL option when the subject string for any call does start at the +beginning of a line. There is also a PCRE_NOTEOL option, but in practice when +doing multi-segment matching you should be using PCRE_PARTIAL_HARD, which +includes the effect of PCRE_NOTEOL. +

+

+2. Lookbehind assertions that have already been obeyed are catered for in the +offsets that are returned for a partial match. However a lookbehind assertion +later in the pattern could require even earlier characters to be inspected. You +can handle this case by using the PCRE_INFO_MAXLOOKBEHIND option of the +pcre_fullinfo() or pcre[16|32]_fullinfo() functions to obtain the +length of the longest lookbehind in the pattern. This length is given in +characters, not bytes. If you always retain at least that many characters +before the partially matched string, all should be well. (Of course, near the +start of the subject, fewer characters may be present; in that case all +characters should be retained.) +

+

+From release 8.33, there is a more accurate way of deciding which characters to +retain. Instead of subtracting the length of the longest lookbehind from the +earliest inspected character (offsets[0]), the match start position +(offsets[2]) should be used, and the next match attempt started at the +offsets[2] character by setting the startoffset argument of +pcre_exec() or pcre_dfa_exec(). +

+

+For example, if the pattern "(?<=123)abc" is partially +matched against the string "xx123a", the three offset values returned are 2, 6, +and 5. This indicates that the matching process that gave a partial match +started at offset 5, but the characters "123a" were all inspected. The maximum +lookbehind for that pattern is 3, so taking that away from 5 shows that we need +only keep "123a", and the next match attempt can be started at offset 3 (that +is, at "a") when further characters have been added. When the match start is +not the earliest inspected character, pcretest shows it explicitly: +

+    re> "(?<=123)abc"
+  data> xx123a\P\P
+  Partial match at offset 5: 123a
+
+

+

+3. Because a partial match must always contain at least one character, what +might be considered a partial match of an empty string actually gives a "no +match" result. For example: +

+    re> /c(?<=abc)x/
+  data> ab\P
+  No match
+
+If the next segment begins "cx", a match should be found, but this will only +happen if characters from the previous segment are retained. For this reason, a +"no match" result should be interpreted as "partial match of an empty string" +when the pattern contains lookbehinds. +

+

+4. Matching a subject string that is split into multiple segments may not +always produce exactly the same result as matching over one single long string, +especially when PCRE_PARTIAL_SOFT is used. The section "Partial Matching and +Word Boundaries" above describes an issue that arises if the pattern ends with +\b or \B. Another kind of difference may occur when there are multiple +matching possibilities, because (for PCRE_PARTIAL_SOFT) a partial match result +is given only when there are no completed matches. This means that as soon as +the shortest match has been found, continuation to a new subject segment is no +longer possible. Consider again this pcretest example: +

+    re> /dog(sbody)?/
+  data> dogsb\P
+   0: dog
+  data> do\P\D
+  Partial match: do
+  data> gsb\R\P\D
+   0: g
+  data> dogsbody\D
+   0: dogsbody
+   1: dog
+
+The first data line passes the string "dogsb" to a standard matching function, +setting the PCRE_PARTIAL_SOFT option. Although the string is a partial match +for "dogsbody", the result is not PCRE_ERROR_PARTIAL, because the shorter +string "dog" is a complete match. Similarly, when the subject is presented to +a DFA matching function in several parts ("do" and "gsb" being the first two) +the match stops when "dog" has been found, and it is not possible to continue. +On the other hand, if "dogsbody" is presented as a single string, a DFA +matching function finds both matches. +

+

+Because of these problems, it is best to use PCRE_PARTIAL_HARD when matching +multi-segment data. The example above then behaves differently: +

+    re> /dog(sbody)?/
+  data> dogsb\P\P
+  Partial match: dogsb
+  data> do\P\D
+  Partial match: do
+  data> gsb\R\P\P\D
+  Partial match: gsb
+
+5. Patterns that contain alternatives at the top level which do not all start +with the same pattern item may not work as expected when PCRE_DFA_RESTART is +used. For example, consider this pattern: +
+  1234|3789
+
+If the first part of the subject is "ABC123", a partial match of the first +alternative is found at offset 3. There is no partial match for the second +alternative, because such a match does not start at the same point in the +subject string. Attempting to continue with the string "7890" does not yield a +match because only those alternatives that match at one point in the subject +are remembered. The problem arises because the start of the second alternative +matches within the first alternative. There is no problem with anchored +patterns or patterns such as: +
+  1234|ABCD
+
+where no string can be a partial match for both alternatives. This is not a +problem if a standard matching function is used, because the entire match has +to be rerun each time: +
+    re> /1234|3789/
+  data> ABC123\P\P
+  Partial match: 123
+  data> 1237890
+   0: 3789
+
+Of course, instead of using PCRE_DFA_RESTART, the same technique of re-running +the entire match can also be used with the DFA matching functions. Another +possibility is to work with two buffers. If a partial match at offset n +in the first buffer is followed by "no match" when PCRE_DFA_RESTART is used on +the second buffer, you can then try a new match starting at offset n+1 in +the first buffer. +

+
AUTHOR
+

+Philip Hazel +
+University Computing Service +
+Cambridge CB2 3QH, England. +
+

+
REVISION
+

+Last updated: 02 July 2013 +
+Copyright © 1997-2013 University of Cambridge. +
+

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcrepattern.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcrepattern.html new file mode 100755 index 000000000..96fc72986 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcrepattern.html @@ -0,0 +1,3276 @@ + + +pcrepattern specification + + +

pcrepattern man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+

+
PCRE REGULAR EXPRESSION DETAILS
+

+The syntax and semantics of the regular expressions that are supported by PCRE +are described in detail below. There is a quick-reference syntax summary in the +pcresyntax +page. PCRE tries to match Perl syntax and semantics as closely as it can. PCRE +also supports some alternative regular expression syntax (which does not +conflict with the Perl syntax) in order to provide some compatibility with +regular expressions in Python, .NET, and Oniguruma. +

+

+Perl's regular expressions are described in its own documentation, and +regular expressions in general are covered in a number of books, some of which +have copious examples. Jeffrey Friedl's "Mastering Regular Expressions", +published by O'Reilly, covers regular expressions in great detail. This +description of PCRE's regular expressions is intended as reference material. +

+

+This document discusses the patterns that are supported by PCRE when one its +main matching functions, pcre_exec() (8-bit) or pcre[16|32]_exec() +(16- or 32-bit), is used. PCRE also has alternative matching functions, +pcre_dfa_exec() and pcre[16|32_dfa_exec(), which match using a +different algorithm that is not Perl-compatible. Some of the features discussed +below are not available when DFA matching is used. The advantages and +disadvantages of the alternative functions, and how they differ from the normal +functions, are discussed in the +pcrematching +page. +

+
SPECIAL START-OF-PATTERN ITEMS
+

+A number of options that can be passed to pcre_compile() can also be set +by special items at the start of a pattern. These are not Perl-compatible, but +are provided to make these options accessible to pattern writers who are not +able to change the program that processes the pattern. Any number of these +items may appear, but they must all be together right at the start of the +pattern string, and the letters must be in upper case. +

+
+UTF support +
+

+The original operation of PCRE was on strings of one-byte characters. However, +there is now also support for UTF-8 strings in the original library, an +extra library that supports 16-bit and UTF-16 character strings, and a +third library that supports 32-bit and UTF-32 character strings. To use these +features, PCRE must be built to include appropriate support. When using UTF +strings you must either call the compiling function with the PCRE_UTF8, +PCRE_UTF16, or PCRE_UTF32 option, or the pattern must start with one of +these special sequences: +

+  (*UTF8)
+  (*UTF16)
+  (*UTF32)
+  (*UTF)
+
+(*UTF) is a generic sequence that can be used with any of the libraries. +Starting a pattern with such a sequence is equivalent to setting the relevant +option. How setting a UTF mode affects pattern matching is mentioned in several +places below. There is also a summary of features in the +pcreunicode +page. +

+

+Some applications that allow their users to supply patterns may wish to +restrict them to non-UTF data for security reasons. If the PCRE_NEVER_UTF +option is set at compile time, (*UTF) etc. are not allowed, and their +appearance causes an error. +

+
+Unicode property support +
+

+Another special sequence that may appear at the start of a pattern is (*UCP). +This has the same effect as setting the PCRE_UCP option: it causes sequences +such as \d and \w to use Unicode properties to determine character types, +instead of recognizing only characters with codes less than 128 via a lookup +table. +

+
+Disabling auto-possessification +
+

+If a pattern starts with (*NO_AUTO_POSSESS), it has the same effect as setting +the PCRE_NO_AUTO_POSSESS option at compile time. This stops PCRE from making +quantifiers possessive when what follows cannot match the repeated item. For +example, by default a+b is treated as a++b. For more details, see the +pcreapi +documentation. +

+
+Disabling start-up optimizations +
+

+If a pattern starts with (*NO_START_OPT), it has the same effect as setting the +PCRE_NO_START_OPTIMIZE option either at compile or matching time. This disables +several optimizations for quickly reaching "no match" results. For more +details, see the +pcreapi +documentation. +

+
+Newline conventions +
+

+PCRE supports five different conventions for indicating line breaks in +strings: a single CR (carriage return) character, a single LF (linefeed) +character, the two-character sequence CRLF, any of the three preceding, or any +Unicode newline sequence. The +pcreapi +page has +further discussion +about newlines, and shows how to set the newline convention in the +options arguments for the compiling and matching functions. +

+

+It is also possible to specify a newline convention by starting a pattern +string with one of the following five sequences: +

+  (*CR)        carriage return
+  (*LF)        linefeed
+  (*CRLF)      carriage return, followed by linefeed
+  (*ANYCRLF)   any of the three above
+  (*ANY)       all Unicode newline sequences
+
+These override the default and the options given to the compiling function. For +example, on a Unix system where LF is the default newline sequence, the pattern +
+  (*CR)a.b
+
+changes the convention to CR. That pattern matches "a\nb" because LF is no +longer a newline. If more than one of these settings is present, the last one +is used. +

+

+The newline convention affects where the circumflex and dollar assertions are +true. It also affects the interpretation of the dot metacharacter when +PCRE_DOTALL is not set, and the behaviour of \N. However, it does not affect +what the \R escape sequence matches. By default, this is any Unicode newline +sequence, for Perl compatibility. However, this can be changed; see the +description of \R in the section entitled +"Newline sequences" +below. A change of \R setting can be combined with a change of newline +convention. +

+
+Setting match and recursion limits +
+

+The caller of pcre_exec() can set a limit on the number of times the +internal match() function is called and on the maximum depth of +recursive calls. These facilities are provided to catch runaway matches that +are provoked by patterns with huge matching trees (a typical example is a +pattern with nested unlimited repeats) and to avoid running out of system stack +by too much recursion. When one of these limits is reached, pcre_exec() +gives an error return. The limits can also be set by items at the start of the +pattern of the form +

+  (*LIMIT_MATCH=d)
+  (*LIMIT_RECURSION=d)
+
+where d is any number of decimal digits. However, the value of the setting must +be less than the value set (or defaulted) by the caller of pcre_exec() +for it to have any effect. In other words, the pattern writer can lower the +limits set by the programmer, but not raise them. If there is more than one +setting of one of these limits, the lower value is used. +

+
EBCDIC CHARACTER CODES
+

+PCRE can be compiled to run in an environment that uses EBCDIC as its character +code rather than ASCII or Unicode (typically a mainframe system). In the +sections below, character code values are ASCII or Unicode; in an EBCDIC +environment these characters may have different code values, and there are no +code points greater than 255. +

+
CHARACTERS AND METACHARACTERS
+

+A regular expression is a pattern that is matched against a subject string from +left to right. Most characters stand for themselves in a pattern, and match the +corresponding characters in the subject. As a trivial example, the pattern +

+  The quick brown fox
+
+matches a portion of a subject string that is identical to itself. When +caseless matching is specified (the PCRE_CASELESS option), letters are matched +independently of case. In a UTF mode, PCRE always understands the concept of +case for characters whose values are less than 128, so caseless matching is +always possible. For characters with higher values, the concept of case is +supported if PCRE is compiled with Unicode property support, but not otherwise. +If you want to use caseless matching for characters 128 and above, you must +ensure that PCRE is compiled with Unicode property support as well as with +UTF support. +

+

+The power of regular expressions comes from the ability to include alternatives +and repetitions in the pattern. These are encoded in the pattern by the use of +metacharacters, which do not stand for themselves but instead are +interpreted in some special way. +

+

+There are two different sets of metacharacters: those that are recognized +anywhere in the pattern except within square brackets, and those that are +recognized within square brackets. Outside square brackets, the metacharacters +are as follows: +

+  \      general escape character with several uses
+  ^      assert start of string (or line, in multiline mode)
+  $      assert end of string (or line, in multiline mode)
+  .      match any character except newline (by default)
+  [      start character class definition
+  |      start of alternative branch
+  (      start subpattern
+  )      end subpattern
+  ?      extends the meaning of (
+         also 0 or 1 quantifier
+         also quantifier minimizer
+  *      0 or more quantifier
+  +      1 or more quantifier
+         also "possessive quantifier"
+  {      start min/max quantifier
+
+Part of a pattern that is in square brackets is called a "character class". In +a character class the only metacharacters are: +
+  \      general escape character
+  ^      negate the class, but only if the first character
+  -      indicates character range
+  [      POSIX character class (only if followed by POSIX syntax)
+  ]      terminates the character class
+
+The following sections describe the use of each of the metacharacters. +

+
BACKSLASH
+

+The backslash character has several uses. Firstly, if it is followed by a +character that is not a number or a letter, it takes away any special meaning +that character may have. This use of backslash as an escape character applies +both inside and outside character classes. +

+

+For example, if you want to match a * character, you write \* in the pattern. +This escaping action applies whether or not the following character would +otherwise be interpreted as a metacharacter, so it is always safe to precede a +non-alphanumeric with backslash to specify that it stands for itself. In +particular, if you want to match a backslash, you write \\. +

+

+In a UTF mode, only ASCII numbers and letters have any special meaning after a +backslash. All other characters (in particular, those whose codepoints are +greater than 127) are treated as literals. +

+

+If a pattern is compiled with the PCRE_EXTENDED option, most white space in the +pattern (other than in a character class), and characters between a # outside a +character class and the next newline, inclusive, are ignored. An escaping +backslash can be used to include a white space or # character as part of the +pattern. +

+

+If you want to remove the special meaning from a sequence of characters, you +can do so by putting them between \Q and \E. This is different from Perl in +that $ and @ are handled as literals in \Q...\E sequences in PCRE, whereas in +Perl, $ and @ cause variable interpolation. Note the following examples: +

+  Pattern            PCRE matches   Perl matches
+
+  \Qabc$xyz\E        abc$xyz        abc followed by the contents of $xyz
+  \Qabc\$xyz\E       abc\$xyz       abc\$xyz
+  \Qabc\E\$\Qxyz\E   abc$xyz        abc$xyz
+
+The \Q...\E sequence is recognized both inside and outside character classes. +An isolated \E that is not preceded by \Q is ignored. If \Q is not followed +by \E later in the pattern, the literal interpretation continues to the end of +the pattern (that is, \E is assumed at the end). If the isolated \Q is inside +a character class, this causes an error, because the character class is not +terminated. +

+
+Non-printing characters +
+

+A second use of backslash provides a way of encoding non-printing characters +in patterns in a visible manner. There is no restriction on the appearance of +non-printing characters, apart from the binary zero that terminates a pattern, +but when a pattern is being prepared by text editing, it is often easier to use +one of the following escape sequences than the binary character it represents. +In an ASCII or Unicode environment, these escapes are as follows: +

+  \a        alarm, that is, the BEL character (hex 07)
+  \cx       "control-x", where x is any ASCII character
+  \e        escape (hex 1B)
+  \f        form feed (hex 0C)
+  \n        linefeed (hex 0A)
+  \r        carriage return (hex 0D)
+  \t        tab (hex 09)
+  \0dd      character with octal code 0dd
+  \ddd      character with octal code ddd, or back reference
+  \o{ddd..} character with octal code ddd..
+  \xhh      character with hex code hh
+  \x{hhh..} character with hex code hhh.. (non-JavaScript mode)
+  \uhhhh    character with hex code hhhh (JavaScript mode only)
+
+The precise effect of \cx on ASCII characters is as follows: if x is a lower +case letter, it is converted to upper case. Then bit 6 of the character (hex +40) is inverted. Thus \cA to \cZ become hex 01 to hex 1A (A is 41, Z is 5A), +but \c{ becomes hex 3B ({ is 7B), and \c; becomes hex 7B (; is 3B). If the +data item (byte or 16-bit value) following \c has a value greater than 127, a +compile-time error occurs. This locks out non-ASCII characters in all modes. +

+

+When PCRE is compiled in EBCDIC mode, \a, \e, \f, \n, \r, and \t +generate the appropriate EBCDIC code values. The \c escape is processed +as specified for Perl in the perlebcdic document. The only characters +that are allowed after \c are A-Z, a-z, or one of @, [, \, ], ^, _, or ?. Any +other character provokes a compile-time error. The sequence \c@ encodes +character code 0; after \c the letters (in either case) encode characters 1-26 +(hex 01 to hex 1A); [, \, ], ^, and _ encode characters 27-31 (hex 1B to hex +1F), and \c? becomes either 255 (hex FF) or 95 (hex 5F). +

+

+Thus, apart from \c?, these escapes generate the same character code values as +they do in an ASCII environment, though the meanings of the values mostly +differ. For example, \cG always generates code value 7, which is BEL in ASCII +but DEL in EBCDIC. +

+

+The sequence \c? generates DEL (127, hex 7F) in an ASCII environment, but +because 127 is not a control character in EBCDIC, Perl makes it generate the +APC character. Unfortunately, there are several variants of EBCDIC. In most of +them the APC character has the value 255 (hex FF), but in the one Perl calls +POSIX-BC its value is 95 (hex 5F). If certain other characters have POSIX-BC +values, PCRE makes \c? generate 95; otherwise it generates 255. +

+

+After \0 up to two further octal digits are read. If there are fewer than two +digits, just those that are present are used. Thus the sequence \0\x\015 +specifies two binary zeros followed by a CR character (code value 13). Make +sure you supply two digits after the initial zero if the pattern character that +follows is itself an octal digit. +

+

+The escape \o must be followed by a sequence of octal digits, enclosed in +braces. An error occurs if this is not the case. This escape is a recent +addition to Perl; it provides way of specifying character code points as octal +numbers greater than 0777, and it also allows octal numbers and back references +to be unambiguously specified. +

+

+For greater clarity and unambiguity, it is best to avoid following \ by a +digit greater than zero. Instead, use \o{} or \x{} to specify character +numbers, and \g{} to specify back references. The following paragraphs +describe the old, ambiguous syntax. +

+

+The handling of a backslash followed by a digit other than 0 is complicated, +and Perl has changed in recent releases, causing PCRE also to change. Outside a +character class, PCRE reads the digit and any following digits as a decimal +number. If the number is less than 8, or if there have been at least that many +previous capturing left parentheses in the expression, the entire sequence is +taken as a back reference. A description of how this works is given +later, +following the discussion of +parenthesized subpatterns. +

+

+Inside a character class, or if the decimal number following \ is greater than +7 and there have not been that many capturing subpatterns, PCRE handles \8 and +\9 as the literal characters "8" and "9", and otherwise re-reads up to three +octal digits following the backslash, using them to generate a data character. +Any subsequent digits stand for themselves. For example: +

+  \040   is another way of writing an ASCII space
+  \40    is the same, provided there are fewer than 40 previous capturing subpatterns
+  \7     is always a back reference
+  \11    might be a back reference, or another way of writing a tab
+  \011   is always a tab
+  \0113  is a tab followed by the character "3"
+  \113   might be a back reference, otherwise the character with octal code 113
+  \377   might be a back reference, otherwise the value 255 (decimal)
+  \81    is either a back reference, or the two characters "8" and "1"
+
+Note that octal values of 100 or greater that are specified using this syntax +must not be introduced by a leading zero, because no more than three octal +digits are ever read. +

+

+By default, after \x that is not followed by {, from zero to two hexadecimal +digits are read (letters can be in upper or lower case). Any number of +hexadecimal digits may appear between \x{ and }. If a character other than +a hexadecimal digit appears between \x{ and }, or if there is no terminating +}, an error occurs. +

+

+If the PCRE_JAVASCRIPT_COMPAT option is set, the interpretation of \x is +as just described only when it is followed by two hexadecimal digits. +Otherwise, it matches a literal "x" character. In JavaScript mode, support for +code points greater than 256 is provided by \u, which must be followed by +four hexadecimal digits; otherwise it matches a literal "u" character. +

+

+Characters whose value is less than 256 can be defined by either of the two +syntaxes for \x (or by \u in JavaScript mode). There is no difference in the +way they are handled. For example, \xdc is exactly the same as \x{dc} (or +\u00dc in JavaScript mode). +

+
+Constraints on character values +
+

+Characters that are specified using octal or hexadecimal numbers are +limited to certain values, as follows: +

+  8-bit non-UTF mode    less than 0x100
+  8-bit UTF-8 mode      less than 0x10ffff and a valid codepoint
+  16-bit non-UTF mode   less than 0x10000
+  16-bit UTF-16 mode    less than 0x10ffff and a valid codepoint
+  32-bit non-UTF mode   less than 0x100000000
+  32-bit UTF-32 mode    less than 0x10ffff and a valid codepoint
+
+Invalid Unicode codepoints are the range 0xd800 to 0xdfff (the so-called +"surrogate" codepoints), and 0xffef. +

+
+Escape sequences in character classes +
+

+All the sequences that define a single character value can be used both inside +and outside character classes. In addition, inside a character class, \b is +interpreted as the backspace character (hex 08). +

+

+\N is not allowed in a character class. \B, \R, and \X are not special +inside a character class. Like other unrecognized escape sequences, they are +treated as the literal characters "B", "R", and "X" by default, but cause an +error if the PCRE_EXTRA option is set. Outside a character class, these +sequences have different meanings. +

+
+Unsupported escape sequences +
+

+In Perl, the sequences \l, \L, \u, and \U are recognized by its string +handler and used to modify the case of following characters. By default, PCRE +does not support these escape sequences. However, if the PCRE_JAVASCRIPT_COMPAT +option is set, \U matches a "U" character, and \u can be used to define a +character by code point, as described in the previous section. +

+
+Absolute and relative back references +
+

+The sequence \g followed by an unsigned or a negative number, optionally +enclosed in braces, is an absolute or relative back reference. A named back +reference can be coded as \g{name}. Back references are discussed +later, +following the discussion of +parenthesized subpatterns. +

+
+Absolute and relative subroutine calls +
+

+For compatibility with Oniguruma, the non-Perl syntax \g followed by a name or +a number enclosed either in angle brackets or single quotes, is an alternative +syntax for referencing a subpattern as a "subroutine". Details are discussed +later. +Note that \g{...} (Perl syntax) and \g<...> (Oniguruma syntax) are not +synonymous. The former is a back reference; the latter is a +subroutine +call. +

+
+Generic character types +
+

+Another use of backslash is for specifying generic character types: +

+  \d     any decimal digit
+  \D     any character that is not a decimal digit
+  \h     any horizontal white space character
+  \H     any character that is not a horizontal white space character
+  \s     any white space character
+  \S     any character that is not a white space character
+  \v     any vertical white space character
+  \V     any character that is not a vertical white space character
+  \w     any "word" character
+  \W     any "non-word" character
+
+There is also the single sequence \N, which matches a non-newline character. +This is the same as +the "." metacharacter +when PCRE_DOTALL is not set. Perl also uses \N to match characters by name; +PCRE does not support this. +

+

+Each pair of lower and upper case escape sequences partitions the complete set +of characters into two disjoint sets. Any given character matches one, and only +one, of each pair. The sequences can appear both inside and outside character +classes. They each match one character of the appropriate type. If the current +matching point is at the end of the subject string, all of them fail, because +there is no character to match. +

+

+For compatibility with Perl, \s did not used to match the VT character (code +11), which made it different from the the POSIX "space" class. However, Perl +added VT at release 5.18, and PCRE followed suit at release 8.34. The default +\s characters are now HT (9), LF (10), VT (11), FF (12), CR (13), and space +(32), which are defined as white space in the "C" locale. This list may vary if +locale-specific matching is taking place. For example, in some locales the +"non-breaking space" character (\xA0) is recognized as white space, and in +others the VT character is not. +

+

+A "word" character is an underscore or any character that is a letter or digit. +By default, the definition of letters and digits is controlled by PCRE's +low-valued character tables, and may vary if locale-specific matching is taking +place (see +"Locale support" +in the +pcreapi +page). For example, in a French locale such as "fr_FR" in Unix-like systems, +or "french" in Windows, some character codes greater than 127 are used for +accented letters, and these are then matched by \w. The use of locales with +Unicode is discouraged. +

+

+By default, characters whose code points are greater than 127 never match \d, +\s, or \w, and always match \D, \S, and \W, although this may vary for +characters in the range 128-255 when locale-specific matching is happening. +These escape sequences retain their original meanings from before Unicode +support was available, mainly for efficiency reasons. If PCRE is compiled with +Unicode property support, and the PCRE_UCP option is set, the behaviour is +changed so that Unicode properties are used to determine character types, as +follows: +

+  \d  any character that matches \p{Nd} (decimal digit)
+  \s  any character that matches \p{Z} or \h or \v
+  \w  any character that matches \p{L} or \p{N}, plus underscore
+
+The upper case escapes match the inverse sets of characters. Note that \d +matches only decimal digits, whereas \w matches any Unicode digit, as well as +any Unicode letter, and underscore. Note also that PCRE_UCP affects \b, and +\B because they are defined in terms of \w and \W. Matching these sequences +is noticeably slower when PCRE_UCP is set. +

+

+The sequences \h, \H, \v, and \V are features that were added to Perl at +release 5.10. In contrast to the other sequences, which match only ASCII +characters by default, these always match certain high-valued code points, +whether or not PCRE_UCP is set. The horizontal space characters are: +

+  U+0009     Horizontal tab (HT)
+  U+0020     Space
+  U+00A0     Non-break space
+  U+1680     Ogham space mark
+  U+180E     Mongolian vowel separator
+  U+2000     En quad
+  U+2001     Em quad
+  U+2002     En space
+  U+2003     Em space
+  U+2004     Three-per-em space
+  U+2005     Four-per-em space
+  U+2006     Six-per-em space
+  U+2007     Figure space
+  U+2008     Punctuation space
+  U+2009     Thin space
+  U+200A     Hair space
+  U+202F     Narrow no-break space
+  U+205F     Medium mathematical space
+  U+3000     Ideographic space
+
+The vertical space characters are: +
+  U+000A     Linefeed (LF)
+  U+000B     Vertical tab (VT)
+  U+000C     Form feed (FF)
+  U+000D     Carriage return (CR)
+  U+0085     Next line (NEL)
+  U+2028     Line separator
+  U+2029     Paragraph separator
+
+In 8-bit, non-UTF-8 mode, only the characters with codepoints less than 256 are +relevant. +

+
+Newline sequences +
+

+Outside a character class, by default, the escape sequence \R matches any +Unicode newline sequence. In 8-bit non-UTF-8 mode \R is equivalent to the +following: +

+  (?>\r\n|\n|\x0b|\f|\r|\x85)
+
+This is an example of an "atomic group", details of which are given +below. +This particular group matches either the two-character sequence CR followed by +LF, or one of the single characters LF (linefeed, U+000A), VT (vertical tab, +U+000B), FF (form feed, U+000C), CR (carriage return, U+000D), or NEL (next +line, U+0085). The two-character sequence is treated as a single unit that +cannot be split. +

+

+In other modes, two additional characters whose codepoints are greater than 255 +are added: LS (line separator, U+2028) and PS (paragraph separator, U+2029). +Unicode character property support is not needed for these characters to be +recognized. +

+

+It is possible to restrict \R to match only CR, LF, or CRLF (instead of the +complete set of Unicode line endings) by setting the option PCRE_BSR_ANYCRLF +either at compile time or when the pattern is matched. (BSR is an abbrevation +for "backslash R".) This can be made the default when PCRE is built; if this is +the case, the other behaviour can be requested via the PCRE_BSR_UNICODE option. +It is also possible to specify these settings by starting a pattern string with +one of the following sequences: +

+  (*BSR_ANYCRLF)   CR, LF, or CRLF only
+  (*BSR_UNICODE)   any Unicode newline sequence
+
+These override the default and the options given to the compiling function, but +they can themselves be overridden by options given to a matching function. Note +that these special settings, which are not Perl-compatible, are recognized only +at the very start of a pattern, and that they must be in upper case. If more +than one of them is present, the last one is used. They can be combined with a +change of newline convention; for example, a pattern can start with: +
+  (*ANY)(*BSR_ANYCRLF)
+
+They can also be combined with the (*UTF8), (*UTF16), (*UTF32), (*UTF) or +(*UCP) special sequences. Inside a character class, \R is treated as an +unrecognized escape sequence, and so matches the letter "R" by default, but +causes an error if PCRE_EXTRA is set. +

+
+Unicode character properties +
+

+When PCRE is built with Unicode character property support, three additional +escape sequences that match characters with specific properties are available. +When in 8-bit non-UTF-8 mode, these sequences are of course limited to testing +characters whose codepoints are less than 256, but they do work in this mode. +The extra escape sequences are: +

+  \p{xx}   a character with the xx property
+  \P{xx}   a character without the xx property
+  \X       a Unicode extended grapheme cluster
+
+The property names represented by xx above are limited to the Unicode +script names, the general category properties, "Any", which matches any +character (including newline), and some special PCRE properties (described +in the +next section). +Other Perl properties such as "InMusicalSymbols" are not currently supported by +PCRE. Note that \P{Any} does not match any characters, so always causes a +match failure. +

+

+Sets of Unicode characters are defined as belonging to certain scripts. A +character from one of these sets can be matched using a script name. For +example: +

+  \p{Greek}
+  \P{Han}
+
+Those that are not part of an identified script are lumped together as +"Common". The current list of scripts is: +

+

+Arabic, +Armenian, +Avestan, +Balinese, +Bamum, +Bassa_Vah, +Batak, +Bengali, +Bopomofo, +Brahmi, +Braille, +Buginese, +Buhid, +Canadian_Aboriginal, +Carian, +Caucasian_Albanian, +Chakma, +Cham, +Cherokee, +Common, +Coptic, +Cuneiform, +Cypriot, +Cyrillic, +Deseret, +Devanagari, +Duployan, +Egyptian_Hieroglyphs, +Elbasan, +Ethiopic, +Georgian, +Glagolitic, +Gothic, +Grantha, +Greek, +Gujarati, +Gurmukhi, +Han, +Hangul, +Hanunoo, +Hebrew, +Hiragana, +Imperial_Aramaic, +Inherited, +Inscriptional_Pahlavi, +Inscriptional_Parthian, +Javanese, +Kaithi, +Kannada, +Katakana, +Kayah_Li, +Kharoshthi, +Khmer, +Khojki, +Khudawadi, +Lao, +Latin, +Lepcha, +Limbu, +Linear_A, +Linear_B, +Lisu, +Lycian, +Lydian, +Mahajani, +Malayalam, +Mandaic, +Manichaean, +Meetei_Mayek, +Mende_Kikakui, +Meroitic_Cursive, +Meroitic_Hieroglyphs, +Miao, +Modi, +Mongolian, +Mro, +Myanmar, +Nabataean, +New_Tai_Lue, +Nko, +Ogham, +Ol_Chiki, +Old_Italic, +Old_North_Arabian, +Old_Permic, +Old_Persian, +Old_South_Arabian, +Old_Turkic, +Oriya, +Osmanya, +Pahawh_Hmong, +Palmyrene, +Pau_Cin_Hau, +Phags_Pa, +Phoenician, +Psalter_Pahlavi, +Rejang, +Runic, +Samaritan, +Saurashtra, +Sharada, +Shavian, +Siddham, +Sinhala, +Sora_Sompeng, +Sundanese, +Syloti_Nagri, +Syriac, +Tagalog, +Tagbanwa, +Tai_Le, +Tai_Tham, +Tai_Viet, +Takri, +Tamil, +Telugu, +Thaana, +Thai, +Tibetan, +Tifinagh, +Tirhuta, +Ugaritic, +Vai, +Warang_Citi, +Yi. +

+

+Each character has exactly one Unicode general category property, specified by +a two-letter abbreviation. For compatibility with Perl, negation can be +specified by including a circumflex between the opening brace and the property +name. For example, \p{^Lu} is the same as \P{Lu}. +

+

+If only one letter is specified with \p or \P, it includes all the general +category properties that start with that letter. In this case, in the absence +of negation, the curly brackets in the escape sequence are optional; these two +examples have the same effect: +

+  \p{L}
+  \pL
+
+The following general category property codes are supported: +
+  C     Other
+  Cc    Control
+  Cf    Format
+  Cn    Unassigned
+  Co    Private use
+  Cs    Surrogate
+
+  L     Letter
+  Ll    Lower case letter
+  Lm    Modifier letter
+  Lo    Other letter
+  Lt    Title case letter
+  Lu    Upper case letter
+
+  M     Mark
+  Mc    Spacing mark
+  Me    Enclosing mark
+  Mn    Non-spacing mark
+
+  N     Number
+  Nd    Decimal number
+  Nl    Letter number
+  No    Other number
+
+  P     Punctuation
+  Pc    Connector punctuation
+  Pd    Dash punctuation
+  Pe    Close punctuation
+  Pf    Final punctuation
+  Pi    Initial punctuation
+  Po    Other punctuation
+  Ps    Open punctuation
+
+  S     Symbol
+  Sc    Currency symbol
+  Sk    Modifier symbol
+  Sm    Mathematical symbol
+  So    Other symbol
+
+  Z     Separator
+  Zl    Line separator
+  Zp    Paragraph separator
+  Zs    Space separator
+
+The special property L& is also supported: it matches a character that has +the Lu, Ll, or Lt property, in other words, a letter that is not classified as +a modifier or "other". +

+

+The Cs (Surrogate) property applies only to characters in the range U+D800 to +U+DFFF. Such characters are not valid in Unicode strings and so +cannot be tested by PCRE, unless UTF validity checking has been turned off +(see the discussion of PCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK and +PCRE_NO_UTF32_CHECK in the +pcreapi +page). Perl does not support the Cs property. +

+

+The long synonyms for property names that Perl supports (such as \p{Letter}) +are not supported by PCRE, nor is it permitted to prefix any of these +properties with "Is". +

+

+No character that is in the Unicode table has the Cn (unassigned) property. +Instead, this property is assumed for any code point that is not in the +Unicode table. +

+

+Specifying caseless matching does not affect these escape sequences. For +example, \p{Lu} always matches only upper case letters. This is different from +the behaviour of current versions of Perl. +

+

+Matching characters by Unicode property is not fast, because PCRE has to do a +multistage table lookup in order to find a character's property. That is why +the traditional escape sequences such as \d and \w do not use Unicode +properties in PCRE by default, though you can make them do so by setting the +PCRE_UCP option or by starting the pattern with (*UCP). +

+
+Extended grapheme clusters +
+

+The \X escape matches any number of Unicode characters that form an "extended +grapheme cluster", and treats the sequence as an atomic group +(see below). +Up to and including release 8.31, PCRE matched an earlier, simpler definition +that was equivalent to +

+  (?>\PM\pM*)
+
+That is, it matched a character without the "mark" property, followed by zero +or more characters with the "mark" property. Characters with the "mark" +property are typically non-spacing accents that affect the preceding character. +

+

+This simple definition was extended in Unicode to include more complicated +kinds of composite character by giving each character a grapheme breaking +property, and creating rules that use these properties to define the boundaries +of extended grapheme clusters. In releases of PCRE later than 8.31, \X matches +one of these clusters. +

+

+\X always matches at least one character. Then it decides whether to add +additional characters according to the following rules for ending a cluster: +

+

+1. End at the end of the subject string. +

+

+2. Do not end between CR and LF; otherwise end after any control character. +

+

+3. Do not break Hangul (a Korean script) syllable sequences. Hangul characters +are of five types: L, V, T, LV, and LVT. An L character may be followed by an +L, V, LV, or LVT character; an LV or V character may be followed by a V or T +character; an LVT or T character may be follwed only by a T character. +

+

+4. Do not end before extending characters or spacing marks. Characters with +the "mark" property always have the "extend" grapheme breaking property. +

+

+5. Do not end after prepend characters. +

+

+6. Otherwise, end the cluster. +

+
+PCRE's additional properties +
+

+As well as the standard Unicode properties described above, PCRE supports four +more that make it possible to convert traditional escape sequences such as \w +and \s to use Unicode properties. PCRE uses these non-standard, non-Perl +properties internally when PCRE_UCP is set. However, they may also be used +explicitly. These properties are: +

+  Xan   Any alphanumeric character
+  Xps   Any POSIX space character
+  Xsp   Any Perl space character
+  Xwd   Any Perl "word" character
+
+Xan matches characters that have either the L (letter) or the N (number) +property. Xps matches the characters tab, linefeed, vertical tab, form feed, or +carriage return, and any other character that has the Z (separator) property. +Xsp is the same as Xps; it used to exclude vertical tab, for Perl +compatibility, but Perl changed, and so PCRE followed at release 8.34. Xwd +matches the same characters as Xan, plus underscore. +

+

+There is another non-standard property, Xuc, which matches any character that +can be represented by a Universal Character Name in C++ and other programming +languages. These are the characters $, @, ` (grave accent), and all characters +with Unicode code points greater than or equal to U+00A0, except for the +surrogates U+D800 to U+DFFF. Note that most base (ASCII) characters are +excluded. (Universal Character Names are of the form \uHHHH or \UHHHHHHHH +where H is a hexadecimal digit. Note that the Xuc property does not match these +sequences but the characters that they represent.) +

+
+Resetting the match start +
+

+The escape sequence \K causes any previously matched characters not to be +included in the final matched sequence. For example, the pattern: +

+  foo\Kbar
+
+matches "foobar", but reports that it has matched "bar". This feature is +similar to a lookbehind assertion +(described below). +However, in this case, the part of the subject before the real match does not +have to be of fixed length, as lookbehind assertions do. The use of \K does +not interfere with the setting of +captured substrings. +For example, when the pattern +
+  (foo)\Kbar
+
+matches "foobar", the first substring is still set to "foo". +

+

+Perl documents that the use of \K within assertions is "not well defined". In +PCRE, \K is acted upon when it occurs inside positive assertions, but is +ignored in negative assertions. Note that when a pattern such as (?=ab\K) +matches, the reported start of the match can be greater than the end of the +match. +

+
+Simple assertions +
+

+The final use of backslash is for certain simple assertions. An assertion +specifies a condition that has to be met at a particular point in a match, +without consuming any characters from the subject string. The use of +subpatterns for more complicated assertions is described +below. +The backslashed assertions are: +

+  \b     matches at a word boundary
+  \B     matches when not at a word boundary
+  \A     matches at the start of the subject
+  \Z     matches at the end of the subject
+          also matches before a newline at the end of the subject
+  \z     matches only at the end of the subject
+  \G     matches at the first matching position in the subject
+
+Inside a character class, \b has a different meaning; it matches the backspace +character. If any other of these assertions appears in a character class, by +default it matches the corresponding literal character (for example, \B +matches the letter B). However, if the PCRE_EXTRA option is set, an "invalid +escape sequence" error is generated instead. +

+

+A word boundary is a position in the subject string where the current character +and the previous character do not both match \w or \W (i.e. one matches +\w and the other matches \W), or the start or end of the string if the +first or last character matches \w, respectively. In a UTF mode, the meanings +of \w and \W can be changed by setting the PCRE_UCP option. When this is +done, it also affects \b and \B. Neither PCRE nor Perl has a separate "start +of word" or "end of word" metasequence. However, whatever follows \b normally +determines which it is. For example, the fragment \ba matches "a" at the start +of a word. +

+

+The \A, \Z, and \z assertions differ from the traditional circumflex and +dollar (described in the next section) in that they only ever match at the very +start and end of the subject string, whatever options are set. Thus, they are +independent of multiline mode. These three assertions are not affected by the +PCRE_NOTBOL or PCRE_NOTEOL options, which affect only the behaviour of the +circumflex and dollar metacharacters. However, if the startoffset +argument of pcre_exec() is non-zero, indicating that matching is to start +at a point other than the beginning of the subject, \A can never match. The +difference between \Z and \z is that \Z matches before a newline at the end +of the string as well as at the very end, whereas \z matches only at the end. +

+

+The \G assertion is true only when the current matching position is at the +start point of the match, as specified by the startoffset argument of +pcre_exec(). It differs from \A when the value of startoffset is +non-zero. By calling pcre_exec() multiple times with appropriate +arguments, you can mimic Perl's /g option, and it is in this kind of +implementation where \G can be useful. +

+

+Note, however, that PCRE's interpretation of \G, as the start of the current +match, is subtly different from Perl's, which defines it as the end of the +previous match. In Perl, these can be different when the previously matched +string was empty. Because PCRE does just one match at a time, it cannot +reproduce this behaviour. +

+

+If all the alternatives of a pattern begin with \G, the expression is anchored +to the starting match position, and the "anchored" flag is set in the compiled +regular expression. +

+
CIRCUMFLEX AND DOLLAR
+

+The circumflex and dollar metacharacters are zero-width assertions. That is, +they test for a particular condition being true without consuming any +characters from the subject string. +

+

+Outside a character class, in the default matching mode, the circumflex +character is an assertion that is true only if the current matching point is at +the start of the subject string. If the startoffset argument of +pcre_exec() is non-zero, circumflex can never match if the PCRE_MULTILINE +option is unset. Inside a character class, circumflex has an entirely different +meaning +(see below). +

+

+Circumflex need not be the first character of the pattern if a number of +alternatives are involved, but it should be the first thing in each alternative +in which it appears if the pattern is ever to match that branch. If all +possible alternatives start with a circumflex, that is, if the pattern is +constrained to match only at the start of the subject, it is said to be an +"anchored" pattern. (There are also other constructs that can cause a pattern +to be anchored.) +

+

+The dollar character is an assertion that is true only if the current matching +point is at the end of the subject string, or immediately before a newline at +the end of the string (by default). Note, however, that it does not actually +match the newline. Dollar need not be the last character of the pattern if a +number of alternatives are involved, but it should be the last item in any +branch in which it appears. Dollar has no special meaning in a character class. +

+

+The meaning of dollar can be changed so that it matches only at the very end of +the string, by setting the PCRE_DOLLAR_ENDONLY option at compile time. This +does not affect the \Z assertion. +

+

+The meanings of the circumflex and dollar characters are changed if the +PCRE_MULTILINE option is set. When this is the case, a circumflex matches +immediately after internal newlines as well as at the start of the subject +string. It does not match after a newline that ends the string. A dollar +matches before any newlines in the string, as well as at the very end, when +PCRE_MULTILINE is set. When newline is specified as the two-character +sequence CRLF, isolated CR and LF characters do not indicate newlines. +

+

+For example, the pattern /^abc$/ matches the subject string "def\nabc" (where +\n represents a newline) in multiline mode, but not otherwise. Consequently, +patterns that are anchored in single line mode because all branches start with +^ are not anchored in multiline mode, and a match for circumflex is possible +when the startoffset argument of pcre_exec() is non-zero. The +PCRE_DOLLAR_ENDONLY option is ignored if PCRE_MULTILINE is set. +

+

+Note that the sequences \A, \Z, and \z can be used to match the start and +end of the subject in both modes, and if all branches of a pattern start with +\A it is always anchored, whether or not PCRE_MULTILINE is set. +

+
FULL STOP (PERIOD, DOT) AND \N
+

+Outside a character class, a dot in the pattern matches any one character in +the subject string except (by default) a character that signifies the end of a +line. +

+

+When a line ending is defined as a single character, dot never matches that +character; when the two-character sequence CRLF is used, dot does not match CR +if it is immediately followed by LF, but otherwise it matches all characters +(including isolated CRs and LFs). When any Unicode line endings are being +recognized, dot does not match CR or LF or any of the other line ending +characters. +

+

+The behaviour of dot with regard to newlines can be changed. If the PCRE_DOTALL +option is set, a dot matches any one character, without exception. If the +two-character sequence CRLF is present in the subject string, it takes two dots +to match it. +

+

+The handling of dot is entirely independent of the handling of circumflex and +dollar, the only relationship being that they both involve newlines. Dot has no +special meaning in a character class. +

+

+The escape sequence \N behaves like a dot, except that it is not affected by +the PCRE_DOTALL option. In other words, it matches any character except one +that signifies the end of a line. Perl also uses \N to match characters by +name; PCRE does not support this. +

+
MATCHING A SINGLE DATA UNIT
+

+Outside a character class, the escape sequence \C matches any one data unit, +whether or not a UTF mode is set. In the 8-bit library, one data unit is one +byte; in the 16-bit library it is a 16-bit unit; in the 32-bit library it is +a 32-bit unit. Unlike a dot, \C always +matches line-ending characters. The feature is provided in Perl in order to +match individual bytes in UTF-8 mode, but it is unclear how it can usefully be +used. Because \C breaks up characters into individual data units, matching one +unit with \C in a UTF mode means that the rest of the string may start with a +malformed UTF character. This has undefined results, because PCRE assumes that +it is dealing with valid UTF strings (and by default it checks this at the +start of processing unless the PCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK or +PCRE_NO_UTF32_CHECK option is used). +

+

+PCRE does not allow \C to appear in lookbehind assertions +(described below) +in a UTF mode, because this would make it impossible to calculate the length of +the lookbehind. +

+

+In general, the \C escape sequence is best avoided. However, one +way of using it that avoids the problem of malformed UTF characters is to use a +lookahead to check the length of the next character, as in this pattern, which +could be used with a UTF-8 string (ignore white space and line breaks): +

+  (?| (?=[\x00-\x7f])(\C) |
+      (?=[\x80-\x{7ff}])(\C)(\C) |
+      (?=[\x{800}-\x{ffff}])(\C)(\C)(\C) |
+      (?=[\x{10000}-\x{1fffff}])(\C)(\C)(\C)(\C))
+
+A group that starts with (?| resets the capturing parentheses numbers in each +alternative (see +"Duplicate Subpattern Numbers" +below). The assertions at the start of each branch check the next UTF-8 +character for values whose encoding uses 1, 2, 3, or 4 bytes, respectively. The +character's individual bytes are then captured by the appropriate number of +groups. +

+
SQUARE BRACKETS AND CHARACTER CLASSES
+

+An opening square bracket introduces a character class, terminated by a closing +square bracket. A closing square bracket on its own is not special by default. +However, if the PCRE_JAVASCRIPT_COMPAT option is set, a lone closing square +bracket causes a compile-time error. If a closing square bracket is required as +a member of the class, it should be the first data character in the class +(after an initial circumflex, if present) or escaped with a backslash. +

+

+A character class matches a single character in the subject. In a UTF mode, the +character may be more than one data unit long. A matched character must be in +the set of characters defined by the class, unless the first character in the +class definition is a circumflex, in which case the subject character must not +be in the set defined by the class. If a circumflex is actually required as a +member of the class, ensure it is not the first character, or escape it with a +backslash. +

+

+For example, the character class [aeiou] matches any lower case vowel, while +[^aeiou] matches any character that is not a lower case vowel. Note that a +circumflex is just a convenient notation for specifying the characters that +are in the class by enumerating those that are not. A class that starts with a +circumflex is not an assertion; it still consumes a character from the subject +string, and therefore it fails if the current pointer is at the end of the +string. +

+

+In UTF-8 (UTF-16, UTF-32) mode, characters with values greater than 255 (0xffff) +can be included in a class as a literal string of data units, or by using the +\x{ escaping mechanism. +

+

+When caseless matching is set, any letters in a class represent both their +upper case and lower case versions, so for example, a caseless [aeiou] matches +"A" as well as "a", and a caseless [^aeiou] does not match "A", whereas a +caseful version would. In a UTF mode, PCRE always understands the concept of +case for characters whose values are less than 128, so caseless matching is +always possible. For characters with higher values, the concept of case is +supported if PCRE is compiled with Unicode property support, but not otherwise. +If you want to use caseless matching in a UTF mode for characters 128 and +above, you must ensure that PCRE is compiled with Unicode property support as +well as with UTF support. +

+

+Characters that might indicate line breaks are never treated in any special way +when matching character classes, whatever line-ending sequence is in use, and +whatever setting of the PCRE_DOTALL and PCRE_MULTILINE options is used. A class +such as [^a] always matches one of these characters. +

+

+The minus (hyphen) character can be used to specify a range of characters in a +character class. For example, [d-m] matches any letter between d and m, +inclusive. If a minus character is required in a class, it must be escaped with +a backslash or appear in a position where it cannot be interpreted as +indicating a range, typically as the first or last character in the class, or +immediately after a range. For example, [b-d-z] matches letters in the range b +to d, a hyphen character, or z. +

+

+It is not possible to have the literal character "]" as the end character of a +range. A pattern such as [W-]46] is interpreted as a class of two characters +("W" and "-") followed by a literal string "46]", so it would match "W46]" or +"-46]". However, if the "]" is escaped with a backslash it is interpreted as +the end of range, so [W-\]46] is interpreted as a class containing a range +followed by two other characters. The octal or hexadecimal representation of +"]" can also be used to end a range. +

+

+An error is generated if a POSIX character class (see below) or an escape +sequence other than one that defines a single character appears at a point +where a range ending character is expected. For example, [z-\xff] is valid, +but [A-\d] and [A-[:digit:]] are not. +

+

+Ranges operate in the collating sequence of character values. They can also be +used for characters specified numerically, for example [\000-\037]. Ranges +can include any characters that are valid for the current mode. +

+

+If a range that includes letters is used when caseless matching is set, it +matches the letters in either case. For example, [W-c] is equivalent to +[][\\^_`wxyzabc], matched caselessly, and in a non-UTF mode, if character +tables for a French locale are in use, [\xc8-\xcb] matches accented E +characters in both cases. In UTF modes, PCRE supports the concept of case for +characters with values greater than 128 only when it is compiled with Unicode +property support. +

+

+The character escape sequences \d, \D, \h, \H, \p, \P, \s, \S, \v, +\V, \w, and \W may appear in a character class, and add the characters that +they match to the class. For example, [\dABCDEF] matches any hexadecimal +digit. In UTF modes, the PCRE_UCP option affects the meanings of \d, \s, \w +and their upper case partners, just as it does when they appear outside a +character class, as described in the section entitled +"Generic character types" +above. The escape sequence \b has a different meaning inside a character +class; it matches the backspace character. The sequences \B, \N, \R, and \X +are not special inside a character class. Like any other unrecognized escape +sequences, they are treated as the literal characters "B", "N", "R", and "X" by +default, but cause an error if the PCRE_EXTRA option is set. +

+

+A circumflex can conveniently be used with the upper case character types to +specify a more restricted set of characters than the matching lower case type. +For example, the class [^\W_] matches any letter or digit, but not underscore, +whereas [\w] includes underscore. A positive character class should be read as +"something OR something OR ..." and a negative class as "NOT something AND NOT +something AND NOT ...". +

+

+The only metacharacters that are recognized in character classes are backslash, +hyphen (only where it can be interpreted as specifying a range), circumflex +(only at the start), opening square bracket (only when it can be interpreted as +introducing a POSIX class name, or for a special compatibility feature - see +the next two sections), and the terminating closing square bracket. However, +escaping other non-alphanumeric characters does no harm. +

+
POSIX CHARACTER CLASSES
+

+Perl supports the POSIX notation for character classes. This uses names +enclosed by [: and :] within the enclosing square brackets. PCRE also supports +this notation. For example, +

+  [01[:alpha:]%]
+
+matches "0", "1", any alphabetic character, or "%". The supported class names +are: +
+  alnum    letters and digits
+  alpha    letters
+  ascii    character codes 0 - 127
+  blank    space or tab only
+  cntrl    control characters
+  digit    decimal digits (same as \d)
+  graph    printing characters, excluding space
+  lower    lower case letters
+  print    printing characters, including space
+  punct    printing characters, excluding letters and digits and space
+  space    white space (the same as \s from PCRE 8.34)
+  upper    upper case letters
+  word     "word" characters (same as \w)
+  xdigit   hexadecimal digits
+
+The default "space" characters are HT (9), LF (10), VT (11), FF (12), CR (13), +and space (32). If locale-specific matching is taking place, the list of space +characters may be different; there may be fewer or more of them. "Space" used +to be different to \s, which did not include VT, for Perl compatibility. +However, Perl changed at release 5.18, and PCRE followed at release 8.34. +"Space" and \s now match the same set of characters. +

+

+The name "word" is a Perl extension, and "blank" is a GNU extension from Perl +5.8. Another Perl extension is negation, which is indicated by a ^ character +after the colon. For example, +

+  [12[:^digit:]]
+
+matches "1", "2", or any non-digit. PCRE (and Perl) also recognize the POSIX +syntax [.ch.] and [=ch=] where "ch" is a "collating element", but these are not +supported, and an error is given if they are encountered. +

+

+By default, characters with values greater than 128 do not match any of the +POSIX character classes. However, if the PCRE_UCP option is passed to +pcre_compile(), some of the classes are changed so that Unicode character +properties are used. This is achieved by replacing certain POSIX classes by +other sequences, as follows: +

+  [:alnum:]  becomes  \p{Xan}
+  [:alpha:]  becomes  \p{L}
+  [:blank:]  becomes  \h
+  [:digit:]  becomes  \p{Nd}
+  [:lower:]  becomes  \p{Ll}
+  [:space:]  becomes  \p{Xps}
+  [:upper:]  becomes  \p{Lu}
+  [:word:]   becomes  \p{Xwd}
+
+Negated versions, such as [:^alpha:] use \P instead of \p. Three other POSIX +classes are handled specially in UCP mode: +

+

+[:graph:] +This matches characters that have glyphs that mark the page when printed. In +Unicode property terms, it matches all characters with the L, M, N, P, S, or Cf +properties, except for: +

+  U+061C           Arabic Letter Mark
+  U+180E           Mongolian Vowel Separator
+  U+2066 - U+2069  Various "isolate"s
+
+
+

+

+[:print:] +This matches the same characters as [:graph:] plus space characters that are +not controls, that is, characters with the Zs property. +

+

+[:punct:] +This matches all characters that have the Unicode P (punctuation) property, +plus those characters whose code points are less than 128 that have the S +(Symbol) property. +

+

+The other POSIX classes are unchanged, and match only characters with code +points less than 128. +

+
COMPATIBILITY FEATURE FOR WORD BOUNDARIES
+

+In the POSIX.2 compliant library that was included in 4.4BSD Unix, the ugly +syntax [[:<:]] and [[:>:]] is used for matching "start of word" and "end of +word". PCRE treats these items as follows: +

+  [[:<:]]  is converted to  \b(?=\w)
+  [[:>:]]  is converted to  \b(?<=\w)
+
+Only these exact character sequences are recognized. A sequence such as +[a[:<:]b] provokes error for an unrecognized POSIX class name. This support is +not compatible with Perl. It is provided to help migrations from other +environments, and is best not used in any new patterns. Note that \b matches +at the start and the end of a word (see +"Simple assertions" +above), and in a Perl-style pattern the preceding or following character +normally shows which is wanted, without the need for the assertions that are +used above in order to give exactly the POSIX behaviour. +

+
VERTICAL BAR
+

+Vertical bar characters are used to separate alternative patterns. For example, +the pattern +

+  gilbert|sullivan
+
+matches either "gilbert" or "sullivan". Any number of alternatives may appear, +and an empty alternative is permitted (matching the empty string). The matching +process tries each alternative in turn, from left to right, and the first one +that succeeds is used. If the alternatives are within a subpattern +(defined below), +"succeeds" means matching the rest of the main pattern as well as the +alternative in the subpattern. +

+
INTERNAL OPTION SETTING
+

+The settings of the PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL, and +PCRE_EXTENDED options (which are Perl-compatible) can be changed from within +the pattern by a sequence of Perl option letters enclosed between "(?" and ")". +The option letters are +

+  i  for PCRE_CASELESS
+  m  for PCRE_MULTILINE
+  s  for PCRE_DOTALL
+  x  for PCRE_EXTENDED
+
+For example, (?im) sets caseless, multiline matching. It is also possible to +unset these options by preceding the letter with a hyphen, and a combined +setting and unsetting such as (?im-sx), which sets PCRE_CASELESS and +PCRE_MULTILINE while unsetting PCRE_DOTALL and PCRE_EXTENDED, is also +permitted. If a letter appears both before and after the hyphen, the option is +unset. +

+

+The PCRE-specific options PCRE_DUPNAMES, PCRE_UNGREEDY, and PCRE_EXTRA can be +changed in the same way as the Perl-compatible options by using the characters +J, U and X respectively. +

+

+When one of these option changes occurs at top level (that is, not inside +subpattern parentheses), the change applies to the remainder of the pattern +that follows. An option change within a subpattern (see below for a description +of subpatterns) affects only that part of the subpattern that follows it, so +

+  (a(?i)b)c
+
+matches abc and aBc and no other strings (assuming PCRE_CASELESS is not used). +By this means, options can be made to have different settings in different +parts of the pattern. Any changes made in one alternative do carry on +into subsequent branches within the same subpattern. For example, +
+  (a(?i)b|c)
+
+matches "ab", "aB", "c", and "C", even though when matching "C" the first +branch is abandoned before the option setting. This is because the effects of +option settings happen at compile time. There would be some very weird +behaviour otherwise. +

+

+Note: There are other PCRE-specific options that can be set by the +application when the compiling or matching functions are called. In some cases +the pattern can contain special leading sequences such as (*CRLF) to override +what the application has set or what has been defaulted. Details are given in +the section entitled +"Newline sequences" +above. There are also the (*UTF8), (*UTF16),(*UTF32), and (*UCP) leading +sequences that can be used to set UTF and Unicode property modes; they are +equivalent to setting the PCRE_UTF8, PCRE_UTF16, PCRE_UTF32 and the PCRE_UCP +options, respectively. The (*UTF) sequence is a generic version that can be +used with any of the libraries. However, the application can set the +PCRE_NEVER_UTF option, which locks out the use of the (*UTF) sequences. +

+
SUBPATTERNS
+

+Subpatterns are delimited by parentheses (round brackets), which can be nested. +Turning part of a pattern into a subpattern does two things: +
+
+1. It localizes a set of alternatives. For example, the pattern +

+  cat(aract|erpillar|)
+
+matches "cataract", "caterpillar", or "cat". Without the parentheses, it would +match "cataract", "erpillar" or an empty string. +
+
+2. It sets up the subpattern as a capturing subpattern. This means that, when +the whole pattern matches, that portion of the subject string that matched the +subpattern is passed back to the caller via the ovector argument of the +matching function. (This applies only to the traditional matching functions; +the DFA matching functions do not support capturing.) +

+

+Opening parentheses are counted from left to right (starting from 1) to obtain +numbers for the capturing subpatterns. For example, if the string "the red +king" is matched against the pattern +

+  the ((red|white) (king|queen))
+
+the captured substrings are "red king", "red", and "king", and are numbered 1, +2, and 3, respectively. +

+

+The fact that plain parentheses fulfil two functions is not always helpful. +There are often times when a grouping subpattern is required without a +capturing requirement. If an opening parenthesis is followed by a question mark +and a colon, the subpattern does not do any capturing, and is not counted when +computing the number of any subsequent capturing subpatterns. For example, if +the string "the white queen" is matched against the pattern +

+  the ((?:red|white) (king|queen))
+
+the captured substrings are "white queen" and "queen", and are numbered 1 and +2. The maximum number of capturing subpatterns is 65535. +

+

+As a convenient shorthand, if any option settings are required at the start of +a non-capturing subpattern, the option letters may appear between the "?" and +the ":". Thus the two patterns +

+  (?i:saturday|sunday)
+  (?:(?i)saturday|sunday)
+
+match exactly the same set of strings. Because alternative branches are tried +from left to right, and options are not reset until the end of the subpattern +is reached, an option setting in one branch does affect subsequent branches, so +the above patterns match "SUNDAY" as well as "Saturday". +

+
DUPLICATE SUBPATTERN NUMBERS
+

+Perl 5.10 introduced a feature whereby each alternative in a subpattern uses +the same numbers for its capturing parentheses. Such a subpattern starts with +(?| and is itself a non-capturing subpattern. For example, consider this +pattern: +

+  (?|(Sat)ur|(Sun))day
+
+Because the two alternatives are inside a (?| group, both sets of capturing +parentheses are numbered one. Thus, when the pattern matches, you can look +at captured substring number one, whichever alternative matched. This construct +is useful when you want to capture part, but not all, of one of a number of +alternatives. Inside a (?| group, parentheses are numbered as usual, but the +number is reset at the start of each branch. The numbers of any capturing +parentheses that follow the subpattern start after the highest number used in +any branch. The following example is taken from the Perl documentation. The +numbers underneath show in which buffer the captured content will be stored. +
+  # before  ---------------branch-reset----------- after
+  / ( a )  (?| x ( y ) z | (p (q) r) | (t) u (v) ) ( z ) /x
+  # 1            2         2  3        2     3     4
+
+A back reference to a numbered subpattern uses the most recent value that is +set for that number by any subpattern. The following pattern matches "abcabc" +or "defdef": +
+  /(?|(abc)|(def))\1/
+
+In contrast, a subroutine call to a numbered subpattern always refers to the +first one in the pattern with the given number. The following pattern matches +"abcabc" or "defabc": +
+  /(?|(abc)|(def))(?1)/
+
+If a +condition test +for a subpattern's having matched refers to a non-unique number, the test is +true if any of the subpatterns of that number have matched. +

+

+An alternative approach to using this "branch reset" feature is to use +duplicate named subpatterns, as described in the next section. +

+
NAMED SUBPATTERNS
+

+Identifying capturing parentheses by number is simple, but it can be very hard +to keep track of the numbers in complicated regular expressions. Furthermore, +if an expression is modified, the numbers may change. To help with this +difficulty, PCRE supports the naming of subpatterns. This feature was not +added to Perl until release 5.10. Python had the feature earlier, and PCRE +introduced it at release 4.0, using the Python syntax. PCRE now supports both +the Perl and the Python syntax. Perl allows identically numbered subpatterns to +have different names, but PCRE does not. +

+

+In PCRE, a subpattern can be named in one of three ways: (?<name>...) or +(?'name'...) as in Perl, or (?P<name>...) as in Python. References to capturing +parentheses from other parts of the pattern, such as +back references, +recursion, +and +conditions, +can be made by name as well as by number. +

+

+Names consist of up to 32 alphanumeric characters and underscores, but must +start with a non-digit. Named capturing parentheses are still allocated numbers +as well as names, exactly as if the names were not present. The PCRE API +provides function calls for extracting the name-to-number translation table +from a compiled pattern. There is also a convenience function for extracting a +captured substring by name. +

+

+By default, a name must be unique within a pattern, but it is possible to relax +this constraint by setting the PCRE_DUPNAMES option at compile time. (Duplicate +names are also always permitted for subpatterns with the same number, set up as +described in the previous section.) Duplicate names can be useful for patterns +where only one instance of the named parentheses can match. Suppose you want to +match the name of a weekday, either as a 3-letter abbreviation or as the full +name, and in both cases you want to extract the abbreviation. This pattern +(ignoring the line breaks) does the job: +

+  (?<DN>Mon|Fri|Sun)(?:day)?|
+  (?<DN>Tue)(?:sday)?|
+  (?<DN>Wed)(?:nesday)?|
+  (?<DN>Thu)(?:rsday)?|
+  (?<DN>Sat)(?:urday)?
+
+There are five capturing substrings, but only one is ever set after a match. +(An alternative way of solving this problem is to use a "branch reset" +subpattern, as described in the previous section.) +

+

+The convenience function for extracting the data by name returns the substring +for the first (and in this example, the only) subpattern of that name that +matched. This saves searching to find which numbered subpattern it was. +

+

+If you make a back reference to a non-unique named subpattern from elsewhere in +the pattern, the subpatterns to which the name refers are checked in the order +in which they appear in the overall pattern. The first one that is set is used +for the reference. For example, this pattern matches both "foofoo" and +"barbar" but not "foobar" or "barfoo": +

+  (?:(?<n>foo)|(?<n>bar))\k<n>
+
+
+

+

+If you make a subroutine call to a non-unique named subpattern, the one that +corresponds to the first occurrence of the name is used. In the absence of +duplicate numbers (see the previous section) this is the one with the lowest +number. +

+

+If you use a named reference in a condition +test (see the +section about conditions +below), either to check whether a subpattern has matched, or to check for +recursion, all subpatterns with the same name are tested. If the condition is +true for any one of them, the overall condition is true. This is the same +behaviour as testing by number. For further details of the interfaces for +handling named subpatterns, see the +pcreapi +documentation. +

+

+Warning: You cannot use different names to distinguish between two +subpatterns with the same number because PCRE uses only the numbers when +matching. For this reason, an error is given at compile time if different names +are given to subpatterns with the same number. However, you can always give the +same name to subpatterns with the same number, even when PCRE_DUPNAMES is not +set. +

+
REPETITION
+

+Repetition is specified by quantifiers, which can follow any of the following +items: +

+  a literal data character
+  the dot metacharacter
+  the \C escape sequence
+  the \X escape sequence
+  the \R escape sequence
+  an escape such as \d or \pL that matches a single character
+  a character class
+  a back reference (see next section)
+  a parenthesized subpattern (including assertions)
+  a subroutine call to a subpattern (recursive or otherwise)
+
+The general repetition quantifier specifies a minimum and maximum number of +permitted matches, by giving the two numbers in curly brackets (braces), +separated by a comma. The numbers must be less than 65536, and the first must +be less than or equal to the second. For example: +
+  z{2,4}
+
+matches "zz", "zzz", or "zzzz". A closing brace on its own is not a special +character. If the second number is omitted, but the comma is present, there is +no upper limit; if the second number and the comma are both omitted, the +quantifier specifies an exact number of required matches. Thus +
+  [aeiou]{3,}
+
+matches at least 3 successive vowels, but may match many more, while +
+  \d{8}
+
+matches exactly 8 digits. An opening curly bracket that appears in a position +where a quantifier is not allowed, or one that does not match the syntax of a +quantifier, is taken as a literal character. For example, {,6} is not a +quantifier, but a literal string of four characters. +

+

+In UTF modes, quantifiers apply to characters rather than to individual data +units. Thus, for example, \x{100}{2} matches two characters, each of +which is represented by a two-byte sequence in a UTF-8 string. Similarly, +\X{3} matches three Unicode extended grapheme clusters, each of which may be +several data units long (and they may be of different lengths). +

+

+The quantifier {0} is permitted, causing the expression to behave as if the +previous item and the quantifier were not present. This may be useful for +subpatterns that are referenced as +subroutines +from elsewhere in the pattern (but see also the section entitled +"Defining subpatterns for use by reference only" +below). Items other than subpatterns that have a {0} quantifier are omitted +from the compiled pattern. +

+

+For convenience, the three most common quantifiers have single-character +abbreviations: +

+  *    is equivalent to {0,}
+  +    is equivalent to {1,}
+  ?    is equivalent to {0,1}
+
+It is possible to construct infinite loops by following a subpattern that can +match no characters with a quantifier that has no upper limit, for example: +
+  (a?)*
+
+Earlier versions of Perl and PCRE used to give an error at compile time for +such patterns. However, because there are cases where this can be useful, such +patterns are now accepted, but if any repetition of the subpattern does in fact +match no characters, the loop is forcibly broken. +

+

+By default, the quantifiers are "greedy", that is, they match as much as +possible (up to the maximum number of permitted times), without causing the +rest of the pattern to fail. The classic example of where this gives problems +is in trying to match comments in C programs. These appear between /* and */ +and within the comment, individual * and / characters may appear. An attempt to +match C comments by applying the pattern +

+  /\*.*\*/
+
+to the string +
+  /* first comment */  not comment  /* second comment */
+
+fails, because it matches the entire string owing to the greediness of the .* +item. +

+

+However, if a quantifier is followed by a question mark, it ceases to be +greedy, and instead matches the minimum number of times possible, so the +pattern +

+  /\*.*?\*/
+
+does the right thing with the C comments. The meaning of the various +quantifiers is not otherwise changed, just the preferred number of matches. +Do not confuse this use of question mark with its use as a quantifier in its +own right. Because it has two uses, it can sometimes appear doubled, as in +
+  \d??\d
+
+which matches one digit by preference, but can match two if that is the only +way the rest of the pattern matches. +

+

+If the PCRE_UNGREEDY option is set (an option that is not available in Perl), +the quantifiers are not greedy by default, but individual ones can be made +greedy by following them with a question mark. In other words, it inverts the +default behaviour. +

+

+When a parenthesized subpattern is quantified with a minimum repeat count that +is greater than 1 or with a limited maximum, more memory is required for the +compiled pattern, in proportion to the size of the minimum or maximum. +

+

+If a pattern starts with .* or .{0,} and the PCRE_DOTALL option (equivalent +to Perl's /s) is set, thus allowing the dot to match newlines, the pattern is +implicitly anchored, because whatever follows will be tried against every +character position in the subject string, so there is no point in retrying the +overall match at any position after the first. PCRE normally treats such a +pattern as though it were preceded by \A. +

+

+In cases where it is known that the subject string contains no newlines, it is +worth setting PCRE_DOTALL in order to obtain this optimization, or +alternatively using ^ to indicate anchoring explicitly. +

+

+However, there are some cases where the optimization cannot be used. When .* +is inside capturing parentheses that are the subject of a back reference +elsewhere in the pattern, a match at the start may fail where a later one +succeeds. Consider, for example: +

+  (.*)abc\1
+
+If the subject is "xyz123abc123" the match point is the fourth character. For +this reason, such a pattern is not implicitly anchored. +

+

+Another case where implicit anchoring is not applied is when the leading .* is +inside an atomic group. Once again, a match at the start may fail where a later +one succeeds. Consider this pattern: +

+  (?>.*?a)b
+
+It matches "ab" in the subject "aab". The use of the backtracking control verbs +(*PRUNE) and (*SKIP) also disable this optimization. +

+

+When a capturing subpattern is repeated, the value captured is the substring +that matched the final iteration. For example, after +

+  (tweedle[dume]{3}\s*)+
+
+has matched "tweedledum tweedledee" the value of the captured substring is +"tweedledee". However, if there are nested capturing subpatterns, the +corresponding captured values may have been set in previous iterations. For +example, after +
+  /(a|(b))+/
+
+matches "aba" the value of the second captured substring is "b". +

+
ATOMIC GROUPING AND POSSESSIVE QUANTIFIERS
+

+With both maximizing ("greedy") and minimizing ("ungreedy" or "lazy") +repetition, failure of what follows normally causes the repeated item to be +re-evaluated to see if a different number of repeats allows the rest of the +pattern to match. Sometimes it is useful to prevent this, either to change the +nature of the match, or to cause it fail earlier than it otherwise might, when +the author of the pattern knows there is no point in carrying on. +

+

+Consider, for example, the pattern \d+foo when applied to the subject line +

+  123456bar
+
+After matching all 6 digits and then failing to match "foo", the normal +action of the matcher is to try again with only 5 digits matching the \d+ +item, and then with 4, and so on, before ultimately failing. "Atomic grouping" +(a term taken from Jeffrey Friedl's book) provides the means for specifying +that once a subpattern has matched, it is not to be re-evaluated in this way. +

+

+If we use atomic grouping for the previous example, the matcher gives up +immediately on failing to match "foo" the first time. The notation is a kind of +special parenthesis, starting with (?> as in this example: +

+  (?>\d+)foo
+
+This kind of parenthesis "locks up" the part of the pattern it contains once +it has matched, and a failure further into the pattern is prevented from +backtracking into it. Backtracking past it to previous items, however, works as +normal. +

+

+An alternative description is that a subpattern of this type matches the string +of characters that an identical standalone pattern would match, if anchored at +the current point in the subject string. +

+

+Atomic grouping subpatterns are not capturing subpatterns. Simple cases such as +the above example can be thought of as a maximizing repeat that must swallow +everything it can. So, while both \d+ and \d+? are prepared to adjust the +number of digits they match in order to make the rest of the pattern match, +(?>\d+) can only match an entire sequence of digits. +

+

+Atomic groups in general can of course contain arbitrarily complicated +subpatterns, and can be nested. However, when the subpattern for an atomic +group is just a single repeated item, as in the example above, a simpler +notation, called a "possessive quantifier" can be used. This consists of an +additional + character following a quantifier. Using this notation, the +previous example can be rewritten as +

+  \d++foo
+
+Note that a possessive quantifier can be used with an entire group, for +example: +
+  (abc|xyz){2,3}+
+
+Possessive quantifiers are always greedy; the setting of the PCRE_UNGREEDY +option is ignored. They are a convenient notation for the simpler forms of +atomic group. However, there is no difference in the meaning of a possessive +quantifier and the equivalent atomic group, though there may be a performance +difference; possessive quantifiers should be slightly faster. +

+

+The possessive quantifier syntax is an extension to the Perl 5.8 syntax. +Jeffrey Friedl originated the idea (and the name) in the first edition of his +book. Mike McCloskey liked it, so implemented it when he built Sun's Java +package, and PCRE copied it from there. It ultimately found its way into Perl +at release 5.10. +

+

+PCRE has an optimization that automatically "possessifies" certain simple +pattern constructs. For example, the sequence A+B is treated as A++B because +there is no point in backtracking into a sequence of A's when B must follow. +

+

+When a pattern contains an unlimited repeat inside a subpattern that can itself +be repeated an unlimited number of times, the use of an atomic group is the +only way to avoid some failing matches taking a very long time indeed. The +pattern +

+  (\D+|<\d+>)*[!?]
+
+matches an unlimited number of substrings that either consist of non-digits, or +digits enclosed in <>, followed by either ! or ?. When it matches, it runs +quickly. However, if it is applied to +
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+
+it takes a long time before reporting failure. This is because the string can +be divided between the internal \D+ repeat and the external * repeat in a +large number of ways, and all have to be tried. (The example uses [!?] rather +than a single character at the end, because both PCRE and Perl have an +optimization that allows for fast failure when a single character is used. They +remember the last single character that is required for a match, and fail early +if it is not present in the string.) If the pattern is changed so that it uses +an atomic group, like this: +
+  ((?>\D+)|<\d+>)*[!?]
+
+sequences of non-digits cannot be broken, and failure happens quickly. +

+
BACK REFERENCES
+

+Outside a character class, a backslash followed by a digit greater than 0 (and +possibly further digits) is a back reference to a capturing subpattern earlier +(that is, to its left) in the pattern, provided there have been that many +previous capturing left parentheses. +

+

+However, if the decimal number following the backslash is less than 10, it is +always taken as a back reference, and causes an error only if there are not +that many capturing left parentheses in the entire pattern. In other words, the +parentheses that are referenced need not be to the left of the reference for +numbers less than 10. A "forward back reference" of this type can make sense +when a repetition is involved and the subpattern to the right has participated +in an earlier iteration. +

+

+It is not possible to have a numerical "forward back reference" to a subpattern +whose number is 10 or more using this syntax because a sequence such as \50 is +interpreted as a character defined in octal. See the subsection entitled +"Non-printing characters" +above +for further details of the handling of digits following a backslash. There is +no such problem when named parentheses are used. A back reference to any +subpattern is possible using named parentheses (see below). +

+

+Another way of avoiding the ambiguity inherent in the use of digits following a +backslash is to use the \g escape sequence. This escape must be followed by an +unsigned number or a negative number, optionally enclosed in braces. These +examples are all identical: +

+  (ring), \1
+  (ring), \g1
+  (ring), \g{1}
+
+An unsigned number specifies an absolute reference without the ambiguity that +is present in the older syntax. It is also useful when literal digits follow +the reference. A negative number is a relative reference. Consider this +example: +
+  (abc(def)ghi)\g{-1}
+
+The sequence \g{-1} is a reference to the most recently started capturing +subpattern before \g, that is, is it equivalent to \2 in this example. +Similarly, \g{-2} would be equivalent to \1. The use of relative references +can be helpful in long patterns, and also in patterns that are created by +joining together fragments that contain references within themselves. +

+

+A back reference matches whatever actually matched the capturing subpattern in +the current subject string, rather than anything matching the subpattern +itself (see +"Subpatterns as subroutines" +below for a way of doing that). So the pattern +

+  (sens|respons)e and \1ibility
+
+matches "sense and sensibility" and "response and responsibility", but not +"sense and responsibility". If caseful matching is in force at the time of the +back reference, the case of letters is relevant. For example, +
+  ((?i)rah)\s+\1
+
+matches "rah rah" and "RAH RAH", but not "RAH rah", even though the original +capturing subpattern is matched caselessly. +

+

+There are several different ways of writing back references to named +subpatterns. The .NET syntax \k{name} and the Perl syntax \k<name> or +\k'name' are supported, as is the Python syntax (?P=name). Perl 5.10's unified +back reference syntax, in which \g can be used for both numeric and named +references, is also supported. We could rewrite the above example in any of +the following ways: +

+  (?<p1>(?i)rah)\s+\k<p1>
+  (?'p1'(?i)rah)\s+\k{p1}
+  (?P<p1>(?i)rah)\s+(?P=p1)
+  (?<p1>(?i)rah)\s+\g{p1}
+
+A subpattern that is referenced by name may appear in the pattern before or +after the reference. +

+

+There may be more than one back reference to the same subpattern. If a +subpattern has not actually been used in a particular match, any back +references to it always fail by default. For example, the pattern +

+  (a|(bc))\2
+
+always fails if it starts to match "a" rather than "bc". However, if the +PCRE_JAVASCRIPT_COMPAT option is set at compile time, a back reference to an +unset value matches an empty string. +

+

+Because there may be many capturing parentheses in a pattern, all digits +following a backslash are taken as part of a potential back reference number. +If the pattern continues with a digit character, some delimiter must be used to +terminate the back reference. If the PCRE_EXTENDED option is set, this can be +white space. Otherwise, the \g{ syntax or an empty comment (see +"Comments" +below) can be used. +

+
+Recursive back references +
+

+A back reference that occurs inside the parentheses to which it refers fails +when the subpattern is first used, so, for example, (a\1) never matches. +However, such references can be useful inside repeated subpatterns. For +example, the pattern +

+  (a|b\1)+
+
+matches any number of "a"s and also "aba", "ababbaa" etc. At each iteration of +the subpattern, the back reference matches the character string corresponding +to the previous iteration. In order for this to work, the pattern must be such +that the first iteration does not need to match the back reference. This can be +done using alternation, as in the example above, or by a quantifier with a +minimum of zero. +

+

+Back references of this type cause the group that they reference to be treated +as an +atomic group. +Once the whole group has been matched, a subsequent matching failure cannot +cause backtracking into the middle of the group. +

+
ASSERTIONS
+

+An assertion is a test on the characters following or preceding the current +matching point that does not actually consume any characters. The simple +assertions coded as \b, \B, \A, \G, \Z, \z, ^ and $ are described +above. +

+

+More complicated assertions are coded as subpatterns. There are two kinds: +those that look ahead of the current position in the subject string, and those +that look behind it. An assertion subpattern is matched in the normal way, +except that it does not cause the current matching position to be changed. +

+

+Assertion subpatterns are not capturing subpatterns. If such an assertion +contains capturing subpatterns within it, these are counted for the purposes of +numbering the capturing subpatterns in the whole pattern. However, substring +capturing is carried out only for positive assertions. (Perl sometimes, but not +always, does do capturing in negative assertions.) +

+

+WARNING: If a positive assertion containing one or more capturing subpatterns +succeeds, but failure to match later in the pattern causes backtracking over +this assertion, the captures within the assertion are reset only if no higher +numbered captures are already set. This is, unfortunately, a fundamental +limitation of the current implementation, and as PCRE1 is now in +maintenance-only status, it is unlikely ever to change. +

+

+For compatibility with Perl, assertion subpatterns may be repeated; though +it makes no sense to assert the same thing several times, the side effect of +capturing parentheses may occasionally be useful. In practice, there only three +cases: +
+
+(1) If the quantifier is {0}, the assertion is never obeyed during matching. +However, it may contain internal capturing parenthesized groups that are called +from elsewhere via the +subroutine mechanism. +
+
+(2) If quantifier is {0,n} where n is greater than zero, it is treated as if it +were {0,1}. At run time, the rest of the pattern match is tried with and +without the assertion, the order depending on the greediness of the quantifier. +
+
+(3) If the minimum repetition is greater than zero, the quantifier is ignored. +The assertion is obeyed just once when encountered during matching. +

+
+Lookahead assertions +
+

+Lookahead assertions start with (?= for positive assertions and (?! for +negative assertions. For example, +

+  \w+(?=;)
+
+matches a word followed by a semicolon, but does not include the semicolon in +the match, and +
+  foo(?!bar)
+
+matches any occurrence of "foo" that is not followed by "bar". Note that the +apparently similar pattern +
+  (?!foo)bar
+
+does not find an occurrence of "bar" that is preceded by something other than +"foo"; it finds any occurrence of "bar" whatsoever, because the assertion +(?!foo) is always true when the next three characters are "bar". A +lookbehind assertion is needed to achieve the other effect. +

+

+If you want to force a matching failure at some point in a pattern, the most +convenient way to do it is with (?!) because an empty string always matches, so +an assertion that requires there not to be an empty string must always fail. +The backtracking control verb (*FAIL) or (*F) is a synonym for (?!). +

+
+Lookbehind assertions +
+

+Lookbehind assertions start with (?<= for positive assertions and (?<! for +negative assertions. For example, +

+  (?<!foo)bar
+
+does find an occurrence of "bar" that is not preceded by "foo". The contents of +a lookbehind assertion are restricted such that all the strings it matches must +have a fixed length. However, if there are several top-level alternatives, they +do not all have to have the same fixed length. Thus +
+  (?<=bullock|donkey)
+
+is permitted, but +
+  (?<!dogs?|cats?)
+
+causes an error at compile time. Branches that match different length strings +are permitted only at the top level of a lookbehind assertion. This is an +extension compared with Perl, which requires all branches to match the same +length of string. An assertion such as +
+  (?<=ab(c|de))
+
+is not permitted, because its single top-level branch can match two different +lengths, but it is acceptable to PCRE if rewritten to use two top-level +branches: +
+  (?<=abc|abde)
+
+In some cases, the escape sequence \K +(see above) +can be used instead of a lookbehind assertion to get round the fixed-length +restriction. +

+

+The implementation of lookbehind assertions is, for each alternative, to +temporarily move the current position back by the fixed length and then try to +match. If there are insufficient characters before the current position, the +assertion fails. +

+

+In a UTF mode, PCRE does not allow the \C escape (which matches a single data +unit even in a UTF mode) to appear in lookbehind assertions, because it makes +it impossible to calculate the length of the lookbehind. The \X and \R +escapes, which can match different numbers of data units, are also not +permitted. +

+

+"Subroutine" +calls (see below) such as (?2) or (?&X) are permitted in lookbehinds, as long +as the subpattern matches a fixed-length string. +Recursion, +however, is not supported. +

+

+Possessive quantifiers can be used in conjunction with lookbehind assertions to +specify efficient matching of fixed-length strings at the end of subject +strings. Consider a simple pattern such as +

+  abcd$
+
+when applied to a long string that does not match. Because matching proceeds +from left to right, PCRE will look for each "a" in the subject and then see if +what follows matches the rest of the pattern. If the pattern is specified as +
+  ^.*abcd$
+
+the initial .* matches the entire string at first, but when this fails (because +there is no following "a"), it backtracks to match all but the last character, +then all but the last two characters, and so on. Once again the search for "a" +covers the entire string, from right to left, so we are no better off. However, +if the pattern is written as +
+  ^.*+(?<=abcd)
+
+there can be no backtracking for the .*+ item; it can match only the entire +string. The subsequent lookbehind assertion does a single test on the last four +characters. If it fails, the match fails immediately. For long strings, this +approach makes a significant difference to the processing time. +

+
+Using multiple assertions +
+

+Several assertions (of any sort) may occur in succession. For example, +

+  (?<=\d{3})(?<!999)foo
+
+matches "foo" preceded by three digits that are not "999". Notice that each of +the assertions is applied independently at the same point in the subject +string. First there is a check that the previous three characters are all +digits, and then there is a check that the same three characters are not "999". +This pattern does not match "foo" preceded by six characters, the first +of which are digits and the last three of which are not "999". For example, it +doesn't match "123abcfoo". A pattern to do that is +
+  (?<=\d{3}...)(?<!999)foo
+
+This time the first assertion looks at the preceding six characters, checking +that the first three are digits, and then the second assertion checks that the +preceding three characters are not "999". +

+

+Assertions can be nested in any combination. For example, +

+  (?<=(?<!foo)bar)baz
+
+matches an occurrence of "baz" that is preceded by "bar" which in turn is not +preceded by "foo", while +
+  (?<=\d{3}(?!999)...)foo
+
+is another pattern that matches "foo" preceded by three digits and any three +characters that are not "999". +

+
CONDITIONAL SUBPATTERNS
+

+It is possible to cause the matching process to obey a subpattern +conditionally or to choose between two alternative subpatterns, depending on +the result of an assertion, or whether a specific capturing subpattern has +already been matched. The two possible forms of conditional subpattern are: +

+  (?(condition)yes-pattern)
+  (?(condition)yes-pattern|no-pattern)
+
+If the condition is satisfied, the yes-pattern is used; otherwise the +no-pattern (if present) is used. If there are more than two alternatives in the +subpattern, a compile-time error occurs. Each of the two alternatives may +itself contain nested subpatterns of any form, including conditional +subpatterns; the restriction to two alternatives applies only at the level of +the condition. This pattern fragment is an example where the alternatives are +complex: +
+  (?(1) (A|B|C) | (D | (?(2)E|F) | E) )
+
+
+

+

+There are four kinds of condition: references to subpatterns, references to +recursion, a pseudo-condition called DEFINE, and assertions. +

+
+Checking for a used subpattern by number +
+

+If the text between the parentheses consists of a sequence of digits, the +condition is true if a capturing subpattern of that number has previously +matched. If there is more than one capturing subpattern with the same number +(see the earlier +section about duplicate subpattern numbers), +the condition is true if any of them have matched. An alternative notation is +to precede the digits with a plus or minus sign. In this case, the subpattern +number is relative rather than absolute. The most recently opened parentheses +can be referenced by (?(-1), the next most recent by (?(-2), and so on. Inside +loops it can also make sense to refer to subsequent groups. The next +parentheses to be opened can be referenced as (?(+1), and so on. (The value +zero in any of these forms is not used; it provokes a compile-time error.) +

+

+Consider the following pattern, which contains non-significant white space to +make it more readable (assume the PCRE_EXTENDED option) and to divide it into +three parts for ease of discussion: +

+  ( \( )?    [^()]+    (?(1) \) )
+
+The first part matches an optional opening parenthesis, and if that +character is present, sets it as the first captured substring. The second part +matches one or more characters that are not parentheses. The third part is a +conditional subpattern that tests whether or not the first set of parentheses +matched. If they did, that is, if subject started with an opening parenthesis, +the condition is true, and so the yes-pattern is executed and a closing +parenthesis is required. Otherwise, since no-pattern is not present, the +subpattern matches nothing. In other words, this pattern matches a sequence of +non-parentheses, optionally enclosed in parentheses. +

+

+If you were embedding this pattern in a larger one, you could use a relative +reference: +

+  ...other stuff... ( \( )?    [^()]+    (?(-1) \) ) ...
+
+This makes the fragment independent of the parentheses in the larger pattern. +

+
+Checking for a used subpattern by name +
+

+Perl uses the syntax (?(<name>)...) or (?('name')...) to test for a used +subpattern by name. For compatibility with earlier versions of PCRE, which had +this facility before Perl, the syntax (?(name)...) is also recognized. +

+

+Rewriting the above example to use a named subpattern gives this: +

+  (?<OPEN> \( )?    [^()]+    (?(<OPEN>) \) )
+
+If the name used in a condition of this kind is a duplicate, the test is +applied to all subpatterns of the same name, and is true if any one of them has +matched. +

+
+Checking for pattern recursion +
+

+If the condition is the string (R), and there is no subpattern with the name R, +the condition is true if a recursive call to the whole pattern or any +subpattern has been made. If digits or a name preceded by ampersand follow the +letter R, for example: +

+  (?(R3)...) or (?(R&name)...)
+
+the condition is true if the most recent recursion is into a subpattern whose +number or name is given. This condition does not check the entire recursion +stack. If the name used in a condition of this kind is a duplicate, the test is +applied to all subpatterns of the same name, and is true if any one of them is +the most recent recursion. +

+

+At "top level", all these recursion test conditions are false. +The syntax for recursive patterns +is described below. +

+
+Defining subpatterns for use by reference only +
+

+If the condition is the string (DEFINE), and there is no subpattern with the +name DEFINE, the condition is always false. In this case, there may be only one +alternative in the subpattern. It is always skipped if control reaches this +point in the pattern; the idea of DEFINE is that it can be used to define +subroutines that can be referenced from elsewhere. (The use of +subroutines +is described below.) For example, a pattern to match an IPv4 address such as +"192.168.23.245" could be written like this (ignore white space and line +breaks): +

+  (?(DEFINE) (?<byte> 2[0-4]\d | 25[0-5] | 1\d\d | [1-9]?\d) )
+  \b (?&byte) (\.(?&byte)){3} \b
+
+The first part of the pattern is a DEFINE group inside which a another group +named "byte" is defined. This matches an individual component of an IPv4 +address (a number less than 256). When matching takes place, this part of the +pattern is skipped because DEFINE acts like a false condition. The rest of the +pattern uses references to the named group to match the four dot-separated +components of an IPv4 address, insisting on a word boundary at each end. +

+
+Assertion conditions +
+

+If the condition is not in any of the above formats, it must be an assertion. +This may be a positive or negative lookahead or lookbehind assertion. Consider +this pattern, again containing non-significant white space, and with the two +alternatives on the second line: +

+  (?(?=[^a-z]*[a-z])
+  \d{2}-[a-z]{3}-\d{2}  |  \d{2}-\d{2}-\d{2} )
+
+The condition is a positive lookahead assertion that matches an optional +sequence of non-letters followed by a letter. In other words, it tests for the +presence of at least one letter in the subject. If a letter is found, the +subject is matched against the first alternative; otherwise it is matched +against the second. This pattern matches strings in one of the two forms +dd-aaa-dd or dd-dd-dd, where aaa are letters and dd are digits. +

+
COMMENTS
+

+There are two ways of including comments in patterns that are processed by +PCRE. In both cases, the start of the comment must not be in a character class, +nor in the middle of any other sequence of related characters such as (?: or a +subpattern name or number. The characters that make up a comment play no part +in the pattern matching. +

+

+The sequence (?# marks the start of a comment that continues up to the next +closing parenthesis. Nested parentheses are not permitted. If the PCRE_EXTENDED +option is set, an unescaped # character also introduces a comment, which in +this case continues to immediately after the next newline character or +character sequence in the pattern. Which characters are interpreted as newlines +is controlled by the options passed to a compiling function or by a special +sequence at the start of the pattern, as described in the section entitled +"Newline conventions" +above. Note that the end of this type of comment is a literal newline sequence +in the pattern; escape sequences that happen to represent a newline do not +count. For example, consider this pattern when PCRE_EXTENDED is set, and the +default newline convention is in force: +

+  abc #comment \n still comment
+
+On encountering the # character, pcre_compile() skips along, looking for +a newline in the pattern. The sequence \n is still literal at this stage, so +it does not terminate the comment. Only an actual character with the code value +0x0a (the default newline) does so. +

+
RECURSIVE PATTERNS
+

+Consider the problem of matching a string in parentheses, allowing for +unlimited nested parentheses. Without the use of recursion, the best that can +be done is to use a pattern that matches up to some fixed depth of nesting. It +is not possible to handle an arbitrary nesting depth. +

+

+For some time, Perl has provided a facility that allows regular expressions to +recurse (amongst other things). It does this by interpolating Perl code in the +expression at run time, and the code can refer to the expression itself. A Perl +pattern using code interpolation to solve the parentheses problem can be +created like this: +

+  $re = qr{\( (?: (?>[^()]+) | (?p{$re}) )* \)}x;
+
+The (?p{...}) item interpolates Perl code at run time, and in this case refers +recursively to the pattern in which it appears. +

+

+Obviously, PCRE cannot support the interpolation of Perl code. Instead, it +supports special syntax for recursion of the entire pattern, and also for +individual subpattern recursion. After its introduction in PCRE and Python, +this kind of recursion was subsequently introduced into Perl at release 5.10. +

+

+A special item that consists of (? followed by a number greater than zero and a +closing parenthesis is a recursive subroutine call of the subpattern of the +given number, provided that it occurs inside that subpattern. (If not, it is a +non-recursive subroutine +call, which is described in the next section.) The special item (?R) or (?0) is +a recursive call of the entire regular expression. +

+

+This PCRE pattern solves the nested parentheses problem (assume the +PCRE_EXTENDED option is set so that white space is ignored): +

+  \( ( [^()]++ | (?R) )* \)
+
+First it matches an opening parenthesis. Then it matches any number of +substrings which can either be a sequence of non-parentheses, or a recursive +match of the pattern itself (that is, a correctly parenthesized substring). +Finally there is a closing parenthesis. Note the use of a possessive quantifier +to avoid backtracking into sequences of non-parentheses. +

+

+If this were part of a larger pattern, you would not want to recurse the entire +pattern, so instead you could use this: +

+  ( \( ( [^()]++ | (?1) )* \) )
+
+We have put the pattern into parentheses, and caused the recursion to refer to +them instead of the whole pattern. +

+

+In a larger pattern, keeping track of parenthesis numbers can be tricky. This +is made easier by the use of relative references. Instead of (?1) in the +pattern above you can write (?-2) to refer to the second most recently opened +parentheses preceding the recursion. In other words, a negative number counts +capturing parentheses leftwards from the point at which it is encountered. +

+

+It is also possible to refer to subsequently opened parentheses, by writing +references such as (?+2). However, these cannot be recursive because the +reference is not inside the parentheses that are referenced. They are always +non-recursive subroutine +calls, as described in the next section. +

+

+An alternative approach is to use named parentheses instead. The Perl syntax +for this is (?&name); PCRE's earlier syntax (?P>name) is also supported. We +could rewrite the above example as follows: +

+  (?<pn> \( ( [^()]++ | (?&pn) )* \) )
+
+If there is more than one subpattern with the same name, the earliest one is +used. +

+

+This particular example pattern that we have been looking at contains nested +unlimited repeats, and so the use of a possessive quantifier for matching +strings of non-parentheses is important when applying the pattern to strings +that do not match. For example, when this pattern is applied to +

+  (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()
+
+it yields "no match" quickly. However, if a possessive quantifier is not used, +the match runs for a very long time indeed because there are so many different +ways the + and * repeats can carve up the subject, and all have to be tested +before failure can be reported. +

+

+At the end of a match, the values of capturing parentheses are those from +the outermost level. If you want to obtain intermediate values, a callout +function can be used (see below and the +pcrecallout +documentation). If the pattern above is matched against +

+  (ab(cd)ef)
+
+the value for the inner capturing parentheses (numbered 2) is "ef", which is +the last value taken on at the top level. If a capturing subpattern is not +matched at the top level, its final captured value is unset, even if it was +(temporarily) set at a deeper level during the matching process. +

+

+If there are more than 15 capturing parentheses in a pattern, PCRE has to +obtain extra memory to store data during a recursion, which it does by using +pcre_malloc, freeing it via pcre_free afterwards. If no memory can +be obtained, the match fails with the PCRE_ERROR_NOMEMORY error. +

+

+Do not confuse the (?R) item with the condition (R), which tests for recursion. +Consider this pattern, which matches text in angle brackets, allowing for +arbitrary nesting. Only digits are allowed in nested brackets (that is, when +recursing), whereas any characters are permitted at the outer level. +

+  < (?: (?(R) \d++  | [^<>]*+) | (?R)) * >
+
+In this pattern, (?(R) is the start of a conditional subpattern, with two +different alternatives for the recursive and non-recursive cases. The (?R) item +is the actual recursive call. +

+
+Differences in recursion processing between PCRE and Perl +
+

+Recursion processing in PCRE differs from Perl in two important ways. In PCRE +(like Python, but unlike Perl), a recursive subpattern call is always treated +as an atomic group. That is, once it has matched some of the subject string, it +is never re-entered, even if it contains untried alternatives and there is a +subsequent matching failure. This can be illustrated by the following pattern, +which purports to match a palindromic string that contains an odd number of +characters (for example, "a", "aba", "abcba", "abcdcba"): +

+  ^(.|(.)(?1)\2)$
+
+The idea is that it either matches a single character, or two identical +characters surrounding a sub-palindrome. In Perl, this pattern works; in PCRE +it does not if the pattern is longer than three characters. Consider the +subject string "abcba": +

+

+At the top level, the first character is matched, but as it is not at the end +of the string, the first alternative fails; the second alternative is taken +and the recursion kicks in. The recursive call to subpattern 1 successfully +matches the next character ("b"). (Note that the beginning and end of line +tests are not part of the recursion). +

+

+Back at the top level, the next character ("c") is compared with what +subpattern 2 matched, which was "a". This fails. Because the recursion is +treated as an atomic group, there are now no backtracking points, and so the +entire match fails. (Perl is able, at this point, to re-enter the recursion and +try the second alternative.) However, if the pattern is written with the +alternatives in the other order, things are different: +

+  ^((.)(?1)\2|.)$
+
+This time, the recursing alternative is tried first, and continues to recurse +until it runs out of characters, at which point the recursion fails. But this +time we do have another alternative to try at the higher level. That is the big +difference: in the previous case the remaining alternative is at a deeper +recursion level, which PCRE cannot use. +

+

+To change the pattern so that it matches all palindromic strings, not just +those with an odd number of characters, it is tempting to change the pattern to +this: +

+  ^((.)(?1)\2|.?)$
+
+Again, this works in Perl, but not in PCRE, and for the same reason. When a +deeper recursion has matched a single character, it cannot be entered again in +order to match an empty string. The solution is to separate the two cases, and +write out the odd and even cases as alternatives at the higher level: +
+  ^(?:((.)(?1)\2|)|((.)(?3)\4|.))
+
+If you want to match typical palindromic phrases, the pattern has to ignore all +non-word characters, which can be done like this: +
+  ^\W*+(?:((.)\W*+(?1)\W*+\2|)|((.)\W*+(?3)\W*+\4|\W*+.\W*+))\W*+$
+
+If run with the PCRE_CASELESS option, this pattern matches phrases such as "A +man, a plan, a canal: Panama!" and it works well in both PCRE and Perl. Note +the use of the possessive quantifier *+ to avoid backtracking into sequences of +non-word characters. Without this, PCRE takes a great deal longer (ten times or +more) to match typical phrases, and Perl takes so long that you think it has +gone into a loop. +

+

+WARNING: The palindrome-matching patterns above work only if the subject +string does not start with a palindrome that is shorter than the entire string. +For example, although "abcba" is correctly matched, if the subject is "ababa", +PCRE finds the palindrome "aba" at the start, then fails at top level because +the end of the string does not follow. Once again, it cannot jump back into the +recursion to try other alternatives, so the entire match fails. +

+

+The second way in which PCRE and Perl differ in their recursion processing is +in the handling of captured values. In Perl, when a subpattern is called +recursively or as a subpattern (see the next section), it has no access to any +values that were captured outside the recursion, whereas in PCRE these values +can be referenced. Consider this pattern: +

+  ^(.)(\1|a(?2))
+
+In PCRE, this pattern matches "bab". The first capturing parentheses match "b", +then in the second group, when the back reference \1 fails to match "b", the +second alternative matches "a" and then recurses. In the recursion, \1 does +now match "b" and so the whole match succeeds. In Perl, the pattern fails to +match because inside the recursive call \1 cannot access the externally set +value. +

+
SUBPATTERNS AS SUBROUTINES
+

+If the syntax for a recursive subpattern call (either by number or by +name) is used outside the parentheses to which it refers, it operates like a +subroutine in a programming language. The called subpattern may be defined +before or after the reference. A numbered reference can be absolute or +relative, as in these examples: +

+  (...(absolute)...)...(?2)...
+  (...(relative)...)...(?-1)...
+  (...(?+1)...(relative)...
+
+An earlier example pointed out that the pattern +
+  (sens|respons)e and \1ibility
+
+matches "sense and sensibility" and "response and responsibility", but not +"sense and responsibility". If instead the pattern +
+  (sens|respons)e and (?1)ibility
+
+is used, it does match "sense and responsibility" as well as the other two +strings. Another example is given in the discussion of DEFINE above. +

+

+All subroutine calls, whether recursive or not, are always treated as atomic +groups. That is, once a subroutine has matched some of the subject string, it +is never re-entered, even if it contains untried alternatives and there is a +subsequent matching failure. Any capturing parentheses that are set during the +subroutine call revert to their previous values afterwards. +

+

+Processing options such as case-independence are fixed when a subpattern is +defined, so if it is used as a subroutine, such options cannot be changed for +different calls. For example, consider this pattern: +

+  (abc)(?i:(?-1))
+
+It matches "abcabc". It does not match "abcABC" because the change of +processing option does not affect the called subpattern. +

+
ONIGURUMA SUBROUTINE SYNTAX
+

+For compatibility with Oniguruma, the non-Perl syntax \g followed by a name or +a number enclosed either in angle brackets or single quotes, is an alternative +syntax for referencing a subpattern as a subroutine, possibly recursively. Here +are two of the examples used above, rewritten using this syntax: +

+  (?<pn> \( ( (?>[^()]+) | \g<pn> )* \) )
+  (sens|respons)e and \g'1'ibility
+
+PCRE supports an extension to Oniguruma: if a number is preceded by a +plus or a minus sign it is taken as a relative reference. For example: +
+  (abc)(?i:\g<-1>)
+
+Note that \g{...} (Perl syntax) and \g<...> (Oniguruma syntax) are not +synonymous. The former is a back reference; the latter is a subroutine call. +

+
CALLOUTS
+

+Perl has a feature whereby using the sequence (?{...}) causes arbitrary Perl +code to be obeyed in the middle of matching a regular expression. This makes it +possible, amongst other things, to extract different substrings that match the +same pair of parentheses when there is a repetition. +

+

+PCRE provides a similar feature, but of course it cannot obey arbitrary Perl +code. The feature is called "callout". The caller of PCRE provides an external +function by putting its entry point in the global variable pcre_callout +(8-bit library) or pcre[16|32]_callout (16-bit or 32-bit library). +By default, this variable contains NULL, which disables all calling out. +

+

+Within a regular expression, (?C) indicates the points at which the external +function is to be called. If you want to identify different callout points, you +can put a number less than 256 after the letter C. The default value is zero. +For example, this pattern has two callout points: +

+  (?C1)abc(?C2)def
+
+If the PCRE_AUTO_CALLOUT flag is passed to a compiling function, callouts are +automatically installed before each item in the pattern. They are all numbered +255. If there is a conditional group in the pattern whose condition is an +assertion, an additional callout is inserted just before the condition. An +explicit callout may also be set at this position, as in this example: +
+  (?(?C9)(?=a)abc|def)
+
+Note that this applies only to assertion conditions, not to other types of +condition. +

+

+During matching, when PCRE reaches a callout point, the external function is +called. It is provided with the number of the callout, the position in the +pattern, and, optionally, one item of data originally supplied by the caller of +the matching function. The callout function may cause matching to proceed, to +backtrack, or to fail altogether. +

+

+By default, PCRE implements a number of optimizations at compile time and +matching time, and one side-effect is that sometimes callouts are skipped. If +you need all possible callouts to happen, you need to set options that disable +the relevant optimizations. More details, and a complete description of the +interface to the callout function, are given in the +pcrecallout +documentation. +

+
BACKTRACKING CONTROL
+

+Perl 5.10 introduced a number of "Special Backtracking Control Verbs", which +are still described in the Perl documentation as "experimental and subject to +change or removal in a future version of Perl". It goes on to say: "Their usage +in production code should be noted to avoid problems during upgrades." The same +remarks apply to the PCRE features described in this section. +

+

+The new verbs make use of what was previously invalid syntax: an opening +parenthesis followed by an asterisk. They are generally of the form +(*VERB) or (*VERB:NAME). Some may take either form, possibly behaving +differently depending on whether or not a name is present. A name is any +sequence of characters that does not include a closing parenthesis. The maximum +length of name is 255 in the 8-bit library and 65535 in the 16-bit and 32-bit +libraries. If the name is empty, that is, if the closing parenthesis +immediately follows the colon, the effect is as if the colon were not there. +Any number of these verbs may occur in a pattern. +

+

+Since these verbs are specifically related to backtracking, most of them can be +used only when the pattern is to be matched using one of the traditional +matching functions, because these use a backtracking algorithm. With the +exception of (*FAIL), which behaves like a failing negative assertion, the +backtracking control verbs cause an error if encountered by a DFA matching +function. +

+

+The behaviour of these verbs in +repeated groups, +assertions, +and in +subpatterns called as subroutines +(whether or not recursively) is documented below. +

+
+Optimizations that affect backtracking verbs +
+

+PCRE contains some optimizations that are used to speed up matching by running +some checks at the start of each match attempt. For example, it may know the +minimum length of matching subject, or that a particular character must be +present. When one of these optimizations bypasses the running of a match, any +included backtracking verbs will not, of course, be processed. You can suppress +the start-of-match optimizations by setting the PCRE_NO_START_OPTIMIZE option +when calling pcre_compile() or pcre_exec(), or by starting the +pattern with (*NO_START_OPT). There is more discussion of this option in the +section entitled +"Option bits for pcre_exec()" +in the +pcreapi +documentation. +

+

+Experiments with Perl suggest that it too has similar optimizations, sometimes +leading to anomalous results. +

+
+Verbs that act immediately +
+

+The following verbs act as soon as they are encountered. They may not be +followed by a name. +

+   (*ACCEPT)
+
+This verb causes the match to end successfully, skipping the remainder of the +pattern. However, when it is inside a subpattern that is called as a +subroutine, only that subpattern is ended successfully. Matching then continues +at the outer level. If (*ACCEPT) in triggered in a positive assertion, the +assertion succeeds; in a negative assertion, the assertion fails. +

+

+If (*ACCEPT) is inside capturing parentheses, the data so far is captured. For +example: +

+  A((?:A|B(*ACCEPT)|C)D)
+
+This matches "AB", "AAD", or "ACD"; when it matches "AB", "B" is captured by +the outer parentheses. +
+  (*FAIL) or (*F)
+
+This verb causes a matching failure, forcing backtracking to occur. It is +equivalent to (?!) but easier to read. The Perl documentation notes that it is +probably useful only when combined with (?{}) or (??{}). Those are, of course, +Perl features that are not present in PCRE. The nearest equivalent is the +callout feature, as for example in this pattern: +
+  a+(?C)(*FAIL)
+
+A match with the string "aaaa" always fails, but the callout is taken before +each backtrack happens (in this example, 10 times). +

+
+Recording which path was taken +
+

+There is one verb whose main purpose is to track how a match was arrived at, +though it also has a secondary use in conjunction with advancing the match +starting point (see (*SKIP) below). +

+  (*MARK:NAME) or (*:NAME)
+
+A name is always required with this verb. There may be as many instances of +(*MARK) as you like in a pattern, and their names do not have to be unique. +

+

+When a match succeeds, the name of the last-encountered (*MARK:NAME), +(*PRUNE:NAME), or (*THEN:NAME) on the matching path is passed back to the +caller as described in the section entitled +"Extra data for pcre_exec()" +in the +pcreapi +documentation. Here is an example of pcretest output, where the /K +modifier requests the retrieval and outputting of (*MARK) data: +

+    re> /X(*MARK:A)Y|X(*MARK:B)Z/K
+  data> XY
+   0: XY
+  MK: A
+  XZ
+   0: XZ
+  MK: B
+
+The (*MARK) name is tagged with "MK:" in this output, and in this example it +indicates which of the two alternatives matched. This is a more efficient way +of obtaining this information than putting each alternative in its own +capturing parentheses. +

+

+If a verb with a name is encountered in a positive assertion that is true, the +name is recorded and passed back if it is the last-encountered. This does not +happen for negative assertions or failing positive assertions. +

+

+After a partial match or a failed match, the last encountered name in the +entire match process is returned. For example: +

+    re> /X(*MARK:A)Y|X(*MARK:B)Z/K
+  data> XP
+  No match, mark = B
+
+Note that in this unanchored example the mark is retained from the match +attempt that started at the letter "X" in the subject. Subsequent match +attempts starting at "P" and then with an empty string do not get as far as the +(*MARK) item, but nevertheless do not reset it. +

+

+If you are interested in (*MARK) values after failed matches, you should +probably set the PCRE_NO_START_OPTIMIZE option +(see above) +to ensure that the match is always attempted. +

+
+Verbs that act after backtracking +
+

+The following verbs do nothing when they are encountered. Matching continues +with what follows, but if there is no subsequent match, causing a backtrack to +the verb, a failure is forced. That is, backtracking cannot pass to the left of +the verb. However, when one of these verbs appears inside an atomic group or an +assertion that is true, its effect is confined to that group, because once the +group has been matched, there is never any backtracking into it. In this +situation, backtracking can "jump back" to the left of the entire atomic group +or assertion. (Remember also, as stated above, that this localization also +applies in subroutine calls.) +

+

+These verbs differ in exactly what kind of failure occurs when backtracking +reaches them. The behaviour described below is what happens when the verb is +not in a subroutine or an assertion. Subsequent sections cover these special +cases. +

+  (*COMMIT)
+
+This verb, which may not be followed by a name, causes the whole match to fail +outright if there is a later matching failure that causes backtracking to reach +it. Even if the pattern is unanchored, no further attempts to find a match by +advancing the starting point take place. If (*COMMIT) is the only backtracking +verb that is encountered, once it has been passed pcre_exec() is +committed to finding a match at the current starting point, or not at all. For +example: +
+  a+(*COMMIT)b
+
+This matches "xxaab" but not "aacaab". It can be thought of as a kind of +dynamic anchor, or "I've started, so I must finish." The name of the most +recently passed (*MARK) in the path is passed back when (*COMMIT) forces a +match failure. +

+

+If there is more than one backtracking verb in a pattern, a different one that +follows (*COMMIT) may be triggered first, so merely passing (*COMMIT) during a +match does not always guarantee that a match must be at this starting point. +

+

+Note that (*COMMIT) at the start of a pattern is not the same as an anchor, +unless PCRE's start-of-match optimizations are turned off, as shown in this +output from pcretest: +

+    re> /(*COMMIT)abc/
+  data> xyzabc
+   0: abc
+  data> xyzabc\Y
+  No match
+
+For this pattern, PCRE knows that any match must start with "a", so the +optimization skips along the subject to "a" before applying the pattern to the +first set of data. The match attempt then succeeds. In the second set of data, +the escape sequence \Y is interpreted by the pcretest program. It causes +the PCRE_NO_START_OPTIMIZE option to be set when pcre_exec() is called. +This disables the optimization that skips along to the first character. The +pattern is now applied starting at "x", and so the (*COMMIT) causes the match +to fail without trying any other starting points. +
+  (*PRUNE) or (*PRUNE:NAME)
+
+This verb causes the match to fail at the current starting position in the +subject if there is a later matching failure that causes backtracking to reach +it. If the pattern is unanchored, the normal "bumpalong" advance to the next +starting character then happens. Backtracking can occur as usual to the left of +(*PRUNE), before it is reached, or when matching to the right of (*PRUNE), but +if there is no match to the right, backtracking cannot cross (*PRUNE). In +simple cases, the use of (*PRUNE) is just an alternative to an atomic group or +possessive quantifier, but there are some uses of (*PRUNE) that cannot be +expressed in any other way. In an anchored pattern (*PRUNE) has the same effect +as (*COMMIT). +

+

+The behaviour of (*PRUNE:NAME) is the not the same as (*MARK:NAME)(*PRUNE). +It is like (*MARK:NAME) in that the name is remembered for passing back to the +caller. However, (*SKIP:NAME) searches only for names set with (*MARK). +

+  (*SKIP)
+
+This verb, when given without a name, is like (*PRUNE), except that if the +pattern is unanchored, the "bumpalong" advance is not to the next character, +but to the position in the subject where (*SKIP) was encountered. (*SKIP) +signifies that whatever text was matched leading up to it cannot be part of a +successful match. Consider: +
+  a+(*SKIP)b
+
+If the subject is "aaaac...", after the first match attempt fails (starting at +the first character in the string), the starting point skips on to start the +next attempt at "c". Note that a possessive quantifer does not have the same +effect as this example; although it would suppress backtracking during the +first match attempt, the second attempt would start at the second character +instead of skipping on to "c". +
+  (*SKIP:NAME)
+
+When (*SKIP) has an associated name, its behaviour is modified. When it is +triggered, the previous path through the pattern is searched for the most +recent (*MARK) that has the same name. If one is found, the "bumpalong" advance +is to the subject position that corresponds to that (*MARK) instead of to where +(*SKIP) was encountered. If no (*MARK) with a matching name is found, the +(*SKIP) is ignored. +

+

+Note that (*SKIP:NAME) searches only for names set by (*MARK:NAME). It ignores +names that are set by (*PRUNE:NAME) or (*THEN:NAME). +

+  (*THEN) or (*THEN:NAME)
+
+This verb causes a skip to the next innermost alternative when backtracking +reaches it. That is, it cancels any further backtracking within the current +alternative. Its name comes from the observation that it can be used for a +pattern-based if-then-else block: +
+  ( COND1 (*THEN) FOO | COND2 (*THEN) BAR | COND3 (*THEN) BAZ ) ...
+
+If the COND1 pattern matches, FOO is tried (and possibly further items after +the end of the group if FOO succeeds); on failure, the matcher skips to the +second alternative and tries COND2, without backtracking into COND1. If that +succeeds and BAR fails, COND3 is tried. If subsequently BAZ fails, there are no +more alternatives, so there is a backtrack to whatever came before the entire +group. If (*THEN) is not inside an alternation, it acts like (*PRUNE). +

+

+The behaviour of (*THEN:NAME) is the not the same as (*MARK:NAME)(*THEN). +It is like (*MARK:NAME) in that the name is remembered for passing back to the +caller. However, (*SKIP:NAME) searches only for names set with (*MARK). +

+

+A subpattern that does not contain a | character is just a part of the +enclosing alternative; it is not a nested alternation with only one +alternative. The effect of (*THEN) extends beyond such a subpattern to the +enclosing alternative. Consider this pattern, where A, B, etc. are complex +pattern fragments that do not contain any | characters at this level: +

+  A (B(*THEN)C) | D
+
+If A and B are matched, but there is a failure in C, matching does not +backtrack into A; instead it moves to the next alternative, that is, D. +However, if the subpattern containing (*THEN) is given an alternative, it +behaves differently: +
+  A (B(*THEN)C | (*FAIL)) | D
+
+The effect of (*THEN) is now confined to the inner subpattern. After a failure +in C, matching moves to (*FAIL), which causes the whole subpattern to fail +because there are no more alternatives to try. In this case, matching does now +backtrack into A. +

+

+Note that a conditional subpattern is not considered as having two +alternatives, because only one is ever used. In other words, the | character in +a conditional subpattern has a different meaning. Ignoring white space, +consider: +

+  ^.*? (?(?=a) a | b(*THEN)c )
+
+If the subject is "ba", this pattern does not match. Because .*? is ungreedy, +it initially matches zero characters. The condition (?=a) then fails, the +character "b" is matched, but "c" is not. At this point, matching does not +backtrack to .*? as might perhaps be expected from the presence of the | +character. The conditional subpattern is part of the single alternative that +comprises the whole pattern, and so the match fails. (If there was a backtrack +into .*?, allowing it to match "b", the match would succeed.) +

+

+The verbs just described provide four different "strengths" of control when +subsequent matching fails. (*THEN) is the weakest, carrying on the match at the +next alternative. (*PRUNE) comes next, failing the match at the current +starting position, but allowing an advance to the next character (for an +unanchored pattern). (*SKIP) is similar, except that the advance may be more +than one character. (*COMMIT) is the strongest, causing the entire match to +fail. +

+
+More than one backtracking verb +
+

+If more than one backtracking verb is present in a pattern, the one that is +backtracked onto first acts. For example, consider this pattern, where A, B, +etc. are complex pattern fragments: +

+  (A(*COMMIT)B(*THEN)C|ABD)
+
+If A matches but B fails, the backtrack to (*COMMIT) causes the entire match to +fail. However, if A and B match, but C fails, the backtrack to (*THEN) causes +the next alternative (ABD) to be tried. This behaviour is consistent, but is +not always the same as Perl's. It means that if two or more backtracking verbs +appear in succession, all the the last of them has no effect. Consider this +example: +
+  ...(*COMMIT)(*PRUNE)...
+
+If there is a matching failure to the right, backtracking onto (*PRUNE) causes +it to be triggered, and its action is taken. There can never be a backtrack +onto (*COMMIT). +

+
+Backtracking verbs in repeated groups +
+

+PCRE differs from Perl in its handling of backtracking verbs in repeated +groups. For example, consider: +

+  /(a(*COMMIT)b)+ac/
+
+If the subject is "abac", Perl matches, but PCRE fails because the (*COMMIT) in +the second repeat of the group acts. +

+
+Backtracking verbs in assertions +
+

+(*FAIL) in an assertion has its normal effect: it forces an immediate backtrack. +

+

+(*ACCEPT) in a positive assertion causes the assertion to succeed without any +further processing. In a negative assertion, (*ACCEPT) causes the assertion to +fail without any further processing. +

+

+The other backtracking verbs are not treated specially if they appear in a +positive assertion. In particular, (*THEN) skips to the next alternative in the +innermost enclosing group that has alternations, whether or not this is within +the assertion. +

+

+Negative assertions are, however, different, in order to ensure that changing a +positive assertion into a negative assertion changes its result. Backtracking +into (*COMMIT), (*SKIP), or (*PRUNE) causes a negative assertion to be true, +without considering any further alternative branches in the assertion. +Backtracking into (*THEN) causes it to skip to the next enclosing alternative +within the assertion (the normal behaviour), but if the assertion does not have +such an alternative, (*THEN) behaves like (*PRUNE). +

+
+Backtracking verbs in subroutines +
+

+These behaviours occur whether or not the subpattern is called recursively. +Perl's treatment of subroutines is different in some cases. +

+

+(*FAIL) in a subpattern called as a subroutine has its normal effect: it forces +an immediate backtrack. +

+

+(*ACCEPT) in a subpattern called as a subroutine causes the subroutine match to +succeed without any further processing. Matching then continues after the +subroutine call. +

+

+(*COMMIT), (*SKIP), and (*PRUNE) in a subpattern called as a subroutine cause +the subroutine match to fail. +

+

+(*THEN) skips to the next alternative in the innermost enclosing group within +the subpattern that has alternatives. If there is no such group within the +subpattern, (*THEN) causes the subroutine match to fail. +

+
SEE ALSO
+

+pcreapi(3), pcrecallout(3), pcrematching(3), +pcresyntax(3), pcre(3), pcre16(3), pcre32(3). +

+
AUTHOR
+

+Philip Hazel +
+University Computing Service +
+Cambridge CB2 3QH, England. +
+

+
REVISION
+

+Last updated: 23 October 2016 +
+Copyright © 1997-2016 University of Cambridge. +
+

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcreperform.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcreperform.html new file mode 100755 index 000000000..dda207f90 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcreperform.html @@ -0,0 +1,195 @@ + + +pcreperform specification + + +

pcreperform man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+
+PCRE PERFORMANCE +
+

+Two aspects of performance are discussed below: memory usage and processing +time. The way you express your pattern as a regular expression can affect both +of them. +

+
+COMPILED PATTERN MEMORY USAGE +
+

+Patterns are compiled by PCRE into a reasonably efficient interpretive code, so +that most simple patterns do not use much memory. However, there is one case +where the memory usage of a compiled pattern can be unexpectedly large. If a +parenthesized subpattern has a quantifier with a minimum greater than 1 and/or +a limited maximum, the whole subpattern is repeated in the compiled code. For +example, the pattern +

+  (abc|def){2,4}
+
+is compiled as if it were +
+  (abc|def)(abc|def)((abc|def)(abc|def)?)?
+
+(Technical aside: It is done this way so that backtrack points within each of +the repetitions can be independently maintained.) +

+

+For regular expressions whose quantifiers use only small numbers, this is not +usually a problem. However, if the numbers are large, and particularly if such +repetitions are nested, the memory usage can become an embarrassment. For +example, the very simple pattern +

+  ((ab){1,1000}c){1,3}
+
+uses 51K bytes when compiled using the 8-bit library. When PCRE is compiled +with its default internal pointer size of two bytes, the size limit on a +compiled pattern is 64K data units, and this is reached with the above pattern +if the outer repetition is increased from 3 to 4. PCRE can be compiled to use +larger internal pointers and thus handle larger compiled patterns, but it is +better to try to rewrite your pattern to use less memory if you can. +

+

+One way of reducing the memory usage for such patterns is to make use of PCRE's +"subroutine" +facility. Re-writing the above pattern as +

+  ((ab)(?2){0,999}c)(?1){0,2}
+
+reduces the memory requirements to 18K, and indeed it remains under 20K even +with the outer repetition increased to 100. However, this pattern is not +exactly equivalent, because the "subroutine" calls are treated as +atomic groups +into which there can be no backtracking if there is a subsequent matching +failure. Therefore, PCRE cannot do this kind of rewriting automatically. +Furthermore, there is a noticeable loss of speed when executing the modified +pattern. Nevertheless, if the atomic grouping is not a problem and the loss of +speed is acceptable, this kind of rewriting will allow you to process patterns +that PCRE cannot otherwise handle. +

+
+STACK USAGE AT RUN TIME +
+

+When pcre_exec() or pcre[16|32]_exec() is used for matching, certain +kinds of pattern can cause it to use large amounts of the process stack. In +some environments the default process stack is quite small, and if it runs out +the result is often SIGSEGV. This issue is probably the most frequently raised +problem with PCRE. Rewriting your pattern can often help. The +pcrestack +documentation discusses this issue in detail. +

+
+PROCESSING TIME +
+

+Certain items in regular expression patterns are processed more efficiently +than others. It is more efficient to use a character class like [aeiou] than a +set of single-character alternatives such as (a|e|i|o|u). In general, the +simplest construction that provides the required behaviour is usually the most +efficient. Jeffrey Friedl's book contains a lot of useful general discussion +about optimizing regular expressions for efficient performance. This document +contains a few observations about PCRE. +

+

+Using Unicode character properties (the \p, \P, and \X escapes) is slow, +because PCRE has to use a multi-stage table lookup whenever it needs a +character's property. If you can find an alternative pattern that does not use +character properties, it will probably be faster. +

+

+By default, the escape sequences \b, \d, \s, and \w, and the POSIX +character classes such as [:alpha:] do not use Unicode properties, partly for +backwards compatibility, and partly for performance reasons. However, you can +set PCRE_UCP if you want Unicode character properties to be used. This can +double the matching time for items such as \d, when matched with +a traditional matching function; the performance loss is less with +a DFA matching function, and in both cases there is not much difference for +\b. +

+

+When a pattern begins with .* not in parentheses, or in parentheses that are +not the subject of a backreference, and the PCRE_DOTALL option is set, the +pattern is implicitly anchored by PCRE, since it can match only at the start of +a subject string. However, if PCRE_DOTALL is not set, PCRE cannot make this +optimization, because the . metacharacter does not then match a newline, and if +the subject string contains newlines, the pattern may match from the character +immediately following one of them instead of from the very start. For example, +the pattern +

+  .*second
+
+matches the subject "first\nand second" (where \n stands for a newline +character), with the match starting at the seventh character. In order to do +this, PCRE has to retry the match starting after every newline in the subject. +

+

+If you are using such a pattern with subject strings that do not contain +newlines, the best performance is obtained by setting PCRE_DOTALL, or starting +the pattern with ^.* or ^.*? to indicate explicit anchoring. That saves PCRE +from having to scan along the subject looking for a newline to restart at. +

+

+Beware of patterns that contain nested indefinite repeats. These can take a +long time to run when applied to a string that does not match. Consider the +pattern fragment +

+  ^(a+)*
+
+This can match "aaaa" in 16 different ways, and this number increases very +rapidly as the string gets longer. (The * repeat can match 0, 1, 2, 3, or 4 +times, and for each of those cases other than 0 or 4, the + repeats can match +different numbers of times.) When the remainder of the pattern is such that the +entire match is going to fail, PCRE has in principle to try every possible +variation, and this can take an extremely long time, even for relatively short +strings. +

+

+An optimization catches some of the more simple cases such as +

+  (a+)*b
+
+where a literal character follows. Before embarking on the standard matching +procedure, PCRE checks that there is a "b" later in the subject string, and if +there is not, it fails the match immediately. However, when there is no +following literal this optimization cannot be used. You can see the difference +by comparing the behaviour of +
+  (a+)*\d
+
+with the pattern above. The former gives a failure almost instantly when +applied to a whole line of "a" characters, whereas the latter takes an +appreciable time with strings longer than about 20 characters. +

+

+In many cases, the solution to this kind of performance issue is to use an +atomic group or a possessive quantifier. +

+
+AUTHOR +
+

+Philip Hazel +
+University Computing Service +
+Cambridge CB2 3QH, England. +
+

+
+REVISION +
+

+Last updated: 25 August 2012 +
+Copyright © 1997-2012 University of Cambridge. +
+

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcreposix.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcreposix.html new file mode 100755 index 000000000..18924cf7f --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcreposix.html @@ -0,0 +1,290 @@ + + +pcreposix specification + + +

pcreposix man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+

+
SYNOPSIS
+

+#include <pcreposix.h> +

+

+int regcomp(regex_t *preg, const char *pattern, + int cflags); +
+
+int regexec(regex_t *preg, const char *string, + size_t nmatch, regmatch_t pmatch[], int eflags); + size_t regerror(int errcode, const regex_t *preg, + char *errbuf, size_t errbuf_size); +
+
+void regfree(regex_t *preg); +

+
DESCRIPTION
+

+This set of functions provides a POSIX-style API for the PCRE regular +expression 8-bit library. See the +pcreapi +documentation for a description of PCRE's native API, which contains much +additional functionality. There is no POSIX-style wrapper for PCRE's 16-bit +and 32-bit library. +

+

+The functions described here are just wrapper functions that ultimately call +the PCRE native API. Their prototypes are defined in the pcreposix.h +header file, and on Unix systems the library itself is called +pcreposix.a, so can be accessed by adding -lpcreposix to the +command for linking an application that uses them. Because the POSIX functions +call the native ones, it is also necessary to add -lpcre. +

+

+I have implemented only those POSIX option bits that can be reasonably mapped +to PCRE native options. In addition, the option REG_EXTENDED is defined with +the value zero. This has no effect, but since programs that are written to the +POSIX interface often use it, this makes it easier to slot in PCRE as a +replacement library. Other POSIX options are not even defined. +

+

+There are also some other options that are not defined by POSIX. These have +been added at the request of users who want to make use of certain +PCRE-specific features via the POSIX calling interface. +

+

+When PCRE is called via these functions, it is only the API that is POSIX-like +in style. The syntax and semantics of the regular expressions themselves are +still those of Perl, subject to the setting of various PCRE options, as +described below. "POSIX-like in style" means that the API approximates to the +POSIX definition; it is not fully POSIX-compatible, and in multi-byte encoding +domains it is probably even less compatible. +

+

+The header for these functions is supplied as pcreposix.h to avoid any +potential clash with other POSIX libraries. It can, of course, be renamed or +aliased as regex.h, which is the "correct" name. It provides two +structure types, regex_t for compiled internal forms, and +regmatch_t for returning captured substrings. It also defines some +constants whose names start with "REG_"; these are used for setting options and +identifying error codes. +

+
COMPILING A PATTERN
+

+The function regcomp() is called to compile a pattern into an +internal form. The pattern is a C string terminated by a binary zero, and +is passed in the argument pattern. The preg argument is a pointer +to a regex_t structure that is used as a base for storing information +about the compiled regular expression. +

+

+The argument cflags is either zero, or contains one or more of the bits +defined by the following macros: +

+  REG_DOTALL
+
+The PCRE_DOTALL option is set when the regular expression is passed for +compilation to the native function. Note that REG_DOTALL is not part of the +POSIX standard. +
+  REG_ICASE
+
+The PCRE_CASELESS option is set when the regular expression is passed for +compilation to the native function. +
+  REG_NEWLINE
+
+The PCRE_MULTILINE option is set when the regular expression is passed for +compilation to the native function. Note that this does not mimic the +defined POSIX behaviour for REG_NEWLINE (see the following section). +
+  REG_NOSUB
+
+The PCRE_NO_AUTO_CAPTURE option is set when the regular expression is passed +for compilation to the native function. In addition, when a pattern that is +compiled with this flag is passed to regexec() for matching, the +nmatch and pmatch arguments are ignored, and no captured strings +are returned. +
+  REG_UCP
+
+The PCRE_UCP option is set when the regular expression is passed for +compilation to the native function. This causes PCRE to use Unicode properties +when matchine \d, \w, etc., instead of just recognizing ASCII values. Note +that REG_UTF8 is not part of the POSIX standard. +
+  REG_UNGREEDY
+
+The PCRE_UNGREEDY option is set when the regular expression is passed for +compilation to the native function. Note that REG_UNGREEDY is not part of the +POSIX standard. +
+  REG_UTF8
+
+The PCRE_UTF8 option is set when the regular expression is passed for +compilation to the native function. This causes the pattern itself and all data +strings used for matching it to be treated as UTF-8 strings. Note that REG_UTF8 +is not part of the POSIX standard. +

+

+In the absence of these flags, no options are passed to the native function. +This means the the regex is compiled with PCRE default semantics. In +particular, the way it handles newline characters in the subject string is the +Perl way, not the POSIX way. Note that setting PCRE_MULTILINE has only +some of the effects specified for REG_NEWLINE. It does not affect the way +newlines are matched by . (they are not) or by a negative class such as [^a] +(they are). +

+

+The yield of regcomp() is zero on success, and non-zero otherwise. The +preg structure is filled in on success, and one member of the structure +is public: re_nsub contains the number of capturing subpatterns in +the regular expression. Various error codes are defined in the header file. +

+

+NOTE: If the yield of regcomp() is non-zero, you must not attempt to +use the contents of the preg structure. If, for example, you pass it to +regexec(), the result is undefined and your program is likely to crash. +

+
MATCHING NEWLINE CHARACTERS
+

+This area is not simple, because POSIX and Perl take different views of things. +It is not possible to get PCRE to obey POSIX semantics, but then PCRE was never +intended to be a POSIX engine. The following table lists the different +possibilities for matching newline characters in PCRE: +

+                          Default   Change with
+
+  . matches newline          no     PCRE_DOTALL
+  newline matches [^a]       yes    not changeable
+  $ matches \n at end        yes    PCRE_DOLLARENDONLY
+  $ matches \n in middle     no     PCRE_MULTILINE
+  ^ matches \n in middle     no     PCRE_MULTILINE
+
+This is the equivalent table for POSIX: +
+                          Default   Change with
+
+  . matches newline          yes    REG_NEWLINE
+  newline matches [^a]       yes    REG_NEWLINE
+  $ matches \n at end        no     REG_NEWLINE
+  $ matches \n in middle     no     REG_NEWLINE
+  ^ matches \n in middle     no     REG_NEWLINE
+
+PCRE's behaviour is the same as Perl's, except that there is no equivalent for +PCRE_DOLLAR_ENDONLY in Perl. In both PCRE and Perl, there is no way to stop +newline from matching [^a]. +

+

+The default POSIX newline handling can be obtained by setting PCRE_DOTALL and +PCRE_DOLLAR_ENDONLY, but there is no way to make PCRE behave exactly as for the +REG_NEWLINE action. +

+
MATCHING A PATTERN
+

+The function regexec() is called to match a compiled pattern preg +against a given string, which is by default terminated by a zero byte +(but see REG_STARTEND below), subject to the options in eflags. These can +be: +

+  REG_NOTBOL
+
+The PCRE_NOTBOL option is set when calling the underlying PCRE matching +function. +
+  REG_NOTEMPTY
+
+The PCRE_NOTEMPTY option is set when calling the underlying PCRE matching +function. Note that REG_NOTEMPTY is not part of the POSIX standard. However, +setting this option can give more POSIX-like behaviour in some situations. +
+  REG_NOTEOL
+
+The PCRE_NOTEOL option is set when calling the underlying PCRE matching +function. +
+  REG_STARTEND
+
+The string is considered to start at string + pmatch[0].rm_so and +to have a terminating NUL located at string + pmatch[0].rm_eo +(there need not actually be a NUL at that location), regardless of the value of +nmatch. This is a BSD extension, compatible with but not specified by +IEEE Standard 1003.2 (POSIX.2), and should be used with caution in software +intended to be portable to other systems. Note that a non-zero rm_so does +not imply REG_NOTBOL; REG_STARTEND affects only the location of the string, not +how it is matched. +

+

+If the pattern was compiled with the REG_NOSUB flag, no data about any matched +strings is returned. The nmatch and pmatch arguments of +regexec() are ignored. +

+

+If the value of nmatch is zero, or if the value pmatch is NULL, +no data about any matched strings is returned. +

+

+Otherwise,the portion of the string that was matched, and also any captured +substrings, are returned via the pmatch argument, which points to an +array of nmatch structures of type regmatch_t, containing the +members rm_so and rm_eo. These contain the offset to the first +character of each substring and the offset to the first character after the end +of each substring, respectively. The 0th element of the vector relates to the +entire portion of string that was matched; subsequent elements relate to +the capturing subpatterns of the regular expression. Unused entries in the +array have both structure members set to -1. +

+

+A successful match yields a zero return; various error codes are defined in the +header file, of which REG_NOMATCH is the "expected" failure code. +

+
ERROR MESSAGES
+

+The regerror() function maps a non-zero errorcode from either +regcomp() or regexec() to a printable message. If preg is not +NULL, the error should have arisen from the use of that structure. A message +terminated by a binary zero is placed in errbuf. The length of the +message, including the zero, is limited to errbuf_size. The yield of the +function is the size of buffer needed to hold the whole message. +

+
MEMORY USAGE
+

+Compiling a regular expression causes memory to be allocated and associated +with the preg structure. The function regfree() frees all such +memory, after which preg may no longer be used as a compiled expression. +

+
AUTHOR
+

+Philip Hazel +
+University Computing Service +
+Cambridge CB2 3QH, England. +
+

+
REVISION
+

+Last updated: 09 January 2012 +
+Copyright © 1997-2012 University of Cambridge. +
+

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcreprecompile.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcreprecompile.html new file mode 100755 index 000000000..decb1d6ce --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcreprecompile.html @@ -0,0 +1,163 @@ + + +pcreprecompile specification + + +

pcreprecompile man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+

+
SAVING AND RE-USING PRECOMPILED PCRE PATTERNS
+

+If you are running an application that uses a large number of regular +expression patterns, it may be useful to store them in a precompiled form +instead of having to compile them every time the application is run. +If you are not using any private character tables (see the +pcre_maketables() +documentation), this is relatively straightforward. If you are using private +tables, it is a little bit more complicated. However, if you are using the +just-in-time optimization feature, it is not possible to save and reload the +JIT data. +

+

+If you save compiled patterns to a file, you can copy them to a different host +and run them there. If the two hosts have different endianness (byte order), +you should run the pcre[16|32]_pattern_to_host_byte_order() function on the +new host before trying to match the pattern. The matching functions return +PCRE_ERROR_BADENDIANNESS if they detect a pattern with the wrong endianness. +

+

+Compiling regular expressions with one version of PCRE for use with a different +version is not guaranteed to work and may cause crashes, and saving and +restoring a compiled pattern loses any JIT optimization data. +

+
SAVING A COMPILED PATTERN
+

+The value returned by pcre[16|32]_compile() points to a single block of +memory that holds the compiled pattern and associated data. You can find the +length of this block in bytes by calling pcre[16|32]_fullinfo() with an +argument of PCRE_INFO_SIZE. You can then save the data in any appropriate +manner. Here is sample code for the 8-bit library that compiles a pattern and +writes it to a file. It assumes that the variable fd refers to a file +that is open for output: +

+  int erroroffset, rc, size;
+  char *error;
+  pcre *re;
+
+  re = pcre_compile("my pattern", 0, &error, &erroroffset, NULL);
+  if (re == NULL) { ... handle errors ... }
+  rc = pcre_fullinfo(re, NULL, PCRE_INFO_SIZE, &size);
+  if (rc < 0) { ... handle errors ... }
+  rc = fwrite(re, 1, size, fd);
+  if (rc != size) { ... handle errors ... }
+
+In this example, the bytes that comprise the compiled pattern are copied +exactly. Note that this is binary data that may contain any of the 256 possible +byte values. On systems that make a distinction between binary and non-binary +data, be sure that the file is opened for binary output. +

+

+If you want to write more than one pattern to a file, you will have to devise a +way of separating them. For binary data, preceding each pattern with its length +is probably the most straightforward approach. Another possibility is to write +out the data in hexadecimal instead of binary, one pattern to a line. +

+

+Saving compiled patterns in a file is only one possible way of storing them for +later use. They could equally well be saved in a database, or in the memory of +some daemon process that passes them via sockets to the processes that want +them. +

+

+If the pattern has been studied, it is also possible to save the normal study +data in a similar way to the compiled pattern itself. However, if the +PCRE_STUDY_JIT_COMPILE was used, the just-in-time data that is created cannot +be saved because it is too dependent on the current environment. When studying +generates additional information, pcre[16|32]_study() returns a pointer to a +pcre[16|32]_extra data block. Its format is defined in the +section on matching a pattern +in the +pcreapi +documentation. The study_data field points to the binary study data, and +this is what you must save (not the pcre[16|32]_extra block itself). The +length of the study data can be obtained by calling pcre[16|32]_fullinfo() +with an argument of PCRE_INFO_STUDYSIZE. Remember to check that +pcre[16|32]_study() did return a non-NULL value before trying to save the +study data. +

+
RE-USING A PRECOMPILED PATTERN
+

+Re-using a precompiled pattern is straightforward. Having reloaded it into main +memory, called pcre[16|32]_pattern_to_host_byte_order() if necessary, you +pass its pointer to pcre[16|32]_exec() or pcre[16|32]_dfa_exec() in +the usual way. +

+

+However, if you passed a pointer to custom character tables when the pattern +was compiled (the tableptr argument of pcre[16|32]_compile()), you +must now pass a similar pointer to pcre[16|32]_exec() or +pcre[16|32]_dfa_exec(), because the value saved with the compiled pattern +will obviously be nonsense. A field in a pcre[16|32]_extra() block is used +to pass this data, as described in the +section on matching a pattern +in the +pcreapi +documentation. +

+

+Warning: The tables that pcre_exec() and pcre_dfa_exec() use +must be the same as those that were used when the pattern was compiled. If this +is not the case, the behaviour is undefined. +

+

+If you did not provide custom character tables when the pattern was compiled, +the pointer in the compiled pattern is NULL, which causes the matching +functions to use PCRE's internal tables. Thus, you do not need to take any +special action at run time in this case. +

+

+If you saved study data with the compiled pattern, you need to create your own +pcre[16|32]_extra data block and set the study_data field to point +to the reloaded study data. You must also set the PCRE_EXTRA_STUDY_DATA bit in +the flags field to indicate that study data is present. Then pass the +pcre[16|32]_extra block to the matching function in the usual way. If the +pattern was studied for just-in-time optimization, that data cannot be saved, +and so is lost by a save/restore cycle. +

+
COMPATIBILITY WITH DIFFERENT PCRE RELEASES
+

+In general, it is safest to recompile all saved patterns when you update to a +new PCRE release, though not all updates actually require this. +

+
AUTHOR
+

+Philip Hazel +
+University Computing Service +
+Cambridge CB2 3QH, England. +
+

+
REVISION
+

+Last updated: 12 November 2013 +
+Copyright © 1997-2013 University of Cambridge. +
+

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcresample.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcresample.html new file mode 100755 index 000000000..aca9184e0 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcresample.html @@ -0,0 +1,110 @@ + + +pcresample specification + + +

pcresample man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+
+PCRE SAMPLE PROGRAM +
+

+A simple, complete demonstration program, to get you started with using PCRE, +is supplied in the file pcredemo.c in the PCRE distribution. A listing of +this program is given in the +pcredemo +documentation. If you do not have a copy of the PCRE distribution, you can save +this listing to re-create pcredemo.c. +

+

+The demonstration program, which uses the original PCRE 8-bit library, compiles +the regular expression that is its first argument, and matches it against the +subject string in its second argument. No PCRE options are set, and default +character tables are used. If matching succeeds, the program outputs the +portion of the subject that matched, together with the contents of any captured +substrings. +

+

+If the -g option is given on the command line, the program then goes on to +check for further matches of the same regular expression in the same subject +string. The logic is a little bit tricky because of the possibility of matching +an empty string. Comments in the code explain what is going on. +

+

+If PCRE is installed in the standard include and library directories for your +operating system, you should be able to compile the demonstration program using +this command: +

+  gcc -o pcredemo pcredemo.c -lpcre
+
+If PCRE is installed elsewhere, you may need to add additional options to the +command line. For example, on a Unix-like system that has PCRE installed in +/usr/local, you can compile the demonstration program using a command +like this: +
+  gcc -o pcredemo -I/usr/local/include pcredemo.c -L/usr/local/lib -lpcre
+
+In a Windows environment, if you want to statically link the program against a +non-dll pcre.a file, you must uncomment the line that defines PCRE_STATIC +before including pcre.h, because otherwise the pcre_malloc() and +pcre_free() exported functions will be declared +__declspec(dllimport), with unwanted results. +

+

+Once you have compiled and linked the demonstration program, you can run simple +tests like this: +

+  ./pcredemo 'cat|dog' 'the cat sat on the mat'
+  ./pcredemo -g 'cat|dog' 'the dog sat on the cat'
+
+Note that there is a much more comprehensive test program, called +pcretest, +which supports many more facilities for testing regular expressions and both +PCRE libraries. The +pcredemo +program is provided as a simple coding example. +

+

+If you try to run +pcredemo +when PCRE is not installed in the standard library directory, you may get an +error like this on some operating systems (e.g. Solaris): +

+  ld.so.1: a.out: fatal: libpcre.so.0: open failed: No such file or directory
+
+This is caused by the way shared library support works on those systems. You +need to add +
+  -R/usr/local/lib
+
+(for example) to the compile command to get round this problem. +

+
+AUTHOR +
+

+Philip Hazel +
+University Computing Service +
+Cambridge CB2 3QH, England. +
+

+
+REVISION +
+

+Last updated: 10 January 2012 +
+Copyright © 1997-2012 University of Cambridge. +
+

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcrestack.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcrestack.html new file mode 100755 index 000000000..af6406d07 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcrestack.html @@ -0,0 +1,225 @@ + + +pcrestack specification + + +

pcrestack man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+
+PCRE DISCUSSION OF STACK USAGE +
+

+When you call pcre[16|32]_exec(), it makes use of an internal function +called match(). This calls itself recursively at branch points in the +pattern, in order to remember the state of the match so that it can back up and +try a different alternative if the first one fails. As matching proceeds deeper +and deeper into the tree of possibilities, the recursion depth increases. The +match() function is also called in other circumstances, for example, +whenever a parenthesized sub-pattern is entered, and in certain cases of +repetition. +

+

+Not all calls of match() increase the recursion depth; for an item such +as a* it may be called several times at the same level, after matching +different numbers of a's. Furthermore, in a number of cases where the result of +the recursive call would immediately be passed back as the result of the +current call (a "tail recursion"), the function is just restarted instead. +

+

+The above comments apply when pcre[16|32]_exec() is run in its normal +interpretive manner. If the pattern was studied with the +PCRE_STUDY_JIT_COMPILE option, and just-in-time compiling was successful, and +the options passed to pcre[16|32]_exec() were not incompatible, the matching +process uses the JIT-compiled code instead of the match() function. In +this case, the memory requirements are handled entirely differently. See the +pcrejit +documentation for details. +

+

+The pcre[16|32]_dfa_exec() function operates in an entirely different way, +and uses recursion only when there is a regular expression recursion or +subroutine call in the pattern. This includes the processing of assertion and +"once-only" subpatterns, which are handled like subroutine calls. Normally, +these are never very deep, and the limit on the complexity of +pcre[16|32]_dfa_exec() is controlled by the amount of workspace it is given. +However, it is possible to write patterns with runaway infinite recursions; +such patterns will cause pcre[16|32]_dfa_exec() to run out of stack. At +present, there is no protection against this. +

+

+The comments that follow do NOT apply to pcre[16|32]_dfa_exec(); they are +relevant only for pcre[16|32]_exec() without the JIT optimization. +

+
+Reducing pcre[16|32]_exec()'s stack usage +
+

+Each time that match() is actually called recursively, it uses memory +from the process stack. For certain kinds of pattern and data, very large +amounts of stack may be needed, despite the recognition of "tail recursion". +You can often reduce the amount of recursion, and therefore the amount of stack +used, by modifying the pattern that is being matched. Consider, for example, +this pattern: +

+  ([^<]|<(?!inet))+
+
+It matches from wherever it starts until it encounters "<inet" or the end of +the data, and is the kind of pattern that might be used when processing an XML +file. Each iteration of the outer parentheses matches either one character that +is not "<" or a "<" that is not followed by "inet". However, each time a +parenthesis is processed, a recursion occurs, so this formulation uses a stack +frame for each matched character. For a long string, a lot of stack is +required. Consider now this rewritten pattern, which matches exactly the same +strings: +
+  ([^<]++|<(?!inet))+
+
+This uses very much less stack, because runs of characters that do not contain +"<" are "swallowed" in one item inside the parentheses. Recursion happens only +when a "<" character that is not followed by "inet" is encountered (and we +assume this is relatively rare). A possessive quantifier is used to stop any +backtracking into the runs of non-"<" characters, but that is not related to +stack usage. +

+

+This example shows that one way of avoiding stack problems when matching long +subject strings is to write repeated parenthesized subpatterns to match more +than one character whenever possible. +

+
+Compiling PCRE to use heap instead of stack for pcre[16|32]_exec() +
+

+In environments where stack memory is constrained, you might want to compile +PCRE to use heap memory instead of stack for remembering back-up points when +pcre[16|32]_exec() is running. This makes it run a lot more slowly, however. +Details of how to do this are given in the +pcrebuild +documentation. When built in this way, instead of using the stack, PCRE obtains +and frees memory by calling the functions that are pointed to by the +pcre[16|32]_stack_malloc and pcre[16|32]_stack_free variables. By +default, these point to malloc() and free(), but you can replace +the pointers to cause PCRE to use your own functions. Since the block sizes are +always the same, and are always freed in reverse order, it may be possible to +implement customized memory handlers that are more efficient than the standard +functions. +

+
+Limiting pcre[16|32]_exec()'s stack usage +
+

+You can set limits on the number of times that match() is called, both in +total and recursively. If a limit is exceeded, pcre[16|32]_exec() returns an +error code. Setting suitable limits should prevent it from running out of +stack. The default values of the limits are very large, and unlikely ever to +operate. They can be changed when PCRE is built, and they can also be set when +pcre[16|32]_exec() is called. For details of these interfaces, see the +pcrebuild +documentation and the +section on extra data for pcre[16|32]_exec() +in the +pcreapi +documentation. +

+

+As a very rough rule of thumb, you should reckon on about 500 bytes per +recursion. Thus, if you want to limit your stack usage to 8Mb, you should set +the limit at 16000 recursions. A 64Mb stack, on the other hand, can support +around 128000 recursions. +

+

+In Unix-like environments, the pcretest test program has a command line +option (-S) that can be used to increase the size of its stack. As long +as the stack is large enough, another option (-M) can be used to find the +smallest limits that allow a particular pattern to match a given subject +string. This is done by calling pcre[16|32]_exec() repeatedly with different +limits. +

+
+Obtaining an estimate of stack usage +
+

+The actual amount of stack used per recursion can vary quite a lot, depending +on the compiler that was used to build PCRE and the optimization or debugging +options that were set for it. The rule of thumb value of 500 bytes mentioned +above may be larger or smaller than what is actually needed. A better +approximation can be obtained by running this command: +

+  pcretest -m -C
+
+The -C option causes pcretest to output information about the +options with which PCRE was compiled. When -m is also given (before +-C), information about stack use is given in a line like this: +
+  Match recursion uses stack: approximate frame size = 640 bytes
+
+The value is approximate because some recursions need a bit more (up to perhaps +16 more bytes). +

+

+If the above command is given when PCRE is compiled to use the heap instead of +the stack for recursion, the value that is output is the size of each block +that is obtained from the heap. +

+
+Changing stack size in Unix-like systems +
+

+In Unix-like environments, there is not often a problem with the stack unless +very long strings are involved, though the default limit on stack size varies +from system to system. Values from 8Mb to 64Mb are common. You can find your +default limit by running the command: +

+  ulimit -s
+
+Unfortunately, the effect of running out of stack is often SIGSEGV, though +sometimes a more explicit error message is given. You can normally increase the +limit on stack size by code such as this: +
+  struct rlimit rlim;
+  getrlimit(RLIMIT_STACK, &rlim);
+  rlim.rlim_cur = 100*1024*1024;
+  setrlimit(RLIMIT_STACK, &rlim);
+
+This reads the current limits (soft and hard) using getrlimit(), then +attempts to increase the soft limit to 100Mb using setrlimit(). You must +do this before calling pcre[16|32]_exec(). +

+
+Changing stack size in Mac OS X +
+

+Using setrlimit(), as described above, should also work on Mac OS X. It +is also possible to set a stack size when linking a program. There is a +discussion about stack sizes in Mac OS X at this web site: +http://developer.apple.com/qa/qa2005/qa1419.html. +

+
+AUTHOR +
+

+Philip Hazel +
+University Computing Service +
+Cambridge CB2 3QH, England. +
+

+
+REVISION +
+

+Last updated: 24 June 2012 +
+Copyright © 1997-2012 University of Cambridge. +
+

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcresyntax.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcresyntax.html new file mode 100755 index 000000000..5896b9e06 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcresyntax.html @@ -0,0 +1,561 @@ + + +pcresyntax specification + + +

pcresyntax man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+

+
PCRE REGULAR EXPRESSION SYNTAX SUMMARY
+

+The full syntax and semantics of the regular expressions that are supported by +PCRE are described in the +pcrepattern +documentation. This document contains a quick-reference summary of the syntax. +

+
QUOTING
+

+

+  \x         where x is non-alphanumeric is a literal x
+  \Q...\E    treat enclosed characters as literal
+
+

+
CHARACTERS
+

+

+  \a         alarm, that is, the BEL character (hex 07)
+  \cx        "control-x", where x is any ASCII character
+  \e         escape (hex 1B)
+  \f         form feed (hex 0C)
+  \n         newline (hex 0A)
+  \r         carriage return (hex 0D)
+  \t         tab (hex 09)
+  \0dd       character with octal code 0dd
+  \ddd       character with octal code ddd, or backreference
+  \o{ddd..}  character with octal code ddd..
+  \xhh       character with hex code hh
+  \x{hhh..}  character with hex code hhh..
+
+Note that \0dd is always an octal code, and that \8 and \9 are the literal +characters "8" and "9". +

+
CHARACTER TYPES
+

+

+  .          any character except newline;
+               in dotall mode, any character whatsoever
+  \C         one data unit, even in UTF mode (best avoided)
+  \d         a decimal digit
+  \D         a character that is not a decimal digit
+  \h         a horizontal white space character
+  \H         a character that is not a horizontal white space character
+  \N         a character that is not a newline
+  \p{xx}     a character with the xx property
+  \P{xx}     a character without the xx property
+  \R         a newline sequence
+  \s         a white space character
+  \S         a character that is not a white space character
+  \v         a vertical white space character
+  \V         a character that is not a vertical white space character
+  \w         a "word" character
+  \W         a "non-word" character
+  \X         a Unicode extended grapheme cluster
+
+By default, \d, \s, and \w match only ASCII characters, even in UTF-8 mode +or in the 16- bit and 32-bit libraries. However, if locale-specific matching is +happening, \s and \w may also match characters with code points in the range +128-255. If the PCRE_UCP option is set, the behaviour of these escape sequences +is changed to use Unicode properties and they match many more characters. +

+
GENERAL CATEGORY PROPERTIES FOR \p and \P
+

+

+  C          Other
+  Cc         Control
+  Cf         Format
+  Cn         Unassigned
+  Co         Private use
+  Cs         Surrogate
+
+  L          Letter
+  Ll         Lower case letter
+  Lm         Modifier letter
+  Lo         Other letter
+  Lt         Title case letter
+  Lu         Upper case letter
+  L&         Ll, Lu, or Lt
+
+  M          Mark
+  Mc         Spacing mark
+  Me         Enclosing mark
+  Mn         Non-spacing mark
+
+  N          Number
+  Nd         Decimal number
+  Nl         Letter number
+  No         Other number
+
+  P          Punctuation
+  Pc         Connector punctuation
+  Pd         Dash punctuation
+  Pe         Close punctuation
+  Pf         Final punctuation
+  Pi         Initial punctuation
+  Po         Other punctuation
+  Ps         Open punctuation
+
+  S          Symbol
+  Sc         Currency symbol
+  Sk         Modifier symbol
+  Sm         Mathematical symbol
+  So         Other symbol
+
+  Z          Separator
+  Zl         Line separator
+  Zp         Paragraph separator
+  Zs         Space separator
+
+

+
PCRE SPECIAL CATEGORY PROPERTIES FOR \p and \P
+

+

+  Xan        Alphanumeric: union of properties L and N
+  Xps        POSIX space: property Z or tab, NL, VT, FF, CR
+  Xsp        Perl space: property Z or tab, NL, VT, FF, CR
+  Xuc        Univerally-named character: one that can be
+               represented by a Universal Character Name
+  Xwd        Perl word: property Xan or underscore
+
+Perl and POSIX space are now the same. Perl added VT to its space character set +at release 5.18 and PCRE changed at release 8.34. +

+
SCRIPT NAMES FOR \p AND \P
+

+Arabic, +Armenian, +Avestan, +Balinese, +Bamum, +Bassa_Vah, +Batak, +Bengali, +Bopomofo, +Brahmi, +Braille, +Buginese, +Buhid, +Canadian_Aboriginal, +Carian, +Caucasian_Albanian, +Chakma, +Cham, +Cherokee, +Common, +Coptic, +Cuneiform, +Cypriot, +Cyrillic, +Deseret, +Devanagari, +Duployan, +Egyptian_Hieroglyphs, +Elbasan, +Ethiopic, +Georgian, +Glagolitic, +Gothic, +Grantha, +Greek, +Gujarati, +Gurmukhi, +Han, +Hangul, +Hanunoo, +Hebrew, +Hiragana, +Imperial_Aramaic, +Inherited, +Inscriptional_Pahlavi, +Inscriptional_Parthian, +Javanese, +Kaithi, +Kannada, +Katakana, +Kayah_Li, +Kharoshthi, +Khmer, +Khojki, +Khudawadi, +Lao, +Latin, +Lepcha, +Limbu, +Linear_A, +Linear_B, +Lisu, +Lycian, +Lydian, +Mahajani, +Malayalam, +Mandaic, +Manichaean, +Meetei_Mayek, +Mende_Kikakui, +Meroitic_Cursive, +Meroitic_Hieroglyphs, +Miao, +Modi, +Mongolian, +Mro, +Myanmar, +Nabataean, +New_Tai_Lue, +Nko, +Ogham, +Ol_Chiki, +Old_Italic, +Old_North_Arabian, +Old_Permic, +Old_Persian, +Old_South_Arabian, +Old_Turkic, +Oriya, +Osmanya, +Pahawh_Hmong, +Palmyrene, +Pau_Cin_Hau, +Phags_Pa, +Phoenician, +Psalter_Pahlavi, +Rejang, +Runic, +Samaritan, +Saurashtra, +Sharada, +Shavian, +Siddham, +Sinhala, +Sora_Sompeng, +Sundanese, +Syloti_Nagri, +Syriac, +Tagalog, +Tagbanwa, +Tai_Le, +Tai_Tham, +Tai_Viet, +Takri, +Tamil, +Telugu, +Thaana, +Thai, +Tibetan, +Tifinagh, +Tirhuta, +Ugaritic, +Vai, +Warang_Citi, +Yi. +

+
CHARACTER CLASSES
+

+

+  [...]       positive character class
+  [^...]      negative character class
+  [x-y]       range (can be used for hex characters)
+  [[:xxx:]]   positive POSIX named set
+  [[:^xxx:]]  negative POSIX named set
+
+  alnum       alphanumeric
+  alpha       alphabetic
+  ascii       0-127
+  blank       space or tab
+  cntrl       control character
+  digit       decimal digit
+  graph       printing, excluding space
+  lower       lower case letter
+  print       printing, including space
+  punct       printing, excluding alphanumeric
+  space       white space
+  upper       upper case letter
+  word        same as \w
+  xdigit      hexadecimal digit
+
+In PCRE, POSIX character set names recognize only ASCII characters by default, +but some of them use Unicode properties if PCRE_UCP is set. You can use +\Q...\E inside a character class. +

+
QUANTIFIERS
+

+

+  ?           0 or 1, greedy
+  ?+          0 or 1, possessive
+  ??          0 or 1, lazy
+  *           0 or more, greedy
+  *+          0 or more, possessive
+  *?          0 or more, lazy
+  +           1 or more, greedy
+  ++          1 or more, possessive
+  +?          1 or more, lazy
+  {n}         exactly n
+  {n,m}       at least n, no more than m, greedy
+  {n,m}+      at least n, no more than m, possessive
+  {n,m}?      at least n, no more than m, lazy
+  {n,}        n or more, greedy
+  {n,}+       n or more, possessive
+  {n,}?       n or more, lazy
+
+

+
ANCHORS AND SIMPLE ASSERTIONS
+

+

+  \b          word boundary
+  \B          not a word boundary
+  ^           start of subject
+               also after internal newline in multiline mode
+  \A          start of subject
+  $           end of subject
+               also before newline at end of subject
+               also before internal newline in multiline mode
+  \Z          end of subject
+               also before newline at end of subject
+  \z          end of subject
+  \G          first matching position in subject
+
+

+
MATCH POINT RESET
+

+

+  \K          reset start of match
+
+\K is honoured in positive assertions, but ignored in negative ones. +

+
ALTERNATION
+

+

+  expr|expr|expr...
+
+

+
CAPTURING
+

+

+  (...)           capturing group
+  (?<name>...)    named capturing group (Perl)
+  (?'name'...)    named capturing group (Perl)
+  (?P<name>...)   named capturing group (Python)
+  (?:...)         non-capturing group
+  (?|...)         non-capturing group; reset group numbers for
+                   capturing groups in each alternative
+
+

+
ATOMIC GROUPS
+

+

+  (?>...)         atomic, non-capturing group
+
+

+
COMMENT
+

+

+  (?#....)        comment (not nestable)
+
+

+
OPTION SETTING
+

+

+  (?i)            caseless
+  (?J)            allow duplicate names
+  (?m)            multiline
+  (?s)            single line (dotall)
+  (?U)            default ungreedy (lazy)
+  (?x)            extended (ignore white space)
+  (?-...)         unset option(s)
+
+The following are recognized only at the very start of a pattern or after one +of the newline or \R options with similar syntax. More than one of them may +appear. +
+  (*LIMIT_MATCH=d) set the match limit to d (decimal number)
+  (*LIMIT_RECURSION=d) set the recursion limit to d (decimal number)
+  (*NO_AUTO_POSSESS) no auto-possessification (PCRE_NO_AUTO_POSSESS)
+  (*NO_START_OPT) no start-match optimization (PCRE_NO_START_OPTIMIZE)
+  (*UTF8)         set UTF-8 mode: 8-bit library (PCRE_UTF8)
+  (*UTF16)        set UTF-16 mode: 16-bit library (PCRE_UTF16)
+  (*UTF32)        set UTF-32 mode: 32-bit library (PCRE_UTF32)
+  (*UTF)          set appropriate UTF mode for the library in use
+  (*UCP)          set PCRE_UCP (use Unicode properties for \d etc)
+
+Note that LIMIT_MATCH and LIMIT_RECURSION can only reduce the value of the +limits set by the caller of pcre_exec(), not increase them. +

+
NEWLINE CONVENTION
+

+These are recognized only at the very start of the pattern or after option +settings with a similar syntax. +

+  (*CR)           carriage return only
+  (*LF)           linefeed only
+  (*CRLF)         carriage return followed by linefeed
+  (*ANYCRLF)      all three of the above
+  (*ANY)          any Unicode newline sequence
+
+

+
WHAT \R MATCHES
+

+These are recognized only at the very start of the pattern or after option +setting with a similar syntax. +

+  (*BSR_ANYCRLF)  CR, LF, or CRLF
+  (*BSR_UNICODE)  any Unicode newline sequence
+
+

+
LOOKAHEAD AND LOOKBEHIND ASSERTIONS
+

+

+  (?=...)         positive look ahead
+  (?!...)         negative look ahead
+  (?<=...)        positive look behind
+  (?<!...)        negative look behind
+
+Each top-level branch of a look behind must be of a fixed length. +

+
BACKREFERENCES
+

+

+  \n              reference by number (can be ambiguous)
+  \gn             reference by number
+  \g{n}           reference by number
+  \g{-n}          relative reference by number
+  \k<name>        reference by name (Perl)
+  \k'name'        reference by name (Perl)
+  \g{name}        reference by name (Perl)
+  \k{name}        reference by name (.NET)
+  (?P=name)       reference by name (Python)
+
+

+
SUBROUTINE REFERENCES (POSSIBLY RECURSIVE)
+

+

+  (?R)            recurse whole pattern
+  (?n)            call subpattern by absolute number
+  (?+n)           call subpattern by relative number
+  (?-n)           call subpattern by relative number
+  (?&name)        call subpattern by name (Perl)
+  (?P>name)       call subpattern by name (Python)
+  \g<name>        call subpattern by name (Oniguruma)
+  \g'name'        call subpattern by name (Oniguruma)
+  \g<n>           call subpattern by absolute number (Oniguruma)
+  \g'n'           call subpattern by absolute number (Oniguruma)
+  \g<+n>          call subpattern by relative number (PCRE extension)
+  \g'+n'          call subpattern by relative number (PCRE extension)
+  \g<-n>          call subpattern by relative number (PCRE extension)
+  \g'-n'          call subpattern by relative number (PCRE extension)
+
+

+
CONDITIONAL PATTERNS
+

+

+  (?(condition)yes-pattern)
+  (?(condition)yes-pattern|no-pattern)
+
+  (?(n)...        absolute reference condition
+  (?(+n)...       relative reference condition
+  (?(-n)...       relative reference condition
+  (?(<name>)...   named reference condition (Perl)
+  (?('name')...   named reference condition (Perl)
+  (?(name)...     named reference condition (PCRE)
+  (?(R)...        overall recursion condition
+  (?(Rn)...       specific group recursion condition
+  (?(R&name)...   specific recursion condition
+  (?(DEFINE)...   define subpattern for reference
+  (?(assert)...   assertion condition
+
+

+
BACKTRACKING CONTROL
+

+The following act immediately they are reached: +

+  (*ACCEPT)       force successful match
+  (*FAIL)         force backtrack; synonym (*F)
+  (*MARK:NAME)    set name to be passed back; synonym (*:NAME)
+
+The following act only when a subsequent match failure causes a backtrack to +reach them. They all force a match failure, but they differ in what happens +afterwards. Those that advance the start-of-match point do so only if the +pattern is not anchored. +
+  (*COMMIT)       overall failure, no advance of starting point
+  (*PRUNE)        advance to next starting character
+  (*PRUNE:NAME)   equivalent to (*MARK:NAME)(*PRUNE)
+  (*SKIP)         advance to current matching position
+  (*SKIP:NAME)    advance to position corresponding to an earlier
+                  (*MARK:NAME); if not found, the (*SKIP) is ignored
+  (*THEN)         local failure, backtrack to next alternation
+  (*THEN:NAME)    equivalent to (*MARK:NAME)(*THEN)
+
+

+
CALLOUTS
+

+

+  (?C)      callout
+  (?Cn)     callout with data n
+
+

+
SEE ALSO
+

+pcrepattern(3), pcreapi(3), pcrecallout(3), +pcrematching(3), pcre(3). +

+
AUTHOR
+

+Philip Hazel +
+University Computing Service +
+Cambridge CB2 3QH, England. +
+

+
REVISION
+

+Last updated: 08 January 2014 +
+Copyright © 1997-2014 University of Cambridge. +
+

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcretest.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcretest.html new file mode 100755 index 000000000..842ff3cbe --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcretest.html @@ -0,0 +1,1161 @@ + + +pcretest specification + + +

pcretest man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+

+
SYNOPSIS
+

+pcretest [options] [input file [output file]] +
+
+pcretest was written as a test program for the PCRE regular expression +library itself, but it can also be used for experimenting with regular +expressions. This document describes the features of the test program; for +details of the regular expressions themselves, see the +pcrepattern +documentation. For details of the PCRE library function calls and their +options, see the +pcreapi +, +pcre16 +and +pcre32 +documentation. +

+

+The input for pcretest is a sequence of regular expression patterns and +strings to be matched, as described below. The output shows the result of each +match. Options on the command line and the patterns control PCRE options and +exactly what is output. +

+

+As PCRE has evolved, it has acquired many different features, and as a result, +pcretest now has rather a lot of obscure options for testing every +possible feature. Some of these options are specifically designed for use in +conjunction with the test script and data files that are distributed as part of +PCRE, and are unlikely to be of use otherwise. They are all documented here, +but without much justification. +

+
INPUT DATA FORMAT
+

+Input to pcretest is processed line by line, either by calling the C +library's fgets() function, or via the libreadline library (see +below). In Unix-like environments, fgets() treats any bytes other than +newline as data characters. However, in some Windows environments character 26 +(hex 1A) causes an immediate end of file, and no further data is read. For +maximum portability, therefore, it is safest to use only ASCII characters in +pcretest input files. +

+

+The input is processed using using C's string functions, so must not +contain binary zeroes, even though in Unix-like environments, fgets() +treats any bytes other than newline as data characters. +

+
PCRE's 8-BIT, 16-BIT AND 32-BIT LIBRARIES
+

+From release 8.30, two separate PCRE libraries can be built. The original one +supports 8-bit character strings, whereas the newer 16-bit library supports +character strings encoded in 16-bit units. From release 8.32, a third library +can be built, supporting character strings encoded in 32-bit units. The +pcretest program can be used to test all three libraries. However, it is +itself still an 8-bit program, reading 8-bit input and writing 8-bit output. +When testing the 16-bit or 32-bit library, the patterns and data strings are +converted to 16- or 32-bit format before being passed to the PCRE library +functions. Results are converted to 8-bit for output. +

+

+References to functions and structures of the form pcre[16|32]_xx below +mean "pcre_xx when using the 8-bit library, pcre16_xx when using +the 16-bit library, or pcre32_xx when using the 32-bit library". +

+
COMMAND LINE OPTIONS
+

+-8 +If the 8-bit library has been built, this option causes it to be used (this is +the default). If the 8-bit library has not been built, this option causes an +error. +

+

+-16 +If the 16-bit library has been built, this option causes it to be used. If only +the 16-bit library has been built, this is the default. If the 16-bit library +has not been built, this option causes an error. +

+

+-32 +If the 32-bit library has been built, this option causes it to be used. If only +the 32-bit library has been built, this is the default. If the 32-bit library +has not been built, this option causes an error. +

+

+-b +Behave as if each pattern has the /B (show byte code) modifier; the +internal form is output after compilation. +

+

+-C +Output the version number of the PCRE library, and all available information +about the optional features that are included, and then exit with zero exit +code. All other options are ignored. +

+

+-C option +Output information about a specific build-time option, then exit. This +functionality is intended for use in scripts such as RunTest. The +following options output the value and set the exit code as indicated: +

+  ebcdic-nl  the code for LF (= NL) in an EBCDIC environment:
+               0x15 or 0x25
+               0 if used in an ASCII environment
+               exit code is always 0
+  linksize   the configured internal link size (2, 3, or 4)
+               exit code is set to the link size
+  newline    the default newline setting:
+               CR, LF, CRLF, ANYCRLF, or ANY
+               exit code is always 0
+  bsr        the default setting for what \R matches:
+               ANYCRLF or ANY
+               exit code is always 0
+
+The following options output 1 for true or 0 for false, and set the exit code +to the same value: +
+  ebcdic     compiled for an EBCDIC environment
+  jit        just-in-time support is available
+  pcre16     the 16-bit library was built
+  pcre32     the 32-bit library was built
+  pcre8      the 8-bit library was built
+  ucp        Unicode property support is available
+  utf        UTF-8 and/or UTF-16 and/or UTF-32 support
+               is available
+
+If an unknown option is given, an error message is output; the exit code is 0. +

+

+-d +Behave as if each pattern has the /D (debug) modifier; the internal +form and information about the compiled pattern is output after compilation; +-d is equivalent to -b -i. +

+

+-dfa +Behave as if each data line contains the \D escape sequence; this causes the +alternative matching function, pcre[16|32]_dfa_exec(), to be used instead +of the standard pcre[16|32]_exec() function (more detail is given below). +

+

+-help +Output a brief summary these options and then exit. +

+

+-i +Behave as if each pattern has the /I modifier; information about the +compiled pattern is given after compilation. +

+

+-M +Behave as if each data line contains the \M escape sequence; this causes +PCRE to discover the minimum MATCH_LIMIT and MATCH_LIMIT_RECURSION settings by +calling pcre[16|32]_exec() repeatedly with different limits. +

+

+-m +Output the size of each compiled pattern after it has been compiled. This is +equivalent to adding /M to each regular expression. The size is given in +bytes for both libraries. +

+

+-O +Behave as if each pattern has the /O modifier, that is disable +auto-possessification for all patterns. +

+

+-o osize +Set the number of elements in the output vector that is used when calling +pcre[16|32]_exec() or pcre[16|32]_dfa_exec() to be osize. The +default value is 45, which is enough for 14 capturing subexpressions for +pcre[16|32]_exec() or 22 different matches for +pcre[16|32]_dfa_exec(). +The vector size can be changed for individual matching calls by including \O +in the data line (see below). +

+

+-p +Behave as if each pattern has the /P modifier; the POSIX wrapper API is +used to call PCRE. None of the other options has any effect when -p is +set. This option can be used only with the 8-bit library. +

+

+-q +Do not output the version number of pcretest at the start of execution. +

+

+-S size +On Unix-like systems, set the size of the run-time stack to size +megabytes. +

+

+-s or -s+ +Behave as if each pattern has the /S modifier; in other words, force each +pattern to be studied. If -s+ is used, all the JIT compile options are +passed to pcre[16|32]_study(), causing just-in-time optimization to be set +up if it is available, for both full and partial matching. Specific JIT compile +options can be selected by following -s+ with a digit in the range 1 to +7, which selects the JIT compile modes as follows: +

+  1  normal match only
+  2  soft partial match only
+  3  normal match and soft partial match
+  4  hard partial match only
+  6  soft and hard partial match
+  7  all three modes (default)
+
+If -s++ is used instead of -s+ (with or without a following digit), +the text "(JIT)" is added to the first output line after a match or no match +when JIT-compiled code was actually used. +
+
+Note that there are pattern options that can override -s, either +specifying no studying at all, or suppressing JIT compilation. +
+
+If the /I or /D option is present on a pattern (requesting output +about the compiled pattern), information about the result of studying is not +included when studying is caused only by -s and neither -i nor +-d is present on the command line. This behaviour means that the output +from tests that are run with and without -s should be identical, except +when options that output information about the actual running of a match are +set. +
+
+The -M, -t, and -tm options, which give information about +resources used, are likely to produce different output with and without +-s. Output may also differ if the /C option is present on an +individual pattern. This uses callouts to trace the the matching process, and +this may be different between studied and non-studied patterns. If the pattern +contains (*MARK) items there may also be differences, for the same reason. The +-s command line option can be overridden for specific patterns that +should never be studied (see the /S pattern modifier below). +

+

+-t +Run each compile, study, and match many times with a timer, and output the +resulting times per compile, study, or match (in milliseconds). Do not set +-m with -t, because you will then get the size output a zillion +times, and the timing will be distorted. You can control the number of +iterations that are used for timing by following -t with a number (as a +separate item on the command line). For example, "-t 1000" iterates 1000 times. +The default is to iterate 500000 times. +

+

+-tm +This is like -t except that it times only the matching phase, not the +compile or study phases. +

+

+-T -TM +These behave like -t and -tm, but in addition, at the end of a run, +the total times for all compiles, studies, and matches are output. +

+
DESCRIPTION
+

+If pcretest is given two filename arguments, it reads from the first and +writes to the second. If it is given only one filename argument, it reads from +that file and writes to stdout. Otherwise, it reads from stdin and writes to +stdout, and prompts for each line of input, using "re>" to prompt for regular +expressions, and "data>" to prompt for data lines. +

+

+When pcretest is built, a configuration option can specify that it should +be linked with the libreadline library. When this is done, if the input +is from a terminal, it is read using the readline() function. This +provides line-editing and history facilities. The output from the -help +option states whether or not readline() will be used. +

+

+The program handles any number of sets of input on a single input file. Each +set starts with a regular expression, and continues with any number of data +lines to be matched against that pattern. +

+

+Each data line is matched separately and independently. If you want to do +multi-line matches, you have to use the \n escape sequence (or \r or \r\n, +etc., depending on the newline setting) in a single line of input to encode the +newline sequences. There is no limit on the length of data lines; the input +buffer is automatically extended if it is too small. +

+

+An empty line signals the end of the data lines, at which point a new regular +expression is read. The regular expressions are given enclosed in any +non-alphanumeric delimiters other than backslash, for example: +

+  /(a|bc)x+yz/
+
+White space before the initial delimiter is ignored. A regular expression may +be continued over several input lines, in which case the newline characters are +included within it. It is possible to include the delimiter within the pattern +by escaping it, for example +
+  /abc\/def/
+
+If you do so, the escape and the delimiter form part of the pattern, but since +delimiters are always non-alphanumeric, this does not affect its interpretation. +If the terminating delimiter is immediately followed by a backslash, for +example, +
+  /abc/\
+
+then a backslash is added to the end of the pattern. This is done to provide a +way of testing the error condition that arises if a pattern finishes with a +backslash, because +
+  /abc\/
+
+is interpreted as the first line of a pattern that starts with "abc/", causing +pcretest to read the next line as a continuation of the regular expression. +

+
PATTERN MODIFIERS
+

+A pattern may be followed by any number of modifiers, which are mostly single +characters, though some of these can be qualified by further characters. +Following Perl usage, these are referred to below as, for example, "the +/i modifier", even though the delimiter of the pattern need not always be +a slash, and no slash is used when writing modifiers. White space may appear +between the final pattern delimiter and the first modifier, and between the +modifiers themselves. For reference, here is a complete list of modifiers. They +fall into several groups that are described in detail in the following +sections. +

+  /8              set UTF mode
+  /9              set PCRE_NEVER_UTF (locks out UTF mode)
+  /?              disable UTF validity check
+  /+              show remainder of subject after match
+  /=              show all captures (not just those that are set)
+
+  /A              set PCRE_ANCHORED
+  /B              show compiled code
+  /C              set PCRE_AUTO_CALLOUT
+  /D              same as /B plus /I
+  /E              set PCRE_DOLLAR_ENDONLY
+  /F              flip byte order in compiled pattern
+  /f              set PCRE_FIRSTLINE
+  /G              find all matches (shorten string)
+  /g              find all matches (use startoffset)
+  /I              show information about pattern
+  /i              set PCRE_CASELESS
+  /J              set PCRE_DUPNAMES
+  /K              show backtracking control names
+  /L              set locale
+  /M              show compiled memory size
+  /m              set PCRE_MULTILINE
+  /N              set PCRE_NO_AUTO_CAPTURE
+  /O              set PCRE_NO_AUTO_POSSESS
+  /P              use the POSIX wrapper
+  /Q              test external stack check function
+  /S              study the pattern after compilation
+  /s              set PCRE_DOTALL
+  /T              select character tables
+  /U              set PCRE_UNGREEDY
+  /W              set PCRE_UCP
+  /X              set PCRE_EXTRA
+  /x              set PCRE_EXTENDED
+  /Y              set PCRE_NO_START_OPTIMIZE
+  /Z              don't show lengths in /B output
+
+  /<any>          set PCRE_NEWLINE_ANY
+  /<anycrlf>      set PCRE_NEWLINE_ANYCRLF
+  /<cr>           set PCRE_NEWLINE_CR
+  /<crlf>         set PCRE_NEWLINE_CRLF
+  /<lf>           set PCRE_NEWLINE_LF
+  /<bsr_anycrlf>  set PCRE_BSR_ANYCRLF
+  /<bsr_unicode>  set PCRE_BSR_UNICODE
+  /<JS>           set PCRE_JAVASCRIPT_COMPAT
+
+
+

+
+Perl-compatible modifiers +
+

+The /i, /m, /s, and /x modifiers set the PCRE_CASELESS, +PCRE_MULTILINE, PCRE_DOTALL, or PCRE_EXTENDED options, respectively, when +pcre[16|32]_compile() is called. These four modifier letters have the same +effect as they do in Perl. For example: +

+  /caseless/i
+
+
+

+
+Modifiers for other PCRE options +
+

+The following table shows additional modifiers for setting PCRE compile-time +options that do not correspond to anything in Perl: +

+  /8              PCRE_UTF8           ) when using the 8-bit
+  /?              PCRE_NO_UTF8_CHECK  )   library
+
+  /8              PCRE_UTF16          ) when using the 16-bit
+  /?              PCRE_NO_UTF16_CHECK )   library
+
+  /8              PCRE_UTF32          ) when using the 32-bit
+  /?              PCRE_NO_UTF32_CHECK )   library
+
+  /9              PCRE_NEVER_UTF
+  /A              PCRE_ANCHORED
+  /C              PCRE_AUTO_CALLOUT
+  /E              PCRE_DOLLAR_ENDONLY
+  /f              PCRE_FIRSTLINE
+  /J              PCRE_DUPNAMES
+  /N              PCRE_NO_AUTO_CAPTURE
+  /O              PCRE_NO_AUTO_POSSESS
+  /U              PCRE_UNGREEDY
+  /W              PCRE_UCP
+  /X              PCRE_EXTRA
+  /Y              PCRE_NO_START_OPTIMIZE
+  /<any>          PCRE_NEWLINE_ANY
+  /<anycrlf>      PCRE_NEWLINE_ANYCRLF
+  /<cr>           PCRE_NEWLINE_CR
+  /<crlf>         PCRE_NEWLINE_CRLF
+  /<lf>           PCRE_NEWLINE_LF
+  /<bsr_anycrlf>  PCRE_BSR_ANYCRLF
+  /<bsr_unicode>  PCRE_BSR_UNICODE
+  /<JS>           PCRE_JAVASCRIPT_COMPAT
+
+The modifiers that are enclosed in angle brackets are literal strings as shown, +including the angle brackets, but the letters within can be in either case. +This example sets multiline matching with CRLF as the line ending sequence: +
+  /^abc/m<CRLF>
+
+As well as turning on the PCRE_UTF8/16/32 option, the /8 modifier causes +all non-printing characters in output strings to be printed using the +\x{hh...} notation. Otherwise, those less than 0x100 are output in hex without +the curly brackets. +

+

+Full details of the PCRE options are given in the +pcreapi +documentation. +

+
+Finding all matches in a string +
+

+Searching for all possible matches within each subject string can be requested +by the /g or /G modifier. After finding a match, PCRE is called +again to search the remainder of the subject string. The difference between +/g and /G is that the former uses the startoffset argument to +pcre[16|32]_exec() to start searching at a new point within the entire +string (which is in effect what Perl does), whereas the latter passes over a +shortened substring. This makes a difference to the matching process if the +pattern begins with a lookbehind assertion (including \b or \B). +

+

+If any call to pcre[16|32]_exec() in a /g or /G sequence matches +an empty string, the next call is done with the PCRE_NOTEMPTY_ATSTART and +PCRE_ANCHORED flags set in order to search for another, non-empty, match at the +same point. If this second match fails, the start offset is advanced, and the +normal match is retried. This imitates the way Perl handles such cases when +using the /g modifier or the split() function. Normally, the start +offset is advanced by one character, but if the newline convention recognizes +CRLF as a newline, and the current character is CR followed by LF, an advance +of two is used. +

+
+Other modifiers +
+

+There are yet more modifiers for controlling the way pcretest +operates. +

+

+The /+ modifier requests that as well as outputting the substring that +matched the entire pattern, pcretest should in addition output the +remainder of the subject string. This is useful for tests where the subject +contains multiple copies of the same substring. If the + modifier appears +twice, the same action is taken for captured substrings. In each case the +remainder is output on the following line with a plus character following the +capture number. Note that this modifier must not immediately follow the /S +modifier because /S+ and /S++ have other meanings. +

+

+The /= modifier requests that the values of all potential captured +parentheses be output after a match. By default, only those up to the highest +one actually used in the match are output (corresponding to the return code +from pcre[16|32]_exec()). Values in the offsets vector corresponding to +higher numbers should be set to -1, and these are output as "<unset>". This +modifier gives a way of checking that this is happening. +

+

+The /B modifier is a debugging feature. It requests that pcretest +output a representation of the compiled code after compilation. Normally this +information contains length and offset values; however, if /Z is also +present, this data is replaced by spaces. This is a special feature for use in +the automatic test scripts; it ensures that the same output is generated for +different internal link sizes. +

+

+The /D modifier is a PCRE debugging feature, and is equivalent to +/BI, that is, both the /B and the /I modifiers. +

+

+The /F modifier causes pcretest to flip the byte order of the +2-byte and 4-byte fields in the compiled pattern. This facility is for testing +the feature in PCRE that allows it to execute patterns that were compiled on a +host with a different endianness. This feature is not available when the POSIX +interface to PCRE is being used, that is, when the /P pattern modifier is +specified. See also the section about saving and reloading compiled patterns +below. +

+

+The /I modifier requests that pcretest output information about the +compiled pattern (whether it is anchored, has a fixed first character, and +so on). It does this by calling pcre[16|32]_fullinfo() after compiling a +pattern. If the pattern is studied, the results of that are also output. In +this output, the word "char" means a non-UTF character, that is, the value of a +single data item (8-bit, 16-bit, or 32-bit, depending on the library that is +being tested). +

+

+The /K modifier requests pcretest to show names from backtracking +control verbs that are returned from calls to pcre[16|32]_exec(). It causes +pcretest to create a pcre[16|32]_extra block if one has not already +been created by a call to pcre[16|32]_study(), and to set the +PCRE_EXTRA_MARK flag and the mark field within it, every time that +pcre[16|32]_exec() is called. If the variable that the mark field +points to is non-NULL for a match, non-match, or partial match, pcretest +prints the string to which it points. For a match, this is shown on a line by +itself, tagged with "MK:". For a non-match it is added to the message. +

+

+The /L modifier must be followed directly by the name of a locale, for +example, +

+  /pattern/Lfr_FR
+
+For this reason, it must be the last modifier. The given locale is set, +pcre[16|32]_maketables() is called to build a set of character tables for +the locale, and this is then passed to pcre[16|32]_compile() when compiling +the regular expression. Without an /L (or /T) modifier, NULL is +passed as the tables pointer; that is, /L applies only to the expression +on which it appears. +

+

+The /M modifier causes the size in bytes of the memory block used to hold +the compiled pattern to be output. This does not include the size of the +pcre[16|32] block; it is just the actual compiled data. If the pattern is +successfully studied with the PCRE_STUDY_JIT_COMPILE option, the size of the +JIT compiled code is also output. +

+

+The /Q modifier is used to test the use of pcre_stack_guard. It +must be followed by '0' or '1', specifying the return code to be given from an +external function that is passed to PCRE and used for stack checking during +compilation (see the +pcreapi +documentation for details). +

+

+The /S modifier causes pcre[16|32]_study() to be called after the +expression has been compiled, and the results used when the expression is +matched. There are a number of qualifying characters that may follow /S. +They may appear in any order. +

+

+If /S is followed by an exclamation mark, pcre[16|32]_study() is +called with the PCRE_STUDY_EXTRA_NEEDED option, causing it always to return a +pcre_extra block, even when studying discovers no useful information. +

+

+If /S is followed by a second S character, it suppresses studying, even +if it was requested externally by the -s command line option. This makes +it possible to specify that certain patterns are always studied, and others are +never studied, independently of -s. This feature is used in the test +files in a few cases where the output is different when the pattern is studied. +

+

+If the /S modifier is followed by a + character, the call to +pcre[16|32]_study() is made with all the JIT study options, requesting +just-in-time optimization support if it is available, for both normal and +partial matching. If you want to restrict the JIT compiling modes, you can +follow /S+ with a digit in the range 1 to 7: +

+  1  normal match only
+  2  soft partial match only
+  3  normal match and soft partial match
+  4  hard partial match only
+  6  soft and hard partial match
+  7  all three modes (default)
+
+If /S++ is used instead of /S+ (with or without a following digit), +the text "(JIT)" is added to the first output line after a match or no match +when JIT-compiled code was actually used. +

+

+Note that there is also an independent /+ modifier; it must not be given +immediately after /S or /S+ because this will be misinterpreted. +

+

+If JIT studying is successful, the compiled JIT code will automatically be used +when pcre[16|32]_exec() is run, except when incompatible run-time options +are specified. For more details, see the +pcrejit +documentation. See also the \J escape sequence below for a way of +setting the size of the JIT stack. +

+

+Finally, if /S is followed by a minus character, JIT compilation is +suppressed, even if it was requested externally by the -s command line +option. This makes it possible to specify that JIT is never to be used for +certain patterns. +

+

+The /T modifier must be followed by a single digit. It causes a specific +set of built-in character tables to be passed to pcre[16|32]_compile(). It +is used in the standard PCRE tests to check behaviour with different character +tables. The digit specifies the tables as follows: +

+  0   the default ASCII tables, as distributed in
+        pcre_chartables.c.dist
+  1   a set of tables defining ISO 8859 characters
+
+In table 1, some characters whose codes are greater than 128 are identified as +letters, digits, spaces, etc. +

+
+Using the POSIX wrapper API +
+

+The /P modifier causes pcretest to call PCRE via the POSIX wrapper +API rather than its native API. This supports only the 8-bit library. When +/P is set, the following modifiers set options for the regcomp() +function: +

+  /i    REG_ICASE
+  /m    REG_NEWLINE
+  /N    REG_NOSUB
+  /s    REG_DOTALL     )
+  /U    REG_UNGREEDY   ) These options are not part of
+  /W    REG_UCP        )   the POSIX standard
+  /8    REG_UTF8       )
+
+The /+ modifier works as described above. All other modifiers are +ignored. +

+
+Locking out certain modifiers +
+

+PCRE can be compiled with or without support for certain features such as +UTF-8/16/32 or Unicode properties. Accordingly, the standard tests are split up +into a number of different files that are selected for running depending on +which features are available. When updating the tests, it is all too easy to +put a new test into the wrong file by mistake; for example, to put a test that +requires UTF support into a file that is used when it is not available. To help +detect such mistakes as early as possible, there is a facility for locking out +specific modifiers. If an input line for pcretest starts with the string +"< forbid " the following sequence of characters is taken as a list of +forbidden modifiers. For example, in the test files that must not use UTF or +Unicode property support, this line appears: +

+  < forbid 8W
+
+This locks out the /8 and /W modifiers. An immediate error is given if they are +subsequently encountered. If the character string contains < but not >, all the +multi-character modifiers that begin with < are locked out. Otherwise, such +modifiers must be explicitly listed, for example: +
+  < forbid <JS><cr>
+
+There must be a single space between < and "forbid" for this feature to be +recognised. If there is not, the line is interpreted either as a request to +re-load a pre-compiled pattern (see "SAVING AND RELOADING COMPILED PATTERNS" +below) or, if there is a another < character, as a pattern that uses < as its +delimiter. +

+
DATA LINES
+

+Before each data line is passed to pcre[16|32]_exec(), leading and trailing +white space is removed, and it is then scanned for \ escapes. Some of these +are pretty esoteric features, intended for checking out some of the more +complicated features of PCRE. If you are just testing "ordinary" regular +expressions, you probably don't need any of these. The following escapes are +recognized: +

+  \a         alarm (BEL, \x07)
+  \b         backspace (\x08)
+  \e         escape (\x27)
+  \f         form feed (\x0c)
+  \n         newline (\x0a)
+  \qdd       set the PCRE_MATCH_LIMIT limit to dd (any number of digits)
+  \r         carriage return (\x0d)
+  \t         tab (\x09)
+  \v         vertical tab (\x0b)
+  \nnn       octal character (up to 3 octal digits); always
+               a byte unless > 255 in UTF-8 or 16-bit or 32-bit mode
+  \o{dd...}  octal character (any number of octal digits}
+  \xhh       hexadecimal byte (up to 2 hex digits)
+  \x{hh...}  hexadecimal character (any number of hex digits)
+  \A         pass the PCRE_ANCHORED option to pcre[16|32]_exec() or pcre[16|32]_dfa_exec()
+  \B         pass the PCRE_NOTBOL option to pcre[16|32]_exec() or pcre[16|32]_dfa_exec()
+  \Cdd       call pcre[16|32]_copy_substring() for substring dd after a successful match (number less than 32)
+  \Cname     call pcre[16|32]_copy_named_substring() for substring "name" after a successful match (name termin-
+               ated by next non alphanumeric character)
+  \C+        show the current captured substrings at callout time
+  \C-        do not supply a callout function
+  \C!n       return 1 instead of 0 when callout number n is reached
+  \C!n!m     return 1 instead of 0 when callout number n is reached for the nth time
+  \C*n       pass the number n (may be negative) as callout data; this is used as the callout return value
+  \D         use the pcre[16|32]_dfa_exec() match function
+  \F         only shortest match for pcre[16|32]_dfa_exec()
+  \Gdd       call pcre[16|32]_get_substring() for substring dd after a successful match (number less than 32)
+  \Gname     call pcre[16|32]_get_named_substring() for substring "name" after a successful match (name termin-
+               ated by next non-alphanumeric character)
+  \Jdd       set up a JIT stack of dd kilobytes maximum (any number of digits)
+  \L         call pcre[16|32]_get_substringlist() after a successful match
+  \M         discover the minimum MATCH_LIMIT and MATCH_LIMIT_RECURSION settings
+  \N         pass the PCRE_NOTEMPTY option to pcre[16|32]_exec() or pcre[16|32]_dfa_exec(); if used twice, pass the
+               PCRE_NOTEMPTY_ATSTART option
+  \Odd       set the size of the output vector passed to pcre[16|32]_exec() to dd (any number of digits)
+  \P         pass the PCRE_PARTIAL_SOFT option to pcre[16|32]_exec() or pcre[16|32]_dfa_exec(); if used twice, pass the
+               PCRE_PARTIAL_HARD option
+  \Qdd       set the PCRE_MATCH_LIMIT_RECURSION limit to dd (any number of digits)
+  \R         pass the PCRE_DFA_RESTART option to pcre[16|32]_dfa_exec()
+  \S         output details of memory get/free calls during matching
+  \Y         pass the PCRE_NO_START_OPTIMIZE option to pcre[16|32]_exec() or pcre[16|32]_dfa_exec()
+  \Z         pass the PCRE_NOTEOL option to pcre[16|32]_exec() or pcre[16|32]_dfa_exec()
+  \?         pass the PCRE_NO_UTF[8|16|32]_CHECK option to pcre[16|32]_exec() or pcre[16|32]_dfa_exec()
+  \>dd       start the match at offset dd (optional "-"; then any number of digits); this sets the startoffset
+               argument for pcre[16|32]_exec() or pcre[16|32]_dfa_exec()
+  \<cr>      pass the PCRE_NEWLINE_CR option to pcre[16|32]_exec() or pcre[16|32]_dfa_exec()
+  \<lf>      pass the PCRE_NEWLINE_LF option to pcre[16|32]_exec() or pcre[16|32]_dfa_exec()
+  \<crlf>    pass the PCRE_NEWLINE_CRLF option to pcre[16|32]_exec() or pcre[16|32]_dfa_exec()
+  \<anycrlf> pass the PCRE_NEWLINE_ANYCRLF option to pcre[16|32]_exec() or pcre[16|32]_dfa_exec()
+  \<any>     pass the PCRE_NEWLINE_ANY option to pcre[16|32]_exec() or pcre[16|32]_dfa_exec()
+
+The use of \x{hh...} is not dependent on the use of the /8 modifier on +the pattern. It is recognized always. There may be any number of hexadecimal +digits inside the braces; invalid values provoke error messages. +

+

+Note that \xhh specifies one byte rather than one character in UTF-8 mode; +this makes it possible to construct invalid UTF-8 sequences for testing +purposes. On the other hand, \x{hh} is interpreted as a UTF-8 character in +UTF-8 mode, generating more than one byte if the value is greater than 127. +When testing the 8-bit library not in UTF-8 mode, \x{hh} generates one byte +for values less than 256, and causes an error for greater values. +

+

+In UTF-16 mode, all 4-digit \x{hhhh} values are accepted. This makes it +possible to construct invalid UTF-16 sequences for testing purposes. +

+

+In UTF-32 mode, all 4- to 8-digit \x{...} values are accepted. This makes it +possible to construct invalid UTF-32 sequences for testing purposes. +

+

+The escapes that specify line ending sequences are literal strings, exactly as +shown. No more than one newline setting should be present in any data line. +

+

+A backslash followed by anything else just escapes the anything else. If +the very last character is a backslash, it is ignored. This gives a way of +passing an empty line as data, since a real empty line terminates the data +input. +

+

+The \J escape provides a way of setting the maximum stack size that is +used by the just-in-time optimization code. It is ignored if JIT optimization +is not being used. Providing a stack that is larger than the default 32K is +necessary only for very complicated patterns. +

+

+If \M is present, pcretest calls pcre[16|32]_exec() several times, +with different values in the match_limit and match_limit_recursion +fields of the pcre[16|32]_extra data structure, until it finds the minimum +numbers for each parameter that allow pcre[16|32]_exec() to complete without +error. Because this is testing a specific feature of the normal interpretive +pcre[16|32]_exec() execution, the use of any JIT optimization that might +have been set up by the /S+ qualifier of -s+ option is disabled. +

+

+The match_limit number is a measure of the amount of backtracking +that takes place, and checking it out can be instructive. For most simple +matches, the number is quite small, but for patterns with very large numbers of +matching possibilities, it can become large very quickly with increasing length +of subject string. The match_limit_recursion number is a measure of how +much stack (or, if PCRE is compiled with NO_RECURSE, how much heap) memory is +needed to complete the match attempt. +

+

+When \O is used, the value specified may be higher or lower than the size set +by the -O command line option (or defaulted to 45); \O applies only to +the call of pcre[16|32]_exec() for the line in which it appears. +

+

+If the /P modifier was present on the pattern, causing the POSIX wrapper +API to be used, the only option-setting sequences that have any effect are \B, +\N, and \Z, causing REG_NOTBOL, REG_NOTEMPTY, and REG_NOTEOL, respectively, +to be passed to regexec(). +

+
THE ALTERNATIVE MATCHING FUNCTION
+

+By default, pcretest uses the standard PCRE matching function, +pcre[16|32]_exec() to match each data line. PCRE also supports an +alternative matching function, pcre[16|32]_dfa_test(), which operates in a +different way, and has some restrictions. The differences between the two +functions are described in the +pcrematching +documentation. +

+

+If a data line contains the \D escape sequence, or if the command line +contains the -dfa option, the alternative matching function is used. +This function finds all possible matches at a given point. If, however, the \F +escape sequence is present in the data line, it stops after the first match is +found. This is always the shortest possible match. +

+
DEFAULT OUTPUT FROM PCRETEST
+

+This section describes the output when the normal matching function, +pcre[16|32]_exec(), is being used. +

+

+When a match succeeds, pcretest outputs the list of captured substrings +that pcre[16|32]_exec() returns, starting with number 0 for the string that +matched the whole pattern. Otherwise, it outputs "No match" when the return is +PCRE_ERROR_NOMATCH, and "Partial match:" followed by the partially matching +substring when pcre[16|32]_exec() returns PCRE_ERROR_PARTIAL. (Note that +this is the entire substring that was inspected during the partial match; it +may include characters before the actual match start if a lookbehind assertion, +\K, \b, or \B was involved.) For any other return, pcretest outputs +the PCRE negative error number and a short descriptive phrase. If the error is +a failed UTF string check, the offset of the start of the failing character and +the reason code are also output, provided that the size of the output vector is +at least two. Here is an example of an interactive pcretest run. +

+  $ pcretest
+  PCRE version 8.13 2011-04-30
+
+    re> /^abc(\d+)/
+  data> abc123
+   0: abc123
+   1: 123
+  data> xyz
+  No match
+
+Unset capturing substrings that are not followed by one that is set are not +returned by pcre[16|32]_exec(), and are not shown by pcretest. In the +following example, there are two capturing substrings, but when the first data +line is matched, the second, unset substring is not shown. An "internal" unset +substring is shown as "<unset>", as for the second data line. +
+    re> /(a)|(b)/
+  data> a
+   0: a
+   1: a
+  data> b
+   0: b
+   1: <unset>
+   2: b
+
+If the strings contain any non-printing characters, they are output as \xhh +escapes if the value is less than 256 and UTF mode is not set. Otherwise they +are output as \x{hh...} escapes. See below for the definition of non-printing +characters. If the pattern has the /+ modifier, the output for substring +0 is followed by the the rest of the subject string, identified by "0+" like +this: +
+    re> /cat/+
+  data> cataract
+   0: cat
+   0+ aract
+
+If the pattern has the /g or /G modifier, the results of successive +matching attempts are output in sequence, like this: +
+    re> /\Bi(\w\w)/g
+  data> Mississippi
+   0: iss
+   1: ss
+   0: iss
+   1: ss
+   0: ipp
+   1: pp
+
+"No match" is output only if the first match attempt fails. Here is an example +of a failure message (the offset 4 that is specified by \>4 is past the end of +the subject string): +
+    re> /xyz/
+  data> xyz\>4
+  Error -24 (bad offset value)
+
+

+

+If any of the sequences \C, \G, or \L are present in a +data line that is successfully matched, the substrings extracted by the +convenience functions are output with C, G, or L after the string number +instead of a colon. This is in addition to the normal full list. The string +length (that is, the return from the extraction function) is given in +parentheses after each string for \C and \G. +

+

+Note that whereas patterns can be continued over several lines (a plain ">" +prompt is used for continuations), data lines may not. However newlines can be +included in data by means of the \n escape (or \r, \r\n, etc., depending on +the newline sequence setting). +

+
OUTPUT FROM THE ALTERNATIVE MATCHING FUNCTION
+

+When the alternative matching function, pcre[16|32]_dfa_exec(), is used (by +means of the \D escape sequence or the -dfa command line option), the +output consists of a list of all the matches that start at the first point in +the subject where there is at least one match. For example: +

+    re> /(tang|tangerine|tan)/
+  data> yellow tangerine\D
+   0: tangerine
+   1: tang
+   2: tan
+
+(Using the normal matching function on this data finds only "tang".) The +longest matching string is always given first (and numbered zero). After a +PCRE_ERROR_PARTIAL return, the output is "Partial match:", followed by the +partially matching substring. (Note that this is the entire substring that was +inspected during the partial match; it may include characters before the actual +match start if a lookbehind assertion, \K, \b, or \B was involved.) +

+

+If /g is present on the pattern, the search for further matches resumes +at the end of the longest match. For example: +

+    re> /(tang|tangerine|tan)/g
+  data> yellow tangerine and tangy sultana\D
+   0: tangerine
+   1: tang
+   2: tan
+   0: tang
+   1: tan
+   0: tan
+
+Since the matching function does not support substring capture, the escape +sequences that are concerned with captured substrings are not relevant. +

+
RESTARTING AFTER A PARTIAL MATCH
+

+When the alternative matching function has given the PCRE_ERROR_PARTIAL return, +indicating that the subject partially matched the pattern, you can restart the +match with additional subject data by means of the \R escape sequence. For +example: +

+    re> /^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$/
+  data> 23ja\P\D
+  Partial match: 23ja
+  data> n05\R\D
+   0: n05
+
+For further information about partial matching, see the +pcrepartial +documentation. +

+
CALLOUTS
+

+If the pattern contains any callout requests, pcretest's callout function +is called during matching. This works with both matching functions. By default, +the called function displays the callout number, the start and current +positions in the text at the callout time, and the next pattern item to be +tested. For example: +

+  --->pqrabcdef
+    0    ^  ^     \d
+
+This output indicates that callout number 0 occurred for a match attempt +starting at the fourth character of the subject string, when the pointer was at +the seventh character of the data, and when the next pattern item was \d. Just +one circumflex is output if the start and current positions are the same. +

+

+Callouts numbered 255 are assumed to be automatic callouts, inserted as a +result of the /C pattern modifier. In this case, instead of showing the +callout number, the offset in the pattern, preceded by a plus, is output. For +example: +

+    re> /\d?[A-E]\*/C
+  data> E*
+  --->E*
+   +0 ^      \d?
+   +3 ^      [A-E]
+   +8 ^^     \*
+  +10 ^ ^
+   0: E*
+
+If a pattern contains (*MARK) items, an additional line is output whenever +a change of latest mark is passed to the callout function. For example: +
+    re> /a(*MARK:X)bc/C
+  data> abc
+  --->abc
+   +0 ^       a
+   +1 ^^      (*MARK:X)
+  +10 ^^      b
+  Latest Mark: X
+  +11 ^ ^     c
+  +12 ^  ^
+   0: abc
+
+The mark changes between matching "a" and "b", but stays the same for the rest +of the match, so nothing more is output. If, as a result of backtracking, the +mark reverts to being unset, the text "<unset>" is output. +

+

+The callout function in pcretest returns zero (carry on matching) by +default, but you can use a \C item in a data line (as described above) to +change this and other parameters of the callout. +

+

+Inserting callouts can be helpful when using pcretest to check +complicated regular expressions. For further information about callouts, see +the +pcrecallout +documentation. +

+
NON-PRINTING CHARACTERS
+

+When pcretest is outputting text in the compiled version of a pattern, +bytes other than 32-126 are always treated as non-printing characters are are +therefore shown as hex escapes. +

+

+When pcretest is outputting text that is a matched part of a subject +string, it behaves in the same way, unless a different locale has been set for +the pattern (using the /L modifier). In this case, the isprint() +function to distinguish printing and non-printing characters. +

+
SAVING AND RELOADING COMPILED PATTERNS
+

+The facilities described in this section are not available when the POSIX +interface to PCRE is being used, that is, when the /P pattern modifier is +specified. +

+

+When the POSIX interface is not in use, you can cause pcretest to write a +compiled pattern to a file, by following the modifiers with > and a file name. +For example: +

+  /pattern/im >/some/file
+
+See the +pcreprecompile +documentation for a discussion about saving and re-using compiled patterns. +Note that if the pattern was successfully studied with JIT optimization, the +JIT data cannot be saved. +

+

+The data that is written is binary. The first eight bytes are the length of the +compiled pattern data followed by the length of the optional study data, each +written as four bytes in big-endian order (most significant byte first). If +there is no study data (either the pattern was not studied, or studying did not +return any data), the second length is zero. The lengths are followed by an +exact copy of the compiled pattern. If there is additional study data, this +(excluding any JIT data) follows immediately after the compiled pattern. After +writing the file, pcretest expects to read a new pattern. +

+

+A saved pattern can be reloaded into pcretest by specifying < and a file +name instead of a pattern. There must be no space between < and the file name, +which must not contain a < character, as otherwise pcretest will +interpret the line as a pattern delimited by < characters. For example: +

+   re> </some/file
+  Compiled pattern loaded from /some/file
+  No study data
+
+If the pattern was previously studied with the JIT optimization, the JIT +information cannot be saved and restored, and so is lost. When the pattern has +been loaded, pcretest proceeds to read data lines in the usual way. +

+

+You can copy a file written by pcretest to a different host and reload it +there, even if the new host has opposite endianness to the one on which the +pattern was compiled. For example, you can compile on an i86 machine and run on +a SPARC machine. When a pattern is reloaded on a host with different +endianness, the confirmation message is changed to: +

+  Compiled pattern (byte-inverted) loaded from /some/file
+
+The test suite contains some saved pre-compiled patterns with different +endianness. These are reloaded using "<!" instead of just "<". This suppresses +the "(byte-inverted)" text so that the output is the same on all hosts. It also +forces debugging output once the pattern has been reloaded. +

+

+File names for saving and reloading can be absolute or relative, but note that +the shell facility of expanding a file name that starts with a tilde (~) is not +available. +

+

+The ability to save and reload files in pcretest is intended for testing +and experimentation. It is not intended for production use because only a +single pattern can be written to a file. Furthermore, there is no facility for +supplying custom character tables for use with a reloaded pattern. If the +original pattern was compiled with custom tables, an attempt to match a subject +string using a reloaded pattern is likely to cause pcretest to crash. +Finally, if you attempt to load a file that is not in the correct format, the +result is undefined. +

+
SEE ALSO
+

+pcre(3), pcre16(3), pcre32(3), pcreapi(3), +pcrecallout(3), +pcrejit, pcrematching(3), pcrepartial(d), +pcrepattern(3), pcreprecompile(3). +

+
AUTHOR
+

+Philip Hazel +
+University Computing Service +
+Cambridge CB2 3QH, England. +
+

+
REVISION
+

+Last updated: 10 February 2020 +
+Copyright © 1997-2020 University of Cambridge. +
+

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcreunicode.html b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcreunicode.html new file mode 100755 index 000000000..ab36bc61e --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/html/pcreunicode.html @@ -0,0 +1,262 @@ + + +pcreunicode specification + + +

pcreunicode man page

+

+Return to the PCRE index page. +

+

+This page is part of the PCRE HTML documentation. It was generated automatically +from the original man page. If there is any nonsense in it, please consult the +man page, in case the conversion went wrong. +
+
+UTF-8, UTF-16, UTF-32, AND UNICODE PROPERTY SUPPORT +
+

+As well as UTF-8 support, PCRE also supports UTF-16 (from release 8.30) and +UTF-32 (from release 8.32), by means of two additional libraries. They can be +built as well as, or instead of, the 8-bit library. +

+
+UTF-8 SUPPORT +
+

+In order process UTF-8 strings, you must build PCRE's 8-bit library with UTF +support, and, in addition, you must call +pcre_compile() +with the PCRE_UTF8 option flag, or the pattern must start with the sequence +(*UTF8) or (*UTF). When either of these is the case, both the pattern and any +subject strings that are matched against it are treated as UTF-8 strings +instead of strings of individual 1-byte characters. +

+
+UTF-16 AND UTF-32 SUPPORT +
+

+In order process UTF-16 or UTF-32 strings, you must build PCRE's 16-bit or +32-bit library with UTF support, and, in addition, you must call +pcre16_compile() +or +pcre32_compile() +with the PCRE_UTF16 or PCRE_UTF32 option flag, as appropriate. Alternatively, +the pattern must start with the sequence (*UTF16), (*UTF32), as appropriate, or +(*UTF), which can be used with either library. When UTF mode is set, both the +pattern and any subject strings that are matched against it are treated as +UTF-16 or UTF-32 strings instead of strings of individual 16-bit or 32-bit +characters. +

+
+UTF SUPPORT OVERHEAD +
+

+If you compile PCRE with UTF support, but do not use it at run time, the +library will be a bit bigger, but the additional run time overhead is limited +to testing the PCRE_UTF[8|16|32] flag occasionally, so should not be very big. +

+
+UNICODE PROPERTY SUPPORT +
+

+If PCRE is built with Unicode character property support (which implies UTF +support), the escape sequences \p{..}, \P{..}, and \X can be used. +The available properties that can be tested are limited to the general +category properties such as Lu for an upper case letter or Nd for a decimal +number, the Unicode script names such as Arabic or Han, and the derived +properties Any and L&. Full lists is given in the +pcrepattern +and +pcresyntax +documentation. Only the short names for properties are supported. For example, +\p{L} matches a letter. Its Perl synonym, \p{Letter}, is not supported. +Furthermore, in Perl, many properties may optionally be prefixed by "Is", for +compatibility with Perl 5.6. PCRE does not support this. +

+
+Validity of UTF-8 strings +
+

+When you set the PCRE_UTF8 flag, the byte strings passed as patterns and +subjects are (by default) checked for validity on entry to the relevant +functions. The entire string is checked before any other processing takes +place. From release 7.3 of PCRE, the check is according the rules of RFC 3629, +which are themselves derived from the Unicode specification. Earlier releases +of PCRE followed the rules of RFC 2279, which allows the full range of 31-bit +values (0 to 0x7FFFFFFF). The current check allows only values in the range U+0 +to U+10FFFF, excluding the surrogate area. (From release 8.33 the so-called +"non-character" code points are no longer excluded because Unicode corrigendum +#9 makes it clear that they should not be.) +

+

+Characters in the "Surrogate Area" of Unicode are reserved for use by UTF-16, +where they are used in pairs to encode codepoints with values greater than +0xFFFF. The code points that are encoded by UTF-16 pairs are available +independently in the UTF-8 and UTF-32 encodings. (In other words, the whole +surrogate thing is a fudge for UTF-16 which unfortunately messes up UTF-8 and +UTF-32.) +

+

+If an invalid UTF-8 string is passed to PCRE, an error return is given. At +compile time, the only additional information is the offset to the first byte +of the failing character. The run-time functions pcre_exec() and +pcre_dfa_exec() also pass back this information, as well as a more +detailed reason code if the caller has provided memory in which to do this. +

+

+In some situations, you may already know that your strings are valid, and +therefore want to skip these checks in order to improve performance, for +example in the case of a long subject string that is being scanned repeatedly. +If you set the PCRE_NO_UTF8_CHECK flag at compile time or at run time, PCRE +assumes that the pattern or subject it is given (respectively) contains only +valid UTF-8 codes. In this case, it does not diagnose an invalid UTF-8 string. +

+

+Note that passing PCRE_NO_UTF8_CHECK to pcre_compile() just disables the +check for the pattern; it does not also apply to subject strings. If you want +to disable the check for a subject string you must pass this option to +pcre_exec() or pcre_dfa_exec(). +

+

+If you pass an invalid UTF-8 string when PCRE_NO_UTF8_CHECK is set, the result +is undefined and your program may crash. +

+
+Validity of UTF-16 strings +
+

+When you set the PCRE_UTF16 flag, the strings of 16-bit data units that are +passed as patterns and subjects are (by default) checked for validity on entry +to the relevant functions. Values other than those in the surrogate range +U+D800 to U+DFFF are independent code points. Values in the surrogate range +must be used in pairs in the correct manner. +

+

+If an invalid UTF-16 string is passed to PCRE, an error return is given. At +compile time, the only additional information is the offset to the first data +unit of the failing character. The run-time functions pcre16_exec() and +pcre16_dfa_exec() also pass back this information, as well as a more +detailed reason code if the caller has provided memory in which to do this. +

+

+In some situations, you may already know that your strings are valid, and +therefore want to skip these checks in order to improve performance. If you set +the PCRE_NO_UTF16_CHECK flag at compile time or at run time, PCRE assumes that +the pattern or subject it is given (respectively) contains only valid UTF-16 +sequences. In this case, it does not diagnose an invalid UTF-16 string. +However, if an invalid string is passed, the result is undefined. +

+
+Validity of UTF-32 strings +
+

+When you set the PCRE_UTF32 flag, the strings of 32-bit data units that are +passed as patterns and subjects are (by default) checked for validity on entry +to the relevant functions. This check allows only values in the range U+0 +to U+10FFFF, excluding the surrogate area U+D800 to U+DFFF. +

+

+If an invalid UTF-32 string is passed to PCRE, an error return is given. At +compile time, the only additional information is the offset to the first data +unit of the failing character. The run-time functions pcre32_exec() and +pcre32_dfa_exec() also pass back this information, as well as a more +detailed reason code if the caller has provided memory in which to do this. +

+

+In some situations, you may already know that your strings are valid, and +therefore want to skip these checks in order to improve performance. If you set +the PCRE_NO_UTF32_CHECK flag at compile time or at run time, PCRE assumes that +the pattern or subject it is given (respectively) contains only valid UTF-32 +sequences. In this case, it does not diagnose an invalid UTF-32 string. +However, if an invalid string is passed, the result is undefined. +

+
+General comments about UTF modes +
+

+1. Codepoints less than 256 can be specified in patterns by either braced or +unbraced hexadecimal escape sequences (for example, \x{b3} or \xb3). Larger +values have to use braced sequences. +

+

+2. Octal numbers up to \777 are recognized, and in UTF-8 mode they match +two-byte characters for values greater than \177. +

+

+3. Repeat quantifiers apply to complete UTF characters, not to individual +data units, for example: \x{100}{3}. +

+

+4. The dot metacharacter matches one UTF character instead of a single data +unit. +

+

+5. The escape sequence \C can be used to match a single byte in UTF-8 mode, or +a single 16-bit data unit in UTF-16 mode, or a single 32-bit data unit in +UTF-32 mode, but its use can lead to some strange effects because it breaks up +multi-unit characters (see the description of \C in the +pcrepattern +documentation). The use of \C is not supported in the alternative matching +function pcre[16|32]_dfa_exec(), nor is it supported in UTF mode by the +JIT optimization of pcre[16|32]_exec(). If JIT optimization is requested +for a UTF pattern that contains \C, it will not succeed, and so the matching +will be carried out by the normal interpretive function. +

+

+6. The character escapes \b, \B, \d, \D, \s, \S, \w, and \W correctly +test characters of any code value, but, by default, the characters that PCRE +recognizes as digits, spaces, or word characters remain the same set as in +non-UTF mode, all with values less than 256. This remains true even when PCRE +is built to include Unicode property support, because to do otherwise would +slow down PCRE in many common cases. Note in particular that this applies to +\b and \B, because they are defined in terms of \w and \W. If you really +want to test for a wider sense of, say, "digit", you can use explicit Unicode +property tests such as \p{Nd}. Alternatively, if you set the PCRE_UCP option, +the way that the character escapes work is changed so that Unicode properties +are used to determine which characters match. There are more details in the +section on +generic character types +in the +pcrepattern +documentation. +

+

+7. Similarly, characters that match the POSIX named character classes are all +low-valued characters, unless the PCRE_UCP option is set. +

+

+8. However, the horizontal and vertical white space matching escapes (\h, \H, +\v, and \V) do match all the appropriate Unicode characters, whether or not +PCRE_UCP is set. +

+

+9. Case-insensitive matching applies only to characters whose values are less +than 128, unless PCRE is built with Unicode property support. A few Unicode +characters such as Greek sigma have more than two codepoints that are +case-equivalent. Up to and including PCRE release 8.31, only one-to-one case +mappings were supported, but later releases (with Unicode property support) do +treat as case-equivalent all versions of characters such as Greek sigma. +

+
+AUTHOR +
+

+Philip Hazel +
+University Computing Service +
+Cambridge CB2 3QH, England. +
+

+
+REVISION +
+

+Last updated: 27 February 2013 +
+Copyright © 1997-2013 University of Cambridge. +
+

+Return to the PCRE index page. +

diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/index.html.src b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/index.html.src new file mode 100755 index 000000000..887f4d750 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/index.html.src @@ -0,0 +1,185 @@ + + + +PCRE specification + + +

Perl-compatible Regular Expressions (PCRE)

+

+The HTML documentation for PCRE consists of a number of pages that are listed +below in alphabetical order. If you are new to PCRE, please read the first one +first. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
pcre  Introductory page
pcre-config  Information about the installation configuration
pcre16  Discussion of the 16-bit PCRE library
pcre32  Discussion of the 32-bit PCRE library
pcreapi  PCRE's native API
pcrebuild  Building PCRE
pcrecallout  The callout facility
pcrecompat  Compability with Perl
pcrecpp  The C++ wrapper for the PCRE library
pcredemo  A demonstration C program that uses the PCRE library
pcregrep  The pcregrep command
pcrejit  Discussion of the just-in-time optimization support
pcrelimits  Details of size and other limits
pcrematching  Discussion of the two matching algorithms
pcrepartial  Using PCRE for partial matching
pcrepattern  Specification of the regular expressions supported by PCRE
pcreperform  Some comments on performance
pcreposix  The POSIX API to the PCRE 8-bit library
pcreprecompile  How to save and re-use compiled patterns
pcresample  Discussion of the pcredemo program
pcrestack  Discussion of PCRE's stack usage
pcresyntax  Syntax quick-reference summary
pcretest  The pcretest command for testing PCRE
pcreunicode  Discussion of Unicode and UTF-8/UTF-16/UTF-32 support
+ +

+There are also individual pages that summarize the interface for each function +in the library. There is a single page for each triple of 8-bit/16-bit/32-bit +functions. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
pcre_assign_jit_stack  Assign stack for JIT matching
pcre_compile  Compile a regular expression
pcre_compile2  Compile a regular expression (alternate interface)
pcre_config  Show build-time configuration options
pcre_copy_named_substring  Extract named substring into given buffer
pcre_copy_substring  Extract numbered substring into given buffer
pcre_dfa_exec  Match a compiled pattern to a subject string + (DFA algorithm; not Perl compatible)
pcre_exec  Match a compiled pattern to a subject string + (Perl compatible)
pcre_free_study  Free study data
pcre_free_substring  Free extracted substring
pcre_free_substring_list  Free list of extracted substrings
pcre_fullinfo  Extract information about a pattern
pcre_get_named_substring  Extract named substring into new memory
pcre_get_stringnumber  Convert captured string name to number
pcre_get_stringtable_entries  Find table entries for given string name
pcre_get_substring  Extract numbered substring into new memory
pcre_get_substring_list  Extract all substrings into new memory
pcre_jit_exec  Fast path interface to JIT matching
pcre_jit_stack_alloc  Create a stack for JIT matching
pcre_jit_stack_free  Free a JIT matching stack
pcre_maketables  Build character tables in current locale
pcre_pattern_to_host_byte_order  Convert compiled pattern to host byte order if necessary
pcre_refcount  Maintain reference count in compiled pattern
pcre_study  Study a compiled pattern
pcre_utf16_to_host_byte_order  Convert UTF-16 string to host byte order if necessary
pcre_utf32_to_host_byte_order  Convert UTF-32 string to host byte order if necessary
pcre_version  Return PCRE version and release date
+ + diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre-config.1 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre-config.1 new file mode 100755 index 000000000..52eb4fb22 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre-config.1 @@ -0,0 +1,92 @@ +.TH PCRE-CONFIG 1 "01 January 2012" "PCRE 8.30" +.SH NAME +pcre-config - program to return PCRE configuration +.SH SYNOPSIS +.rs +.sp +.nf +.B pcre-config [--prefix] [--exec-prefix] [--version] [--libs] +.B " [--libs16] [--libs32] [--libs-cpp] [--libs-posix]" +.B " [--cflags] [--cflags-posix]" +.fi +. +. +.SH DESCRIPTION +.rs +.sp +\fBpcre-config\fP returns the configuration of the installed PCRE +libraries and the options required to compile a program to use them. Some of +the options apply only to the 8-bit, or 16-bit, or 32-bit libraries, +respectively, and are +not available if only one of those libraries has been built. If an unavailable +option is encountered, the "usage" information is output. +. +. +.SH OPTIONS +.rs +.TP 10 +\fB--prefix\fP +Writes the directory prefix used in the PCRE installation for architecture +independent files (\fI/usr\fP on many systems, \fI/usr/local\fP on some +systems) to the standard output. +.TP 10 +\fB--exec-prefix\fP +Writes the directory prefix used in the PCRE installation for architecture +dependent files (normally the same as \fB--prefix\fP) to the standard output. +.TP 10 +\fB--version\fP +Writes the version number of the installed PCRE libraries to the standard +output. +.TP 10 +\fB--libs\fP +Writes to the standard output the command line options required to link +with the 8-bit PCRE library (\fB-lpcre\fP on many systems). +.TP 10 +\fB--libs16\fP +Writes to the standard output the command line options required to link +with the 16-bit PCRE library (\fB-lpcre16\fP on many systems). +.TP 10 +\fB--libs32\fP +Writes to the standard output the command line options required to link +with the 32-bit PCRE library (\fB-lpcre32\fP on many systems). +.TP 10 +\fB--libs-cpp\fP +Writes to the standard output the command line options required to link with +PCRE's C++ wrapper library (\fB-lpcrecpp\fP \fB-lpcre\fP on many +systems). +.TP 10 +\fB--libs-posix\fP +Writes to the standard output the command line options required to link with +PCRE's POSIX API wrapper library (\fB-lpcreposix\fP \fB-lpcre\fP on many +systems). +.TP 10 +\fB--cflags\fP +Writes to the standard output the command line options required to compile +files that use PCRE (this may include some \fB-I\fP options, but is blank on +many systems). +.TP 10 +\fB--cflags-posix\fP +Writes to the standard output the command line options required to compile +files that use PCRE's POSIX API wrapper library (this may include some \fB-I\fP +options, but is blank on many systems). +. +. +.SH "SEE ALSO" +.rs +.sp +\fBpcre(3)\fP +. +. +.SH AUTHOR +.rs +.sp +This manual page was originally written by Mark Baker for the Debian GNU/Linux +system. It has been subsequently revised as a generic PCRE man page. +. +. +.SH REVISION +.rs +.sp +.nf +Last updated: 24 June 2012 +.fi diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre-config.txt b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre-config.txt new file mode 100755 index 000000000..977e46868 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre-config.txt @@ -0,0 +1,86 @@ +PCRE-CONFIG(1) General Commands Manual PCRE-CONFIG(1) + + + +NAME + pcre-config - program to return PCRE configuration + +SYNOPSIS + + pcre-config [--prefix] [--exec-prefix] [--version] [--libs] + [--libs16] [--libs32] [--libs-cpp] [--libs-posix] + [--cflags] [--cflags-posix] + + +DESCRIPTION + + pcre-config returns the configuration of the installed PCRE libraries + and the options required to compile a program to use them. Some of the + options apply only to the 8-bit, or 16-bit, or 32-bit libraries, re- + spectively, and are not available if only one of those libraries has + been built. If an unavailable option is encountered, the "usage" infor- + mation is output. + + +OPTIONS + + --prefix Writes the directory prefix used in the PCRE installation for + architecture independent files (/usr on many systems, + /usr/local on some systems) to the standard output. + + --exec-prefix + Writes the directory prefix used in the PCRE installation for + architecture dependent files (normally the same as --prefix) + to the standard output. + + --version Writes the version number of the installed PCRE libraries to + the standard output. + + --libs Writes to the standard output the command line options re- + quired to link with the 8-bit PCRE library (-lpcre on many + systems). + + --libs16 Writes to the standard output the command line options re- + quired to link with the 16-bit PCRE library (-lpcre16 on many + systems). + + --libs32 Writes to the standard output the command line options re- + quired to link with the 32-bit PCRE library (-lpcre32 on many + systems). + + --libs-cpp + Writes to the standard output the command line options re- + quired to link with PCRE's C++ wrapper library (-lpcrecpp + -lpcre on many systems). + + --libs-posix + Writes to the standard output the command line options re- + quired to link with PCRE's POSIX API wrapper library + (-lpcreposix -lpcre on many systems). + + --cflags Writes to the standard output the command line options re- + quired to compile files that use PCRE (this may include some + -I options, but is blank on many systems). + + --cflags-posix + Writes to the standard output the command line options re- + quired to compile files that use PCRE's POSIX API wrapper li- + brary (this may include some -I options, but is blank on many + systems). + + +SEE ALSO + + pcre(3) + + +AUTHOR + + This manual page was originally written by Mark Baker for the Debian + GNU/Linux system. It has been subsequently revised as a generic PCRE + man page. + + +REVISION + + Last updated: 24 June 2012 diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre.3 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre.3 new file mode 100755 index 000000000..716d58044 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre.3 @@ -0,0 +1,230 @@ +.TH PCRE 3 "10 February 2015" "PCRE 8.37" +.SH NAME +PCRE - Perl-compatible regular expressions (original API) +.SH "PLEASE TAKE NOTE" +.rs +.sp +This document relates to PCRE releases that use the original API, +with library names libpcre, libpcre16, and libpcre32. January 2015 saw the +first release of a new API, known as PCRE2, with release numbers starting at +10.00 and library names libpcre2-8, libpcre2-16, and libpcre2-32. The old +libraries (now called PCRE1) are still being maintained for bug fixes, but +there will be no new development. New projects are advised to use the new PCRE2 +libraries. +. +. +.SH INTRODUCTION +.rs +.sp +The PCRE library is a set of functions that implement regular expression +pattern matching using the same syntax and semantics as Perl, with just a few +differences. Some features that appeared in Python and PCRE before they +appeared in Perl are also available using the Python syntax, there is some +support for one or two .NET and Oniguruma syntax items, and there is an option +for requesting some minor changes that give better JavaScript compatibility. +.P +Starting with release 8.30, it is possible to compile two separate PCRE +libraries: the original, which supports 8-bit character strings (including +UTF-8 strings), and a second library that supports 16-bit character strings +(including UTF-16 strings). The build process allows either one or both to be +built. The majority of the work to make this possible was done by Zoltan +Herczeg. +.P +Starting with release 8.32 it is possible to compile a third separate PCRE +library that supports 32-bit character strings (including UTF-32 strings). The +build process allows any combination of the 8-, 16- and 32-bit libraries. The +work to make this possible was done by Christian Persch. +.P +The three libraries contain identical sets of functions, except that the names +in the 16-bit library start with \fBpcre16_\fP instead of \fBpcre_\fP, and the +names in the 32-bit library start with \fBpcre32_\fP instead of \fBpcre_\fP. To +avoid over-complication and reduce the documentation maintenance load, most of +the documentation describes the 8-bit library, with the differences for the +16-bit and 32-bit libraries described separately in the +.\" HREF +\fBpcre16\fP +and +.\" HREF +\fBpcre32\fP +.\" +pages. References to functions or structures of the form \fIpcre[16|32]_xxx\fP +should be read as meaning "\fIpcre_xxx\fP when using the 8-bit library, +\fIpcre16_xxx\fP when using the 16-bit library, or \fIpcre32_xxx\fP when using +the 32-bit library". +.P +The current implementation of PCRE corresponds approximately with Perl 5.12, +including support for UTF-8/16/32 encoded strings and Unicode general category +properties. However, UTF-8/16/32 and Unicode support has to be explicitly +enabled; it is not the default. The Unicode tables correspond to Unicode +release 6.3.0. +.P +In addition to the Perl-compatible matching function, PCRE contains an +alternative function that matches the same compiled patterns in a different +way. In certain circumstances, the alternative function has some advantages. +For a discussion of the two matching algorithms, see the +.\" HREF +\fBpcrematching\fP +.\" +page. +.P +PCRE is written in C and released as a C library. A number of people have +written wrappers and interfaces of various kinds. In particular, Google Inc. +have provided a comprehensive C++ wrapper for the 8-bit library. This is now +included as part of the PCRE distribution. The +.\" HREF +\fBpcrecpp\fP +.\" +page has details of this interface. Other people's contributions can be found +in the \fIContrib\fP directory at the primary FTP site, which is: +.sp +.\" HTML +.\" +ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre +.\" +.P +Details of exactly which Perl regular expression features are and are not +supported by PCRE are given in separate documents. See the +.\" HREF +\fBpcrepattern\fP +.\" +and +.\" HREF +\fBpcrecompat\fP +.\" +pages. There is a syntax summary in the +.\" HREF +\fBpcresyntax\fP +.\" +page. +.P +Some features of PCRE can be included, excluded, or changed when the library is +built. The +.\" HREF +\fBpcre_config()\fP +.\" +function makes it possible for a client to discover which features are +available. The features themselves are described in the +.\" HREF +\fBpcrebuild\fP +.\" +page. Documentation about building PCRE for various operating systems can be +found in the +.\" HTML +.\" +\fBREADME\fP +.\" +and +.\" HTML +.\" +\fBNON-AUTOTOOLS_BUILD\fP +.\" +files in the source distribution. +.P +The libraries contains a number of undocumented internal functions and data +tables that are used by more than one of the exported external functions, but +which are not intended for use by external callers. Their names all begin with +"_pcre_" or "_pcre16_" or "_pcre32_", which hopefully will not provoke any name +clashes. In some environments, it is possible to control which external symbols +are exported when a shared library is built, and in these cases the +undocumented symbols are not exported. +. +. +.SH "SECURITY CONSIDERATIONS" +.rs +.sp +If you are using PCRE in a non-UTF application that permits users to supply +arbitrary patterns for compilation, you should be aware of a feature that +allows users to turn on UTF support from within a pattern, provided that PCRE +was built with UTF support. For example, an 8-bit pattern that begins with +"(*UTF8)" or "(*UTF)" turns on UTF-8 mode, which interprets patterns and +subjects as strings of UTF-8 characters instead of individual 8-bit characters. +This causes both the pattern and any data against which it is matched to be +checked for UTF-8 validity. If the data string is very long, such a check might +use sufficiently many resources as to cause your application to lose +performance. +.P +One way of guarding against this possibility is to use the +\fBpcre_fullinfo()\fP function to check the compiled pattern's options for UTF. +Alternatively, from release 8.33, you can set the PCRE_NEVER_UTF option at +compile time. This causes a compile time error if a pattern contains a +UTF-setting sequence. +.P +If your application is one that supports UTF, be aware that validity checking +can take time. If the same data string is to be matched many times, you can use +the PCRE_NO_UTF[8|16|32]_CHECK option for the second and subsequent matches to +save redundant checks. +.P +Another way that performance can be hit is by running a pattern that has a very +large search tree against a string that will never match. Nested unlimited +repeats in a pattern are a common example. PCRE provides some protection +against this: see the PCRE_EXTRA_MATCH_LIMIT feature in the +.\" HREF +\fBpcreapi\fP +.\" +page. +. +. +.SH "USER DOCUMENTATION" +.rs +.sp +The user documentation for PCRE comprises a number of different sections. In +the "man" format, each of these is a separate "man page". In the HTML format, +each is a separate page, linked from the index page. In the plain text format, +the descriptions of the \fBpcregrep\fP and \fBpcretest\fP programs are in files +called \fBpcregrep.txt\fP and \fBpcretest.txt\fP, respectively. The remaining +sections, except for the \fBpcredemo\fP section (which is a program listing), +are concatenated in \fBpcre.txt\fP, for ease of searching. The sections are as +follows: +.sp + pcre this document + pcre-config show PCRE installation configuration information + pcre16 details of the 16-bit library + pcre32 details of the 32-bit library + pcreapi details of PCRE's native C API + pcrebuild building PCRE + pcrecallout details of the callout feature + pcrecompat discussion of Perl compatibility + pcrecpp details of the C++ wrapper for the 8-bit library + pcredemo a demonstration C program that uses PCRE + pcregrep description of the \fBpcregrep\fP command (8-bit only) + pcrejit discussion of the just-in-time optimization support + pcrelimits details of size and other limits + pcrematching discussion of the two matching algorithms + pcrepartial details of the partial matching facility +.\" JOIN + pcrepattern syntax and semantics of supported + regular expressions + pcreperform discussion of performance issues + pcreposix the POSIX-compatible C API for the 8-bit library + pcreprecompile details of saving and re-using precompiled patterns + pcresample discussion of the pcredemo program + pcrestack discussion of stack usage + pcresyntax quick syntax reference + pcretest description of the \fBpcretest\fP testing command + pcreunicode discussion of Unicode and UTF-8/16/32 support +.sp +In the "man" and HTML formats, there is also a short page for each C library +function, listing its arguments and results. +. +. +.SH AUTHOR +.rs +.sp +.nf +Philip Hazel +University Computing Service +Cambridge CB2 3QH, England. +.fi +.P +Putting an actual email address here seems to have been a spam magnet, so I've +taken it away. If you want to email me, use my two initials, followed by the +two digits 10, at the domain cam.ac.uk. +. +. +.SH REVISION +.rs +.sp +.nf +Last updated: 10 February 2015 +Copyright (c) 1997-2015 University of Cambridge. +.fi diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre.txt b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre.txt new file mode 100755 index 000000000..8ffc90234 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre.txt @@ -0,0 +1,10495 @@ +----------------------------------------------------------------------------- +This file contains a concatenation of the PCRE man pages, converted to plain +text format for ease of searching with a text editor, or for use on systems +that do not have a man page processor. The small individual files that give +synopses of each function in the library have not been included. Neither has +the pcredemo program. There are separate text files for the pcregrep and +pcretest commands. +----------------------------------------------------------------------------- + + +PCRE(3) Library Functions Manual PCRE(3) + + + +NAME + PCRE - Perl-compatible regular expressions (original API) + +PLEASE TAKE NOTE + + This document relates to PCRE releases that use the original API, with + library names libpcre, libpcre16, and libpcre32. January 2015 saw the + first release of a new API, known as PCRE2, with release numbers start- + ing at 10.00 and library names libpcre2-8, libpcre2-16, and + libpcre2-32. The old libraries (now called PCRE1) are still being main- + tained for bug fixes, but there will be no new development. New + projects are advised to use the new PCRE2 libraries. + + +INTRODUCTION + + The PCRE library is a set of functions that implement regular expres- + sion pattern matching using the same syntax and semantics as Perl, with + just a few differences. Some features that appeared in Python and PCRE + before they appeared in Perl are also available using the Python syn- + tax, there is some support for one or two .NET and Oniguruma syntax + items, and there is an option for requesting some minor changes that + give better JavaScript compatibility. + + Starting with release 8.30, it is possible to compile two separate PCRE + libraries: the original, which supports 8-bit character strings (in- + cluding UTF-8 strings), and a second library that supports 16-bit char- + acter strings (including UTF-16 strings). The build process allows ei- + ther one or both to be built. The majority of the work to make this + possible was done by Zoltan Herczeg. + + Starting with release 8.32 it is possible to compile a third separate + PCRE library that supports 32-bit character strings (including UTF-32 + strings). The build process allows any combination of the 8-, 16- and + 32-bit libraries. The work to make this possible was done by Christian + Persch. + + The three libraries contain identical sets of functions, except that + the names in the 16-bit library start with pcre16_ instead of pcre_, + and the names in the 32-bit library start with pcre32_ instead of + pcre_. To avoid over-complication and reduce the documentation mainte- + nance load, most of the documentation describes the 8-bit library, with + the differences for the 16-bit and 32-bit libraries described sepa- + rately in the pcre16 and pcre32 pages. References to functions or + structures of the form pcre[16|32]_xxx should be read as meaning + "pcre_xxx when using the 8-bit library, pcre16_xxx when using the + 16-bit library, or pcre32_xxx when using the 32-bit library". + + The current implementation of PCRE corresponds approximately with Perl + 5.12, including support for UTF-8/16/32 encoded strings and Unicode + general category properties. However, UTF-8/16/32 and Unicode support + has to be explicitly enabled; it is not the default. The Unicode tables + correspond to Unicode release 6.3.0. + + In addition to the Perl-compatible matching function, PCRE contains an + alternative function that matches the same compiled patterns in a dif- + ferent way. In certain circumstances, the alternative function has some + advantages. For a discussion of the two matching algorithms, see the + pcrematching page. + + PCRE is written in C and released as a C library. A number of people + have written wrappers and interfaces of various kinds. In particular, + Google Inc. have provided a comprehensive C++ wrapper for the 8-bit + library. This is now included as part of the PCRE distribution. The + pcrecpp page has details of this interface. Other people's contribu- + tions can be found in the Contrib directory at the primary FTP site, + which is: + + ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre + + Details of exactly which Perl regular expression features are and are + not supported by PCRE are given in separate documents. See the pcrepat- + tern and pcrecompat pages. There is a syntax summary in the pcresyntax + page. + + Some features of PCRE can be included, excluded, or changed when the + library is built. The pcre_config() function makes it possible for a + client to discover which features are available. The features them- + selves are described in the pcrebuild page. Documentation about build- + ing PCRE for various operating systems can be found in the README and + NON-AUTOTOOLS_BUILD files in the source distribution. + + The libraries contains a number of undocumented internal functions and + data tables that are used by more than one of the exported external + functions, but which are not intended for use by external callers. + Their names all begin with "_pcre_" or "_pcre16_" or "_pcre32_", which + hopefully will not provoke any name clashes. In some environments, it + is possible to control which external symbols are exported when a + shared library is built, and in these cases the undocumented symbols + are not exported. + + +SECURITY CONSIDERATIONS + + If you are using PCRE in a non-UTF application that permits users to + supply arbitrary patterns for compilation, you should be aware of a + feature that allows users to turn on UTF support from within a pattern, + provided that PCRE was built with UTF support. For example, an 8-bit + pattern that begins with "(*UTF8)" or "(*UTF)" turns on UTF-8 mode, + which interprets patterns and subjects as strings of UTF-8 characters + instead of individual 8-bit characters. This causes both the pattern + and any data against which it is matched to be checked for UTF-8 valid- + ity. If the data string is very long, such a check might use suffi- + ciently many resources as to cause your application to lose perfor- + mance. + + One way of guarding against this possibility is to use the + pcre_fullinfo() function to check the compiled pattern's options for + UTF. Alternatively, from release 8.33, you can set the PCRE_NEVER_UTF + option at compile time. This causes a compile time error if a pattern + contains a UTF-setting sequence. + + If your application is one that supports UTF, be aware that validity + checking can take time. If the same data string is to be matched many + times, you can use the PCRE_NO_UTF[8|16|32]_CHECK option for the second + and subsequent matches to save redundant checks. + + Another way that performance can be hit is by running a pattern that + has a very large search tree against a string that will never match. + Nested unlimited repeats in a pattern are a common example. PCRE pro- + vides some protection against this: see the PCRE_EXTRA_MATCH_LIMIT fea- + ture in the pcreapi page. + + +USER DOCUMENTATION + + The user documentation for PCRE comprises a number of different sec- + tions. In the "man" format, each of these is a separate "man page". In + the HTML format, each is a separate page, linked from the index page. + In the plain text format, the descriptions of the pcregrep and pcretest + programs are in files called pcregrep.txt and pcretest.txt, respec- + tively. The remaining sections, except for the pcredemo section (which + is a program listing), are concatenated in pcre.txt, for ease of + searching. The sections are as follows: + + pcre this document + pcre-config show PCRE installation configuration information + pcre16 details of the 16-bit library + pcre32 details of the 32-bit library + pcreapi details of PCRE's native C API + pcrebuild building PCRE + pcrecallout details of the callout feature + pcrecompat discussion of Perl compatibility + pcrecpp details of the C++ wrapper for the 8-bit library + pcredemo a demonstration C program that uses PCRE + pcregrep description of the pcregrep command (8-bit only) + pcrejit discussion of the just-in-time optimization support + pcrelimits details of size and other limits + pcrematching discussion of the two matching algorithms + pcrepartial details of the partial matching facility + pcrepattern syntax and semantics of supported + regular expressions + pcreperform discussion of performance issues + pcreposix the POSIX-compatible C API for the 8-bit library + pcreprecompile details of saving and re-using precompiled patterns + pcresample discussion of the pcredemo program + pcrestack discussion of stack usage + pcresyntax quick syntax reference + pcretest description of the pcretest testing command + pcreunicode discussion of Unicode and UTF-8/16/32 support + + In the "man" and HTML formats, there is also a short page for each C + library function, listing its arguments and results. + + +AUTHOR + + Philip Hazel + University Computing Service + Cambridge CB2 3QH, England. + + Putting an actual email address here seems to have been a spam magnet, + so I've taken it away. If you want to email me, use my two initials, + followed by the two digits 10, at the domain cam.ac.uk. + + +REVISION + + Last updated: 10 February 2015 + Copyright (c) 1997-2015 University of Cambridge. +------------------------------------------------------------------------------ + + +PCRE(3) Library Functions Manual PCRE(3) + + + +NAME + PCRE - Perl-compatible regular expressions + + #include + + +PCRE 16-BIT API BASIC FUNCTIONS + + pcre16 *pcre16_compile(PCRE_SPTR16 pattern, int options, + const char **errptr, int *erroffset, + const unsigned char *tableptr); + + pcre16 *pcre16_compile2(PCRE_SPTR16 pattern, int options, + int *errorcodeptr, + const char **errptr, int *erroffset, + const unsigned char *tableptr); + + pcre16_extra *pcre16_study(const pcre16 *code, int options, + const char **errptr); + + void pcre16_free_study(pcre16_extra *extra); + + int pcre16_exec(const pcre16 *code, const pcre16_extra *extra, + PCRE_SPTR16 subject, int length, int startoffset, + int options, int *ovector, int ovecsize); + + int pcre16_dfa_exec(const pcre16 *code, const pcre16_extra *extra, + PCRE_SPTR16 subject, int length, int startoffset, + int options, int *ovector, int ovecsize, + int *workspace, int wscount); + + +PCRE 16-BIT API STRING EXTRACTION FUNCTIONS + + int pcre16_copy_named_substring(const pcre16 *code, + PCRE_SPTR16 subject, int *ovector, + int stringcount, PCRE_SPTR16 stringname, + PCRE_UCHAR16 *buffer, int buffersize); + + int pcre16_copy_substring(PCRE_SPTR16 subject, int *ovector, + int stringcount, int stringnumber, PCRE_UCHAR16 *buffer, + int buffersize); + + int pcre16_get_named_substring(const pcre16 *code, + PCRE_SPTR16 subject, int *ovector, + int stringcount, PCRE_SPTR16 stringname, + PCRE_SPTR16 *stringptr); + + int pcre16_get_stringnumber(const pcre16 *code, + PCRE_SPTR16 name); + + int pcre16_get_stringtable_entries(const pcre16 *code, + PCRE_SPTR16 name, PCRE_UCHAR16 **first, PCRE_UCHAR16 **last); + + int pcre16_get_substring(PCRE_SPTR16 subject, int *ovector, + int stringcount, int stringnumber, + PCRE_SPTR16 *stringptr); + + int pcre16_get_substring_list(PCRE_SPTR16 subject, + int *ovector, int stringcount, PCRE_SPTR16 **listptr); + + void pcre16_free_substring(PCRE_SPTR16 stringptr); + + void pcre16_free_substring_list(PCRE_SPTR16 *stringptr); + + +PCRE 16-BIT API AUXILIARY FUNCTIONS + + pcre16_jit_stack *pcre16_jit_stack_alloc(int startsize, int maxsize); + + void pcre16_jit_stack_free(pcre16_jit_stack *stack); + + void pcre16_assign_jit_stack(pcre16_extra *extra, + pcre16_jit_callback callback, void *data); + + const unsigned char *pcre16_maketables(void); + + int pcre16_fullinfo(const pcre16 *code, const pcre16_extra *extra, + int what, void *where); + + int pcre16_refcount(pcre16 *code, int adjust); + + int pcre16_config(int what, void *where); + + const char *pcre16_version(void); + + int pcre16_pattern_to_host_byte_order(pcre16 *code, + pcre16_extra *extra, const unsigned char *tables); + + +PCRE 16-BIT API INDIRECTED FUNCTIONS + + void *(*pcre16_malloc)(size_t); + + void (*pcre16_free)(void *); + + void *(*pcre16_stack_malloc)(size_t); + + void (*pcre16_stack_free)(void *); + + int (*pcre16_callout)(pcre16_callout_block *); + + +PCRE 16-BIT API 16-BIT-ONLY FUNCTION + + int pcre16_utf16_to_host_byte_order(PCRE_UCHAR16 *output, + PCRE_SPTR16 input, int length, int *byte_order, + int keep_boms); + + +THE PCRE 16-BIT LIBRARY + + Starting with release 8.30, it is possible to compile a PCRE library + that supports 16-bit character strings, including UTF-16 strings, as + well as or instead of the original 8-bit library. The majority of the + work to make this possible was done by Zoltan Herczeg. The two li- + braries contain identical sets of functions, used in exactly the same + way. Only the names of the functions and the data types of their argu- + ments and results are different. To avoid over-complication and reduce + the documentation maintenance load, most of the PCRE documentation de- + scribes the 8-bit library, with only occasional references to the + 16-bit library. This page describes what is different when you use the + 16-bit library. + + WARNING: A single application can be linked with both libraries, but + you must take care when processing any particular pattern to use func- + tions from just one library. For example, if you want to study a pat- + tern that was compiled with pcre16_compile(), you must do so with + pcre16_study(), not pcre_study(), and you must free the study data with + pcre16_free_study(). + + +THE HEADER FILE + + There is only one header file, pcre.h. It contains prototypes for all + the functions in all libraries, as well as definitions of flags, struc- + tures, error codes, etc. + + +THE LIBRARY NAME + + In Unix-like systems, the 16-bit library is called libpcre16, and can + normally be accesss by adding -lpcre16 to the command for linking an + application that uses PCRE. + + +STRING TYPES + + In the 8-bit library, strings are passed to PCRE library functions as + vectors of bytes with the C type "char *". In the 16-bit library, + strings are passed as vectors of unsigned 16-bit quantities. The macro + PCRE_UCHAR16 specifies an appropriate data type, and PCRE_SPTR16 is de- + fined as "const PCRE_UCHAR16 *". In very many environments, "short int" + is a 16-bit data type. When PCRE is built, it defines PCRE_UCHAR16 as + "unsigned short int", but checks that it really is a 16-bit data type. + If it is not, the build fails with an error message telling the main- + tainer to modify the definition appropriately. + + +STRUCTURE TYPES + + The types of the opaque structures that are used for compiled 16-bit + patterns and JIT stacks are pcre16 and pcre16_jit_stack respectively. + The type of the user-accessible structure that is returned by + pcre16_study() is pcre16_extra, and the type of the structure that is + used for passing data to a callout function is pcre16_callout_block. + These structures contain the same fields, with the same names, as their + 8-bit counterparts. The only difference is that pointers to character + strings are 16-bit instead of 8-bit types. + + +16-BIT FUNCTIONS + + For every function in the 8-bit library there is a corresponding func- + tion in the 16-bit library with a name that starts with pcre16_ instead + of pcre_. The prototypes are listed above. In addition, there is one + extra function, pcre16_utf16_to_host_byte_order(). This is a utility + function that converts a UTF-16 character string to host byte order if + necessary. The other 16-bit functions expect the strings they are + passed to be in host byte order. + + The input and output arguments of pcre16_utf16_to_host_byte_order() may + point to the same address, that is, conversion in place is supported. + The output buffer must be at least as long as the input. + + The length argument specifies the number of 16-bit data units in the + input string; a negative value specifies a zero-terminated string. + + If byte_order is NULL, it is assumed that the string starts off in host + byte order. This may be changed by byte-order marks (BOMs) anywhere in + the string (commonly as the first character). + + If byte_order is not NULL, a non-zero value of the integer to which it + points means that the input starts off in host byte order, otherwise + the opposite order is assumed. Again, BOMs in the string can change + this. The final byte order is passed back at the end of processing. + + If keep_boms is not zero, byte-order mark characters (0xfeff) are + copied into the output string. Otherwise they are discarded. + + The result of the function is the number of 16-bit units placed into + the output buffer, including the zero terminator if the string was + zero-terminated. + + +SUBJECT STRING OFFSETS + + The lengths and starting offsets of subject strings must be specified + in 16-bit data units, and the offsets within subject strings that are + returned by the matching functions are in also 16-bit units rather than + bytes. + + +NAMED SUBPATTERNS + + The name-to-number translation table that is maintained for named sub- + patterns uses 16-bit characters. The pcre16_get_stringtable_entries() + function returns the length of each entry in the table as the number of + 16-bit data units. + + +OPTION NAMES + + There are two new general option names, PCRE_UTF16 and + PCRE_NO_UTF16_CHECK, which correspond to PCRE_UTF8 and + PCRE_NO_UTF8_CHECK in the 8-bit library. In fact, these new options de- + fine the same bits in the options word. There is a discussion about the + validity of UTF-16 strings in the pcreunicode page. + + For the pcre16_config() function there is an option PCRE_CONFIG_UTF16 + that returns 1 if UTF-16 support is configured, otherwise 0. If this + option is given to pcre_config() or pcre32_config(), or if the + PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF32 option is given to pcre16_con- + fig(), the result is the PCRE_ERROR_BADOPTION error. + + +CHARACTER CODES + + In 16-bit mode, when PCRE_UTF16 is not set, character values are + treated in the same way as in 8-bit, non UTF-8 mode, except, of course, + that they can range from 0 to 0xffff instead of 0 to 0xff. Character + types for characters less than 0xff can therefore be influenced by the + locale in the same way as before. Characters greater than 0xff have + only one case, and no "type" (such as letter or digit). + + In UTF-16 mode, the character code is Unicode, in the range 0 to + 0x10ffff, with the exception of values in the range 0xd800 to 0xdfff + because those are "surrogate" values that are used in pairs to encode + values greater than 0xffff. + + A UTF-16 string can indicate its endianness by special code knows as a + byte-order mark (BOM). The PCRE functions do not handle this, expecting + strings to be in host byte order. A utility function called + pcre16_utf16_to_host_byte_order() is provided to help with this (see + above). + + +ERROR NAMES + + The errors PCRE_ERROR_BADUTF16_OFFSET and PCRE_ERROR_SHORTUTF16 corre- + spond to their 8-bit counterparts. The error PCRE_ERROR_BADMODE is + given when a compiled pattern is passed to a function that processes + patterns in the other mode, for example, if a pattern compiled with + pcre_compile() is passed to pcre16_exec(). + + There are new error codes whose names begin with PCRE_UTF16_ERR for in- + valid UTF-16 strings, corresponding to the PCRE_UTF8_ERR codes for + UTF-8 strings that are described in the section entitled "Reason codes + for invalid UTF-8 strings" in the main pcreapi page. The UTF-16 errors + are: + + PCRE_UTF16_ERR1 Missing low surrogate at end of string + PCRE_UTF16_ERR2 Invalid low surrogate follows high surrogate + PCRE_UTF16_ERR3 Isolated low surrogate + PCRE_UTF16_ERR4 Non-character + + +ERROR TEXTS + + If there is an error while compiling a pattern, the error text that is + passed back by pcre16_compile() or pcre16_compile2() is still an 8-bit + character string, zero-terminated. + + +CALLOUTS + + The subject and mark fields in the callout block that is passed to a + callout function point to 16-bit vectors. + + +TESTING + + The pcretest program continues to operate with 8-bit input and output + files, but it can be used for testing the 16-bit library. If it is run + with the command line option -16, patterns and subject strings are con- + verted from 8-bit to 16-bit before being passed to PCRE, and the 16-bit + library functions are used instead of the 8-bit ones. Returned 16-bit + strings are converted to 8-bit for output. If both the 8-bit and the + 32-bit libraries were not compiled, pcretest defaults to 16-bit and the + -16 option is ignored. + + When PCRE is being built, the RunTest script that is called by "make + check" uses the pcretest -C option to discover which of the 8-bit, + 16-bit and 32-bit libraries has been built, and runs the tests appro- + priately. + + +NOT SUPPORTED IN 16-BIT MODE + + Not all the features of the 8-bit library are available with the 16-bit + library. The C++ and POSIX wrapper functions support only the 8-bit li- + brary, and the pcregrep program is at present 8-bit only. + + +AUTHOR + + Philip Hazel + University Computing Service + Cambridge CB2 3QH, England. + + +REVISION + + Last updated: 12 May 2013 + Copyright (c) 1997-2013 University of Cambridge. +------------------------------------------------------------------------------ + + +PCRE(3) Library Functions Manual PCRE(3) + + + +NAME + PCRE - Perl-compatible regular expressions + + #include + + +PCRE 32-BIT API BASIC FUNCTIONS + + pcre32 *pcre32_compile(PCRE_SPTR32 pattern, int options, + const char **errptr, int *erroffset, + const unsigned char *tableptr); + + pcre32 *pcre32_compile2(PCRE_SPTR32 pattern, int options, + int *errorcodeptr, + const unsigned char *tableptr); + + pcre32_extra *pcre32_study(const pcre32 *code, int options, + const char **errptr); + + void pcre32_free_study(pcre32_extra *extra); + + int pcre32_exec(const pcre32 *code, const pcre32_extra *extra, + PCRE_SPTR32 subject, int length, int startoffset, + int options, int *ovector, int ovecsize); + + int pcre32_dfa_exec(const pcre32 *code, const pcre32_extra *extra, + PCRE_SPTR32 subject, int length, int startoffset, + int options, int *ovector, int ovecsize, + int *workspace, int wscount); + + +PCRE 32-BIT API STRING EXTRACTION FUNCTIONS + + int pcre32_copy_named_substring(const pcre32 *code, + PCRE_SPTR32 subject, int *ovector, + int stringcount, PCRE_SPTR32 stringname, + PCRE_UCHAR32 *buffer, int buffersize); + + int pcre32_copy_substring(PCRE_SPTR32 subject, int *ovector, + int stringcount, int stringnumber, PCRE_UCHAR32 *buffer, + int buffersize); + + int pcre32_get_named_substring(const pcre32 *code, + PCRE_SPTR32 subject, int *ovector, + int stringcount, PCRE_SPTR32 stringname, + PCRE_SPTR32 *stringptr); + + int pcre32_get_stringnumber(const pcre32 *code, + PCRE_SPTR32 name); + + int pcre32_get_stringtable_entries(const pcre32 *code, + PCRE_SPTR32 name, PCRE_UCHAR32 **first, PCRE_UCHAR32 **last); + + int pcre32_get_substring(PCRE_SPTR32 subject, int *ovector, + int stringcount, int stringnumber, + PCRE_SPTR32 *stringptr); + + int pcre32_get_substring_list(PCRE_SPTR32 subject, + int *ovector, int stringcount, PCRE_SPTR32 **listptr); + + void pcre32_free_substring(PCRE_SPTR32 stringptr); + + void pcre32_free_substring_list(PCRE_SPTR32 *stringptr); + + +PCRE 32-BIT API AUXILIARY FUNCTIONS + + pcre32_jit_stack *pcre32_jit_stack_alloc(int startsize, int maxsize); + + void pcre32_jit_stack_free(pcre32_jit_stack *stack); + + void pcre32_assign_jit_stack(pcre32_extra *extra, + pcre32_jit_callback callback, void *data); + + const unsigned char *pcre32_maketables(void); + + int pcre32_fullinfo(const pcre32 *code, const pcre32_extra *extra, + int what, void *where); + + int pcre32_refcount(pcre32 *code, int adjust); + + int pcre32_config(int what, void *where); + + const char *pcre32_version(void); + + int pcre32_pattern_to_host_byte_order(pcre32 *code, + pcre32_extra *extra, const unsigned char *tables); + + +PCRE 32-BIT API INDIRECTED FUNCTIONS + + void *(*pcre32_malloc)(size_t); + + void (*pcre32_free)(void *); + + void *(*pcre32_stack_malloc)(size_t); + + void (*pcre32_stack_free)(void *); + + int (*pcre32_callout)(pcre32_callout_block *); + + +PCRE 32-BIT API 32-BIT-ONLY FUNCTION + + int pcre32_utf32_to_host_byte_order(PCRE_UCHAR32 *output, + PCRE_SPTR32 input, int length, int *byte_order, + int keep_boms); + + +THE PCRE 32-BIT LIBRARY + + Starting with release 8.32, it is possible to compile a PCRE library + that supports 32-bit character strings, including UTF-32 strings, as + well as or instead of the original 8-bit library. This work was done by + Christian Persch, based on the work done by Zoltan Herczeg for the + 16-bit library. All three libraries contain identical sets of func- + tions, used in exactly the same way. Only the names of the functions + and the data types of their arguments and results are different. To + avoid over-complication and reduce the documentation maintenance load, + most of the PCRE documentation describes the 8-bit library, with only + occasional references to the 16-bit and 32-bit libraries. This page de- + scribes what is different when you use the 32-bit library. + + WARNING: A single application can be linked with all or any of the + three libraries, but you must take care when processing any particular + pattern to use functions from just one library. For example, if you + want to study a pattern that was compiled with pcre32_compile(), you + must do so with pcre32_study(), not pcre_study(), and you must free the + study data with pcre32_free_study(). + + +THE HEADER FILE + + There is only one header file, pcre.h. It contains prototypes for all + the functions in all libraries, as well as definitions of flags, struc- + tures, error codes, etc. + + +THE LIBRARY NAME + + In Unix-like systems, the 32-bit library is called libpcre32, and can + normally be accesss by adding -lpcre32 to the command for linking an + application that uses PCRE. + + +STRING TYPES + + In the 8-bit library, strings are passed to PCRE library functions as + vectors of bytes with the C type "char *". In the 32-bit library, + strings are passed as vectors of unsigned 32-bit quantities. The macro + PCRE_UCHAR32 specifies an appropriate data type, and PCRE_SPTR32 is de- + fined as "const PCRE_UCHAR32 *". In very many environments, "unsigned + int" is a 32-bit data type. When PCRE is built, it defines PCRE_UCHAR32 + as "unsigned int", but checks that it really is a 32-bit data type. If + it is not, the build fails with an error message telling the maintainer + to modify the definition appropriately. + + +STRUCTURE TYPES + + The types of the opaque structures that are used for compiled 32-bit + patterns and JIT stacks are pcre32 and pcre32_jit_stack respectively. + The type of the user-accessible structure that is returned by + pcre32_study() is pcre32_extra, and the type of the structure that is + used for passing data to a callout function is pcre32_callout_block. + These structures contain the same fields, with the same names, as their + 8-bit counterparts. The only difference is that pointers to character + strings are 32-bit instead of 8-bit types. + + +32-BIT FUNCTIONS + + For every function in the 8-bit library there is a corresponding func- + tion in the 32-bit library with a name that starts with pcre32_ instead + of pcre_. The prototypes are listed above. In addition, there is one + extra function, pcre32_utf32_to_host_byte_order(). This is a utility + function that converts a UTF-32 character string to host byte order if + necessary. The other 32-bit functions expect the strings they are + passed to be in host byte order. + + The input and output arguments of pcre32_utf32_to_host_byte_order() may + point to the same address, that is, conversion in place is supported. + The output buffer must be at least as long as the input. + + The length argument specifies the number of 32-bit data units in the + input string; a negative value specifies a zero-terminated string. + + If byte_order is NULL, it is assumed that the string starts off in host + byte order. This may be changed by byte-order marks (BOMs) anywhere in + the string (commonly as the first character). + + If byte_order is not NULL, a non-zero value of the integer to which it + points means that the input starts off in host byte order, otherwise + the opposite order is assumed. Again, BOMs in the string can change + this. The final byte order is passed back at the end of processing. + + If keep_boms is not zero, byte-order mark characters (0xfeff) are + copied into the output string. Otherwise they are discarded. + + The result of the function is the number of 32-bit units placed into + the output buffer, including the zero terminator if the string was + zero-terminated. + + +SUBJECT STRING OFFSETS + + The lengths and starting offsets of subject strings must be specified + in 32-bit data units, and the offsets within subject strings that are + returned by the matching functions are in also 32-bit units rather than + bytes. + + +NAMED SUBPATTERNS + + The name-to-number translation table that is maintained for named sub- + patterns uses 32-bit characters. The pcre32_get_stringtable_entries() + function returns the length of each entry in the table as the number of + 32-bit data units. + + +OPTION NAMES + + There are two new general option names, PCRE_UTF32 and + PCRE_NO_UTF32_CHECK, which correspond to PCRE_UTF8 and + PCRE_NO_UTF8_CHECK in the 8-bit library. In fact, these new options de- + fine the same bits in the options word. There is a discussion about the + validity of UTF-32 strings in the pcreunicode page. + + For the pcre32_config() function there is an option PCRE_CONFIG_UTF32 + that returns 1 if UTF-32 support is configured, otherwise 0. If this + option is given to pcre_config() or pcre16_config(), or if the + PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF16 option is given to pcre32_con- + fig(), the result is the PCRE_ERROR_BADOPTION error. + + +CHARACTER CODES + + In 32-bit mode, when PCRE_UTF32 is not set, character values are + treated in the same way as in 8-bit, non UTF-8 mode, except, of course, + that they can range from 0 to 0x7fffffff instead of 0 to 0xff. Charac- + ter types for characters less than 0xff can therefore be influenced by + the locale in the same way as before. Characters greater than 0xff + have only one case, and no "type" (such as letter or digit). + + In UTF-32 mode, the character code is Unicode, in the range 0 to + 0x10ffff, with the exception of values in the range 0xd800 to 0xdfff + because those are "surrogate" values that are ill-formed in UTF-32. + + A UTF-32 string can indicate its endianness by special code knows as a + byte-order mark (BOM). The PCRE functions do not handle this, expecting + strings to be in host byte order. A utility function called + pcre32_utf32_to_host_byte_order() is provided to help with this (see + above). + + +ERROR NAMES + + The error PCRE_ERROR_BADUTF32 corresponds to its 8-bit counterpart. + The error PCRE_ERROR_BADMODE is given when a compiled pattern is passed + to a function that processes patterns in the other mode, for example, + if a pattern compiled with pcre_compile() is passed to pcre32_exec(). + + There are new error codes whose names begin with PCRE_UTF32_ERR for in- + valid UTF-32 strings, corresponding to the PCRE_UTF8_ERR codes for + UTF-8 strings that are described in the section entitled "Reason codes + for invalid UTF-8 strings" in the main pcreapi page. The UTF-32 errors + are: + + PCRE_UTF32_ERR1 Surrogate character (range from 0xd800 to 0xdfff) + PCRE_UTF32_ERR2 Non-character + PCRE_UTF32_ERR3 Character > 0x10ffff + + +ERROR TEXTS + + If there is an error while compiling a pattern, the error text that is + passed back by pcre32_compile() or pcre32_compile2() is still an 8-bit + character string, zero-terminated. + + +CALLOUTS + + The subject and mark fields in the callout block that is passed to a + callout function point to 32-bit vectors. + + +TESTING + + The pcretest program continues to operate with 8-bit input and output + files, but it can be used for testing the 32-bit library. If it is run + with the command line option -32, patterns and subject strings are con- + verted from 8-bit to 32-bit before being passed to PCRE, and the 32-bit + library functions are used instead of the 8-bit ones. Returned 32-bit + strings are converted to 8-bit for output. If both the 8-bit and the + 16-bit libraries were not compiled, pcretest defaults to 32-bit and the + -32 option is ignored. + + When PCRE is being built, the RunTest script that is called by "make + check" uses the pcretest -C option to discover which of the 8-bit, + 16-bit and 32-bit libraries has been built, and runs the tests appro- + priately. + + +NOT SUPPORTED IN 32-BIT MODE + + Not all the features of the 8-bit library are available with the 32-bit + library. The C++ and POSIX wrapper functions support only the 8-bit li- + brary, and the pcregrep program is at present 8-bit only. + + +AUTHOR + + Philip Hazel + University Computing Service + Cambridge CB2 3QH, England. + + +REVISION + + Last updated: 12 May 2013 + Copyright (c) 1997-2013 University of Cambridge. +------------------------------------------------------------------------------ + + +PCREBUILD(3) Library Functions Manual PCREBUILD(3) + + + +NAME + PCRE - Perl-compatible regular expressions + +BUILDING PCRE + + PCRE is distributed with a configure script that can be used to build + the library in Unix-like environments using the applications known as + Autotools. Also in the distribution are files to support building us- + ing CMake instead of configure. The text file README contains general + information about building with Autotools (some of which is repeated + below), and also has some comments about building on various operating + systems. There is a lot more information about building PCRE without + using Autotools (including information about using CMake and building + "by hand") in the text file called NON-AUTOTOOLS-BUILD. You should + consult this file as well as the README file if you are building in a + non-Unix-like environment. + + +PCRE BUILD-TIME OPTIONS + + The rest of this document describes the optional features of PCRE that + can be selected when the library is compiled. It assumes use of the + configure script, where the optional features are selected or dese- + lected by providing options to configure before running the make com- + mand. However, the same options can be selected in both Unix-like and + non-Unix-like environments using the GUI facility of cmake-gui if you + are using CMake instead of configure to build PCRE. + + If you are not using Autotools or CMake, option selection can be done + by editing the config.h file, or by passing parameter settings to the + compiler, as described in NON-AUTOTOOLS-BUILD. + + The complete list of options for configure (which includes the standard + ones such as the selection of the installation directory) can be ob- + tained by running + + ./configure --help + + The following sections include descriptions of options whose names be- + gin with --enable or --disable. These settings specify changes to the + defaults for the configure command. Because of the way that configure + works, --enable and --disable always come in pairs, so the complemen- + tary option always exists as well, but as it specifies the default, it + is not described. + + +BUILDING 8-BIT, 16-BIT AND 32-BIT LIBRARIES + + By default, a library called libpcre is built, containing functions + that take string arguments contained in vectors of bytes, either as + single-byte characters, or interpreted as UTF-8 strings. You can also + build a separate library, called libpcre16, in which strings are con- + tained in vectors of 16-bit data units and interpreted either as sin- + gle-unit characters or UTF-16 strings, by adding + + --enable-pcre16 + + to the configure command. You can also build yet another separate li- + brary, called libpcre32, in which strings are contained in vectors of + 32-bit data units and interpreted either as single-unit characters or + UTF-32 strings, by adding + + --enable-pcre32 + + to the configure command. If you do not want the 8-bit library, add + + --disable-pcre8 + + as well. At least one of the three libraries must be built. Note that + the C++ and POSIX wrappers are for the 8-bit library only, and that + pcregrep is an 8-bit program. None of these are built if you select + only the 16-bit or 32-bit libraries. + + +BUILDING SHARED AND STATIC LIBRARIES + + The Autotools PCRE building process uses libtool to build both shared + and static libraries by default. You can suppress one of these by + adding one of + + --disable-shared + --disable-static + + to the configure command, as required. + + +C++ SUPPORT + + By default, if the 8-bit library is being built, the configure script + will search for a C++ compiler and C++ header files. If it finds them, + it automatically builds the C++ wrapper library (which supports only + 8-bit strings). You can disable this by adding + + --disable-cpp + + to the configure command. + + +UTF-8, UTF-16 AND UTF-32 SUPPORT + + To build PCRE with support for UTF Unicode character strings, add + + --enable-utf + + to the configure command. This setting applies to all three libraries, + adding support for UTF-8 to the 8-bit library, support for UTF-16 to + the 16-bit library, and support for UTF-32 to the to the 32-bit li- + brary. There are no separate options for enabling UTF-8, UTF-16 and + UTF-32 independently because that would allow ridiculous settings such + as requesting UTF-16 support while building only the 8-bit library. It + is not possible to build one library with UTF support and another with- + out in the same configuration. (For backwards compatibility, --enable- + utf8 is a synonym of --enable-utf.) + + Of itself, this setting does not make PCRE treat strings as UTF-8, + UTF-16 or UTF-32. As well as compiling PCRE with this option, you also + have have to set the PCRE_UTF8, PCRE_UTF16 or PCRE_UTF32 option (as ap- + propriate) when you call one of the pattern compiling functions. + + If you set --enable-utf when compiling in an EBCDIC environment, PCRE + expects its input to be either ASCII or UTF-8 (depending on the run- + time option). It is not possible to support both EBCDIC and UTF-8 codes + in the same version of the library. Consequently, --enable-utf and + --enable-ebcdic are mutually exclusive. + + +UNICODE CHARACTER PROPERTY SUPPORT + + UTF support allows the libraries to process character codepoints up to + 0x10ffff in the strings that they handle. On its own, however, it does + not provide any facilities for accessing the properties of such charac- + ters. If you want to be able to use the pattern escapes \P, \p, and \X, + which refer to Unicode character properties, you must add + + --enable-unicode-properties + + to the configure command. This implies UTF support, even if you have + not explicitly requested it. + + Including Unicode property support adds around 30K of tables to the + PCRE library. Only the general category properties such as Lu and Nd + are supported. Details are given in the pcrepattern documentation. + + +JUST-IN-TIME COMPILER SUPPORT + + Just-in-time compiler support is included in the build by specifying + + --enable-jit + + This support is available only for certain hardware architectures. If + this option is set for an unsupported architecture, a compile time er- + ror occurs. See the pcrejit documentation for a discussion of JIT us- + age. When JIT support is enabled, pcregrep automatically makes use of + it, unless you add + + --disable-pcregrep-jit + + to the "configure" command. + + +CODE VALUE OF NEWLINE + + By default, PCRE interprets the linefeed (LF) character as indicating + the end of a line. This is the normal newline character on Unix-like + systems. You can compile PCRE to use carriage return (CR) instead, by + adding + + --enable-newline-is-cr + + to the configure command. There is also a --enable-newline-is-lf op- + tion, which explicitly specifies linefeed as the newline character. + + Alternatively, you can specify that line endings are to be indicated by + the two character sequence CRLF. If you want this, add + + --enable-newline-is-crlf + + to the configure command. There is a fourth option, specified by + + --enable-newline-is-anycrlf + + which causes PCRE to recognize any of the three sequences CR, LF, or + CRLF as indicating a line ending. Finally, a fifth option, specified by + + --enable-newline-is-any + + causes PCRE to recognize any Unicode newline sequence. + + Whatever line ending convention is selected when PCRE is built can be + overridden when the library functions are called. At build time it is + conventional to use the standard for your operating system. + + +WHAT \R MATCHES + + By default, the sequence \R in a pattern matches any Unicode newline + sequence, whatever has been selected as the line ending sequence. If + you specify + + --enable-bsr-anycrlf + + the default is changed so that \R matches only CR, LF, or CRLF. What- + ever is selected when PCRE is built can be overridden when the library + functions are called. + + +POSIX MALLOC USAGE + + When the 8-bit library is called through the POSIX interface (see the + pcreposix documentation), additional working storage is required for + holding the pointers to capturing substrings, because PCRE requires + three integers per substring, whereas the POSIX interface provides only + two. If the number of expected substrings is small, the wrapper func- + tion uses space on the stack, because this is faster than using mal- + loc() for each call. The default threshold above which the stack is no + longer used is 10; it can be changed by adding a setting such as + + --with-posix-malloc-threshold=20 + + to the configure command. + + +HANDLING VERY LARGE PATTERNS + + Within a compiled pattern, offset values are used to point from one + part to another (for example, from an opening parenthesis to an alter- + nation metacharacter). By default, in the 8-bit and 16-bit libraries, + two-byte values are used for these offsets, leading to a maximum size + for a compiled pattern of around 64K. This is sufficient to handle all + but the most gigantic patterns. Nevertheless, some people do want to + process truly enormous patterns, so it is possible to compile PCRE to + use three-byte or four-byte offsets by adding a setting such as + + --with-link-size=3 + + to the configure command. The value given must be 2, 3, or 4. For the + 16-bit library, a value of 3 is rounded up to 4. In these libraries, + using longer offsets slows down the operation of PCRE because it has to + load additional data when handling them. For the 32-bit library the + value is always 4 and cannot be overridden; the value of --with-link- + size is ignored. + + +AVOIDING EXCESSIVE STACK USAGE + + When matching with the pcre_exec() function, PCRE implements backtrack- + ing by making recursive calls to an internal function called match(). + In environments where the size of the stack is limited, this can se- + verely limit PCRE's operation. (The Unix environment does not usually + suffer from this problem, but it may sometimes be necessary to increase + the maximum stack size. There is a discussion in the pcrestack docu- + mentation.) An alternative approach to recursion that uses memory from + the heap to remember data, instead of using recursive function calls, + has been implemented to work round the problem of limited stack size. + If you want to build a version of PCRE that works this way, add + + --disable-stack-for-recursion + + to the configure command. With this configuration, PCRE will use the + pcre_stack_malloc and pcre_stack_free variables to call memory manage- + ment functions. By default these point to malloc() and free(), but you + can replace the pointers so that your own functions are used instead. + + Separate functions are provided rather than using pcre_malloc and + pcre_free because the usage is very predictable: the block sizes re- + quested are always the same, and the blocks are always freed in reverse + order. A calling program might be able to implement optimized functions + that perform better than malloc() and free(). PCRE runs noticeably more + slowly when built in this way. This option affects only the pcre_exec() + function; it is not relevant for pcre_dfa_exec(). + + +LIMITING PCRE RESOURCE USAGE + + Internally, PCRE has a function called match(), which it calls repeat- + edly (sometimes recursively) when matching a pattern with the + pcre_exec() function. By controlling the maximum number of times this + function may be called during a single matching operation, a limit can + be placed on the resources used by a single call to pcre_exec(). The + limit can be changed at run time, as described in the pcreapi documen- + tation. The default is 10 million, but this can be changed by adding a + setting such as + + --with-match-limit=500000 + + to the configure command. This setting has no effect on the + pcre_dfa_exec() matching function. + + In some environments it is desirable to limit the depth of recursive + calls of match() more strictly than the total number of calls, in order + to restrict the maximum amount of stack (or heap, if --disable-stack- + for-recursion is specified) that is used. A second limit controls this; + it defaults to the value that is set for --with-match-limit, which im- + poses no additional constraints. However, you can set a lower limit by + adding, for example, + + --with-match-limit-recursion=10000 + + to the configure command. This value can also be overridden at run + time. + + +CREATING CHARACTER TABLES AT BUILD TIME + + PCRE uses fixed tables for processing characters whose code values are + less than 256. By default, PCRE is built with a set of tables that are + distributed in the file pcre_chartables.c.dist. These tables are for + ASCII codes only. If you add + + --enable-rebuild-chartables + + to the configure command, the distributed tables are no longer used. + Instead, a program called dftables is compiled and run. This outputs + the source for new set of tables, created in the default locale of your + C run-time system. (This method of replacing the tables does not work + if you are cross compiling, because dftables is run on the local host. + If you need to create alternative tables when cross compiling, you will + have to do so "by hand".) + + +USING EBCDIC CODE + + PCRE assumes by default that it will run in an environment where the + character code is ASCII (or Unicode, which is a superset of ASCII). + This is the case for most computer operating systems. PCRE can, how- + ever, be compiled to run in an EBCDIC environment by adding + + --enable-ebcdic + + to the configure command. This setting implies --enable-rebuild-charta- + bles. You should only use it if you know that you are in an EBCDIC en- + vironment (for example, an IBM mainframe operating system). The --en- + able-ebcdic option is incompatible with --enable-utf. + + The EBCDIC character that corresponds to an ASCII LF is assumed to have + the value 0x15 by default. However, in some EBCDIC environments, 0x25 + is used. In such an environment you should use + + --enable-ebcdic-nl25 + + as well as, or instead of, --enable-ebcdic. The EBCDIC character for CR + has the same value as in ASCII, namely, 0x0d. Whichever of 0x15 and + 0x25 is not chosen as LF is made to correspond to the Unicode NEL char- + acter (which, in Unicode, is 0x85). + + The options that select newline behaviour, such as --enable-newline-is- + cr, and equivalent run-time options, refer to these character values in + an EBCDIC environment. + + +PCREGREP OPTIONS FOR COMPRESSED FILE SUPPORT + + By default, pcregrep reads all files as plain text. You can build it so + that it recognizes files whose names end in .gz or .bz2, and reads them + with libz or libbz2, respectively, by adding one or both of + + --enable-pcregrep-libz + --enable-pcregrep-libbz2 + + to the configure command. These options naturally require that the rel- + evant libraries are installed on your system. Configuration will fail + if they are not. + + +PCREGREP BUFFER SIZE + + pcregrep uses an internal buffer to hold a "window" on the file it is + scanning, in order to be able to output "before" and "after" lines when + it finds a match. The size of the buffer is controlled by a parameter + whose default value is 20K. The buffer itself is three times this size, + but because of the way it is used for holding "before" lines, the long- + est line that is guaranteed to be processable is the parameter size. + You can change the default parameter value by adding, for example, + + --with-pcregrep-bufsize=50K + + to the configure command. The caller of pcregrep can, however, override + this value by specifying a run-time option. + + +PCRETEST OPTION FOR LIBREADLINE SUPPORT + + If you add + + --enable-pcretest-libreadline + + to the configure command, pcretest is linked with the libreadline li- + brary, and when its input is from a terminal, it reads it using the + readline() function. This provides line-editing and history facilities. + Note that libreadline is GPL-licensed, so if you distribute a binary of + pcretest linked in this way, there may be licensing issues. + + Setting this option causes the -lreadline option to be added to the + pcretest build. In many operating environments with a sytem-installed + libreadline this is sufficient. However, in some environments (e.g. if + an unmodified distribution version of readline is in use), some extra + configuration may be necessary. The INSTALL file for libreadline says + this: + + "Readline uses the termcap functions, but does not link with the + termcap or curses library itself, allowing applications which link + with readline the to choose an appropriate library." + + If your environment has not been set up so that an appropriate library + is automatically included, you may need to add something like + + LIBS="-ncurses" + + immediately before the configure command. + + +DEBUGGING WITH VALGRIND SUPPORT + + By adding the + + --enable-valgrind + + option to to the configure command, PCRE will use valgrind annotations + to mark certain memory regions as unaddressable. This allows it to de- + tect invalid memory accesses, and is mostly useful for debugging PCRE + itself. + + +CODE COVERAGE REPORTING + + If your C compiler is gcc, you can build a version of PCRE that can + generate a code coverage report for its test suite. To enable this, you + must install lcov version 1.6 or above. Then specify + + --enable-coverage + + to the configure command and build PCRE in the usual way. + + Note that using ccache (a caching C compiler) is incompatible with code + coverage reporting. If you have configured ccache to run automatically + on your system, you must set the environment variable + + CCACHE_DISABLE=1 + + before running make to build PCRE, so that ccache is not used. + + When --enable-coverage is used, the following addition targets are + added to the Makefile: + + make coverage + + This creates a fresh coverage report for the PCRE test suite. It is + equivalent to running "make coverage-reset", "make coverage-baseline", + "make check", and then "make coverage-report". + + make coverage-reset + + This zeroes the coverage counters, but does nothing else. + + make coverage-baseline + + This captures baseline coverage information. + + make coverage-report + + This creates the coverage report. + + make coverage-clean-report + + This removes the generated coverage report without cleaning the cover- + age data itself. + + make coverage-clean-data + + This removes the captured coverage data without removing the coverage + files created at compile time (*.gcno). + + make coverage-clean + + This cleans all coverage data including the generated coverage report. + For more information about code coverage, see the gcov and lcov docu- + mentation. + + +SEE ALSO + + pcreapi(3), pcre16, pcre32, pcre_config(3). + + +AUTHOR + + Philip Hazel + University Computing Service + Cambridge CB2 3QH, England. + + +REVISION + + Last updated: 12 May 2013 + Copyright (c) 1997-2013 University of Cambridge. +------------------------------------------------------------------------------ + + +PCREMATCHING(3) Library Functions Manual PCREMATCHING(3) + + + +NAME + PCRE - Perl-compatible regular expressions + +PCRE MATCHING ALGORITHMS + + This document describes the two different algorithms that are available + in PCRE for matching a compiled regular expression against a given sub- + ject string. The "standard" algorithm is the one provided by the + pcre_exec(), pcre16_exec() and pcre32_exec() functions. These work in + the same as as Perl's matching function, and provide a Perl-compatible + matching operation. The just-in-time (JIT) optimization that is de- + scribed in the pcrejit documentation is compatible with these func- + tions. + + An alternative algorithm is provided by the pcre_dfa_exec(), + pcre16_dfa_exec() and pcre32_dfa_exec() functions; they operate in a + different way, and are not Perl-compatible. This alternative has advan- + tages and disadvantages compared with the standard algorithm, and these + are described below. + + When there is only one possible way in which a given subject string can + match a pattern, the two algorithms give the same answer. A difference + arises, however, when there are multiple possibilities. For example, if + the pattern + + ^<.*> + + is matched against the string + + + + there are three possible answers. The standard algorithm finds only one + of them, whereas the alternative algorithm finds all three. + + +REGULAR EXPRESSIONS AS TREES + + The set of strings that are matched by a regular expression can be rep- + resented as a tree structure. An unlimited repetition in the pattern + makes the tree of infinite size, but it is still a tree. Matching the + pattern to a given subject string (from a given starting point) can be + thought of as a search of the tree. There are two ways to search a + tree: depth-first and breadth-first, and these correspond to the two + matching algorithms provided by PCRE. + + +THE STANDARD MATCHING ALGORITHM + + In the terminology of Jeffrey Friedl's book "Mastering Regular Expres- + sions", the standard algorithm is an "NFA algorithm". It conducts a + depth-first search of the pattern tree. That is, it proceeds along a + single path through the tree, checking that the subject matches what is + required. When there is a mismatch, the algorithm tries any alterna- + tives at the current point, and if they all fail, it backs up to the + previous branch point in the tree, and tries the next alternative + branch at that level. This often involves backing up (moving to the + left) in the subject string as well. The order in which repetition + branches are tried is controlled by the greedy or ungreedy nature of + the quantifier. + + If a leaf node is reached, a matching string has been found, and at + that point the algorithm stops. Thus, if there is more than one possi- + ble match, this algorithm returns the first one that it finds. Whether + this is the shortest, the longest, or some intermediate length depends + on the way the greedy and ungreedy repetition quantifiers are specified + in the pattern. + + Because it ends up with a single path through the tree, it is rela- + tively straightforward for this algorithm to keep track of the sub- + strings that are matched by portions of the pattern in parentheses. + This provides support for capturing parentheses and back references. + + +THE ALTERNATIVE MATCHING ALGORITHM + + This algorithm conducts a breadth-first search of the tree. Starting + from the first matching point in the subject, it scans the subject + string from left to right, once, character by character, and as it does + this, it remembers all the paths through the tree that represent valid + matches. In Friedl's terminology, this is a kind of "DFA algorithm", + though it is not implemented as a traditional finite state machine (it + keeps multiple states active simultaneously). + + Although the general principle of this matching algorithm is that it + scans the subject string only once, without backtracking, there is one + exception: when a lookaround assertion is encountered, the characters + following or preceding the current point have to be independently in- + spected. + + The scan continues until either the end of the subject is reached, or + there are no more unterminated paths. At this point, terminated paths + represent the different matching possibilities (if there are none, the + match has failed). Thus, if there is more than one possible match, + this algorithm finds all of them, and in particular, it finds the long- + est. The matches are returned in decreasing order of length. There is + an option to stop the algorithm after the first match (which is neces- + sarily the shortest) is found. + + Note that all the matches that are found start at the same point in the + subject. If the pattern + + cat(er(pillar)?)? + + is matched against the string "the caterpillar catchment", the result + will be the three strings "caterpillar", "cater", and "cat" that start + at the fifth character of the subject. The algorithm does not automati- + cally move on to find matches that start at later positions. + + PCRE's "auto-possessification" optimization usually applies to charac- + ter repeats at the end of a pattern (as well as internally). For exam- + ple, the pattern "a\d+" is compiled as if it were "a\d++" because there + is no point even considering the possibility of backtracking into the + repeated digits. For DFA matching, this means that only one possible + match is found. If you really do want multiple matches in such cases, + either use an ungreedy repeat ("a\d+?") or set the PCRE_NO_AUTO_POSSESS + option when compiling. + + There are a number of features of PCRE regular expressions that are not + supported by the alternative matching algorithm. They are as follows: + + 1. Because the algorithm finds all possible matches, the greedy or un- + greedy nature of repetition quantifiers is not relevant. Greedy and un- + greedy quantifiers are treated in exactly the same way. However, pos- + sessive quantifiers can make a difference when what follows could also + match what is quantified, for example in a pattern like this: + + ^a++\w! + + This pattern matches "aaab!" but not "aaa!", which would be matched by + a non-possessive quantifier. Similarly, if an atomic group is present, + it is matched as if it were a standalone pattern at the current point, + and the longest match is then "locked in" for the rest of the overall + pattern. + + 2. When dealing with multiple paths through the tree simultaneously, it + is not straightforward to keep track of captured substrings for the + different matching possibilities, and PCRE's implementation of this al- + gorithm does not attempt to do this. This means that no captured sub- + strings are available. + + 3. Because no substrings are captured, back references within the pat- + tern are not supported, and cause errors if encountered. + + 4. For the same reason, conditional expressions that use a backrefer- + ence as the condition or test for a specific group recursion are not + supported. + + 5. Because many paths through the tree may be active, the \K escape se- + quence, which resets the start of the match when encountered (but may + be on some paths and not on others), is not supported. It causes an er- + ror if encountered. + + 6. Callouts are supported, but the value of the capture_top field is + always 1, and the value of the capture_last field is always -1. + + 7. The \C escape sequence, which (in the standard algorithm) always + matches a single data unit, even in UTF-8, UTF-16 or UTF-32 modes, is + not supported in these modes, because the alternative algorithm moves + through the subject string one character (not data unit) at a time, for + all active paths through the tree. + + 8. Except for (*FAIL), the backtracking control verbs such as (*PRUNE) + are not supported. (*FAIL) is supported, and behaves like a failing + negative assertion. + + +ADVANTAGES OF THE ALTERNATIVE ALGORITHM + + Using the alternative matching algorithm provides the following advan- + tages: + + 1. All possible matches (at a single point in the subject) are automat- + ically found, and in particular, the longest match is found. To find + more than one match using the standard algorithm, you have to do kludgy + things with callouts. + + 2. Because the alternative algorithm scans the subject string just + once, and never needs to backtrack (except for lookbehinds), it is pos- + sible to pass very long subject strings to the matching function in + several pieces, checking for partial matching each time. Although it is + possible to do multi-segment matching using the standard algorithm by + retaining partially matched substrings, it is more complicated. The + pcrepartial documentation gives details of partial matching and dis- + cusses multi-segment matching. + + +DISADVANTAGES OF THE ALTERNATIVE ALGORITHM + + The alternative algorithm suffers from a number of disadvantages: + + 1. It is substantially slower than the standard algorithm. This is + partly because it has to search for all possible matches, but is also + because it is less susceptible to optimization. + + 2. Capturing parentheses and back references are not supported. + + 3. Although atomic groups are supported, their use does not provide the + performance advantage that it does for the standard algorithm. + + +AUTHOR + + Philip Hazel + University Computing Service + Cambridge CB2 3QH, England. + + +REVISION + + Last updated: 12 November 2013 + Copyright (c) 1997-2012 University of Cambridge. +------------------------------------------------------------------------------ + + +PCREAPI(3) Library Functions Manual PCREAPI(3) + + + +NAME + PCRE - Perl-compatible regular expressions + + #include + + +PCRE NATIVE API BASIC FUNCTIONS + + pcre *pcre_compile(const char *pattern, int options, + const char **errptr, int *erroffset, + const unsigned char *tableptr); + + pcre *pcre_compile2(const char *pattern, int options, + int *errorcodeptr, + const char **errptr, int *erroffset, + const unsigned char *tableptr); + + pcre_extra *pcre_study(const pcre *code, int options, + const char **errptr); + + void pcre_free_study(pcre_extra *extra); + + int pcre_exec(const pcre *code, const pcre_extra *extra, + const char *subject, int length, int startoffset, + int options, int *ovector, int ovecsize); + + int pcre_dfa_exec(const pcre *code, const pcre_extra *extra, + const char *subject, int length, int startoffset, + int options, int *ovector, int ovecsize, + int *workspace, int wscount); + + +PCRE NATIVE API STRING EXTRACTION FUNCTIONS + + int pcre_copy_named_substring(const pcre *code, + const char *subject, int *ovector, + int stringcount, const char *stringname, + char *buffer, int buffersize); + + int pcre_copy_substring(const char *subject, int *ovector, + int stringcount, int stringnumber, char *buffer, + int buffersize); + + int pcre_get_named_substring(const pcre *code, + const char *subject, int *ovector, + int stringcount, const char *stringname, + const char **stringptr); + + int pcre_get_stringnumber(const pcre *code, + const char *name); + + int pcre_get_stringtable_entries(const pcre *code, + const char *name, char **first, char **last); + + int pcre_get_substring(const char *subject, int *ovector, + int stringcount, int stringnumber, + const char **stringptr); + + int pcre_get_substring_list(const char *subject, + int *ovector, int stringcount, const char ***listptr); + + void pcre_free_substring(const char *stringptr); + + void pcre_free_substring_list(const char **stringptr); + + +PCRE NATIVE API AUXILIARY FUNCTIONS + + int pcre_jit_exec(const pcre *code, const pcre_extra *extra, + const char *subject, int length, int startoffset, + int options, int *ovector, int ovecsize, + pcre_jit_stack *jstack); + + pcre_jit_stack *pcre_jit_stack_alloc(int startsize, int maxsize); + + void pcre_jit_stack_free(pcre_jit_stack *stack); + + void pcre_assign_jit_stack(pcre_extra *extra, + pcre_jit_callback callback, void *data); + + const unsigned char *pcre_maketables(void); + + int pcre_fullinfo(const pcre *code, const pcre_extra *extra, + int what, void *where); + + int pcre_refcount(pcre *code, int adjust); + + int pcre_config(int what, void *where); + + const char *pcre_version(void); + + int pcre_pattern_to_host_byte_order(pcre *code, + pcre_extra *extra, const unsigned char *tables); + + +PCRE NATIVE API INDIRECTED FUNCTIONS + + void *(*pcre_malloc)(size_t); + + void (*pcre_free)(void *); + + void *(*pcre_stack_malloc)(size_t); + + void (*pcre_stack_free)(void *); + + int (*pcre_callout)(pcre_callout_block *); + + int (*pcre_stack_guard)(void); + + +PCRE 8-BIT, 16-BIT, AND 32-BIT LIBRARIES + + As well as support for 8-bit character strings, PCRE also supports + 16-bit strings (from release 8.30) and 32-bit strings (from release + 8.32), by means of two additional libraries. They can be built as well + as, or instead of, the 8-bit library. To avoid too much complication, + this document describes the 8-bit versions of the functions, with only + occasional references to the 16-bit and 32-bit libraries. + + The 16-bit and 32-bit functions operate in the same way as their 8-bit + counterparts; they just use different data types for their arguments + and results, and their names start with pcre16_ or pcre32_ instead of + pcre_. For every option that has UTF8 in its name (for example, + PCRE_UTF8), there are corresponding 16-bit and 32-bit names with UTF8 + replaced by UTF16 or UTF32, respectively. This facility is in fact just + cosmetic; the 16-bit and 32-bit option names define the same bit val- + ues. + + References to bytes and UTF-8 in this document should be read as refer- + ences to 16-bit data units and UTF-16 when using the 16-bit library, or + 32-bit data units and UTF-32 when using the 32-bit library, unless + specified otherwise. More details of the specific differences for the + 16-bit and 32-bit libraries are given in the pcre16 and pcre32 pages. + + +PCRE API OVERVIEW + + PCRE has its own native API, which is described in this document. There + are also some wrapper functions (for the 8-bit library only) that cor- + respond to the POSIX regular expression API, but they do not give ac- + cess to all the functionality. They are described in the pcreposix doc- + umentation. Both of these APIs define a set of C function calls. A C++ + wrapper (again for the 8-bit library only) is also distributed with + PCRE. It is documented in the pcrecpp page. + + The native API C function prototypes are defined in the header file + pcre.h, and on Unix-like systems the (8-bit) library itself is called + libpcre. It can normally be accessed by adding -lpcre to the command + for linking an application that uses PCRE. The header file defines the + macros PCRE_MAJOR and PCRE_MINOR to contain the major and minor release + numbers for the library. Applications can use these to include support + for different releases of PCRE. + + In a Windows environment, if you want to statically link an application + program against a non-dll pcre.a file, you must define PCRE_STATIC be- + fore including pcre.h or pcrecpp.h, because otherwise the pcre_malloc() + and pcre_free() exported functions will be declared __declspec(dl- + limport), with unwanted results. + + The functions pcre_compile(), pcre_compile2(), pcre_study(), and + pcre_exec() are used for compiling and matching regular expressions in + a Perl-compatible manner. A sample program that demonstrates the sim- + plest way of using them is provided in the file called pcredemo.c in + the PCRE source distribution. A listing of this program is given in the + pcredemo documentation, and the pcresample documentation describes how + to compile and run it. + + Just-in-time compiler support is an optional feature of PCRE that can + be built in appropriate hardware environments. It greatly speeds up the + matching performance of many patterns. Simple programs can easily re- + quest that it be used if available, by setting an option that is ig- + nored when it is not relevant. More complicated programs might need to + make use of the functions pcre_jit_stack_alloc(), + pcre_jit_stack_free(), and pcre_assign_jit_stack() in order to control + the JIT code's memory usage. + + From release 8.32 there is also a direct interface for JIT execution, + which gives improved performance. The JIT-specific functions are dis- + cussed in the pcrejit documentation. + + A second matching function, pcre_dfa_exec(), which is not Perl-compati- + ble, is also provided. This uses a different algorithm for the match- + ing. The alternative algorithm finds all possible matches (at a given + point in the subject), and scans the subject just once (unless there + are lookbehind assertions). However, this algorithm does not return + captured substrings. A description of the two matching algorithms and + their advantages and disadvantages is given in the pcrematching docu- + mentation. + + In addition to the main compiling and matching functions, there are + convenience functions for extracting captured substrings from a subject + string that is matched by pcre_exec(). They are: + + pcre_copy_substring() + pcre_copy_named_substring() + pcre_get_substring() + pcre_get_named_substring() + pcre_get_substring_list() + pcre_get_stringnumber() + pcre_get_stringtable_entries() + + pcre_free_substring() and pcre_free_substring_list() are also provided, + to free the memory used for extracted strings. + + The function pcre_maketables() is used to build a set of character ta- + bles in the current locale for passing to pcre_compile(), pcre_exec(), + or pcre_dfa_exec(). This is an optional facility that is provided for + specialist use. Most commonly, no special tables are passed, in which + case internal tables that are generated when PCRE is built are used. + + The function pcre_fullinfo() is used to find out information about a + compiled pattern. The function pcre_version() returns a pointer to a + string containing the version of PCRE and its date of release. + + The function pcre_refcount() maintains a reference count in a data + block containing a compiled pattern. This is provided for the benefit + of object-oriented applications. + + The global variables pcre_malloc and pcre_free initially contain the + entry points of the standard malloc() and free() functions, respec- + tively. PCRE calls the memory management functions via these variables, + so a calling program can replace them if it wishes to intercept the + calls. This should be done before calling any PCRE functions. + + The global variables pcre_stack_malloc and pcre_stack_free are also in- + directions to memory management functions. These special functions are + used only when PCRE is compiled to use the heap for remembering data, + instead of recursive function calls, when running the pcre_exec() func- + tion. See the pcrebuild documentation for details of how to do this. It + is a non-standard way of building PCRE, for use in environments that + have limited stacks. Because of the greater use of memory management, + it runs more slowly. Separate functions are provided so that special- + purpose external code can be used for this case. When used, these func- + tions always allocate memory blocks of the same size. There is a dis- + cussion about PCRE's stack usage in the pcrestack documentation. + + The global variable pcre_callout initially contains NULL. It can be set + by the caller to a "callout" function, which PCRE will then call at + specified points during a matching operation. Details are given in the + pcrecallout documentation. + + The global variable pcre_stack_guard initially contains NULL. It can be + set by the caller to a function that is called by PCRE whenever it + starts to compile a parenthesized part of a pattern. When parentheses + are nested, PCRE uses recursive function calls, which use up the system + stack. This function is provided so that applications with restricted + stacks can force a compilation error if the stack runs out. The func- + tion should return zero if all is well, or non-zero to force an error. + + +NEWLINES + + PCRE supports five different conventions for indicating line breaks in + strings: a single CR (carriage return) character, a single LF (line- + feed) character, the two-character sequence CRLF, any of the three pre- + ceding, or any Unicode newline sequence. The Unicode newline sequences + are the three just mentioned, plus the single characters VT (vertical + tab, U+000B), FF (form feed, U+000C), NEL (next line, U+0085), LS (line + separator, U+2028), and PS (paragraph separator, U+2029). + + Each of the first three conventions is used by at least one operating + system as its standard newline sequence. When PCRE is built, a default + can be specified. The default default is LF, which is the Unix stan- + dard. When PCRE is run, the default can be overridden, either when a + pattern is compiled, or when it is matched. + + At compile time, the newline convention can be specified by the options + argument of pcre_compile(), or it can be specified by special text at + the start of the pattern itself; this overrides any other settings. See + the pcrepattern page for details of the special character sequences. + + In the PCRE documentation the word "newline" is used to mean "the char- + acter or pair of characters that indicate a line break". The choice of + newline convention affects the handling of the dot, circumflex, and + dollar metacharacters, the handling of #-comments in /x mode, and, when + CRLF is a recognized line ending sequence, the match position advance- + ment for a non-anchored pattern. There is more detail about this in the + section on pcre_exec() options below. + + The choice of newline convention does not affect the interpretation of + the \n or \r escape sequences, nor does it affect what \R matches, + which is controlled in a similar way, but by separate options. + + +MULTITHREADING + + The PCRE functions can be used in multi-threading applications, with + the proviso that the memory management functions pointed to by + pcre_malloc, pcre_free, pcre_stack_malloc, and pcre_stack_free, and the + callout and stack-checking functions pointed to by pcre_callout and + pcre_stack_guard, are shared by all threads. + + The compiled form of a regular expression is not altered during match- + ing, so the same compiled pattern can safely be used by several threads + at once. + + If the just-in-time optimization feature is being used, it needs sepa- + rate memory stack areas for each thread. See the pcrejit documentation + for more details. + + +SAVING PRECOMPILED PATTERNS FOR LATER USE + + The compiled form of a regular expression can be saved and re-used at a + later time, possibly by a different program, and even on a host other + than the one on which it was compiled. Details are given in the + pcreprecompile documentation, which includes a description of the + pcre_pattern_to_host_byte_order() function. However, compiling a regu- + lar expression with one version of PCRE for use with a different ver- + sion is not guaranteed to work and may cause crashes. + + +CHECKING BUILD-TIME OPTIONS + + int pcre_config(int what, void *where); + + The function pcre_config() makes it possible for a PCRE client to dis- + cover which optional features have been compiled into the PCRE library. + The pcrebuild documentation has more details about these optional fea- + tures. + + The first argument for pcre_config() is an integer, specifying which + information is required; the second argument is a pointer to a variable + into which the information is placed. The returned value is zero on + success, or the negative error code PCRE_ERROR_BADOPTION if the value + in the first argument is not recognized. The following information is + available: + + PCRE_CONFIG_UTF8 + + The output is an integer that is set to one if UTF-8 support is avail- + able; otherwise it is set to zero. This value should normally be given + to the 8-bit version of this function, pcre_config(). If it is given to + the 16-bit or 32-bit version of this function, the result is PCRE_ER- + ROR_BADOPTION. + + PCRE_CONFIG_UTF16 + + The output is an integer that is set to one if UTF-16 support is avail- + able; otherwise it is set to zero. This value should normally be given + to the 16-bit version of this function, pcre16_config(). If it is given + to the 8-bit or 32-bit version of this function, the result is PCRE_ER- + ROR_BADOPTION. + + PCRE_CONFIG_UTF32 + + The output is an integer that is set to one if UTF-32 support is avail- + able; otherwise it is set to zero. This value should normally be given + to the 32-bit version of this function, pcre32_config(). If it is given + to the 8-bit or 16-bit version of this function, the result is PCRE_ER- + ROR_BADOPTION. + + PCRE_CONFIG_UNICODE_PROPERTIES + + The output is an integer that is set to one if support for Unicode + character properties is available; otherwise it is set to zero. + + PCRE_CONFIG_JIT + + The output is an integer that is set to one if support for just-in-time + compiling is available; otherwise it is set to zero. + + PCRE_CONFIG_JITTARGET + + The output is a pointer to a zero-terminated "const char *" string. If + JIT support is available, the string contains the name of the architec- + ture for which the JIT compiler is configured, for example "x86 32bit + (little endian + unaligned)". If JIT support is not available, the re- + sult is NULL. + + PCRE_CONFIG_NEWLINE + + The output is an integer whose value specifies the default character + sequence that is recognized as meaning "newline". The values that are + supported in ASCII/Unicode environments are: 10 for LF, 13 for CR, 3338 + for CRLF, -2 for ANYCRLF, and -1 for ANY. In EBCDIC environments, CR, + ANYCRLF, and ANY yield the same values. However, the value for LF is + normally 21, though some EBCDIC environments use 37. The corresponding + values for CRLF are 3349 and 3365. The default should normally corre- + spond to the standard sequence for your operating system. + + PCRE_CONFIG_BSR + + The output is an integer whose value indicates what character sequences + the \R escape sequence matches by default. A value of 0 means that \R + matches any Unicode line ending sequence; a value of 1 means that \R + matches only CR, LF, or CRLF. The default can be overridden when a pat- + tern is compiled or matched. + + PCRE_CONFIG_LINK_SIZE + + The output is an integer that contains the number of bytes used for in- + ternal linkage in compiled regular expressions. For the 8-bit library, + the value can be 2, 3, or 4. For the 16-bit library, the value is ei- + ther 2 or 4 and is still a number of bytes. For the 32-bit library, the + value is either 2 or 4 and is still a number of bytes. The default + value of 2 is sufficient for all but the most massive patterns, since + it allows the compiled pattern to be up to 64K in size. Larger values + allow larger regular expressions to be compiled, at the expense of + slower matching. + + PCRE_CONFIG_POSIX_MALLOC_THRESHOLD + + The output is an integer that contains the threshold above which the + POSIX interface uses malloc() for output vectors. Further details are + given in the pcreposix documentation. + + PCRE_CONFIG_PARENS_LIMIT + + The output is a long integer that gives the maximum depth of nesting of + parentheses (of any kind) in a pattern. This limit is imposed to cap + the amount of system stack used when a pattern is compiled. It is spec- + ified when PCRE is built; the default is 250. This limit does not take + into account the stack that may already be used by the calling applica- + tion. For finer control over compilation stack usage, you can set a + pointer to an external checking function in pcre_stack_guard. + + PCRE_CONFIG_MATCH_LIMIT + + The output is a long integer that gives the default limit for the num- + ber of internal matching function calls in a pcre_exec() execution. + Further details are given with pcre_exec() below. + + PCRE_CONFIG_MATCH_LIMIT_RECURSION + + The output is a long integer that gives the default limit for the depth + of recursion when calling the internal matching function in a + pcre_exec() execution. Further details are given with pcre_exec() be- + low. + + PCRE_CONFIG_STACKRECURSE + + The output is an integer that is set to one if internal recursion when + running pcre_exec() is implemented by recursive function calls that use + the stack to remember their state. This is the usual way that PCRE is + compiled. The output is zero if PCRE was compiled to use blocks of data + on the heap instead of recursive function calls. In this case, + pcre_stack_malloc and pcre_stack_free are called to manage memory + blocks on the heap, thus avoiding the use of the stack. + + +COMPILING A PATTERN + + pcre *pcre_compile(const char *pattern, int options, + const char **errptr, int *erroffset, + const unsigned char *tableptr); + + pcre *pcre_compile2(const char *pattern, int options, + int *errorcodeptr, + const char **errptr, int *erroffset, + const unsigned char *tableptr); + + Either of the functions pcre_compile() or pcre_compile2() can be called + to compile a pattern into an internal form. The only difference between + the two interfaces is that pcre_compile2() has an additional argument, + errorcodeptr, via which a numerical error code can be returned. To + avoid too much repetition, we refer just to pcre_compile() below, but + the information applies equally to pcre_compile2(). + + The pattern is a C string terminated by a binary zero, and is passed in + the pattern argument. A pointer to a single block of memory that is ob- + tained via pcre_malloc is returned. This contains the compiled code and + related data. The pcre type is defined for the returned block; this is + a typedef for a structure whose contents are not externally defined. It + is up to the caller to free the memory (via pcre_free) when it is no + longer required. + + Although the compiled code of a PCRE regex is relocatable, that is, it + does not depend on memory location, the complete pcre data block is not + fully relocatable, because it may contain a copy of the tableptr argu- + ment, which is an address (see below). + + The options argument contains various bit settings that affect the com- + pilation. It should be zero if no options are required. The available + options are described below. Some of them (in particular, those that + are compatible with Perl, but some others as well) can also be set and + unset from within the pattern (see the detailed description in the + pcrepattern documentation). For those options that can be different in + different parts of the pattern, the contents of the options argument + specifies their settings at the start of compilation and execution. The + PCRE_ANCHORED, PCRE_BSR_xxx, PCRE_NEWLINE_xxx, PCRE_NO_UTF8_CHECK, and + PCRE_NO_START_OPTIMIZE options can be set at the time of matching as + well as at compile time. + + If errptr is NULL, pcre_compile() returns NULL immediately. Otherwise, + if compilation of a pattern fails, pcre_compile() returns NULL, and + sets the variable pointed to by errptr to point to a textual error mes- + sage. This is a static string that is part of the library. You must not + try to free it. Normally, the offset from the start of the pattern to + the data unit that was being processed when the error was discovered is + placed in the variable pointed to by erroffset, which must not be NULL + (if it is, an immediate error is given). However, for an invalid UTF-8 + or UTF-16 string, the offset is that of the first data unit of the + failing character. + + Some errors are not detected until the whole pattern has been scanned; + in these cases, the offset passed back is the length of the pattern. + Note that the offset is in data units, not characters, even in a UTF + mode. It may sometimes point into the middle of a UTF-8 or UTF-16 char- + acter. + + If pcre_compile2() is used instead of pcre_compile(), and the error- + codeptr argument is not NULL, a non-zero error code number is returned + via this argument in the event of an error. This is in addition to the + textual error message. Error codes and messages are listed below. + + If the final argument, tableptr, is NULL, PCRE uses a default set of + character tables that are built when PCRE is compiled, using the de- + fault C locale. Otherwise, tableptr must be an address that is the re- + sult of a call to pcre_maketables(). This value is stored with the com- + piled pattern, and used again by pcre_exec() and pcre_dfa_exec() when + the pattern is matched. For more discussion, see the section on locale + support below. + + This code fragment shows a typical straightforward call to pcre_com- + pile(): + + pcre *re; + const char *error; + int erroffset; + re = pcre_compile( + "^A.*Z", /* the pattern */ + 0, /* default options */ + &error, /* for error message */ + &erroffset, /* for error offset */ + NULL); /* use default character tables */ + + The following names for option bits are defined in the pcre.h header + file: + + PCRE_ANCHORED + + If this bit is set, the pattern is forced to be "anchored", that is, it + is constrained to match only at the first matching point in the string + that is being searched (the "subject string"). This effect can also be + achieved by appropriate constructs in the pattern itself, which is the + only way to do it in Perl. + + PCRE_AUTO_CALLOUT + + If this bit is set, pcre_compile() automatically inserts callout items, + all with number 255, before each pattern item. For discussion of the + callout facility, see the pcrecallout documentation. + + PCRE_BSR_ANYCRLF + PCRE_BSR_UNICODE + + These options (which are mutually exclusive) control what the \R escape + sequence matches. The choice is either to match only CR, LF, or CRLF, + or to match any Unicode newline sequence. The default is specified when + PCRE is built. It can be overridden from within the pattern, or by set- + ting an option when a compiled pattern is matched. + + PCRE_CASELESS + + If this bit is set, letters in the pattern match both upper and lower + case letters. It is equivalent to Perl's /i option, and it can be + changed within a pattern by a (?i) option setting. In UTF-8 mode, PCRE + always understands the concept of case for characters whose values are + less than 128, so caseless matching is always possible. For characters + with higher values, the concept of case is supported if PCRE is com- + piled with Unicode property support, but not otherwise. If you want to + use caseless matching for characters 128 and above, you must ensure + that PCRE is compiled with Unicode property support as well as with + UTF-8 support. + + PCRE_DOLLAR_ENDONLY + + If this bit is set, a dollar metacharacter in the pattern matches only + at the end of the subject string. Without this option, a dollar also + matches immediately before a newline at the end of the string (but not + before any other newlines). The PCRE_DOLLAR_ENDONLY option is ignored + if PCRE_MULTILINE is set. There is no equivalent to this option in + Perl, and no way to set it within a pattern. + + PCRE_DOTALL + + If this bit is set, a dot metacharacter in the pattern matches a char- + acter of any value, including one that indicates a newline. However, it + only ever matches one character, even if newlines are coded as CRLF. + Without this option, a dot does not match when the current position is + at a newline. This option is equivalent to Perl's /s option, and it can + be changed within a pattern by a (?s) option setting. A negative class + such as [^a] always matches newline characters, independent of the set- + ting of this option. + + PCRE_DUPNAMES + + If this bit is set, names used to identify capturing subpatterns need + not be unique. This can be helpful for certain types of pattern when it + is known that only one instance of the named subpattern can ever be + matched. There are more details of named subpatterns below; see also + the pcrepattern documentation. + + PCRE_EXTENDED + + If this bit is set, most white space characters in the pattern are to- + tally ignored except when escaped or inside a character class. However, + white space is not allowed within sequences such as (?> that introduce + various parenthesized subpatterns, nor within a numerical quantifier + such as {1,3}. However, ignorable white space is permitted between an + item and a following quantifier and between a quantifier and a follow- + ing + that indicates possessiveness. + + White space did not used to include the VT character (code 11), because + Perl did not treat this character as white space. However, Perl changed + at release 5.18, so PCRE followed at release 8.34, and VT is now + treated as white space. + + PCRE_EXTENDED also causes characters between an unescaped # outside a + character class and the next newline, inclusive, to be ignored. + PCRE_EXTENDED is equivalent to Perl's /x option, and it can be changed + within a pattern by a (?x) option setting. + + Which characters are interpreted as newlines is controlled by the op- + tions passed to pcre_compile() or by a special sequence at the start of + the pattern, as described in the section entitled "Newline conventions" + in the pcrepattern documentation. Note that the end of this type of + comment is a literal newline sequence in the pattern; escape sequences + that happen to represent a newline do not count. + + This option makes it possible to include comments inside complicated + patterns. Note, however, that this applies only to data characters. + White space characters may never appear within special character se- + quences in a pattern, for example within the sequence (?( that intro- + duces a conditional subpattern. + + PCRE_EXTRA + + This option was invented in order to turn on additional functionality + of PCRE that is incompatible with Perl, but it is currently of very + little use. When set, any backslash in a pattern that is followed by a + letter that has no special meaning causes an error, thus reserving + these combinations for future expansion. By default, as in Perl, a + backslash followed by a letter with no special meaning is treated as a + literal. (Perl can, however, be persuaded to give an error for this, by + running it with the -w option.) There are at present no other features + controlled by this option. It can also be set by a (?X) option setting + within a pattern. + + PCRE_FIRSTLINE + + If this option is set, an unanchored pattern is required to match be- + fore or at the first newline in the subject string, though the matched + text may continue over the newline. + + PCRE_JAVASCRIPT_COMPAT + + If this option is set, PCRE's behaviour is changed in some ways so that + it is compatible with JavaScript rather than Perl. The changes are as + follows: + + (1) A lone closing square bracket in a pattern causes a compile-time + error, because this is illegal in JavaScript (by default it is treated + as a data character). Thus, the pattern AB]CD becomes illegal when this + option is set. + + (2) At run time, a back reference to an unset subpattern group matches + an empty string (by default this causes the current matching alterna- + tive to fail). A pattern such as (\1)(a) succeeds when this option is + set (assuming it can find an "a" in the subject), whereas it fails by + default, for Perl compatibility. + + (3) \U matches an upper case "U" character; by default \U causes a com- + pile time error (Perl uses \U to upper case subsequent characters). + + (4) \u matches a lower case "u" character unless it is followed by four + hexadecimal digits, in which case the hexadecimal number defines the + code point to match. By default, \u causes a compile time error (Perl + uses it to upper case the following character). + + (5) \x matches a lower case "x" character unless it is followed by two + hexadecimal digits, in which case the hexadecimal number defines the + code point to match. By default, as in Perl, a hexadecimal number is + always expected after \x, but it may have zero, one, or two digits (so, + for example, \xz matches a binary zero character followed by z). + + PCRE_MULTILINE + + By default, for the purposes of matching "start of line" and "end of + line", PCRE treats the subject string as consisting of a single line of + characters, even if it actually contains newlines. The "start of line" + metacharacter (^) matches only at the start of the string, and the "end + of line" metacharacter ($) matches only at the end of the string, or + before a terminating newline (except when PCRE_DOLLAR_ENDONLY is set). + Note, however, that unless PCRE_DOTALL is set, the "any character" + metacharacter (.) does not match at a newline. This behaviour (for ^, + $, and dot) is the same as Perl. + + When PCRE_MULTILINE it is set, the "start of line" and "end of line" + constructs match immediately following or immediately before internal + newlines in the subject string, respectively, as well as at the very + start and end. This is equivalent to Perl's /m option, and it can be + changed within a pattern by a (?m) option setting. If there are no new- + lines in a subject string, or no occurrences of ^ or $ in a pattern, + setting PCRE_MULTILINE has no effect. + + PCRE_NEVER_UTF + + This option locks out interpretation of the pattern as UTF-8 (or UTF-16 + or UTF-32 in the 16-bit and 32-bit libraries). In particular, it pre- + vents the creator of the pattern from switching to UTF interpretation + by starting the pattern with (*UTF). This may be useful in applications + that process patterns from external sources. The combination of + PCRE_UTF8 and PCRE_NEVER_UTF also causes an error. + + PCRE_NEWLINE_CR + PCRE_NEWLINE_LF + PCRE_NEWLINE_CRLF + PCRE_NEWLINE_ANYCRLF + PCRE_NEWLINE_ANY + + These options override the default newline definition that was chosen + when PCRE was built. Setting the first or the second specifies that a + newline is indicated by a single character (CR or LF, respectively). + Setting PCRE_NEWLINE_CRLF specifies that a newline is indicated by the + two-character CRLF sequence. Setting PCRE_NEWLINE_ANYCRLF specifies + that any of the three preceding sequences should be recognized. Setting + PCRE_NEWLINE_ANY specifies that any Unicode newline sequence should be + recognized. + + In an ASCII/Unicode environment, the Unicode newline sequences are the + three just mentioned, plus the single characters VT (vertical tab, + U+000B), FF (form feed, U+000C), NEL (next line, U+0085), LS (line sep- + arator, U+2028), and PS (paragraph separator, U+2029). For the 8-bit + library, the last two are recognized only in UTF-8 mode. + + When PCRE is compiled to run in an EBCDIC (mainframe) environment, the + code for CR is 0x0d, the same as ASCII. However, the character code for + LF is normally 0x15, though in some EBCDIC environments 0x25 is used. + Whichever of these is not LF is made to correspond to Unicode's NEL + character. EBCDIC codes are all less than 256. For more details, see + the pcrebuild documentation. + + The newline setting in the options word uses three bits that are + treated as a number, giving eight possibilities. Currently only six are + used (default plus the five values above). This means that if you set + more than one newline option, the combination may or may not be sensi- + ble. For example, PCRE_NEWLINE_CR with PCRE_NEWLINE_LF is equivalent to + PCRE_NEWLINE_CRLF, but other combinations may yield unused numbers and + cause an error. + + The only time that a line break in a pattern is specially recognized + when compiling is when PCRE_EXTENDED is set. CR and LF are white space + characters, and so are ignored in this mode. Also, an unescaped # out- + side a character class indicates a comment that lasts until after the + next line break sequence. In other circumstances, line break sequences + in patterns are treated as literal data. + + The newline option that is set at compile time becomes the default that + is used for pcre_exec() and pcre_dfa_exec(), but it can be overridden. + + PCRE_NO_AUTO_CAPTURE + + If this option is set, it disables the use of numbered capturing paren- + theses in the pattern. Any opening parenthesis that is not followed by + ? behaves as if it were followed by ?: but named parentheses can still + be used for capturing (and they acquire numbers in the usual way). + There is no equivalent of this option in Perl. + + PCRE_NO_AUTO_POSSESS + + If this option is set, it disables "auto-possessification". This is an + optimization that, for example, turns a+b into a++b in order to avoid + backtracks into a+ that can never be successful. However, if callouts + are in use, auto-possessification means that some of them are never + taken. You can set this option if you want the matching functions to do + a full unoptimized search and run all the callouts, but it is mainly + provided for testing purposes. + + PCRE_NO_START_OPTIMIZE + + This is an option that acts at matching time; that is, it is really an + option for pcre_exec() or pcre_dfa_exec(). If it is set at compile + time, it is remembered with the compiled pattern and assumed at match- + ing time. This is necessary if you want to use JIT execution, because + the JIT compiler needs to know whether or not this option is set. For + details see the discussion of PCRE_NO_START_OPTIMIZE below. + + PCRE_UCP + + This option changes the way PCRE processes \B, \b, \D, \d, \S, \s, \W, + \w, and some of the POSIX character classes. By default, only ASCII + characters are recognized, but if PCRE_UCP is set, Unicode properties + are used instead to classify characters. More details are given in the + section on generic character types in the pcrepattern page. If you set + PCRE_UCP, matching one of the items it affects takes much longer. The + option is available only if PCRE has been compiled with Unicode prop- + erty support. + + PCRE_UNGREEDY + + This option inverts the "greediness" of the quantifiers so that they + are not greedy by default, but become greedy if followed by "?". It is + not compatible with Perl. It can also be set by a (?U) option setting + within the pattern. + + PCRE_UTF8 + + This option causes PCRE to regard both the pattern and the subject as + strings of UTF-8 characters instead of single-byte strings. However, it + is available only when PCRE is built to include UTF support. If not, + the use of this option provokes an error. Details of how this option + changes the behaviour of PCRE are given in the pcreunicode page. + + PCRE_NO_UTF8_CHECK + + When PCRE_UTF8 is set, the validity of the pattern as a UTF-8 string is + automatically checked. There is a discussion about the validity of + UTF-8 strings in the pcreunicode page. If an invalid UTF-8 sequence is + found, pcre_compile() returns an error. If you already know that your + pattern is valid, and you want to skip this check for performance rea- + sons, you can set the PCRE_NO_UTF8_CHECK option. When it is set, the + effect of passing an invalid UTF-8 string as a pattern is undefined. It + may cause your program to crash or loop. Note that this option can also + be passed to pcre_exec() and pcre_dfa_exec(), to suppress the validity + checking of subject strings only. If the same string is being matched + many times, the option can be safely set for the second and subsequent + matchings to improve performance. + + +COMPILATION ERROR CODES + + The following table lists the error codes than may be returned by + pcre_compile2(), along with the error messages that may be returned by + both compiling functions. Note that error messages are always 8-bit + ASCII strings, even in 16-bit or 32-bit mode. As PCRE has developed, + some error codes have fallen out of use. To avoid confusion, they have + not been re-used. + + 0 no error + 1 \ at end of pattern + 2 \c at end of pattern + 3 unrecognized character follows \ + 4 numbers out of order in {} quantifier + 5 number too big in {} quantifier + 6 missing terminating ] for character class + 7 invalid escape sequence in character class + 8 range out of order in character class + 9 nothing to repeat + 10 [this code is not in use] + 11 internal error: unexpected repeat + 12 unrecognized character after (? or (?- + 13 POSIX named classes are supported only within a class + 14 missing ) + 15 reference to non-existent subpattern + 16 erroffset passed as NULL + 17 unknown option bit(s) set + 18 missing ) after comment + 19 [this code is not in use] + 20 regular expression is too large + 21 failed to get memory + 22 unmatched parentheses + 23 internal error: code overflow + 24 unrecognized character after (?< + 25 lookbehind assertion is not fixed length + 26 malformed number or name after (?( + 27 conditional group contains more than two branches + 28 assertion expected after (?( + 29 (?R or (?[+-]digits must be followed by ) + 30 unknown POSIX class name + 31 POSIX collating elements are not supported + 32 this version of PCRE is compiled without UTF support + 33 [this code is not in use] + 34 character value in \x{} or \o{} is too large + 35 invalid condition (?(0) + 36 \C not allowed in lookbehind assertion + 37 PCRE does not support \L, \l, \N{name}, \U, or \u + 38 number after (?C is > 255 + 39 closing ) for (?C expected + 40 recursive call could loop indefinitely + 41 unrecognized character after (?P + 42 syntax error in subpattern name (missing terminator) + 43 two named subpatterns have the same name + 44 invalid UTF-8 string (specifically UTF-8) + 45 support for \P, \p, and \X has not been compiled + 46 malformed \P or \p sequence + 47 unknown property name after \P or \p + 48 subpattern name is too long (maximum 32 characters) + 49 too many named subpatterns (maximum 10000) + 50 [this code is not in use] + 51 octal value is greater than \377 in 8-bit non-UTF-8 mode + 52 internal error: overran compiling workspace + 53 internal error: previously-checked referenced subpattern + not found + 54 DEFINE group contains more than one branch + 55 repeating a DEFINE group is not allowed + 56 inconsistent NEWLINE options + 57 \g is not followed by a braced, angle-bracketed, or quoted + name/number or by a plain number + 58 a numbered reference must not be zero + 59 an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT) + 60 (*VERB) not recognized or malformed + 61 number is too big + 62 subpattern name expected + 63 digit expected after (?+ + 64 ] is an invalid data character in JavaScript compatibility mode + 65 different names for subpatterns of the same number are + not allowed + 66 (*MARK) must have an argument + 67 this version of PCRE is not compiled with Unicode property + support + 68 \c must be followed by an ASCII character + 69 \k is not followed by a braced, angle-bracketed, or quoted name + 70 internal error: unknown opcode in find_fixedlength() + 71 \N is not supported in a class + 72 too many forward references + 73 disallowed Unicode code point (>= 0xd800 && <= 0xdfff) + 74 invalid UTF-16 string (specifically UTF-16) + 75 name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN) + 76 character value in \u.... sequence is too large + 77 invalid UTF-32 string (specifically UTF-32) + 78 setting UTF is disabled by the application + 79 non-hex character in \x{} (closing brace missing?) + 80 non-octal character in \o{} (closing brace missing?) + 81 missing opening brace after \o + 82 parentheses are too deeply nested + 83 invalid range in character class + 84 group name must start with a non-digit + 85 parentheses are too deeply nested (stack check) + + The numbers 32 and 10000 in errors 48 and 49 are defaults; different + values may be used if the limits were changed when PCRE was built. + + +STUDYING A PATTERN + + pcre_extra *pcre_study(const pcre *code, int options, + const char **errptr); + + If a compiled pattern is going to be used several times, it is worth + spending more time analyzing it in order to speed up the time taken for + matching. The function pcre_study() takes a pointer to a compiled pat- + tern as its first argument. If studying the pattern produces additional + information that will help speed up matching, pcre_study() returns a + pointer to a pcre_extra block, in which the study_data field points to + the results of the study. + + The returned value from pcre_study() can be passed directly to + pcre_exec() or pcre_dfa_exec(). However, a pcre_extra block also con- + tains other fields that can be set by the caller before the block is + passed; these are described below in the section on matching a pattern. + + If studying the pattern does not produce any useful information, + pcre_study() returns NULL by default. In that circumstance, if the + calling program wants to pass any of the other fields to pcre_exec() or + pcre_dfa_exec(), it must set up its own pcre_extra block. However, if + pcre_study() is called with the PCRE_STUDY_EXTRA_NEEDED option, it re- + turns a pcre_extra block even if studying did not find any additional + information. It may still return NULL, however, if an error occurs in + pcre_study(). + + The second argument of pcre_study() contains option bits. There are + three further options in addition to PCRE_STUDY_EXTRA_NEEDED: + + PCRE_STUDY_JIT_COMPILE + PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE + PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE + + If any of these are set, and the just-in-time compiler is available, + the pattern is further compiled into machine code that executes much + faster than the pcre_exec() interpretive matching function. If the + just-in-time compiler is not available, these options are ignored. All + undefined bits in the options argument must be zero. + + JIT compilation is a heavyweight optimization. It can take some time + for patterns to be analyzed, and for one-off matches and simple pat- + terns the benefit of faster execution might be offset by a much slower + study time. Not all patterns can be optimized by the JIT compiler. For + those that cannot be handled, matching automatically falls back to the + pcre_exec() interpreter. For more details, see the pcrejit documenta- + tion. + + The third argument for pcre_study() is a pointer for an error message. + If studying succeeds (even if no data is returned), the variable it + points to is set to NULL. Otherwise it is set to point to a textual er- + ror message. This is a static string that is part of the library. You + must not try to free it. You should test the error pointer for NULL af- + ter calling pcre_study(), to be sure that it has run successfully. + + When you are finished with a pattern, you can free the memory used for + the study data by calling pcre_free_study(). This function was added to + the API for release 8.20. For earlier versions, the memory could be + freed with pcre_free(), just like the pattern itself. This will still + work in cases where JIT optimization is not used, but it is advisable + to change to the new function when convenient. + + This is a typical way in which pcre_study() is used (except that in a + real application there should be tests for errors): + + int rc; + pcre *re; + pcre_extra *sd; + re = pcre_compile("pattern", 0, &error, &erroroffset, NULL); + sd = pcre_study( + re, /* result of pcre_compile() */ + 0, /* no options */ + &error); /* set to NULL or points to a message */ + rc = pcre_exec( /* see below for details of pcre_exec() options */ + re, sd, "subject", 7, 0, 0, ovector, 30); + ... + pcre_free_study(sd); + pcre_free(re); + + Studying a pattern does two things: first, a lower bound for the length + of subject string that is needed to match the pattern is computed. This + does not mean that there are any strings of that length that match, but + it does guarantee that no shorter strings match. The value is used to + avoid wasting time by trying to match strings that are shorter than the + lower bound. You can find out the value in a calling program via the + pcre_fullinfo() function. + + Studying a pattern is also useful for non-anchored patterns that do not + have a single fixed starting character. A bitmap of possible starting + bytes is created. This speeds up finding a position in the subject at + which to start matching. (In 16-bit mode, the bitmap is used for 16-bit + values less than 256. In 32-bit mode, the bitmap is used for 32-bit + values less than 256.) + + These two optimizations apply to both pcre_exec() and pcre_dfa_exec(), + and the information is also used by the JIT compiler. The optimiza- + tions can be disabled by setting the PCRE_NO_START_OPTIMIZE option. + You might want to do this if your pattern contains callouts or (*MARK) + and you want to make use of these facilities in cases where matching + fails. + + PCRE_NO_START_OPTIMIZE can be specified at either compile time or exe- + cution time. However, if PCRE_NO_START_OPTIMIZE is passed to + pcre_exec(), (that is, after any JIT compilation has happened) JIT exe- + cution is disabled. For JIT execution to work with PCRE_NO_START_OPTI- + MIZE, the option must be set at compile time. + + There is a longer discussion of PCRE_NO_START_OPTIMIZE below. + + +LOCALE SUPPORT + + PCRE handles caseless matching, and determines whether characters are + letters, digits, or whatever, by reference to a set of tables, indexed + by character code point. When running in UTF-8 mode, or in the 16- or + 32-bit libraries, this applies only to characters with code points less + than 256. By default, higher-valued code points never match escapes + such as \w or \d. However, if PCRE is built with Unicode property sup- + port, all characters can be tested with \p and \P, or, alternatively, + the PCRE_UCP option can be set when a pattern is compiled; this causes + \w and friends to use Unicode property support instead of the built-in + tables. + + The use of locales with Unicode is discouraged. If you are handling + characters with code points greater than 128, you should either use + Unicode support, or use locales, but not try to mix the two. + + PCRE contains an internal set of tables that are used when the final + argument of pcre_compile() is NULL. These are sufficient for many ap- + plications. Normally, the internal tables recognize only ASCII charac- + ters. However, when PCRE is built, it is possible to cause the internal + tables to be rebuilt in the default "C" locale of the local system, + which may cause them to be different. + + The internal tables can always be overridden by tables supplied by the + application that calls PCRE. These may be created in a different locale + from the default. As more and more applications change to using Uni- + code, the need for this locale support is expected to die away. + + External tables are built by calling the pcre_maketables() function, + which has no arguments, in the relevant locale. The result can then be + passed to pcre_compile() as often as necessary. For example, to build + and use tables that are appropriate for the French locale (where ac- + cented characters with values greater than 128 are treated as letters), + the following code could be used: + + setlocale(LC_CTYPE, "fr_FR"); + tables = pcre_maketables(); + re = pcre_compile(..., tables); + + The locale name "fr_FR" is used on Linux and other Unix-like systems; + if you are using Windows, the name for the French locale is "french". + + When pcre_maketables() runs, the tables are built in memory that is ob- + tained via pcre_malloc. It is the caller's responsibility to ensure + that the memory containing the tables remains available for as long as + it is needed. + + The pointer that is passed to pcre_compile() is saved with the compiled + pattern, and the same tables are used via this pointer by pcre_study() + and also by pcre_exec() and pcre_dfa_exec(). Thus, for any single pat- + tern, compilation, studying and matching all happen in the same locale, + but different patterns can be processed in different locales. + + It is possible to pass a table pointer or NULL (indicating the use of + the internal tables) to pcre_exec() or pcre_dfa_exec() (see the discus- + sion below in the section on matching a pattern). This facility is pro- + vided for use with pre-compiled patterns that have been saved and + reloaded. Character tables are not saved with patterns, so if a non- + standard table was used at compile time, it must be provided again when + the reloaded pattern is matched. Attempting to use this facility to + match a pattern in a different locale from the one in which it was com- + piled is likely to lead to anomalous (usually incorrect) results. + + +INFORMATION ABOUT A PATTERN + + int pcre_fullinfo(const pcre *code, const pcre_extra *extra, + int what, void *where); + + The pcre_fullinfo() function returns information about a compiled pat- + tern. It replaces the pcre_info() function, which was removed from the + library at version 8.30, after more than 10 years of obsolescence. + + The first argument for pcre_fullinfo() is a pointer to the compiled + pattern. The second argument is the result of pcre_study(), or NULL if + the pattern was not studied. The third argument specifies which piece + of information is required, and the fourth argument is a pointer to a + variable to receive the data. The yield of the function is zero for + success, or one of the following negative numbers: + + PCRE_ERROR_NULL the argument code was NULL + the argument where was NULL + PCRE_ERROR_BADMAGIC the "magic number" was not found + PCRE_ERROR_BADENDIANNESS the pattern was compiled with different + endianness + PCRE_ERROR_BADOPTION the value of what was invalid + PCRE_ERROR_UNSET the requested field is not set + + The "magic number" is placed at the start of each compiled pattern as a + simple check against passing an arbitrary memory pointer. The endian- + ness error can occur if a compiled pattern is saved and reloaded on a + different host. Here is a typical call of pcre_fullinfo(), to obtain + the length of the compiled pattern: + + int rc; + size_t length; + rc = pcre_fullinfo( + re, /* result of pcre_compile() */ + sd, /* result of pcre_study(), or NULL */ + PCRE_INFO_SIZE, /* what is required */ + &length); /* where to put the data */ + + The possible values for the third argument are defined in pcre.h, and + are as follows: + + PCRE_INFO_BACKREFMAX + + Return the number of the highest back reference in the pattern. The + fourth argument should point to an int variable. Zero is returned if + there are no back references. + + PCRE_INFO_CAPTURECOUNT + + Return the number of capturing subpatterns in the pattern. The fourth + argument should point to an int variable. + + PCRE_INFO_DEFAULT_TABLES + + Return a pointer to the internal default character tables within PCRE. + The fourth argument should point to an unsigned char * variable. This + information call is provided for internal use by the pcre_study() func- + tion. External callers can cause PCRE to use its internal tables by + passing a NULL table pointer. + + PCRE_INFO_FIRSTBYTE (deprecated) + + Return information about the first data unit of any matched string, for + a non-anchored pattern. The name of this option refers to the 8-bit li- + brary, where data units are bytes. The fourth argument should point to + an int variable. Negative values are used for special cases. However, + this means that when the 32-bit library is in non-UTF-32 mode, the full + 32-bit range of characters cannot be returned. For this reason, this + value is deprecated; use PCRE_INFO_FIRSTCHARACTERFLAGS and + PCRE_INFO_FIRSTCHARACTER instead. + + If there is a fixed first value, for example, the letter "c" from a + pattern such as (cat|cow|coyote), its value is returned. In the 8-bit + library, the value is always less than 256. In the 16-bit library the + value can be up to 0xffff. In the 32-bit library the value can be up to + 0x10ffff. + + If there is no fixed first value, and if either + + (a) the pattern was compiled with the PCRE_MULTILINE option, and every + branch starts with "^", or + + (b) every branch of the pattern starts with ".*" and PCRE_DOTALL is not + set (if it were set, the pattern would be anchored), + + -1 is returned, indicating that the pattern matches only at the start + of a subject string or after any newline within the string. Otherwise + -2 is returned. For anchored patterns, -2 is returned. + + PCRE_INFO_FIRSTCHARACTER + + Return the value of the first data unit (non-UTF character) of any + matched string in the situation where PCRE_INFO_FIRSTCHARACTERFLAGS re- + turns 1; otherwise return 0. The fourth argument should point to a + uint_t variable. + + In the 8-bit library, the value is always less than 256. In the 16-bit + library the value can be up to 0xffff. In the 32-bit library in UTF-32 + mode the value can be up to 0x10ffff, and up to 0xffffffff when not us- + ing UTF-32 mode. + + PCRE_INFO_FIRSTCHARACTERFLAGS + + Return information about the first data unit of any matched string, for + a non-anchored pattern. The fourth argument should point to an int + variable. + + If there is a fixed first value, for example, the letter "c" from a + pattern such as (cat|cow|coyote), 1 is returned, and the character + value can be retrieved using PCRE_INFO_FIRSTCHARACTER. If there is no + fixed first value, and if either + + (a) the pattern was compiled with the PCRE_MULTILINE option, and every + branch starts with "^", or + + (b) every branch of the pattern starts with ".*" and PCRE_DOTALL is not + set (if it were set, the pattern would be anchored), + + 2 is returned, indicating that the pattern matches only at the start of + a subject string or after any newline within the string. Otherwise 0 is + returned. For anchored patterns, 0 is returned. + + PCRE_INFO_FIRSTTABLE + + If the pattern was studied, and this resulted in the construction of a + 256-bit table indicating a fixed set of values for the first data unit + in any matching string, a pointer to the table is returned. Otherwise + NULL is returned. The fourth argument should point to an unsigned char + * variable. + + PCRE_INFO_HASCRORLF + + Return 1 if the pattern contains any explicit matches for CR or LF + characters, otherwise 0. The fourth argument should point to an int + variable. An explicit match is either a literal CR or LF character, or + \r or \n. + + PCRE_INFO_JCHANGED + + Return 1 if the (?J) or (?-J) option setting is used in the pattern, + otherwise 0. The fourth argument should point to an int variable. (?J) + and (?-J) set and unset the local PCRE_DUPNAMES option, respectively. + + PCRE_INFO_JIT + + Return 1 if the pattern was studied with one of the JIT options, and + just-in-time compiling was successful. The fourth argument should point + to an int variable. A return value of 0 means that JIT support is not + available in this version of PCRE, or that the pattern was not studied + with a JIT option, or that the JIT compiler could not handle this par- + ticular pattern. See the pcrejit documentation for details of what can + and cannot be handled. + + PCRE_INFO_JITSIZE + + If the pattern was successfully studied with a JIT option, return the + size of the JIT compiled code, otherwise return zero. The fourth argu- + ment should point to a size_t variable. + + PCRE_INFO_LASTLITERAL + + Return the value of the rightmost literal data unit that must exist in + any matched string, other than at its start, if such a value has been + recorded. The fourth argument should point to an int variable. If there + is no such value, -1 is returned. For anchored patterns, a last literal + value is recorded only if it follows something of variable length. For + example, for the pattern /^a\d+z\d+/ the returned value is "z", but for + /^a\dz\d/ the returned value is -1. + + Since for the 32-bit library using the non-UTF-32 mode, this function + is unable to return the full 32-bit range of characters, this value is + deprecated; instead the PCRE_INFO_REQUIREDCHARFLAGS and PCRE_INFO_RE- + QUIREDCHAR values should be used. + + PCRE_INFO_MATCH_EMPTY + + Return 1 if the pattern can match an empty string, otherwise 0. The + fourth argument should point to an int variable. + + PCRE_INFO_MATCHLIMIT + + If the pattern set a match limit by including an item of the form + (*LIMIT_MATCH=nnnn) at the start, the value is returned. The fourth ar- + gument should point to an unsigned 32-bit integer. If no such value has + been set, the call to pcre_fullinfo() returns the error PCRE_ERROR_UN- + SET. + + PCRE_INFO_MAXLOOKBEHIND + + Return the number of characters (NB not data units) in the longest + lookbehind assertion in the pattern. This information is useful when + doing multi-segment matching using the partial matching facilities. + Note that the simple assertions \b and \B require a one-character look- + behind. \A also registers a one-character lookbehind, though it does + not actually inspect the previous character. This is to ensure that at + least one character from the old segment is retained when a new segment + is processed. Otherwise, if there are no lookbehinds in the pattern, \A + might match incorrectly at the start of a new segment. + + PCRE_INFO_MINLENGTH + + If the pattern was studied and a minimum length for matching subject + strings was computed, its value is returned. Otherwise the returned + value is -1. The value is a number of characters, which in UTF mode may + be different from the number of data units. The fourth argument should + point to an int variable. A non-negative value is a lower bound to the + length of any matching string. There may not be any strings of that + length that do actually match, but every string that does match is at + least that long. + + PCRE_INFO_NAMECOUNT + PCRE_INFO_NAMEENTRYSIZE + PCRE_INFO_NAMETABLE + + PCRE supports the use of named as well as numbered capturing parenthe- + ses. The names are just an additional way of identifying the parenthe- + ses, which still acquire numbers. Several convenience functions such as + pcre_get_named_substring() are provided for extracting captured sub- + strings by name. It is also possible to extract the data directly, by + first converting the name to a number in order to access the correct + pointers in the output vector (described with pcre_exec() below). To do + the conversion, you need to use the name-to-number map, which is de- + scribed by these three values. + + The map consists of a number of fixed-size entries. PCRE_INFO_NAMECOUNT + gives the number of entries, and PCRE_INFO_NAMEENTRYSIZE gives the size + of each entry; both of these return an int value. The entry size de- + pends on the length of the longest name. PCRE_INFO_NAMETABLE returns a + pointer to the first entry of the table. This is a pointer to char in + the 8-bit library, where the first two bytes of each entry are the num- + ber of the capturing parenthesis, most significant byte first. In the + 16-bit library, the pointer points to 16-bit data units, the first of + which contains the parenthesis number. In the 32-bit library, the + pointer points to 32-bit data units, the first of which contains the + parenthesis number. The rest of the entry is the corresponding name, + zero terminated. + + The names are in alphabetical order. If (?| is used to create multiple + groups with the same number, as described in the section on duplicate + subpattern numbers in the pcrepattern page, the groups may be given the + same name, but there is only one entry in the table. Different names + for groups of the same number are not permitted. Duplicate names for + subpatterns with different numbers are permitted, but only if PCRE_DUP- + NAMES is set. They appear in the table in the order in which they were + found in the pattern. In the absence of (?| this is the order of in- + creasing number; when (?| is used this is not necessarily the case be- + cause later subpatterns may have lower numbers. + + As a simple example of the name/number table, consider the following + pattern after compilation by the 8-bit library (assume PCRE_EXTENDED is + set, so white space - including newlines - is ignored): + + (? (?(\d\d)?\d\d) - + (?\d\d) - (?\d\d) ) + + There are four named subpatterns, so the table has four entries, and + each entry in the table is eight bytes long. The table is as follows, + with non-printing bytes shows in hexadecimal, and undefined bytes shown + as ??: + + 00 01 d a t e 00 ?? + 00 05 d a y 00 ?? ?? + 00 04 m o n t h 00 + 00 02 y e a r 00 ?? + + When writing code to extract data from named subpatterns using the + name-to-number map, remember that the length of the entries is likely + to be different for each compiled pattern. + + PCRE_INFO_OKPARTIAL + + Return 1 if the pattern can be used for partial matching with + pcre_exec(), otherwise 0. The fourth argument should point to an int + variable. From release 8.00, this always returns 1, because the re- + strictions that previously applied to partial matching have been + lifted. The pcrepartial documentation gives details of partial match- + ing. + + PCRE_INFO_OPTIONS + + Return a copy of the options with which the pattern was compiled. The + fourth argument should point to an unsigned long int variable. These + option bits are those specified in the call to pcre_compile(), modified + by any top-level option settings at the start of the pattern itself. In + other words, they are the options that will be in force when matching + starts. For example, if the pattern /(?im)abc(?-i)d/ is compiled with + the PCRE_EXTENDED option, the result is PCRE_CASELESS, PCRE_MULTILINE, + and PCRE_EXTENDED. + + A pattern is automatically anchored by PCRE if all of its top-level al- + ternatives begin with one of the following: + + ^ unless PCRE_MULTILINE is set + \A always + \G always + .* if PCRE_DOTALL is set and there are no back + references to the subpattern in which .* appears + + For such patterns, the PCRE_ANCHORED bit is set in the options returned + by pcre_fullinfo(). + + PCRE_INFO_RECURSIONLIMIT + + If the pattern set a recursion limit by including an item of the form + (*LIMIT_RECURSION=nnnn) at the start, the value is returned. The fourth + argument should point to an unsigned 32-bit integer. If no such value + has been set, the call to pcre_fullinfo() returns the error PCRE_ER- + ROR_UNSET. + + PCRE_INFO_SIZE + + Return the size of the compiled pattern in bytes (for all three li- + braries). The fourth argument should point to a size_t variable. This + value does not include the size of the pcre structure that is returned + by pcre_compile(). The value that is passed as the argument to + pcre_malloc() when pcre_compile() is getting memory in which to place + the compiled data is the value returned by this option plus the size of + the pcre structure. Studying a compiled pattern, with or without JIT, + does not alter the value returned by this option. + + PCRE_INFO_STUDYSIZE + + Return the size in bytes (for all three libraries) of the data block + pointed to by the study_data field in a pcre_extra block. If pcre_extra + is NULL, or there is no study data, zero is returned. The fourth argu- + ment should point to a size_t variable. The study_data field is set by + pcre_study() to record information that will speed up matching (see the + section entitled "Studying a pattern" above). The format of the + study_data block is private, but its length is made available via this + option so that it can be saved and restored (see the pcreprecompile + documentation for details). + + PCRE_INFO_REQUIREDCHARFLAGS + + Returns 1 if there is a rightmost literal data unit that must exist in + any matched string, other than at its start. The fourth argument should + point to an int variable. If there is no such value, 0 is returned. If + returning 1, the character value itself can be retrieved using + PCRE_INFO_REQUIREDCHAR. + + For anchored patterns, a last literal value is recorded only if it fol- + lows something of variable length. For example, for the pattern + /^a\d+z\d+/ the returned value 1 (with "z" returned from PCRE_INFO_RE- + QUIREDCHAR), but for /^a\dz\d/ the returned value is 0. + + PCRE_INFO_REQUIREDCHAR + + Return the value of the rightmost literal data unit that must exist in + any matched string, other than at its start, if such a value has been + recorded. The fourth argument should point to a uint32_t variable. If + there is no such value, 0 is returned. + + +REFERENCE COUNTS + + int pcre_refcount(pcre *code, int adjust); + + The pcre_refcount() function is used to maintain a reference count in + the data block that contains a compiled pattern. It is provided for the + benefit of applications that operate in an object-oriented manner, + where different parts of the application may be using the same compiled + pattern, but you want to free the block when they are all done. + + When a pattern is compiled, the reference count field is initialized to + zero. It is changed only by calling this function, whose action is to + add the adjust value (which may be positive or negative) to it. The + yield of the function is the new value. However, the value of the count + is constrained to lie between 0 and 65535, inclusive. If the new value + is outside these limits, it is forced to the appropriate limit value. + + Except when it is zero, the reference count is not correctly preserved + if a pattern is compiled on one host and then transferred to a host + whose byte-order is different. (This seems a highly unlikely scenario.) + + +MATCHING A PATTERN: THE TRADITIONAL FUNCTION + + int pcre_exec(const pcre *code, const pcre_extra *extra, + const char *subject, int length, int startoffset, + int options, int *ovector, int ovecsize); + + The function pcre_exec() is called to match a subject string against a + compiled pattern, which is passed in the code argument. If the pattern + was studied, the result of the study should be passed in the extra ar- + gument. You can call pcre_exec() with the same code and extra arguments + as many times as you like, in order to match different subject strings + with the same pattern. + + This function is the main matching facility of the library, and it op- + erates in a Perl-like manner. For specialist use there is also an al- + ternative matching function, which is described below in the section + about the pcre_dfa_exec() function. + + In most applications, the pattern will have been compiled (and option- + ally studied) in the same process that calls pcre_exec(). However, it + is possible to save compiled patterns and study data, and then use them + later in different processes, possibly even on different hosts. For a + discussion about this, see the pcreprecompile documentation. + + Here is an example of a simple call to pcre_exec(): + + int rc; + int ovector[30]; + rc = pcre_exec( + re, /* result of pcre_compile() */ + NULL, /* we didn't study the pattern */ + "some string", /* the subject string */ + 11, /* the length of the subject string */ + 0, /* start at offset 0 in the subject */ + 0, /* default options */ + ovector, /* vector of integers for substring information */ + 30); /* number of elements (NOT size in bytes) */ + + Extra data for pcre_exec() + + If the extra argument is not NULL, it must point to a pcre_extra data + block. The pcre_study() function returns such a block (when it doesn't + return NULL), but you can also create one for yourself, and pass addi- + tional information in it. The pcre_extra block contains the following + fields (not necessarily in this order): + + unsigned long int flags; + void *study_data; + void *executable_jit; + unsigned long int match_limit; + unsigned long int match_limit_recursion; + void *callout_data; + const unsigned char *tables; + unsigned char **mark; + + In the 16-bit version of this structure, the mark field has type + "PCRE_UCHAR16 **". + + In the 32-bit version of this structure, the mark field has type + "PCRE_UCHAR32 **". + + The flags field is used to specify which of the other fields are set. + The flag bits are: + + PCRE_EXTRA_CALLOUT_DATA + PCRE_EXTRA_EXECUTABLE_JIT + PCRE_EXTRA_MARK + PCRE_EXTRA_MATCH_LIMIT + PCRE_EXTRA_MATCH_LIMIT_RECURSION + PCRE_EXTRA_STUDY_DATA + PCRE_EXTRA_TABLES + + Other flag bits should be set to zero. The study_data field and some- + times the executable_jit field are set in the pcre_extra block that is + returned by pcre_study(), together with the appropriate flag bits. You + should not set these yourself, but you may add to the block by setting + other fields and their corresponding flag bits. + + The match_limit field provides a means of preventing PCRE from using up + a vast amount of resources when running patterns that are not going to + match, but which have a very large number of possibilities in their + search trees. The classic example is a pattern that uses nested unlim- + ited repeats. + + Internally, pcre_exec() uses a function called match(), which it calls + repeatedly (sometimes recursively). The limit set by match_limit is im- + posed on the number of times this function is called during a match, + which has the effect of limiting the amount of backtracking that can + take place. For patterns that are not anchored, the count restarts from + zero for each position in the subject string. + + When pcre_exec() is called with a pattern that was successfully studied + with a JIT option, the way that the matching is executed is entirely + different. However, there is still the possibility of runaway matching + that goes on for a very long time, and so the match_limit value is also + used in this case (but in a different way) to limit how long the match- + ing can continue. + + The default value for the limit can be set when PCRE is built; the de- + fault default is 10 million, which handles all but the most extreme + cases. You can override the default by suppling pcre_exec() with a + pcre_extra block in which match_limit is set, and PCRE_EX- + TRA_MATCH_LIMIT is set in the flags field. If the limit is exceeded, + pcre_exec() returns PCRE_ERROR_MATCHLIMIT. + + A value for the match limit may also be supplied by an item at the + start of a pattern of the form + + (*LIMIT_MATCH=d) + + where d is a decimal number. However, such a setting is ignored unless + d is less than the limit set by the caller of pcre_exec() or, if no + such limit is set, less than the default. + + The match_limit_recursion field is similar to match_limit, but instead + of limiting the total number of times that match() is called, it limits + the depth of recursion. The recursion depth is a smaller number than + the total number of calls, because not all calls to match() are recur- + sive. This limit is of use only if it is set smaller than match_limit. + + Limiting the recursion depth limits the amount of machine stack that + can be used, or, when PCRE has been compiled to use memory on the heap + instead of the stack, the amount of heap memory that can be used. This + limit is not relevant, and is ignored, when matching is done using JIT + compiled code. + + The default value for match_limit_recursion can be set when PCRE is + built; the default default is the same value as the default for + match_limit. You can override the default by suppling pcre_exec() with + a pcre_extra block in which match_limit_recursion is set, and PCRE_EX- + TRA_MATCH_LIMIT_RECURSION is set in the flags field. If the limit is + exceeded, pcre_exec() returns PCRE_ERROR_RECURSIONLIMIT. + + A value for the recursion limit may also be supplied by an item at the + start of a pattern of the form + + (*LIMIT_RECURSION=d) + + where d is a decimal number. However, such a setting is ignored unless + d is less than the limit set by the caller of pcre_exec() or, if no + such limit is set, less than the default. + + The callout_data field is used in conjunction with the "callout" fea- + ture, and is described in the pcrecallout documentation. + + The tables field is provided for use with patterns that have been pre- + compiled using custom character tables, saved to disc or elsewhere, and + then reloaded, because the tables that were used to compile a pattern + are not saved with it. See the pcreprecompile documentation for a dis- + cussion of saving compiled patterns for later use. If NULL is passed + using this mechanism, it forces PCRE's internal tables to be used. + + Warning: The tables that pcre_exec() uses must be the same as those + that were used when the pattern was compiled. If this is not the case, + the behaviour of pcre_exec() is undefined. Therefore, when a pattern is + compiled and matched in the same process, this field should never be + set. In this (the most common) case, the correct table pointer is auto- + matically passed with the compiled pattern from pcre_compile() to + pcre_exec(). + + If PCRE_EXTRA_MARK is set in the flags field, the mark field must be + set to point to a suitable variable. If the pattern contains any back- + tracking control verbs such as (*MARK:NAME), and the execution ends up + with a name to pass back, a pointer to the name string (zero termi- + nated) is placed in the variable pointed to by the mark field. The + names are within the compiled pattern; if you wish to retain such a + name you must copy it before freeing the memory of a compiled pattern. + If there is no name to pass back, the variable pointed to by the mark + field is set to NULL. For details of the backtracking control verbs, + see the section entitled "Backtracking control" in the pcrepattern doc- + umentation. + + Option bits for pcre_exec() + + The unused bits of the options argument for pcre_exec() must be zero. + The only bits that may be set are PCRE_ANCHORED, PCRE_NEWLINE_xxx, + PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, + PCRE_NO_START_OPTIMIZE, PCRE_NO_UTF8_CHECK, PCRE_PARTIAL_HARD, and + PCRE_PARTIAL_SOFT. + + If the pattern was successfully studied with one of the just-in-time + (JIT) compile options, the only supported options for JIT execution are + PCRE_NO_UTF8_CHECK, PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, + PCRE_NOTEMPTY_ATSTART, PCRE_PARTIAL_HARD, and PCRE_PARTIAL_SOFT. If an + unsupported option is used, JIT execution is disabled and the normal + interpretive code in pcre_exec() is run. + + PCRE_ANCHORED + + The PCRE_ANCHORED option limits pcre_exec() to matching at the first + matching position. If a pattern was compiled with PCRE_ANCHORED, or + turned out to be anchored by virtue of its contents, it cannot be made + unachored at matching time. + + PCRE_BSR_ANYCRLF + PCRE_BSR_UNICODE + + These options (which are mutually exclusive) control what the \R escape + sequence matches. The choice is either to match only CR, LF, or CRLF, + or to match any Unicode newline sequence. These options override the + choice that was made or defaulted when the pattern was compiled. + + PCRE_NEWLINE_CR + PCRE_NEWLINE_LF + PCRE_NEWLINE_CRLF + PCRE_NEWLINE_ANYCRLF + PCRE_NEWLINE_ANY + + These options override the newline definition that was chosen or de- + faulted when the pattern was compiled. For details, see the description + of pcre_compile() above. During matching, the newline choice affects + the behaviour of the dot, circumflex, and dollar metacharacters. It may + also alter the way the match position is advanced after a match failure + for an unanchored pattern. + + When PCRE_NEWLINE_CRLF, PCRE_NEWLINE_ANYCRLF, or PCRE_NEWLINE_ANY is + set, and a match attempt for an unanchored pattern fails when the cur- + rent position is at a CRLF sequence, and the pattern contains no ex- + plicit matches for CR or LF characters, the match position is advanced + by two characters instead of one, in other words, to after the CRLF. + + The above rule is a compromise that makes the most common cases work as + expected. For example, if the pattern is .+A (and the PCRE_DOTALL op- + tion is not set), it does not match the string "\r\nA" because, after + failing at the start, it skips both the CR and the LF before retrying. + However, the pattern [\r\n]A does match that string, because it con- + tains an explicit CR or LF reference, and so advances only by one char- + acter after the first failure. + + An explicit match for CR of LF is either a literal appearance of one of + those characters, or one of the \r or \n escape sequences. Implicit + matches such as [^X] do not count, nor does \s (which includes CR and + LF in the characters that it matches). + + Notwithstanding the above, anomalous effects may still occur when CRLF + is a valid newline sequence and explicit \r or \n escapes appear in the + pattern. + + PCRE_NOTBOL + + This option specifies that first character of the subject string is not + the beginning of a line, so the circumflex metacharacter should not + match before it. Setting this without PCRE_MULTILINE (at compile time) + causes circumflex never to match. This option affects only the behav- + iour of the circumflex metacharacter. It does not affect \A. + + PCRE_NOTEOL + + This option specifies that the end of the subject string is not the end + of a line, so the dollar metacharacter should not match it nor (except + in multiline mode) a newline immediately before it. Setting this with- + out PCRE_MULTILINE (at compile time) causes dollar never to match. This + option affects only the behaviour of the dollar metacharacter. It does + not affect \Z or \z. + + PCRE_NOTEMPTY + + An empty string is not considered to be a valid match if this option is + set. If there are alternatives in the pattern, they are tried. If all + the alternatives match the empty string, the entire match fails. For + example, if the pattern + + a?b? + + is applied to a string not beginning with "a" or "b", it matches an + empty string at the start of the subject. With PCRE_NOTEMPTY set, this + match is not valid, so PCRE searches further into the string for occur- + rences of "a" or "b". + + PCRE_NOTEMPTY_ATSTART + + This is like PCRE_NOTEMPTY, except that an empty string match that is + not at the start of the subject is permitted. If the pattern is an- + chored, such a match can occur only if the pattern contains \K. + + Perl has no direct equivalent of PCRE_NOTEMPTY or PCRE_NOTEMPTY_AT- + START, but it does make a special case of a pattern match of the empty + string within its split() function, and when using the /g modifier. It + is possible to emulate Perl's behaviour after matching a null string by + first trying the match again at the same offset with PCRE_NOTEMPTY_AT- + START and PCRE_ANCHORED, and then if that fails, by advancing the + starting offset (see below) and trying an ordinary match again. There + is some code that demonstrates how to do this in the pcredemo sample + program. In the most general case, you have to check to see if the new- + line convention recognizes CRLF as a newline, and if so, and the cur- + rent character is CR followed by LF, advance the starting offset by two + characters instead of one. + + PCRE_NO_START_OPTIMIZE + + There are a number of optimizations that pcre_exec() uses at the start + of a match, in order to speed up the process. For example, if it is + known that an unanchored match must start with a specific character, it + searches the subject for that character, and fails immediately if it + cannot find it, without actually running the main matching function. + This means that a special item such as (*COMMIT) at the start of a pat- + tern is not considered until after a suitable starting point for the + match has been found. Also, when callouts or (*MARK) items are in use, + these "start-up" optimizations can cause them to be skipped if the pat- + tern is never actually used. The start-up optimizations are in effect a + pre-scan of the subject that takes place before the pattern is run. + + The PCRE_NO_START_OPTIMIZE option disables the start-up optimizations, + possibly causing performance to suffer, but ensuring that in cases + where the result is "no match", the callouts do occur, and that items + such as (*COMMIT) and (*MARK) are considered at every possible starting + position in the subject string. If PCRE_NO_START_OPTIMIZE is set at + compile time, it cannot be unset at matching time. The use of + PCRE_NO_START_OPTIMIZE at matching time (that is, passing it to + pcre_exec()) disables JIT execution; in this situation, matching is al- + ways done using interpretively. + + Setting PCRE_NO_START_OPTIMIZE can change the outcome of a matching op- + eration. Consider the pattern + + (*COMMIT)ABC + + When this is compiled, PCRE records the fact that a match must start + with the character "A". Suppose the subject string is "DEFABC". The + start-up optimization scans along the subject, finds "A" and runs the + first match attempt from there. The (*COMMIT) item means that the pat- + tern must match the current starting position, which in this case, it + does. However, if the same match is run with PCRE_NO_START_OPTIMIZE + set, the initial scan along the subject string does not happen. The + first match attempt is run starting from "D" and when this fails, + (*COMMIT) prevents any further matches being tried, so the overall re- + sult is "no match". If the pattern is studied, more start-up optimiza- + tions may be used. For example, a minimum length for the subject may be + recorded. Consider the pattern + + (*MARK:A)(X|Y) + + The minimum length for a match is one character. If the subject is + "ABC", there will be attempts to match "ABC", "BC", "C", and then fi- + nally an empty string. If the pattern is studied, the final attempt + does not take place, because PCRE knows that the subject is too short, + and so the (*MARK) is never encountered. In this case, studying the + pattern does not affect the overall match result, which is still "no + match", but it does affect the auxiliary information that is returned. + + PCRE_NO_UTF8_CHECK + + When PCRE_UTF8 is set at compile time, the validity of the subject as a + UTF-8 string is automatically checked when pcre_exec() is subsequently + called. The entire string is checked before any other processing takes + place. The value of startoffset is also checked to ensure that it + points to the start of a UTF-8 character. There is a discussion about + the validity of UTF-8 strings in the pcreunicode page. If an invalid + sequence of bytes is found, pcre_exec() returns the error PCRE_ER- + ROR_BADUTF8 or, if PCRE_PARTIAL_HARD is set and the problem is a trun- + cated character at the end of the subject, PCRE_ERROR_SHORTUTF8. In + both cases, information about the precise nature of the error may also + be returned (see the descriptions of these errors in the section enti- + tled Error return values from pcre_exec() below). If startoffset con- + tains a value that does not point to the start of a UTF-8 character (or + to the end of the subject), PCRE_ERROR_BADUTF8_OFFSET is returned. + + If you already know that your subject is valid, and you want to skip + these checks for performance reasons, you can set the + PCRE_NO_UTF8_CHECK option when calling pcre_exec(). You might want to + do this for the second and subsequent calls to pcre_exec() if you are + making repeated calls to find all the matches in a single subject + string. However, you should be sure that the value of startoffset + points to the start of a character (or the end of the subject). When + PCRE_NO_UTF8_CHECK is set, the effect of passing an invalid string as a + subject or an invalid value of startoffset is undefined. Your program + may crash or loop. + + PCRE_PARTIAL_HARD + PCRE_PARTIAL_SOFT + + These options turn on the partial matching feature. For backwards com- + patibility, PCRE_PARTIAL is a synonym for PCRE_PARTIAL_SOFT. A partial + match occurs if the end of the subject string is reached successfully, + but there are not enough subject characters to complete the match. If + this happens when PCRE_PARTIAL_SOFT (but not PCRE_PARTIAL_HARD) is set, + matching continues by testing any remaining alternatives. Only if no + complete match can be found is PCRE_ERROR_PARTIAL returned instead of + PCRE_ERROR_NOMATCH. In other words, PCRE_PARTIAL_SOFT says that the + caller is prepared to handle a partial match, but only if no complete + match can be found. + + If PCRE_PARTIAL_HARD is set, it overrides PCRE_PARTIAL_SOFT. In this + case, if a partial match is found, pcre_exec() immediately returns + PCRE_ERROR_PARTIAL, without considering any other alternatives. In + other words, when PCRE_PARTIAL_HARD is set, a partial match is consid- + ered to be more important that an alternative complete match. + + In both cases, the portion of the string that was inspected when the + partial match was found is set as the first matching string. There is a + more detailed discussion of partial and multi-segment matching, with + examples, in the pcrepartial documentation. + + The string to be matched by pcre_exec() + + The subject string is passed to pcre_exec() as a pointer in subject, a + length in length, and a starting offset in startoffset. The units for + length and startoffset are bytes for the 8-bit library, 16-bit data + items for the 16-bit library, and 32-bit data items for the 32-bit li- + brary. + + If startoffset is negative or greater than the length of the subject, + pcre_exec() returns PCRE_ERROR_BADOFFSET. When the starting offset is + zero, the search for a match starts at the beginning of the subject, + and this is by far the most common case. In UTF-8 or UTF-16 mode, the + offset must point to the start of a character, or the end of the sub- + ject (in UTF-32 mode, one data unit equals one character, so all off- + sets are valid). Unlike the pattern string, the subject may contain bi- + nary zeroes. + + A non-zero starting offset is useful when searching for another match + in the same subject by calling pcre_exec() again after a previous suc- + cess. Setting startoffset differs from just passing over a shortened + string and setting PCRE_NOTBOL in the case of a pattern that begins + with any kind of lookbehind. For example, consider the pattern + + \Biss\B + + which finds occurrences of "iss" in the middle of words. (\B matches + only if the current position in the subject is not a word boundary.) + When applied to the string "Mississipi" the first call to pcre_exec() + finds the first occurrence. If pcre_exec() is called again with just + the remainder of the subject, namely "issipi", it does not match, be- + cause \B is always false at the start of the subject, which is deemed + to be a word boundary. However, if pcre_exec() is passed the entire + string again, but with startoffset set to 4, it finds the second occur- + rence of "iss" because it is able to look behind the starting point to + discover that it is preceded by a letter. + + Finding all the matches in a subject is tricky when the pattern can + match an empty string. It is possible to emulate Perl's /g behaviour by + first trying the match again at the same offset, with the + PCRE_NOTEMPTY_ATSTART and PCRE_ANCHORED options, and then if that + fails, advancing the starting offset and trying an ordinary match + again. There is some code that demonstrates how to do this in the pcre- + demo sample program. In the most general case, you have to check to see + if the newline convention recognizes CRLF as a newline, and if so, and + the current character is CR followed by LF, advance the starting offset + by two characters instead of one. + + If a non-zero starting offset is passed when the pattern is anchored, + one attempt to match at the given offset is made. This can only succeed + if the pattern does not require the match to be at the start of the + subject. + + How pcre_exec() returns captured substrings + + In general, a pattern matches a certain portion of the subject, and in + addition, further substrings from the subject may be picked out by + parts of the pattern. Following the usage in Jeffrey Friedl's book, + this is called "capturing" in what follows, and the phrase "capturing + subpattern" is used for a fragment of a pattern that picks out a sub- + string. PCRE supports several other kinds of parenthesized subpattern + that do not cause substrings to be captured. + + Captured substrings are returned to the caller via a vector of integers + whose address is passed in ovector. The number of elements in the vec- + tor is passed in ovecsize, which must be a non-negative number. Note: + this argument is NOT the size of ovector in bytes. + + The first two-thirds of the vector is used to pass back captured sub- + strings, each substring using a pair of integers. The remaining third + of the vector is used as workspace by pcre_exec() while matching cap- + turing subpatterns, and is not available for passing back information. + The number passed in ovecsize should always be a multiple of three. If + it is not, it is rounded down. + + When a match is successful, information about captured substrings is + returned in pairs of integers, starting at the beginning of ovector, + and continuing up to two-thirds of its length at the most. The first + element of each pair is set to the offset of the first character in a + substring, and the second is set to the offset of the first character + after the end of a substring. These values are always data unit off- + sets, even in UTF mode. They are byte offsets in the 8-bit library, + 16-bit data item offsets in the 16-bit library, and 32-bit data item + offsets in the 32-bit library. Note: they are not character counts. + + The first pair of integers, ovector[0] and ovector[1], identify the + portion of the subject string matched by the entire pattern. The next + pair is used for the first capturing subpattern, and so on. The value + returned by pcre_exec() is one more than the highest numbered pair that + has been set. For example, if two substrings have been captured, the + returned value is 3. If there are no capturing subpatterns, the return + value from a successful match is 1, indicating that just the first pair + of offsets has been set. + + If a capturing subpattern is matched repeatedly, it is the last portion + of the string that it matched that is returned. + + If the vector is too small to hold all the captured substring offsets, + it is used as far as possible (up to two-thirds of its length), and the + function returns a value of zero. If neither the actual string matched + nor any captured substrings are of interest, pcre_exec() may be called + with ovector passed as NULL and ovecsize as zero. However, if the pat- + tern contains back references and the ovector is not big enough to re- + member the related substrings, PCRE has to get additional memory for + use during matching. Thus it is usually advisable to supply an ovector + of reasonable size. + + There are some cases where zero is returned (indicating vector over- + flow) when in fact the vector is exactly the right size for the final + match. For example, consider the pattern + + (a)(?:(b)c|bd) + + If a vector of 6 elements (allowing for only 1 captured substring) is + given with subject string "abd", pcre_exec() will try to set the second + captured string, thereby recording a vector overflow, before failing to + match "c" and backing up to try the second alternative. The zero re- + turn, however, does correctly indicate that the maximum number of slots + (namely 2) have been filled. In similar cases where there is temporary + overflow, but the final number of used slots is actually less than the + maximum, a non-zero value is returned. + + The pcre_fullinfo() function can be used to find out how many capturing + subpatterns there are in a compiled pattern. The smallest size for + ovector that will allow for n captured substrings, in addition to the + offsets of the substring matched by the whole pattern, is (n+1)*3. + + It is possible for capturing subpattern number n+1 to match some part + of the subject when subpattern n has not been used at all. For example, + if the string "abc" is matched against the pattern (a|(z))(bc) the re- + turn from the function is 4, and subpatterns 1 and 3 are matched, but 2 + is not. When this happens, both values in the offset pairs correspond- + ing to unused subpatterns are set to -1. + + Offset values that correspond to unused subpatterns at the end of the + expression are also set to -1. For example, if the string "abc" is + matched against the pattern (abc)(x(yz)?)? subpatterns 2 and 3 are not + matched. The return from the function is 2, because the highest used + capturing subpattern number is 1, and the offsets for for the second + and third capturing subpatterns (assuming the vector is large enough, + of course) are set to -1. + + Note: Elements in the first two-thirds of ovector that do not corre- + spond to capturing parentheses in the pattern are never changed. That + is, if a pattern contains n capturing parentheses, no more than ovec- + tor[0] to ovector[2n+1] are set by pcre_exec(). The other elements (in + the first two-thirds) retain whatever values they previously had. + + Some convenience functions are provided for extracting the captured + substrings as separate strings. These are described below. + + Error return values from pcre_exec() + + If pcre_exec() fails, it returns a negative number. The following are + defined in the header file: + + PCRE_ERROR_NOMATCH (-1) + + The subject string did not match the pattern. + + PCRE_ERROR_NULL (-2) + + Either code or subject was passed as NULL, or ovector was NULL and + ovecsize was not zero. + + PCRE_ERROR_BADOPTION (-3) + + An unrecognized bit was set in the options argument. + + PCRE_ERROR_BADMAGIC (-4) + + PCRE stores a 4-byte "magic number" at the start of the compiled code, + to catch the case when it is passed a junk pointer and to detect when a + pattern that was compiled in an environment of one endianness is run in + an environment with the other endianness. This is the error that PCRE + gives when the magic number is not present. + + PCRE_ERROR_UNKNOWN_OPCODE (-5) + + While running the pattern match, an unknown item was encountered in the + compiled pattern. This error could be caused by a bug in PCRE or by + overwriting of the compiled pattern. + + PCRE_ERROR_NOMEMORY (-6) + + If a pattern contains back references, but the ovector that is passed + to pcre_exec() is not big enough to remember the referenced substrings, + PCRE gets a block of memory at the start of matching to use for this + purpose. If the call via pcre_malloc() fails, this error is given. The + memory is automatically freed at the end of matching. + + This error is also given if pcre_stack_malloc() fails in pcre_exec(). + This can happen only when PCRE has been compiled with --disable-stack- + for-recursion. + + PCRE_ERROR_NOSUBSTRING (-7) + + This error is used by the pcre_copy_substring(), pcre_get_substring(), + and pcre_get_substring_list() functions (see below). It is never re- + turned by pcre_exec(). + + PCRE_ERROR_MATCHLIMIT (-8) + + The backtracking limit, as specified by the match_limit field in a + pcre_extra structure (or defaulted) was reached. See the description + above. + + PCRE_ERROR_CALLOUT (-9) + + This error is never generated by pcre_exec() itself. It is provided for + use by callout functions that want to yield a distinctive error code. + See the pcrecallout documentation for details. + + PCRE_ERROR_BADUTF8 (-10) + + A string that contains an invalid UTF-8 byte sequence was passed as a + subject, and the PCRE_NO_UTF8_CHECK option was not set. If the size of + the output vector (ovecsize) is at least 2, the byte offset to the + start of the the invalid UTF-8 character is placed in the first ele- + ment, and a reason code is placed in the second element. The reason + codes are listed in the following section. For backward compatibility, + if PCRE_PARTIAL_HARD is set and the problem is a truncated UTF-8 char- + acter at the end of the subject (reason codes 1 to 5), PCRE_ER- + ROR_SHORTUTF8 is returned instead of PCRE_ERROR_BADUTF8. + + PCRE_ERROR_BADUTF8_OFFSET (-11) + + The UTF-8 byte sequence that was passed as a subject was checked and + found to be valid (the PCRE_NO_UTF8_CHECK option was not set), but the + value of startoffset did not point to the beginning of a UTF-8 charac- + ter or the end of the subject. + + PCRE_ERROR_PARTIAL (-12) + + The subject string did not match, but it did match partially. See the + pcrepartial documentation for details of partial matching. + + PCRE_ERROR_BADPARTIAL (-13) + + This code is no longer in use. It was formerly returned when the + PCRE_PARTIAL option was used with a compiled pattern containing items + that were not supported for partial matching. From release 8.00 on- + wards, there are no restrictions on partial matching. + + PCRE_ERROR_INTERNAL (-14) + + An unexpected internal error has occurred. This error could be caused + by a bug in PCRE or by overwriting of the compiled pattern. + + PCRE_ERROR_BADCOUNT (-15) + + This error is given if the value of the ovecsize argument is negative. + + PCRE_ERROR_RECURSIONLIMIT (-21) + + The internal recursion limit, as specified by the match_limit_recursion + field in a pcre_extra structure (or defaulted) was reached. See the de- + scription above. + + PCRE_ERROR_BADNEWLINE (-23) + + An invalid combination of PCRE_NEWLINE_xxx options was given. + + PCRE_ERROR_BADOFFSET (-24) + + The value of startoffset was negative or greater than the length of the + subject, that is, the value in length. + + PCRE_ERROR_SHORTUTF8 (-25) + + This error is returned instead of PCRE_ERROR_BADUTF8 when the subject + string ends with a truncated UTF-8 character and the PCRE_PARTIAL_HARD + option is set. Information about the failure is returned as for + PCRE_ERROR_BADUTF8. It is in fact sufficient to detect this case, but + this special error code for PCRE_PARTIAL_HARD precedes the implementa- + tion of returned information; it is retained for backwards compatibil- + ity. + + PCRE_ERROR_RECURSELOOP (-26) + + This error is returned when pcre_exec() detects a recursion loop within + the pattern. Specifically, it means that either the whole pattern or a + subpattern has been called recursively for the second time at the same + position in the subject string. Some simple patterns that might do this + are detected and faulted at compile time, but more complicated cases, + in particular mutual recursions between two different subpatterns, can- + not be detected until run time. + + PCRE_ERROR_JIT_STACKLIMIT (-27) + + This error is returned when a pattern that was successfully studied us- + ing a JIT compile option is being matched, but the memory available for + the just-in-time processing stack is not large enough. See the pcrejit + documentation for more details. + + PCRE_ERROR_BADMODE (-28) + + This error is given if a pattern that was compiled by the 8-bit library + is passed to a 16-bit or 32-bit library function, or vice versa. + + PCRE_ERROR_BADENDIANNESS (-29) + + This error is given if a pattern that was compiled and saved is + reloaded on a host with different endianness. The utility function + pcre_pattern_to_host_byte_order() can be used to convert such a pattern + so that it runs on the new host. + + PCRE_ERROR_JIT_BADOPTION + + This error is returned when a pattern that was successfully studied us- + ing a JIT compile option is being matched, but the matching mode (par- + tial or complete match) does not correspond to any JIT compilation + mode. When the JIT fast path function is used, this error may be also + given for invalid options. See the pcrejit documentation for more de- + tails. + + PCRE_ERROR_BADLENGTH (-32) + + This error is given if pcre_exec() is called with a negative value for + the length argument. + + Error numbers -16 to -20, -22, and 30 are not used by pcre_exec(). + + Reason codes for invalid UTF-8 strings + + This section applies only to the 8-bit library. The corresponding in- + formation for the 16-bit and 32-bit libraries is given in the pcre16 + and pcre32 pages. + + When pcre_exec() returns either PCRE_ERROR_BADUTF8 or PCRE_ERROR_SHORT- + UTF8, and the size of the output vector (ovecsize) is at least 2, the + offset of the start of the invalid UTF-8 character is placed in the + first output vector element (ovector[0]) and a reason code is placed in + the second element (ovector[1]). The reason codes are given names in + the pcre.h header file: + + PCRE_UTF8_ERR1 + PCRE_UTF8_ERR2 + PCRE_UTF8_ERR3 + PCRE_UTF8_ERR4 + PCRE_UTF8_ERR5 + + The string ends with a truncated UTF-8 character; the code specifies + how many bytes are missing (1 to 5). Although RFC 3629 restricts UTF-8 + characters to be no longer than 4 bytes, the encoding scheme (origi- + nally defined by RFC 2279) allows for up to 6 bytes, and this is + checked first; hence the possibility of 4 or 5 missing bytes. + + PCRE_UTF8_ERR6 + PCRE_UTF8_ERR7 + PCRE_UTF8_ERR8 + PCRE_UTF8_ERR9 + PCRE_UTF8_ERR10 + + The two most significant bits of the 2nd, 3rd, 4th, 5th, or 6th byte of + the character do not have the binary value 0b10 (that is, either the + most significant bit is 0, or the next bit is 1). + + PCRE_UTF8_ERR11 + PCRE_UTF8_ERR12 + + A character that is valid by the RFC 2279 rules is either 5 or 6 bytes + long; these code points are excluded by RFC 3629. + + PCRE_UTF8_ERR13 + + A 4-byte character has a value greater than 0x10fff; these code points + are excluded by RFC 3629. + + PCRE_UTF8_ERR14 + + A 3-byte character has a value in the range 0xd800 to 0xdfff; this + range of code points are reserved by RFC 3629 for use with UTF-16, and + so are excluded from UTF-8. + + PCRE_UTF8_ERR15 + PCRE_UTF8_ERR16 + PCRE_UTF8_ERR17 + PCRE_UTF8_ERR18 + PCRE_UTF8_ERR19 + + A 2-, 3-, 4-, 5-, or 6-byte character is "overlong", that is, it codes + for a value that can be represented by fewer bytes, which is invalid. + For example, the two bytes 0xc0, 0xae give the value 0x2e, whose cor- + rect coding uses just one byte. + + PCRE_UTF8_ERR20 + + The two most significant bits of the first byte of a character have the + binary value 0b10 (that is, the most significant bit is 1 and the sec- + ond is 0). Such a byte can only validly occur as the second or subse- + quent byte of a multi-byte character. + + PCRE_UTF8_ERR21 + + The first byte of a character has the value 0xfe or 0xff. These values + can never occur in a valid UTF-8 string. + + PCRE_UTF8_ERR22 + + This error code was formerly used when the presence of a so-called + "non-character" caused an error. Unicode corrigendum #9 makes it clear + that such characters should not cause a string to be rejected, and so + this code is no longer in use and is never returned. + + +EXTRACTING CAPTURED SUBSTRINGS BY NUMBER + + int pcre_copy_substring(const char *subject, int *ovector, + int stringcount, int stringnumber, char *buffer, + int buffersize); + + int pcre_get_substring(const char *subject, int *ovector, + int stringcount, int stringnumber, + const char **stringptr); + + int pcre_get_substring_list(const char *subject, + int *ovector, int stringcount, const char ***listptr); + + Captured substrings can be accessed directly by using the offsets re- + turned by pcre_exec() in ovector. For convenience, the functions + pcre_copy_substring(), pcre_get_substring(), and pcre_get_sub- + string_list() are provided for extracting captured substrings as new, + separate, zero-terminated strings. These functions identify substrings + by number. The next section describes functions for extracting named + substrings. + + A substring that contains a binary zero is correctly extracted and has + a further zero added on the end, but the result is not, of course, a C + string. However, you can process such a string by referring to the + length that is returned by pcre_copy_substring() and pcre_get_sub- + string(). Unfortunately, the interface to pcre_get_substring_list() is + not adequate for handling strings containing binary zeros, because the + end of the final string is not independently indicated. + + The first three arguments are the same for all three of these func- + tions: subject is the subject string that has just been successfully + matched, ovector is a pointer to the vector of integer offsets that was + passed to pcre_exec(), and stringcount is the number of substrings that + were captured by the match, including the substring that matched the + entire regular expression. This is the value returned by pcre_exec() if + it is greater than zero. If pcre_exec() returned zero, indicating that + it ran out of space in ovector, the value passed as stringcount should + be the number of elements in the vector divided by three. + + The functions pcre_copy_substring() and pcre_get_substring() extract a + single substring, whose number is given as stringnumber. A value of + zero extracts the substring that matched the entire pattern, whereas + higher values extract the captured substrings. For pcre_copy_sub- + string(), the string is placed in buffer, whose length is given by + buffersize, while for pcre_get_substring() a new block of memory is ob- + tained via pcre_malloc, and its address is returned via stringptr. The + yield of the function is the length of the string, not including the + terminating zero, or one of these error codes: + + PCRE_ERROR_NOMEMORY (-6) + + The buffer was too small for pcre_copy_substring(), or the attempt to + get memory failed for pcre_get_substring(). + + PCRE_ERROR_NOSUBSTRING (-7) + + There is no substring whose number is stringnumber. + + The pcre_get_substring_list() function extracts all available sub- + strings and builds a list of pointers to them. All this is done in a + single block of memory that is obtained via pcre_malloc. The address of + the memory block is returned via listptr, which is also the start of + the list of string pointers. The end of the list is marked by a NULL + pointer. The yield of the function is zero if all went well, or the er- + ror code + + PCRE_ERROR_NOMEMORY (-6) + + if the attempt to get the memory block failed. + + When any of these functions encounter a substring that is unset, which + can happen when capturing subpattern number n+1 matches some part of + the subject, but subpattern n has not been used at all, they return an + empty string. This can be distinguished from a genuine zero-length sub- + string by inspecting the appropriate offset in ovector, which is nega- + tive for unset substrings. + + The two convenience functions pcre_free_substring() and pcre_free_sub- + string_list() can be used to free the memory returned by a previous + call of pcre_get_substring() or pcre_get_substring_list(), respec- + tively. They do nothing more than call the function pointed to by + pcre_free, which of course could be called directly from a C program. + However, PCRE is used in some situations where it is linked via a spe- + cial interface to another programming language that cannot use + pcre_free directly; it is for these cases that the functions are pro- + vided. + + +EXTRACTING CAPTURED SUBSTRINGS BY NAME + + int pcre_get_stringnumber(const pcre *code, + const char *name); + + int pcre_copy_named_substring(const pcre *code, + const char *subject, int *ovector, + int stringcount, const char *stringname, + char *buffer, int buffersize); + + int pcre_get_named_substring(const pcre *code, + const char *subject, int *ovector, + int stringcount, const char *stringname, + const char **stringptr); + + To extract a substring by name, you first have to find associated num- + ber. For example, for this pattern + + (a+)b(?\d+)... + + the number of the subpattern called "xxx" is 2. If the name is known to + be unique (PCRE_DUPNAMES was not set), you can find the number from the + name by calling pcre_get_stringnumber(). The first argument is the com- + piled pattern, and the second is the name. The yield of the function is + the subpattern number, or PCRE_ERROR_NOSUBSTRING (-7) if there is no + subpattern of that name. + + Given the number, you can extract the substring directly, or use one of + the functions described in the previous section. For convenience, there + are also two functions that do the whole job. + + Most of the arguments of pcre_copy_named_substring() and + pcre_get_named_substring() are the same as those for the similarly + named functions that extract by number. As these are described in the + previous section, they are not re-described here. There are just two + differences: + + First, instead of a substring number, a substring name is given. Sec- + ond, there is an extra argument, given at the start, which is a pointer + to the compiled pattern. This is needed in order to gain access to the + name-to-number translation table. + + These functions call pcre_get_stringnumber(), and if it succeeds, they + then call pcre_copy_substring() or pcre_get_substring(), as appropri- + ate. NOTE: If PCRE_DUPNAMES is set and there are duplicate names, the + behaviour may not be what you want (see the next section). + + Warning: If the pattern uses the (?| feature to set up multiple subpat- + terns with the same number, as described in the section on duplicate + subpattern numbers in the pcrepattern page, you cannot use names to + distinguish the different subpatterns, because names are not included + in the compiled code. The matching process uses only numbers. For this + reason, the use of different names for subpatterns of the same number + causes an error at compile time. + + +DUPLICATE SUBPATTERN NAMES + + int pcre_get_stringtable_entries(const pcre *code, + const char *name, char **first, char **last); + + When a pattern is compiled with the PCRE_DUPNAMES option, names for + subpatterns are not required to be unique. (Duplicate names are always + allowed for subpatterns with the same number, created by using the (?| + feature. Indeed, if such subpatterns are named, they are required to + use the same names.) + + Normally, patterns with duplicate names are such that in any one match, + only one of the named subpatterns participates. An example is shown in + the pcrepattern documentation. + + When duplicates are present, pcre_copy_named_substring() and + pcre_get_named_substring() return the first substring corresponding to + the given name that is set. If none are set, PCRE_ERROR_NOSUBSTRING + (-7) is returned; no data is returned. The pcre_get_stringnumber() + function returns one of the numbers that are associated with the name, + but it is not defined which it is. + + If you want to get full details of all captured substrings for a given + name, you must use the pcre_get_stringtable_entries() function. The + first argument is the compiled pattern, and the second is the name. The + third and fourth are pointers to variables which are updated by the + function. After it has run, they point to the first and last entries in + the name-to-number table for the given name. The function itself re- + turns the length of each entry, or PCRE_ERROR_NOSUBSTRING (-7) if there + are none. The format of the table is described above in the section en- + titled Information about a pattern above. Given all the relevant en- + tries for the name, you can extract each of their numbers, and hence + the captured data, if any. + + +FINDING ALL POSSIBLE MATCHES + + The traditional matching function uses a similar algorithm to Perl, + which stops when it finds the first match, starting at a given point in + the subject. If you want to find all possible matches, or the longest + possible match, consider using the alternative matching function (see + below) instead. If you cannot use the alternative function, but still + need to find all possible matches, you can kludge it up by making use + of the callout facility, which is described in the pcrecallout documen- + tation. + + What you have to do is to insert a callout right at the end of the pat- + tern. When your callout function is called, extract and save the cur- + rent matched substring. Then return 1, which forces pcre_exec() to + backtrack and try other alternatives. Ultimately, when it runs out of + matches, pcre_exec() will yield PCRE_ERROR_NOMATCH. + + +OBTAINING AN ESTIMATE OF STACK USAGE + + Matching certain patterns using pcre_exec() can use a lot of process + stack, which in certain environments can be rather limited in size. + Some users find it helpful to have an estimate of the amount of stack + that is used by pcre_exec(), to help them set recursion limits, as de- + scribed in the pcrestack documentation. The estimate that is output by + pcretest when called with the -m and -C options is obtained by calling + pcre_exec with the values NULL, NULL, NULL, -999, and -999 for its + first five arguments. + + Normally, if its first argument is NULL, pcre_exec() immediately re- + turns the negative error code PCRE_ERROR_NULL, but with this special + combination of arguments, it returns instead a negative number whose + absolute value is the approximate stack frame size in bytes. (A nega- + tive number is used so that it is clear that no match has happened.) + The value is approximate because in some cases, recursive calls to + pcre_exec() occur when there are one or two additional variables on the + stack. + + If PCRE has been compiled to use the heap instead of the stack for re- + cursion, the value returned is the size of each block that is obtained + from the heap. + + +MATCHING A PATTERN: THE ALTERNATIVE FUNCTION + + int pcre_dfa_exec(const pcre *code, const pcre_extra *extra, + const char *subject, int length, int startoffset, + int options, int *ovector, int ovecsize, + int *workspace, int wscount); + + The function pcre_dfa_exec() is called to match a subject string + against a compiled pattern, using a matching algorithm that scans the + subject string just once, and does not backtrack. This has different + characteristics to the normal algorithm, and is not compatible with + Perl. Some of the features of PCRE patterns are not supported. Never- + theless, there are times when this kind of matching can be useful. For + a discussion of the two matching algorithms, and a list of features + that pcre_dfa_exec() does not support, see the pcrematching documenta- + tion. + + The arguments for the pcre_dfa_exec() function are the same as for + pcre_exec(), plus two extras. The ovector argument is used in a differ- + ent way, and this is described below. The other common arguments are + used in the same way as for pcre_exec(), so their description is not + repeated here. + + The two additional arguments provide workspace for the function. The + workspace vector should contain at least 20 elements. It is used for + keeping track of multiple paths through the pattern tree. More + workspace will be needed for patterns and subjects where there are a + lot of potential matches. + + Here is an example of a simple call to pcre_dfa_exec(): + + int rc; + int ovector[10]; + int wspace[20]; + rc = pcre_dfa_exec( + re, /* result of pcre_compile() */ + NULL, /* we didn't study the pattern */ + "some string", /* the subject string */ + 11, /* the length of the subject string */ + 0, /* start at offset 0 in the subject */ + 0, /* default options */ + ovector, /* vector of integers for substring information */ + 10, /* number of elements (NOT size in bytes) */ + wspace, /* working space vector */ + 20); /* number of elements (NOT size in bytes) */ + + Option bits for pcre_dfa_exec() + + The unused bits of the options argument for pcre_dfa_exec() must be + zero. The only bits that may be set are PCRE_ANCHORED, PCRE_NEW- + LINE_xxx, PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_AT- + START, PCRE_NO_UTF8_CHECK, PCRE_BSR_ANYCRLF, PCRE_BSR_UNICODE, + PCRE_NO_START_OPTIMIZE, PCRE_PARTIAL_HARD, PCRE_PARTIAL_SOFT, + PCRE_DFA_SHORTEST, and PCRE_DFA_RESTART. All but the last four of + these are exactly the same as for pcre_exec(), so their description is + not repeated here. + + PCRE_PARTIAL_HARD + PCRE_PARTIAL_SOFT + + These have the same general effect as they do for pcre_exec(), but the + details are slightly different. When PCRE_PARTIAL_HARD is set for + pcre_dfa_exec(), it returns PCRE_ERROR_PARTIAL if the end of the sub- + ject is reached and there is still at least one matching possibility + that requires additional characters. This happens even if some complete + matches have also been found. When PCRE_PARTIAL_SOFT is set, the return + code PCRE_ERROR_NOMATCH is converted into PCRE_ERROR_PARTIAL if the end + of the subject is reached, there have been no complete matches, but + there is still at least one matching possibility. The portion of the + string that was inspected when the longest partial match was found is + set as the first matching string in both cases. There is a more de- + tailed discussion of partial and multi-segment matching, with examples, + in the pcrepartial documentation. + + PCRE_DFA_SHORTEST + + Setting the PCRE_DFA_SHORTEST option causes the matching algorithm to + stop as soon as it has found one match. Because of the way the alterna- + tive algorithm works, this is necessarily the shortest possible match + at the first possible matching point in the subject string. + + PCRE_DFA_RESTART + + When pcre_dfa_exec() returns a partial match, it is possible to call it + again, with additional subject characters, and have it continue with + the same match. The PCRE_DFA_RESTART option requests this action; when + it is set, the workspace and wscount options must reference the same + vector as before because data about the match so far is left in them + after a partial match. There is more discussion of this facility in the + pcrepartial documentation. + + Successful returns from pcre_dfa_exec() + + When pcre_dfa_exec() succeeds, it may have matched more than one sub- + string in the subject. Note, however, that all the matches from one run + of the function start at the same point in the subject. The shorter + matches are all initial substrings of the longer matches. For example, + if the pattern + + <.*> + + is matched against the string + + This is no more + + the three matched strings are + + + + + + On success, the yield of the function is a number greater than zero, + which is the number of matched substrings. The substrings themselves + are returned in ovector. Each string uses two elements; the first is + the offset to the start, and the second is the offset to the end. In + fact, all the strings have the same start offset. (Space could have + been saved by giving this only once, but it was decided to retain some + compatibility with the way pcre_exec() returns data, even though the + meaning of the strings is different.) + + The strings are returned in reverse order of length; that is, the long- + est matching string is given first. If there were too many matches to + fit into ovector, the yield of the function is zero, and the vector is + filled with the longest matches. Unlike pcre_exec(), pcre_dfa_exec() + can use the entire ovector for returning matched strings. + + NOTE: PCRE's "auto-possessification" optimization usually applies to + character repeats at the end of a pattern (as well as internally). For + example, the pattern "a\d+" is compiled as if it were "a\d++" because + there is no point even considering the possibility of backtracking into + the repeated digits. For DFA matching, this means that only one possi- + ble match is found. If you really do want multiple matches in such + cases, either use an ungreedy repeat ("a\d+?") or set the + PCRE_NO_AUTO_POSSESS option when compiling. + + Error returns from pcre_dfa_exec() + + The pcre_dfa_exec() function returns a negative number when it fails. + Many of the errors are the same as for pcre_exec(), and these are de- + scribed above. There are in addition the following errors that are + specific to pcre_dfa_exec(): + + PCRE_ERROR_DFA_UITEM (-16) + + This return is given if pcre_dfa_exec() encounters an item in the pat- + tern that it does not support, for instance, the use of \C or a back + reference. + + PCRE_ERROR_DFA_UCOND (-17) + + This return is given if pcre_dfa_exec() encounters a condition item + that uses a back reference for the condition, or a test for recursion + in a specific group. These are not supported. + + PCRE_ERROR_DFA_UMLIMIT (-18) + + This return is given if pcre_dfa_exec() is called with an extra block + that contains a setting of the match_limit or match_limit_recursion + fields. This is not supported (these fields are meaningless for DFA + matching). + + PCRE_ERROR_DFA_WSSIZE (-19) + + This return is given if pcre_dfa_exec() runs out of space in the + workspace vector. + + PCRE_ERROR_DFA_RECURSE (-20) + + When a recursive subpattern is processed, the matching function calls + itself recursively, using private vectors for ovector and workspace. + This error is given if the output vector is not large enough. This + should be extremely rare, as a vector of size 1000 is used. + + PCRE_ERROR_DFA_BADRESTART (-30) + + When pcre_dfa_exec() is called with the PCRE_DFA_RESTART option, some + plausibility checks are made on the contents of the workspace, which + should contain data about the previous partial match. If any of these + checks fail, this error is given. + + +SEE ALSO + + pcre16(3), pcre32(3), pcrebuild(3), pcrecallout(3), pcrecpp(3)(3), + pcrematching(3), pcrepartial(3), pcreposix(3), pcreprecompile(3), pcre- + sample(3), pcrestack(3). + + +AUTHOR + + Philip Hazel + University Computing Service + Cambridge CB2 3QH, England. + + +REVISION + + Last updated: 18 December 2015 + Copyright (c) 1997-2015 University of Cambridge. +------------------------------------------------------------------------------ + + +PCRECALLOUT(3) Library Functions Manual PCRECALLOUT(3) + + + +NAME + PCRE - Perl-compatible regular expressions + +SYNOPSIS + + #include + + int (*pcre_callout)(pcre_callout_block *); + + int (*pcre16_callout)(pcre16_callout_block *); + + int (*pcre32_callout)(pcre32_callout_block *); + + +DESCRIPTION + + PCRE provides a feature called "callout", which is a means of temporar- + ily passing control to the caller of PCRE in the middle of pattern + matching. The caller of PCRE provides an external function by putting + its entry point in the global variable pcre_callout (pcre16_callout for + the 16-bit library, pcre32_callout for the 32-bit library). By default, + this variable contains NULL, which disables all calling out. + + Within a regular expression, (?C) indicates the points at which the ex- + ternal function is to be called. Different callout points can be iden- + tified by putting a number less than 256 after the letter C. The de- + fault value is zero. For example, this pattern has two callout points: + + (?C1)abc(?C2)def + + If the PCRE_AUTO_CALLOUT option bit is set when a pattern is compiled, + PCRE automatically inserts callouts, all with number 255, before each + item in the pattern. For example, if PCRE_AUTO_CALLOUT is used with the + pattern + + A(\d{2}|--) + + it is processed as if it were + + (?C255)A(?C255)((?C255)\d{2}(?C255)|(?C255)-(?C255)-(?C255))(?C255) + + Notice that there is a callout before and after each parenthesis and + alternation bar. If the pattern contains a conditional group whose con- + dition is an assertion, an automatic callout is inserted immediately + before the condition. Such a callout may also be inserted explicitly, + for example: + + (?(?C9)(?=a)ab|de) + + This applies only to assertion conditions (because they are themselves + independent groups). + + Automatic callouts can be used for tracking the progress of pattern + matching. The pcretest program has a pattern qualifier (/C) that sets + automatic callouts; when it is used, the output indicates how the pat- + tern is being matched. This is useful information when you are trying + to optimize the performance of a particular pattern. + + +MISSING CALLOUTS + + You should be aware that, because of optimizations in the way PCRE com- + piles and matches patterns, callouts sometimes do not happen exactly as + you might expect. + + At compile time, PCRE "auto-possessifies" repeated items when it knows + that what follows cannot be part of the repeat. For example, a+[bc] is + compiled as if it were a++[bc]. The pcretest output when this pattern + is anchored and then applied with automatic callouts to the string + "aaaa" is: + + --->aaaa + +0 ^ ^ + +1 ^ a+ + +3 ^ ^ [bc] + No match + + This indicates that when matching [bc] fails, there is no backtracking + into a+ and therefore the callouts that would be taken for the back- + tracks do not occur. You can disable the auto-possessify feature by + passing PCRE_NO_AUTO_POSSESS to pcre_compile(), or starting the pattern + with (*NO_AUTO_POSSESS). If this is done in pcretest (using the /O + qualifier), the output changes to this: + + --->aaaa + +0 ^ ^ + +1 ^ a+ + +3 ^ ^ [bc] + +3 ^ ^ [bc] + +3 ^ ^ [bc] + +3 ^^ [bc] + No match + + This time, when matching [bc] fails, the matcher backtracks into a+ and + tries again, repeatedly, until a+ itself fails. + + Other optimizations that provide fast "no match" results also affect + callouts. For example, if the pattern is + + ab(?C4)cd + + PCRE knows that any matching string must contain the letter "d". If the + subject string is "abyz", the lack of "d" means that matching doesn't + ever start, and the callout is never reached. However, with "abyd", + though the result is still no match, the callout is obeyed. + + If the pattern is studied, PCRE knows the minimum length of a matching + string, and will immediately give a "no match" return without actually + running a match if the subject is not long enough, or, for unanchored + patterns, if it has been scanned far enough. + + You can disable these optimizations by passing the PCRE_NO_START_OPTI- + MIZE option to the matching function, or by starting the pattern with + (*NO_START_OPT). This slows down the matching process, but does ensure + that callouts such as the example above are obeyed. + + +THE CALLOUT INTERFACE + + During matching, when PCRE reaches a callout point, the external func- + tion defined by pcre_callout or pcre[16|32]_callout is called (if it is + set). This applies to both normal and DFA matching. The only argument + to the callout function is a pointer to a pcre_callout or + pcre[16|32]_callout block. These structures contains the following + fields: + + int version; + int callout_number; + int *offset_vector; + const char *subject; (8-bit version) + PCRE_SPTR16 subject; (16-bit version) + PCRE_SPTR32 subject; (32-bit version) + int subject_length; + int start_match; + int current_position; + int capture_top; + int capture_last; + void *callout_data; + int pattern_position; + int next_item_length; + const unsigned char *mark; (8-bit version) + const PCRE_UCHAR16 *mark; (16-bit version) + const PCRE_UCHAR32 *mark; (32-bit version) + + The version field is an integer containing the version number of the + block format. The initial version was 0; the current version is 2. The + version number will change again in future if additional fields are + added, but the intention is never to remove any of the existing fields. + + The callout_number field contains the number of the callout, as com- + piled into the pattern (that is, the number after ?C for manual call- + outs, and 255 for automatically generated callouts). + + The offset_vector field is a pointer to the vector of offsets that was + passed by the caller to the matching function. When pcre_exec() or + pcre[16|32]_exec() is used, the contents can be inspected, in order to + extract substrings that have been matched so far, in the same way as + for extracting substrings after a match has completed. For the DFA + matching functions, this field is not useful. + + The subject and subject_length fields contain copies of the values that + were passed to the matching function. + + The start_match field normally contains the offset within the subject + at which the current match attempt started. However, if the escape se- + quence \K has been encountered, this value is changed to reflect the + modified starting point. If the pattern is not anchored, the callout + function may be called several times from the same point in the pattern + for different starting points in the subject. + + The current_position field contains the offset within the subject of + the current match pointer. + + When the pcre_exec() or pcre[16|32]_exec() is used, the capture_top + field contains one more than the number of the highest numbered cap- + tured substring so far. If no substrings have been captured, the value + of capture_top is one. This is always the case when the DFA functions + are used, because they do not support captured substrings. + + The capture_last field contains the number of the most recently cap- + tured substring. However, when a recursion exits, the value reverts to + what it was outside the recursion, as do the values of all captured + substrings. If no substrings have been captured, the value of cap- + ture_last is -1. This is always the case for the DFA matching func- + tions. + + The callout_data field contains a value that is passed to a matching + function specifically so that it can be passed back in callouts. It is + passed in the callout_data field of a pcre_extra or pcre[16|32]_extra + data structure. If no such data was passed, the value of callout_data + in a callout block is NULL. There is a description of the pcre_extra + structure in the pcreapi documentation. + + The pattern_position field is present from version 1 of the callout + structure. It contains the offset to the next item to be matched in the + pattern string. + + The next_item_length field is present from version 1 of the callout + structure. It contains the length of the next item to be matched in the + pattern string. When the callout immediately precedes an alternation + bar, a closing parenthesis, or the end of the pattern, the length is + zero. When the callout precedes an opening parenthesis, the length is + that of the entire subpattern. + + The pattern_position and next_item_length fields are intended to help + in distinguishing between different automatic callouts, which all have + the same callout number. However, they are set for all callouts. + + The mark field is present from version 2 of the callout structure. In + callouts from pcre_exec() or pcre[16|32]_exec() it contains a pointer + to the zero-terminated name of the most recently passed (*MARK), + (*PRUNE), or (*THEN) item in the match, or NULL if no such items have + been passed. Instances of (*PRUNE) or (*THEN) without a name do not + obliterate a previous (*MARK). In callouts from the DFA matching func- + tions this field always contains NULL. + + +RETURN VALUES + + The external callout function returns an integer to PCRE. If the value + is zero, matching proceeds as normal. If the value is greater than + zero, matching fails at the current point, but the testing of other + matching possibilities goes ahead, just as if a lookahead assertion had + failed. If the value is less than zero, the match is abandoned, the + matching function returns the negative value. + + Negative values should normally be chosen from the set of PCRE_ER- + ROR_xxx values. In particular, PCRE_ERROR_NOMATCH forces a standard "no + match" failure. The error number PCRE_ERROR_CALLOUT is reserved for + use by callout functions; it will never be used by PCRE itself. + + +AUTHOR + + Philip Hazel + University Computing Service + Cambridge CB2 3QH, England. + + +REVISION + + Last updated: 12 November 2013 + Copyright (c) 1997-2013 University of Cambridge. +------------------------------------------------------------------------------ + + +PCRECOMPAT(3) Library Functions Manual PCRECOMPAT(3) + + + +NAME + PCRE - Perl-compatible regular expressions + +DIFFERENCES BETWEEN PCRE AND PERL + + This document describes the differences in the ways that PCRE and Perl + handle regular expressions. The differences described here are with re- + spect to Perl versions 5.10 and above. + + 1. PCRE has only a subset of Perl's Unicode support. Details of what it + does have are given in the pcreunicode page. + + 2. PCRE allows repeat quantifiers only on parenthesized assertions, but + they do not mean what you might think. For example, (?!a){3} does not + assert that the next three characters are not "a". It just asserts that + the next character is not "a" three times (in principle: PCRE optimizes + this to run the assertion just once). Perl allows repeat quantifiers on + other assertions such as \b, but these do not seem to have any use. + + 3. Capturing subpatterns that occur inside negative lookahead asser- + tions are counted, but their entries in the offsets vector are never + set. Perl sometimes (but not always) sets its numerical variables from + inside negative assertions. + + 4. Though binary zero characters are supported in the subject string, + they are not allowed in a pattern string because it is passed as a nor- + mal C string, terminated by zero. The escape sequence \0 can be used in + the pattern to represent a binary zero. + + 5. The following Perl escape sequences are not supported: \l, \u, \L, + \U, and \N when followed by a character name or Unicode value. (\N on + its own, matching a non-newline character, is supported.) In fact these + are implemented by Perl's general string-handling and are not part of + its pattern matching engine. If any of these are encountered by PCRE, + an error is generated by default. However, if the PCRE_JAVASCRIPT_COM- + PAT option is set, \U and \u are interpreted as JavaScript interprets + them. + + 6. The Perl escape sequences \p, \P, and \X are supported only if PCRE + is built with Unicode character property support. The properties that + can be tested with \p and \P are limited to the general category prop- + erties such as Lu and Nd, script names such as Greek or Han, and the + derived properties Any and L&. PCRE does support the Cs (surrogate) + property, which Perl does not; the Perl documentation says "Because + Perl hides the need for the user to understand the internal representa- + tion of Unicode characters, there is no need to implement the somewhat + messy concept of surrogates." + + 7. PCRE does support the \Q...\E escape for quoting substrings. Charac- + ters in between are treated as literals. This is slightly different + from Perl in that $ and @ are also handled as literals inside the + quotes. In Perl, they cause variable interpolation (but of course PCRE + does not have variables). Note the following examples: + + Pattern PCRE matches Perl matches + + \Qabc$xyz\E abc$xyz abc followed by the + contents of $xyz + \Qabc\$xyz\E abc\$xyz abc\$xyz + \Qabc\E\$\Qxyz\E abc$xyz abc$xyz + + The \Q...\E sequence is recognized both inside and outside character + classes. + + 8. Fairly obviously, PCRE does not support the (?{code}) and (??{code}) + constructions. However, there is support for recursive patterns. This + is not available in Perl 5.8, but it is in Perl 5.10. Also, the PCRE + "callout" feature allows an external function to be called during pat- + tern matching. See the pcrecallout documentation for details. + + 9. Subpatterns that are called as subroutines (whether or not recur- + sively) are always treated as atomic groups in PCRE. This is like + Python, but unlike Perl. Captured values that are set outside a sub- + routine call can be reference from inside in PCRE, but not in Perl. + There is a discussion that explains these differences in more detail in + the section on recursion differences from Perl in the pcrepattern page. + + 10. If any of the backtracking control verbs are used in a subpattern + that is called as a subroutine (whether or not recursively), their ef- + fect is confined to that subpattern; it does not extend to the sur- + rounding pattern. This is not always the case in Perl. In particular, + if (*THEN) is present in a group that is called as a subroutine, its + action is limited to that group, even if the group does not contain any + | characters. Note that such subpatterns are processed as anchored at + the point where they are tested. + + 11. If a pattern contains more than one backtracking control verb, the + first one that is backtracked onto acts. For example, in the pattern + A(*COMMIT)B(*PRUNE)C a failure in B triggers (*COMMIT), but a failure + in C triggers (*PRUNE). Perl's behaviour is more complex; in many cases + it is the same as PCRE, but there are examples where it differs. + + 12. Most backtracking verbs in assertions have their normal actions. + They are not confined to the assertion. + + 13. There are some differences that are concerned with the settings of + captured strings when part of a pattern is repeated. For example, + matching "aba" against the pattern /^(a(b)?)+$/ in Perl leaves $2 un- + set, but in PCRE it is set to "b". + + 14. PCRE's handling of duplicate subpattern numbers and duplicate sub- + pattern names is not as general as Perl's. This is a consequence of the + fact the PCRE works internally just with numbers, using an external ta- + ble to translate between numbers and names. In particular, a pattern + such as (?|(?A)|(?B), where the two capturing parentheses have + the same number but different names, is not supported, and causes an + error at compile time. If it were allowed, it would not be possible to + distinguish which parentheses matched, because both names map to cap- + turing subpattern number 1. To avoid this confusing situation, an error + is given at compile time. + + 15. Perl recognizes comments in some places that PCRE does not, for ex- + ample, between the ( and ? at the start of a subpattern. If the /x mod- + ifier is set, Perl allows white space between ( and ? (though current + Perls warn that this is deprecated) but PCRE never does, even if the + PCRE_EXTENDED option is set. + + 16. Perl, when in warning mode, gives warnings for character classes + such as [A-\d] or [a-[:digit:]]. It then treats the hyphens as liter- + als. PCRE has no warning features, so it gives an error in these cases + because they are almost certainly user mistakes. + + 17. In PCRE, the upper/lower case character properties Lu and Ll are + not affected when case-independent matching is specified. For example, + \p{Lu} always matches an upper case letter. I think Perl has changed in + this respect; in the release at the time of writing (5.16), \p{Lu} and + \p{Ll} match all letters, regardless of case, when case independence is + specified. + + 18. PCRE provides some extensions to the Perl regular expression facil- + ities. Perl 5.10 includes new features that are not in earlier ver- + sions of Perl, some of which (such as named parentheses) have been in + PCRE for some time. This list is with respect to Perl 5.10: + + (a) Although lookbehind assertions in PCRE must match fixed length + strings, each alternative branch of a lookbehind assertion can match a + different length of string. Perl requires them all to have the same + length. + + (b) If PCRE_DOLLAR_ENDONLY is set and PCRE_MULTILINE is not set, the $ + meta-character matches only at the very end of the string. + + (c) If PCRE_EXTRA is set, a backslash followed by a letter with no spe- + cial meaning is faulted. Otherwise, like Perl, the backslash is quietly + ignored. (Perl can be made to issue a warning.) + + (d) If PCRE_UNGREEDY is set, the greediness of the repetition quanti- + fiers is inverted, that is, by default they are not greedy, but if fol- + lowed by a question mark they are. + + (e) PCRE_ANCHORED can be used at matching time to force a pattern to be + tried only at the first matching position in the subject string. + + (f) The PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, + and PCRE_NO_AUTO_CAPTURE options for pcre_exec() have no Perl equiva- + lents. + + (g) The \R escape sequence can be restricted to match only CR, LF, or + CRLF by the PCRE_BSR_ANYCRLF option. + + (h) The callout facility is PCRE-specific. + + (i) The partial matching facility is PCRE-specific. + + (j) Patterns compiled by PCRE can be saved and re-used at a later time, + even on different hosts that have the other endianness. However, this + does not apply to optimized data created by the just-in-time compiler. + + (k) The alternative matching functions (pcre_dfa_exec(), + pcre16_dfa_exec() and pcre32_dfa_exec(),) match in a different way and + are not Perl-compatible. + + (l) PCRE recognizes some special sequences such as (*CR) at the start + of a pattern that set overall options that cannot be changed within the + pattern. + + +AUTHOR + + Philip Hazel + University Computing Service + Cambridge CB2 3QH, England. + + +REVISION + + Last updated: 10 November 2013 + Copyright (c) 1997-2013 University of Cambridge. +------------------------------------------------------------------------------ + + +PCREPATTERN(3) Library Functions Manual PCREPATTERN(3) + + + +NAME + PCRE - Perl-compatible regular expressions + +PCRE REGULAR EXPRESSION DETAILS + + The syntax and semantics of the regular expressions that are supported + by PCRE are described in detail below. There is a quick-reference syn- + tax summary in the pcresyntax page. PCRE tries to match Perl syntax and + semantics as closely as it can. PCRE also supports some alternative + regular expression syntax (which does not conflict with the Perl syn- + tax) in order to provide some compatibility with regular expressions in + Python, .NET, and Oniguruma. + + Perl's regular expressions are described in its own documentation, and + regular expressions in general are covered in a number of books, some + of which have copious examples. Jeffrey Friedl's "Mastering Regular Ex- + pressions", published by O'Reilly, covers regular expressions in great + detail. This description of PCRE's regular expressions is intended as + reference material. + + This document discusses the patterns that are supported by PCRE when + one its main matching functions, pcre_exec() (8-bit) or + pcre[16|32]_exec() (16- or 32-bit), is used. PCRE also has alternative + matching functions, pcre_dfa_exec() and pcre[16|32_dfa_exec(), which + match using a different algorithm that is not Perl-compatible. Some of + the features discussed below are not available when DFA matching is + used. The advantages and disadvantages of the alternative functions, + and how they differ from the normal functions, are discussed in the + pcrematching page. + + +SPECIAL START-OF-PATTERN ITEMS + + A number of options that can be passed to pcre_compile() can also be + set by special items at the start of a pattern. These are not Perl-com- + patible, but are provided to make these options accessible to pattern + writers who are not able to change the program that processes the pat- + tern. Any number of these items may appear, but they must all be to- + gether right at the start of the pattern string, and the letters must + be in upper case. + + UTF support + + The original operation of PCRE was on strings of one-byte characters. + However, there is now also support for UTF-8 strings in the original + library, an extra library that supports 16-bit and UTF-16 character + strings, and a third library that supports 32-bit and UTF-32 character + strings. To use these features, PCRE must be built to include appropri- + ate support. When using UTF strings you must either call the compiling + function with the PCRE_UTF8, PCRE_UTF16, or PCRE_UTF32 option, or the + pattern must start with one of these special sequences: + + (*UTF8) + (*UTF16) + (*UTF32) + (*UTF) + + (*UTF) is a generic sequence that can be used with any of the li- + braries. Starting a pattern with such a sequence is equivalent to set- + ting the relevant option. How setting a UTF mode affects pattern match- + ing is mentioned in several places below. There is also a summary of + features in the pcreunicode page. + + Some applications that allow their users to supply patterns may wish to + restrict them to non-UTF data for security reasons. If the + PCRE_NEVER_UTF option is set at compile time, (*UTF) etc. are not al- + lowed, and their appearance causes an error. + + Unicode property support + + Another special sequence that may appear at the start of a pattern is + (*UCP). This has the same effect as setting the PCRE_UCP option: it + causes sequences such as \d and \w to use Unicode properties to deter- + mine character types, instead of recognizing only characters with codes + less than 128 via a lookup table. + + Disabling auto-possessification + + If a pattern starts with (*NO_AUTO_POSSESS), it has the same effect as + setting the PCRE_NO_AUTO_POSSESS option at compile time. This stops + PCRE from making quantifiers possessive when what follows cannot match + the repeated item. For example, by default a+b is treated as a++b. For + more details, see the pcreapi documentation. + + Disabling start-up optimizations + + If a pattern starts with (*NO_START_OPT), it has the same effect as + setting the PCRE_NO_START_OPTIMIZE option either at compile or matching + time. This disables several optimizations for quickly reaching "no + match" results. For more details, see the pcreapi documentation. + + Newline conventions + + PCRE supports five different conventions for indicating line breaks in + strings: a single CR (carriage return) character, a single LF (line- + feed) character, the two-character sequence CRLF, any of the three pre- + ceding, or any Unicode newline sequence. The pcreapi page has further + discussion about newlines, and shows how to set the newline convention + in the options arguments for the compiling and matching functions. + + It is also possible to specify a newline convention by starting a pat- + tern string with one of the following five sequences: + + (*CR) carriage return + (*LF) linefeed + (*CRLF) carriage return, followed by linefeed + (*ANYCRLF) any of the three above + (*ANY) all Unicode newline sequences + + These override the default and the options given to the compiling func- + tion. For example, on a Unix system where LF is the default newline se- + quence, the pattern + + (*CR)a.b + + changes the convention to CR. That pattern matches "a\nb" because LF is + no longer a newline. If more than one of these settings is present, the + last one is used. + + The newline convention affects where the circumflex and dollar asser- + tions are true. It also affects the interpretation of the dot metachar- + acter when PCRE_DOTALL is not set, and the behaviour of \N. However, it + does not affect what the \R escape sequence matches. By default, this + is any Unicode newline sequence, for Perl compatibility. However, this + can be changed; see the description of \R in the section entitled "New- + line sequences" below. A change of \R setting can be combined with a + change of newline convention. + + Setting match and recursion limits + + The caller of pcre_exec() can set a limit on the number of times the + internal match() function is called and on the maximum depth of recur- + sive calls. These facilities are provided to catch runaway matches that + are provoked by patterns with huge matching trees (a typical example is + a pattern with nested unlimited repeats) and to avoid running out of + system stack by too much recursion. When one of these limits is + reached, pcre_exec() gives an error return. The limits can also be set + by items at the start of the pattern of the form + + (*LIMIT_MATCH=d) + (*LIMIT_RECURSION=d) + + where d is any number of decimal digits. However, the value of the set- + ting must be less than the value set (or defaulted) by the caller of + pcre_exec() for it to have any effect. In other words, the pattern + writer can lower the limits set by the programmer, but not raise them. + If there is more than one setting of one of these limits, the lower + value is used. + + +EBCDIC CHARACTER CODES + + PCRE can be compiled to run in an environment that uses EBCDIC as its + character code rather than ASCII or Unicode (typically a mainframe sys- + tem). In the sections below, character code values are ASCII or Uni- + code; in an EBCDIC environment these characters may have different code + values, and there are no code points greater than 255. + + +CHARACTERS AND METACHARACTERS + + A regular expression is a pattern that is matched against a subject + string from left to right. Most characters stand for themselves in a + pattern, and match the corresponding characters in the subject. As a + trivial example, the pattern + + The quick brown fox + + matches a portion of a subject string that is identical to itself. When + caseless matching is specified (the PCRE_CASELESS option), letters are + matched independently of case. In a UTF mode, PCRE always understands + the concept of case for characters whose values are less than 128, so + caseless matching is always possible. For characters with higher val- + ues, the concept of case is supported if PCRE is compiled with Unicode + property support, but not otherwise. If you want to use caseless + matching for characters 128 and above, you must ensure that PCRE is + compiled with Unicode property support as well as with UTF support. + + The power of regular expressions comes from the ability to include al- + ternatives and repetitions in the pattern. These are encoded in the + pattern by the use of metacharacters, which do not stand for themselves + but instead are interpreted in some special way. + + There are two different sets of metacharacters: those that are recog- + nized anywhere in the pattern except within square brackets, and those + that are recognized within square brackets. Outside square brackets, + the metacharacters are as follows: + + \ general escape character with several uses + ^ assert start of string (or line, in multiline mode) + $ assert end of string (or line, in multiline mode) + . match any character except newline (by default) + [ start character class definition + | start of alternative branch + ( start subpattern + ) end subpattern + ? extends the meaning of ( + also 0 or 1 quantifier + also quantifier minimizer + * 0 or more quantifier + + 1 or more quantifier + also "possessive quantifier" + { start min/max quantifier + + Part of a pattern that is in square brackets is called a "character + class". In a character class the only metacharacters are: + + \ general escape character + ^ negate the class, but only if the first character + - indicates character range + [ POSIX character class (only if followed by POSIX + syntax) + ] terminates the character class + + The following sections describe the use of each of the metacharacters. + + +BACKSLASH + + The backslash character has several uses. Firstly, if it is followed by + a character that is not a number or a letter, it takes away any special + meaning that character may have. This use of backslash as an escape + character applies both inside and outside character classes. + + For example, if you want to match a * character, you write \* in the + pattern. This escaping action applies whether or not the following + character would otherwise be interpreted as a metacharacter, so it is + always safe to precede a non-alphanumeric with backslash to specify + that it stands for itself. In particular, if you want to match a back- + slash, you write \\. + + In a UTF mode, only ASCII numbers and letters have any special meaning + after a backslash. All other characters (in particular, those whose + codepoints are greater than 127) are treated as literals. + + If a pattern is compiled with the PCRE_EXTENDED option, most white + space in the pattern (other than in a character class), and characters + between a # outside a character class and the next newline, inclusive, + are ignored. An escaping backslash can be used to include a white space + or # character as part of the pattern. + + If you want to remove the special meaning from a sequence of charac- + ters, you can do so by putting them between \Q and \E. This is differ- + ent from Perl in that $ and @ are handled as literals in \Q...\E se- + quences in PCRE, whereas in Perl, $ and @ cause variable interpolation. + Note the following examples: + + Pattern PCRE matches Perl matches + + \Qabc$xyz\E abc$xyz abc followed by the + contents of $xyz + \Qabc\$xyz\E abc\$xyz abc\$xyz + \Qabc\E\$\Qxyz\E abc$xyz abc$xyz + + The \Q...\E sequence is recognized both inside and outside character + classes. An isolated \E that is not preceded by \Q is ignored. If \Q + is not followed by \E later in the pattern, the literal interpretation + continues to the end of the pattern (that is, \E is assumed at the + end). If the isolated \Q is inside a character class, this causes an + error, because the character class is not terminated. + + Non-printing characters + + A second use of backslash provides a way of encoding non-printing char- + acters in patterns in a visible manner. There is no restriction on the + appearance of non-printing characters, apart from the binary zero that + terminates a pattern, but when a pattern is being prepared by text + editing, it is often easier to use one of the following escape se- + quences than the binary character it represents. In an ASCII or Uni- + code environment, these escapes are as follows: + + \a alarm, that is, the BEL character (hex 07) + \cx "control-x", where x is any ASCII character + \e escape (hex 1B) + \f form feed (hex 0C) + \n linefeed (hex 0A) + \r carriage return (hex 0D) + \t tab (hex 09) + \0dd character with octal code 0dd + \ddd character with octal code ddd, or back reference + \o{ddd..} character with octal code ddd.. + \xhh character with hex code hh + \x{hhh..} character with hex code hhh.. (non-JavaScript mode) + \uhhhh character with hex code hhhh (JavaScript mode only) + + The precise effect of \cx on ASCII characters is as follows: if x is a + lower case letter, it is converted to upper case. Then bit 6 of the + character (hex 40) is inverted. Thus \cA to \cZ become hex 01 to hex 1A + (A is 41, Z is 5A), but \c{ becomes hex 3B ({ is 7B), and \c; becomes + hex 7B (; is 3B). If the data item (byte or 16-bit value) following \c + has a value greater than 127, a compile-time error occurs. This locks + out non-ASCII characters in all modes. + + When PCRE is compiled in EBCDIC mode, \a, \e, \f, \n, \r, and \t gener- + ate the appropriate EBCDIC code values. The \c escape is processed as + specified for Perl in the perlebcdic document. The only characters that + are allowed after \c are A-Z, a-z, or one of @, [, \, ], ^, _, or ?. + Any other character provokes a compile-time error. The sequence \c@ en- + codes character code 0; after \c the letters (in either case) encode + characters 1-26 (hex 01 to hex 1A); [, \, ], ^, and _ encode characters + 27-31 (hex 1B to hex 1F), and \c? becomes either 255 (hex FF) or 95 + (hex 5F). + + Thus, apart from \c?, these escapes generate the same character code + values as they do in an ASCII environment, though the meanings of the + values mostly differ. For example, \cG always generates code value 7, + which is BEL in ASCII but DEL in EBCDIC. + + The sequence \c? generates DEL (127, hex 7F) in an ASCII environment, + but because 127 is not a control character in EBCDIC, Perl makes it + generate the APC character. Unfortunately, there are several variants + of EBCDIC. In most of them the APC character has the value 255 (hex + FF), but in the one Perl calls POSIX-BC its value is 95 (hex 5F). If + certain other characters have POSIX-BC values, PCRE makes \c? generate + 95; otherwise it generates 255. + + After \0 up to two further octal digits are read. If there are fewer + than two digits, just those that are present are used. Thus the se- + quence \0\x\015 specifies two binary zeros followed by a CR character + (code value 13). Make sure you supply two digits after the initial zero + if the pattern character that follows is itself an octal digit. + + The escape \o must be followed by a sequence of octal digits, enclosed + in braces. An error occurs if this is not the case. This escape is a + recent addition to Perl; it provides way of specifying character code + points as octal numbers greater than 0777, and it also allows octal + numbers and back references to be unambiguously specified. + + For greater clarity and unambiguity, it is best to avoid following \ by + a digit greater than zero. Instead, use \o{} or \x{} to specify charac- + ter numbers, and \g{} to specify back references. The following para- + graphs describe the old, ambiguous syntax. + + The handling of a backslash followed by a digit other than 0 is compli- + cated, and Perl has changed in recent releases, causing PCRE also to + change. Outside a character class, PCRE reads the digit and any follow- + ing digits as a decimal number. If the number is less than 8, or if + there have been at least that many previous capturing left parentheses + in the expression, the entire sequence is taken as a back reference. A + description of how this works is given later, following the discussion + of parenthesized subpatterns. + + Inside a character class, or if the decimal number following \ is + greater than 7 and there have not been that many capturing subpatterns, + PCRE handles \8 and \9 as the literal characters "8" and "9", and oth- + erwise re-reads up to three octal digits following the backslash, using + them to generate a data character. Any subsequent digits stand for + themselves. For example: + + \040 is another way of writing an ASCII space + \40 is the same, provided there are fewer than 40 + previous capturing subpatterns + \7 is always a back reference + \11 might be a back reference, or another way of + writing a tab + \011 is always a tab + \0113 is a tab followed by the character "3" + \113 might be a back reference, otherwise the + character with octal code 113 + \377 might be a back reference, otherwise + the value 255 (decimal) + \81 is either a back reference, or the two + characters "8" and "1" + + Note that octal values of 100 or greater that are specified using this + syntax must not be introduced by a leading zero, because no more than + three octal digits are ever read. + + By default, after \x that is not followed by {, from zero to two hexa- + decimal digits are read (letters can be in upper or lower case). Any + number of hexadecimal digits may appear between \x{ and }. If a charac- + ter other than a hexadecimal digit appears between \x{ and }, or if + there is no terminating }, an error occurs. + + If the PCRE_JAVASCRIPT_COMPAT option is set, the interpretation of \x + is as just described only when it is followed by two hexadecimal dig- + its. Otherwise, it matches a literal "x" character. In JavaScript + mode, support for code points greater than 256 is provided by \u, which + must be followed by four hexadecimal digits; otherwise it matches a + literal "u" character. + + Characters whose value is less than 256 can be defined by either of the + two syntaxes for \x (or by \u in JavaScript mode). There is no differ- + ence in the way they are handled. For example, \xdc is exactly the same + as \x{dc} (or \u00dc in JavaScript mode). + + Constraints on character values + + Characters that are specified using octal or hexadecimal numbers are + limited to certain values, as follows: + + 8-bit non-UTF mode less than 0x100 + 8-bit UTF-8 mode less than 0x10ffff and a valid codepoint + 16-bit non-UTF mode less than 0x10000 + 16-bit UTF-16 mode less than 0x10ffff and a valid codepoint + 32-bit non-UTF mode less than 0x100000000 + 32-bit UTF-32 mode less than 0x10ffff and a valid codepoint + + Invalid Unicode codepoints are the range 0xd800 to 0xdfff (the so- + called "surrogate" codepoints), and 0xffef. + + Escape sequences in character classes + + All the sequences that define a single character value can be used both + inside and outside character classes. In addition, inside a character + class, \b is interpreted as the backspace character (hex 08). + + \N is not allowed in a character class. \B, \R, and \X are not special + inside a character class. Like other unrecognized escape sequences, + they are treated as the literal characters "B", "R", and "X" by de- + fault, but cause an error if the PCRE_EXTRA option is set. Outside a + character class, these sequences have different meanings. + + Unsupported escape sequences + + In Perl, the sequences \l, \L, \u, and \U are recognized by its string + handler and used to modify the case of following characters. By de- + fault, PCRE does not support these escape sequences. However, if the + PCRE_JAVASCRIPT_COMPAT option is set, \U matches a "U" character, and + \u can be used to define a character by code point, as described in the + previous section. + + Absolute and relative back references + + The sequence \g followed by an unsigned or a negative number, option- + ally enclosed in braces, is an absolute or relative back reference. A + named back reference can be coded as \g{name}. Back references are dis- + cussed later, following the discussion of parenthesized subpatterns. + + Absolute and relative subroutine calls + + For compatibility with Oniguruma, the non-Perl syntax \g followed by a + name or a number enclosed either in angle brackets or single quotes, is + an alternative syntax for referencing a subpattern as a "subroutine". + Details are discussed later. Note that \g{...} (Perl syntax) and + \g<...> (Oniguruma syntax) are not synonymous. The former is a back + reference; the latter is a subroutine call. + + Generic character types + + Another use of backslash is for specifying generic character types: + + \d any decimal digit + \D any character that is not a decimal digit + \h any horizontal white space character + \H any character that is not a horizontal white space character + \s any white space character + \S any character that is not a white space character + \v any vertical white space character + \V any character that is not a vertical white space character + \w any "word" character + \W any "non-word" character + + There is also the single sequence \N, which matches a non-newline char- + acter. This is the same as the "." metacharacter when PCRE_DOTALL is + not set. Perl also uses \N to match characters by name; PCRE does not + support this. + + Each pair of lower and upper case escape sequences partitions the com- + plete set of characters into two disjoint sets. Any given character + matches one, and only one, of each pair. The sequences can appear both + inside and outside character classes. They each match one character of + the appropriate type. If the current matching point is at the end of + the subject string, all of them fail, because there is no character to + match. + + For compatibility with Perl, \s did not used to match the VT character + (code 11), which made it different from the the POSIX "space" class. + However, Perl added VT at release 5.18, and PCRE followed suit at re- + lease 8.34. The default \s characters are now HT (9), LF (10), VT (11), + FF (12), CR (13), and space (32), which are defined as white space in + the "C" locale. This list may vary if locale-specific matching is tak- + ing place. For example, in some locales the "non-breaking space" char- + acter (\xA0) is recognized as white space, and in others the VT charac- + ter is not. + + A "word" character is an underscore or any character that is a letter + or digit. By default, the definition of letters and digits is con- + trolled by PCRE's low-valued character tables, and may vary if locale- + specific matching is taking place (see "Locale support" in the pcreapi + page). For example, in a French locale such as "fr_FR" in Unix-like + systems, or "french" in Windows, some character codes greater than 127 + are used for accented letters, and these are then matched by \w. The + use of locales with Unicode is discouraged. + + By default, characters whose code points are greater than 127 never + match \d, \s, or \w, and always match \D, \S, and \W, although this may + vary for characters in the range 128-255 when locale-specific matching + is happening. These escape sequences retain their original meanings + from before Unicode support was available, mainly for efficiency rea- + sons. If PCRE is compiled with Unicode property support, and the + PCRE_UCP option is set, the behaviour is changed so that Unicode prop- + erties are used to determine character types, as follows: + + \d any character that matches \p{Nd} (decimal digit) + \s any character that matches \p{Z} or \h or \v + \w any character that matches \p{L} or \p{N}, plus underscore + + The upper case escapes match the inverse sets of characters. Note that + \d matches only decimal digits, whereas \w matches any Unicode digit, + as well as any Unicode letter, and underscore. Note also that PCRE_UCP + affects \b, and \B because they are defined in terms of \w and \W. + Matching these sequences is noticeably slower when PCRE_UCP is set. + + The sequences \h, \H, \v, and \V are features that were added to Perl + at release 5.10. In contrast to the other sequences, which match only + ASCII characters by default, these always match certain high-valued + code points, whether or not PCRE_UCP is set. The horizontal space char- + acters are: + + U+0009 Horizontal tab (HT) + U+0020 Space + U+00A0 Non-break space + U+1680 Ogham space mark + U+180E Mongolian vowel separator + U+2000 En quad + U+2001 Em quad + U+2002 En space + U+2003 Em space + U+2004 Three-per-em space + U+2005 Four-per-em space + U+2006 Six-per-em space + U+2007 Figure space + U+2008 Punctuation space + U+2009 Thin space + U+200A Hair space + U+202F Narrow no-break space + U+205F Medium mathematical space + U+3000 Ideographic space + + The vertical space characters are: + + U+000A Linefeed (LF) + U+000B Vertical tab (VT) + U+000C Form feed (FF) + U+000D Carriage return (CR) + U+0085 Next line (NEL) + U+2028 Line separator + U+2029 Paragraph separator + + In 8-bit, non-UTF-8 mode, only the characters with codepoints less than + 256 are relevant. + + Newline sequences + + Outside a character class, by default, the escape sequence \R matches + any Unicode newline sequence. In 8-bit non-UTF-8 mode \R is equivalent + to the following: + + (?>\r\n|\n|\x0b|\f|\r|\x85) + + This is an example of an "atomic group", details of which are given be- + low. This particular group matches either the two-character sequence + CR followed by LF, or one of the single characters LF (linefeed, + U+000A), VT (vertical tab, U+000B), FF (form feed, U+000C), CR (car- + riage return, U+000D), or NEL (next line, U+0085). The two-character + sequence is treated as a single unit that cannot be split. + + In other modes, two additional characters whose codepoints are greater + than 255 are added: LS (line separator, U+2028) and PS (paragraph sepa- + rator, U+2029). Unicode character property support is not needed for + these characters to be recognized. + + It is possible to restrict \R to match only CR, LF, or CRLF (instead of + the complete set of Unicode line endings) by setting the option + PCRE_BSR_ANYCRLF either at compile time or when the pattern is matched. + (BSR is an abbrevation for "backslash R".) This can be made the default + when PCRE is built; if this is the case, the other behaviour can be re- + quested via the PCRE_BSR_UNICODE option. It is also possible to spec- + ify these settings by starting a pattern string with one of the follow- + ing sequences: + + (*BSR_ANYCRLF) CR, LF, or CRLF only + (*BSR_UNICODE) any Unicode newline sequence + + These override the default and the options given to the compiling func- + tion, but they can themselves be overridden by options given to a + matching function. Note that these special settings, which are not + Perl-compatible, are recognized only at the very start of a pattern, + and that they must be in upper case. If more than one of them is + present, the last one is used. They can be combined with a change of + newline convention; for example, a pattern can start with: + + (*ANY)(*BSR_ANYCRLF) + + They can also be combined with the (*UTF8), (*UTF16), (*UTF32), (*UTF) + or (*UCP) special sequences. Inside a character class, \R is treated as + an unrecognized escape sequence, and so matches the letter "R" by de- + fault, but causes an error if PCRE_EXTRA is set. + + Unicode character properties + + When PCRE is built with Unicode character property support, three addi- + tional escape sequences that match characters with specific properties + are available. When in 8-bit non-UTF-8 mode, these sequences are of + course limited to testing characters whose codepoints are less than + 256, but they do work in this mode. The extra escape sequences are: + + \p{xx} a character with the xx property + \P{xx} a character without the xx property + \X a Unicode extended grapheme cluster + + The property names represented by xx above are limited to the Unicode + script names, the general category properties, "Any", which matches any + character (including newline), and some special PCRE properties (de- + scribed in the next section). Other Perl properties such as "InMusi- + calSymbols" are not currently supported by PCRE. Note that \P{Any} does + not match any characters, so always causes a match failure. + + Sets of Unicode characters are defined as belonging to certain scripts. + A character from one of these sets can be matched using a script name. + For example: + + \p{Greek} + \P{Han} + + Those that are not part of an identified script are lumped together as + "Common". The current list of scripts is: + + Arabic, Armenian, Avestan, Balinese, Bamum, Bassa_Vah, Batak, Bengali, + Bopomofo, Brahmi, Braille, Buginese, Buhid, Canadian_Aboriginal, Car- + ian, Caucasian_Albanian, Chakma, Cham, Cherokee, Common, Coptic, Cunei- + form, Cypriot, Cyrillic, Deseret, Devanagari, Duployan, Egyptian_Hiero- + glyphs, Elbasan, Ethiopic, Georgian, Glagolitic, Gothic, Grantha, + Greek, Gujarati, Gurmukhi, Han, Hangul, Hanunoo, Hebrew, Hiragana, Im- + perial_Aramaic, Inherited, Inscriptional_Pahlavi, Inscrip- + tional_Parthian, Javanese, Kaithi, Kannada, Katakana, Kayah_Li, + Kharoshthi, Khmer, Khojki, Khudawadi, Lao, Latin, Lepcha, Limbu, Lin- + ear_A, Linear_B, Lisu, Lycian, Lydian, Mahajani, Malayalam, Mandaic, + Manichaean, Meetei_Mayek, Mende_Kikakui, Meroitic_Cursive, Meroitic_Hi- + eroglyphs, Miao, Modi, Mongolian, Mro, Myanmar, Nabataean, New_Tai_Lue, + Nko, Ogham, Ol_Chiki, Old_Italic, Old_North_Arabian, Old_Permic, + Old_Persian, Old_South_Arabian, Old_Turkic, Oriya, Osmanya, Pa- + hawh_Hmong, Palmyrene, Pau_Cin_Hau, Phags_Pa, Phoenician, + Psalter_Pahlavi, Rejang, Runic, Samaritan, Saurashtra, Sharada, Sha- + vian, Siddham, Sinhala, Sora_Sompeng, Sundanese, Syloti_Nagri, Syriac, + Tagalog, Tagbanwa, Tai_Le, Tai_Tham, Tai_Viet, Takri, Tamil, Telugu, + Thaana, Thai, Tibetan, Tifinagh, Tirhuta, Ugaritic, Vai, Warang_Citi, + Yi. + + Each character has exactly one Unicode general category property, spec- + ified by a two-letter abbreviation. For compatibility with Perl, nega- + tion can be specified by including a circumflex between the opening + brace and the property name. For example, \p{^Lu} is the same as + \P{Lu}. + + If only one letter is specified with \p or \P, it includes all the gen- + eral category properties that start with that letter. In this case, in + the absence of negation, the curly brackets in the escape sequence are + optional; these two examples have the same effect: + + \p{L} + \pL + + The following general category property codes are supported: + + C Other + Cc Control + Cf Format + Cn Unassigned + Co Private use + Cs Surrogate + + L Letter + Ll Lower case letter + Lm Modifier letter + Lo Other letter + Lt Title case letter + Lu Upper case letter + + M Mark + Mc Spacing mark + Me Enclosing mark + Mn Non-spacing mark + + N Number + Nd Decimal number + Nl Letter number + No Other number + + P Punctuation + Pc Connector punctuation + Pd Dash punctuation + Pe Close punctuation + Pf Final punctuation + Pi Initial punctuation + Po Other punctuation + Ps Open punctuation + + S Symbol + Sc Currency symbol + Sk Modifier symbol + Sm Mathematical symbol + So Other symbol + + Z Separator + Zl Line separator + Zp Paragraph separator + Zs Space separator + + The special property L& is also supported: it matches a character that + has the Lu, Ll, or Lt property, in other words, a letter that is not + classified as a modifier or "other". + + The Cs (Surrogate) property applies only to characters in the range + U+D800 to U+DFFF. Such characters are not valid in Unicode strings and + so cannot be tested by PCRE, unless UTF validity checking has been + turned off (see the discussion of PCRE_NO_UTF8_CHECK, + PCRE_NO_UTF16_CHECK and PCRE_NO_UTF32_CHECK in the pcreapi page). Perl + does not support the Cs property. + + The long synonyms for property names that Perl supports (such as + \p{Letter}) are not supported by PCRE, nor is it permitted to prefix + any of these properties with "Is". + + No character that is in the Unicode table has the Cn (unassigned) prop- + erty. Instead, this property is assumed for any code point that is not + in the Unicode table. + + Specifying caseless matching does not affect these escape sequences. + For example, \p{Lu} always matches only upper case letters. This is + different from the behaviour of current versions of Perl. + + Matching characters by Unicode property is not fast, because PCRE has + to do a multistage table lookup in order to find a character's prop- + erty. That is why the traditional escape sequences such as \d and \w do + not use Unicode properties in PCRE by default, though you can make them + do so by setting the PCRE_UCP option or by starting the pattern with + (*UCP). + + Extended grapheme clusters + + The \X escape matches any number of Unicode characters that form an + "extended grapheme cluster", and treats the sequence as an atomic group + (see below). Up to and including release 8.31, PCRE matched an ear- + lier, simpler definition that was equivalent to + + (?>\PM\pM*) + + That is, it matched a character without the "mark" property, followed + by zero or more characters with the "mark" property. Characters with + the "mark" property are typically non-spacing accents that affect the + preceding character. + + This simple definition was extended in Unicode to include more compli- + cated kinds of composite character by giving each character a grapheme + breaking property, and creating rules that use these properties to de- + fine the boundaries of extended grapheme clusters. In releases of PCRE + later than 8.31, \X matches one of these clusters. + + \X always matches at least one character. Then it decides whether to + add additional characters according to the following rules for ending a + cluster: + + 1. End at the end of the subject string. + + 2. Do not end between CR and LF; otherwise end after any control char- + acter. + + 3. Do not break Hangul (a Korean script) syllable sequences. Hangul + characters are of five types: L, V, T, LV, and LVT. An L character may + be followed by an L, V, LV, or LVT character; an LV or V character may + be followed by a V or T character; an LVT or T character may be follwed + only by a T character. + + 4. Do not end before extending characters or spacing marks. Characters + with the "mark" property always have the "extend" grapheme breaking + property. + + 5. Do not end after prepend characters. + + 6. Otherwise, end the cluster. + + PCRE's additional properties + + As well as the standard Unicode properties described above, PCRE sup- + ports four more that make it possible to convert traditional escape se- + quences such as \w and \s to use Unicode properties. PCRE uses these + non-standard, non-Perl properties internally when PCRE_UCP is set. How- + ever, they may also be used explicitly. These properties are: + + Xan Any alphanumeric character + Xps Any POSIX space character + Xsp Any Perl space character + Xwd Any Perl "word" character + + Xan matches characters that have either the L (letter) or the N (num- + ber) property. Xps matches the characters tab, linefeed, vertical tab, + form feed, or carriage return, and any other character that has the Z + (separator) property. Xsp is the same as Xps; it used to exclude ver- + tical tab, for Perl compatibility, but Perl changed, and so PCRE fol- + lowed at release 8.34. Xwd matches the same characters as Xan, plus un- + derscore. + + There is another non-standard property, Xuc, which matches any charac- + ter that can be represented by a Universal Character Name in C++ and + other programming languages. These are the characters $, @, ` (grave + accent), and all characters with Unicode code points greater than or + equal to U+00A0, except for the surrogates U+D800 to U+DFFF. Note that + most base (ASCII) characters are excluded. (Universal Character Names + are of the form \uHHHH or \UHHHHHHHH where H is a hexadecimal digit. + Note that the Xuc property does not match these sequences but the char- + acters that they represent.) + + Resetting the match start + + The escape sequence \K causes any previously matched characters not to + be included in the final matched sequence. For example, the pattern: + + foo\Kbar + + matches "foobar", but reports that it has matched "bar". This feature + is similar to a lookbehind assertion (described below). However, in + this case, the part of the subject before the real match does not have + to be of fixed length, as lookbehind assertions do. The use of \K does + not interfere with the setting of captured substrings. For example, + when the pattern + + (foo)\Kbar + + matches "foobar", the first substring is still set to "foo". + + Perl documents that the use of \K within assertions is "not well de- + fined". In PCRE, \K is acted upon when it occurs inside positive asser- + tions, but is ignored in negative assertions. Note that when a pattern + such as (?=ab\K) matches, the reported start of the match can be + greater than the end of the match. + + Simple assertions + + The final use of backslash is for certain simple assertions. An asser- + tion specifies a condition that has to be met at a particular point in + a match, without consuming any characters from the subject string. The + use of subpatterns for more complicated assertions is described below. + The backslashed assertions are: + + \b matches at a word boundary + \B matches when not at a word boundary + \A matches at the start of the subject + \Z matches at the end of the subject + also matches before a newline at the end of the subject + \z matches only at the end of the subject + \G matches at the first matching position in the subject + + Inside a character class, \b has a different meaning; it matches the + backspace character. If any other of these assertions appears in a + character class, by default it matches the corresponding literal char- + acter (for example, \B matches the letter B). However, if the PCRE_EX- + TRA option is set, an "invalid escape sequence" error is generated in- + stead. + + A word boundary is a position in the subject string where the current + character and the previous character do not both match \w or \W (i.e. + one matches \w and the other matches \W), or the start or end of the + string if the first or last character matches \w, respectively. In a + UTF mode, the meanings of \w and \W can be changed by setting the + PCRE_UCP option. When this is done, it also affects \b and \B. Neither + PCRE nor Perl has a separate "start of word" or "end of word" metase- + quence. However, whatever follows \b normally determines which it is. + For example, the fragment \ba matches "a" at the start of a word. + + The \A, \Z, and \z assertions differ from the traditional circumflex + and dollar (described in the next section) in that they only ever match + at the very start and end of the subject string, whatever options are + set. Thus, they are independent of multiline mode. These three asser- + tions are not affected by the PCRE_NOTBOL or PCRE_NOTEOL options, which + affect only the behaviour of the circumflex and dollar metacharacters. + However, if the startoffset argument of pcre_exec() is non-zero, indi- + cating that matching is to start at a point other than the beginning of + the subject, \A can never match. The difference between \Z and \z is + that \Z matches before a newline at the end of the string as well as at + the very end, whereas \z matches only at the end. + + The \G assertion is true only when the current matching position is at + the start point of the match, as specified by the startoffset argument + of pcre_exec(). It differs from \A when the value of startoffset is + non-zero. By calling pcre_exec() multiple times with appropriate argu- + ments, you can mimic Perl's /g option, and it is in this kind of imple- + mentation where \G can be useful. + + Note, however, that PCRE's interpretation of \G, as the start of the + current match, is subtly different from Perl's, which defines it as the + end of the previous match. In Perl, these can be different when the + previously matched string was empty. Because PCRE does just one match + at a time, it cannot reproduce this behaviour. + + If all the alternatives of a pattern begin with \G, the expression is + anchored to the starting match position, and the "anchored" flag is set + in the compiled regular expression. + + +CIRCUMFLEX AND DOLLAR + + The circumflex and dollar metacharacters are zero-width assertions. + That is, they test for a particular condition being true without con- + suming any characters from the subject string. + + Outside a character class, in the default matching mode, the circumflex + character is an assertion that is true only if the current matching + point is at the start of the subject string. If the startoffset argu- + ment of pcre_exec() is non-zero, circumflex can never match if the + PCRE_MULTILINE option is unset. Inside a character class, circumflex + has an entirely different meaning (see below). + + Circumflex need not be the first character of the pattern if a number + of alternatives are involved, but it should be the first thing in each + alternative in which it appears if the pattern is ever to match that + branch. If all possible alternatives start with a circumflex, that is, + if the pattern is constrained to match only at the start of the sub- + ject, it is said to be an "anchored" pattern. (There are also other + constructs that can cause a pattern to be anchored.) + + The dollar character is an assertion that is true only if the current + matching point is at the end of the subject string, or immediately be- + fore a newline at the end of the string (by default). Note, however, + that it does not actually match the newline. Dollar need not be the + last character of the pattern if a number of alternatives are involved, + but it should be the last item in any branch in which it appears. Dol- + lar has no special meaning in a character class. + + The meaning of dollar can be changed so that it matches only at the + very end of the string, by setting the PCRE_DOLLAR_ENDONLY option at + compile time. This does not affect the \Z assertion. + + The meanings of the circumflex and dollar characters are changed if the + PCRE_MULTILINE option is set. When this is the case, a circumflex + matches immediately after internal newlines as well as at the start of + the subject string. It does not match after a newline that ends the + string. A dollar matches before any newlines in the string, as well as + at the very end, when PCRE_MULTILINE is set. When newline is specified + as the two-character sequence CRLF, isolated CR and LF characters do + not indicate newlines. + + For example, the pattern /^abc$/ matches the subject string "def\nabc" + (where \n represents a newline) in multiline mode, but not otherwise. + Consequently, patterns that are anchored in single line mode because + all branches start with ^ are not anchored in multiline mode, and a + match for circumflex is possible when the startoffset argument of + pcre_exec() is non-zero. The PCRE_DOLLAR_ENDONLY option is ignored if + PCRE_MULTILINE is set. + + Note that the sequences \A, \Z, and \z can be used to match the start + and end of the subject in both modes, and if all branches of a pattern + start with \A it is always anchored, whether or not PCRE_MULTILINE is + set. + + +FULL STOP (PERIOD, DOT) AND \N + + Outside a character class, a dot in the pattern matches any one charac- + ter in the subject string except (by default) a character that signi- + fies the end of a line. + + When a line ending is defined as a single character, dot never matches + that character; when the two-character sequence CRLF is used, dot does + not match CR if it is immediately followed by LF, but otherwise it + matches all characters (including isolated CRs and LFs). When any Uni- + code line endings are being recognized, dot does not match CR or LF or + any of the other line ending characters. + + The behaviour of dot with regard to newlines can be changed. If the + PCRE_DOTALL option is set, a dot matches any one character, without ex- + ception. If the two-character sequence CRLF is present in the subject + string, it takes two dots to match it. + + The handling of dot is entirely independent of the handling of circum- + flex and dollar, the only relationship being that they both involve + newlines. Dot has no special meaning in a character class. + + The escape sequence \N behaves like a dot, except that it is not af- + fected by the PCRE_DOTALL option. In other words, it matches any char- + acter except one that signifies the end of a line. Perl also uses \N to + match characters by name; PCRE does not support this. + + +MATCHING A SINGLE DATA UNIT + + Outside a character class, the escape sequence \C matches any one data + unit, whether or not a UTF mode is set. In the 8-bit library, one data + unit is one byte; in the 16-bit library it is a 16-bit unit; in the + 32-bit library it is a 32-bit unit. Unlike a dot, \C always matches + line-ending characters. The feature is provided in Perl in order to + match individual bytes in UTF-8 mode, but it is unclear how it can use- + fully be used. Because \C breaks up characters into individual data + units, matching one unit with \C in a UTF mode means that the rest of + the string may start with a malformed UTF character. This has undefined + results, because PCRE assumes that it is dealing with valid UTF strings + (and by default it checks this at the start of processing unless the + PCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK or PCRE_NO_UTF32_CHECK option + is used). + + PCRE does not allow \C to appear in lookbehind assertions (described + below) in a UTF mode, because this would make it impossible to calcu- + late the length of the lookbehind. + + In general, the \C escape sequence is best avoided. However, one way of + using it that avoids the problem of malformed UTF characters is to use + a lookahead to check the length of the next character, as in this pat- + tern, which could be used with a UTF-8 string (ignore white space and + line breaks): + + (?| (?=[\x00-\x7f])(\C) | + (?=[\x80-\x{7ff}])(\C)(\C) | + (?=[\x{800}-\x{ffff}])(\C)(\C)(\C) | + (?=[\x{10000}-\x{1fffff}])(\C)(\C)(\C)(\C)) + + A group that starts with (?| resets the capturing parentheses numbers + in each alternative (see "Duplicate Subpattern Numbers" below). The as- + sertions at the start of each branch check the next UTF-8 character for + values whose encoding uses 1, 2, 3, or 4 bytes, respectively. The char- + acter's individual bytes are then captured by the appropriate number of + groups. + + +SQUARE BRACKETS AND CHARACTER CLASSES + + An opening square bracket introduces a character class, terminated by a + closing square bracket. A closing square bracket on its own is not spe- + cial by default. However, if the PCRE_JAVASCRIPT_COMPAT option is set, + a lone closing square bracket causes a compile-time error. If a closing + square bracket is required as a member of the class, it should be the + first data character in the class (after an initial circumflex, if + present) or escaped with a backslash. + + A character class matches a single character in the subject. In a UTF + mode, the character may be more than one data unit long. A matched + character must be in the set of characters defined by the class, unless + the first character in the class definition is a circumflex, in which + case the subject character must not be in the set defined by the class. + If a circumflex is actually required as a member of the class, ensure + it is not the first character, or escape it with a backslash. + + For example, the character class [aeiou] matches any lower case vowel, + while [^aeiou] matches any character that is not a lower case vowel. + Note that a circumflex is just a convenient notation for specifying the + characters that are in the class by enumerating those that are not. A + class that starts with a circumflex is not an assertion; it still con- + sumes a character from the subject string, and therefore it fails if + the current pointer is at the end of the string. + + In UTF-8 (UTF-16, UTF-32) mode, characters with values greater than 255 + (0xffff) can be included in a class as a literal string of data units, + or by using the \x{ escaping mechanism. + + When caseless matching is set, any letters in a class represent both + their upper case and lower case versions, so for example, a caseless + [aeiou] matches "A" as well as "a", and a caseless [^aeiou] does not + match "A", whereas a caseful version would. In a UTF mode, PCRE always + understands the concept of case for characters whose values are less + than 128, so caseless matching is always possible. For characters with + higher values, the concept of case is supported if PCRE is compiled + with Unicode property support, but not otherwise. If you want to use + caseless matching in a UTF mode for characters 128 and above, you must + ensure that PCRE is compiled with Unicode property support as well as + with UTF support. + + Characters that might indicate line breaks are never treated in any + special way when matching character classes, whatever line-ending se- + quence is in use, and whatever setting of the PCRE_DOTALL and PCRE_MUL- + TILINE options is used. A class such as [^a] always matches one of + these characters. + + The minus (hyphen) character can be used to specify a range of charac- + ters in a character class. For example, [d-m] matches any letter be- + tween d and m, inclusive. If a minus character is required in a class, + it must be escaped with a backslash or appear in a position where it + cannot be interpreted as indicating a range, typically as the first or + last character in the class, or immediately after a range. For example, + [b-d-z] matches letters in the range b to d, a hyphen character, or z. + + It is not possible to have the literal character "]" as the end charac- + ter of a range. A pattern such as [W-]46] is interpreted as a class of + two characters ("W" and "-") followed by a literal string "46]", so it + would match "W46]" or "-46]". However, if the "]" is escaped with a + backslash it is interpreted as the end of range, so [W-\]46] is inter- + preted as a class containing a range followed by two other characters. + The octal or hexadecimal representation of "]" can also be used to end + a range. + + An error is generated if a POSIX character class (see below) or an es- + cape sequence other than one that defines a single character appears at + a point where a range ending character is expected. For example, + [z-\xff] is valid, but [A-\d] and [A-[:digit:]] are not. + + Ranges operate in the collating sequence of character values. They can + also be used for characters specified numerically, for example + [\000-\037]. Ranges can include any characters that are valid for the + current mode. + + If a range that includes letters is used when caseless matching is set, + it matches the letters in either case. For example, [W-c] is equivalent + to [][\\^_`wxyzabc], matched caselessly, and in a non-UTF mode, if + character tables for a French locale are in use, [\xc8-\xcb] matches + accented E characters in both cases. In UTF modes, PCRE supports the + concept of case for characters with values greater than 128 only when + it is compiled with Unicode property support. + + The character escape sequences \d, \D, \h, \H, \p, \P, \s, \S, \v, \V, + \w, and \W may appear in a character class, and add the characters that + they match to the class. For example, [\dABCDEF] matches any hexadeci- + mal digit. In UTF modes, the PCRE_UCP option affects the meanings of + \d, \s, \w and their upper case partners, just as it does when they ap- + pear outside a character class, as described in the section entitled + "Generic character types" above. The escape sequence \b has a different + meaning inside a character class; it matches the backspace character. + The sequences \B, \N, \R, and \X are not special inside a character + class. Like any other unrecognized escape sequences, they are treated + as the literal characters "B", "N", "R", and "X" by default, but cause + an error if the PCRE_EXTRA option is set. + + A circumflex can conveniently be used with the upper case character + types to specify a more restricted set of characters than the matching + lower case type. For example, the class [^\W_] matches any letter or + digit, but not underscore, whereas [\w] includes underscore. A positive + character class should be read as "something OR something OR ..." and a + negative class as "NOT something AND NOT something AND NOT ...". + + The only metacharacters that are recognized in character classes are + backslash, hyphen (only where it can be interpreted as specifying a + range), circumflex (only at the start), opening square bracket (only + when it can be interpreted as introducing a POSIX class name, or for a + special compatibility feature - see the next two sections), and the + terminating closing square bracket. However, escaping other non-al- + phanumeric characters does no harm. + + +POSIX CHARACTER CLASSES + + Perl supports the POSIX notation for character classes. This uses names + enclosed by [: and :] within the enclosing square brackets. PCRE also + supports this notation. For example, + + [01[:alpha:]%] + + matches "0", "1", any alphabetic character, or "%". The supported class + names are: + + alnum letters and digits + alpha letters + ascii character codes 0 - 127 + blank space or tab only + cntrl control characters + digit decimal digits (same as \d) + graph printing characters, excluding space + lower lower case letters + print printing characters, including space + punct printing characters, excluding letters and digits and space + space white space (the same as \s from PCRE 8.34) + upper upper case letters + word "word" characters (same as \w) + xdigit hexadecimal digits + + The default "space" characters are HT (9), LF (10), VT (11), FF (12), + CR (13), and space (32). If locale-specific matching is taking place, + the list of space characters may be different; there may be fewer or + more of them. "Space" used to be different to \s, which did not include + VT, for Perl compatibility. However, Perl changed at release 5.18, and + PCRE followed at release 8.34. "Space" and \s now match the same set + of characters. + + The name "word" is a Perl extension, and "blank" is a GNU extension + from Perl 5.8. Another Perl extension is negation, which is indicated + by a ^ character after the colon. For example, + + [12[:^digit:]] + + matches "1", "2", or any non-digit. PCRE (and Perl) also recognize the + POSIX syntax [.ch.] and [=ch=] where "ch" is a "collating element", but + these are not supported, and an error is given if they are encountered. + + By default, characters with values greater than 128 do not match any of + the POSIX character classes. However, if the PCRE_UCP option is passed + to pcre_compile(), some of the classes are changed so that Unicode + character properties are used. This is achieved by replacing certain + POSIX classes by other sequences, as follows: + + [:alnum:] becomes \p{Xan} + [:alpha:] becomes \p{L} + [:blank:] becomes \h + [:digit:] becomes \p{Nd} + [:lower:] becomes \p{Ll} + [:space:] becomes \p{Xps} + [:upper:] becomes \p{Lu} + [:word:] becomes \p{Xwd} + + Negated versions, such as [:^alpha:] use \P instead of \p. Three other + POSIX classes are handled specially in UCP mode: + + [:graph:] This matches characters that have glyphs that mark the page + when printed. In Unicode property terms, it matches all char- + acters with the L, M, N, P, S, or Cf properties, except for: + + U+061C Arabic Letter Mark + U+180E Mongolian Vowel Separator + U+2066 - U+2069 Various "isolate"s + + + [:print:] This matches the same characters as [:graph:] plus space + characters that are not controls, that is, characters with + the Zs property. + + [:punct:] This matches all characters that have the Unicode P (punctua- + tion) property, plus those characters whose code points are + less than 128 that have the S (Symbol) property. + + The other POSIX classes are unchanged, and match only characters with + code points less than 128. + + +COMPATIBILITY FEATURE FOR WORD BOUNDARIES + + In the POSIX.2 compliant library that was included in 4.4BSD Unix, the + ugly syntax [[:<:]] and [[:>:]] is used for matching "start of word" + and "end of word". PCRE treats these items as follows: + + [[:<:]] is converted to \b(?=\w) + [[:>:]] is converted to \b(?<=\w) + + Only these exact character sequences are recognized. A sequence such as + [a[:<:]b] provokes error for an unrecognized POSIX class name. This + support is not compatible with Perl. It is provided to help migrations + from other environments, and is best not used in any new patterns. Note + that \b matches at the start and the end of a word (see "Simple asser- + tions" above), and in a Perl-style pattern the preceding or following + character normally shows which is wanted, without the need for the as- + sertions that are used above in order to give exactly the POSIX behav- + iour. + + +VERTICAL BAR + + Vertical bar characters are used to separate alternative patterns. For + example, the pattern + + gilbert|sullivan + + matches either "gilbert" or "sullivan". Any number of alternatives may + appear, and an empty alternative is permitted (matching the empty + string). The matching process tries each alternative in turn, from left + to right, and the first one that succeeds is used. If the alternatives + are within a subpattern (defined below), "succeeds" means matching the + rest of the main pattern as well as the alternative in the subpattern. + + +INTERNAL OPTION SETTING + + The settings of the PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL, and + PCRE_EXTENDED options (which are Perl-compatible) can be changed from + within the pattern by a sequence of Perl option letters enclosed be- + tween "(?" and ")". The option letters are + + i for PCRE_CASELESS + m for PCRE_MULTILINE + s for PCRE_DOTALL + x for PCRE_EXTENDED + + For example, (?im) sets caseless, multiline matching. It is also possi- + ble to unset these options by preceding the letter with a hyphen, and a + combined setting and unsetting such as (?im-sx), which sets PCRE_CASE- + LESS and PCRE_MULTILINE while unsetting PCRE_DOTALL and PCRE_EXTENDED, + is also permitted. If a letter appears both before and after the hy- + phen, the option is unset. + + The PCRE-specific options PCRE_DUPNAMES, PCRE_UNGREEDY, and PCRE_EXTRA + can be changed in the same way as the Perl-compatible options by using + the characters J, U and X respectively. + + When one of these option changes occurs at top level (that is, not in- + side subpattern parentheses), the change applies to the remainder of + the pattern that follows. An option change within a subpattern (see be- + low for a description of subpatterns) affects only that part of the + subpattern that follows it, so + + (a(?i)b)c + + matches abc and aBc and no other strings (assuming PCRE_CASELESS is not + used). By this means, options can be made to have different settings + in different parts of the pattern. Any changes made in one alternative + do carry on into subsequent branches within the same subpattern. For + example, + + (a(?i)b|c) + + matches "ab", "aB", "c", and "C", even though when matching "C" the + first branch is abandoned before the option setting. This is because + the effects of option settings happen at compile time. There would be + some very weird behaviour otherwise. + + Note: There are other PCRE-specific options that can be set by the ap- + plication when the compiling or matching functions are called. In some + cases the pattern can contain special leading sequences such as (*CRLF) + to override what the application has set or what has been defaulted. + Details are given in the section entitled "Newline sequences" above. + There are also the (*UTF8), (*UTF16),(*UTF32), and (*UCP) leading se- + quences that can be used to set UTF and Unicode property modes; they + are equivalent to setting the PCRE_UTF8, PCRE_UTF16, PCRE_UTF32 and the + PCRE_UCP options, respectively. The (*UTF) sequence is a generic ver- + sion that can be used with any of the libraries. However, the applica- + tion can set the PCRE_NEVER_UTF option, which locks out the use of the + (*UTF) sequences. + + +SUBPATTERNS + + Subpatterns are delimited by parentheses (round brackets), which can be + nested. Turning part of a pattern into a subpattern does two things: + + 1. It localizes a set of alternatives. For example, the pattern + + cat(aract|erpillar|) + + matches "cataract", "caterpillar", or "cat". Without the parentheses, + it would match "cataract", "erpillar" or an empty string. + + 2. It sets up the subpattern as a capturing subpattern. This means + that, when the whole pattern matches, that portion of the subject + string that matched the subpattern is passed back to the caller via the + ovector argument of the matching function. (This applies only to the + traditional matching functions; the DFA matching functions do not sup- + port capturing.) + + Opening parentheses are counted from left to right (starting from 1) to + obtain numbers for the capturing subpatterns. For example, if the + string "the red king" is matched against the pattern + + the ((red|white) (king|queen)) + + the captured substrings are "red king", "red", and "king", and are num- + bered 1, 2, and 3, respectively. + + The fact that plain parentheses fulfil two functions is not always + helpful. There are often times when a grouping subpattern is required + without a capturing requirement. If an opening parenthesis is followed + by a question mark and a colon, the subpattern does not do any captur- + ing, and is not counted when computing the number of any subsequent + capturing subpatterns. For example, if the string "the white queen" is + matched against the pattern + + the ((?:red|white) (king|queen)) + + the captured substrings are "white queen" and "queen", and are numbered + 1 and 2. The maximum number of capturing subpatterns is 65535. + + As a convenient shorthand, if any option settings are required at the + start of a non-capturing subpattern, the option letters may appear be- + tween the "?" and the ":". Thus the two patterns + + (?i:saturday|sunday) + (?:(?i)saturday|sunday) + + match exactly the same set of strings. Because alternative branches are + tried from left to right, and options are not reset until the end of + the subpattern is reached, an option setting in one branch does affect + subsequent branches, so the above patterns match "SUNDAY" as well as + "Saturday". + + +DUPLICATE SUBPATTERN NUMBERS + + Perl 5.10 introduced a feature whereby each alternative in a subpattern + uses the same numbers for its capturing parentheses. Such a subpattern + starts with (?| and is itself a non-capturing subpattern. For example, + consider this pattern: + + (?|(Sat)ur|(Sun))day + + Because the two alternatives are inside a (?| group, both sets of cap- + turing parentheses are numbered one. Thus, when the pattern matches, + you can look at captured substring number one, whichever alternative + matched. This construct is useful when you want to capture part, but + not all, of one of a number of alternatives. Inside a (?| group, paren- + theses are numbered as usual, but the number is reset at the start of + each branch. The numbers of any capturing parentheses that follow the + subpattern start after the highest number used in any branch. The fol- + lowing example is taken from the Perl documentation. The numbers under- + neath show in which buffer the captured content will be stored. + + # before ---------------branch-reset----------- after + / ( a ) (?| x ( y ) z | (p (q) r) | (t) u (v) ) ( z ) /x + # 1 2 2 3 2 3 4 + + A back reference to a numbered subpattern uses the most recent value + that is set for that number by any subpattern. The following pattern + matches "abcabc" or "defdef": + + /(?|(abc)|(def))\1/ + + In contrast, a subroutine call to a numbered subpattern always refers + to the first one in the pattern with the given number. The following + pattern matches "abcabc" or "defabc": + + /(?|(abc)|(def))(?1)/ + + If a condition test for a subpattern's having matched refers to a non- + unique number, the test is true if any of the subpatterns of that num- + ber have matched. + + An alternative approach to using this "branch reset" feature is to use + duplicate named subpatterns, as described in the next section. + + +NAMED SUBPATTERNS + + Identifying capturing parentheses by number is simple, but it can be + very hard to keep track of the numbers in complicated regular expres- + sions. Furthermore, if an expression is modified, the numbers may + change. To help with this difficulty, PCRE supports the naming of sub- + patterns. This feature was not added to Perl until release 5.10. Python + had the feature earlier, and PCRE introduced it at release 4.0, using + the Python syntax. PCRE now supports both the Perl and the Python syn- + tax. Perl allows identically numbered subpatterns to have different + names, but PCRE does not. + + In PCRE, a subpattern can be named in one of three ways: (?...) + or (?'name'...) as in Perl, or (?P...) as in Python. References + to capturing parentheses from other parts of the pattern, such as back + references, recursion, and conditions, can be made by name as well as + by number. + + Names consist of up to 32 alphanumeric characters and underscores, but + must start with a non-digit. Named capturing parentheses are still al- + located numbers as well as names, exactly as if the names were not + present. The PCRE API provides function calls for extracting the name- + to-number translation table from a compiled pattern. There is also a + convenience function for extracting a captured substring by name. + + By default, a name must be unique within a pattern, but it is possible + to relax this constraint by setting the PCRE_DUPNAMES option at compile + time. (Duplicate names are also always permitted for subpatterns with + the same number, set up as described in the previous section.) Dupli- + cate names can be useful for patterns where only one instance of the + named parentheses can match. Suppose you want to match the name of a + weekday, either as a 3-letter abbreviation or as the full name, and in + both cases you want to extract the abbreviation. This pattern (ignoring + the line breaks) does the job: + + (?Mon|Fri|Sun)(?:day)?| + (?Tue)(?:sday)?| + (?Wed)(?:nesday)?| + (?Thu)(?:rsday)?| + (?Sat)(?:urday)? + + There are five capturing substrings, but only one is ever set after a + match. (An alternative way of solving this problem is to use a "branch + reset" subpattern, as described in the previous section.) + + The convenience function for extracting the data by name returns the + substring for the first (and in this example, the only) subpattern of + that name that matched. This saves searching to find which numbered + subpattern it was. + + If you make a back reference to a non-unique named subpattern from + elsewhere in the pattern, the subpatterns to which the name refers are + checked in the order in which they appear in the overall pattern. The + first one that is set is used for the reference. For example, this pat- + tern matches both "foofoo" and "barbar" but not "foobar" or "barfoo": + + (?:(?foo)|(?bar))\k + + + If you make a subroutine call to a non-unique named subpattern, the one + that corresponds to the first occurrence of the name is used. In the + absence of duplicate numbers (see the previous section) this is the one + with the lowest number. + + If you use a named reference in a condition test (see the section about + conditions below), either to check whether a subpattern has matched, or + to check for recursion, all subpatterns with the same name are tested. + If the condition is true for any one of them, the overall condition is + true. This is the same behaviour as testing by number. For further de- + tails of the interfaces for handling named subpatterns, see the pcreapi + documentation. + + Warning: You cannot use different names to distinguish between two sub- + patterns with the same number because PCRE uses only the numbers when + matching. For this reason, an error is given at compile time if differ- + ent names are given to subpatterns with the same number. However, you + can always give the same name to subpatterns with the same number, even + when PCRE_DUPNAMES is not set. + + +REPETITION + + Repetition is specified by quantifiers, which can follow any of the + following items: + + a literal data character + the dot metacharacter + the \C escape sequence + the \X escape sequence + the \R escape sequence + an escape such as \d or \pL that matches a single character + a character class + a back reference (see next section) + a parenthesized subpattern (including assertions) + a subroutine call to a subpattern (recursive or otherwise) + + The general repetition quantifier specifies a minimum and maximum num- + ber of permitted matches, by giving the two numbers in curly brackets + (braces), separated by a comma. The numbers must be less than 65536, + and the first must be less than or equal to the second. For example: + + z{2,4} + + matches "zz", "zzz", or "zzzz". A closing brace on its own is not a + special character. If the second number is omitted, but the comma is + present, there is no upper limit; if the second number and the comma + are both omitted, the quantifier specifies an exact number of required + matches. Thus + + [aeiou]{3,} + + matches at least 3 successive vowels, but may match many more, while + + \d{8} + + matches exactly 8 digits. An opening curly bracket that appears in a + position where a quantifier is not allowed, or one that does not match + the syntax of a quantifier, is taken as a literal character. For exam- + ple, {,6} is not a quantifier, but a literal string of four characters. + + In UTF modes, quantifiers apply to characters rather than to individual + data units. Thus, for example, \x{100}{2} matches two characters, each + of which is represented by a two-byte sequence in a UTF-8 string. Simi- + larly, \X{3} matches three Unicode extended grapheme clusters, each of + which may be several data units long (and they may be of different + lengths). + + The quantifier {0} is permitted, causing the expression to behave as if + the previous item and the quantifier were not present. This may be use- + ful for subpatterns that are referenced as subroutines from elsewhere + in the pattern (but see also the section entitled "Defining subpatterns + for use by reference only" below). Items other than subpatterns that + have a {0} quantifier are omitted from the compiled pattern. + + For convenience, the three most common quantifiers have single-charac- + ter abbreviations: + + * is equivalent to {0,} + + is equivalent to {1,} + ? is equivalent to {0,1} + + It is possible to construct infinite loops by following a subpattern + that can match no characters with a quantifier that has no upper limit, + for example: + + (a?)* + + Earlier versions of Perl and PCRE used to give an error at compile time + for such patterns. However, because there are cases where this can be + useful, such patterns are now accepted, but if any repetition of the + subpattern does in fact match no characters, the loop is forcibly bro- + ken. + + By default, the quantifiers are "greedy", that is, they match as much + as possible (up to the maximum number of permitted times), without + causing the rest of the pattern to fail. The classic example of where + this gives problems is in trying to match comments in C programs. These + appear between /* and */ and within the comment, individual * and / + characters may appear. An attempt to match C comments by applying the + pattern + + /\*.*\*/ + + to the string + + /* first comment */ not comment /* second comment */ + + fails, because it matches the entire string owing to the greediness of + the .* item. + + However, if a quantifier is followed by a question mark, it ceases to + be greedy, and instead matches the minimum number of times possible, so + the pattern + + /\*.*?\*/ + + does the right thing with the C comments. The meaning of the various + quantifiers is not otherwise changed, just the preferred number of + matches. Do not confuse this use of question mark with its use as a + quantifier in its own right. Because it has two uses, it can sometimes + appear doubled, as in + + \d??\d + + which matches one digit by preference, but can match two if that is the + only way the rest of the pattern matches. + + If the PCRE_UNGREEDY option is set (an option that is not available in + Perl), the quantifiers are not greedy by default, but individual ones + can be made greedy by following them with a question mark. In other + words, it inverts the default behaviour. + + When a parenthesized subpattern is quantified with a minimum repeat + count that is greater than 1 or with a limited maximum, more memory is + required for the compiled pattern, in proportion to the size of the + minimum or maximum. + + If a pattern starts with .* or .{0,} and the PCRE_DOTALL option (equiv- + alent to Perl's /s) is set, thus allowing the dot to match newlines, + the pattern is implicitly anchored, because whatever follows will be + tried against every character position in the subject string, so there + is no point in retrying the overall match at any position after the + first. PCRE normally treats such a pattern as though it were preceded + by \A. + + In cases where it is known that the subject string contains no new- + lines, it is worth setting PCRE_DOTALL in order to obtain this opti- + mization, or alternatively using ^ to indicate anchoring explicitly. + + However, there are some cases where the optimization cannot be used. + When .* is inside capturing parentheses that are the subject of a back + reference elsewhere in the pattern, a match at the start may fail where + a later one succeeds. Consider, for example: + + (.*)abc\1 + + If the subject is "xyz123abc123" the match point is the fourth charac- + ter. For this reason, such a pattern is not implicitly anchored. + + Another case where implicit anchoring is not applied is when the lead- + ing .* is inside an atomic group. Once again, a match at the start may + fail where a later one succeeds. Consider this pattern: + + (?>.*?a)b + + It matches "ab" in the subject "aab". The use of the backtracking con- + trol verbs (*PRUNE) and (*SKIP) also disable this optimization. + + When a capturing subpattern is repeated, the value captured is the sub- + string that matched the final iteration. For example, after + + (tweedle[dume]{3}\s*)+ + + has matched "tweedledum tweedledee" the value of the captured substring + is "tweedledee". However, if there are nested capturing subpatterns, + the corresponding captured values may have been set in previous itera- + tions. For example, after + + /(a|(b))+/ + + matches "aba" the value of the second captured substring is "b". + + +ATOMIC GROUPING AND POSSESSIVE QUANTIFIERS + + With both maximizing ("greedy") and minimizing ("ungreedy" or "lazy") + repetition, failure of what follows normally causes the repeated item + to be re-evaluated to see if a different number of repeats allows the + rest of the pattern to match. Sometimes it is useful to prevent this, + either to change the nature of the match, or to cause it fail earlier + than it otherwise might, when the author of the pattern knows there is + no point in carrying on. + + Consider, for example, the pattern \d+foo when applied to the subject + line + + 123456bar + + After matching all 6 digits and then failing to match "foo", the normal + action of the matcher is to try again with only 5 digits matching the + \d+ item, and then with 4, and so on, before ultimately failing. + "Atomic grouping" (a term taken from Jeffrey Friedl's book) provides + the means for specifying that once a subpattern has matched, it is not + to be re-evaluated in this way. + + If we use atomic grouping for the previous example, the matcher gives + up immediately on failing to match "foo" the first time. The notation + is a kind of special parenthesis, starting with (?> as in this example: + + (?>\d+)foo + + This kind of parenthesis "locks up" the part of the pattern it con- + tains once it has matched, and a failure further into the pattern is + prevented from backtracking into it. Backtracking past it to previous + items, however, works as normal. + + An alternative description is that a subpattern of this type matches + the string of characters that an identical standalone pattern would + match, if anchored at the current point in the subject string. + + Atomic grouping subpatterns are not capturing subpatterns. Simple cases + such as the above example can be thought of as a maximizing repeat that + must swallow everything it can. So, while both \d+ and \d+? are pre- + pared to adjust the number of digits they match in order to make the + rest of the pattern match, (?>\d+) can only match an entire sequence of + digits. + + Atomic groups in general can of course contain arbitrarily complicated + subpatterns, and can be nested. However, when the subpattern for an + atomic group is just a single repeated item, as in the example above, a + simpler notation, called a "possessive quantifier" can be used. This + consists of an additional + character following a quantifier. Using + this notation, the previous example can be rewritten as + + \d++foo + + Note that a possessive quantifier can be used with an entire group, for + example: + + (abc|xyz){2,3}+ + + Possessive quantifiers are always greedy; the setting of the PCRE_UN- + GREEDY option is ignored. They are a convenient notation for the sim- + pler forms of atomic group. However, there is no difference in the + meaning of a possessive quantifier and the equivalent atomic group, + though there may be a performance difference; possessive quantifiers + should be slightly faster. + + The possessive quantifier syntax is an extension to the Perl 5.8 syn- + tax. Jeffrey Friedl originated the idea (and the name) in the first + edition of his book. Mike McCloskey liked it, so implemented it when he + built Sun's Java package, and PCRE copied it from there. It ultimately + found its way into Perl at release 5.10. + + PCRE has an optimization that automatically "possessifies" certain sim- + ple pattern constructs. For example, the sequence A+B is treated as + A++B because there is no point in backtracking into a sequence of A's + when B must follow. + + When a pattern contains an unlimited repeat inside a subpattern that + can itself be repeated an unlimited number of times, the use of an + atomic group is the only way to avoid some failing matches taking a + very long time indeed. The pattern + + (\D+|<\d+>)*[!?] + + matches an unlimited number of substrings that either consist of non- + digits, or digits enclosed in <>, followed by either ! or ?. When it + matches, it runs quickly. However, if it is applied to + + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + + it takes a long time before reporting failure. This is because the + string can be divided between the internal \D+ repeat and the external + * repeat in a large number of ways, and all have to be tried. (The ex- + ample uses [!?] rather than a single character at the end, because both + PCRE and Perl have an optimization that allows for fast failure when a + single character is used. They remember the last single character that + is required for a match, and fail early if it is not present in the + string.) If the pattern is changed so that it uses an atomic group, + like this: + + ((?>\D+)|<\d+>)*[!?] + + sequences of non-digits cannot be broken, and failure happens quickly. + + +BACK REFERENCES + + Outside a character class, a backslash followed by a digit greater than + 0 (and possibly further digits) is a back reference to a capturing sub- + pattern earlier (that is, to its left) in the pattern, provided there + have been that many previous capturing left parentheses. + + However, if the decimal number following the backslash is less than 10, + it is always taken as a back reference, and causes an error only if + there are not that many capturing left parentheses in the entire pat- + tern. In other words, the parentheses that are referenced need not be + to the left of the reference for numbers less than 10. A "forward back + reference" of this type can make sense when a repetition is involved + and the subpattern to the right has participated in an earlier itera- + tion. + + It is not possible to have a numerical "forward back reference" to a + subpattern whose number is 10 or more using this syntax because a se- + quence such as \50 is interpreted as a character defined in octal. See + the subsection entitled "Non-printing characters" above for further de- + tails of the handling of digits following a backslash. There is no such + problem when named parentheses are used. A back reference to any sub- + pattern is possible using named parentheses (see below). + + Another way of avoiding the ambiguity inherent in the use of digits + following a backslash is to use the \g escape sequence. This escape + must be followed by an unsigned number or a negative number, optionally + enclosed in braces. These examples are all identical: + + (ring), \1 + (ring), \g1 + (ring), \g{1} + + An unsigned number specifies an absolute reference without the ambigu- + ity that is present in the older syntax. It is also useful when literal + digits follow the reference. A negative number is a relative reference. + Consider this example: + + (abc(def)ghi)\g{-1} + + The sequence \g{-1} is a reference to the most recently started captur- + ing subpattern before \g, that is, is it equivalent to \2 in this exam- + ple. Similarly, \g{-2} would be equivalent to \1. The use of relative + references can be helpful in long patterns, and also in patterns that + are created by joining together fragments that contain references + within themselves. + + A back reference matches whatever actually matched the capturing sub- + pattern in the current subject string, rather than anything matching + the subpattern itself (see "Subpatterns as subroutines" below for a way + of doing that). So the pattern + + (sens|respons)e and \1ibility + + matches "sense and sensibility" and "response and responsibility", but + not "sense and responsibility". If caseful matching is in force at the + time of the back reference, the case of letters is relevant. For exam- + ple, + + ((?i)rah)\s+\1 + + matches "rah rah" and "RAH RAH", but not "RAH rah", even though the + original capturing subpattern is matched caselessly. + + There are several different ways of writing back references to named + subpatterns. The .NET syntax \k{name} and the Perl syntax \k or + \k'name' are supported, as is the Python syntax (?P=name). Perl 5.10's + unified back reference syntax, in which \g can be used for both numeric + and named references, is also supported. We could rewrite the above ex- + ample in any of the following ways: + + (?(?i)rah)\s+\k + (?'p1'(?i)rah)\s+\k{p1} + (?P(?i)rah)\s+(?P=p1) + (?(?i)rah)\s+\g{p1} + + A subpattern that is referenced by name may appear in the pattern be- + fore or after the reference. + + There may be more than one back reference to the same subpattern. If a + subpattern has not actually been used in a particular match, any back + references to it always fail by default. For example, the pattern + + (a|(bc))\2 + + always fails if it starts to match "a" rather than "bc". However, if + the PCRE_JAVASCRIPT_COMPAT option is set at compile time, a back refer- + ence to an unset value matches an empty string. + + Because there may be many capturing parentheses in a pattern, all dig- + its following a backslash are taken as part of a potential back refer- + ence number. If the pattern continues with a digit character, some de- + limiter must be used to terminate the back reference. If the PCRE_EX- + TENDED option is set, this can be white space. Otherwise, the \g{ syn- + tax or an empty comment (see "Comments" below) can be used. + + Recursive back references + + A back reference that occurs inside the parentheses to which it refers + fails when the subpattern is first used, so, for example, (a\1) never + matches. However, such references can be useful inside repeated sub- + patterns. For example, the pattern + + (a|b\1)+ + + matches any number of "a"s and also "aba", "ababbaa" etc. At each iter- + ation of the subpattern, the back reference matches the character + string corresponding to the previous iteration. In order for this to + work, the pattern must be such that the first iteration does not need + to match the back reference. This can be done using alternation, as in + the example above, or by a quantifier with a minimum of zero. + + Back references of this type cause the group that they reference to be + treated as an atomic group. Once the whole group has been matched, a + subsequent matching failure cannot cause backtracking into the middle + of the group. + + +ASSERTIONS + + An assertion is a test on the characters following or preceding the + current matching point that does not actually consume any characters. + The simple assertions coded as \b, \B, \A, \G, \Z, \z, ^ and $ are de- + scribed above. + + More complicated assertions are coded as subpatterns. There are two + kinds: those that look ahead of the current position in the subject + string, and those that look behind it. An assertion subpattern is + matched in the normal way, except that it does not cause the current + matching position to be changed. + + Assertion subpatterns are not capturing subpatterns. If such an asser- + tion contains capturing subpatterns within it, these are counted for + the purposes of numbering the capturing subpatterns in the whole pat- + tern. However, substring capturing is carried out only for positive as- + sertions. (Perl sometimes, but not always, does do capturing in nega- + tive assertions.) + + WARNING: If a positive assertion containing one or more capturing sub- + patterns succeeds, but failure to match later in the pattern causes + backtracking over this assertion, the captures within the assertion are + reset only if no higher numbered captures are already set. This is, un- + fortunately, a fundamental limitation of the current implementation, + and as PCRE1 is now in maintenance-only status, it is unlikely ever to + change. + + For compatibility with Perl, assertion subpatterns may be repeated; + though it makes no sense to assert the same thing several times, the + side effect of capturing parentheses may occasionally be useful. In + practice, there only three cases: + + (1) If the quantifier is {0}, the assertion is never obeyed during + matching. However, it may contain internal capturing parenthesized + groups that are called from elsewhere via the subroutine mechanism. + + (2) If quantifier is {0,n} where n is greater than zero, it is treated + as if it were {0,1}. At run time, the rest of the pattern match is + tried with and without the assertion, the order depending on the greed- + iness of the quantifier. + + (3) If the minimum repetition is greater than zero, the quantifier is + ignored. The assertion is obeyed just once when encountered during + matching. + + Lookahead assertions + + Lookahead assertions start with (?= for positive assertions and (?! for + negative assertions. For example, + + \w+(?=;) + + matches a word followed by a semicolon, but does not include the semi- + colon in the match, and + + foo(?!bar) + + matches any occurrence of "foo" that is not followed by "bar". Note + that the apparently similar pattern + + (?!foo)bar + + does not find an occurrence of "bar" that is preceded by something + other than "foo"; it finds any occurrence of "bar" whatsoever, because + the assertion (?!foo) is always true when the next three characters are + "bar". A lookbehind assertion is needed to achieve the other effect. + + If you want to force a matching failure at some point in a pattern, the + most convenient way to do it is with (?!) because an empty string al- + ways matches, so an assertion that requires there not to be an empty + string must always fail. The backtracking control verb (*FAIL) or (*F) + is a synonym for (?!). + + Lookbehind assertions + + Lookbehind assertions start with (?<= for positive assertions and (?)...) or (?('name')...) to test for a + used subpattern by name. For compatibility with earlier versions of + PCRE, which had this facility before Perl, the syntax (?(name)...) is + also recognized. + + Rewriting the above example to use a named subpattern gives this: + + (? \( )? [^()]+ (?() \) ) + + If the name used in a condition of this kind is a duplicate, the test + is applied to all subpatterns of the same name, and is true if any one + of them has matched. + + Checking for pattern recursion + + If the condition is the string (R), and there is no subpattern with the + name R, the condition is true if a recursive call to the whole pattern + or any subpattern has been made. If digits or a name preceded by amper- + sand follow the letter R, for example: + + (?(R3)...) or (?(R&name)...) + + the condition is true if the most recent recursion is into a subpattern + whose number or name is given. This condition does not check the entire + recursion stack. If the name used in a condition of this kind is a du- + plicate, the test is applied to all subpatterns of the same name, and + is true if any one of them is the most recent recursion. + + At "top level", all these recursion test conditions are false. The + syntax for recursive patterns is described below. + + Defining subpatterns for use by reference only + + If the condition is the string (DEFINE), and there is no subpattern + with the name DEFINE, the condition is always false. In this case, + there may be only one alternative in the subpattern. It is always + skipped if control reaches this point in the pattern; the idea of DE- + FINE is that it can be used to define subroutines that can be refer- + enced from elsewhere. (The use of subroutines is described below.) For + example, a pattern to match an IPv4 address such as "192.168.23.245" + could be written like this (ignore white space and line breaks): + + (?(DEFINE) (? 2[0-4]\d | 25[0-5] | 1\d\d | [1-9]?\d) ) + \b (?&byte) (\.(?&byte)){3} \b + + The first part of the pattern is a DEFINE group inside which a another + group named "byte" is defined. This matches an individual component of + an IPv4 address (a number less than 256). When matching takes place, + this part of the pattern is skipped because DEFINE acts like a false + condition. The rest of the pattern uses references to the named group + to match the four dot-separated components of an IPv4 address, insist- + ing on a word boundary at each end. + + Assertion conditions + + If the condition is not in any of the above formats, it must be an as- + sertion. This may be a positive or negative lookahead or lookbehind + assertion. Consider this pattern, again containing non-significant + white space, and with the two alternatives on the second line: + + (?(?=[^a-z]*[a-z]) + \d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} ) + + The condition is a positive lookahead assertion that matches an op- + tional sequence of non-letters followed by a letter. In other words, it + tests for the presence of at least one letter in the subject. If a let- + ter is found, the subject is matched against the first alternative; + otherwise it is matched against the second. This pattern matches + strings in one of the two forms dd-aaa-dd or dd-dd-dd, where aaa are + letters and dd are digits. + + +COMMENTS + + There are two ways of including comments in patterns that are processed + by PCRE. In both cases, the start of the comment must not be in a char- + acter class, nor in the middle of any other sequence of related charac- + ters such as (?: or a subpattern name or number. The characters that + make up a comment play no part in the pattern matching. + + The sequence (?# marks the start of a comment that continues up to the + next closing parenthesis. Nested parentheses are not permitted. If the + PCRE_EXTENDED option is set, an unescaped # character also introduces a + comment, which in this case continues to immediately after the next + newline character or character sequence in the pattern. Which charac- + ters are interpreted as newlines is controlled by the options passed to + a compiling function or by a special sequence at the start of the pat- + tern, as described in the section entitled "Newline conventions" above. + Note that the end of this type of comment is a literal newline sequence + in the pattern; escape sequences that happen to represent a newline do + not count. For example, consider this pattern when PCRE_EXTENDED is + set, and the default newline convention is in force: + + abc #comment \n still comment + + On encountering the # character, pcre_compile() skips along, looking + for a newline in the pattern. The sequence \n is still literal at this + stage, so it does not terminate the comment. Only an actual character + with the code value 0x0a (the default newline) does so. + + +RECURSIVE PATTERNS + + Consider the problem of matching a string in parentheses, allowing for + unlimited nested parentheses. Without the use of recursion, the best + that can be done is to use a pattern that matches up to some fixed + depth of nesting. It is not possible to handle an arbitrary nesting + depth. + + For some time, Perl has provided a facility that allows regular expres- + sions to recurse (amongst other things). It does this by interpolating + Perl code in the expression at run time, and the code can refer to the + expression itself. A Perl pattern using code interpolation to solve the + parentheses problem can be created like this: + + $re = qr{\( (?: (?>[^()]+) | (?p{$re}) )* \)}x; + + The (?p{...}) item interpolates Perl code at run time, and in this case + refers recursively to the pattern in which it appears. + + Obviously, PCRE cannot support the interpolation of Perl code. Instead, + it supports special syntax for recursion of the entire pattern, and + also for individual subpattern recursion. After its introduction in + PCRE and Python, this kind of recursion was subsequently introduced + into Perl at release 5.10. + + A special item that consists of (? followed by a number greater than + zero and a closing parenthesis is a recursive subroutine call of the + subpattern of the given number, provided that it occurs inside that + subpattern. (If not, it is a non-recursive subroutine call, which is + described in the next section.) The special item (?R) or (?0) is a re- + cursive call of the entire regular expression. + + This PCRE pattern solves the nested parentheses problem (assume the + PCRE_EXTENDED option is set so that white space is ignored): + + \( ( [^()]++ | (?R) )* \) + + First it matches an opening parenthesis. Then it matches any number of + substrings which can either be a sequence of non-parentheses, or a re- + cursive match of the pattern itself (that is, a correctly parenthesized + substring). Finally there is a closing parenthesis. Note the use of a + possessive quantifier to avoid backtracking into sequences of non- + parentheses. + + If this were part of a larger pattern, you would not want to recurse + the entire pattern, so instead you could use this: + + ( \( ( [^()]++ | (?1) )* \) ) + + We have put the pattern into parentheses, and caused the recursion to + refer to them instead of the whole pattern. + + In a larger pattern, keeping track of parenthesis numbers can be + tricky. This is made easier by the use of relative references. Instead + of (?1) in the pattern above you can write (?-2) to refer to the second + most recently opened parentheses preceding the recursion. In other + words, a negative number counts capturing parentheses leftwards from + the point at which it is encountered. + + It is also possible to refer to subsequently opened parentheses, by + writing references such as (?+2). However, these cannot be recursive + because the reference is not inside the parentheses that are refer- + enced. They are always non-recursive subroutine calls, as described in + the next section. + + An alternative approach is to use named parentheses instead. The Perl + syntax for this is (?&name); PCRE's earlier syntax (?P>name) is also + supported. We could rewrite the above example as follows: + + (? \( ( [^()]++ | (?&pn) )* \) ) + + If there is more than one subpattern with the same name, the earliest + one is used. + + This particular example pattern that we have been looking at contains + nested unlimited repeats, and so the use of a possessive quantifier for + matching strings of non-parentheses is important when applying the pat- + tern to strings that do not match. For example, when this pattern is + applied to + + (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa() + + it yields "no match" quickly. However, if a possessive quantifier is + not used, the match runs for a very long time indeed because there are + so many different ways the + and * repeats can carve up the subject, + and all have to be tested before failure can be reported. + + At the end of a match, the values of capturing parentheses are those + from the outermost level. If you want to obtain intermediate values, a + callout function can be used (see below and the pcrecallout documenta- + tion). If the pattern above is matched against + + (ab(cd)ef) + + the value for the inner capturing parentheses (numbered 2) is "ef", + which is the last value taken on at the top level. If a capturing sub- + pattern is not matched at the top level, its final captured value is + unset, even if it was (temporarily) set at a deeper level during the + matching process. + + If there are more than 15 capturing parentheses in a pattern, PCRE has + to obtain extra memory to store data during a recursion, which it does + by using pcre_malloc, freeing it via pcre_free afterwards. If no memory + can be obtained, the match fails with the PCRE_ERROR_NOMEMORY error. + + Do not confuse the (?R) item with the condition (R), which tests for + recursion. Consider this pattern, which matches text in angle brack- + ets, allowing for arbitrary nesting. Only digits are allowed in nested + brackets (that is, when recursing), whereas any characters are permit- + ted at the outer level. + + < (?: (?(R) \d++ | [^<>]*+) | (?R)) * > + + In this pattern, (?(R) is the start of a conditional subpattern, with + two different alternatives for the recursive and non-recursive cases. + The (?R) item is the actual recursive call. + + Differences in recursion processing between PCRE and Perl + + Recursion processing in PCRE differs from Perl in two important ways. + In PCRE (like Python, but unlike Perl), a recursive subpattern call is + always treated as an atomic group. That is, once it has matched some of + the subject string, it is never re-entered, even if it contains untried + alternatives and there is a subsequent matching failure. This can be + illustrated by the following pattern, which purports to match a palin- + dromic string that contains an odd number of characters (for example, + "a", "aba", "abcba", "abcdcba"): + + ^(.|(.)(?1)\2)$ + + The idea is that it either matches a single character, or two identical + characters surrounding a sub-palindrome. In Perl, this pattern works; + in PCRE it does not if the pattern is longer than three characters. + Consider the subject string "abcba": + + At the top level, the first character is matched, but as it is not at + the end of the string, the first alternative fails; the second alterna- + tive is taken and the recursion kicks in. The recursive call to subpat- + tern 1 successfully matches the next character ("b"). (Note that the + beginning and end of line tests are not part of the recursion). + + Back at the top level, the next character ("c") is compared with what + subpattern 2 matched, which was "a". This fails. Because the recursion + is treated as an atomic group, there are now no backtracking points, + and so the entire match fails. (Perl is able, at this point, to re-en- + ter the recursion and try the second alternative.) However, if the pat- + tern is written with the alternatives in the other order, things are + different: + + ^((.)(?1)\2|.)$ + + This time, the recursing alternative is tried first, and continues to + recurse until it runs out of characters, at which point the recursion + fails. But this time we do have another alternative to try at the + higher level. That is the big difference: in the previous case the re- + maining alternative is at a deeper recursion level, which PCRE cannot + use. + + To change the pattern so that it matches all palindromic strings, not + just those with an odd number of characters, it is tempting to change + the pattern to this: + + ^((.)(?1)\2|.?)$ + + Again, this works in Perl, but not in PCRE, and for the same reason. + When a deeper recursion has matched a single character, it cannot be + entered again in order to match an empty string. The solution is to + separate the two cases, and write out the odd and even cases as alter- + natives at the higher level: + + ^(?:((.)(?1)\2|)|((.)(?3)\4|.)) + + If you want to match typical palindromic phrases, the pattern has to + ignore all non-word characters, which can be done like this: + + ^\W*+(?:((.)\W*+(?1)\W*+\2|)|((.)\W*+(?3)\W*+\4|\W*+.\W*+))\W*+$ + + If run with the PCRE_CASELESS option, this pattern matches phrases such + as "A man, a plan, a canal: Panama!" and it works well in both PCRE and + Perl. Note the use of the possessive quantifier *+ to avoid backtrack- + ing into sequences of non-word characters. Without this, PCRE takes a + great deal longer (ten times or more) to match typical phrases, and + Perl takes so long that you think it has gone into a loop. + + WARNING: The palindrome-matching patterns above work only if the sub- + ject string does not start with a palindrome that is shorter than the + entire string. For example, although "abcba" is correctly matched, if + the subject is "ababa", PCRE finds the palindrome "aba" at the start, + then fails at top level because the end of the string does not follow. + Once again, it cannot jump back into the recursion to try other alter- + natives, so the entire match fails. + + The second way in which PCRE and Perl differ in their recursion pro- + cessing is in the handling of captured values. In Perl, when a subpat- + tern is called recursively or as a subpattern (see the next section), + it has no access to any values that were captured outside the recur- + sion, whereas in PCRE these values can be referenced. Consider this + pattern: + + ^(.)(\1|a(?2)) + + In PCRE, this pattern matches "bab". The first capturing parentheses + match "b", then in the second group, when the back reference \1 fails + to match "b", the second alternative matches "a" and then recurses. In + the recursion, \1 does now match "b" and so the whole match succeeds. + In Perl, the pattern fails to match because inside the recursive call + \1 cannot access the externally set value. + + +SUBPATTERNS AS SUBROUTINES + + If the syntax for a recursive subpattern call (either by number or by + name) is used outside the parentheses to which it refers, it operates + like a subroutine in a programming language. The called subpattern may + be defined before or after the reference. A numbered reference can be + absolute or relative, as in these examples: + + (...(absolute)...)...(?2)... + (...(relative)...)...(?-1)... + (...(?+1)...(relative)... + + An earlier example pointed out that the pattern + + (sens|respons)e and \1ibility + + matches "sense and sensibility" and "response and responsibility", but + not "sense and responsibility". If instead the pattern + + (sens|respons)e and (?1)ibility + + is used, it does match "sense and responsibility" as well as the other + two strings. Another example is given in the discussion of DEFINE + above. + + All subroutine calls, whether recursive or not, are always treated as + atomic groups. That is, once a subroutine has matched some of the sub- + ject string, it is never re-entered, even if it contains untried alter- + natives and there is a subsequent matching failure. Any capturing + parentheses that are set during the subroutine call revert to their + previous values afterwards. + + Processing options such as case-independence are fixed when a subpat- + tern is defined, so if it is used as a subroutine, such options cannot + be changed for different calls. For example, consider this pattern: + + (abc)(?i:(?-1)) + + It matches "abcabc". It does not match "abcABC" because the change of + processing option does not affect the called subpattern. + + +ONIGURUMA SUBROUTINE SYNTAX + + For compatibility with Oniguruma, the non-Perl syntax \g followed by a + name or a number enclosed either in angle brackets or single quotes, is + an alternative syntax for referencing a subpattern as a subroutine, + possibly recursively. Here are two of the examples used above, rewrit- + ten using this syntax: + + (? \( ( (?>[^()]+) | \g )* \) ) + (sens|respons)e and \g'1'ibility + + PCRE supports an extension to Oniguruma: if a number is preceded by a + plus or a minus sign it is taken as a relative reference. For example: + + (abc)(?i:\g<-1>) + + Note that \g{...} (Perl syntax) and \g<...> (Oniguruma syntax) are not + synonymous. The former is a back reference; the latter is a subroutine + call. + + +CALLOUTS + + Perl has a feature whereby using the sequence (?{...}) causes arbitrary + Perl code to be obeyed in the middle of matching a regular expression. + This makes it possible, amongst other things, to extract different sub- + strings that match the same pair of parentheses when there is a repeti- + tion. + + PCRE provides a similar feature, but of course it cannot obey arbitrary + Perl code. The feature is called "callout". The caller of PCRE provides + an external function by putting its entry point in the global variable + pcre_callout (8-bit library) or pcre[16|32]_callout (16-bit or 32-bit + library). By default, this variable contains NULL, which disables all + calling out. + + Within a regular expression, (?C) indicates the points at which the ex- + ternal function is to be called. If you want to identify different + callout points, you can put a number less than 256 after the letter C. + The default value is zero. For example, this pattern has two callout + points: + + (?C1)abc(?C2)def + + If the PCRE_AUTO_CALLOUT flag is passed to a compiling function, call- + outs are automatically installed before each item in the pattern. They + are all numbered 255. If there is a conditional group in the pattern + whose condition is an assertion, an additional callout is inserted just + before the condition. An explicit callout may also be set at this posi- + tion, as in this example: + + (?(?C9)(?=a)abc|def) + + Note that this applies only to assertion conditions, not to other types + of condition. + + During matching, when PCRE reaches a callout point, the external func- + tion is called. It is provided with the number of the callout, the po- + sition in the pattern, and, optionally, one item of data originally + supplied by the caller of the matching function. The callout function + may cause matching to proceed, to backtrack, or to fail altogether. + + By default, PCRE implements a number of optimizations at compile time + and matching time, and one side-effect is that sometimes callouts are + skipped. If you need all possible callouts to happen, you need to set + options that disable the relevant optimizations. More details, and a + complete description of the interface to the callout function, are + given in the pcrecallout documentation. + + +BACKTRACKING CONTROL + + Perl 5.10 introduced a number of "Special Backtracking Control Verbs", + which are still described in the Perl documentation as "experimental + and subject to change or removal in a future version of Perl". It goes + on to say: "Their usage in production code should be noted to avoid + problems during upgrades." The same remarks apply to the PCRE features + described in this section. + + The new verbs make use of what was previously invalid syntax: an open- + ing parenthesis followed by an asterisk. They are generally of the form + (*VERB) or (*VERB:NAME). Some may take either form, possibly behaving + differently depending on whether or not a name is present. A name is + any sequence of characters that does not include a closing parenthesis. + The maximum length of name is 255 in the 8-bit library and 65535 in the + 16-bit and 32-bit libraries. If the name is empty, that is, if the + closing parenthesis immediately follows the colon, the effect is as if + the colon were not there. Any number of these verbs may occur in a + pattern. + + Since these verbs are specifically related to backtracking, most of + them can be used only when the pattern is to be matched using one of + the traditional matching functions, because these use a backtracking + algorithm. With the exception of (*FAIL), which behaves like a failing + negative assertion, the backtracking control verbs cause an error if + encountered by a DFA matching function. + + The behaviour of these verbs in repeated groups, assertions, and in + subpatterns called as subroutines (whether or not recursively) is docu- + mented below. + + Optimizations that affect backtracking verbs + + PCRE contains some optimizations that are used to speed up matching by + running some checks at the start of each match attempt. For example, it + may know the minimum length of matching subject, or that a particular + character must be present. When one of these optimizations bypasses the + running of a match, any included backtracking verbs will not, of + course, be processed. You can suppress the start-of-match optimizations + by setting the PCRE_NO_START_OPTIMIZE option when calling pcre_com- + pile() or pcre_exec(), or by starting the pattern with (*NO_START_OPT). + There is more discussion of this option in the section entitled "Option + bits for pcre_exec()" in the pcreapi documentation. + + Experiments with Perl suggest that it too has similar optimizations, + sometimes leading to anomalous results. + + Verbs that act immediately + + The following verbs act as soon as they are encountered. They may not + be followed by a name. + + (*ACCEPT) + + This verb causes the match to end successfully, skipping the remainder + of the pattern. However, when it is inside a subpattern that is called + as a subroutine, only that subpattern is ended successfully. Matching + then continues at the outer level. If (*ACCEPT) in triggered in a posi- + tive assertion, the assertion succeeds; in a negative assertion, the + assertion fails. + + If (*ACCEPT) is inside capturing parentheses, the data so far is cap- + tured. For example: + + A((?:A|B(*ACCEPT)|C)D) + + This matches "AB", "AAD", or "ACD"; when it matches "AB", "B" is cap- + tured by the outer parentheses. + + (*FAIL) or (*F) + + This verb causes a matching failure, forcing backtracking to occur. It + is equivalent to (?!) but easier to read. The Perl documentation notes + that it is probably useful only when combined with (?{}) or (??{}). + Those are, of course, Perl features that are not present in PCRE. The + nearest equivalent is the callout feature, as for example in this pat- + tern: + + a+(?C)(*FAIL) + + A match with the string "aaaa" always fails, but the callout is taken + before each backtrack happens (in this example, 10 times). + + Recording which path was taken + + There is one verb whose main purpose is to track how a match was ar- + rived at, though it also has a secondary use in conjunction with ad- + vancing the match starting point (see (*SKIP) below). + + (*MARK:NAME) or (*:NAME) + + A name is always required with this verb. There may be as many in- + stances of (*MARK) as you like in a pattern, and their names do not + have to be unique. + + When a match succeeds, the name of the last-encountered (*MARK:NAME), + (*PRUNE:NAME), or (*THEN:NAME) on the matching path is passed back to + the caller as described in the section entitled "Extra data for + pcre_exec()" in the pcreapi documentation. Here is an example of + pcretest output, where the /K modifier requests the retrieval and out- + putting of (*MARK) data: + + re> /X(*MARK:A)Y|X(*MARK:B)Z/K + data> XY + 0: XY + MK: A + XZ + 0: XZ + MK: B + + The (*MARK) name is tagged with "MK:" in this output, and in this exam- + ple it indicates which of the two alternatives matched. This is a more + efficient way of obtaining this information than putting each alterna- + tive in its own capturing parentheses. + + If a verb with a name is encountered in a positive assertion that is + true, the name is recorded and passed back if it is the last-encoun- + tered. This does not happen for negative assertions or failing positive + assertions. + + After a partial match or a failed match, the last encountered name in + the entire match process is returned. For example: + + re> /X(*MARK:A)Y|X(*MARK:B)Z/K + data> XP + No match, mark = B + + Note that in this unanchored example the mark is retained from the + match attempt that started at the letter "X" in the subject. Subsequent + match attempts starting at "P" and then with an empty string do not get + as far as the (*MARK) item, but nevertheless do not reset it. + + If you are interested in (*MARK) values after failed matches, you + should probably set the PCRE_NO_START_OPTIMIZE option (see above) to + ensure that the match is always attempted. + + Verbs that act after backtracking + + The following verbs do nothing when they are encountered. Matching con- + tinues with what follows, but if there is no subsequent match, causing + a backtrack to the verb, a failure is forced. That is, backtracking + cannot pass to the left of the verb. However, when one of these verbs + appears inside an atomic group or an assertion that is true, its effect + is confined to that group, because once the group has been matched, + there is never any backtracking into it. In this situation, backtrack- + ing can "jump back" to the left of the entire atomic group or asser- + tion. (Remember also, as stated above, that this localization also ap- + plies in subroutine calls.) + + These verbs differ in exactly what kind of failure occurs when back- + tracking reaches them. The behaviour described below is what happens + when the verb is not in a subroutine or an assertion. Subsequent sec- + tions cover these special cases. + + (*COMMIT) + + This verb, which may not be followed by a name, causes the whole match + to fail outright if there is a later matching failure that causes back- + tracking to reach it. Even if the pattern is unanchored, no further at- + tempts to find a match by advancing the starting point take place. If + (*COMMIT) is the only backtracking verb that is encountered, once it + has been passed pcre_exec() is committed to finding a match at the cur- + rent starting point, or not at all. For example: + + a+(*COMMIT)b + + This matches "xxaab" but not "aacaab". It can be thought of as a kind + of dynamic anchor, or "I've started, so I must finish." The name of the + most recently passed (*MARK) in the path is passed back when (*COMMIT) + forces a match failure. + + If there is more than one backtracking verb in a pattern, a different + one that follows (*COMMIT) may be triggered first, so merely passing + (*COMMIT) during a match does not always guarantee that a match must be + at this starting point. + + Note that (*COMMIT) at the start of a pattern is not the same as an an- + chor, unless PCRE's start-of-match optimizations are turned off, as + shown in this output from pcretest: + + re> /(*COMMIT)abc/ + data> xyzabc + 0: abc + data> xyzabc\Y + No match + + For this pattern, PCRE knows that any match must start with "a", so the + optimization skips along the subject to "a" before applying the pattern + to the first set of data. The match attempt then succeeds. In the sec- + ond set of data, the escape sequence \Y is interpreted by the pcretest + program. It causes the PCRE_NO_START_OPTIMIZE option to be set when + pcre_exec() is called. This disables the optimization that skips along + to the first character. The pattern is now applied starting at "x", and + so the (*COMMIT) causes the match to fail without trying any other + starting points. + + (*PRUNE) or (*PRUNE:NAME) + + This verb causes the match to fail at the current starting position in + the subject if there is a later matching failure that causes backtrack- + ing to reach it. If the pattern is unanchored, the normal "bumpalong" + advance to the next starting character then happens. Backtracking can + occur as usual to the left of (*PRUNE), before it is reached, or when + matching to the right of (*PRUNE), but if there is no match to the + right, backtracking cannot cross (*PRUNE). In simple cases, the use of + (*PRUNE) is just an alternative to an atomic group or possessive quan- + tifier, but there are some uses of (*PRUNE) that cannot be expressed in + any other way. In an anchored pattern (*PRUNE) has the same effect as + (*COMMIT). + + The behaviour of (*PRUNE:NAME) is the not the same as + (*MARK:NAME)(*PRUNE). It is like (*MARK:NAME) in that the name is re- + membered for passing back to the caller. However, (*SKIP:NAME) searches + only for names set with (*MARK). + + (*SKIP) + + This verb, when given without a name, is like (*PRUNE), except that if + the pattern is unanchored, the "bumpalong" advance is not to the next + character, but to the position in the subject where (*SKIP) was encoun- + tered. (*SKIP) signifies that whatever text was matched leading up to + it cannot be part of a successful match. Consider: + + a+(*SKIP)b + + If the subject is "aaaac...", after the first match attempt fails + (starting at the first character in the string), the starting point + skips on to start the next attempt at "c". Note that a possessive quan- + tifer does not have the same effect as this example; although it would + suppress backtracking during the first match attempt, the second at- + tempt would start at the second character instead of skipping on to + "c". + + (*SKIP:NAME) + + When (*SKIP) has an associated name, its behaviour is modified. When it + is triggered, the previous path through the pattern is searched for the + most recent (*MARK) that has the same name. If one is found, the + "bumpalong" advance is to the subject position that corresponds to that + (*MARK) instead of to where (*SKIP) was encountered. If no (*MARK) with + a matching name is found, the (*SKIP) is ignored. + + Note that (*SKIP:NAME) searches only for names set by (*MARK:NAME). It + ignores names that are set by (*PRUNE:NAME) or (*THEN:NAME). + + (*THEN) or (*THEN:NAME) + + This verb causes a skip to the next innermost alternative when back- + tracking reaches it. That is, it cancels any further backtracking + within the current alternative. Its name comes from the observation + that it can be used for a pattern-based if-then-else block: + + ( COND1 (*THEN) FOO | COND2 (*THEN) BAR | COND3 (*THEN) BAZ ) ... + + If the COND1 pattern matches, FOO is tried (and possibly further items + after the end of the group if FOO succeeds); on failure, the matcher + skips to the second alternative and tries COND2, without backtracking + into COND1. If that succeeds and BAR fails, COND3 is tried. If subse- + quently BAZ fails, there are no more alternatives, so there is a back- + track to whatever came before the entire group. If (*THEN) is not in- + side an alternation, it acts like (*PRUNE). + + The behaviour of (*THEN:NAME) is the not the same as + (*MARK:NAME)(*THEN). It is like (*MARK:NAME) in that the name is re- + membered for passing back to the caller. However, (*SKIP:NAME) searches + only for names set with (*MARK). + + A subpattern that does not contain a | character is just a part of the + enclosing alternative; it is not a nested alternation with only one al- + ternative. The effect of (*THEN) extends beyond such a subpattern to + the enclosing alternative. Consider this pattern, where A, B, etc. are + complex pattern fragments that do not contain any | characters at this + level: + + A (B(*THEN)C) | D + + If A and B are matched, but there is a failure in C, matching does not + backtrack into A; instead it moves to the next alternative, that is, D. + However, if the subpattern containing (*THEN) is given an alternative, + it behaves differently: + + A (B(*THEN)C | (*FAIL)) | D + + The effect of (*THEN) is now confined to the inner subpattern. After a + failure in C, matching moves to (*FAIL), which causes the whole subpat- + tern to fail because there are no more alternatives to try. In this + case, matching does now backtrack into A. + + Note that a conditional subpattern is not considered as having two al- + ternatives, because only one is ever used. In other words, the | char- + acter in a conditional subpattern has a different meaning. Ignoring + white space, consider: + + ^.*? (?(?=a) a | b(*THEN)c ) + + If the subject is "ba", this pattern does not match. Because .*? is un- + greedy, it initially matches zero characters. The condition (?=a) then + fails, the character "b" is matched, but "c" is not. At this point, + matching does not backtrack to .*? as might perhaps be expected from + the presence of the | character. The conditional subpattern is part of + the single alternative that comprises the whole pattern, and so the + match fails. (If there was a backtrack into .*?, allowing it to match + "b", the match would succeed.) + + The verbs just described provide four different "strengths" of control + when subsequent matching fails. (*THEN) is the weakest, carrying on the + match at the next alternative. (*PRUNE) comes next, failing the match + at the current starting position, but allowing an advance to the next + character (for an unanchored pattern). (*SKIP) is similar, except that + the advance may be more than one character. (*COMMIT) is the strongest, + causing the entire match to fail. + + More than one backtracking verb + + If more than one backtracking verb is present in a pattern, the one + that is backtracked onto first acts. For example, consider this pat- + tern, where A, B, etc. are complex pattern fragments: + + (A(*COMMIT)B(*THEN)C|ABD) + + If A matches but B fails, the backtrack to (*COMMIT) causes the entire + match to fail. However, if A and B match, but C fails, the backtrack to + (*THEN) causes the next alternative (ABD) to be tried. This behaviour + is consistent, but is not always the same as Perl's. It means that if + two or more backtracking verbs appear in succession, all the the last + of them has no effect. Consider this example: + + ...(*COMMIT)(*PRUNE)... + + If there is a matching failure to the right, backtracking onto (*PRUNE) + causes it to be triggered, and its action is taken. There can never be + a backtrack onto (*COMMIT). + + Backtracking verbs in repeated groups + + PCRE differs from Perl in its handling of backtracking verbs in re- + peated groups. For example, consider: + + /(a(*COMMIT)b)+ac/ + + If the subject is "abac", Perl matches, but PCRE fails because the + (*COMMIT) in the second repeat of the group acts. + + Backtracking verbs in assertions + + (*FAIL) in an assertion has its normal effect: it forces an immediate + backtrack. + + (*ACCEPT) in a positive assertion causes the assertion to succeed with- + out any further processing. In a negative assertion, (*ACCEPT) causes + the assertion to fail without any further processing. + + The other backtracking verbs are not treated specially if they appear + in a positive assertion. In particular, (*THEN) skips to the next al- + ternative in the innermost enclosing group that has alternations, + whether or not this is within the assertion. + + Negative assertions are, however, different, in order to ensure that + changing a positive assertion into a negative assertion changes its re- + sult. Backtracking into (*COMMIT), (*SKIP), or (*PRUNE) causes a nega- + tive assertion to be true, without considering any further alternative + branches in the assertion. Backtracking into (*THEN) causes it to skip + to the next enclosing alternative within the assertion (the normal be- + haviour), but if the assertion does not have such an alternative, + (*THEN) behaves like (*PRUNE). + + Backtracking verbs in subroutines + + These behaviours occur whether or not the subpattern is called recur- + sively. Perl's treatment of subroutines is different in some cases. + + (*FAIL) in a subpattern called as a subroutine has its normal effect: + it forces an immediate backtrack. + + (*ACCEPT) in a subpattern called as a subroutine causes the subroutine + match to succeed without any further processing. Matching then contin- + ues after the subroutine call. + + (*COMMIT), (*SKIP), and (*PRUNE) in a subpattern called as a subroutine + cause the subroutine match to fail. + + (*THEN) skips to the next alternative in the innermost enclosing group + within the subpattern that has alternatives. If there is no such group + within the subpattern, (*THEN) causes the subroutine match to fail. + + +SEE ALSO + + pcreapi(3), pcrecallout(3), pcrematching(3), pcresyntax(3), pcre(3), + pcre16(3), pcre32(3). + + +AUTHOR + + Philip Hazel + University Computing Service + Cambridge CB2 3QH, England. + + +REVISION + + Last updated: 23 October 2016 + Copyright (c) 1997-2016 University of Cambridge. +------------------------------------------------------------------------------ + + +PCRESYNTAX(3) Library Functions Manual PCRESYNTAX(3) + + + +NAME + PCRE - Perl-compatible regular expressions + +PCRE REGULAR EXPRESSION SYNTAX SUMMARY + + The full syntax and semantics of the regular expressions that are sup- + ported by PCRE are described in the pcrepattern documentation. This + document contains a quick-reference summary of the syntax. + + +QUOTING + + \x where x is non-alphanumeric is a literal x + \Q...\E treat enclosed characters as literal + + +CHARACTERS + + \a alarm, that is, the BEL character (hex 07) + \cx "control-x", where x is any ASCII character + \e escape (hex 1B) + \f form feed (hex 0C) + \n newline (hex 0A) + \r carriage return (hex 0D) + \t tab (hex 09) + \0dd character with octal code 0dd + \ddd character with octal code ddd, or backreference + \o{ddd..} character with octal code ddd.. + \xhh character with hex code hh + \x{hhh..} character with hex code hhh.. + + Note that \0dd is always an octal code, and that \8 and \9 are the lit- + eral characters "8" and "9". + + +CHARACTER TYPES + + . any character except newline; + in dotall mode, any character whatsoever + \C one data unit, even in UTF mode (best avoided) + \d a decimal digit + \D a character that is not a decimal digit + \h a horizontal white space character + \H a character that is not a horizontal white space character + \N a character that is not a newline + \p{xx} a character with the xx property + \P{xx} a character without the xx property + \R a newline sequence + \s a white space character + \S a character that is not a white space character + \v a vertical white space character + \V a character that is not a vertical white space character + \w a "word" character + \W a "non-word" character + \X a Unicode extended grapheme cluster + + By default, \d, \s, and \w match only ASCII characters, even in UTF-8 + mode or in the 16- bit and 32-bit libraries. However, if locale-spe- + cific matching is happening, \s and \w may also match characters with + code points in the range 128-255. If the PCRE_UCP option is set, the + behaviour of these escape sequences is changed to use Unicode proper- + ties and they match many more characters. + + +GENERAL CATEGORY PROPERTIES FOR \p and \P + + C Other + Cc Control + Cf Format + Cn Unassigned + Co Private use + Cs Surrogate + + L Letter + Ll Lower case letter + Lm Modifier letter + Lo Other letter + Lt Title case letter + Lu Upper case letter + L& Ll, Lu, or Lt + + M Mark + Mc Spacing mark + Me Enclosing mark + Mn Non-spacing mark + + N Number + Nd Decimal number + Nl Letter number + No Other number + + P Punctuation + Pc Connector punctuation + Pd Dash punctuation + Pe Close punctuation + Pf Final punctuation + Pi Initial punctuation + Po Other punctuation + Ps Open punctuation + + S Symbol + Sc Currency symbol + Sk Modifier symbol + Sm Mathematical symbol + So Other symbol + + Z Separator + Zl Line separator + Zp Paragraph separator + Zs Space separator + + +PCRE SPECIAL CATEGORY PROPERTIES FOR \p and \P + + Xan Alphanumeric: union of properties L and N + Xps POSIX space: property Z or tab, NL, VT, FF, CR + Xsp Perl space: property Z or tab, NL, VT, FF, CR + Xuc Univerally-named character: one that can be + represented by a Universal Character Name + Xwd Perl word: property Xan or underscore + + Perl and POSIX space are now the same. Perl added VT to its space char- + acter set at release 5.18 and PCRE changed at release 8.34. + + +SCRIPT NAMES FOR \p AND \P + + Arabic, Armenian, Avestan, Balinese, Bamum, Bassa_Vah, Batak, Bengali, + Bopomofo, Brahmi, Braille, Buginese, Buhid, Canadian_Aboriginal, Car- + ian, Caucasian_Albanian, Chakma, Cham, Cherokee, Common, Coptic, Cunei- + form, Cypriot, Cyrillic, Deseret, Devanagari, Duployan, Egyptian_Hiero- + glyphs, Elbasan, Ethiopic, Georgian, Glagolitic, Gothic, Grantha, + Greek, Gujarati, Gurmukhi, Han, Hangul, Hanunoo, Hebrew, Hiragana, Im- + perial_Aramaic, Inherited, Inscriptional_Pahlavi, Inscrip- + tional_Parthian, Javanese, Kaithi, Kannada, Katakana, Kayah_Li, + Kharoshthi, Khmer, Khojki, Khudawadi, Lao, Latin, Lepcha, Limbu, Lin- + ear_A, Linear_B, Lisu, Lycian, Lydian, Mahajani, Malayalam, Mandaic, + Manichaean, Meetei_Mayek, Mende_Kikakui, Meroitic_Cursive, Meroitic_Hi- + eroglyphs, Miao, Modi, Mongolian, Mro, Myanmar, Nabataean, New_Tai_Lue, + Nko, Ogham, Ol_Chiki, Old_Italic, Old_North_Arabian, Old_Permic, + Old_Persian, Old_South_Arabian, Old_Turkic, Oriya, Osmanya, Pa- + hawh_Hmong, Palmyrene, Pau_Cin_Hau, Phags_Pa, Phoenician, + Psalter_Pahlavi, Rejang, Runic, Samaritan, Saurashtra, Sharada, Sha- + vian, Siddham, Sinhala, Sora_Sompeng, Sundanese, Syloti_Nagri, Syriac, + Tagalog, Tagbanwa, Tai_Le, Tai_Tham, Tai_Viet, Takri, Tamil, Telugu, + Thaana, Thai, Tibetan, Tifinagh, Tirhuta, Ugaritic, Vai, Warang_Citi, + Yi. + + +CHARACTER CLASSES + + [...] positive character class + [^...] negative character class + [x-y] range (can be used for hex characters) + [[:xxx:]] positive POSIX named set + [[:^xxx:]] negative POSIX named set + + alnum alphanumeric + alpha alphabetic + ascii 0-127 + blank space or tab + cntrl control character + digit decimal digit + graph printing, excluding space + lower lower case letter + print printing, including space + punct printing, excluding alphanumeric + space white space + upper upper case letter + word same as \w + xdigit hexadecimal digit + + In PCRE, POSIX character set names recognize only ASCII characters by + default, but some of them use Unicode properties if PCRE_UCP is set. + You can use \Q...\E inside a character class. + + +QUANTIFIERS + + ? 0 or 1, greedy + ?+ 0 or 1, possessive + ?? 0 or 1, lazy + * 0 or more, greedy + *+ 0 or more, possessive + *? 0 or more, lazy + + 1 or more, greedy + ++ 1 or more, possessive + +? 1 or more, lazy + {n} exactly n + {n,m} at least n, no more than m, greedy + {n,m}+ at least n, no more than m, possessive + {n,m}? at least n, no more than m, lazy + {n,} n or more, greedy + {n,}+ n or more, possessive + {n,}? n or more, lazy + + +ANCHORS AND SIMPLE ASSERTIONS + + \b word boundary + \B not a word boundary + ^ start of subject + also after internal newline in multiline mode + \A start of subject + $ end of subject + also before newline at end of subject + also before internal newline in multiline mode + \Z end of subject + also before newline at end of subject + \z end of subject + \G first matching position in subject + + +MATCH POINT RESET + + \K reset start of match + + \K is honoured in positive assertions, but ignored in negative ones. + + +ALTERNATION + + expr|expr|expr... + + +CAPTURING + + (...) capturing group + (?...) named capturing group (Perl) + (?'name'...) named capturing group (Perl) + (?P...) named capturing group (Python) + (?:...) non-capturing group + (?|...) non-capturing group; reset group numbers for + capturing groups in each alternative + + +ATOMIC GROUPS + + (?>...) atomic, non-capturing group + + +COMMENT + + (?#....) comment (not nestable) + + +OPTION SETTING + + (?i) caseless + (?J) allow duplicate names + (?m) multiline + (?s) single line (dotall) + (?U) default ungreedy (lazy) + (?x) extended (ignore white space) + (?-...) unset option(s) + + The following are recognized only at the very start of a pattern or af- + ter one of the newline or \R options with similar syntax. More than one + of them may appear. + + (*LIMIT_MATCH=d) set the match limit to d (decimal number) + (*LIMIT_RECURSION=d) set the recursion limit to d (decimal number) + (*NO_AUTO_POSSESS) no auto-possessification (PCRE_NO_AUTO_POSSESS) + (*NO_START_OPT) no start-match optimization (PCRE_NO_START_OPTIMIZE) + (*UTF8) set UTF-8 mode: 8-bit library (PCRE_UTF8) + (*UTF16) set UTF-16 mode: 16-bit library (PCRE_UTF16) + (*UTF32) set UTF-32 mode: 32-bit library (PCRE_UTF32) + (*UTF) set appropriate UTF mode for the library in use + (*UCP) set PCRE_UCP (use Unicode properties for \d etc) + + Note that LIMIT_MATCH and LIMIT_RECURSION can only reduce the value of + the limits set by the caller of pcre_exec(), not increase them. + + +NEWLINE CONVENTION + + These are recognized only at the very start of the pattern or after op- + tion settings with a similar syntax. + + (*CR) carriage return only + (*LF) linefeed only + (*CRLF) carriage return followed by linefeed + (*ANYCRLF) all three of the above + (*ANY) any Unicode newline sequence + + +WHAT \R MATCHES + + These are recognized only at the very start of the pattern or after op- + tion setting with a similar syntax. + + (*BSR_ANYCRLF) CR, LF, or CRLF + (*BSR_UNICODE) any Unicode newline sequence + + +LOOKAHEAD AND LOOKBEHIND ASSERTIONS + + (?=...) positive look ahead + (?!...) negative look ahead + (?<=...) positive look behind + (? reference by name (Perl) + \k'name' reference by name (Perl) + \g{name} reference by name (Perl) + \k{name} reference by name (.NET) + (?P=name) reference by name (Python) + + +SUBROUTINE REFERENCES (POSSIBLY RECURSIVE) + + (?R) recurse whole pattern + (?n) call subpattern by absolute number + (?+n) call subpattern by relative number + (?-n) call subpattern by relative number + (?&name) call subpattern by name (Perl) + (?P>name) call subpattern by name (Python) + \g call subpattern by name (Oniguruma) + \g'name' call subpattern by name (Oniguruma) + \g call subpattern by absolute number (Oniguruma) + \g'n' call subpattern by absolute number (Oniguruma) + \g<+n> call subpattern by relative number (PCRE extension) + \g'+n' call subpattern by relative number (PCRE extension) + \g<-n> call subpattern by relative number (PCRE extension) + \g'-n' call subpattern by relative number (PCRE extension) + + +CONDITIONAL PATTERNS + + (?(condition)yes-pattern) + (?(condition)yes-pattern|no-pattern) + + (?(n)... absolute reference condition + (?(+n)... relative reference condition + (?(-n)... relative reference condition + (?()... named reference condition (Perl) + (?('name')... named reference condition (Perl) + (?(name)... named reference condition (PCRE) + (?(R)... overall recursion condition + (?(Rn)... specific group recursion condition + (?(R&name)... specific recursion condition + (?(DEFINE)... define subpattern for reference + (?(assert)... assertion condition + + +BACKTRACKING CONTROL + + The following act immediately they are reached: + + (*ACCEPT) force successful match + (*FAIL) force backtrack; synonym (*F) + (*MARK:NAME) set name to be passed back; synonym (*:NAME) + + The following act only when a subsequent match failure causes a back- + track to reach them. They all force a match failure, but they differ in + what happens afterwards. Those that advance the start-of-match point do + so only if the pattern is not anchored. + + (*COMMIT) overall failure, no advance of starting point + (*PRUNE) advance to next starting character + (*PRUNE:NAME) equivalent to (*MARK:NAME)(*PRUNE) + (*SKIP) advance to current matching position + (*SKIP:NAME) advance to position corresponding to an earlier + (*MARK:NAME); if not found, the (*SKIP) is ignored + (*THEN) local failure, backtrack to next alternation + (*THEN:NAME) equivalent to (*MARK:NAME)(*THEN) + + +CALLOUTS + + (?C) callout + (?Cn) callout with data n + + +SEE ALSO + + pcrepattern(3), pcreapi(3), pcrecallout(3), pcrematching(3), pcre(3). + + +AUTHOR + + Philip Hazel + University Computing Service + Cambridge CB2 3QH, England. + + +REVISION + + Last updated: 08 January 2014 + Copyright (c) 1997-2014 University of Cambridge. +------------------------------------------------------------------------------ + + +PCREUNICODE(3) Library Functions Manual PCREUNICODE(3) + + + +NAME + PCRE - Perl-compatible regular expressions + +UTF-8, UTF-16, UTF-32, AND UNICODE PROPERTY SUPPORT + + As well as UTF-8 support, PCRE also supports UTF-16 (from release 8.30) + and UTF-32 (from release 8.32), by means of two additional libraries. + They can be built as well as, or instead of, the 8-bit library. + + +UTF-8 SUPPORT + + In order process UTF-8 strings, you must build PCRE's 8-bit library + with UTF support, and, in addition, you must call pcre_compile() with + the PCRE_UTF8 option flag, or the pattern must start with the sequence + (*UTF8) or (*UTF). When either of these is the case, both the pattern + and any subject strings that are matched against it are treated as + UTF-8 strings instead of strings of individual 1-byte characters. + + +UTF-16 AND UTF-32 SUPPORT + + In order process UTF-16 or UTF-32 strings, you must build PCRE's 16-bit + or 32-bit library with UTF support, and, in addition, you must call + pcre16_compile() or pcre32_compile() with the PCRE_UTF16 or PCRE_UTF32 + option flag, as appropriate. Alternatively, the pattern must start with + the sequence (*UTF16), (*UTF32), as appropriate, or (*UTF), which can + be used with either library. When UTF mode is set, both the pattern and + any subject strings that are matched against it are treated as UTF-16 + or UTF-32 strings instead of strings of individual 16-bit or 32-bit + characters. + + +UTF SUPPORT OVERHEAD + + If you compile PCRE with UTF support, but do not use it at run time, + the library will be a bit bigger, but the additional run time overhead + is limited to testing the PCRE_UTF[8|16|32] flag occasionally, so + should not be very big. + + +UNICODE PROPERTY SUPPORT + + If PCRE is built with Unicode character property support (which implies + UTF support), the escape sequences \p{..}, \P{..}, and \X can be used. + The available properties that can be tested are limited to the general + category properties such as Lu for an upper case letter or Nd for a + decimal number, the Unicode script names such as Arabic or Han, and the + derived properties Any and L&. Full lists is given in the pcrepattern + and pcresyntax documentation. Only the short names for properties are + supported. For example, \p{L} matches a letter. Its Perl synonym, + \p{Letter}, is not supported. Furthermore, in Perl, many properties + may optionally be prefixed by "Is", for compatibility with Perl 5.6. + PCRE does not support this. + + Validity of UTF-8 strings + + When you set the PCRE_UTF8 flag, the byte strings passed as patterns + and subjects are (by default) checked for validity on entry to the rel- + evant functions. The entire string is checked before any other process- + ing takes place. From release 7.3 of PCRE, the check is according the + rules of RFC 3629, which are themselves derived from the Unicode speci- + fication. Earlier releases of PCRE followed the rules of RFC 2279, + which allows the full range of 31-bit values (0 to 0x7FFFFFFF). The + current check allows only values in the range U+0 to U+10FFFF, exclud- + ing the surrogate area. (From release 8.33 the so-called "non-charac- + ter" code points are no longer excluded because Unicode corrigendum #9 + makes it clear that they should not be.) + + Characters in the "Surrogate Area" of Unicode are reserved for use by + UTF-16, where they are used in pairs to encode codepoints with values + greater than 0xFFFF. The code points that are encoded by UTF-16 pairs + are available independently in the UTF-8 and UTF-32 encodings. (In + other words, the whole surrogate thing is a fudge for UTF-16 which un- + fortunately messes up UTF-8 and UTF-32.) + + If an invalid UTF-8 string is passed to PCRE, an error return is given. + At compile time, the only additional information is the offset to the + first byte of the failing character. The run-time functions pcre_exec() + and pcre_dfa_exec() also pass back this information, as well as a more + detailed reason code if the caller has provided memory in which to do + this. + + In some situations, you may already know that your strings are valid, + and therefore want to skip these checks in order to improve perfor- + mance, for example in the case of a long subject string that is being + scanned repeatedly. If you set the PCRE_NO_UTF8_CHECK flag at compile + time or at run time, PCRE assumes that the pattern or subject it is + given (respectively) contains only valid UTF-8 codes. In this case, it + does not diagnose an invalid UTF-8 string. + + Note that passing PCRE_NO_UTF8_CHECK to pcre_compile() just disables + the check for the pattern; it does not also apply to subject strings. + If you want to disable the check for a subject string you must pass + this option to pcre_exec() or pcre_dfa_exec(). + + If you pass an invalid UTF-8 string when PCRE_NO_UTF8_CHECK is set, the + result is undefined and your program may crash. + + Validity of UTF-16 strings + + When you set the PCRE_UTF16 flag, the strings of 16-bit data units that + are passed as patterns and subjects are (by default) checked for valid- + ity on entry to the relevant functions. Values other than those in the + surrogate range U+D800 to U+DFFF are independent code points. Values in + the surrogate range must be used in pairs in the correct manner. + + If an invalid UTF-16 string is passed to PCRE, an error return is + given. At compile time, the only additional information is the offset + to the first data unit of the failing character. The run-time functions + pcre16_exec() and pcre16_dfa_exec() also pass back this information, as + well as a more detailed reason code if the caller has provided memory + in which to do this. + + In some situations, you may already know that your strings are valid, + and therefore want to skip these checks in order to improve perfor- + mance. If you set the PCRE_NO_UTF16_CHECK flag at compile time or at + run time, PCRE assumes that the pattern or subject it is given (respec- + tively) contains only valid UTF-16 sequences. In this case, it does not + diagnose an invalid UTF-16 string. However, if an invalid string is + passed, the result is undefined. + + Validity of UTF-32 strings + + When you set the PCRE_UTF32 flag, the strings of 32-bit data units that + are passed as patterns and subjects are (by default) checked for valid- + ity on entry to the relevant functions. This check allows only values + in the range U+0 to U+10FFFF, excluding the surrogate area U+D800 to + U+DFFF. + + If an invalid UTF-32 string is passed to PCRE, an error return is + given. At compile time, the only additional information is the offset + to the first data unit of the failing character. The run-time functions + pcre32_exec() and pcre32_dfa_exec() also pass back this information, as + well as a more detailed reason code if the caller has provided memory + in which to do this. + + In some situations, you may already know that your strings are valid, + and therefore want to skip these checks in order to improve perfor- + mance. If you set the PCRE_NO_UTF32_CHECK flag at compile time or at + run time, PCRE assumes that the pattern or subject it is given (respec- + tively) contains only valid UTF-32 sequences. In this case, it does not + diagnose an invalid UTF-32 string. However, if an invalid string is + passed, the result is undefined. + + General comments about UTF modes + + 1. Codepoints less than 256 can be specified in patterns by either + braced or unbraced hexadecimal escape sequences (for example, \x{b3} or + \xb3). Larger values have to use braced sequences. + + 2. Octal numbers up to \777 are recognized, and in UTF-8 mode they + match two-byte characters for values greater than \177. + + 3. Repeat quantifiers apply to complete UTF characters, not to individ- + ual data units, for example: \x{100}{3}. + + 4. The dot metacharacter matches one UTF character instead of a single + data unit. + + 5. The escape sequence \C can be used to match a single byte in UTF-8 + mode, or a single 16-bit data unit in UTF-16 mode, or a single 32-bit + data unit in UTF-32 mode, but its use can lead to some strange effects + because it breaks up multi-unit characters (see the description of \C + in the pcrepattern documentation). The use of \C is not supported in + the alternative matching function pcre[16|32]_dfa_exec(), nor is it + supported in UTF mode by the JIT optimization of pcre[16|32]_exec(). If + JIT optimization is requested for a UTF pattern that contains \C, it + will not succeed, and so the matching will be carried out by the normal + interpretive function. + + 6. The character escapes \b, \B, \d, \D, \s, \S, \w, and \W correctly + test characters of any code value, but, by default, the characters that + PCRE recognizes as digits, spaces, or word characters remain the same + set as in non-UTF mode, all with values less than 256. This remains + true even when PCRE is built to include Unicode property support, be- + cause to do otherwise would slow down PCRE in many common cases. Note + in particular that this applies to \b and \B, because they are defined + in terms of \w and \W. If you really want to test for a wider sense of, + say, "digit", you can use explicit Unicode property tests such as + \p{Nd}. Alternatively, if you set the PCRE_UCP option, the way that the + character escapes work is changed so that Unicode properties are used + to determine which characters match. There are more details in the sec- + tion on generic character types in the pcrepattern documentation. + + 7. Similarly, characters that match the POSIX named character classes + are all low-valued characters, unless the PCRE_UCP option is set. + + 8. However, the horizontal and vertical white space matching escapes + (\h, \H, \v, and \V) do match all the appropriate Unicode characters, + whether or not PCRE_UCP is set. + + 9. Case-insensitive matching applies only to characters whose values + are less than 128, unless PCRE is built with Unicode property support. + A few Unicode characters such as Greek sigma have more than two code- + points that are case-equivalent. Up to and including PCRE release 8.31, + only one-to-one case mappings were supported, but later releases (with + Unicode property support) do treat as case-equivalent all versions of + characters such as Greek sigma. + + +AUTHOR + + Philip Hazel + University Computing Service + Cambridge CB2 3QH, England. + + +REVISION + + Last updated: 27 February 2013 + Copyright (c) 1997-2013 University of Cambridge. +------------------------------------------------------------------------------ + + +PCREJIT(3) Library Functions Manual PCREJIT(3) + + + +NAME + PCRE - Perl-compatible regular expressions + +PCRE JUST-IN-TIME COMPILER SUPPORT + + Just-in-time compiling is a heavyweight optimization that can greatly + speed up pattern matching. However, it comes at the cost of extra pro- + cessing before the match is performed. Therefore, it is of most benefit + when the same pattern is going to be matched many times. This does not + necessarily mean many calls of a matching function; if the pattern is + not anchored, matching attempts may take place many times at various + positions in the subject, even for a single call. Therefore, if the + subject string is very long, it may still pay to use JIT for one-off + matches. + + JIT support applies only to the traditional Perl-compatible matching + function. It does not apply when the DFA matching function is being + used. The code for this support was written by Zoltan Herczeg. + + +8-BIT, 16-BIT AND 32-BIT SUPPORT + + JIT support is available for all of the 8-bit, 16-bit and 32-bit PCRE + libraries. To keep this documentation simple, only the 8-bit interface + is described in what follows. If you are using the 16-bit library, sub- + stitute the 16-bit functions and 16-bit structures (for example, + pcre16_jit_stack instead of pcre_jit_stack). If you are using the + 32-bit library, substitute the 32-bit functions and 32-bit structures + (for example, pcre32_jit_stack instead of pcre_jit_stack). + + +AVAILABILITY OF JIT SUPPORT + + JIT support is an optional feature of PCRE. The "configure" option + --enable-jit (or equivalent CMake option) must be set when PCRE is + built if you want to use JIT. The support is limited to the following + hardware platforms: + + ARM v5, v7, and Thumb2 + Intel x86 32-bit and 64-bit + MIPS 32-bit + Power PC 32-bit and 64-bit + SPARC 32-bit (experimental) + + If --enable-jit is set on an unsupported platform, compilation fails. + + A program that is linked with PCRE 8.20 or later can tell if JIT sup- + port is available by calling pcre_config() with the PCRE_CONFIG_JIT op- + tion. The result is 1 when JIT is available, and 0 otherwise. However, + a simple program does not need to check this in order to use JIT. The + normal API is implemented in a way that falls back to the interpretive + code if JIT is not available. For programs that need the best possible + performance, there is also a "fast path" API that is JIT-specific. + + If your program may sometimes be linked with versions of PCRE that are + older than 8.20, but you want to use JIT when it is available, you can + test the values of PCRE_MAJOR and PCRE_MINOR, or the existence of a JIT + macro such as PCRE_CONFIG_JIT, for compile-time control of your code. + Also beware that the pcre_jit_exec() function was not available at all + before 8.32, and may not be available at all if PCRE isn't compiled + with --enable-jit. See the "JIT FAST PATH API" section below for de- + tails. + + +SIMPLE USE OF JIT + + You have to do two things to make use of the JIT support in the sim- + plest way: + + (1) Call pcre_study() with the PCRE_STUDY_JIT_COMPILE option for + each compiled pattern, and pass the resulting pcre_extra block to + pcre_exec(). + + (2) Use pcre_free_study() to free the pcre_extra block when it is + no longer needed, instead of just freeing it yourself. This en- + sures that + any JIT data is also freed. + + For a program that may be linked with pre-8.20 versions of PCRE, you + can insert + + #ifndef PCRE_STUDY_JIT_COMPILE + #define PCRE_STUDY_JIT_COMPILE 0 + #endif + + so that no option is passed to pcre_study(), and then use something + like this to free the study data: + + #ifdef PCRE_CONFIG_JIT + pcre_free_study(study_ptr); + #else + pcre_free(study_ptr); + #endif + + PCRE_STUDY_JIT_COMPILE requests the JIT compiler to generate code for + complete matches. If you want to run partial matches using the + PCRE_PARTIAL_HARD or PCRE_PARTIAL_SOFT options of pcre_exec(), you + should set one or both of the following options in addition to, or in- + stead of, PCRE_STUDY_JIT_COMPILE when you call pcre_study(): + + PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE + PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE + + If using pcre_jit_exec() and supporting a pre-8.32 version of PCRE, you + can insert: + + #if PCRE_MAJOR >= 8 && PCRE_MINOR >= 32 + pcre_jit_exec(...); + #else + pcre_exec(...) + #endif + + but as described in the "JIT FAST PATH API" section below this assumes + version 8.32 and later are compiled with --enable-jit, which may break. + + The JIT compiler generates different optimized code for each of the + three modes (normal, soft partial, hard partial). When pcre_exec() is + called, the appropriate code is run if it is available. Otherwise, the + pattern is matched using interpretive code. + + In some circumstances you may need to call additional functions. These + are described in the section entitled "Controlling the JIT stack" be- + low. + + If JIT support is not available, PCRE_STUDY_JIT_COMPILE etc. are ig- + nored, and no JIT data is created. Otherwise, the compiled pattern is + passed to the JIT compiler, which turns it into machine code that exe- + cutes much faster than the normal interpretive code. When pcre_exec() + is passed a pcre_extra block containing a pointer to JIT code of the + appropriate mode (normal or hard/soft partial), it obeys that code in- + stead of running the interpreter. The result is identical, but the com- + piled JIT code runs much faster. + + There are some pcre_exec() options that are not supported for JIT exe- + cution. There are also some pattern items that JIT cannot handle. De- + tails are given below. In both cases, execution automatically falls + back to the interpretive code. If you want to know whether JIT was ac- + tually used for a particular match, you should arrange for a JIT call- + back function to be set up as described in the section entitled "Con- + trolling the JIT stack" below, even if you do not need to supply a non- + default JIT stack. Such a callback function is called whenever JIT code + is about to be obeyed. If the execution options are not right for JIT + execution, the callback function is not obeyed. + + If the JIT compiler finds an unsupported item, no JIT data is gener- + ated. You can find out if JIT execution is available after studying a + pattern by calling pcre_fullinfo() with the PCRE_INFO_JIT option. A re- + sult of 1 means that JIT compilation was successful. A result of 0 + means that JIT support is not available, or the pattern was not studied + with PCRE_STUDY_JIT_COMPILE etc., or the JIT compiler was not able to + handle the pattern. + + Once a pattern has been studied, with or without JIT, it can be used as + many times as you like for matching different subject strings. + + +UNSUPPORTED OPTIONS AND PATTERN ITEMS + + The only pcre_exec() options that are supported for JIT execution are + PCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK, PCRE_NO_UTF32_CHECK, PCRE_NOT- + BOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, PCRE_PAR- + TIAL_HARD, and PCRE_PARTIAL_SOFT. + + The only unsupported pattern items are \C (match a single data unit) + when running in a UTF mode, and a callout immediately before an asser- + tion condition in a conditional group. + + +RETURN VALUES FROM JIT EXECUTION + + When a pattern is matched using JIT execution, the return values are + the same as those given by the interpretive pcre_exec() code, with the + addition of one new error code: PCRE_ERROR_JIT_STACKLIMIT. This means + that the memory used for the JIT stack was insufficient. See "Control- + ling the JIT stack" below for a discussion of JIT stack usage. For com- + patibility with the interpretive pcre_exec() code, no more than two- + thirds of the ovector argument is used for passing back captured sub- + strings. + + The error code PCRE_ERROR_MATCHLIMIT is returned by the JIT code if + searching a very large pattern tree goes on for too long, as it is in + the same circumstance when JIT is not used, but the details of exactly + what is counted are not the same. The PCRE_ERROR_RECURSIONLIMIT error + code is never returned by JIT execution. + + +SAVING AND RESTORING COMPILED PATTERNS + + The code that is generated by the JIT compiler is architecture-spe- + cific, and is also position dependent. For those reasons it cannot be + saved (in a file or database) and restored later like the bytecode and + other data of a compiled pattern. Saving and restoring compiled pat- + terns is not something many people do. More detail about this facility + is given in the pcreprecompile documentation. It should be possible to + run pcre_study() on a saved and restored pattern, and thereby recreate + the JIT data, but because JIT compilation uses significant resources, + it is probably not worth doing this; you might as well recompile the + original pattern. + + +CONTROLLING THE JIT STACK + + When the compiled JIT code runs, it needs a block of memory to use as a + stack. By default, it uses 32K on the machine stack. However, some + large or complicated patterns need more than this. The error PCRE_ER- + ROR_JIT_STACKLIMIT is given when there is not enough stack. Three func- + tions are provided for managing blocks of memory for use as JIT stacks. + There is further discussion about the use of JIT stacks in the section + entitled "JIT stack FAQ" below. + + The pcre_jit_stack_alloc() function creates a JIT stack. Its arguments + are a starting size and a maximum size, and it returns a pointer to an + opaque structure of type pcre_jit_stack, or NULL if there is an error. + The pcre_jit_stack_free() function can be used to free a stack that is + no longer needed. (For the technically minded: the address space is al- + located by mmap or VirtualAlloc.) + + JIT uses far less memory for recursion than the interpretive code, and + a maximum stack size of 512K to 1M should be more than enough for any + pattern. + + The pcre_assign_jit_stack() function specifies which stack JIT code + should use. Its arguments are as follows: + + pcre_extra *extra + pcre_jit_callback callback + void *data + + The extra argument must be the result of studying a pattern with + PCRE_STUDY_JIT_COMPILE etc. There are three cases for the values of the + other two options: + + (1) If callback is NULL and data is NULL, an internal 32K block + on the machine stack is used. + + (2) If callback is NULL and data is not NULL, data must be + a valid JIT stack, the result of calling pcre_jit_stack_alloc(). + + (3) If callback is not NULL, it must point to a function that is + called with data as an argument at the start of matching, in + order to set up a JIT stack. If the return from the callback + function is NULL, the internal 32K stack is used; otherwise the + return value must be a valid JIT stack, the result of calling + pcre_jit_stack_alloc(). + + A callback function is obeyed whenever JIT code is about to be run; it + is not obeyed when pcre_exec() is called with options that are incom- + patible for JIT execution. A callback function can therefore be used to + determine whether a match operation was executed by JIT or by the in- + terpreter. + + You may safely use the same JIT stack for more than one pattern (either + by assigning directly or by callback), as long as the patterns are all + matched sequentially in the same thread. In a multithread application, + if you do not specify a JIT stack, or if you assign or pass back NULL + from a callback, that is thread-safe, because each thread has its own + machine stack. However, if you assign or pass back a non-NULL JIT + stack, this must be a different stack for each thread so that the ap- + plication is thread-safe. + + Strictly speaking, even more is allowed. You can assign the same non- + NULL stack to any number of patterns as long as they are not used for + matching by multiple threads at the same time. For example, you can as- + sign the same stack to all compiled patterns, and use a global mutex in + the callback to wait until the stack is available for use. However, + this is an inefficient solution, and not recommended. + + This is a suggestion for how a multithreaded program that needs to set + up non-default JIT stacks might operate: + + During thread initalization + thread_local_var = pcre_jit_stack_alloc(...) + + During thread exit + pcre_jit_stack_free(thread_local_var) + + Use a one-line callback function + return thread_local_var + + All the functions described in this section do nothing if JIT is not + available, and pcre_assign_jit_stack() does nothing unless the extra + argument is non-NULL and points to a pcre_extra block that is the re- + sult of a successful study with PCRE_STUDY_JIT_COMPILE etc. + + +JIT STACK FAQ + + (1) Why do we need JIT stacks? + + PCRE (and JIT) is a recursive, depth-first engine, so it needs a stack + where the local data of the current node is pushed before checking its + child nodes. Allocating real machine stack on some platforms is diffi- + cult. For example, the stack chain needs to be updated every time if we + extend the stack on PowerPC. Although it is possible, its updating + time overhead decreases performance. So we do the recursion in memory. + + (2) Why don't we simply allocate blocks of memory with malloc()? + + Modern operating systems have a nice feature: they can reserve an ad- + dress space instead of allocating memory. We can safely allocate memory + pages inside this address space, so the stack could grow without moving + memory data (this is important because of pointers). Thus we can allo- + cate 1M address space, and use only a single memory page (usually 4K) + if that is enough. However, we can still grow up to 1M anytime if + needed. + + (3) Who "owns" a JIT stack? + + The owner of the stack is the user program, not the JIT studied pattern + or anything else. The user program must ensure that if a stack is used + by pcre_exec(), (that is, it is assigned to the pattern currently run- + ning), that stack must not be used by any other threads (to avoid over- + writing the same memory area). The best practice for multithreaded pro- + grams is to allocate a stack for each thread, and return this stack + through the JIT callback function. + + (4) When should a JIT stack be freed? + + You can free a JIT stack at any time, as long as it will not be used by + pcre_exec() again. When you assign the stack to a pattern, only a + pointer is set. There is no reference counting or any other magic. You + can free the patterns and stacks in any order, anytime. Just do not + call pcre_exec() with a pattern pointing to an already freed stack, as + that will cause SEGFAULT. (Also, do not free a stack currently used by + pcre_exec() in another thread). You can also replace the stack for a + pattern at any time. You can even free the previous stack before as- + signing a replacement. + + (5) Should I allocate/free a stack every time before/after calling + pcre_exec()? + + No, because this is too costly in terms of resources. However, you + could implement some clever idea which release the stack if it is not + used in let's say two minutes. The JIT callback can help to achieve + this without keeping a list of the currently JIT studied patterns. + + (6) OK, the stack is for long term memory allocation. But what happens + if a pattern causes stack overflow with a stack of 1M? Is that 1M kept + until the stack is freed? + + Especially on embedded sytems, it might be a good idea to release mem- + ory sometimes without freeing the stack. There is no API for this at + the moment. Probably a function call which returns with the currently + allocated memory for any stack and another which allows releasing mem- + ory (shrinking the stack) would be a good idea if someone needs this. + + (7) This is too much of a headache. Isn't there any better solution for + JIT stack handling? + + No, thanks to Windows. If POSIX threads were used everywhere, we could + throw out this complicated API. + + +EXAMPLE CODE + + This is a single-threaded example that specifies a JIT stack without + using a callback. + + int rc; + int ovector[30]; + pcre *re; + pcre_extra *extra; + pcre_jit_stack *jit_stack; + + re = pcre_compile(pattern, 0, &error, &erroffset, NULL); + /* Check for errors */ + extra = pcre_study(re, PCRE_STUDY_JIT_COMPILE, &error); + jit_stack = pcre_jit_stack_alloc(32*1024, 512*1024); + /* Check for error (NULL) */ + pcre_assign_jit_stack(extra, NULL, jit_stack); + rc = pcre_exec(re, extra, subject, length, 0, 0, ovector, 30); + /* Check results */ + pcre_free(re); + pcre_free_study(extra); + pcre_jit_stack_free(jit_stack); + + +JIT FAST PATH API + + Because the API described above falls back to interpreted execution + when JIT is not available, it is convenient for programs that are writ- + ten for general use in many environments. However, calling JIT via + pcre_exec() does have a performance impact. Programs that are written + for use where JIT is known to be available, and which need the best + possible performance, can instead use a "fast path" API to call JIT ex- + ecution directly instead of calling pcre_exec() (obviously only for + patterns that have been successfully studied by JIT). + + The fast path function is called pcre_jit_exec(), and it takes exactly + the same arguments as pcre_exec(), plus one additional argument that + must point to a JIT stack. The JIT stack arrangements described above + do not apply. The return values are the same as for pcre_exec(). + + When you call pcre_exec(), as well as testing for invalid options, a + number of other sanity checks are performed on the arguments. For exam- + ple, if the subject pointer is NULL, or its length is negative, an im- + mediate error is given. Also, unless PCRE_NO_UTF[8|16|32] is set, a UTF + subject string is tested for validity. In the interests of speed, these + checks do not happen on the JIT fast path, and if invalid data is + passed, the result is undefined. + + Bypassing the sanity checks and the pcre_exec() wrapping can give + speedups of more than 10%. + + Note that the pcre_jit_exec() function is not available in versions of + PCRE before 8.32 (released in November 2012). If you need to support + versions that old you must either use the slower pcre_exec(), or switch + between the two codepaths by checking the values of PCRE_MAJOR and + PCRE_MINOR. + + Due to an unfortunate implementation oversight, even in versions 8.32 + and later there will be no pcre_jit_exec() stub function defined when + PCRE is compiled with --disable-jit, which is the default, and there's + no way to detect whether PCRE was compiled with --enable-jit via a + macro. + + If you need to support versions older than 8.32, or versions that may + not build with --enable-jit, you must either use the slower + pcre_exec(), or switch between the two codepaths by checking the values + of PCRE_MAJOR and PCRE_MINOR. + + Switching between the two by checking the version assumes that all the + versions being targeted are built with --enable-jit. To also support + builds that may use --disable-jit either pcre_exec() must be used, or a + compile-time check for JIT via pcre_config() (which assumes the runtime + environment will be the same), or as the Git project decided to do, + simply assume that pcre_jit_exec() is present in 8.32 or later unless a + compile-time flag is provided, see the "grep: un-break building with + PCRE >= 8.32 without --enable-jit" commit in git.git for an example of + that. + + +SEE ALSO + + pcreapi(3) + + +AUTHOR + + Philip Hazel (FAQ by Zoltan Herczeg) + University Computing Service + Cambridge CB2 3QH, England. + + +REVISION + + Last updated: 05 July 2017 + Copyright (c) 1997-2017 University of Cambridge. +------------------------------------------------------------------------------ + + +PCREPARTIAL(3) Library Functions Manual PCREPARTIAL(3) + + + +NAME + PCRE - Perl-compatible regular expressions + +PARTIAL MATCHING IN PCRE + + In normal use of PCRE, if the subject string that is passed to a match- + ing function matches as far as it goes, but is too short to match the + entire pattern, PCRE_ERROR_NOMATCH is returned. There are circumstances + where it might be helpful to distinguish this case from other cases in + which there is no match. + + Consider, for example, an application where a human is required to type + in data for a field with specific formatting requirements. An example + might be a date in the form ddmmmyy, defined by this pattern: + + ^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$ + + If the application sees the user's keystrokes one by one, and can check + that what has been typed so far is potentially valid, it is able to + raise an error as soon as a mistake is made, by beeping and not re- + flecting the character that has been typed, for example. This immediate + feedback is likely to be a better user interface than a check that is + delayed until the entire string has been entered. Partial matching can + also be useful when the subject string is very long and is not all + available at once. + + PCRE supports partial matching by means of the PCRE_PARTIAL_SOFT and + PCRE_PARTIAL_HARD options, which can be set when calling any of the + matching functions. For backwards compatibility, PCRE_PARTIAL is a syn- + onym for PCRE_PARTIAL_SOFT. The essential difference between the two + options is whether or not a partial match is preferred to an alterna- + tive complete match, though the details differ between the two types of + matching function. If both options are set, PCRE_PARTIAL_HARD takes + precedence. + + If you want to use partial matching with just-in-time optimized code, + you must call pcre_study(), pcre16_study() or pcre32_study() with one + or both of these options: + + PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE + PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE + + PCRE_STUDY_JIT_COMPILE should also be set if you are going to run non- + partial matches on the same pattern. If the appropriate JIT study mode + has not been set for a match, the interpretive matching code is used. + + Setting a partial matching option disables two of PCRE's standard opti- + mizations. PCRE remembers the last literal data unit in a pattern, and + abandons matching immediately if it is not present in the subject + string. This optimization cannot be used for a subject string that + might match only partially. If the pattern was studied, PCRE knows the + minimum length of a matching string, and does not bother to run the + matching function on shorter strings. This optimization is also dis- + abled for partial matching. + + +PARTIAL MATCHING USING pcre_exec() OR pcre[16|32]_exec() + + A partial match occurs during a call to pcre_exec() or + pcre[16|32]_exec() when the end of the subject string is reached suc- + cessfully, but matching cannot continue because more characters are + needed. However, at least one character in the subject must have been + inspected. This character need not form part of the final matched + string; lookbehind assertions and the \K escape sequence provide ways + of inspecting characters before the start of a matched substring. The + requirement for inspecting at least one character exists because an + empty string can always be matched; without such a restriction there + would always be a partial match of an empty string at the end of the + subject. + + If there are at least two slots in the offsets vector when a partial + match is returned, the first slot is set to the offset of the earliest + character that was inspected. For convenience, the second offset points + to the end of the subject so that a substring can easily be identified. + If there are at least three slots in the offsets vector, the third slot + is set to the offset of the character where matching started. + + For the majority of patterns, the contents of the first and third slots + will be the same. However, for patterns that contain lookbehind asser- + tions, or begin with \b or \B, characters before the one where matching + started may have been inspected while carrying out the match. For exam- + ple, consider this pattern: + + /(?<=abc)123/ + + This pattern matches "123", but only if it is preceded by "abc". If the + subject string is "xyzabc12", the first two offsets after a partial + match are for the substring "abc12", because all these characters were + inspected. However, the third offset is set to 6, because that is the + offset where matching began. + + What happens when a partial match is identified depends on which of the + two partial matching options are set. + + PCRE_PARTIAL_SOFT WITH pcre_exec() OR pcre[16|32]_exec() + + If PCRE_PARTIAL_SOFT is set when pcre_exec() or pcre[16|32]_exec() + identifies a partial match, the partial match is remembered, but match- + ing continues as normal, and other alternatives in the pattern are + tried. If no complete match can be found, PCRE_ERROR_PARTIAL is re- + turned instead of PCRE_ERROR_NOMATCH. + + This option is "soft" because it prefers a complete match over a par- + tial match. All the various matching items in a pattern behave as if + the subject string is potentially complete. For example, \z, \Z, and $ + match at the end of the subject, as normal, and for \b and \B the end + of the subject is treated as a non-alphanumeric. + + If there is more than one partial match, the first one that was found + provides the data that is returned. Consider this pattern: + + /123\w+X|dogY/ + + If this is matched against the subject string "abc123dog", both alter- + natives fail to match, but the end of the subject is reached during + matching, so PCRE_ERROR_PARTIAL is returned. The offsets are set to 3 + and 9, identifying "123dog" as the first partial match that was found. + (In this example, there are two partial matches, because "dog" on its + own partially matches the second alternative.) + + PCRE_PARTIAL_HARD WITH pcre_exec() OR pcre[16|32]_exec() + + If PCRE_PARTIAL_HARD is set for pcre_exec() or pcre[16|32]_exec(), + PCRE_ERROR_PARTIAL is returned as soon as a partial match is found, + without continuing to search for possible complete matches. This option + is "hard" because it prefers an earlier partial match over a later com- + plete match. For this reason, the assumption is made that the end of + the supplied subject string may not be the true end of the available + data, and so, if \z, \Z, \b, \B, or $ are encountered at the end of the + subject, the result is PCRE_ERROR_PARTIAL, provided that at least one + character in the subject has been inspected. + + Setting PCRE_PARTIAL_HARD also affects the way UTF-8 and UTF-16 subject + strings are checked for validity. Normally, an invalid sequence causes + the error PCRE_ERROR_BADUTF8 or PCRE_ERROR_BADUTF16. However, in the + special case of a truncated character at the end of the subject, + PCRE_ERROR_SHORTUTF8 or PCRE_ERROR_SHORTUTF16 is returned when + PCRE_PARTIAL_HARD is set. + + Comparing hard and soft partial matching + + The difference between the two partial matching options can be illus- + trated by a pattern such as: + + /dog(sbody)?/ + + This matches either "dog" or "dogsbody", greedily (that is, it prefers + the longer string if possible). If it is matched against the string + "dog" with PCRE_PARTIAL_SOFT, it yields a complete match for "dog". + However, if PCRE_PARTIAL_HARD is set, the result is PCRE_ERROR_PARTIAL. + On the other hand, if the pattern is made ungreedy the result is dif- + ferent: + + /dog(sbody)??/ + + In this case the result is always a complete match because that is + found first, and matching never continues after finding a complete + match. It might be easier to follow this explanation by thinking of the + two patterns like this: + + /dog(sbody)?/ is the same as /dogsbody|dog/ + /dog(sbody)??/ is the same as /dog|dogsbody/ + + The second pattern will never match "dogsbody", because it will always + find the shorter match first. + + +PARTIAL MATCHING USING pcre_dfa_exec() OR pcre[16|32]_dfa_exec() + + The DFA functions move along the subject string character by character, + without backtracking, searching for all possible matches simultane- + ously. If the end of the subject is reached before the end of the pat- + tern, there is the possibility of a partial match, again provided that + at least one character has been inspected. + + When PCRE_PARTIAL_SOFT is set, PCRE_ERROR_PARTIAL is returned only if + there have been no complete matches. Otherwise, the complete matches + are returned. However, if PCRE_PARTIAL_HARD is set, a partial match + takes precedence over any complete matches. The portion of the string + that was inspected when the longest partial match was found is set as + the first matching string, provided there are at least two slots in the + offsets vector. + + Because the DFA functions always search for all possible matches, and + there is no difference between greedy and ungreedy repetition, their + behaviour is different from the standard functions when PCRE_PAR- + TIAL_HARD is set. Consider the string "dog" matched against the un- + greedy pattern shown above: + + /dog(sbody)??/ + + Whereas the standard functions stop as soon as they find the complete + match for "dog", the DFA functions also find the partial match for + "dogsbody", and so return that when PCRE_PARTIAL_HARD is set. + + +PARTIAL MATCHING AND WORD BOUNDARIES + + If a pattern ends with one of sequences \b or \B, which test for word + boundaries, partial matching with PCRE_PARTIAL_SOFT can give counter- + intuitive results. Consider this pattern: + + /\bcat\b/ + + This matches "cat", provided there is a word boundary at either end. If + the subject string is "the cat", the comparison of the final "t" with a + following character cannot take place, so a partial match is found. + However, normal matching carries on, and \b matches at the end of the + subject when the last character is a letter, so a complete match is + found. The result, therefore, is not PCRE_ERROR_PARTIAL. Using + PCRE_PARTIAL_HARD in this case does yield PCRE_ERROR_PARTIAL, because + then the partial match takes precedence. + + +FORMERLY RESTRICTED PATTERNS + + For releases of PCRE prior to 8.00, because of the way certain internal + optimizations were implemented in the pcre_exec() function, the + PCRE_PARTIAL option (predecessor of PCRE_PARTIAL_SOFT) could not be + used with all patterns. From release 8.00 onwards, the restrictions no + longer apply, and partial matching with can be requested for any pat- + tern. + + Items that were formerly restricted were repeated single characters and + repeated metasequences. If PCRE_PARTIAL was set for a pattern that did + not conform to the restrictions, pcre_exec() returned the error code + PCRE_ERROR_BADPARTIAL (-13). This error code is no longer in use. The + PCRE_INFO_OKPARTIAL call to pcre_fullinfo() to find out if a compiled + pattern can be used for partial matching now always returns 1. + + +EXAMPLE OF PARTIAL MATCHING USING PCRETEST + + If the escape sequence \P is present in a pcretest data line, the + PCRE_PARTIAL_SOFT option is used for the match. Here is a run of + pcretest that uses the date example quoted above: + + re> /^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$/ + data> 25jun04\P + 0: 25jun04 + 1: jun + data> 25dec3\P + Partial match: 23dec3 + data> 3ju\P + Partial match: 3ju + data> 3juj\P + No match + data> j\P + No match + + The first data string is matched completely, so pcretest shows the + matched substrings. The remaining four strings do not match the com- + plete pattern, but the first two are partial matches. Similar output is + obtained if DFA matching is used. + + If the escape sequence \P is present more than once in a pcretest data + line, the PCRE_PARTIAL_HARD option is set for the match. + + +MULTI-SEGMENT MATCHING WITH pcre_dfa_exec() OR pcre[16|32]_dfa_exec() + + When a partial match has been found using a DFA matching function, it + is possible to continue the match by providing additional subject data + and calling the function again with the same compiled regular expres- + sion, this time setting the PCRE_DFA_RESTART option. You must pass the + same working space as before, because this is where details of the pre- + vious partial match are stored. Here is an example using pcretest, us- + ing the \R escape sequence to set the PCRE_DFA_RESTART option (\D spec- + ifies the use of the DFA matching function): + + re> /^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$/ + data> 23ja\P\D + Partial match: 23ja + data> n05\R\D + 0: n05 + + The first call has "23ja" as the subject, and requests partial match- + ing; the second call has "n05" as the subject for the continued + (restarted) match. Notice that when the match is complete, only the + last part is shown; PCRE does not retain the previously partially- + matched string. It is up to the calling program to do that if it needs + to. + + That means that, for an unanchored pattern, if a continued match fails, + it is not possible to try again at a new starting point. All this fa- + cility is capable of doing is continuing with the previous match at- + tempt. In the previous example, if the second set of data is "ug23" the + result is no match, even though there would be a match for "aug23" if + the entire string were given at once. Depending on the application, + this may or may not be what you want. The only way to allow for start- + ing again at the next character is to retain the matched part of the + subject and try a new complete match. + + You can set the PCRE_PARTIAL_SOFT or PCRE_PARTIAL_HARD options with + PCRE_DFA_RESTART to continue partial matching over multiple segments. + This facility can be used to pass very long subject strings to the DFA + matching functions. + + +MULTI-SEGMENT MATCHING WITH pcre_exec() OR pcre[16|32]_exec() + + From release 8.00, the standard matching functions can also be used to + do multi-segment matching. Unlike the DFA functions, it is not possible + to restart the previous match with a new segment of data. Instead, new + data must be added to the previous subject string, and the entire match + re-run, starting from the point where the partial match occurred. Ear- + lier data can be discarded. + + It is best to use PCRE_PARTIAL_HARD in this situation, because it does + not treat the end of a segment as the end of the subject when matching + \z, \Z, \b, \B, and $. Consider an unanchored pattern that matches + dates: + + re> /\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d/ + data> The date is 23ja\P\P + Partial match: 23ja + + At this stage, an application could discard the text preceding "23ja", + add on text from the next segment, and call the matching function + again. Unlike the DFA matching functions, the entire matching string + must always be available, and the complete matching process occurs for + each call, so more memory and more processing time is needed. + + Note: If the pattern contains lookbehind assertions, or \K, or starts + with \b or \B, the string that is returned for a partial match includes + characters that precede the start of what would be returned for a com- + plete match, because it contains all the characters that were inspected + during the partial match. + + +ISSUES WITH MULTI-SEGMENT MATCHING + + Certain types of pattern may give problems with multi-segment matching, + whichever matching function is used. + + 1. If the pattern contains a test for the beginning of a line, you need + to pass the PCRE_NOTBOL option when the subject string for any call + does start at the beginning of a line. There is also a PCRE_NOTEOL op- + tion, but in practice when doing multi-segment matching you should be + using PCRE_PARTIAL_HARD, which includes the effect of PCRE_NOTEOL. + + 2. Lookbehind assertions that have already been obeyed are catered for + in the offsets that are returned for a partial match. However a lookbe- + hind assertion later in the pattern could require even earlier charac- + ters to be inspected. You can handle this case by using the + PCRE_INFO_MAXLOOKBEHIND option of the pcre_fullinfo() or + pcre[16|32]_fullinfo() functions to obtain the length of the longest + lookbehind in the pattern. This length is given in characters, not + bytes. If you always retain at least that many characters before the + partially matched string, all should be well. (Of course, near the + start of the subject, fewer characters may be present; in that case all + characters should be retained.) + + From release 8.33, there is a more accurate way of deciding which char- + acters to retain. Instead of subtracting the length of the longest + lookbehind from the earliest inspected character (offsets[0]), the + match start position (offsets[2]) should be used, and the next match + attempt started at the offsets[2] character by setting the startoffset + argument of pcre_exec() or pcre_dfa_exec(). + + For example, if the pattern "(?<=123)abc" is partially matched against + the string "xx123a", the three offset values returned are 2, 6, and 5. + This indicates that the matching process that gave a partial match + started at offset 5, but the characters "123a" were all inspected. The + maximum lookbehind for that pattern is 3, so taking that away from 5 + shows that we need only keep "123a", and the next match attempt can be + started at offset 3 (that is, at "a") when further characters have been + added. When the match start is not the earliest inspected character, + pcretest shows it explicitly: + + re> "(?<=123)abc" + data> xx123a\P\P + Partial match at offset 5: 123a + + 3. Because a partial match must always contain at least one character, + what might be considered a partial match of an empty string actually + gives a "no match" result. For example: + + re> /c(?<=abc)x/ + data> ab\P + No match + + If the next segment begins "cx", a match should be found, but this will + only happen if characters from the previous segment are retained. For + this reason, a "no match" result should be interpreted as "partial + match of an empty string" when the pattern contains lookbehinds. + + 4. Matching a subject string that is split into multiple segments may + not always produce exactly the same result as matching over one single + long string, especially when PCRE_PARTIAL_SOFT is used. The section + "Partial Matching and Word Boundaries" above describes an issue that + arises if the pattern ends with \b or \B. Another kind of difference + may occur when there are multiple matching possibilities, because (for + PCRE_PARTIAL_SOFT) a partial match result is given only when there are + no completed matches. This means that as soon as the shortest match has + been found, continuation to a new subject segment is no longer possi- + ble. Consider again this pcretest example: + + re> /dog(sbody)?/ + data> dogsb\P + 0: dog + data> do\P\D + Partial match: do + data> gsb\R\P\D + 0: g + data> dogsbody\D + 0: dogsbody + 1: dog + + The first data line passes the string "dogsb" to a standard matching + function, setting the PCRE_PARTIAL_SOFT option. Although the string is + a partial match for "dogsbody", the result is not PCRE_ERROR_PARTIAL, + because the shorter string "dog" is a complete match. Similarly, when + the subject is presented to a DFA matching function in several parts + ("do" and "gsb" being the first two) the match stops when "dog" has + been found, and it is not possible to continue. On the other hand, if + "dogsbody" is presented as a single string, a DFA matching function + finds both matches. + + Because of these problems, it is best to use PCRE_PARTIAL_HARD when + matching multi-segment data. The example above then behaves differ- + ently: + + re> /dog(sbody)?/ + data> dogsb\P\P + Partial match: dogsb + data> do\P\D + Partial match: do + data> gsb\R\P\P\D + Partial match: gsb + + 5. Patterns that contain alternatives at the top level which do not all + start with the same pattern item may not work as expected when + PCRE_DFA_RESTART is used. For example, consider this pattern: + + 1234|3789 + + If the first part of the subject is "ABC123", a partial match of the + first alternative is found at offset 3. There is no partial match for + the second alternative, because such a match does not start at the same + point in the subject string. Attempting to continue with the string + "7890" does not yield a match because only those alternatives that + match at one point in the subject are remembered. The problem arises + because the start of the second alternative matches within the first + alternative. There is no problem with anchored patterns or patterns + such as: + + 1234|ABCD + + where no string can be a partial match for both alternatives. This is + not a problem if a standard matching function is used, because the en- + tire match has to be rerun each time: + + re> /1234|3789/ + data> ABC123\P\P + Partial match: 123 + data> 1237890 + 0: 3789 + + Of course, instead of using PCRE_DFA_RESTART, the same technique of re- + running the entire match can also be used with the DFA matching func- + tions. Another possibility is to work with two buffers. If a partial + match at offset n in the first buffer is followed by "no match" when + PCRE_DFA_RESTART is used on the second buffer, you can then try a new + match starting at offset n+1 in the first buffer. + + +AUTHOR + + Philip Hazel + University Computing Service + Cambridge CB2 3QH, England. + + +REVISION + + Last updated: 02 July 2013 + Copyright (c) 1997-2013 University of Cambridge. +------------------------------------------------------------------------------ + + +PCREPRECOMPILE(3) Library Functions Manual PCREPRECOMPILE(3) + + + +NAME + PCRE - Perl-compatible regular expressions + +SAVING AND RE-USING PRECOMPILED PCRE PATTERNS + + If you are running an application that uses a large number of regular + expression patterns, it may be useful to store them in a precompiled + form instead of having to compile them every time the application is + run. If you are not using any private character tables (see the + pcre_maketables() documentation), this is relatively straightforward. + If you are using private tables, it is a little bit more complicated. + However, if you are using the just-in-time optimization feature, it is + not possible to save and reload the JIT data. + + If you save compiled patterns to a file, you can copy them to a differ- + ent host and run them there. If the two hosts have different endianness + (byte order), you should run the pcre[16|32]_pattern_to_host_byte_or- + der() function on the new host before trying to match the pattern. The + matching functions return PCRE_ERROR_BADENDIANNESS if they detect a + pattern with the wrong endianness. + + Compiling regular expressions with one version of PCRE for use with a + different version is not guaranteed to work and may cause crashes, and + saving and restoring a compiled pattern loses any JIT optimization + data. + + +SAVING A COMPILED PATTERN + + The value returned by pcre[16|32]_compile() points to a single block of + memory that holds the compiled pattern and associated data. You can + find the length of this block in bytes by calling + pcre[16|32]_fullinfo() with an argument of PCRE_INFO_SIZE. You can then + save the data in any appropriate manner. Here is sample code for the + 8-bit library that compiles a pattern and writes it to a file. It as- + sumes that the variable fd refers to a file that is open for output: + + int erroroffset, rc, size; + char *error; + pcre *re; + + re = pcre_compile("my pattern", 0, &error, &erroroffset, NULL); + if (re == NULL) { ... handle errors ... } + rc = pcre_fullinfo(re, NULL, PCRE_INFO_SIZE, &size); + if (rc < 0) { ... handle errors ... } + rc = fwrite(re, 1, size, fd); + if (rc != size) { ... handle errors ... } + + In this example, the bytes that comprise the compiled pattern are + copied exactly. Note that this is binary data that may contain any of + the 256 possible byte values. On systems that make a distinction be- + tween binary and non-binary data, be sure that the file is opened for + binary output. + + If you want to write more than one pattern to a file, you will have to + devise a way of separating them. For binary data, preceding each pat- + tern with its length is probably the most straightforward approach. An- + other possibility is to write out the data in hexadecimal instead of + binary, one pattern to a line. + + Saving compiled patterns in a file is only one possible way of storing + them for later use. They could equally well be saved in a database, or + in the memory of some daemon process that passes them via sockets to + the processes that want them. + + If the pattern has been studied, it is also possible to save the normal + study data in a similar way to the compiled pattern itself. However, if + the PCRE_STUDY_JIT_COMPILE was used, the just-in-time data that is cre- + ated cannot be saved because it is too dependent on the current envi- + ronment. When studying generates additional information, + pcre[16|32]_study() returns a pointer to a pcre[16|32]_extra data + block. Its format is defined in the section on matching a pattern in + the pcreapi documentation. The study_data field points to the binary + study data, and this is what you must save (not the pcre[16|32]_extra + block itself). The length of the study data can be obtained by calling + pcre[16|32]_fullinfo() with an argument of PCRE_INFO_STUDYSIZE. Remem- + ber to check that pcre[16|32]_study() did return a non-NULL value be- + fore trying to save the study data. + + +RE-USING A PRECOMPILED PATTERN + + Re-using a precompiled pattern is straightforward. Having reloaded it + into main memory, called pcre[16|32]_pattern_to_host_byte_order() if + necessary, you pass its pointer to pcre[16|32]_exec() or + pcre[16|32]_dfa_exec() in the usual way. + + However, if you passed a pointer to custom character tables when the + pattern was compiled (the tableptr argument of pcre[16|32]_compile()), + you must now pass a similar pointer to pcre[16|32]_exec() or + pcre[16|32]_dfa_exec(), because the value saved with the compiled pat- + tern will obviously be nonsense. A field in a pcre[16|32]_extra() block + is used to pass this data, as described in the section on matching a + pattern in the pcreapi documentation. + + Warning: The tables that pcre_exec() and pcre_dfa_exec() use must be + the same as those that were used when the pattern was compiled. If this + is not the case, the behaviour is undefined. + + If you did not provide custom character tables when the pattern was + compiled, the pointer in the compiled pattern is NULL, which causes the + matching functions to use PCRE's internal tables. Thus, you do not need + to take any special action at run time in this case. + + If you saved study data with the compiled pattern, you need to create + your own pcre[16|32]_extra data block and set the study_data field to + point to the reloaded study data. You must also set the PCRE_EX- + TRA_STUDY_DATA bit in the flags field to indicate that study data is + present. Then pass the pcre[16|32]_extra block to the matching function + in the usual way. If the pattern was studied for just-in-time optimiza- + tion, that data cannot be saved, and so is lost by a save/restore cy- + cle. + + +COMPATIBILITY WITH DIFFERENT PCRE RELEASES + + In general, it is safest to recompile all saved patterns when you up- + date to a new PCRE release, though not all updates actually require + this. + + +AUTHOR + + Philip Hazel + University Computing Service + Cambridge CB2 3QH, England. + + +REVISION + + Last updated: 12 November 2013 + Copyright (c) 1997-2013 University of Cambridge. +------------------------------------------------------------------------------ + + +PCREPERFORM(3) Library Functions Manual PCREPERFORM(3) + + + +NAME + PCRE - Perl-compatible regular expressions + +PCRE PERFORMANCE + + Two aspects of performance are discussed below: memory usage and pro- + cessing time. The way you express your pattern as a regular expression + can affect both of them. + + +COMPILED PATTERN MEMORY USAGE + + Patterns are compiled by PCRE into a reasonably efficient interpretive + code, so that most simple patterns do not use much memory. However, + there is one case where the memory usage of a compiled pattern can be + unexpectedly large. If a parenthesized subpattern has a quantifier with + a minimum greater than 1 and/or a limited maximum, the whole subpattern + is repeated in the compiled code. For example, the pattern + + (abc|def){2,4} + + is compiled as if it were + + (abc|def)(abc|def)((abc|def)(abc|def)?)? + + (Technical aside: It is done this way so that backtrack points within + each of the repetitions can be independently maintained.) + + For regular expressions whose quantifiers use only small numbers, this + is not usually a problem. However, if the numbers are large, and par- + ticularly if such repetitions are nested, the memory usage can become + an embarrassment. For example, the very simple pattern + + ((ab){1,1000}c){1,3} + + uses 51K bytes when compiled using the 8-bit library. When PCRE is com- + piled with its default internal pointer size of two bytes, the size + limit on a compiled pattern is 64K data units, and this is reached with + the above pattern if the outer repetition is increased from 3 to 4. + PCRE can be compiled to use larger internal pointers and thus handle + larger compiled patterns, but it is better to try to rewrite your pat- + tern to use less memory if you can. + + One way of reducing the memory usage for such patterns is to make use + of PCRE's "subroutine" facility. Re-writing the above pattern as + + ((ab)(?2){0,999}c)(?1){0,2} + + reduces the memory requirements to 18K, and indeed it remains under 20K + even with the outer repetition increased to 100. However, this pattern + is not exactly equivalent, because the "subroutine" calls are treated + as atomic groups into which there can be no backtracking if there is a + subsequent matching failure. Therefore, PCRE cannot do this kind of + rewriting automatically. Furthermore, there is a noticeable loss of + speed when executing the modified pattern. Nevertheless, if the atomic + grouping is not a problem and the loss of speed is acceptable, this + kind of rewriting will allow you to process patterns that PCRE cannot + otherwise handle. + + +STACK USAGE AT RUN TIME + + When pcre_exec() or pcre[16|32]_exec() is used for matching, certain + kinds of pattern can cause it to use large amounts of the process + stack. In some environments the default process stack is quite small, + and if it runs out the result is often SIGSEGV. This issue is probably + the most frequently raised problem with PCRE. Rewriting your pattern + can often help. The pcrestack documentation discusses this issue in de- + tail. + + +PROCESSING TIME + + Certain items in regular expression patterns are processed more effi- + ciently than others. It is more efficient to use a character class like + [aeiou] than a set of single-character alternatives such as + (a|e|i|o|u). In general, the simplest construction that provides the + required behaviour is usually the most efficient. Jeffrey Friedl's book + contains a lot of useful general discussion about optimizing regular + expressions for efficient performance. This document contains a few ob- + servations about PCRE. + + Using Unicode character properties (the \p, \P, and \X escapes) is + slow, because PCRE has to use a multi-stage table lookup whenever it + needs a character's property. If you can find an alternative pattern + that does not use character properties, it will probably be faster. + + By default, the escape sequences \b, \d, \s, and \w, and the POSIX + character classes such as [:alpha:] do not use Unicode properties, + partly for backwards compatibility, and partly for performance reasons. + However, you can set PCRE_UCP if you want Unicode character properties + to be used. This can double the matching time for items such as \d, + when matched with a traditional matching function; the performance loss + is less with a DFA matching function, and in both cases there is not + much difference for \b. + + When a pattern begins with .* not in parentheses, or in parentheses + that are not the subject of a backreference, and the PCRE_DOTALL option + is set, the pattern is implicitly anchored by PCRE, since it can match + only at the start of a subject string. However, if PCRE_DOTALL is not + set, PCRE cannot make this optimization, because the . metacharacter + does not then match a newline, and if the subject string contains new- + lines, the pattern may match from the character immediately following + one of them instead of from the very start. For example, the pattern + + .*second + + matches the subject "first\nand second" (where \n stands for a newline + character), with the match starting at the seventh character. In order + to do this, PCRE has to retry the match starting after every newline in + the subject. + + If you are using such a pattern with subject strings that do not con- + tain newlines, the best performance is obtained by setting PCRE_DOTALL, + or starting the pattern with ^.* or ^.*? to indicate explicit anchor- + ing. That saves PCRE from having to scan along the subject looking for + a newline to restart at. + + Beware of patterns that contain nested indefinite repeats. These can + take a long time to run when applied to a string that does not match. + Consider the pattern fragment + + ^(a+)* + + This can match "aaaa" in 16 different ways, and this number increases + very rapidly as the string gets longer. (The * repeat can match 0, 1, + 2, 3, or 4 times, and for each of those cases other than 0 or 4, the + + repeats can match different numbers of times.) When the remainder of + the pattern is such that the entire match is going to fail, PCRE has in + principle to try every possible variation, and this can take an ex- + tremely long time, even for relatively short strings. + + An optimization catches some of the more simple cases such as + + (a+)*b + + where a literal character follows. Before embarking on the standard + matching procedure, PCRE checks that there is a "b" later in the sub- + ject string, and if there is not, it fails the match immediately. How- + ever, when there is no following literal this optimization cannot be + used. You can see the difference by comparing the behaviour of + + (a+)*\d + + with the pattern above. The former gives a failure almost instantly + when applied to a whole line of "a" characters, whereas the latter + takes an appreciable time with strings longer than about 20 characters. + + In many cases, the solution to this kind of performance issue is to use + an atomic group or a possessive quantifier. + + +AUTHOR + + Philip Hazel + University Computing Service + Cambridge CB2 3QH, England. + + +REVISION + + Last updated: 25 August 2012 + Copyright (c) 1997-2012 University of Cambridge. +------------------------------------------------------------------------------ + + +PCREPOSIX(3) Library Functions Manual PCREPOSIX(3) + + + +NAME + PCRE - Perl-compatible regular expressions. + +SYNOPSIS + + #include + + int regcomp(regex_t *preg, const char *pattern, + int cflags); + + int regexec(regex_t *preg, const char *string, + size_t nmatch, regmatch_t pmatch[], int eflags); + size_t regerror(int errcode, const regex_t *preg, + char *errbuf, size_t errbuf_size); + + void regfree(regex_t *preg); + + +DESCRIPTION + + This set of functions provides a POSIX-style API for the PCRE regular + expression 8-bit library. See the pcreapi documentation for a descrip- + tion of PCRE's native API, which contains much additional functional- + ity. There is no POSIX-style wrapper for PCRE's 16-bit and 32-bit li- + brary. + + The functions described here are just wrapper functions that ultimately + call the PCRE native API. Their prototypes are defined in the + pcreposix.h header file, and on Unix systems the library itself is + called pcreposix.a, so can be accessed by adding -lpcreposix to the + command for linking an application that uses them. Because the POSIX + functions call the native ones, it is also necessary to add -lpcre. + + I have implemented only those POSIX option bits that can be reasonably + mapped to PCRE native options. In addition, the option REG_EXTENDED is + defined with the value zero. This has no effect, but since programs + that are written to the POSIX interface often use it, this makes it + easier to slot in PCRE as a replacement library. Other POSIX options + are not even defined. + + There are also some other options that are not defined by POSIX. These + have been added at the request of users who want to make use of certain + PCRE-specific features via the POSIX calling interface. + + When PCRE is called via these functions, it is only the API that is + POSIX-like in style. The syntax and semantics of the regular expres- + sions themselves are still those of Perl, subject to the setting of + various PCRE options, as described below. "POSIX-like in style" means + that the API approximates to the POSIX definition; it is not fully + POSIX-compatible, and in multi-byte encoding domains it is probably + even less compatible. + + The header for these functions is supplied as pcreposix.h to avoid any + potential clash with other POSIX libraries. It can, of course, be re- + named or aliased as regex.h, which is the "correct" name. It provides + two structure types, regex_t for compiled internal forms, and reg- + match_t for returning captured substrings. It also defines some con- + stants whose names start with "REG_"; these are used for setting op- + tions and identifying error codes. + + +COMPILING A PATTERN + + The function regcomp() is called to compile a pattern into an internal + form. The pattern is a C string terminated by a binary zero, and is + passed in the argument pattern. The preg argument is a pointer to a + regex_t structure that is used as a base for storing information about + the compiled regular expression. + + The argument cflags is either zero, or contains one or more of the bits + defined by the following macros: + + REG_DOTALL + + The PCRE_DOTALL option is set when the regular expression is passed for + compilation to the native function. Note that REG_DOTALL is not part of + the POSIX standard. + + REG_ICASE + + The PCRE_CASELESS option is set when the regular expression is passed + for compilation to the native function. + + REG_NEWLINE + + The PCRE_MULTILINE option is set when the regular expression is passed + for compilation to the native function. Note that this does not mimic + the defined POSIX behaviour for REG_NEWLINE (see the following sec- + tion). + + REG_NOSUB + + The PCRE_NO_AUTO_CAPTURE option is set when the regular expression is + passed for compilation to the native function. In addition, when a pat- + tern that is compiled with this flag is passed to regexec() for match- + ing, the nmatch and pmatch arguments are ignored, and no captured + strings are returned. + + REG_UCP + + The PCRE_UCP option is set when the regular expression is passed for + compilation to the native function. This causes PCRE to use Unicode + properties when matchine \d, \w, etc., instead of just recognizing + ASCII values. Note that REG_UTF8 is not part of the POSIX standard. + + REG_UNGREEDY + + The PCRE_UNGREEDY option is set when the regular expression is passed + for compilation to the native function. Note that REG_UNGREEDY is not + part of the POSIX standard. + + REG_UTF8 + + The PCRE_UTF8 option is set when the regular expression is passed for + compilation to the native function. This causes the pattern itself and + all data strings used for matching it to be treated as UTF-8 strings. + Note that REG_UTF8 is not part of the POSIX standard. + + In the absence of these flags, no options are passed to the native + function. This means the the regex is compiled with PCRE default se- + mantics. In particular, the way it handles newline characters in the + subject string is the Perl way, not the POSIX way. Note that setting + PCRE_MULTILINE has only some of the effects specified for REG_NEWLINE. + It does not affect the way newlines are matched by . (they are not) or + by a negative class such as [^a] (they are). + + The yield of regcomp() is zero on success, and non-zero otherwise. The + preg structure is filled in on success, and one member of the structure + is public: re_nsub contains the number of capturing subpatterns in the + regular expression. Various error codes are defined in the header file. + + NOTE: If the yield of regcomp() is non-zero, you must not attempt to + use the contents of the preg structure. If, for example, you pass it to + regexec(), the result is undefined and your program is likely to crash. + + +MATCHING NEWLINE CHARACTERS + + This area is not simple, because POSIX and Perl take different views of + things. It is not possible to get PCRE to obey POSIX semantics, but + then PCRE was never intended to be a POSIX engine. The following table + lists the different possibilities for matching newline characters in + PCRE: + + Default Change with + + . matches newline no PCRE_DOTALL + newline matches [^a] yes not changeable + $ matches \n at end yes PCRE_DOLLARENDONLY + $ matches \n in middle no PCRE_MULTILINE + ^ matches \n in middle no PCRE_MULTILINE + + This is the equivalent table for POSIX: + + Default Change with + + . matches newline yes REG_NEWLINE + newline matches [^a] yes REG_NEWLINE + $ matches \n at end no REG_NEWLINE + $ matches \n in middle no REG_NEWLINE + ^ matches \n in middle no REG_NEWLINE + + PCRE's behaviour is the same as Perl's, except that there is no equiva- + lent for PCRE_DOLLAR_ENDONLY in Perl. In both PCRE and Perl, there is + no way to stop newline from matching [^a]. + + The default POSIX newline handling can be obtained by setting + PCRE_DOTALL and PCRE_DOLLAR_ENDONLY, but there is no way to make PCRE + behave exactly as for the REG_NEWLINE action. + + +MATCHING A PATTERN + + The function regexec() is called to match a compiled pattern preg + against a given string, which is by default terminated by a zero byte + (but see REG_STARTEND below), subject to the options in eflags. These + can be: + + REG_NOTBOL + + The PCRE_NOTBOL option is set when calling the underlying PCRE matching + function. + + REG_NOTEMPTY + + The PCRE_NOTEMPTY option is set when calling the underlying PCRE match- + ing function. Note that REG_NOTEMPTY is not part of the POSIX standard. + However, setting this option can give more POSIX-like behaviour in some + situations. + + REG_NOTEOL + + The PCRE_NOTEOL option is set when calling the underlying PCRE matching + function. + + REG_STARTEND + + The string is considered to start at string + pmatch[0].rm_so and to + have a terminating NUL located at string + pmatch[0].rm_eo (there need + not actually be a NUL at that location), regardless of the value of + nmatch. This is a BSD extension, compatible with but not specified by + IEEE Standard 1003.2 (POSIX.2), and should be used with caution in + software intended to be portable to other systems. Note that a non-zero + rm_so does not imply REG_NOTBOL; REG_STARTEND affects only the location + of the string, not how it is matched. + + If the pattern was compiled with the REG_NOSUB flag, no data about any + matched strings is returned. The nmatch and pmatch arguments of + regexec() are ignored. + + If the value of nmatch is zero, or if the value pmatch is NULL, no data + about any matched strings is returned. + + Otherwise,the portion of the string that was matched, and also any cap- + tured substrings, are returned via the pmatch argument, which points to + an array of nmatch structures of type regmatch_t, containing the mem- + bers rm_so and rm_eo. These contain the offset to the first character + of each substring and the offset to the first character after the end + of each substring, respectively. The 0th element of the vector relates + to the entire portion of string that was matched; subsequent elements + relate to the capturing subpatterns of the regular expression. Unused + entries in the array have both structure members set to -1. + + A successful match yields a zero return; various error codes are de- + fined in the header file, of which REG_NOMATCH is the "expected" fail- + ure code. + + +ERROR MESSAGES + + The regerror() function maps a non-zero errorcode from either regcomp() + or regexec() to a printable message. If preg is not NULL, the error + should have arisen from the use of that structure. A message terminated + by a binary zero is placed in errbuf. The length of the message, in- + cluding the zero, is limited to errbuf_size. The yield of the function + is the size of buffer needed to hold the whole message. + + +MEMORY USAGE + + Compiling a regular expression causes memory to be allocated and asso- + ciated with the preg structure. The function regfree() frees all such + memory, after which preg may no longer be used as a compiled expres- + sion. + + +AUTHOR + + Philip Hazel + University Computing Service + Cambridge CB2 3QH, England. + + +REVISION + + Last updated: 09 January 2012 + Copyright (c) 1997-2012 University of Cambridge. +------------------------------------------------------------------------------ + + +PCRECPP(3) Library Functions Manual PCRECPP(3) + + + +NAME + PCRE - Perl-compatible regular expressions. + +SYNOPSIS OF C++ WRAPPER + + #include + + +DESCRIPTION + + The C++ wrapper for PCRE was provided by Google Inc. Some additional + functionality was added by Giuseppe Maxia. This brief man page was con- + structed from the notes in the pcrecpp.h file, which should be con- + sulted for further details. Note that the C++ wrapper supports only the + original 8-bit PCRE library. There is no 16-bit or 32-bit support at + present. + + +MATCHING INTERFACE + + The "FullMatch" operation checks that supplied text matches a supplied + pattern exactly. If pointer arguments are supplied, it copies matched + sub-strings that match sub-patterns into them. + + Example: successful match + pcrecpp::RE re("h.*o"); + re.FullMatch("hello"); + + Example: unsuccessful match (requires full match): + pcrecpp::RE re("e"); + !re.FullMatch("hello"); + + Example: creating a temporary RE object: + pcrecpp::RE("h.*o").FullMatch("hello"); + + You can pass in a "const char*" or a "string" for "text". The examples + below tend to use a const char*. You can, as in the different examples + above, store the RE object explicitly in a variable or use a temporary + RE object. The examples below use one mode or the other arbitrarily. + Either could correctly be used for any of these examples. + + You must supply extra pointer arguments to extract matched subpieces. + + Example: extracts "ruby" into "s" and 1234 into "i" + int i; + string s; + pcrecpp::RE re("(\\w+):(\\d+)"); + re.FullMatch("ruby:1234", &s, &i); + + Example: does not try to extract any extra sub-patterns + re.FullMatch("ruby:1234", &s); + + Example: does not try to extract into NULL + re.FullMatch("ruby:1234", NULL, &i); + + Example: integer overflow causes failure + !re.FullMatch("ruby:1234567891234", NULL, &i); + + Example: fails because there aren't enough sub-patterns: + !pcrecpp::RE("\\w+:\\d+").FullMatch("ruby:1234", &s); + + Example: fails because string cannot be stored in integer + !pcrecpp::RE("(.*)").FullMatch("ruby", &i); + + The provided pointer arguments can be pointers to any scalar numeric + type, or one of: + + string (matched piece is copied to string) + StringPiece (StringPiece is mutated to point to matched piece) + T (where "bool T::ParseFrom(const char*, int)" exists) + NULL (the corresponding matched sub-pattern is not copied) + + The function returns true iff all of the following conditions are sat- + isfied: + + a. "text" matches "pattern" exactly; + + b. The number of matched sub-patterns is >= number of supplied + pointers; + + c. The "i"th argument has a suitable type for holding the + string captured as the "i"th sub-pattern. If you pass in + void * NULL for the "i"th argument, or a non-void * NULL + of the correct type, or pass fewer arguments than the + number of sub-patterns, "i"th captured sub-pattern is + ignored. + + CAVEAT: An optional sub-pattern that does not exist in the matched + string is assigned the empty string. Therefore, the following will re- + turn false (because the empty string is not a valid number): + + int number; + pcrecpp::RE::FullMatch("abc", "[a-z]+(\\d+)?", &number); + + The matching interface supports at most 16 arguments per call. If you + need more, consider using the more general interface pcrecpp::RE::Do- + Match. See pcrecpp.h for the signature for DoMatch. + + NOTE: Do not use no_arg, which is used internally to mark the end of a + list of optional arguments, as a placeholder for missing arguments, as + this can lead to segfaults. + + +QUOTING METACHARACTERS + + You can use the "QuoteMeta" operation to insert backslashes before all + potentially meaningful characters in a string. The returned string, + used as a regular expression, will exactly match the original string. + + Example: + string quoted = RE::QuoteMeta(unquoted); + + Note that it's legal to escape a character even if it has no special + meaning in a regular expression -- so this function does that. (This + also makes it identical to the perl function of the same name; see + "perldoc -f quotemeta".) For example, "1.5-2.0?" becomes + "1\.5\-2\.0\?". + + +PARTIAL MATCHES + + You can use the "PartialMatch" operation when you want the pattern to + match any substring of the text. + + Example: simple search for a string: + pcrecpp::RE("ell").PartialMatch("hello"); + + Example: find first number in a string: + int number; + pcrecpp::RE re("(\\d+)"); + re.PartialMatch("x*100 + 20", &number); + assert(number == 100); + + +UTF-8 AND THE MATCHING INTERFACE + + By default, pattern and text are plain text, one byte per character. + The UTF8 flag, passed to the constructor, causes both pattern and + string to be treated as UTF-8 text, still a byte stream but potentially + multiple bytes per character. In practice, the text is likelier to be + UTF-8 than the pattern, but the match returned may depend on the UTF8 + flag, so always use it when matching UTF8 text. For example, "." will + match one byte normally but with UTF8 set may match up to three bytes + of a multi-byte character. + + Example: + pcrecpp::RE_Options options; + options.set_utf8(); + pcrecpp::RE re(utf8_pattern, options); + re.FullMatch(utf8_string); + + Example: using the convenience function UTF8(): + pcrecpp::RE re(utf8_pattern, pcrecpp::UTF8()); + re.FullMatch(utf8_string); + + NOTE: The UTF8 flag is ignored if pcre was not configured with the + --enable-utf8 flag. + + +PASSING MODIFIERS TO THE REGULAR EXPRESSION ENGINE + + PCRE defines some modifiers to change the behavior of the regular ex- + pression engine. The C++ wrapper defines an auxiliary class, RE_Op- + tions, as a vehicle to pass such modifiers to a RE class. Currently, + the following modifiers are supported: + + modifier description Perl corresponding + + PCRE_CASELESS case insensitive match /i + PCRE_MULTILINE multiple lines match /m + PCRE_DOTALL dot matches newlines /s + PCRE_DOLLAR_ENDONLY $ matches only at end N/A + PCRE_EXTRA strict escape parsing N/A + PCRE_EXTENDED ignore white spaces /x + PCRE_UTF8 handles UTF8 chars built-in + PCRE_UNGREEDY reverses * and *? N/A + PCRE_NO_AUTO_CAPTURE disables capturing parens N/A (*) + + (*) Both Perl and PCRE allow non capturing parentheses by means of the + "?:" modifier within the pattern itself. e.g. (?:ab|cd) does not cap- + ture, while (ab|cd) does. + + For a full account on how each modifier works, please check the PCRE + API reference page. + + For each modifier, there are two member functions whose name is made + out of the modifier in lowercase, without the "PCRE_" prefix. For in- + stance, PCRE_CASELESS is handled by + + bool caseless() + + which returns true if the modifier is set, and + + RE_Options & set_caseless(bool) + + which sets or unsets the modifier. Moreover, PCRE_EXTRA_MATCH_LIMIT can + be accessed through the set_match_limit() and match_limit() member + functions. Setting match_limit to a non-zero value will limit the exe- + cution of pcre to keep it from doing bad things like blowing the stack + or taking an eternity to return a result. A value of 5000 is good + enough to stop stack blowup in a 2MB thread stack. Setting match_limit + to zero disables match limiting. Alternatively, you can call + match_limit_recursion() which uses PCRE_EXTRA_MATCH_LIMIT_RECURSION to + limit how much PCRE recurses. match_limit() limits the number of + matches PCRE does; match_limit_recursion() limits the depth of internal + recursion, and therefore the amount of stack that is used. + + Normally, to pass one or more modifiers to a RE class, you declare a + RE_Options object, set the appropriate options, and pass this object to + a RE constructor. Example: + + RE_Options opt; + opt.set_caseless(true); + if (RE("HELLO", opt).PartialMatch("hello world")) ... + + RE_options has two constructors. The default constructor takes no argu- + ments and creates a set of flags that are off by default. The optional + parameter option_flags is to facilitate transfer of legacy code from C + programs. This lets you do + + RE(pattern, + RE_Options(PCRE_CASELESS|PCRE_MULTILINE)).PartialMatch(str); + + However, new code is better off doing + + RE(pattern, + RE_Options().set_caseless(true).set_multiline(true)) + .PartialMatch(str); + + If you are going to pass one of the most used modifiers, there are some + convenience functions that return a RE_Options class with the appropri- + ate modifier already set: CASELESS(), UTF8(), MULTILINE(), DOTALL(), + and EXTENDED(). + + If you need to set several options at once, and you don't want to go + through the pains of declaring a RE_Options object and setting several + options, there is a parallel method that give you such ability on the + fly. You can concatenate several set_xxxxx() member functions, since + each of them returns a reference to its class object. For example, to + pass PCRE_CASELESS, PCRE_EXTENDED, and PCRE_MULTILINE to a RE with one + statement, you may write: + + RE(" ^ xyz \\s+ .* blah$", + RE_Options() + .set_caseless(true) + .set_extended(true) + .set_multiline(true)).PartialMatch(sometext); + + +SCANNING TEXT INCREMENTALLY + + The "Consume" operation may be useful if you want to repeatedly match + regular expressions at the front of a string and skip over them as they + match. This requires use of the "StringPiece" type, which represents a + sub-range of a real string. Like RE, StringPiece is defined in the + pcrecpp namespace. + + Example: read lines of the form "var = value" from a string. + string contents = ...; // Fill string somehow + pcrecpp::StringPiece input(contents); // Wrap in a StringPiece + + string var; + int value; + pcrecpp::RE re("(\\w+) = (\\d+)\n"); + while (re.Consume(&input, &var, &value)) { + ...; + } + + Each successful call to "Consume" will set "var/value", and also ad- + vance "input" so it points past the matched text. + + The "FindAndConsume" operation is similar to "Consume" but does not an- + chor your match at the beginning of the string. For example, you could + extract all words from a string by repeatedly calling + + pcrecpp::RE("(\\w+)").FindAndConsume(&input, &word) + + +PARSING HEX/OCTAL/C-RADIX NUMBERS + + By default, if you pass a pointer to a numeric value, the corresponding + text is interpreted as a base-10 number. You can instead wrap the + pointer with a call to one of the operators Hex(), Octal(), or CRadix() + to interpret the text in another base. The CRadix operator interprets + C-style "0" (base-8) and "0x" (base-16) prefixes, but defaults to + base-10. + + Example: + int a, b, c, d; + pcrecpp::RE re("(.*) (.*) (.*) (.*)"); + re.FullMatch("100 40 0100 0x40", + pcrecpp::Octal(&a), pcrecpp::Hex(&b), + pcrecpp::CRadix(&c), pcrecpp::CRadix(&d)); + + will leave 64 in a, b, c, and d. + + +REPLACING PARTS OF STRINGS + + You can replace the first match of "pattern" in "str" with "rewrite". + Within "rewrite", backslash-escaped digits (\1 to \9) can be used to + insert text matching corresponding parenthesized group from the pat- + tern. \0 in "rewrite" refers to the entire matching text. For example: + + string s = "yabba dabba doo"; + pcrecpp::RE("b+").Replace("d", &s); + + will leave "s" containing "yada dabba doo". The result is true if the + pattern matches and a replacement occurs, false otherwise. + + GlobalReplace is like Replace except that it replaces all occurrences + of the pattern in the string with the rewrite. Replacements are not + subject to re-matching. For example: + + string s = "yabba dabba doo"; + pcrecpp::RE("b+").GlobalReplace("d", &s); + + will leave "s" containing "yada dada doo". It returns the number of re- + placements made. + + Extract is like Replace, except that if the pattern matches, "rewrite" + is copied into "out" (an additional argument) with substitutions. The + non-matching portions of "text" are ignored. Returns true iff a match + occurred and the extraction happened successfully; if no match occurs, + the string is left unaffected. + + +AUTHOR + + The C++ wrapper was contributed by Google Inc. + Copyright (c) 2007 Google Inc. + + +REVISION + + Last updated: 08 January 2012 +------------------------------------------------------------------------------ + + +PCRESAMPLE(3) Library Functions Manual PCRESAMPLE(3) + + + +NAME + PCRE - Perl-compatible regular expressions + +PCRE SAMPLE PROGRAM + + A simple, complete demonstration program, to get you started with using + PCRE, is supplied in the file pcredemo.c in the PCRE distribution. A + listing of this program is given in the pcredemo documentation. If you + do not have a copy of the PCRE distribution, you can save this listing + to re-create pcredemo.c. + + The demonstration program, which uses the original PCRE 8-bit library, + compiles the regular expression that is its first argument, and matches + it against the subject string in its second argument. No PCRE options + are set, and default character tables are used. If matching succeeds, + the program outputs the portion of the subject that matched, together + with the contents of any captured substrings. + + If the -g option is given on the command line, the program then goes on + to check for further matches of the same regular expression in the same + subject string. The logic is a little bit tricky because of the possi- + bility of matching an empty string. Comments in the code explain what + is going on. + + If PCRE is installed in the standard include and library directories + for your operating system, you should be able to compile the demonstra- + tion program using this command: + + gcc -o pcredemo pcredemo.c -lpcre + + If PCRE is installed elsewhere, you may need to add additional options + to the command line. For example, on a Unix-like system that has PCRE + installed in /usr/local, you can compile the demonstration program us- + ing a command like this: + + gcc -o pcredemo -I/usr/local/include pcredemo.c \ + -L/usr/local/lib -lpcre + + In a Windows environment, if you want to statically link the program + against a non-dll pcre.a file, you must uncomment the line that defines + PCRE_STATIC before including pcre.h, because otherwise the pcre_mal- + loc() and pcre_free() exported functions will be declared __de- + clspec(dllimport), with unwanted results. + + Once you have compiled and linked the demonstration program, you can + run simple tests like this: + + ./pcredemo 'cat|dog' 'the cat sat on the mat' + ./pcredemo -g 'cat|dog' 'the dog sat on the cat' + + Note that there is a much more comprehensive test program, called + pcretest, which supports many more facilities for testing regular ex- + pressions and both PCRE libraries. The pcredemo program is provided as + a simple coding example. + + If you try to run pcredemo when PCRE is not installed in the standard + library directory, you may get an error like this on some operating + systems (e.g. Solaris): + + ld.so.1: a.out: fatal: libpcre.so.0: open failed: No such file or di- + rectory + + This is caused by the way shared library support works on those sys- + tems. You need to add + + -R/usr/local/lib + + (for example) to the compile command to get round this problem. + + +AUTHOR + + Philip Hazel + University Computing Service + Cambridge CB2 3QH, England. + + +REVISION + + Last updated: 10 January 2012 + Copyright (c) 1997-2012 University of Cambridge. +------------------------------------------------------------------------------ +PCRELIMITS(3) Library Functions Manual PCRELIMITS(3) + + + +NAME + PCRE - Perl-compatible regular expressions + +SIZE AND OTHER LIMITATIONS + + There are some size limitations in PCRE but it is hoped that they will + never in practice be relevant. + + The maximum length of a compiled pattern is approximately 64K data + units (bytes for the 8-bit library, 16-bit units for the 16-bit li- + brary, and 32-bit units for the 32-bit library) if PCRE is compiled + with the default internal linkage size, which is 2 bytes for the 8-bit + and 16-bit libraries, and 4 bytes for the 32-bit library. If you want + to process regular expressions that are truly enormous, you can compile + PCRE with an internal linkage size of 3 or 4 (when building the 16-bit + or 32-bit library, 3 is rounded up to 4). See the README file in the + source distribution and the pcrebuild documentation for details. In + these cases the limit is substantially larger. However, the speed of + execution is slower. + + All values in repeating quantifiers must be less than 65536. + + There is no limit to the number of parenthesized subpatterns, but there + can be no more than 65535 capturing subpatterns. There is, however, a + limit to the depth of nesting of parenthesized subpatterns of all + kinds. This is imposed in order to limit the amount of system stack + used at compile time. The limit can be specified when PCRE is built; + the default is 250. + + There is a limit to the number of forward references to subsequent sub- + patterns of around 200,000. Repeated forward references with fixed up- + per limits, for example, (?2){0,100} when subpattern number 2 is to the + right, are included in the count. There is no limit to the number of + backward references. + + The maximum length of name for a named subpattern is 32 characters, and + the maximum number of named subpatterns is 10000. + + The maximum length of a name in a (*MARK), (*PRUNE), (*SKIP), or + (*THEN) verb is 255 for the 8-bit library and 65535 for the 16-bit and + 32-bit libraries. + + The maximum length of a subject string is the largest positive number + that an integer variable can hold. However, when using the traditional + matching function, PCRE uses recursion to handle subpatterns and indef- + inite repetition. This means that the available stack space may limit + the size of a subject string that can be processed by certain patterns. + For a discussion of stack issues, see the pcrestack documentation. + + +AUTHOR + + Philip Hazel + University Computing Service + Cambridge CB2 3QH, England. + + +REVISION + + Last updated: 05 November 2013 + Copyright (c) 1997-2013 University of Cambridge. +------------------------------------------------------------------------------ + + +PCRESTACK(3) Library Functions Manual PCRESTACK(3) + + + +NAME + PCRE - Perl-compatible regular expressions + +PCRE DISCUSSION OF STACK USAGE + + When you call pcre[16|32]_exec(), it makes use of an internal function + called match(). This calls itself recursively at branch points in the + pattern, in order to remember the state of the match so that it can + back up and try a different alternative if the first one fails. As + matching proceeds deeper and deeper into the tree of possibilities, the + recursion depth increases. The match() function is also called in other + circumstances, for example, whenever a parenthesized sub-pattern is en- + tered, and in certain cases of repetition. + + Not all calls of match() increase the recursion depth; for an item such + as a* it may be called several times at the same level, after matching + different numbers of a's. Furthermore, in a number of cases where the + result of the recursive call would immediately be passed back as the + result of the current call (a "tail recursion"), the function is just + restarted instead. + + The above comments apply when pcre[16|32]_exec() is run in its normal + interpretive manner. If the pattern was studied with the + PCRE_STUDY_JIT_COMPILE option, and just-in-time compiling was success- + ful, and the options passed to pcre[16|32]_exec() were not incompati- + ble, the matching process uses the JIT-compiled code instead of the + match() function. In this case, the memory requirements are handled en- + tirely differently. See the pcrejit documentation for details. + + The pcre[16|32]_dfa_exec() function operates in an entirely different + way, and uses recursion only when there is a regular expression recur- + sion or subroutine call in the pattern. This includes the processing of + assertion and "once-only" subpatterns, which are handled like subrou- + tine calls. Normally, these are never very deep, and the limit on the + complexity of pcre[16|32]_dfa_exec() is controlled by the amount of + workspace it is given. However, it is possible to write patterns with + runaway infinite recursions; such patterns will cause + pcre[16|32]_dfa_exec() to run out of stack. At present, there is no + protection against this. + + The comments that follow do NOT apply to pcre[16|32]_dfa_exec(); they + are relevant only for pcre[16|32]_exec() without the JIT optimization. + + Reducing pcre[16|32]_exec()'s stack usage + + Each time that match() is actually called recursively, it uses memory + from the process stack. For certain kinds of pattern and data, very + large amounts of stack may be needed, despite the recognition of "tail + recursion". You can often reduce the amount of recursion, and there- + fore the amount of stack used, by modifying the pattern that is being + matched. Consider, for example, this pattern: + + ([^<]|<(?!inet))+ + + It matches from wherever it starts until it encounters " +. +. +.SH "PCRE 16-BIT API BASIC FUNCTIONS" +.rs +.sp +.nf +.B pcre16 *pcre16_compile(PCRE_SPTR16 \fIpattern\fP, int \fIoptions\fP, +.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," +.B " const unsigned char *\fItableptr\fP);" +.sp +.B pcre16 *pcre16_compile2(PCRE_SPTR16 \fIpattern\fP, int \fIoptions\fP, +.B " int *\fIerrorcodeptr\fP," +.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," +.B " const unsigned char *\fItableptr\fP);" +.sp +.B pcre16_extra *pcre16_study(const pcre16 *\fIcode\fP, int \fIoptions\fP, +.B " const char **\fIerrptr\fP);" +.sp +.B void pcre16_free_study(pcre16_extra *\fIextra\fP); +.sp +.B int pcre16_exec(const pcre16 *\fIcode\fP, "const pcre16_extra *\fIextra\fP," +.B " PCRE_SPTR16 \fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," +.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP);" +.sp +.B int pcre16_dfa_exec(const pcre16 *\fIcode\fP, "const pcre16_extra *\fIextra\fP," +.B " PCRE_SPTR16 \fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," +.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP," +.B " int *\fIworkspace\fP, int \fIwscount\fP);" +.fi +. +. +.SH "PCRE 16-BIT API STRING EXTRACTION FUNCTIONS" +.rs +.sp +.nf +.B int pcre16_copy_named_substring(const pcre16 *\fIcode\fP, +.B " PCRE_SPTR16 \fIsubject\fP, int *\fIovector\fP," +.B " int \fIstringcount\fP, PCRE_SPTR16 \fIstringname\fP," +.B " PCRE_UCHAR16 *\fIbuffer\fP, int \fIbuffersize\fP);" +.sp +.B int pcre16_copy_substring(PCRE_SPTR16 \fIsubject\fP, int *\fIovector\fP, +.B " int \fIstringcount\fP, int \fIstringnumber\fP, PCRE_UCHAR16 *\fIbuffer\fP," +.B " int \fIbuffersize\fP);" +.sp +.B int pcre16_get_named_substring(const pcre16 *\fIcode\fP, +.B " PCRE_SPTR16 \fIsubject\fP, int *\fIovector\fP," +.B " int \fIstringcount\fP, PCRE_SPTR16 \fIstringname\fP," +.B " PCRE_SPTR16 *\fIstringptr\fP);" +.sp +.B int pcre16_get_stringnumber(const pcre16 *\fIcode\fP, +.B " PCRE_SPTR16 \fIname\fP); +.sp +.B int pcre16_get_stringtable_entries(const pcre16 *\fIcode\fP, +.B " PCRE_SPTR16 \fIname\fP, PCRE_UCHAR16 **\fIfirst\fP, PCRE_UCHAR16 **\fIlast\fP);" +.sp +.B int pcre16_get_substring(PCRE_SPTR16 \fIsubject\fP, int *\fIovector\fP, +.B " int \fIstringcount\fP, int \fIstringnumber\fP," +.B " PCRE_SPTR16 *\fIstringptr\fP);" +.sp +.B int pcre16_get_substring_list(PCRE_SPTR16 \fIsubject\fP, +.B " int *\fIovector\fP, int \fIstringcount\fP, PCRE_SPTR16 **\fIlistptr\fP);" +.sp +.B void pcre16_free_substring(PCRE_SPTR16 \fIstringptr\fP); +.sp +.B void pcre16_free_substring_list(PCRE_SPTR16 *\fIstringptr\fP); +.fi +. +. +.SH "PCRE 16-BIT API AUXILIARY FUNCTIONS" +.rs +.sp +.nf +.B pcre16_jit_stack *pcre16_jit_stack_alloc(int \fIstartsize\fP, int \fImaxsize\fP); +.sp +.B void pcre16_jit_stack_free(pcre16_jit_stack *\fIstack\fP); +.sp +.B void pcre16_assign_jit_stack(pcre16_extra *\fIextra\fP, +.B " pcre16_jit_callback \fIcallback\fP, void *\fIdata\fP);" +.sp +.B const unsigned char *pcre16_maketables(void); +.sp +.B int pcre16_fullinfo(const pcre16 *\fIcode\fP, "const pcre16_extra *\fIextra\fP," +.B " int \fIwhat\fP, void *\fIwhere\fP);" +.sp +.B int pcre16_refcount(pcre16 *\fIcode\fP, int \fIadjust\fP); +.sp +.B int pcre16_config(int \fIwhat\fP, void *\fIwhere\fP); +.sp +.B const char *pcre16_version(void); +.sp +.B int pcre16_pattern_to_host_byte_order(pcre16 *\fIcode\fP, +.B " pcre16_extra *\fIextra\fP, const unsigned char *\fItables\fP);" +.fi +. +. +.SH "PCRE 16-BIT API INDIRECTED FUNCTIONS" +.rs +.sp +.nf +.B void *(*pcre16_malloc)(size_t); +.sp +.B void (*pcre16_free)(void *); +.sp +.B void *(*pcre16_stack_malloc)(size_t); +.sp +.B void (*pcre16_stack_free)(void *); +.sp +.B int (*pcre16_callout)(pcre16_callout_block *); +.fi +. +. +.SH "PCRE 16-BIT API 16-BIT-ONLY FUNCTION" +.rs +.sp +.nf +.B int pcre16_utf16_to_host_byte_order(PCRE_UCHAR16 *\fIoutput\fP, +.B " PCRE_SPTR16 \fIinput\fP, int \fIlength\fP, int *\fIbyte_order\fP," +.B " int \fIkeep_boms\fP);" +.fi +. +. +.SH "THE PCRE 16-BIT LIBRARY" +.rs +.sp +Starting with release 8.30, it is possible to compile a PCRE library that +supports 16-bit character strings, including UTF-16 strings, as well as or +instead of the original 8-bit library. The majority of the work to make this +possible was done by Zoltan Herczeg. The two libraries contain identical sets +of functions, used in exactly the same way. Only the names of the functions and +the data types of their arguments and results are different. To avoid +over-complication and reduce the documentation maintenance load, most of the +PCRE documentation describes the 8-bit library, with only occasional references +to the 16-bit library. This page describes what is different when you use the +16-bit library. +.P +WARNING: A single application can be linked with both libraries, but you must +take care when processing any particular pattern to use functions from just one +library. For example, if you want to study a pattern that was compiled with +\fBpcre16_compile()\fP, you must do so with \fBpcre16_study()\fP, not +\fBpcre_study()\fP, and you must free the study data with +\fBpcre16_free_study()\fP. +. +. +.SH "THE HEADER FILE" +.rs +.sp +There is only one header file, \fBpcre.h\fP. It contains prototypes for all the +functions in all libraries, as well as definitions of flags, structures, error +codes, etc. +. +. +.SH "THE LIBRARY NAME" +.rs +.sp +In Unix-like systems, the 16-bit library is called \fBlibpcre16\fP, and can +normally be accesss by adding \fB-lpcre16\fP to the command for linking an +application that uses PCRE. +. +. +.SH "STRING TYPES" +.rs +.sp +In the 8-bit library, strings are passed to PCRE library functions as vectors +of bytes with the C type "char *". In the 16-bit library, strings are passed as +vectors of unsigned 16-bit quantities. The macro PCRE_UCHAR16 specifies an +appropriate data type, and PCRE_SPTR16 is defined as "const PCRE_UCHAR16 *". In +very many environments, "short int" is a 16-bit data type. When PCRE is built, +it defines PCRE_UCHAR16 as "unsigned short int", but checks that it really is a +16-bit data type. If it is not, the build fails with an error message telling +the maintainer to modify the definition appropriately. +. +. +.SH "STRUCTURE TYPES" +.rs +.sp +The types of the opaque structures that are used for compiled 16-bit patterns +and JIT stacks are \fBpcre16\fP and \fBpcre16_jit_stack\fP respectively. The +type of the user-accessible structure that is returned by \fBpcre16_study()\fP +is \fBpcre16_extra\fP, and the type of the structure that is used for passing +data to a callout function is \fBpcre16_callout_block\fP. These structures +contain the same fields, with the same names, as their 8-bit counterparts. The +only difference is that pointers to character strings are 16-bit instead of +8-bit types. +. +. +.SH "16-BIT FUNCTIONS" +.rs +.sp +For every function in the 8-bit library there is a corresponding function in +the 16-bit library with a name that starts with \fBpcre16_\fP instead of +\fBpcre_\fP. The prototypes are listed above. In addition, there is one extra +function, \fBpcre16_utf16_to_host_byte_order()\fP. This is a utility function +that converts a UTF-16 character string to host byte order if necessary. The +other 16-bit functions expect the strings they are passed to be in host byte +order. +.P +The \fIinput\fP and \fIoutput\fP arguments of +\fBpcre16_utf16_to_host_byte_order()\fP may point to the same address, that is, +conversion in place is supported. The output buffer must be at least as long as +the input. +.P +The \fIlength\fP argument specifies the number of 16-bit data units in the +input string; a negative value specifies a zero-terminated string. +.P +If \fIbyte_order\fP is NULL, it is assumed that the string starts off in host +byte order. This may be changed by byte-order marks (BOMs) anywhere in the +string (commonly as the first character). +.P +If \fIbyte_order\fP is not NULL, a non-zero value of the integer to which it +points means that the input starts off in host byte order, otherwise the +opposite order is assumed. Again, BOMs in the string can change this. The final +byte order is passed back at the end of processing. +.P +If \fIkeep_boms\fP is not zero, byte-order mark characters (0xfeff) are copied +into the output string. Otherwise they are discarded. +.P +The result of the function is the number of 16-bit units placed into the output +buffer, including the zero terminator if the string was zero-terminated. +. +. +.SH "SUBJECT STRING OFFSETS" +.rs +.sp +The lengths and starting offsets of subject strings must be specified in 16-bit +data units, and the offsets within subject strings that are returned by the +matching functions are in also 16-bit units rather than bytes. +. +. +.SH "NAMED SUBPATTERNS" +.rs +.sp +The name-to-number translation table that is maintained for named subpatterns +uses 16-bit characters. The \fBpcre16_get_stringtable_entries()\fP function +returns the length of each entry in the table as the number of 16-bit data +units. +. +. +.SH "OPTION NAMES" +.rs +.sp +There are two new general option names, PCRE_UTF16 and PCRE_NO_UTF16_CHECK, +which correspond to PCRE_UTF8 and PCRE_NO_UTF8_CHECK in the 8-bit library. In +fact, these new options define the same bits in the options word. There is a +discussion about the +.\" HTML +.\" +validity of UTF-16 strings +.\" +in the +.\" HREF +\fBpcreunicode\fP +.\" +page. +.P +For the \fBpcre16_config()\fP function there is an option PCRE_CONFIG_UTF16 +that returns 1 if UTF-16 support is configured, otherwise 0. If this option is +given to \fBpcre_config()\fP or \fBpcre32_config()\fP, or if the +PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF32 option is given to \fBpcre16_config()\fP, +the result is the PCRE_ERROR_BADOPTION error. +. +. +.SH "CHARACTER CODES" +.rs +.sp +In 16-bit mode, when PCRE_UTF16 is not set, character values are treated in the +same way as in 8-bit, non UTF-8 mode, except, of course, that they can range +from 0 to 0xffff instead of 0 to 0xff. Character types for characters less than +0xff can therefore be influenced by the locale in the same way as before. +Characters greater than 0xff have only one case, and no "type" (such as letter +or digit). +.P +In UTF-16 mode, the character code is Unicode, in the range 0 to 0x10ffff, with +the exception of values in the range 0xd800 to 0xdfff because those are +"surrogate" values that are used in pairs to encode values greater than 0xffff. +.P +A UTF-16 string can indicate its endianness by special code knows as a +byte-order mark (BOM). The PCRE functions do not handle this, expecting strings +to be in host byte order. A utility function called +\fBpcre16_utf16_to_host_byte_order()\fP is provided to help with this (see +above). +. +. +.SH "ERROR NAMES" +.rs +.sp +The errors PCRE_ERROR_BADUTF16_OFFSET and PCRE_ERROR_SHORTUTF16 correspond to +their 8-bit counterparts. The error PCRE_ERROR_BADMODE is given when a compiled +pattern is passed to a function that processes patterns in the other +mode, for example, if a pattern compiled with \fBpcre_compile()\fP is passed to +\fBpcre16_exec()\fP. +.P +There are new error codes whose names begin with PCRE_UTF16_ERR for invalid +UTF-16 strings, corresponding to the PCRE_UTF8_ERR codes for UTF-8 strings that +are described in the section entitled +.\" HTML +.\" +"Reason codes for invalid UTF-8 strings" +.\" +in the main +.\" HREF +\fBpcreapi\fP +.\" +page. The UTF-16 errors are: +.sp + PCRE_UTF16_ERR1 Missing low surrogate at end of string + PCRE_UTF16_ERR2 Invalid low surrogate follows high surrogate + PCRE_UTF16_ERR3 Isolated low surrogate + PCRE_UTF16_ERR4 Non-character +. +. +.SH "ERROR TEXTS" +.rs +.sp +If there is an error while compiling a pattern, the error text that is passed +back by \fBpcre16_compile()\fP or \fBpcre16_compile2()\fP is still an 8-bit +character string, zero-terminated. +. +. +.SH "CALLOUTS" +.rs +.sp +The \fIsubject\fP and \fImark\fP fields in the callout block that is passed to +a callout function point to 16-bit vectors. +. +. +.SH "TESTING" +.rs +.sp +The \fBpcretest\fP program continues to operate with 8-bit input and output +files, but it can be used for testing the 16-bit library. If it is run with the +command line option \fB-16\fP, patterns and subject strings are converted from +8-bit to 16-bit before being passed to PCRE, and the 16-bit library functions +are used instead of the 8-bit ones. Returned 16-bit strings are converted to +8-bit for output. If both the 8-bit and the 32-bit libraries were not compiled, +\fBpcretest\fP defaults to 16-bit and the \fB-16\fP option is ignored. +.P +When PCRE is being built, the \fBRunTest\fP script that is called by "make +check" uses the \fBpcretest\fP \fB-C\fP option to discover which of the 8-bit, +16-bit and 32-bit libraries has been built, and runs the tests appropriately. +. +. +.SH "NOT SUPPORTED IN 16-BIT MODE" +.rs +.sp +Not all the features of the 8-bit library are available with the 16-bit +library. The C++ and POSIX wrapper functions support only the 8-bit library, +and the \fBpcregrep\fP program is at present 8-bit only. +. +. +.SH AUTHOR +.rs +.sp +.nf +Philip Hazel +University Computing Service +Cambridge CB2 3QH, England. +.fi +. +. +.SH REVISION +.rs +.sp +.nf +Last updated: 12 May 2013 +Copyright (c) 1997-2013 University of Cambridge. +.fi diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre32.3 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre32.3 new file mode 100755 index 000000000..7cde8c087 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre32.3 @@ -0,0 +1,369 @@ +.TH PCRE 3 "12 May 2013" "PCRE 8.33" +.SH NAME +PCRE - Perl-compatible regular expressions +.sp +.B #include +. +. +.SH "PCRE 32-BIT API BASIC FUNCTIONS" +.rs +.sp +.nf +.B pcre32 *pcre32_compile(PCRE_SPTR32 \fIpattern\fP, int \fIoptions\fP, +.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," +.B " const unsigned char *\fItableptr\fP);" +.sp +.B pcre32 *pcre32_compile2(PCRE_SPTR32 \fIpattern\fP, int \fIoptions\fP, +.B " int *\fIerrorcodeptr\fP," +.B " const unsigned char *\fItableptr\fP);" +.sp +.B pcre32_extra *pcre32_study(const pcre32 *\fIcode\fP, int \fIoptions\fP, +.B " const char **\fIerrptr\fP);" +.sp +.B void pcre32_free_study(pcre32_extra *\fIextra\fP); +.sp +.B int pcre32_exec(const pcre32 *\fIcode\fP, "const pcre32_extra *\fIextra\fP," +.B " PCRE_SPTR32 \fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," +.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP);" +.sp +.B int pcre32_dfa_exec(const pcre32 *\fIcode\fP, "const pcre32_extra *\fIextra\fP," +.B " PCRE_SPTR32 \fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," +.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP," +.B " int *\fIworkspace\fP, int \fIwscount\fP);" +.fi +. +. +.SH "PCRE 32-BIT API STRING EXTRACTION FUNCTIONS" +.rs +.sp +.nf +.B int pcre32_copy_named_substring(const pcre32 *\fIcode\fP, +.B " PCRE_SPTR32 \fIsubject\fP, int *\fIovector\fP," +.B " int \fIstringcount\fP, PCRE_SPTR32 \fIstringname\fP," +.B " PCRE_UCHAR32 *\fIbuffer\fP, int \fIbuffersize\fP);" +.sp +.B int pcre32_copy_substring(PCRE_SPTR32 \fIsubject\fP, int *\fIovector\fP, +.B " int \fIstringcount\fP, int \fIstringnumber\fP, PCRE_UCHAR32 *\fIbuffer\fP," +.B " int \fIbuffersize\fP);" +.sp +.B int pcre32_get_named_substring(const pcre32 *\fIcode\fP, +.B " PCRE_SPTR32 \fIsubject\fP, int *\fIovector\fP," +.B " int \fIstringcount\fP, PCRE_SPTR32 \fIstringname\fP," +.B " PCRE_SPTR32 *\fIstringptr\fP);" +.sp +.B int pcre32_get_stringnumber(const pcre32 *\fIcode\fP, +.B " PCRE_SPTR32 \fIname\fP);" +.sp +.B int pcre32_get_stringtable_entries(const pcre32 *\fIcode\fP, +.B " PCRE_SPTR32 \fIname\fP, PCRE_UCHAR32 **\fIfirst\fP, PCRE_UCHAR32 **\fIlast\fP);" +.sp +.B int pcre32_get_substring(PCRE_SPTR32 \fIsubject\fP, int *\fIovector\fP, +.B " int \fIstringcount\fP, int \fIstringnumber\fP," +.B " PCRE_SPTR32 *\fIstringptr\fP);" +.sp +.B int pcre32_get_substring_list(PCRE_SPTR32 \fIsubject\fP, +.B " int *\fIovector\fP, int \fIstringcount\fP, PCRE_SPTR32 **\fIlistptr\fP);" +.sp +.B void pcre32_free_substring(PCRE_SPTR32 \fIstringptr\fP); +.sp +.B void pcre32_free_substring_list(PCRE_SPTR32 *\fIstringptr\fP); +.fi +. +. +.SH "PCRE 32-BIT API AUXILIARY FUNCTIONS" +.rs +.sp +.nf +.B pcre32_jit_stack *pcre32_jit_stack_alloc(int \fIstartsize\fP, int \fImaxsize\fP); +.sp +.B void pcre32_jit_stack_free(pcre32_jit_stack *\fIstack\fP); +.sp +.B void pcre32_assign_jit_stack(pcre32_extra *\fIextra\fP, +.B " pcre32_jit_callback \fIcallback\fP, void *\fIdata\fP);" +.sp +.B const unsigned char *pcre32_maketables(void); +.sp +.B int pcre32_fullinfo(const pcre32 *\fIcode\fP, "const pcre32_extra *\fIextra\fP," +.B " int \fIwhat\fP, void *\fIwhere\fP);" +.sp +.B int pcre32_refcount(pcre32 *\fIcode\fP, int \fIadjust\fP); +.sp +.B int pcre32_config(int \fIwhat\fP, void *\fIwhere\fP); +.sp +.B const char *pcre32_version(void); +.sp +.B int pcre32_pattern_to_host_byte_order(pcre32 *\fIcode\fP, +.B " pcre32_extra *\fIextra\fP, const unsigned char *\fItables\fP);" +.fi +. +. +.SH "PCRE 32-BIT API INDIRECTED FUNCTIONS" +.rs +.sp +.nf +.B void *(*pcre32_malloc)(size_t); +.sp +.B void (*pcre32_free)(void *); +.sp +.B void *(*pcre32_stack_malloc)(size_t); +.sp +.B void (*pcre32_stack_free)(void *); +.sp +.B int (*pcre32_callout)(pcre32_callout_block *); +.fi +. +. +.SH "PCRE 32-BIT API 32-BIT-ONLY FUNCTION" +.rs +.sp +.nf +.B int pcre32_utf32_to_host_byte_order(PCRE_UCHAR32 *\fIoutput\fP, +.B " PCRE_SPTR32 \fIinput\fP, int \fIlength\fP, int *\fIbyte_order\fP," +.B " int \fIkeep_boms\fP);" +.fi +. +. +.SH "THE PCRE 32-BIT LIBRARY" +.rs +.sp +Starting with release 8.32, it is possible to compile a PCRE library that +supports 32-bit character strings, including UTF-32 strings, as well as or +instead of the original 8-bit library. This work was done by Christian Persch, +based on the work done by Zoltan Herczeg for the 16-bit library. All three +libraries contain identical sets of functions, used in exactly the same way. +Only the names of the functions and the data types of their arguments and +results are different. To avoid over-complication and reduce the documentation +maintenance load, most of the PCRE documentation describes the 8-bit library, +with only occasional references to the 16-bit and 32-bit libraries. This page +describes what is different when you use the 32-bit library. +.P +WARNING: A single application can be linked with all or any of the three +libraries, but you must take care when processing any particular pattern +to use functions from just one library. For example, if you want to study +a pattern that was compiled with \fBpcre32_compile()\fP, you must do so +with \fBpcre32_study()\fP, not \fBpcre_study()\fP, and you must free the +study data with \fBpcre32_free_study()\fP. +. +. +.SH "THE HEADER FILE" +.rs +.sp +There is only one header file, \fBpcre.h\fP. It contains prototypes for all the +functions in all libraries, as well as definitions of flags, structures, error +codes, etc. +. +. +.SH "THE LIBRARY NAME" +.rs +.sp +In Unix-like systems, the 32-bit library is called \fBlibpcre32\fP, and can +normally be accesss by adding \fB-lpcre32\fP to the command for linking an +application that uses PCRE. +. +. +.SH "STRING TYPES" +.rs +.sp +In the 8-bit library, strings are passed to PCRE library functions as vectors +of bytes with the C type "char *". In the 32-bit library, strings are passed as +vectors of unsigned 32-bit quantities. The macro PCRE_UCHAR32 specifies an +appropriate data type, and PCRE_SPTR32 is defined as "const PCRE_UCHAR32 *". In +very many environments, "unsigned int" is a 32-bit data type. When PCRE is +built, it defines PCRE_UCHAR32 as "unsigned int", but checks that it really is +a 32-bit data type. If it is not, the build fails with an error message telling +the maintainer to modify the definition appropriately. +. +. +.SH "STRUCTURE TYPES" +.rs +.sp +The types of the opaque structures that are used for compiled 32-bit patterns +and JIT stacks are \fBpcre32\fP and \fBpcre32_jit_stack\fP respectively. The +type of the user-accessible structure that is returned by \fBpcre32_study()\fP +is \fBpcre32_extra\fP, and the type of the structure that is used for passing +data to a callout function is \fBpcre32_callout_block\fP. These structures +contain the same fields, with the same names, as their 8-bit counterparts. The +only difference is that pointers to character strings are 32-bit instead of +8-bit types. +. +. +.SH "32-BIT FUNCTIONS" +.rs +.sp +For every function in the 8-bit library there is a corresponding function in +the 32-bit library with a name that starts with \fBpcre32_\fP instead of +\fBpcre_\fP. The prototypes are listed above. In addition, there is one extra +function, \fBpcre32_utf32_to_host_byte_order()\fP. This is a utility function +that converts a UTF-32 character string to host byte order if necessary. The +other 32-bit functions expect the strings they are passed to be in host byte +order. +.P +The \fIinput\fP and \fIoutput\fP arguments of +\fBpcre32_utf32_to_host_byte_order()\fP may point to the same address, that is, +conversion in place is supported. The output buffer must be at least as long as +the input. +.P +The \fIlength\fP argument specifies the number of 32-bit data units in the +input string; a negative value specifies a zero-terminated string. +.P +If \fIbyte_order\fP is NULL, it is assumed that the string starts off in host +byte order. This may be changed by byte-order marks (BOMs) anywhere in the +string (commonly as the first character). +.P +If \fIbyte_order\fP is not NULL, a non-zero value of the integer to which it +points means that the input starts off in host byte order, otherwise the +opposite order is assumed. Again, BOMs in the string can change this. The final +byte order is passed back at the end of processing. +.P +If \fIkeep_boms\fP is not zero, byte-order mark characters (0xfeff) are copied +into the output string. Otherwise they are discarded. +.P +The result of the function is the number of 32-bit units placed into the output +buffer, including the zero terminator if the string was zero-terminated. +. +. +.SH "SUBJECT STRING OFFSETS" +.rs +.sp +The lengths and starting offsets of subject strings must be specified in 32-bit +data units, and the offsets within subject strings that are returned by the +matching functions are in also 32-bit units rather than bytes. +. +. +.SH "NAMED SUBPATTERNS" +.rs +.sp +The name-to-number translation table that is maintained for named subpatterns +uses 32-bit characters. The \fBpcre32_get_stringtable_entries()\fP function +returns the length of each entry in the table as the number of 32-bit data +units. +. +. +.SH "OPTION NAMES" +.rs +.sp +There are two new general option names, PCRE_UTF32 and PCRE_NO_UTF32_CHECK, +which correspond to PCRE_UTF8 and PCRE_NO_UTF8_CHECK in the 8-bit library. In +fact, these new options define the same bits in the options word. There is a +discussion about the +.\" HTML +.\" +validity of UTF-32 strings +.\" +in the +.\" HREF +\fBpcreunicode\fP +.\" +page. +.P +For the \fBpcre32_config()\fP function there is an option PCRE_CONFIG_UTF32 +that returns 1 if UTF-32 support is configured, otherwise 0. If this option is +given to \fBpcre_config()\fP or \fBpcre16_config()\fP, or if the +PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF16 option is given to \fBpcre32_config()\fP, +the result is the PCRE_ERROR_BADOPTION error. +. +. +.SH "CHARACTER CODES" +.rs +.sp +In 32-bit mode, when PCRE_UTF32 is not set, character values are treated in the +same way as in 8-bit, non UTF-8 mode, except, of course, that they can range +from 0 to 0x7fffffff instead of 0 to 0xff. Character types for characters less +than 0xff can therefore be influenced by the locale in the same way as before. +Characters greater than 0xff have only one case, and no "type" (such as letter +or digit). +.P +In UTF-32 mode, the character code is Unicode, in the range 0 to 0x10ffff, with +the exception of values in the range 0xd800 to 0xdfff because those are +"surrogate" values that are ill-formed in UTF-32. +.P +A UTF-32 string can indicate its endianness by special code knows as a +byte-order mark (BOM). The PCRE functions do not handle this, expecting strings +to be in host byte order. A utility function called +\fBpcre32_utf32_to_host_byte_order()\fP is provided to help with this (see +above). +. +. +.SH "ERROR NAMES" +.rs +.sp +The error PCRE_ERROR_BADUTF32 corresponds to its 8-bit counterpart. +The error PCRE_ERROR_BADMODE is given when a compiled +pattern is passed to a function that processes patterns in the other +mode, for example, if a pattern compiled with \fBpcre_compile()\fP is passed to +\fBpcre32_exec()\fP. +.P +There are new error codes whose names begin with PCRE_UTF32_ERR for invalid +UTF-32 strings, corresponding to the PCRE_UTF8_ERR codes for UTF-8 strings that +are described in the section entitled +.\" HTML +.\" +"Reason codes for invalid UTF-8 strings" +.\" +in the main +.\" HREF +\fBpcreapi\fP +.\" +page. The UTF-32 errors are: +.sp + PCRE_UTF32_ERR1 Surrogate character (range from 0xd800 to 0xdfff) + PCRE_UTF32_ERR2 Non-character + PCRE_UTF32_ERR3 Character > 0x10ffff +. +. +.SH "ERROR TEXTS" +.rs +.sp +If there is an error while compiling a pattern, the error text that is passed +back by \fBpcre32_compile()\fP or \fBpcre32_compile2()\fP is still an 8-bit +character string, zero-terminated. +. +. +.SH "CALLOUTS" +.rs +.sp +The \fIsubject\fP and \fImark\fP fields in the callout block that is passed to +a callout function point to 32-bit vectors. +. +. +.SH "TESTING" +.rs +.sp +The \fBpcretest\fP program continues to operate with 8-bit input and output +files, but it can be used for testing the 32-bit library. If it is run with the +command line option \fB-32\fP, patterns and subject strings are converted from +8-bit to 32-bit before being passed to PCRE, and the 32-bit library functions +are used instead of the 8-bit ones. Returned 32-bit strings are converted to +8-bit for output. If both the 8-bit and the 16-bit libraries were not compiled, +\fBpcretest\fP defaults to 32-bit and the \fB-32\fP option is ignored. +.P +When PCRE is being built, the \fBRunTest\fP script that is called by "make +check" uses the \fBpcretest\fP \fB-C\fP option to discover which of the 8-bit, +16-bit and 32-bit libraries has been built, and runs the tests appropriately. +. +. +.SH "NOT SUPPORTED IN 32-BIT MODE" +.rs +.sp +Not all the features of the 8-bit library are available with the 32-bit +library. The C++ and POSIX wrapper functions support only the 8-bit library, +and the \fBpcregrep\fP program is at present 8-bit only. +. +. +.SH AUTHOR +.rs +.sp +.nf +Philip Hazel +University Computing Service +Cambridge CB2 3QH, England. +.fi +. +. +.SH REVISION +.rs +.sp +.nf +Last updated: 12 May 2013 +Copyright (c) 1997-2013 University of Cambridge. +.fi diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_assign_jit_stack.3 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_assign_jit_stack.3 new file mode 100755 index 000000000..0ecf6f2c6 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_assign_jit_stack.3 @@ -0,0 +1,59 @@ +.TH PCRE_ASSIGN_JIT_STACK 3 "24 June 2012" "PCRE 8.30" +.SH NAME +PCRE - Perl-compatible regular expressions +.SH SYNOPSIS +.rs +.sp +.B #include +.PP +.nf +.B void pcre_assign_jit_stack(pcre_extra *\fIextra\fP, +.B " pcre_jit_callback \fIcallback\fP, void *\fIdata\fP);" +.sp +.B void pcre16_assign_jit_stack(pcre16_extra *\fIextra\fP, +.B " pcre16_jit_callback \fIcallback\fP, void *\fIdata\fP);" +.sp +.B void pcre32_assign_jit_stack(pcre32_extra *\fIextra\fP, +.B " pcre32_jit_callback \fIcallback\fP, void *\fIdata\fP);" +.fi +. +.SH DESCRIPTION +.rs +.sp +This function provides control over the memory used as a stack at run-time by a +call to \fBpcre[16|32]_exec()\fP with a pattern that has been successfully +compiled with JIT optimization. The arguments are: +.sp + extra the data pointer returned by \fBpcre[16|32]_study()\fP + callback a callback function + data a JIT stack or a value to be passed to the callback + function +.P +If \fIcallback\fP is NULL and \fIdata\fP is NULL, an internal 32K block on +the machine stack is used. +.P +If \fIcallback\fP is NULL and \fIdata\fP is not NULL, \fIdata\fP must +be a valid JIT stack, the result of calling \fBpcre[16|32]_jit_stack_alloc()\fP. +.P +If \fIcallback\fP not NULL, it is called with \fIdata\fP as an argument at +the start of matching, in order to set up a JIT stack. If the result is NULL, +the internal 32K stack is used; otherwise the return value must be a valid JIT +stack, the result of calling \fBpcre[16|32]_jit_stack_alloc()\fP. +.P +You may safely assign the same JIT stack to multiple patterns, as long as they +are all matched in the same thread. In a multithread application, each thread +must use its own JIT stack. For more details, see the +.\" HREF +\fBpcrejit\fP +.\" +page. +.P +There is a complete description of the PCRE native API in the +.\" HREF +\fBpcreapi\fP +.\" +page and a description of the POSIX API in the +.\" HREF +\fBpcreposix\fP +.\" +page. diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_compile.3 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_compile.3 new file mode 100755 index 000000000..5c16ebe26 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_compile.3 @@ -0,0 +1,96 @@ +.TH PCRE_COMPILE 3 "01 October 2013" "PCRE 8.34" +.SH NAME +PCRE - Perl-compatible regular expressions +.SH SYNOPSIS +.rs +.sp +.B #include +.PP +.nf +.B pcre *pcre_compile(const char *\fIpattern\fP, int \fIoptions\fP, +.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," +.B " const unsigned char *\fItableptr\fP);" +.sp +.B pcre16 *pcre16_compile(PCRE_SPTR16 \fIpattern\fP, int \fIoptions\fP, +.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," +.B " const unsigned char *\fItableptr\fP);" +.sp +.B pcre32 *pcre32_compile(PCRE_SPTR32 \fIpattern\fP, int \fIoptions\fP, +.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," +.B " const unsigned char *\fItableptr\fP);" +.fi +. +.SH DESCRIPTION +.rs +.sp +This function compiles a regular expression into an internal form. It is the +same as \fBpcre[16|32]_compile2()\fP, except for the absence of the +\fIerrorcodeptr\fP argument. Its arguments are: +.sp + \fIpattern\fP A zero-terminated string containing the + regular expression to be compiled + \fIoptions\fP Zero or more option bits + \fIerrptr\fP Where to put an error message + \fIerroffset\fP Offset in pattern where error was found + \fItableptr\fP Pointer to character tables, or NULL to + use the built-in default +.sp +The option bits are: +.sp + PCRE_ANCHORED Force pattern anchoring + PCRE_AUTO_CALLOUT Compile automatic callouts + PCRE_BSR_ANYCRLF \eR matches only CR, LF, or CRLF + PCRE_BSR_UNICODE \eR matches all Unicode line endings + PCRE_CASELESS Do caseless matching + PCRE_DOLLAR_ENDONLY $ not to match newline at end + PCRE_DOTALL . matches anything including NL + PCRE_DUPNAMES Allow duplicate names for subpatterns + PCRE_EXTENDED Ignore white space and # comments + PCRE_EXTRA PCRE extra features + (not much use currently) + PCRE_FIRSTLINE Force matching to be before newline + PCRE_JAVASCRIPT_COMPAT JavaScript compatibility + PCRE_MULTILINE ^ and $ match newlines within data + PCRE_NEVER_UTF Lock out UTF, e.g. via (*UTF) + PCRE_NEWLINE_ANY Recognize any Unicode newline sequence + PCRE_NEWLINE_ANYCRLF Recognize CR, LF, and CRLF as newline + sequences + PCRE_NEWLINE_CR Set CR as the newline sequence + PCRE_NEWLINE_CRLF Set CRLF as the newline sequence + PCRE_NEWLINE_LF Set LF as the newline sequence + PCRE_NO_AUTO_CAPTURE Disable numbered capturing paren- + theses (named ones available) + PCRE_NO_AUTO_POSSESS Disable auto-possessification + PCRE_NO_START_OPTIMIZE Disable match-time start optimizations + PCRE_NO_UTF16_CHECK Do not check the pattern for UTF-16 + validity (only relevant if + PCRE_UTF16 is set) + PCRE_NO_UTF32_CHECK Do not check the pattern for UTF-32 + validity (only relevant if + PCRE_UTF32 is set) + PCRE_NO_UTF8_CHECK Do not check the pattern for UTF-8 + validity (only relevant if + PCRE_UTF8 is set) + PCRE_UCP Use Unicode properties for \ed, \ew, etc. + PCRE_UNGREEDY Invert greediness of quantifiers + PCRE_UTF16 Run in \fBpcre16_compile()\fP UTF-16 mode + PCRE_UTF32 Run in \fBpcre32_compile()\fP UTF-32 mode + PCRE_UTF8 Run in \fBpcre_compile()\fP UTF-8 mode +.sp +PCRE must be built with UTF support in order to use PCRE_UTF8/16/32 and +PCRE_NO_UTF8/16/32_CHECK, and with UCP support if PCRE_UCP is used. +.P +The yield of the function is a pointer to a private data structure that +contains the compiled pattern, or NULL if an error was detected. Note that +compiling regular expressions with one version of PCRE for use with a different +version is not guaranteed to work and may cause crashes. +.P +There is a complete description of the PCRE native API in the +.\" HREF +\fBpcreapi\fP +.\" +page and a description of the POSIX API in the +.\" HREF +\fBpcreposix\fP +.\" +page. diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_compile2.3 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_compile2.3 new file mode 100755 index 000000000..377420180 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_compile2.3 @@ -0,0 +1,101 @@ +.TH PCRE_COMPILE2 3 "01 October 2013" "PCRE 8.34" +.SH NAME +PCRE - Perl-compatible regular expressions +.SH SYNOPSIS +.rs +.sp +.B #include +.PP +.nf +.B pcre *pcre_compile2(const char *\fIpattern\fP, int \fIoptions\fP, +.B " int *\fIerrorcodeptr\fP," +.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," +.B " const unsigned char *\fItableptr\fP);" +.sp +.B pcre16 *pcre16_compile2(PCRE_SPTR16 \fIpattern\fP, int \fIoptions\fP, +.B " int *\fIerrorcodeptr\fP," +.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," +.B " const unsigned char *\fItableptr\fP);" +.sp +.B pcre32 *pcre32_compile2(PCRE_SPTR32 \fIpattern\fP, int \fIoptions\fP, +.B " int *\fIerrorcodeptr\fP,£ +.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," +.B " const unsigned char *\fItableptr\fP);" +.fi +. +.SH DESCRIPTION +.rs +.sp +This function compiles a regular expression into an internal form. It is the +same as \fBpcre[16|32]_compile()\fP, except for the addition of the +\fIerrorcodeptr\fP argument. The arguments are: +. +.sp + \fIpattern\fP A zero-terminated string containing the + regular expression to be compiled + \fIoptions\fP Zero or more option bits + \fIerrorcodeptr\fP Where to put an error code + \fIerrptr\fP Where to put an error message + \fIerroffset\fP Offset in pattern where error was found + \fItableptr\fP Pointer to character tables, or NULL to + use the built-in default +.sp +The option bits are: +.sp + PCRE_ANCHORED Force pattern anchoring + PCRE_AUTO_CALLOUT Compile automatic callouts + PCRE_BSR_ANYCRLF \eR matches only CR, LF, or CRLF + PCRE_BSR_UNICODE \eR matches all Unicode line endings + PCRE_CASELESS Do caseless matching + PCRE_DOLLAR_ENDONLY $ not to match newline at end + PCRE_DOTALL . matches anything including NL + PCRE_DUPNAMES Allow duplicate names for subpatterns + PCRE_EXTENDED Ignore white space and # comments + PCRE_EXTRA PCRE extra features + (not much use currently) + PCRE_FIRSTLINE Force matching to be before newline + PCRE_JAVASCRIPT_COMPAT JavaScript compatibility + PCRE_MULTILINE ^ and $ match newlines within data + PCRE_NEVER_UTF Lock out UTF, e.g. via (*UTF) + PCRE_NEWLINE_ANY Recognize any Unicode newline sequence + PCRE_NEWLINE_ANYCRLF Recognize CR, LF, and CRLF as newline + sequences + PCRE_NEWLINE_CR Set CR as the newline sequence + PCRE_NEWLINE_CRLF Set CRLF as the newline sequence + PCRE_NEWLINE_LF Set LF as the newline sequence + PCRE_NO_AUTO_CAPTURE Disable numbered capturing paren- + theses (named ones available) + PCRE_NO_AUTO_POSSESS Disable auto-possessification + PCRE_NO_START_OPTIMIZE Disable match-time start optimizations + PCRE_NO_UTF16_CHECK Do not check the pattern for UTF-16 + validity (only relevant if + PCRE_UTF16 is set) + PCRE_NO_UTF32_CHECK Do not check the pattern for UTF-32 + validity (only relevant if + PCRE_UTF32 is set) + PCRE_NO_UTF8_CHECK Do not check the pattern for UTF-8 + validity (only relevant if + PCRE_UTF8 is set) + PCRE_UCP Use Unicode properties for \ed, \ew, etc. + PCRE_UNGREEDY Invert greediness of quantifiers + PCRE_UTF16 Run \fBpcre16_compile()\fP in UTF-16 mode + PCRE_UTF32 Run \fBpcre32_compile()\fP in UTF-32 mode + PCRE_UTF8 Run \fBpcre_compile()\fP in UTF-8 mode +.sp +PCRE must be built with UTF support in order to use PCRE_UTF8/16/32 and +PCRE_NO_UTF8/16/32_CHECK, and with UCP support if PCRE_UCP is used. +.P +The yield of the function is a pointer to a private data structure that +contains the compiled pattern, or NULL if an error was detected. Note that +compiling regular expressions with one version of PCRE for use with a different +version is not guaranteed to work and may cause crashes. +.P +There is a complete description of the PCRE native API in the +.\" HREF +\fBpcreapi\fP +.\" +page and a description of the POSIX API in the +.\" HREF +\fBpcreposix\fP +.\" +page. diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_config.3 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_config.3 new file mode 100755 index 000000000..d14ffdade --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_config.3 @@ -0,0 +1,79 @@ +.TH PCRE_CONFIG 3 "20 April 2014" "PCRE 8.36" +.SH NAME +PCRE - Perl-compatible regular expressions +.SH SYNOPSIS +.rs +.sp +.B #include +.PP +.SM +.B int pcre_config(int \fIwhat\fP, void *\fIwhere\fP); +.PP +.B int pcre16_config(int \fIwhat\fP, void *\fIwhere\fP); +.PP +.B int pcre32_config(int \fIwhat\fP, void *\fIwhere\fP); +. +.SH DESCRIPTION +.rs +.sp +This function makes it possible for a client program to find out which optional +features are available in the version of the PCRE library it is using. The +arguments are as follows: +.sp + \fIwhat\fP A code specifying what information is required + \fIwhere\fP Points to where to put the data +.sp +The \fIwhere\fP argument must point to an integer variable, except for +PCRE_CONFIG_MATCH_LIMIT, PCRE_CONFIG_MATCH_LIMIT_RECURSION, and +PCRE_CONFIG_PARENS_LIMIT, when it must point to an unsigned long integer, +and for PCRE_CONFIG_JITTARGET, when it must point to a const char*. +The available codes are: +.sp + PCRE_CONFIG_JIT Availability of just-in-time compiler + support (1=yes 0=no) + PCRE_CONFIG_JITTARGET String containing information about the + target architecture for the JIT compiler, + or NULL if there is no JIT support + PCRE_CONFIG_LINK_SIZE Internal link size: 2, 3, or 4 + PCRE_CONFIG_PARENS_LIMIT Parentheses nesting limit + PCRE_CONFIG_MATCH_LIMIT Internal resource limit + PCRE_CONFIG_MATCH_LIMIT_RECURSION + Internal recursion depth limit + PCRE_CONFIG_NEWLINE Value of the default newline sequence: + 13 (0x000d) for CR + 10 (0x000a) for LF + 3338 (0x0d0a) for CRLF + -2 for ANYCRLF + -1 for ANY + PCRE_CONFIG_BSR Indicates what \eR matches by default: + 0 all Unicode line endings + 1 CR, LF, or CRLF only + PCRE_CONFIG_POSIX_MALLOC_THRESHOLD + Threshold of return slots, above which + \fBmalloc()\fP is used by the POSIX API + PCRE_CONFIG_STACKRECURSE Recursion implementation (1=stack 0=heap) + PCRE_CONFIG_UTF16 Availability of UTF-16 support (1=yes + 0=no); option for \fBpcre16_config()\fP + PCRE_CONFIG_UTF32 Availability of UTF-32 support (1=yes + 0=no); option for \fBpcre32_config()\fP + PCRE_CONFIG_UTF8 Availability of UTF-8 support (1=yes 0=no); + option for \fBpcre_config()\fP + PCRE_CONFIG_UNICODE_PROPERTIES + Availability of Unicode property support + (1=yes 0=no) +.sp +The function yields 0 on success or PCRE_ERROR_BADOPTION otherwise. That error +is also given if PCRE_CONFIG_UTF16 or PCRE_CONFIG_UTF32 is passed to +\fBpcre_config()\fP, if PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF32 is passed to +\fBpcre16_config()\fP, or if PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF16 is passed to +\fBpcre32_config()\fP. +.P +There is a complete description of the PCRE native API in the +.\" HREF +\fBpcreapi\fP +.\" +page and a description of the POSIX API in the +.\" HREF +\fBpcreposix\fP +.\" +page. diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_copy_named_substring.3 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_copy_named_substring.3 new file mode 100755 index 000000000..52582aecb --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_copy_named_substring.3 @@ -0,0 +1,51 @@ +.TH PCRE_COPY_NAMED_SUBSTRING 3 "24 June 2012" "PCRE 8.30" +.SH NAME +PCRE - Perl-compatible regular expressions +.SH SYNOPSIS +.rs +.sp +.B #include +.PP +.nf +.B int pcre_copy_named_substring(const pcre *\fIcode\fP, +.B " const char *\fIsubject\fP, int *\fIovector\fP," +.B " int \fIstringcount\fP, const char *\fIstringname\fP," +.B " char *\fIbuffer\fP, int \fIbuffersize\fP);" +.sp +.B int pcre16_copy_named_substring(const pcre16 *\fIcode\fP, +.B " PCRE_SPTR16 \fIsubject\fP, int *\fIovector\fP," +.B " int \fIstringcount\fP, PCRE_SPTR16 \fIstringname\fP," +.B " PCRE_UCHAR16 *\fIbuffer\fP, int \fIbuffersize\fP);" +.sp +.B int pcre32_copy_named_substring(const pcre32 *\fIcode\fP, +.B " PCRE_SPTR32 \fIsubject\fP, int *\fIovector\fP," +.B " int \fIstringcount\fP, PCRE_SPTR32 \fIstringname\fP," +.B " PCRE_UCHAR32 *\fIbuffer\fP, int \fIbuffersize\fP);" +.fi +. +.SH DESCRIPTION +.rs +.sp +This is a convenience function for extracting a captured substring, identified +by name, into a given buffer. The arguments are: +.sp + \fIcode\fP Pattern that was successfully matched + \fIsubject\fP Subject that has been successfully matched + \fIovector\fP Offset vector that \fBpcre[16|32]_exec()\fP used + \fIstringcount\fP Value returned by \fBpcre[16|32]_exec()\fP + \fIstringname\fP Name of the required substring + \fIbuffer\fP Buffer to receive the string + \fIbuffersize\fP Size of buffer +.sp +The yield is the length of the substring, PCRE_ERROR_NOMEMORY if the buffer was +too small, or PCRE_ERROR_NOSUBSTRING if the string name is invalid. +.P +There is a complete description of the PCRE native API in the +.\" HREF +\fBpcreapi\fP +.\" +page and a description of the POSIX API in the +.\" HREF +\fBpcreposix\fP +.\" +page. diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_copy_substring.3 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_copy_substring.3 new file mode 100755 index 000000000..83af6e800 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_copy_substring.3 @@ -0,0 +1,47 @@ +.TH PCRE_COPY_SUBSTRING 3 "24 June 2012" "PCRE 8.30" +.SH NAME +PCRE - Perl-compatible regular expressions +.SH SYNOPSIS +.rs +.sp +.B #include +.PP +.nf +.B int pcre_copy_substring(const char *\fIsubject\fP, int *\fIovector\fP, +.B " int \fIstringcount\fP, int \fIstringnumber\fP, char *\fIbuffer\fP," +.B " int \fIbuffersize\fP);" +.sp +.B int pcre16_copy_substring(PCRE_SPTR16 \fIsubject\fP, int *\fIovector\fP, +.B " int \fIstringcount\fP, int \fIstringnumber\fP, PCRE_UCHAR16 *\fIbuffer\fP," +.B " int \fIbuffersize\fP);" +.sp +.B int pcre32_copy_substring(PCRE_SPTR32 \fIsubject\fP, int *\fIovector\fP, +.B " int \fIstringcount\fP, int \fIstringnumber\fP, PCRE_UCHAR32 *\fIbuffer\fP," +.B " int \fIbuffersize\fP);" +.fi +. +.SH DESCRIPTION +.rs +.sp +This is a convenience function for extracting a captured substring into a given +buffer. The arguments are: +.sp + \fIsubject\fP Subject that has been successfully matched + \fIovector\fP Offset vector that \fBpcre[16|32]_exec()\fP used + \fIstringcount\fP Value returned by \fBpcre[16|32]_exec()\fP + \fIstringnumber\fP Number of the required substring + \fIbuffer\fP Buffer to receive the string + \fIbuffersize\fP Size of buffer +.sp +The yield is the length of the string, PCRE_ERROR_NOMEMORY if the buffer was +too small, or PCRE_ERROR_NOSUBSTRING if the string number is invalid. +.P +There is a complete description of the PCRE native API in the +.\" HREF +\fBpcreapi\fP +.\" +page and a description of the POSIX API in the +.\" HREF +\fBpcreposix\fP +.\" +page. diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_dfa_exec.3 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_dfa_exec.3 new file mode 100755 index 000000000..39c2e836d --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_dfa_exec.3 @@ -0,0 +1,118 @@ +.TH PCRE_DFA_EXEC 3 "12 May 2013" "PCRE 8.33" +.SH NAME +PCRE - Perl-compatible regular expressions +.SH SYNOPSIS +.rs +.sp +.B #include +.PP +.nf +.B int pcre_dfa_exec(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP," +.B " const char *\fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," +.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP," +.B " int *\fIworkspace\fP, int \fIwscount\fP);" +.sp +.B int pcre16_dfa_exec(const pcre16 *\fIcode\fP, "const pcre16_extra *\fIextra\fP," +.B " PCRE_SPTR16 \fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," +.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP," +.B " int *\fIworkspace\fP, int \fIwscount\fP);" +.sp +.B int pcre32_dfa_exec(const pcre32 *\fIcode\fP, "const pcre32_extra *\fIextra\fP," +.B " PCRE_SPTR32 \fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," +.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP," +.B " int *\fIworkspace\fP, int \fIwscount\fP);" +.fi +. +.SH DESCRIPTION +.rs +.sp +This function matches a compiled regular expression against a given subject +string, using an alternative matching algorithm that scans the subject string +just once (\fInot\fP Perl-compatible). Note that the main, Perl-compatible, +matching function is \fBpcre[16|32]_exec()\fP. The arguments for this function +are: +.sp + \fIcode\fP Points to the compiled pattern + \fIextra\fP Points to an associated \fBpcre[16|32]_extra\fP structure, + or is NULL + \fIsubject\fP Points to the subject string + \fIlength\fP Length of the subject string + \fIstartoffset\fP Offset in the subject at which to start matching + \fIoptions\fP Option bits + \fIovector\fP Points to a vector of ints for result offsets + \fIovecsize\fP Number of elements in the vector + \fIworkspace\fP Points to a vector of ints used as working space + \fIwscount\fP Number of elements in the vector +.sp +The units for \fIlength\fP and \fIstartoffset\fP are bytes for +\fBpcre_exec()\fP, 16-bit data items for \fBpcre16_exec()\fP, and 32-bit items +for \fBpcre32_exec()\fP. The options are: +.sp + PCRE_ANCHORED Match only at the first position + PCRE_BSR_ANYCRLF \eR matches only CR, LF, or CRLF + PCRE_BSR_UNICODE \eR matches all Unicode line endings + PCRE_NEWLINE_ANY Recognize any Unicode newline sequence + PCRE_NEWLINE_ANYCRLF Recognize CR, LF, & CRLF as newline sequences + PCRE_NEWLINE_CR Recognize CR as the only newline sequence + PCRE_NEWLINE_CRLF Recognize CRLF as the only newline sequence + PCRE_NEWLINE_LF Recognize LF as the only newline sequence + PCRE_NOTBOL Subject is not the beginning of a line + PCRE_NOTEOL Subject is not the end of a line + PCRE_NOTEMPTY An empty string is not a valid match + PCRE_NOTEMPTY_ATSTART An empty string at the start of the subject + is not a valid match + PCRE_NO_START_OPTIMIZE Do not do "start-match" optimizations + PCRE_NO_UTF16_CHECK Do not check the subject for UTF-16 + validity (only relevant if PCRE_UTF16 + was set at compile time) + PCRE_NO_UTF32_CHECK Do not check the subject for UTF-32 + validity (only relevant if PCRE_UTF32 + was set at compile time) + PCRE_NO_UTF8_CHECK Do not check the subject for UTF-8 + validity (only relevant if PCRE_UTF8 + was set at compile time) + PCRE_PARTIAL ) Return PCRE_ERROR_PARTIAL for a partial + PCRE_PARTIAL_SOFT ) match if no full matches are found + PCRE_PARTIAL_HARD Return PCRE_ERROR_PARTIAL for a partial match + even if there is a full match as well + PCRE_DFA_SHORTEST Return only the shortest match + PCRE_DFA_RESTART Restart after a partial match +.sp +There are restrictions on what may appear in a pattern when using this matching +function. Details are given in the +.\" HREF +\fBpcrematching\fP +.\" +documentation. For details of partial matching, see the +.\" HREF +\fBpcrepartial\fP +.\" +page. +.P +A \fBpcre[16|32]_extra\fP structure contains the following fields: +.sp + \fIflags\fP Bits indicating which fields are set + \fIstudy_data\fP Opaque data from \fBpcre[16|32]_study()\fP + \fImatch_limit\fP Limit on internal resource use + \fImatch_limit_recursion\fP Limit on internal recursion depth + \fIcallout_data\fP Opaque data passed back to callouts + \fItables\fP Points to character tables or is NULL + \fImark\fP For passing back a *MARK pointer + \fIexecutable_jit\fP Opaque data from JIT compilation +.sp +The flag bits are PCRE_EXTRA_STUDY_DATA, PCRE_EXTRA_MATCH_LIMIT, +PCRE_EXTRA_MATCH_LIMIT_RECURSION, PCRE_EXTRA_CALLOUT_DATA, +PCRE_EXTRA_TABLES, PCRE_EXTRA_MARK and PCRE_EXTRA_EXECUTABLE_JIT. For this +matching function, the \fImatch_limit\fP and \fImatch_limit_recursion\fP fields +are not used, and must not be set. The PCRE_EXTRA_EXECUTABLE_JIT flag and +the corresponding variable are ignored. +.P +There is a complete description of the PCRE native API in the +.\" HREF +\fBpcreapi\fP +.\" +page and a description of the POSIX API in the +.\" HREF +\fBpcreposix\fP +.\" +page. diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_exec.3 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_exec.3 new file mode 100755 index 000000000..4686bd6de --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_exec.3 @@ -0,0 +1,99 @@ +.TH PCRE_EXEC 3 "12 May 2013" "PCRE 8.33" +.SH NAME +PCRE - Perl-compatible regular expressions +.SH SYNOPSIS +.rs +.sp +.B #include +.PP +.nf +.B int pcre_exec(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP," +.B " const char *\fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," +.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP);" +.sp +.B int pcre16_exec(const pcre16 *\fIcode\fP, "const pcre16_extra *\fIextra\fP," +.B " PCRE_SPTR16 \fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," +.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP);" +.sp +.B int pcre32_exec(const pcre32 *\fIcode\fP, "const pcre32_extra *\fIextra\fP," +.B " PCRE_SPTR32 \fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," +.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP);" +.fi +. +.SH DESCRIPTION +.rs +.sp +This function matches a compiled regular expression against a given subject +string, using a matching algorithm that is similar to Perl's. It returns +offsets to captured substrings. Its arguments are: +.sp + \fIcode\fP Points to the compiled pattern + \fIextra\fP Points to an associated \fBpcre[16|32]_extra\fP structure, + or is NULL + \fIsubject\fP Points to the subject string + \fIlength\fP Length of the subject string + \fIstartoffset\fP Offset in the subject at which to start matching + \fIoptions\fP Option bits + \fIovector\fP Points to a vector of ints for result offsets + \fIovecsize\fP Number of elements in the vector (a multiple of 3) +.sp +The units for \fIlength\fP and \fIstartoffset\fP are bytes for +\fBpcre_exec()\fP, 16-bit data items for \fBpcre16_exec()\fP, and 32-bit items +for \fBpcre32_exec()\fP. The options are: +.sp + PCRE_ANCHORED Match only at the first position + PCRE_BSR_ANYCRLF \eR matches only CR, LF, or CRLF + PCRE_BSR_UNICODE \eR matches all Unicode line endings + PCRE_NEWLINE_ANY Recognize any Unicode newline sequence + PCRE_NEWLINE_ANYCRLF Recognize CR, LF, & CRLF as newline sequences + PCRE_NEWLINE_CR Recognize CR as the only newline sequence + PCRE_NEWLINE_CRLF Recognize CRLF as the only newline sequence + PCRE_NEWLINE_LF Recognize LF as the only newline sequence + PCRE_NOTBOL Subject string is not the beginning of a line + PCRE_NOTEOL Subject string is not the end of a line + PCRE_NOTEMPTY An empty string is not a valid match + PCRE_NOTEMPTY_ATSTART An empty string at the start of the subject + is not a valid match + PCRE_NO_START_OPTIMIZE Do not do "start-match" optimizations + PCRE_NO_UTF16_CHECK Do not check the subject for UTF-16 + validity (only relevant if PCRE_UTF16 + was set at compile time) + PCRE_NO_UTF32_CHECK Do not check the subject for UTF-32 + validity (only relevant if PCRE_UTF32 + was set at compile time) + PCRE_NO_UTF8_CHECK Do not check the subject for UTF-8 + validity (only relevant if PCRE_UTF8 + was set at compile time) + PCRE_PARTIAL ) Return PCRE_ERROR_PARTIAL for a partial + PCRE_PARTIAL_SOFT ) match if no full matches are found + PCRE_PARTIAL_HARD Return PCRE_ERROR_PARTIAL for a partial match + if that is found before a full match +.sp +For details of partial matching, see the +.\" HREF +\fBpcrepartial\fP +.\" +page. A \fBpcre_extra\fP structure contains the following fields: +.sp + \fIflags\fP Bits indicating which fields are set + \fIstudy_data\fP Opaque data from \fBpcre[16|32]_study()\fP + \fImatch_limit\fP Limit on internal resource use + \fImatch_limit_recursion\fP Limit on internal recursion depth + \fIcallout_data\fP Opaque data passed back to callouts + \fItables\fP Points to character tables or is NULL + \fImark\fP For passing back a *MARK pointer + \fIexecutable_jit\fP Opaque data from JIT compilation +.sp +The flag bits are PCRE_EXTRA_STUDY_DATA, PCRE_EXTRA_MATCH_LIMIT, +PCRE_EXTRA_MATCH_LIMIT_RECURSION, PCRE_EXTRA_CALLOUT_DATA, +PCRE_EXTRA_TABLES, PCRE_EXTRA_MARK and PCRE_EXTRA_EXECUTABLE_JIT. +.P +There is a complete description of the PCRE native API in the +.\" HREF +\fBpcreapi\fP +.\" +page and a description of the POSIX API in the +.\" HREF +\fBpcreposix\fP +.\" +page. diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_free_study.3 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_free_study.3 new file mode 100755 index 000000000..8826b7359 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_free_study.3 @@ -0,0 +1,31 @@ +.TH PCRE_FREE_STUDY 3 "24 June 2012" "PCRE 8.30" +.SH NAME +PCRE - Perl-compatible regular expressions +.SH SYNOPSIS +.rs +.sp +.B #include +.PP +.SM +.B void pcre_free_study(pcre_extra *\fIextra\fP); +.PP +.B void pcre16_free_study(pcre16_extra *\fIextra\fP); +.PP +.B void pcre32_free_study(pcre32_extra *\fIextra\fP); +. +.SH DESCRIPTION +.rs +.sp +This function is used to free the memory used for the data generated by a call +to \fBpcre[16|32]_study()\fP when it is no longer needed. The argument must be the +result of such a call. +.P +There is a complete description of the PCRE native API in the +.\" HREF +\fBpcreapi\fP +.\" +page and a description of the POSIX API in the +.\" HREF +\fBpcreposix\fP +.\" +page. diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_free_substring.3 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_free_substring.3 new file mode 100755 index 000000000..88c04019f --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_free_substring.3 @@ -0,0 +1,31 @@ +.TH PCRE_FREE_SUBSTRING 3 "24 June 2012" "PCRE 8.30" +.SH NAME +PCRE - Perl-compatible regular expressions +.SH SYNOPSIS +.rs +.sp +.B #include +.PP +.SM +.B void pcre_free_substring(const char *\fIstringptr\fP); +.PP +.B void pcre16_free_substring(PCRE_SPTR16 \fIstringptr\fP); +.PP +.B void pcre32_free_substring(PCRE_SPTR32 \fIstringptr\fP); +. +.SH DESCRIPTION +.rs +.sp +This is a convenience function for freeing the store obtained by a previous +call to \fBpcre[16|32]_get_substring()\fP or \fBpcre[16|32]_get_named_substring()\fP. +Its only argument is a pointer to the string. +.P +There is a complete description of the PCRE native API in the +.\" HREF +\fBpcreapi\fP +.\" +page and a description of the POSIX API in the +.\" HREF +\fBpcreposix\fP +.\" +page. diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_free_substring_list.3 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_free_substring_list.3 new file mode 100755 index 000000000..248b4bd01 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_free_substring_list.3 @@ -0,0 +1,31 @@ +.TH PCRE_FREE_SUBSTRING_LIST 3 "24 June 2012" "PCRE 8.30" +.SH NAME +PCRE - Perl-compatible regular expressions +.SH SYNOPSIS +.rs +.sp +.B #include +.PP +.SM +.B void pcre_free_substring_list(const char **\fIstringptr\fP); +.PP +.B void pcre16_free_substring_list(PCRE_SPTR16 *\fIstringptr\fP); +.PP +.B void pcre32_free_substring_list(PCRE_SPTR32 *\fIstringptr\fP); +. +.SH DESCRIPTION +.rs +.sp +This is a convenience function for freeing the store obtained by a previous +call to \fBpcre[16|32]_get_substring_list()\fP. Its only argument is a pointer to +the list of string pointers. +.P +There is a complete description of the PCRE native API in the +.\" HREF +\fBpcreapi\fP +.\" +page and a description of the POSIX API in the +.\" HREF +\fBpcreposix\fP +.\" +page. diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_fullinfo.3 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_fullinfo.3 new file mode 100755 index 000000000..c9b2c656d --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_fullinfo.3 @@ -0,0 +1,103 @@ +.TH PCRE_FULLINFO 3 "21 April 2014" "PCRE 8.36" +.SH NAME +PCRE - Perl-compatible regular expressions +.SH SYNOPSIS +.rs +.sp +.B #include +.PP +.nf +.B int pcre_fullinfo(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP," +.B " int \fIwhat\fP, void *\fIwhere\fP);" +.sp +.B int pcre16_fullinfo(const pcre16 *\fIcode\fP, "const pcre16_extra *\fIextra\fP," +.B " int \fIwhat\fP, void *\fIwhere\fP);" +.sp +.B int pcre32_fullinfo(const pcre32 *\fIcode\fP, "const pcre32_extra *\fIextra\fP," +.B " int \fIwhat\fP, void *\fIwhere\fP);" +.fi +. +.SH DESCRIPTION +.rs +.sp +This function returns information about a compiled pattern. Its arguments are: +.sp + \fIcode\fP Compiled regular expression + \fIextra\fP Result of \fBpcre[16|32]_study()\fP or NULL + \fIwhat\fP What information is required + \fIwhere\fP Where to put the information +.sp +The following information is available: +.sp + PCRE_INFO_BACKREFMAX Number of highest back reference + PCRE_INFO_CAPTURECOUNT Number of capturing subpatterns + PCRE_INFO_DEFAULT_TABLES Pointer to default tables + PCRE_INFO_FIRSTBYTE Fixed first data unit for a match, or + -1 for start of string + or after newline, or + -2 otherwise + PCRE_INFO_FIRSTTABLE Table of first data units (after studying) + PCRE_INFO_HASCRORLF Return 1 if explicit CR or LF matches exist + PCRE_INFO_JCHANGED Return 1 if (?J) or (?-J) was used + PCRE_INFO_JIT Return 1 after successful JIT compilation + PCRE_INFO_JITSIZE Size of JIT compiled code + PCRE_INFO_LASTLITERAL Literal last data unit required + PCRE_INFO_MINLENGTH Lower bound length of matching strings + PCRE_INFO_MATCHEMPTY Return 1 if the pattern can match an empty string, + 0 otherwise + PCRE_INFO_MATCHLIMIT Match limit if set, otherwise PCRE_RROR_UNSET + PCRE_INFO_MAXLOOKBEHIND Length (in characters) of the longest lookbehind assertion + PCRE_INFO_NAMECOUNT Number of named subpatterns + PCRE_INFO_NAMEENTRYSIZE Size of name table entry + PCRE_INFO_NAMETABLE Pointer to name table + PCRE_INFO_OKPARTIAL Return 1 if partial matching can be tried + (always returns 1 after release 8.00) + PCRE_INFO_OPTIONS Option bits used for compilation + PCRE_INFO_SIZE Size of compiled pattern + PCRE_INFO_STUDYSIZE Size of study data + PCRE_INFO_FIRSTCHARACTER Fixed first data unit for a match + PCRE_INFO_FIRSTCHARACTERFLAGS Returns + 1 if there is a first data character set, which can + then be retrieved using PCRE_INFO_FIRSTCHARACTER, + 2 if the first character is at the start of the data + string or after a newline, and + 0 otherwise + PCRE_INFO_RECURSIONLIMIT Recursion limit if set, otherwise PCRE_ERROR_UNSET + PCRE_INFO_REQUIREDCHAR Literal last data unit required + PCRE_INFO_REQUIREDCHARFLAGS Returns 1 if the last data character is set (which can then + be retrieved using PCRE_INFO_REQUIREDCHAR); 0 otherwise +.sp +The \fIwhere\fP argument must point to an integer variable, except for the +following \fIwhat\fP values: +.sp + PCRE_INFO_DEFAULT_TABLES const uint8_t * + PCRE_INFO_FIRSTCHARACTER uint32_t + PCRE_INFO_FIRSTTABLE const uint8_t * + PCRE_INFO_JITSIZE size_t + PCRE_INFO_MATCHLIMIT uint32_t + PCRE_INFO_NAMETABLE PCRE_SPTR16 (16-bit library) + PCRE_INFO_NAMETABLE PCRE_SPTR32 (32-bit library) + PCRE_INFO_NAMETABLE const unsigned char * (8-bit library) + PCRE_INFO_OPTIONS unsigned long int + PCRE_INFO_SIZE size_t + PCRE_INFO_STUDYSIZE size_t + PCRE_INFO_RECURSIONLIMIT uint32_t + PCRE_INFO_REQUIREDCHAR uint32_t +.sp +The yield of the function is zero on success or: +.sp + PCRE_ERROR_NULL the argument \fIcode\fP was NULL + the argument \fIwhere\fP was NULL + PCRE_ERROR_BADMAGIC the "magic number" was not found + PCRE_ERROR_BADOPTION the value of \fIwhat\fP was invalid + PCRE_ERROR_UNSET the option was not set +.P +There is a complete description of the PCRE native API in the +.\" HREF +\fBpcreapi\fP +.\" +page and a description of the POSIX API in the +.\" HREF +\fBpcreposix\fP +.\" +page. diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_get_named_substring.3 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_get_named_substring.3 new file mode 100755 index 000000000..84d4ee7db --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_get_named_substring.3 @@ -0,0 +1,54 @@ +.TH PCRE_GET_NAMED_SUBSTRING 3 "24 June 2012" "PCRE 8.30" +.SH NAME +PCRE - Perl-compatible regular expressions +.SH SYNOPSIS +.rs +.sp +.B #include +.PP +.nf +.B int pcre_get_named_substring(const pcre *\fIcode\fP, +.B " const char *\fIsubject\fP, int *\fIovector\fP," +.B " int \fIstringcount\fP, const char *\fIstringname\fP," +.B " const char **\fIstringptr\fP);" +.sp +.B int pcre16_get_named_substring(const pcre16 *\fIcode\fP, +.B " PCRE_SPTR16 \fIsubject\fP, int *\fIovector\fP," +.B " int \fIstringcount\fP, PCRE_SPTR16 \fIstringname\fP," +.B " PCRE_SPTR16 *\fIstringptr\fP);" +.sp +.B int pcre32_get_named_substring(const pcre32 *\fIcode\fP, +.B " PCRE_SPTR32 \fIsubject\fP, int *\fIovector\fP," +.B " int \fIstringcount\fP, PCRE_SPTR32 \fIstringname\fP," +.B " PCRE_SPTR32 *\fIstringptr\fP);" +.fi +. +.SH DESCRIPTION +.rs +.sp +This is a convenience function for extracting a captured substring by name. The +arguments are: +.sp + \fIcode\fP Compiled pattern + \fIsubject\fP Subject that has been successfully matched + \fIovector\fP Offset vector that \fBpcre[16|32]_exec()\fP used + \fIstringcount\fP Value returned by \fBpcre[16|32]_exec()\fP + \fIstringname\fP Name of the required substring + \fIstringptr\fP Where to put the string pointer +.sp +The memory in which the substring is placed is obtained by calling +\fBpcre[16|32]_malloc()\fP. The convenience function +\fBpcre[16|32]_free_substring()\fP can be used to free it when it is no longer +needed. The yield of the function is the length of the extracted substring, +PCRE_ERROR_NOMEMORY if sufficient memory could not be obtained, or +PCRE_ERROR_NOSUBSTRING if the string name is invalid. +.P +There is a complete description of the PCRE native API in the +.\" HREF +\fBpcreapi\fP +.\" +page and a description of the POSIX API in the +.\" HREF +\fBpcreposix\fP +.\" +page. diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_get_stringnumber.3 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_get_stringnumber.3 new file mode 100755 index 000000000..9fc5291dc --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_get_stringnumber.3 @@ -0,0 +1,43 @@ +.TH PCRE_GET_STRINGNUMBER 3 "24 June 2012" "PCRE 8.30" +.SH NAME +PCRE - Perl-compatible regular expressions +.SH SYNOPSIS +.rs +.sp +.B #include +.PP +.nf +.B int pcre_get_stringnumber(const pcre *\fIcode\fP, +.B " const char *\fIname\fP);" +.sp +.B int pcre16_get_stringnumber(const pcre16 *\fIcode\fP, +.B " PCRE_SPTR16 \fIname\fP);" +.sp +.B int pcre32_get_stringnumber(const pcre32 *\fIcode\fP, +.B " PCRE_SPTR32 \fIname\fP);" +.fi +. +.SH DESCRIPTION +.rs +.sp +This convenience function finds the number of a named substring capturing +parenthesis in a compiled pattern. Its arguments are: +.sp + \fIcode\fP Compiled regular expression + \fIname\fP Name whose number is required +.sp +The yield of the function is the number of the parenthesis if the name is +found, or PCRE_ERROR_NOSUBSTRING otherwise. When duplicate names are allowed +(PCRE_DUPNAMES is set), it is not defined which of the numbers is returned by +\fBpcre[16|32]_get_stringnumber()\fP. You can obtain the complete list by calling +\fBpcre[16|32]_get_stringtable_entries()\fP. +.P +There is a complete description of the PCRE native API in the +.\" HREF +\fBpcreapi\fP +.\" +page and a description of the POSIX API in the +.\" HREF +\fBpcreposix\fP +.\" +page. diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_get_stringtable_entries.3 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_get_stringtable_entries.3 new file mode 100755 index 000000000..5c58c90c0 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_get_stringtable_entries.3 @@ -0,0 +1,46 @@ +.TH PCRE_GET_STRINGTABLE_ENTRIES 3 "24 June 2012" "PCRE 8.30" +.SH NAME +PCRE - Perl-compatible regular expressions +.SH SYNOPSIS +.rs +.sp +.B #include +.PP +.nf +.B int pcre_get_stringtable_entries(const pcre *\fIcode\fP, +.B " const char *\fIname\fP, char **\fIfirst\fP, char **\fIlast\fP);" +.sp +.B int pcre16_get_stringtable_entries(const pcre16 *\fIcode\fP, +.B " PCRE_SPTR16 \fIname\fP, PCRE_UCHAR16 **\fIfirst\fP, PCRE_UCHAR16 **\fIlast\fP);" +.sp +.B int pcre32_get_stringtable_entries(const pcre32 *\fIcode\fP, +.B " PCRE_SPTR32 \fIname\fP, PCRE_UCHAR32 **\fIfirst\fP, PCRE_UCHAR32 **\fIlast\fP);" +.fi +. +.SH DESCRIPTION +.rs +.sp +This convenience function finds, for a compiled pattern, the first and last +entries for a given name in the table that translates capturing parenthesis +names into numbers. When names are required to be unique (PCRE_DUPNAMES is +\fInot\fP set), it is usually easier to use \fBpcre[16|32]_get_stringnumber()\fP +instead. +.sp + \fIcode\fP Compiled regular expression + \fIname\fP Name whose entries required + \fIfirst\fP Where to return a pointer to the first entry + \fIlast\fP Where to return a pointer to the last entry +.sp +The yield of the function is the length of each entry, or +PCRE_ERROR_NOSUBSTRING if none are found. +.P +There is a complete description of the PCRE native API, including the format of +the table entries, in the +.\" HREF +\fBpcreapi\fP +.\" +page, and a description of the POSIX API in the +.\" HREF +\fBpcreposix\fP +.\" +page. diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_get_substring.3 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_get_substring.3 new file mode 100755 index 000000000..1e62b2c0c --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_get_substring.3 @@ -0,0 +1,50 @@ +.TH PCRE_GET_SUBSTRING 3 "24 June 2012" "PCRE 8.30" +.SH NAME +PCRE - Perl-compatible regular expressions +.SH SYNOPSIS +.rs +.sp +.B #include +.PP +.nf +.B int pcre_get_substring(const char *\fIsubject\fP, int *\fIovector\fP, +.B " int \fIstringcount\fP, int \fIstringnumber\fP," +.B " const char **\fIstringptr\fP);" +.sp +.B int pcre16_get_substring(PCRE_SPTR16 \fIsubject\fP, int *\fIovector\fP, +.B " int \fIstringcount\fP, int \fIstringnumber\fP," +.B " PCRE_SPTR16 *\fIstringptr\fP);" +.sp +.B int pcre32_get_substring(PCRE_SPTR32 \fIsubject\fP, int *\fIovector\fP, +.B " int \fIstringcount\fP, int \fIstringnumber\fP," +.B " PCRE_SPTR32 *\fIstringptr\fP);" +.fi +. +.SH DESCRIPTION +.rs +.sp +This is a convenience function for extracting a captured substring. The +arguments are: +.sp + \fIsubject\fP Subject that has been successfully matched + \fIovector\fP Offset vector that \fBpcre[16|32]_exec()\fP used + \fIstringcount\fP Value returned by \fBpcre[16|32]_exec()\fP + \fIstringnumber\fP Number of the required substring + \fIstringptr\fP Where to put the string pointer +.sp +The memory in which the substring is placed is obtained by calling +\fBpcre[16|32]_malloc()\fP. The convenience function +\fBpcre[16|32]_free_substring()\fP can be used to free it when it is no longer +needed. The yield of the function is the length of the substring, +PCRE_ERROR_NOMEMORY if sufficient memory could not be obtained, or +PCRE_ERROR_NOSUBSTRING if the string number is invalid. +.P +There is a complete description of the PCRE native API in the +.\" HREF +\fBpcreapi\fP +.\" +page and a description of the POSIX API in the +.\" HREF +\fBpcreposix\fP +.\" +page. diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_get_substring_list.3 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_get_substring_list.3 new file mode 100755 index 000000000..511a4a39d --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_get_substring_list.3 @@ -0,0 +1,47 @@ +.TH PCRE_GET_SUBSTRING_LIST 3 "24 June 2012" "PCRE 8.30" +.SH NAME +PCRE - Perl-compatible regular expressions +.SH SYNOPSIS +.rs +.sp +.B #include +.PP +.nf +.B int pcre_get_substring_list(const char *\fIsubject\fP, +.B " int *\fIovector\fP, int \fIstringcount\fP, const char ***\fIlistptr\fP);" +.sp +.B int pcre16_get_substring_list(PCRE_SPTR16 \fIsubject\fP, +.B " int *\fIovector\fP, int \fIstringcount\fP, PCRE_SPTR16 **\fIlistptr\fP);" +.sp +.B int pcre32_get_substring_list(PCRE_SPTR32 \fIsubject\fP, +.B " int *\fIovector\fP, int \fIstringcount\fP, PCRE_SPTR32 **\fIlistptr\fP);" +.fi +. +.SH DESCRIPTION +.rs +.sp +This is a convenience function for extracting a list of all the captured +substrings. The arguments are: +.sp + \fIsubject\fP Subject that has been successfully matched + \fIovector\fP Offset vector that \fBpcre[16|32]_exec\fP used + \fIstringcount\fP Value returned by \fBpcre[16|32]_exec\fP + \fIlistptr\fP Where to put a pointer to the list +.sp +The memory in which the substrings and the list are placed is obtained by +calling \fBpcre[16|32]_malloc()\fP. The convenience function +\fBpcre[16|32]_free_substring_list()\fP can be used to free it when it is no +longer needed. A pointer to a list of pointers is put in the variable whose +address is in \fIlistptr\fP. The list is terminated by a NULL pointer. The +yield of the function is zero on success or PCRE_ERROR_NOMEMORY if sufficient +memory could not be obtained. +.P +There is a complete description of the PCRE native API in the +.\" HREF +\fBpcreapi\fP +.\" +page and a description of the POSIX API in the +.\" HREF +\fBpcreposix\fP +.\" +page. diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_jit_exec.3 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_jit_exec.3 new file mode 100755 index 000000000..ba8516817 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_jit_exec.3 @@ -0,0 +1,96 @@ +.TH PCRE_EXEC 3 "31 October 2012" "PCRE 8.30" +.SH NAME +PCRE - Perl-compatible regular expressions +.SH SYNOPSIS +.rs +.sp +.B #include +.PP +.nf +.B int pcre_jit_exec(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP," +.B " const char *\fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," +.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP," +.B " pcre_jit_stack *\fIjstack\fP);" +.sp +.B int pcre16_jit_exec(const pcre16 *\fIcode\fP, "const pcre16_extra *\fIextra\fP," +.B " PCRE_SPTR16 \fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," +.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP," +.B " pcre_jit_stack *\fIjstack\fP);" +.sp +.B int pcre32_jit_exec(const pcre32 *\fIcode\fP, "const pcre32_extra *\fIextra\fP," +.B " PCRE_SPTR32 \fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," +.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP," +.B " pcre_jit_stack *\fIjstack\fP);" +.fi +. +.SH DESCRIPTION +.rs +.sp +This function matches a compiled regular expression that has been successfully +studied with one of the JIT options against a given subject string, using a +matching algorithm that is similar to Perl's. It is a "fast path" interface to +JIT, and it bypasses some of the sanity checks that \fBpcre_exec()\fP applies. +It returns offsets to captured substrings. Its arguments are: +.sp + \fIcode\fP Points to the compiled pattern + \fIextra\fP Points to an associated \fBpcre[16|32]_extra\fP structure, + or is NULL + \fIsubject\fP Points to the subject string + \fIlength\fP Length of the subject string, in bytes + \fIstartoffset\fP Offset in bytes in the subject at which to + start matching + \fIoptions\fP Option bits + \fIovector\fP Points to a vector of ints for result offsets + \fIovecsize\fP Number of elements in the vector (a multiple of 3) + \fIjstack\fP Pointer to a JIT stack +.sp +The allowed options are: +.sp + PCRE_NOTBOL Subject string is not the beginning of a line + PCRE_NOTEOL Subject string is not the end of a line + PCRE_NOTEMPTY An empty string is not a valid match + PCRE_NOTEMPTY_ATSTART An empty string at the start of the subject + is not a valid match + PCRE_NO_UTF16_CHECK Do not check the subject for UTF-16 + validity (only relevant if PCRE_UTF16 + was set at compile time) + PCRE_NO_UTF32_CHECK Do not check the subject for UTF-32 + validity (only relevant if PCRE_UTF32 + was set at compile time) + PCRE_NO_UTF8_CHECK Do not check the subject for UTF-8 + validity (only relevant if PCRE_UTF8 + was set at compile time) + PCRE_PARTIAL ) Return PCRE_ERROR_PARTIAL for a partial + PCRE_PARTIAL_SOFT ) match if no full matches are found + PCRE_PARTIAL_HARD Return PCRE_ERROR_PARTIAL for a partial match + if that is found before a full match +.sp +However, the PCRE_NO_UTF[8|16|32]_CHECK options have no effect, as this check +is never applied. For details of partial matching, see the +.\" HREF +\fBpcrepartial\fP +.\" +page. A \fBpcre_extra\fP structure contains the following fields: +.sp + \fIflags\fP Bits indicating which fields are set + \fIstudy_data\fP Opaque data from \fBpcre[16|32]_study()\fP + \fImatch_limit\fP Limit on internal resource use + \fImatch_limit_recursion\fP Limit on internal recursion depth + \fIcallout_data\fP Opaque data passed back to callouts + \fItables\fP Points to character tables or is NULL + \fImark\fP For passing back a *MARK pointer + \fIexecutable_jit\fP Opaque data from JIT compilation +.sp +The flag bits are PCRE_EXTRA_STUDY_DATA, PCRE_EXTRA_MATCH_LIMIT, +PCRE_EXTRA_MATCH_LIMIT_RECURSION, PCRE_EXTRA_CALLOUT_DATA, +PCRE_EXTRA_TABLES, PCRE_EXTRA_MARK and PCRE_EXTRA_EXECUTABLE_JIT. +.P +There is a complete description of the PCRE native API in the +.\" HREF +\fBpcreapi\fP +.\" +page and a description of the JIT API in the +.\" HREF +\fBpcrejit\fP +.\" +page. diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_jit_stack_alloc.3 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_jit_stack_alloc.3 new file mode 100755 index 000000000..11c97a0fc --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_jit_stack_alloc.3 @@ -0,0 +1,43 @@ +.TH PCRE_JIT_STACK_ALLOC 3 "24 June 2012" "PCRE 8.30" +.SH NAME +PCRE - Perl-compatible regular expressions +.SH SYNOPSIS +.rs +.sp +.B #include +.PP +.nf +.B pcre_jit_stack *pcre_jit_stack_alloc(int \fIstartsize\fP, +.B " int \fImaxsize\fP);" +.sp +.B pcre16_jit_stack *pcre16_jit_stack_alloc(int \fIstartsize\fP, +.B " int \fImaxsize\fP);" +.sp +.B pcre32_jit_stack *pcre32_jit_stack_alloc(int \fIstartsize\fP, +.B " int \fImaxsize\fP);" +.fi +. +.SH DESCRIPTION +.rs +.sp +This function is used to create a stack for use by the code compiled by the JIT +optimization of \fBpcre[16|32]_study()\fP. The arguments are a starting size for +the stack, and a maximum size to which it is allowed to grow. The result can be +passed to the JIT run-time code by \fBpcre[16|32]_assign_jit_stack()\fP, or that +function can set up a callback for obtaining a stack. A maximum stack size of +512K to 1M should be more than enough for any pattern. For more details, see +the +.\" HREF +\fBpcrejit\fP +.\" +page. +.P +There is a complete description of the PCRE native API in the +.\" HREF +\fBpcreapi\fP +.\" +page and a description of the POSIX API in the +.\" HREF +\fBpcreposix\fP +.\" +page. diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_jit_stack_free.3 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_jit_stack_free.3 new file mode 100755 index 000000000..494724e84 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_jit_stack_free.3 @@ -0,0 +1,35 @@ +.TH PCRE_JIT_STACK_FREE 3 "24 June 2012" "PCRE 8.30" +.SH NAME +PCRE - Perl-compatible regular expressions +.SH SYNOPSIS +.rs +.sp +.B #include +.PP +.SM +.B void pcre_jit_stack_free(pcre_jit_stack *\fIstack\fP); +.PP +.B void pcre16_jit_stack_free(pcre16_jit_stack *\fIstack\fP); +.PP +.B void pcre32_jit_stack_free(pcre32_jit_stack *\fIstack\fP); +. +.SH DESCRIPTION +.rs +.sp +This function is used to free a JIT stack that was created by +\fBpcre[16|32]_jit_stack_alloc()\fP when it is no longer needed. For more details, +see the +.\" HREF +\fBpcrejit\fP +.\" +page. +.P +There is a complete description of the PCRE native API in the +.\" HREF +\fBpcreapi\fP +.\" +page and a description of the POSIX API in the +.\" HREF +\fBpcreposix\fP +.\" +page. diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_maketables.3 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_maketables.3 new file mode 100755 index 000000000..b2c3d23aa --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_maketables.3 @@ -0,0 +1,33 @@ +.TH PCRE_MAKETABLES 3 "24 June 2012" "PCRE 8.30" +.SH NAME +PCRE - Perl-compatible regular expressions +.SH SYNOPSIS +.rs +.sp +.B #include +.PP +.SM +.B const unsigned char *pcre_maketables(void); +.PP +.B const unsigned char *pcre16_maketables(void); +.PP +.B const unsigned char *pcre32_maketables(void); +. +.SH DESCRIPTION +.rs +.sp +This function builds a set of character tables for character values less than +256. These can be passed to \fBpcre[16|32]_compile()\fP to override PCRE's +internal, built-in tables (which were made by \fBpcre[16|32]_maketables()\fP when +PCRE was compiled). You might want to do this if you are using a non-standard +locale. The function yields a pointer to the tables. +.P +There is a complete description of the PCRE native API in the +.\" HREF +\fBpcreapi\fP +.\" +page and a description of the POSIX API in the +.\" HREF +\fBpcreposix\fP +.\" +page. diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_pattern_to_host_byte_order.3 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_pattern_to_host_byte_order.3 new file mode 100755 index 000000000..b0c41c38e --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_pattern_to_host_byte_order.3 @@ -0,0 +1,44 @@ +.TH PCRE_PATTERN_TO_HOST_BYTE_ORDER 3 "24 June 2012" "PCRE 8.30" +.SH NAME +PCRE - Perl-compatible regular expressions +.SH SYNOPSIS +.rs +.sp +.B #include +.PP +.nf +.B int pcre_pattern_to_host_byte_order(pcre *\fIcode\fP, +.B " pcre_extra *\fIextra\fP, const unsigned char *\fItables\fP);" +.sp +.B int pcre16_pattern_to_host_byte_order(pcre16 *\fIcode\fP, +.B " pcre16_extra *\fIextra\fP, const unsigned char *\fItables\fP);" +.sp +.B int pcre32_pattern_to_host_byte_order(pcre32 *\fIcode\fP, +.B " pcre32_extra *\fIextra\fP, const unsigned char *\fItables\fP);" +.fi +. +.SH DESCRIPTION +.rs +.sp +This function ensures that the bytes in 2-byte and 4-byte values in a compiled +pattern are in the correct order for the current host. It is useful when a +pattern that has been compiled on one host is transferred to another that might +have different endianness. The arguments are: +.sp + \fIcode\fP A compiled regular expression + \fIextra\fP Points to an associated \fBpcre[16|32]_extra\fP structure, + or is NULL + \fItables\fP Pointer to character tables, or NULL to + set the built-in default +.sp +The result is 0 for success, a negative PCRE_ERROR_xxx value otherwise. +.P +There is a complete description of the PCRE native API in the +.\" HREF +\fBpcreapi\fP +.\" +page and a description of the POSIX API in the +.\" HREF +\fBpcreposix\fP +.\" +page. diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_refcount.3 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_refcount.3 new file mode 100755 index 000000000..45a41fef6 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_refcount.3 @@ -0,0 +1,36 @@ +.TH PCRE_REFCOUNT 3 "24 June 2012" "PCRE 8.30" +.SH NAME +PCRE - Perl-compatible regular expressions +.SH SYNOPSIS +.rs +.sp +.B #include +.PP +.SM +.B int pcre_refcount(pcre *\fIcode\fP, int \fIadjust\fP); +.PP +.B int pcre16_refcount(pcre16 *\fIcode\fP, int \fIadjust\fP); +.PP +.B int pcre32_refcount(pcre32 *\fIcode\fP, int \fIadjust\fP); +. +.SH DESCRIPTION +.rs +.sp +This function is used to maintain a reference count inside a data block that +contains a compiled pattern. Its arguments are: +.sp + \fIcode\fP Compiled regular expression + \fIadjust\fP Adjustment to reference value +.sp +The yield of the function is the adjusted reference value, which is constrained +to lie between 0 and 65535. +.P +There is a complete description of the PCRE native API in the +.\" HREF +\fBpcreapi\fP +.\" +page and a description of the POSIX API in the +.\" HREF +\fBpcreposix\fP +.\" +page. diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_study.3 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_study.3 new file mode 100755 index 000000000..1200e0a66 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_study.3 @@ -0,0 +1,54 @@ +.TH PCRE_STUDY 3 " 24 June 2012" "PCRE 8.30" +.SH NAME +PCRE - Perl-compatible regular expressions +.SH SYNOPSIS +.rs +.sp +.B #include +.PP +.nf +.B pcre_extra *pcre_study(const pcre *\fIcode\fP, int \fIoptions\fP, +.B " const char **\fIerrptr\fP);" +.sp +.B pcre16_extra *pcre16_study(const pcre16 *\fIcode\fP, int \fIoptions\fP, +.B " const char **\fIerrptr\fP);" +.sp +.B pcre32_extra *pcre32_study(const pcre32 *\fIcode\fP, int \fIoptions\fP, +.B " const char **\fIerrptr\fP);" +.fi +. +.SH DESCRIPTION +.rs +.sp +This function studies a compiled pattern, to see if additional information can +be extracted that might speed up matching. Its arguments are: +.sp + \fIcode\fP A compiled regular expression + \fIoptions\fP Options for \fBpcre[16|32]_study()\fP + \fIerrptr\fP Where to put an error message +.sp +If the function succeeds, it returns a value that can be passed to +\fBpcre[16|32]_exec()\fP or \fBpcre[16|32]_dfa_exec()\fP via their \fIextra\fP +arguments. +.P +If the function returns NULL, either it could not find any additional +information, or there was an error. You can tell the difference by looking at +the error value. It is NULL in first case. +.P +The only option is PCRE_STUDY_JIT_COMPILE. It requests just-in-time compilation +if possible. If PCRE has been compiled without JIT support, this option is +ignored. See the +.\" HREF +\fBpcrejit\fP +.\" +page for further details. +.P +There is a complete description of the PCRE native API in the +.\" HREF +\fBpcreapi\fP +.\" +page and a description of the POSIX API in the +.\" HREF +\fBpcreposix\fP +.\" +page. diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_utf16_to_host_byte_order.3 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_utf16_to_host_byte_order.3 new file mode 100755 index 000000000..1851b619d --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_utf16_to_host_byte_order.3 @@ -0,0 +1,45 @@ +.TH PCRE_UTF16_TO_HOST_BYTE_ORDER 3 "21 January 2012" "PCRE 8.30" +.SH NAME +PCRE - Perl-compatible regular expressions +.SH SYNOPSIS +.rs +.sp +.B #include +.PP +.nf +.B int pcre16_utf16_to_host_byte_order(PCRE_UCHAR16 *\fIoutput\fP, +.B " PCRE_SPTR16 \fIinput\fP, int \fIlength\fP, int *\fIhost_byte_order\fP," +.B " int \fIkeep_boms\fP);" +.fi +. +. +.SH DESCRIPTION +.rs +.sp +This function, which exists only in the 16-bit library, converts a UTF-16 +string to the correct order for the current host, taking account of any byte +order marks (BOMs) within the string. Its arguments are: +.sp + \fIoutput\fP pointer to output buffer, may be the same as \fIinput\fP + \fIinput\fP pointer to input buffer + \fIlength\fP number of 16-bit units in the input, or negative for + a zero-terminated string + \fIhost_byte_order\fP a NULL value or a non-zero value pointed to means + start in host byte order + \fIkeep_boms\fP if non-zero, BOMs are copied to the output string +.sp +The result of the function is the number of 16-bit units placed into the output +buffer, including the zero terminator if the string was zero-terminated. +.P +If \fIhost_byte_order\fP is not NULL, it is set to indicate the byte order that +is current at the end of the string. +.P +There is a complete description of the PCRE native API in the +.\" HREF +\fBpcreapi\fP +.\" +page and a description of the POSIX API in the +.\" HREF +\fBpcreposix\fP +.\" +page. diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_utf32_to_host_byte_order.3 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_utf32_to_host_byte_order.3 new file mode 100755 index 000000000..a415dcf5f --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_utf32_to_host_byte_order.3 @@ -0,0 +1,45 @@ +.TH PCRE_UTF32_TO_HOST_BYTE_ORDER 3 "24 June 2012" "PCRE 8.30" +.SH NAME +PCRE - Perl-compatible regular expressions +.SH SYNOPSIS +.rs +.sp +.B #include +.PP +.nf +.B int pcre32_utf32_to_host_byte_order(PCRE_UCHAR32 *\fIoutput\fP, +.B " PCRE_SPTR32 \fIinput\fP, int \fIlength\fP, int *\fIhost_byte_order\fP," +.B " int \fIkeep_boms\fP);" +.fi +. +. +.SH DESCRIPTION +.rs +.sp +This function, which exists only in the 32-bit library, converts a UTF-32 +string to the correct order for the current host, taking account of any byte +order marks (BOMs) within the string. Its arguments are: +.sp + \fIoutput\fP pointer to output buffer, may be the same as \fIinput\fP + \fIinput\fP pointer to input buffer + \fIlength\fP number of 32-bit units in the input, or negative for + a zero-terminated string + \fIhost_byte_order\fP a NULL value or a non-zero value pointed to means + start in host byte order + \fIkeep_boms\fP if non-zero, BOMs are copied to the output string +.sp +The result of the function is the number of 32-bit units placed into the output +buffer, including the zero terminator if the string was zero-terminated. +.P +If \fIhost_byte_order\fP is not NULL, it is set to indicate the byte order that +is current at the end of the string. +.P +There is a complete description of the PCRE native API in the +.\" HREF +\fBpcreapi\fP +.\" +page and a description of the POSIX API in the +.\" HREF +\fBpcreposix\fP +.\" +page. diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_version.3 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_version.3 new file mode 100755 index 000000000..0f4973f9c --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcre_version.3 @@ -0,0 +1,31 @@ +.TH PCRE_VERSION 3 "24 June 2012" "PCRE 8.30" +.SH NAME +PCRE - Perl-compatible regular expressions +.SH SYNOPSIS +.rs +.sp +.B #include +.PP +.SM +.B const char *pcre_version(void); +.PP +.B const char *pcre16_version(void); +.PP +.B const char *pcre32_version(void); +. +.SH DESCRIPTION +.rs +.sp +This function (even in the 16-bit and 32-bit libraries) returns a +zero-terminated, 8-bit character string that gives the version number of the +PCRE library and the date of its release. +.P +There is a complete description of the PCRE native API in the +.\" HREF +\fBpcreapi\fP +.\" +page and a description of the POSIX API in the +.\" HREF +\fBpcreposix\fP +.\" +page. diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcreapi.3 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcreapi.3 new file mode 100755 index 000000000..d79217818 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcreapi.3 @@ -0,0 +1,2918 @@ +.TH PCREAPI 3 "18 December 2015" "PCRE 8.39" +.SH NAME +PCRE - Perl-compatible regular expressions +.sp +.B #include +. +. +.SH "PCRE NATIVE API BASIC FUNCTIONS" +.rs +.sp +.nf +.B pcre *pcre_compile(const char *\fIpattern\fP, int \fIoptions\fP, +.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," +.B " const unsigned char *\fItableptr\fP);" +.sp +.B pcre *pcre_compile2(const char *\fIpattern\fP, int \fIoptions\fP, +.B " int *\fIerrorcodeptr\fP," +.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," +.B " const unsigned char *\fItableptr\fP);" +.sp +.B pcre_extra *pcre_study(const pcre *\fIcode\fP, int \fIoptions\fP, +.B " const char **\fIerrptr\fP);" +.sp +.B void pcre_free_study(pcre_extra *\fIextra\fP); +.sp +.B int pcre_exec(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP," +.B " const char *\fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," +.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP);" +.sp +.B int pcre_dfa_exec(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP," +.B " const char *\fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," +.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP," +.B " int *\fIworkspace\fP, int \fIwscount\fP);" +.fi +. +. +.SH "PCRE NATIVE API STRING EXTRACTION FUNCTIONS" +.rs +.sp +.nf +.B int pcre_copy_named_substring(const pcre *\fIcode\fP, +.B " const char *\fIsubject\fP, int *\fIovector\fP," +.B " int \fIstringcount\fP, const char *\fIstringname\fP," +.B " char *\fIbuffer\fP, int \fIbuffersize\fP);" +.sp +.B int pcre_copy_substring(const char *\fIsubject\fP, int *\fIovector\fP, +.B " int \fIstringcount\fP, int \fIstringnumber\fP, char *\fIbuffer\fP," +.B " int \fIbuffersize\fP);" +.sp +.B int pcre_get_named_substring(const pcre *\fIcode\fP, +.B " const char *\fIsubject\fP, int *\fIovector\fP," +.B " int \fIstringcount\fP, const char *\fIstringname\fP," +.B " const char **\fIstringptr\fP);" +.sp +.B int pcre_get_stringnumber(const pcre *\fIcode\fP, +.B " const char *\fIname\fP);" +.sp +.B int pcre_get_stringtable_entries(const pcre *\fIcode\fP, +.B " const char *\fIname\fP, char **\fIfirst\fP, char **\fIlast\fP);" +.sp +.B int pcre_get_substring(const char *\fIsubject\fP, int *\fIovector\fP, +.B " int \fIstringcount\fP, int \fIstringnumber\fP," +.B " const char **\fIstringptr\fP);" +.sp +.B int pcre_get_substring_list(const char *\fIsubject\fP, +.B " int *\fIovector\fP, int \fIstringcount\fP, const char ***\fIlistptr\fP);" +.sp +.B void pcre_free_substring(const char *\fIstringptr\fP); +.sp +.B void pcre_free_substring_list(const char **\fIstringptr\fP); +.fi +. +. +.SH "PCRE NATIVE API AUXILIARY FUNCTIONS" +.rs +.sp +.nf +.B int pcre_jit_exec(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP," +.B " const char *\fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," +.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP," +.B " pcre_jit_stack *\fIjstack\fP);" +.sp +.B pcre_jit_stack *pcre_jit_stack_alloc(int \fIstartsize\fP, int \fImaxsize\fP); +.sp +.B void pcre_jit_stack_free(pcre_jit_stack *\fIstack\fP); +.sp +.B void pcre_assign_jit_stack(pcre_extra *\fIextra\fP, +.B " pcre_jit_callback \fIcallback\fP, void *\fIdata\fP);" +.sp +.B const unsigned char *pcre_maketables(void); +.sp +.B int pcre_fullinfo(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP," +.B " int \fIwhat\fP, void *\fIwhere\fP);" +.sp +.B int pcre_refcount(pcre *\fIcode\fP, int \fIadjust\fP); +.sp +.B int pcre_config(int \fIwhat\fP, void *\fIwhere\fP); +.sp +.B const char *pcre_version(void); +.sp +.B int pcre_pattern_to_host_byte_order(pcre *\fIcode\fP, +.B " pcre_extra *\fIextra\fP, const unsigned char *\fItables\fP);" +.fi +. +. +.SH "PCRE NATIVE API INDIRECTED FUNCTIONS" +.rs +.sp +.nf +.B void *(*pcre_malloc)(size_t); +.sp +.B void (*pcre_free)(void *); +.sp +.B void *(*pcre_stack_malloc)(size_t); +.sp +.B void (*pcre_stack_free)(void *); +.sp +.B int (*pcre_callout)(pcre_callout_block *); +.sp +.B int (*pcre_stack_guard)(void); +.fi +. +. +.SH "PCRE 8-BIT, 16-BIT, AND 32-BIT LIBRARIES" +.rs +.sp +As well as support for 8-bit character strings, PCRE also supports 16-bit +strings (from release 8.30) and 32-bit strings (from release 8.32), by means of +two additional libraries. They can be built as well as, or instead of, the +8-bit library. To avoid too much complication, this document describes the +8-bit versions of the functions, with only occasional references to the 16-bit +and 32-bit libraries. +.P +The 16-bit and 32-bit functions operate in the same way as their 8-bit +counterparts; they just use different data types for their arguments and +results, and their names start with \fBpcre16_\fP or \fBpcre32_\fP instead of +\fBpcre_\fP. For every option that has UTF8 in its name (for example, +PCRE_UTF8), there are corresponding 16-bit and 32-bit names with UTF8 replaced +by UTF16 or UTF32, respectively. This facility is in fact just cosmetic; the +16-bit and 32-bit option names define the same bit values. +.P +References to bytes and UTF-8 in this document should be read as references to +16-bit data units and UTF-16 when using the 16-bit library, or 32-bit data +units and UTF-32 when using the 32-bit library, unless specified otherwise. +More details of the specific differences for the 16-bit and 32-bit libraries +are given in the +.\" HREF +\fBpcre16\fP +.\" +and +.\" HREF +\fBpcre32\fP +.\" +pages. +. +. +.SH "PCRE API OVERVIEW" +.rs +.sp +PCRE has its own native API, which is described in this document. There are +also some wrapper functions (for the 8-bit library only) that correspond to the +POSIX regular expression API, but they do not give access to all the +functionality. They are described in the +.\" HREF +\fBpcreposix\fP +.\" +documentation. Both of these APIs define a set of C function calls. A C++ +wrapper (again for the 8-bit library only) is also distributed with PCRE. It is +documented in the +.\" HREF +\fBpcrecpp\fP +.\" +page. +.P +The native API C function prototypes are defined in the header file +\fBpcre.h\fP, and on Unix-like systems the (8-bit) library itself is called +\fBlibpcre\fP. It can normally be accessed by adding \fB-lpcre\fP to the +command for linking an application that uses PCRE. The header file defines the +macros PCRE_MAJOR and PCRE_MINOR to contain the major and minor release numbers +for the library. Applications can use these to include support for different +releases of PCRE. +.P +In a Windows environment, if you want to statically link an application program +against a non-dll \fBpcre.a\fP file, you must define PCRE_STATIC before +including \fBpcre.h\fP or \fBpcrecpp.h\fP, because otherwise the +\fBpcre_malloc()\fP and \fBpcre_free()\fP exported functions will be declared +\fB__declspec(dllimport)\fP, with unwanted results. +.P +The functions \fBpcre_compile()\fP, \fBpcre_compile2()\fP, \fBpcre_study()\fP, +and \fBpcre_exec()\fP are used for compiling and matching regular expressions +in a Perl-compatible manner. A sample program that demonstrates the simplest +way of using them is provided in the file called \fIpcredemo.c\fP in the PCRE +source distribution. A listing of this program is given in the +.\" HREF +\fBpcredemo\fP +.\" +documentation, and the +.\" HREF +\fBpcresample\fP +.\" +documentation describes how to compile and run it. +.P +Just-in-time compiler support is an optional feature of PCRE that can be built +in appropriate hardware environments. It greatly speeds up the matching +performance of many patterns. Simple programs can easily request that it be +used if available, by setting an option that is ignored when it is not +relevant. More complicated programs might need to make use of the functions +\fBpcre_jit_stack_alloc()\fP, \fBpcre_jit_stack_free()\fP, and +\fBpcre_assign_jit_stack()\fP in order to control the JIT code's memory usage. +.P +From release 8.32 there is also a direct interface for JIT execution, which +gives improved performance. The JIT-specific functions are discussed in the +.\" HREF +\fBpcrejit\fP +.\" +documentation. +.P +A second matching function, \fBpcre_dfa_exec()\fP, which is not +Perl-compatible, is also provided. This uses a different algorithm for the +matching. The alternative algorithm finds all possible matches (at a given +point in the subject), and scans the subject just once (unless there are +lookbehind assertions). However, this algorithm does not return captured +substrings. A description of the two matching algorithms and their advantages +and disadvantages is given in the +.\" HREF +\fBpcrematching\fP +.\" +documentation. +.P +In addition to the main compiling and matching functions, there are convenience +functions for extracting captured substrings from a subject string that is +matched by \fBpcre_exec()\fP. They are: +.sp + \fBpcre_copy_substring()\fP + \fBpcre_copy_named_substring()\fP + \fBpcre_get_substring()\fP + \fBpcre_get_named_substring()\fP + \fBpcre_get_substring_list()\fP + \fBpcre_get_stringnumber()\fP + \fBpcre_get_stringtable_entries()\fP +.sp +\fBpcre_free_substring()\fP and \fBpcre_free_substring_list()\fP are also +provided, to free the memory used for extracted strings. +.P +The function \fBpcre_maketables()\fP is used to build a set of character tables +in the current locale for passing to \fBpcre_compile()\fP, \fBpcre_exec()\fP, +or \fBpcre_dfa_exec()\fP. This is an optional facility that is provided for +specialist use. Most commonly, no special tables are passed, in which case +internal tables that are generated when PCRE is built are used. +.P +The function \fBpcre_fullinfo()\fP is used to find out information about a +compiled pattern. The function \fBpcre_version()\fP returns a pointer to a +string containing the version of PCRE and its date of release. +.P +The function \fBpcre_refcount()\fP maintains a reference count in a data block +containing a compiled pattern. This is provided for the benefit of +object-oriented applications. +.P +The global variables \fBpcre_malloc\fP and \fBpcre_free\fP initially contain +the entry points of the standard \fBmalloc()\fP and \fBfree()\fP functions, +respectively. PCRE calls the memory management functions via these variables, +so a calling program can replace them if it wishes to intercept the calls. This +should be done before calling any PCRE functions. +.P +The global variables \fBpcre_stack_malloc\fP and \fBpcre_stack_free\fP are also +indirections to memory management functions. These special functions are used +only when PCRE is compiled to use the heap for remembering data, instead of +recursive function calls, when running the \fBpcre_exec()\fP function. See the +.\" HREF +\fBpcrebuild\fP +.\" +documentation for details of how to do this. It is a non-standard way of +building PCRE, for use in environments that have limited stacks. Because of the +greater use of memory management, it runs more slowly. Separate functions are +provided so that special-purpose external code can be used for this case. When +used, these functions always allocate memory blocks of the same size. There is +a discussion about PCRE's stack usage in the +.\" HREF +\fBpcrestack\fP +.\" +documentation. +.P +The global variable \fBpcre_callout\fP initially contains NULL. It can be set +by the caller to a "callout" function, which PCRE will then call at specified +points during a matching operation. Details are given in the +.\" HREF +\fBpcrecallout\fP +.\" +documentation. +.P +The global variable \fBpcre_stack_guard\fP initially contains NULL. It can be +set by the caller to a function that is called by PCRE whenever it starts +to compile a parenthesized part of a pattern. When parentheses are nested, PCRE +uses recursive function calls, which use up the system stack. This function is +provided so that applications with restricted stacks can force a compilation +error if the stack runs out. The function should return zero if all is well, or +non-zero to force an error. +. +. +.\" HTML +.SH NEWLINES +.rs +.sp +PCRE supports five different conventions for indicating line breaks in +strings: a single CR (carriage return) character, a single LF (linefeed) +character, the two-character sequence CRLF, any of the three preceding, or any +Unicode newline sequence. The Unicode newline sequences are the three just +mentioned, plus the single characters VT (vertical tab, U+000B), FF (form feed, +U+000C), NEL (next line, U+0085), LS (line separator, U+2028), and PS +(paragraph separator, U+2029). +.P +Each of the first three conventions is used by at least one operating system as +its standard newline sequence. When PCRE is built, a default can be specified. +The default default is LF, which is the Unix standard. When PCRE is run, the +default can be overridden, either when a pattern is compiled, or when it is +matched. +.P +At compile time, the newline convention can be specified by the \fIoptions\fP +argument of \fBpcre_compile()\fP, or it can be specified by special text at the +start of the pattern itself; this overrides any other settings. See the +.\" HREF +\fBpcrepattern\fP +.\" +page for details of the special character sequences. +.P +In the PCRE documentation the word "newline" is used to mean "the character or +pair of characters that indicate a line break". The choice of newline +convention affects the handling of the dot, circumflex, and dollar +metacharacters, the handling of #-comments in /x mode, and, when CRLF is a +recognized line ending sequence, the match position advancement for a +non-anchored pattern. There is more detail about this in the +.\" HTML +.\" +section on \fBpcre_exec()\fP options +.\" +below. +.P +The choice of newline convention does not affect the interpretation of +the \en or \er escape sequences, nor does it affect what \eR matches, which is +controlled in a similar way, but by separate options. +. +. +.SH MULTITHREADING +.rs +.sp +The PCRE functions can be used in multi-threading applications, with the +proviso that the memory management functions pointed to by \fBpcre_malloc\fP, +\fBpcre_free\fP, \fBpcre_stack_malloc\fP, and \fBpcre_stack_free\fP, and the +callout and stack-checking functions pointed to by \fBpcre_callout\fP and +\fBpcre_stack_guard\fP, are shared by all threads. +.P +The compiled form of a regular expression is not altered during matching, so +the same compiled pattern can safely be used by several threads at once. +.P +If the just-in-time optimization feature is being used, it needs separate +memory stack areas for each thread. See the +.\" HREF +\fBpcrejit\fP +.\" +documentation for more details. +. +. +.SH "SAVING PRECOMPILED PATTERNS FOR LATER USE" +.rs +.sp +The compiled form of a regular expression can be saved and re-used at a later +time, possibly by a different program, and even on a host other than the one on +which it was compiled. Details are given in the +.\" HREF +\fBpcreprecompile\fP +.\" +documentation, which includes a description of the +\fBpcre_pattern_to_host_byte_order()\fP function. However, compiling a regular +expression with one version of PCRE for use with a different version is not +guaranteed to work and may cause crashes. +. +. +.SH "CHECKING BUILD-TIME OPTIONS" +.rs +.sp +.B int pcre_config(int \fIwhat\fP, void *\fIwhere\fP); +.PP +The function \fBpcre_config()\fP makes it possible for a PCRE client to +discover which optional features have been compiled into the PCRE library. The +.\" HREF +\fBpcrebuild\fP +.\" +documentation has more details about these optional features. +.P +The first argument for \fBpcre_config()\fP is an integer, specifying which +information is required; the second argument is a pointer to a variable into +which the information is placed. The returned value is zero on success, or the +negative error code PCRE_ERROR_BADOPTION if the value in the first argument is +not recognized. The following information is available: +.sp + PCRE_CONFIG_UTF8 +.sp +The output is an integer that is set to one if UTF-8 support is available; +otherwise it is set to zero. This value should normally be given to the 8-bit +version of this function, \fBpcre_config()\fP. If it is given to the 16-bit +or 32-bit version of this function, the result is PCRE_ERROR_BADOPTION. +.sp + PCRE_CONFIG_UTF16 +.sp +The output is an integer that is set to one if UTF-16 support is available; +otherwise it is set to zero. This value should normally be given to the 16-bit +version of this function, \fBpcre16_config()\fP. If it is given to the 8-bit +or 32-bit version of this function, the result is PCRE_ERROR_BADOPTION. +.sp + PCRE_CONFIG_UTF32 +.sp +The output is an integer that is set to one if UTF-32 support is available; +otherwise it is set to zero. This value should normally be given to the 32-bit +version of this function, \fBpcre32_config()\fP. If it is given to the 8-bit +or 16-bit version of this function, the result is PCRE_ERROR_BADOPTION. +.sp + PCRE_CONFIG_UNICODE_PROPERTIES +.sp +The output is an integer that is set to one if support for Unicode character +properties is available; otherwise it is set to zero. +.sp + PCRE_CONFIG_JIT +.sp +The output is an integer that is set to one if support for just-in-time +compiling is available; otherwise it is set to zero. +.sp + PCRE_CONFIG_JITTARGET +.sp +The output is a pointer to a zero-terminated "const char *" string. If JIT +support is available, the string contains the name of the architecture for +which the JIT compiler is configured, for example "x86 32bit (little endian + +unaligned)". If JIT support is not available, the result is NULL. +.sp + PCRE_CONFIG_NEWLINE +.sp +The output is an integer whose value specifies the default character sequence +that is recognized as meaning "newline". The values that are supported in +ASCII/Unicode environments are: 10 for LF, 13 for CR, 3338 for CRLF, -2 for +ANYCRLF, and -1 for ANY. In EBCDIC environments, CR, ANYCRLF, and ANY yield the +same values. However, the value for LF is normally 21, though some EBCDIC +environments use 37. The corresponding values for CRLF are 3349 and 3365. The +default should normally correspond to the standard sequence for your operating +system. +.sp + PCRE_CONFIG_BSR +.sp +The output is an integer whose value indicates what character sequences the \eR +escape sequence matches by default. A value of 0 means that \eR matches any +Unicode line ending sequence; a value of 1 means that \eR matches only CR, LF, +or CRLF. The default can be overridden when a pattern is compiled or matched. +.sp + PCRE_CONFIG_LINK_SIZE +.sp +The output is an integer that contains the number of bytes used for internal +linkage in compiled regular expressions. For the 8-bit library, the value can +be 2, 3, or 4. For the 16-bit library, the value is either 2 or 4 and is still +a number of bytes. For the 32-bit library, the value is either 2 or 4 and is +still a number of bytes. The default value of 2 is sufficient for all but the +most massive patterns, since it allows the compiled pattern to be up to 64K in +size. Larger values allow larger regular expressions to be compiled, at the +expense of slower matching. +.sp + PCRE_CONFIG_POSIX_MALLOC_THRESHOLD +.sp +The output is an integer that contains the threshold above which the POSIX +interface uses \fBmalloc()\fP for output vectors. Further details are given in +the +.\" HREF +\fBpcreposix\fP +.\" +documentation. +.sp + PCRE_CONFIG_PARENS_LIMIT +.sp +The output is a long integer that gives the maximum depth of nesting of +parentheses (of any kind) in a pattern. This limit is imposed to cap the amount +of system stack used when a pattern is compiled. It is specified when PCRE is +built; the default is 250. This limit does not take into account the stack that +may already be used by the calling application. For finer control over +compilation stack usage, you can set a pointer to an external checking function +in \fBpcre_stack_guard\fP. +.sp + PCRE_CONFIG_MATCH_LIMIT +.sp +The output is a long integer that gives the default limit for the number of +internal matching function calls in a \fBpcre_exec()\fP execution. Further +details are given with \fBpcre_exec()\fP below. +.sp + PCRE_CONFIG_MATCH_LIMIT_RECURSION +.sp +The output is a long integer that gives the default limit for the depth of +recursion when calling the internal matching function in a \fBpcre_exec()\fP +execution. Further details are given with \fBpcre_exec()\fP below. +.sp + PCRE_CONFIG_STACKRECURSE +.sp +The output is an integer that is set to one if internal recursion when running +\fBpcre_exec()\fP is implemented by recursive function calls that use the stack +to remember their state. This is the usual way that PCRE is compiled. The +output is zero if PCRE was compiled to use blocks of data on the heap instead +of recursive function calls. In this case, \fBpcre_stack_malloc\fP and +\fBpcre_stack_free\fP are called to manage memory blocks on the heap, thus +avoiding the use of the stack. +. +. +.SH "COMPILING A PATTERN" +.rs +.sp +.nf +.B pcre *pcre_compile(const char *\fIpattern\fP, int \fIoptions\fP, +.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," +.B " const unsigned char *\fItableptr\fP);" +.sp +.B pcre *pcre_compile2(const char *\fIpattern\fP, int \fIoptions\fP, +.B " int *\fIerrorcodeptr\fP," +.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," +.B " const unsigned char *\fItableptr\fP);" +.fi +.P +Either of the functions \fBpcre_compile()\fP or \fBpcre_compile2()\fP can be +called to compile a pattern into an internal form. The only difference between +the two interfaces is that \fBpcre_compile2()\fP has an additional argument, +\fIerrorcodeptr\fP, via which a numerical error code can be returned. To avoid +too much repetition, we refer just to \fBpcre_compile()\fP below, but the +information applies equally to \fBpcre_compile2()\fP. +.P +The pattern is a C string terminated by a binary zero, and is passed in the +\fIpattern\fP argument. A pointer to a single block of memory that is obtained +via \fBpcre_malloc\fP is returned. This contains the compiled code and related +data. The \fBpcre\fP type is defined for the returned block; this is a typedef +for a structure whose contents are not externally defined. It is up to the +caller to free the memory (via \fBpcre_free\fP) when it is no longer required. +.P +Although the compiled code of a PCRE regex is relocatable, that is, it does not +depend on memory location, the complete \fBpcre\fP data block is not +fully relocatable, because it may contain a copy of the \fItableptr\fP +argument, which is an address (see below). +.P +The \fIoptions\fP argument contains various bit settings that affect the +compilation. It should be zero if no options are required. The available +options are described below. Some of them (in particular, those that are +compatible with Perl, but some others as well) can also be set and unset from +within the pattern (see the detailed description in the +.\" HREF +\fBpcrepattern\fP +.\" +documentation). For those options that can be different in different parts of +the pattern, the contents of the \fIoptions\fP argument specifies their +settings at the start of compilation and execution. The PCRE_ANCHORED, +PCRE_BSR_\fIxxx\fP, PCRE_NEWLINE_\fIxxx\fP, PCRE_NO_UTF8_CHECK, and +PCRE_NO_START_OPTIMIZE options can be set at the time of matching as well as at +compile time. +.P +If \fIerrptr\fP is NULL, \fBpcre_compile()\fP returns NULL immediately. +Otherwise, if compilation of a pattern fails, \fBpcre_compile()\fP returns +NULL, and sets the variable pointed to by \fIerrptr\fP to point to a textual +error message. This is a static string that is part of the library. You must +not try to free it. Normally, the offset from the start of the pattern to the +data unit that was being processed when the error was discovered is placed in +the variable pointed to by \fIerroffset\fP, which must not be NULL (if it is, +an immediate error is given). However, for an invalid UTF-8 or UTF-16 string, +the offset is that of the first data unit of the failing character. +.P +Some errors are not detected until the whole pattern has been scanned; in these +cases, the offset passed back is the length of the pattern. Note that the +offset is in data units, not characters, even in a UTF mode. It may sometimes +point into the middle of a UTF-8 or UTF-16 character. +.P +If \fBpcre_compile2()\fP is used instead of \fBpcre_compile()\fP, and the +\fIerrorcodeptr\fP argument is not NULL, a non-zero error code number is +returned via this argument in the event of an error. This is in addition to the +textual error message. Error codes and messages are listed below. +.P +If the final argument, \fItableptr\fP, is NULL, PCRE uses a default set of +character tables that are built when PCRE is compiled, using the default C +locale. Otherwise, \fItableptr\fP must be an address that is the result of a +call to \fBpcre_maketables()\fP. This value is stored with the compiled +pattern, and used again by \fBpcre_exec()\fP and \fBpcre_dfa_exec()\fP when the +pattern is matched. For more discussion, see the section on locale support +below. +.P +This code fragment shows a typical straightforward call to \fBpcre_compile()\fP: +.sp + pcre *re; + const char *error; + int erroffset; + re = pcre_compile( + "^A.*Z", /* the pattern */ + 0, /* default options */ + &error, /* for error message */ + &erroffset, /* for error offset */ + NULL); /* use default character tables */ +.sp +The following names for option bits are defined in the \fBpcre.h\fP header +file: +.sp + PCRE_ANCHORED +.sp +If this bit is set, the pattern is forced to be "anchored", that is, it is +constrained to match only at the first matching point in the string that is +being searched (the "subject string"). This effect can also be achieved by +appropriate constructs in the pattern itself, which is the only way to do it in +Perl. +.sp + PCRE_AUTO_CALLOUT +.sp +If this bit is set, \fBpcre_compile()\fP automatically inserts callout items, +all with number 255, before each pattern item. For discussion of the callout +facility, see the +.\" HREF +\fBpcrecallout\fP +.\" +documentation. +.sp + PCRE_BSR_ANYCRLF + PCRE_BSR_UNICODE +.sp +These options (which are mutually exclusive) control what the \eR escape +sequence matches. The choice is either to match only CR, LF, or CRLF, or to +match any Unicode newline sequence. The default is specified when PCRE is +built. It can be overridden from within the pattern, or by setting an option +when a compiled pattern is matched. +.sp + PCRE_CASELESS +.sp +If this bit is set, letters in the pattern match both upper and lower case +letters. It is equivalent to Perl's /i option, and it can be changed within a +pattern by a (?i) option setting. In UTF-8 mode, PCRE always understands the +concept of case for characters whose values are less than 128, so caseless +matching is always possible. For characters with higher values, the concept of +case is supported if PCRE is compiled with Unicode property support, but not +otherwise. If you want to use caseless matching for characters 128 and above, +you must ensure that PCRE is compiled with Unicode property support as well as +with UTF-8 support. +.sp + PCRE_DOLLAR_ENDONLY +.sp +If this bit is set, a dollar metacharacter in the pattern matches only at the +end of the subject string. Without this option, a dollar also matches +immediately before a newline at the end of the string (but not before any other +newlines). The PCRE_DOLLAR_ENDONLY option is ignored if PCRE_MULTILINE is set. +There is no equivalent to this option in Perl, and no way to set it within a +pattern. +.sp + PCRE_DOTALL +.sp +If this bit is set, a dot metacharacter in the pattern matches a character of +any value, including one that indicates a newline. However, it only ever +matches one character, even if newlines are coded as CRLF. Without this option, +a dot does not match when the current position is at a newline. This option is +equivalent to Perl's /s option, and it can be changed within a pattern by a +(?s) option setting. A negative class such as [^a] always matches newline +characters, independent of the setting of this option. +.sp + PCRE_DUPNAMES +.sp +If this bit is set, names used to identify capturing subpatterns need not be +unique. This can be helpful for certain types of pattern when it is known that +only one instance of the named subpattern can ever be matched. There are more +details of named subpatterns below; see also the +.\" HREF +\fBpcrepattern\fP +.\" +documentation. +.sp + PCRE_EXTENDED +.sp +If this bit is set, most white space characters in the pattern are totally +ignored except when escaped or inside a character class. However, white space +is not allowed within sequences such as (?> that introduce various +parenthesized subpatterns, nor within a numerical quantifier such as {1,3}. +However, ignorable white space is permitted between an item and a following +quantifier and between a quantifier and a following + that indicates +possessiveness. +.P +White space did not used to include the VT character (code 11), because Perl +did not treat this character as white space. However, Perl changed at release +5.18, so PCRE followed at release 8.34, and VT is now treated as white space. +.P +PCRE_EXTENDED also causes characters between an unescaped # outside a character +class and the next newline, inclusive, to be ignored. PCRE_EXTENDED is +equivalent to Perl's /x option, and it can be changed within a pattern by a +(?x) option setting. +.P +Which characters are interpreted as newlines is controlled by the options +passed to \fBpcre_compile()\fP or by a special sequence at the start of the +pattern, as described in the section entitled +.\" HTML +.\" +"Newline conventions" +.\" +in the \fBpcrepattern\fP documentation. Note that the end of this type of +comment is a literal newline sequence in the pattern; escape sequences that +happen to represent a newline do not count. +.P +This option makes it possible to include comments inside complicated patterns. +Note, however, that this applies only to data characters. White space characters +may never appear within special character sequences in a pattern, for example +within the sequence (?( that introduces a conditional subpattern. +.sp + PCRE_EXTRA +.sp +This option was invented in order to turn on additional functionality of PCRE +that is incompatible with Perl, but it is currently of very little use. When +set, any backslash in a pattern that is followed by a letter that has no +special meaning causes an error, thus reserving these combinations for future +expansion. By default, as in Perl, a backslash followed by a letter with no +special meaning is treated as a literal. (Perl can, however, be persuaded to +give an error for this, by running it with the -w option.) There are at present +no other features controlled by this option. It can also be set by a (?X) +option setting within a pattern. +.sp + PCRE_FIRSTLINE +.sp +If this option is set, an unanchored pattern is required to match before or at +the first newline in the subject string, though the matched text may continue +over the newline. +.sp + PCRE_JAVASCRIPT_COMPAT +.sp +If this option is set, PCRE's behaviour is changed in some ways so that it is +compatible with JavaScript rather than Perl. The changes are as follows: +.P +(1) A lone closing square bracket in a pattern causes a compile-time error, +because this is illegal in JavaScript (by default it is treated as a data +character). Thus, the pattern AB]CD becomes illegal when this option is set. +.P +(2) At run time, a back reference to an unset subpattern group matches an empty +string (by default this causes the current matching alternative to fail). A +pattern such as (\e1)(a) succeeds when this option is set (assuming it can find +an "a" in the subject), whereas it fails by default, for Perl compatibility. +.P +(3) \eU matches an upper case "U" character; by default \eU causes a compile +time error (Perl uses \eU to upper case subsequent characters). +.P +(4) \eu matches a lower case "u" character unless it is followed by four +hexadecimal digits, in which case the hexadecimal number defines the code point +to match. By default, \eu causes a compile time error (Perl uses it to upper +case the following character). +.P +(5) \ex matches a lower case "x" character unless it is followed by two +hexadecimal digits, in which case the hexadecimal number defines the code point +to match. By default, as in Perl, a hexadecimal number is always expected after +\ex, but it may have zero, one, or two digits (so, for example, \exz matches a +binary zero character followed by z). +.sp + PCRE_MULTILINE +.sp +By default, for the purposes of matching "start of line" and "end of line", +PCRE treats the subject string as consisting of a single line of characters, +even if it actually contains newlines. The "start of line" metacharacter (^) +matches only at the start of the string, and the "end of line" metacharacter +($) matches only at the end of the string, or before a terminating newline +(except when PCRE_DOLLAR_ENDONLY is set). Note, however, that unless +PCRE_DOTALL is set, the "any character" metacharacter (.) does not match at a +newline. This behaviour (for ^, $, and dot) is the same as Perl. +.P +When PCRE_MULTILINE it is set, the "start of line" and "end of line" constructs +match immediately following or immediately before internal newlines in the +subject string, respectively, as well as at the very start and end. This is +equivalent to Perl's /m option, and it can be changed within a pattern by a +(?m) option setting. If there are no newlines in a subject string, or no +occurrences of ^ or $ in a pattern, setting PCRE_MULTILINE has no effect. +.sp + PCRE_NEVER_UTF +.sp +This option locks out interpretation of the pattern as UTF-8 (or UTF-16 or +UTF-32 in the 16-bit and 32-bit libraries). In particular, it prevents the +creator of the pattern from switching to UTF interpretation by starting the +pattern with (*UTF). This may be useful in applications that process patterns +from external sources. The combination of PCRE_UTF8 and PCRE_NEVER_UTF also +causes an error. +.sp + PCRE_NEWLINE_CR + PCRE_NEWLINE_LF + PCRE_NEWLINE_CRLF + PCRE_NEWLINE_ANYCRLF + PCRE_NEWLINE_ANY +.sp +These options override the default newline definition that was chosen when PCRE +was built. Setting the first or the second specifies that a newline is +indicated by a single character (CR or LF, respectively). Setting +PCRE_NEWLINE_CRLF specifies that a newline is indicated by the two-character +CRLF sequence. Setting PCRE_NEWLINE_ANYCRLF specifies that any of the three +preceding sequences should be recognized. Setting PCRE_NEWLINE_ANY specifies +that any Unicode newline sequence should be recognized. +.P +In an ASCII/Unicode environment, the Unicode newline sequences are the three +just mentioned, plus the single characters VT (vertical tab, U+000B), FF (form +feed, U+000C), NEL (next line, U+0085), LS (line separator, U+2028), and PS +(paragraph separator, U+2029). For the 8-bit library, the last two are +recognized only in UTF-8 mode. +.P +When PCRE is compiled to run in an EBCDIC (mainframe) environment, the code for +CR is 0x0d, the same as ASCII. However, the character code for LF is normally +0x15, though in some EBCDIC environments 0x25 is used. Whichever of these is +not LF is made to correspond to Unicode's NEL character. EBCDIC codes are all +less than 256. For more details, see the +.\" HREF +\fBpcrebuild\fP +.\" +documentation. +.P +The newline setting in the options word uses three bits that are treated +as a number, giving eight possibilities. Currently only six are used (default +plus the five values above). This means that if you set more than one newline +option, the combination may or may not be sensible. For example, +PCRE_NEWLINE_CR with PCRE_NEWLINE_LF is equivalent to PCRE_NEWLINE_CRLF, but +other combinations may yield unused numbers and cause an error. +.P +The only time that a line break in a pattern is specially recognized when +compiling is when PCRE_EXTENDED is set. CR and LF are white space characters, +and so are ignored in this mode. Also, an unescaped # outside a character class +indicates a comment that lasts until after the next line break sequence. In +other circumstances, line break sequences in patterns are treated as literal +data. +.P +The newline option that is set at compile time becomes the default that is used +for \fBpcre_exec()\fP and \fBpcre_dfa_exec()\fP, but it can be overridden. +.sp + PCRE_NO_AUTO_CAPTURE +.sp +If this option is set, it disables the use of numbered capturing parentheses in +the pattern. Any opening parenthesis that is not followed by ? behaves as if it +were followed by ?: but named parentheses can still be used for capturing (and +they acquire numbers in the usual way). There is no equivalent of this option +in Perl. +.sp + PCRE_NO_AUTO_POSSESS +.sp +If this option is set, it disables "auto-possessification". This is an +optimization that, for example, turns a+b into a++b in order to avoid +backtracks into a+ that can never be successful. However, if callouts are in +use, auto-possessification means that some of them are never taken. You can set +this option if you want the matching functions to do a full unoptimized search +and run all the callouts, but it is mainly provided for testing purposes. +.sp + PCRE_NO_START_OPTIMIZE +.sp +This is an option that acts at matching time; that is, it is really an option +for \fBpcre_exec()\fP or \fBpcre_dfa_exec()\fP. If it is set at compile time, +it is remembered with the compiled pattern and assumed at matching time. This +is necessary if you want to use JIT execution, because the JIT compiler needs +to know whether or not this option is set. For details see the discussion of +PCRE_NO_START_OPTIMIZE +.\" HTML +.\" +below. +.\" +.sp + PCRE_UCP +.sp +This option changes the way PCRE processes \eB, \eb, \eD, \ed, \eS, \es, \eW, +\ew, and some of the POSIX character classes. By default, only ASCII characters +are recognized, but if PCRE_UCP is set, Unicode properties are used instead to +classify characters. More details are given in the section on +.\" HTML +.\" +generic character types +.\" +in the +.\" HREF +\fBpcrepattern\fP +.\" +page. If you set PCRE_UCP, matching one of the items it affects takes much +longer. The option is available only if PCRE has been compiled with Unicode +property support. +.sp + PCRE_UNGREEDY +.sp +This option inverts the "greediness" of the quantifiers so that they are not +greedy by default, but become greedy if followed by "?". It is not compatible +with Perl. It can also be set by a (?U) option setting within the pattern. +.sp + PCRE_UTF8 +.sp +This option causes PCRE to regard both the pattern and the subject as strings +of UTF-8 characters instead of single-byte strings. However, it is available +only when PCRE is built to include UTF support. If not, the use of this option +provokes an error. Details of how this option changes the behaviour of PCRE are +given in the +.\" HREF +\fBpcreunicode\fP +.\" +page. +.sp + PCRE_NO_UTF8_CHECK +.sp +When PCRE_UTF8 is set, the validity of the pattern as a UTF-8 string is +automatically checked. There is a discussion about the +.\" HTML +.\" +validity of UTF-8 strings +.\" +in the +.\" HREF +\fBpcreunicode\fP +.\" +page. If an invalid UTF-8 sequence is found, \fBpcre_compile()\fP returns an +error. If you already know that your pattern is valid, and you want to skip +this check for performance reasons, you can set the PCRE_NO_UTF8_CHECK option. +When it is set, the effect of passing an invalid UTF-8 string as a pattern is +undefined. It may cause your program to crash or loop. Note that this option +can also be passed to \fBpcre_exec()\fP and \fBpcre_dfa_exec()\fP, to suppress +the validity checking of subject strings only. If the same string is being +matched many times, the option can be safely set for the second and subsequent +matchings to improve performance. +. +. +.SH "COMPILATION ERROR CODES" +.rs +.sp +The following table lists the error codes than may be returned by +\fBpcre_compile2()\fP, along with the error messages that may be returned by +both compiling functions. Note that error messages are always 8-bit ASCII +strings, even in 16-bit or 32-bit mode. As PCRE has developed, some error codes +have fallen out of use. To avoid confusion, they have not been re-used. +.sp + 0 no error + 1 \e at end of pattern + 2 \ec at end of pattern + 3 unrecognized character follows \e + 4 numbers out of order in {} quantifier + 5 number too big in {} quantifier + 6 missing terminating ] for character class + 7 invalid escape sequence in character class + 8 range out of order in character class + 9 nothing to repeat + 10 [this code is not in use] + 11 internal error: unexpected repeat + 12 unrecognized character after (? or (?- + 13 POSIX named classes are supported only within a class + 14 missing ) + 15 reference to non-existent subpattern + 16 erroffset passed as NULL + 17 unknown option bit(s) set + 18 missing ) after comment + 19 [this code is not in use] + 20 regular expression is too large + 21 failed to get memory + 22 unmatched parentheses + 23 internal error: code overflow + 24 unrecognized character after (?< + 25 lookbehind assertion is not fixed length + 26 malformed number or name after (?( + 27 conditional group contains more than two branches + 28 assertion expected after (?( + 29 (?R or (?[+-]digits must be followed by ) + 30 unknown POSIX class name + 31 POSIX collating elements are not supported + 32 this version of PCRE is compiled without UTF support + 33 [this code is not in use] + 34 character value in \ex{} or \eo{} is too large + 35 invalid condition (?(0) + 36 \eC not allowed in lookbehind assertion + 37 PCRE does not support \eL, \el, \eN{name}, \eU, or \eu + 38 number after (?C is > 255 + 39 closing ) for (?C expected + 40 recursive call could loop indefinitely + 41 unrecognized character after (?P + 42 syntax error in subpattern name (missing terminator) + 43 two named subpatterns have the same name + 44 invalid UTF-8 string (specifically UTF-8) + 45 support for \eP, \ep, and \eX has not been compiled + 46 malformed \eP or \ep sequence + 47 unknown property name after \eP or \ep + 48 subpattern name is too long (maximum 32 characters) + 49 too many named subpatterns (maximum 10000) + 50 [this code is not in use] + 51 octal value is greater than \e377 in 8-bit non-UTF-8 mode + 52 internal error: overran compiling workspace + 53 internal error: previously-checked referenced subpattern + not found + 54 DEFINE group contains more than one branch + 55 repeating a DEFINE group is not allowed + 56 inconsistent NEWLINE options + 57 \eg is not followed by a braced, angle-bracketed, or quoted + name/number or by a plain number + 58 a numbered reference must not be zero + 59 an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT) + 60 (*VERB) not recognized or malformed + 61 number is too big + 62 subpattern name expected + 63 digit expected after (?+ + 64 ] is an invalid data character in JavaScript compatibility mode + 65 different names for subpatterns of the same number are + not allowed + 66 (*MARK) must have an argument + 67 this version of PCRE is not compiled with Unicode property + support + 68 \ec must be followed by an ASCII character + 69 \ek is not followed by a braced, angle-bracketed, or quoted name + 70 internal error: unknown opcode in find_fixedlength() + 71 \eN is not supported in a class + 72 too many forward references + 73 disallowed Unicode code point (>= 0xd800 && <= 0xdfff) + 74 invalid UTF-16 string (specifically UTF-16) + 75 name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN) + 76 character value in \eu.... sequence is too large + 77 invalid UTF-32 string (specifically UTF-32) + 78 setting UTF is disabled by the application + 79 non-hex character in \ex{} (closing brace missing?) + 80 non-octal character in \eo{} (closing brace missing?) + 81 missing opening brace after \eo + 82 parentheses are too deeply nested + 83 invalid range in character class + 84 group name must start with a non-digit + 85 parentheses are too deeply nested (stack check) +.sp +The numbers 32 and 10000 in errors 48 and 49 are defaults; different values may +be used if the limits were changed when PCRE was built. +. +. +.\" HTML +.SH "STUDYING A PATTERN" +.rs +.sp +.nf +.B pcre_extra *pcre_study(const pcre *\fIcode\fP, int \fIoptions\fP, +.B " const char **\fIerrptr\fP);" +.fi +.PP +If a compiled pattern is going to be used several times, it is worth spending +more time analyzing it in order to speed up the time taken for matching. The +function \fBpcre_study()\fP takes a pointer to a compiled pattern as its first +argument. If studying the pattern produces additional information that will +help speed up matching, \fBpcre_study()\fP returns a pointer to a +\fBpcre_extra\fP block, in which the \fIstudy_data\fP field points to the +results of the study. +.P +The returned value from \fBpcre_study()\fP can be passed directly to +\fBpcre_exec()\fP or \fBpcre_dfa_exec()\fP. However, a \fBpcre_extra\fP block +also contains other fields that can be set by the caller before the block is +passed; these are described +.\" HTML +.\" +below +.\" +in the section on matching a pattern. +.P +If studying the pattern does not produce any useful information, +\fBpcre_study()\fP returns NULL by default. In that circumstance, if the +calling program wants to pass any of the other fields to \fBpcre_exec()\fP or +\fBpcre_dfa_exec()\fP, it must set up its own \fBpcre_extra\fP block. However, +if \fBpcre_study()\fP is called with the PCRE_STUDY_EXTRA_NEEDED option, it +returns a \fBpcre_extra\fP block even if studying did not find any additional +information. It may still return NULL, however, if an error occurs in +\fBpcre_study()\fP. +.P +The second argument of \fBpcre_study()\fP contains option bits. There are three +further options in addition to PCRE_STUDY_EXTRA_NEEDED: +.sp + PCRE_STUDY_JIT_COMPILE + PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE + PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE +.sp +If any of these are set, and the just-in-time compiler is available, the +pattern is further compiled into machine code that executes much faster than +the \fBpcre_exec()\fP interpretive matching function. If the just-in-time +compiler is not available, these options are ignored. All undefined bits in the +\fIoptions\fP argument must be zero. +.P +JIT compilation is a heavyweight optimization. It can take some time for +patterns to be analyzed, and for one-off matches and simple patterns the +benefit of faster execution might be offset by a much slower study time. +Not all patterns can be optimized by the JIT compiler. For those that cannot be +handled, matching automatically falls back to the \fBpcre_exec()\fP +interpreter. For more details, see the +.\" HREF +\fBpcrejit\fP +.\" +documentation. +.P +The third argument for \fBpcre_study()\fP is a pointer for an error message. If +studying succeeds (even if no data is returned), the variable it points to is +set to NULL. Otherwise it is set to point to a textual error message. This is a +static string that is part of the library. You must not try to free it. You +should test the error pointer for NULL after calling \fBpcre_study()\fP, to be +sure that it has run successfully. +.P +When you are finished with a pattern, you can free the memory used for the +study data by calling \fBpcre_free_study()\fP. This function was added to the +API for release 8.20. For earlier versions, the memory could be freed with +\fBpcre_free()\fP, just like the pattern itself. This will still work in cases +where JIT optimization is not used, but it is advisable to change to the new +function when convenient. +.P +This is a typical way in which \fBpcre_study\fP() is used (except that in a +real application there should be tests for errors): +.sp + int rc; + pcre *re; + pcre_extra *sd; + re = pcre_compile("pattern", 0, &error, &erroroffset, NULL); + sd = pcre_study( + re, /* result of pcre_compile() */ + 0, /* no options */ + &error); /* set to NULL or points to a message */ + rc = pcre_exec( /* see below for details of pcre_exec() options */ + re, sd, "subject", 7, 0, 0, ovector, 30); + ... + pcre_free_study(sd); + pcre_free(re); +.sp +Studying a pattern does two things: first, a lower bound for the length of +subject string that is needed to match the pattern is computed. This does not +mean that there are any strings of that length that match, but it does +guarantee that no shorter strings match. The value is used to avoid wasting +time by trying to match strings that are shorter than the lower bound. You can +find out the value in a calling program via the \fBpcre_fullinfo()\fP function. +.P +Studying a pattern is also useful for non-anchored patterns that do not have a +single fixed starting character. A bitmap of possible starting bytes is +created. This speeds up finding a position in the subject at which to start +matching. (In 16-bit mode, the bitmap is used for 16-bit values less than 256. +In 32-bit mode, the bitmap is used for 32-bit values less than 256.) +.P +These two optimizations apply to both \fBpcre_exec()\fP and +\fBpcre_dfa_exec()\fP, and the information is also used by the JIT compiler. +The optimizations can be disabled by setting the PCRE_NO_START_OPTIMIZE option. +You might want to do this if your pattern contains callouts or (*MARK) and you +want to make use of these facilities in cases where matching fails. +.P +PCRE_NO_START_OPTIMIZE can be specified at either compile time or execution +time. However, if PCRE_NO_START_OPTIMIZE is passed to \fBpcre_exec()\fP, (that +is, after any JIT compilation has happened) JIT execution is disabled. For JIT +execution to work with PCRE_NO_START_OPTIMIZE, the option must be set at +compile time. +.P +There is a longer discussion of PCRE_NO_START_OPTIMIZE +.\" HTML +.\" +below. +.\" +. +. +.\" HTML +.SH "LOCALE SUPPORT" +.rs +.sp +PCRE handles caseless matching, and determines whether characters are letters, +digits, or whatever, by reference to a set of tables, indexed by character +code point. When running in UTF-8 mode, or in the 16- or 32-bit libraries, this +applies only to characters with code points less than 256. By default, +higher-valued code points never match escapes such as \ew or \ed. However, if +PCRE is built with Unicode property support, all characters can be tested with +\ep and \eP, or, alternatively, the PCRE_UCP option can be set when a pattern +is compiled; this causes \ew and friends to use Unicode property support +instead of the built-in tables. +.P +The use of locales with Unicode is discouraged. If you are handling characters +with code points greater than 128, you should either use Unicode support, or +use locales, but not try to mix the two. +.P +PCRE contains an internal set of tables that are used when the final argument +of \fBpcre_compile()\fP is NULL. These are sufficient for many applications. +Normally, the internal tables recognize only ASCII characters. However, when +PCRE is built, it is possible to cause the internal tables to be rebuilt in the +default "C" locale of the local system, which may cause them to be different. +.P +The internal tables can always be overridden by tables supplied by the +application that calls PCRE. These may be created in a different locale from +the default. As more and more applications change to using Unicode, the need +for this locale support is expected to die away. +.P +External tables are built by calling the \fBpcre_maketables()\fP function, +which has no arguments, in the relevant locale. The result can then be passed +to \fBpcre_compile()\fP as often as necessary. For example, to build and use +tables that are appropriate for the French locale (where accented characters +with values greater than 128 are treated as letters), the following code could +be used: +.sp + setlocale(LC_CTYPE, "fr_FR"); + tables = pcre_maketables(); + re = pcre_compile(..., tables); +.sp +The locale name "fr_FR" is used on Linux and other Unix-like systems; if you +are using Windows, the name for the French locale is "french". +.P +When \fBpcre_maketables()\fP runs, the tables are built in memory that is +obtained via \fBpcre_malloc\fP. It is the caller's responsibility to ensure +that the memory containing the tables remains available for as long as it is +needed. +.P +The pointer that is passed to \fBpcre_compile()\fP is saved with the compiled +pattern, and the same tables are used via this pointer by \fBpcre_study()\fP +and also by \fBpcre_exec()\fP and \fBpcre_dfa_exec()\fP. Thus, for any single +pattern, compilation, studying and matching all happen in the same locale, but +different patterns can be processed in different locales. +.P +It is possible to pass a table pointer or NULL (indicating the use of the +internal tables) to \fBpcre_exec()\fP or \fBpcre_dfa_exec()\fP (see the +discussion below in the section on matching a pattern). This facility is +provided for use with pre-compiled patterns that have been saved and reloaded. +Character tables are not saved with patterns, so if a non-standard table was +used at compile time, it must be provided again when the reloaded pattern is +matched. Attempting to use this facility to match a pattern in a different +locale from the one in which it was compiled is likely to lead to anomalous +(usually incorrect) results. +. +. +.\" HTML +.SH "INFORMATION ABOUT A PATTERN" +.rs +.sp +.nf +.B int pcre_fullinfo(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP," +.B " int \fIwhat\fP, void *\fIwhere\fP);" +.fi +.PP +The \fBpcre_fullinfo()\fP function returns information about a compiled +pattern. It replaces the \fBpcre_info()\fP function, which was removed from the +library at version 8.30, after more than 10 years of obsolescence. +.P +The first argument for \fBpcre_fullinfo()\fP is a pointer to the compiled +pattern. The second argument is the result of \fBpcre_study()\fP, or NULL if +the pattern was not studied. The third argument specifies which piece of +information is required, and the fourth argument is a pointer to a variable +to receive the data. The yield of the function is zero for success, or one of +the following negative numbers: +.sp + PCRE_ERROR_NULL the argument \fIcode\fP was NULL + the argument \fIwhere\fP was NULL + PCRE_ERROR_BADMAGIC the "magic number" was not found + PCRE_ERROR_BADENDIANNESS the pattern was compiled with different + endianness + PCRE_ERROR_BADOPTION the value of \fIwhat\fP was invalid + PCRE_ERROR_UNSET the requested field is not set +.sp +The "magic number" is placed at the start of each compiled pattern as a simple +check against passing an arbitrary memory pointer. The endianness error can +occur if a compiled pattern is saved and reloaded on a different host. Here is +a typical call of \fBpcre_fullinfo()\fP, to obtain the length of the compiled +pattern: +.sp + int rc; + size_t length; + rc = pcre_fullinfo( + re, /* result of pcre_compile() */ + sd, /* result of pcre_study(), or NULL */ + PCRE_INFO_SIZE, /* what is required */ + &length); /* where to put the data */ +.sp +The possible values for the third argument are defined in \fBpcre.h\fP, and are +as follows: +.sp + PCRE_INFO_BACKREFMAX +.sp +Return the number of the highest back reference in the pattern. The fourth +argument should point to an \fBint\fP variable. Zero is returned if there are +no back references. +.sp + PCRE_INFO_CAPTURECOUNT +.sp +Return the number of capturing subpatterns in the pattern. The fourth argument +should point to an \fBint\fP variable. +.sp + PCRE_INFO_DEFAULT_TABLES +.sp +Return a pointer to the internal default character tables within PCRE. The +fourth argument should point to an \fBunsigned char *\fP variable. This +information call is provided for internal use by the \fBpcre_study()\fP +function. External callers can cause PCRE to use its internal tables by passing +a NULL table pointer. +.sp + PCRE_INFO_FIRSTBYTE (deprecated) +.sp +Return information about the first data unit of any matched string, for a +non-anchored pattern. The name of this option refers to the 8-bit library, +where data units are bytes. The fourth argument should point to an \fBint\fP +variable. Negative values are used for special cases. However, this means that +when the 32-bit library is in non-UTF-32 mode, the full 32-bit range of +characters cannot be returned. For this reason, this value is deprecated; use +PCRE_INFO_FIRSTCHARACTERFLAGS and PCRE_INFO_FIRSTCHARACTER instead. +.P +If there is a fixed first value, for example, the letter "c" from a pattern +such as (cat|cow|coyote), its value is returned. In the 8-bit library, the +value is always less than 256. In the 16-bit library the value can be up to +0xffff. In the 32-bit library the value can be up to 0x10ffff. +.P +If there is no fixed first value, and if either +.sp +(a) the pattern was compiled with the PCRE_MULTILINE option, and every branch +starts with "^", or +.sp +(b) every branch of the pattern starts with ".*" and PCRE_DOTALL is not set +(if it were set, the pattern would be anchored), +.sp +-1 is returned, indicating that the pattern matches only at the start of a +subject string or after any newline within the string. Otherwise -2 is +returned. For anchored patterns, -2 is returned. +.sp + PCRE_INFO_FIRSTCHARACTER +.sp +Return the value of the first data unit (non-UTF character) of any matched +string in the situation where PCRE_INFO_FIRSTCHARACTERFLAGS returns 1; +otherwise return 0. The fourth argument should point to a \fBuint_t\fP +variable. +.P +In the 8-bit library, the value is always less than 256. In the 16-bit library +the value can be up to 0xffff. In the 32-bit library in UTF-32 mode the value +can be up to 0x10ffff, and up to 0xffffffff when not using UTF-32 mode. +.sp + PCRE_INFO_FIRSTCHARACTERFLAGS +.sp +Return information about the first data unit of any matched string, for a +non-anchored pattern. The fourth argument should point to an \fBint\fP +variable. +.P +If there is a fixed first value, for example, the letter "c" from a pattern +such as (cat|cow|coyote), 1 is returned, and the character value can be +retrieved using PCRE_INFO_FIRSTCHARACTER. If there is no fixed first value, and +if either +.sp +(a) the pattern was compiled with the PCRE_MULTILINE option, and every branch +starts with "^", or +.sp +(b) every branch of the pattern starts with ".*" and PCRE_DOTALL is not set +(if it were set, the pattern would be anchored), +.sp +2 is returned, indicating that the pattern matches only at the start of a +subject string or after any newline within the string. Otherwise 0 is +returned. For anchored patterns, 0 is returned. +.sp + PCRE_INFO_FIRSTTABLE +.sp +If the pattern was studied, and this resulted in the construction of a 256-bit +table indicating a fixed set of values for the first data unit in any matching +string, a pointer to the table is returned. Otherwise NULL is returned. The +fourth argument should point to an \fBunsigned char *\fP variable. +.sp + PCRE_INFO_HASCRORLF +.sp +Return 1 if the pattern contains any explicit matches for CR or LF characters, +otherwise 0. The fourth argument should point to an \fBint\fP variable. An +explicit match is either a literal CR or LF character, or \er or \en. +.sp + PCRE_INFO_JCHANGED +.sp +Return 1 if the (?J) or (?-J) option setting is used in the pattern, otherwise +0. The fourth argument should point to an \fBint\fP variable. (?J) and +(?-J) set and unset the local PCRE_DUPNAMES option, respectively. +.sp + PCRE_INFO_JIT +.sp +Return 1 if the pattern was studied with one of the JIT options, and +just-in-time compiling was successful. The fourth argument should point to an +\fBint\fP variable. A return value of 0 means that JIT support is not available +in this version of PCRE, or that the pattern was not studied with a JIT option, +or that the JIT compiler could not handle this particular pattern. See the +.\" HREF +\fBpcrejit\fP +.\" +documentation for details of what can and cannot be handled. +.sp + PCRE_INFO_JITSIZE +.sp +If the pattern was successfully studied with a JIT option, return the size of +the JIT compiled code, otherwise return zero. The fourth argument should point +to a \fBsize_t\fP variable. +.sp + PCRE_INFO_LASTLITERAL +.sp +Return the value of the rightmost literal data unit that must exist in any +matched string, other than at its start, if such a value has been recorded. The +fourth argument should point to an \fBint\fP variable. If there is no such +value, -1 is returned. For anchored patterns, a last literal value is recorded +only if it follows something of variable length. For example, for the pattern +/^a\ed+z\ed+/ the returned value is "z", but for /^a\edz\ed/ the returned value +is -1. +.P +Since for the 32-bit library using the non-UTF-32 mode, this function is unable +to return the full 32-bit range of characters, this value is deprecated; +instead the PCRE_INFO_REQUIREDCHARFLAGS and PCRE_INFO_REQUIREDCHAR values should +be used. +.sp + PCRE_INFO_MATCH_EMPTY +.sp +Return 1 if the pattern can match an empty string, otherwise 0. The fourth +argument should point to an \fBint\fP variable. +.sp + PCRE_INFO_MATCHLIMIT +.sp +If the pattern set a match limit by including an item of the form +(*LIMIT_MATCH=nnnn) at the start, the value is returned. The fourth argument +should point to an unsigned 32-bit integer. If no such value has been set, the +call to \fBpcre_fullinfo()\fP returns the error PCRE_ERROR_UNSET. +.sp + PCRE_INFO_MAXLOOKBEHIND +.sp +Return the number of characters (NB not data units) in the longest lookbehind +assertion in the pattern. This information is useful when doing multi-segment +matching using the partial matching facilities. Note that the simple assertions +\eb and \eB require a one-character lookbehind. \eA also registers a +one-character lookbehind, though it does not actually inspect the previous +character. This is to ensure that at least one character from the old segment +is retained when a new segment is processed. Otherwise, if there are no +lookbehinds in the pattern, \eA might match incorrectly at the start of a new +segment. +.sp + PCRE_INFO_MINLENGTH +.sp +If the pattern was studied and a minimum length for matching subject strings +was computed, its value is returned. Otherwise the returned value is -1. The +value is a number of characters, which in UTF mode may be different from the +number of data units. The fourth argument should point to an \fBint\fP +variable. A non-negative value is a lower bound to the length of any matching +string. There may not be any strings of that length that do actually match, but +every string that does match is at least that long. +.sp + PCRE_INFO_NAMECOUNT + PCRE_INFO_NAMEENTRYSIZE + PCRE_INFO_NAMETABLE +.sp +PCRE supports the use of named as well as numbered capturing parentheses. The +names are just an additional way of identifying the parentheses, which still +acquire numbers. Several convenience functions such as +\fBpcre_get_named_substring()\fP are provided for extracting captured +substrings by name. It is also possible to extract the data directly, by first +converting the name to a number in order to access the correct pointers in the +output vector (described with \fBpcre_exec()\fP below). To do the conversion, +you need to use the name-to-number map, which is described by these three +values. +.P +The map consists of a number of fixed-size entries. PCRE_INFO_NAMECOUNT gives +the number of entries, and PCRE_INFO_NAMEENTRYSIZE gives the size of each +entry; both of these return an \fBint\fP value. The entry size depends on the +length of the longest name. PCRE_INFO_NAMETABLE returns a pointer to the first +entry of the table. This is a pointer to \fBchar\fP in the 8-bit library, where +the first two bytes of each entry are the number of the capturing parenthesis, +most significant byte first. In the 16-bit library, the pointer points to +16-bit data units, the first of which contains the parenthesis number. In the +32-bit library, the pointer points to 32-bit data units, the first of which +contains the parenthesis number. The rest of the entry is the corresponding +name, zero terminated. +.P +The names are in alphabetical order. If (?| is used to create multiple groups +with the same number, as described in the +.\" HTML +.\" +section on duplicate subpattern numbers +.\" +in the +.\" HREF +\fBpcrepattern\fP +.\" +page, the groups may be given the same name, but there is only one entry in the +table. Different names for groups of the same number are not permitted. +Duplicate names for subpatterns with different numbers are permitted, +but only if PCRE_DUPNAMES is set. They appear in the table in the order in +which they were found in the pattern. In the absence of (?| this is the order +of increasing number; when (?| is used this is not necessarily the case because +later subpatterns may have lower numbers. +.P +As a simple example of the name/number table, consider the following pattern +after compilation by the 8-bit library (assume PCRE_EXTENDED is set, so white +space - including newlines - is ignored): +.sp +.\" JOIN + (? (?(\ed\ed)?\ed\ed) - + (?\ed\ed) - (?\ed\ed) ) +.sp +There are four named subpatterns, so the table has four entries, and each entry +in the table is eight bytes long. The table is as follows, with non-printing +bytes shows in hexadecimal, and undefined bytes shown as ??: +.sp + 00 01 d a t e 00 ?? + 00 05 d a y 00 ?? ?? + 00 04 m o n t h 00 + 00 02 y e a r 00 ?? +.sp +When writing code to extract data from named subpatterns using the +name-to-number map, remember that the length of the entries is likely to be +different for each compiled pattern. +.sp + PCRE_INFO_OKPARTIAL +.sp +Return 1 if the pattern can be used for partial matching with +\fBpcre_exec()\fP, otherwise 0. The fourth argument should point to an +\fBint\fP variable. From release 8.00, this always returns 1, because the +restrictions that previously applied to partial matching have been lifted. The +.\" HREF +\fBpcrepartial\fP +.\" +documentation gives details of partial matching. +.sp + PCRE_INFO_OPTIONS +.sp +Return a copy of the options with which the pattern was compiled. The fourth +argument should point to an \fBunsigned long int\fP variable. These option bits +are those specified in the call to \fBpcre_compile()\fP, modified by any +top-level option settings at the start of the pattern itself. In other words, +they are the options that will be in force when matching starts. For example, +if the pattern /(?im)abc(?-i)d/ is compiled with the PCRE_EXTENDED option, the +result is PCRE_CASELESS, PCRE_MULTILINE, and PCRE_EXTENDED. +.P +A pattern is automatically anchored by PCRE if all of its top-level +alternatives begin with one of the following: +.sp + ^ unless PCRE_MULTILINE is set + \eA always + \eG always +.\" JOIN + .* if PCRE_DOTALL is set and there are no back + references to the subpattern in which .* appears +.sp +For such patterns, the PCRE_ANCHORED bit is set in the options returned by +\fBpcre_fullinfo()\fP. +.sp + PCRE_INFO_RECURSIONLIMIT +.sp +If the pattern set a recursion limit by including an item of the form +(*LIMIT_RECURSION=nnnn) at the start, the value is returned. The fourth +argument should point to an unsigned 32-bit integer. If no such value has been +set, the call to \fBpcre_fullinfo()\fP returns the error PCRE_ERROR_UNSET. +.sp + PCRE_INFO_SIZE +.sp +Return the size of the compiled pattern in bytes (for all three libraries). The +fourth argument should point to a \fBsize_t\fP variable. This value does not +include the size of the \fBpcre\fP structure that is returned by +\fBpcre_compile()\fP. The value that is passed as the argument to +\fBpcre_malloc()\fP when \fBpcre_compile()\fP is getting memory in which to +place the compiled data is the value returned by this option plus the size of +the \fBpcre\fP structure. Studying a compiled pattern, with or without JIT, +does not alter the value returned by this option. +.sp + PCRE_INFO_STUDYSIZE +.sp +Return the size in bytes (for all three libraries) of the data block pointed to +by the \fIstudy_data\fP field in a \fBpcre_extra\fP block. If \fBpcre_extra\fP +is NULL, or there is no study data, zero is returned. The fourth argument +should point to a \fBsize_t\fP variable. The \fIstudy_data\fP field is set by +\fBpcre_study()\fP to record information that will speed up matching (see the +section entitled +.\" HTML +.\" +"Studying a pattern" +.\" +above). The format of the \fIstudy_data\fP block is private, but its length +is made available via this option so that it can be saved and restored (see the +.\" HREF +\fBpcreprecompile\fP +.\" +documentation for details). +.sp + PCRE_INFO_REQUIREDCHARFLAGS +.sp +Returns 1 if there is a rightmost literal data unit that must exist in any +matched string, other than at its start. The fourth argument should point to +an \fBint\fP variable. If there is no such value, 0 is returned. If returning +1, the character value itself can be retrieved using PCRE_INFO_REQUIREDCHAR. +.P +For anchored patterns, a last literal value is recorded only if it follows +something of variable length. For example, for the pattern /^a\ed+z\ed+/ the +returned value 1 (with "z" returned from PCRE_INFO_REQUIREDCHAR), but for +/^a\edz\ed/ the returned value is 0. +.sp + PCRE_INFO_REQUIREDCHAR +.sp +Return the value of the rightmost literal data unit that must exist in any +matched string, other than at its start, if such a value has been recorded. The +fourth argument should point to a \fBuint32_t\fP variable. If there is no such +value, 0 is returned. +. +. +.SH "REFERENCE COUNTS" +.rs +.sp +.B int pcre_refcount(pcre *\fIcode\fP, int \fIadjust\fP); +.PP +The \fBpcre_refcount()\fP function is used to maintain a reference count in the +data block that contains a compiled pattern. It is provided for the benefit of +applications that operate in an object-oriented manner, where different parts +of the application may be using the same compiled pattern, but you want to free +the block when they are all done. +.P +When a pattern is compiled, the reference count field is initialized to zero. +It is changed only by calling this function, whose action is to add the +\fIadjust\fP value (which may be positive or negative) to it. The yield of the +function is the new value. However, the value of the count is constrained to +lie between 0 and 65535, inclusive. If the new value is outside these limits, +it is forced to the appropriate limit value. +.P +Except when it is zero, the reference count is not correctly preserved if a +pattern is compiled on one host and then transferred to a host whose byte-order +is different. (This seems a highly unlikely scenario.) +. +. +.SH "MATCHING A PATTERN: THE TRADITIONAL FUNCTION" +.rs +.sp +.nf +.B int pcre_exec(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP," +.B " const char *\fIsubject\fP," int \fIlength\fP, int \fIstartoffset\fP, +.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP);" +.fi +.P +The function \fBpcre_exec()\fP is called to match a subject string against a +compiled pattern, which is passed in the \fIcode\fP argument. If the +pattern was studied, the result of the study should be passed in the +\fIextra\fP argument. You can call \fBpcre_exec()\fP with the same \fIcode\fP +and \fIextra\fP arguments as many times as you like, in order to match +different subject strings with the same pattern. +.P +This function is the main matching facility of the library, and it operates in +a Perl-like manner. For specialist use there is also an alternative matching +function, which is described +.\" HTML +.\" +below +.\" +in the section about the \fBpcre_dfa_exec()\fP function. +.P +In most applications, the pattern will have been compiled (and optionally +studied) in the same process that calls \fBpcre_exec()\fP. However, it is +possible to save compiled patterns and study data, and then use them later +in different processes, possibly even on different hosts. For a discussion +about this, see the +.\" HREF +\fBpcreprecompile\fP +.\" +documentation. +.P +Here is an example of a simple call to \fBpcre_exec()\fP: +.sp + int rc; + int ovector[30]; + rc = pcre_exec( + re, /* result of pcre_compile() */ + NULL, /* we didn't study the pattern */ + "some string", /* the subject string */ + 11, /* the length of the subject string */ + 0, /* start at offset 0 in the subject */ + 0, /* default options */ + ovector, /* vector of integers for substring information */ + 30); /* number of elements (NOT size in bytes) */ +. +. +.\" HTML +.SS "Extra data for \fBpcre_exec()\fR" +.rs +.sp +If the \fIextra\fP argument is not NULL, it must point to a \fBpcre_extra\fP +data block. The \fBpcre_study()\fP function returns such a block (when it +doesn't return NULL), but you can also create one for yourself, and pass +additional information in it. The \fBpcre_extra\fP block contains the following +fields (not necessarily in this order): +.sp + unsigned long int \fIflags\fP; + void *\fIstudy_data\fP; + void *\fIexecutable_jit\fP; + unsigned long int \fImatch_limit\fP; + unsigned long int \fImatch_limit_recursion\fP; + void *\fIcallout_data\fP; + const unsigned char *\fItables\fP; + unsigned char **\fImark\fP; +.sp +In the 16-bit version of this structure, the \fImark\fP field has type +"PCRE_UCHAR16 **". +.sp +In the 32-bit version of this structure, the \fImark\fP field has type +"PCRE_UCHAR32 **". +.P +The \fIflags\fP field is used to specify which of the other fields are set. The +flag bits are: +.sp + PCRE_EXTRA_CALLOUT_DATA + PCRE_EXTRA_EXECUTABLE_JIT + PCRE_EXTRA_MARK + PCRE_EXTRA_MATCH_LIMIT + PCRE_EXTRA_MATCH_LIMIT_RECURSION + PCRE_EXTRA_STUDY_DATA + PCRE_EXTRA_TABLES +.sp +Other flag bits should be set to zero. The \fIstudy_data\fP field and sometimes +the \fIexecutable_jit\fP field are set in the \fBpcre_extra\fP block that is +returned by \fBpcre_study()\fP, together with the appropriate flag bits. You +should not set these yourself, but you may add to the block by setting other +fields and their corresponding flag bits. +.P +The \fImatch_limit\fP field provides a means of preventing PCRE from using up a +vast amount of resources when running patterns that are not going to match, +but which have a very large number of possibilities in their search trees. The +classic example is a pattern that uses nested unlimited repeats. +.P +Internally, \fBpcre_exec()\fP uses a function called \fBmatch()\fP, which it +calls repeatedly (sometimes recursively). The limit set by \fImatch_limit\fP is +imposed on the number of times this function is called during a match, which +has the effect of limiting the amount of backtracking that can take place. For +patterns that are not anchored, the count restarts from zero for each position +in the subject string. +.P +When \fBpcre_exec()\fP is called with a pattern that was successfully studied +with a JIT option, the way that the matching is executed is entirely different. +However, there is still the possibility of runaway matching that goes on for a +very long time, and so the \fImatch_limit\fP value is also used in this case +(but in a different way) to limit how long the matching can continue. +.P +The default value for the limit can be set when PCRE is built; the default +default is 10 million, which handles all but the most extreme cases. You can +override the default by suppling \fBpcre_exec()\fP with a \fBpcre_extra\fP +block in which \fImatch_limit\fP is set, and PCRE_EXTRA_MATCH_LIMIT is set in +the \fIflags\fP field. If the limit is exceeded, \fBpcre_exec()\fP returns +PCRE_ERROR_MATCHLIMIT. +.P +A value for the match limit may also be supplied by an item at the start of a +pattern of the form +.sp + (*LIMIT_MATCH=d) +.sp +where d is a decimal number. However, such a setting is ignored unless d is +less than the limit set by the caller of \fBpcre_exec()\fP or, if no such limit +is set, less than the default. +.P +The \fImatch_limit_recursion\fP field is similar to \fImatch_limit\fP, but +instead of limiting the total number of times that \fBmatch()\fP is called, it +limits the depth of recursion. The recursion depth is a smaller number than the +total number of calls, because not all calls to \fBmatch()\fP are recursive. +This limit is of use only if it is set smaller than \fImatch_limit\fP. +.P +Limiting the recursion depth limits the amount of machine stack that can be +used, or, when PCRE has been compiled to use memory on the heap instead of the +stack, the amount of heap memory that can be used. This limit is not relevant, +and is ignored, when matching is done using JIT compiled code. +.P +The default value for \fImatch_limit_recursion\fP can be set when PCRE is +built; the default default is the same value as the default for +\fImatch_limit\fP. You can override the default by suppling \fBpcre_exec()\fP +with a \fBpcre_extra\fP block in which \fImatch_limit_recursion\fP is set, and +PCRE_EXTRA_MATCH_LIMIT_RECURSION is set in the \fIflags\fP field. If the limit +is exceeded, \fBpcre_exec()\fP returns PCRE_ERROR_RECURSIONLIMIT. +.P +A value for the recursion limit may also be supplied by an item at the start of +a pattern of the form +.sp + (*LIMIT_RECURSION=d) +.sp +where d is a decimal number. However, such a setting is ignored unless d is +less than the limit set by the caller of \fBpcre_exec()\fP or, if no such limit +is set, less than the default. +.P +The \fIcallout_data\fP field is used in conjunction with the "callout" feature, +and is described in the +.\" HREF +\fBpcrecallout\fP +.\" +documentation. +.P +The \fItables\fP field is provided for use with patterns that have been +pre-compiled using custom character tables, saved to disc or elsewhere, and +then reloaded, because the tables that were used to compile a pattern are not +saved with it. See the +.\" HREF +\fBpcreprecompile\fP +.\" +documentation for a discussion of saving compiled patterns for later use. If +NULL is passed using this mechanism, it forces PCRE's internal tables to be +used. +.P +\fBWarning:\fP The tables that \fBpcre_exec()\fP uses must be the same as those +that were used when the pattern was compiled. If this is not the case, the +behaviour of \fBpcre_exec()\fP is undefined. Therefore, when a pattern is +compiled and matched in the same process, this field should never be set. In +this (the most common) case, the correct table pointer is automatically passed +with the compiled pattern from \fBpcre_compile()\fP to \fBpcre_exec()\fP. +.P +If PCRE_EXTRA_MARK is set in the \fIflags\fP field, the \fImark\fP field must +be set to point to a suitable variable. If the pattern contains any +backtracking control verbs such as (*MARK:NAME), and the execution ends up with +a name to pass back, a pointer to the name string (zero terminated) is placed +in the variable pointed to by the \fImark\fP field. The names are within the +compiled pattern; if you wish to retain such a name you must copy it before +freeing the memory of a compiled pattern. If there is no name to pass back, the +variable pointed to by the \fImark\fP field is set to NULL. For details of the +backtracking control verbs, see the section entitled +.\" HTML +.\" +"Backtracking control" +.\" +in the +.\" HREF +\fBpcrepattern\fP +.\" +documentation. +. +. +.\" HTML +.SS "Option bits for \fBpcre_exec()\fP" +.rs +.sp +The unused bits of the \fIoptions\fP argument for \fBpcre_exec()\fP must be +zero. The only bits that may be set are PCRE_ANCHORED, PCRE_NEWLINE_\fIxxx\fP, +PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, +PCRE_NO_START_OPTIMIZE, PCRE_NO_UTF8_CHECK, PCRE_PARTIAL_HARD, and +PCRE_PARTIAL_SOFT. +.P +If the pattern was successfully studied with one of the just-in-time (JIT) +compile options, the only supported options for JIT execution are +PCRE_NO_UTF8_CHECK, PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, +PCRE_NOTEMPTY_ATSTART, PCRE_PARTIAL_HARD, and PCRE_PARTIAL_SOFT. If an +unsupported option is used, JIT execution is disabled and the normal +interpretive code in \fBpcre_exec()\fP is run. +.sp + PCRE_ANCHORED +.sp +The PCRE_ANCHORED option limits \fBpcre_exec()\fP to matching at the first +matching position. If a pattern was compiled with PCRE_ANCHORED, or turned out +to be anchored by virtue of its contents, it cannot be made unachored at +matching time. +.sp + PCRE_BSR_ANYCRLF + PCRE_BSR_UNICODE +.sp +These options (which are mutually exclusive) control what the \eR escape +sequence matches. The choice is either to match only CR, LF, or CRLF, or to +match any Unicode newline sequence. These options override the choice that was +made or defaulted when the pattern was compiled. +.sp + PCRE_NEWLINE_CR + PCRE_NEWLINE_LF + PCRE_NEWLINE_CRLF + PCRE_NEWLINE_ANYCRLF + PCRE_NEWLINE_ANY +.sp +These options override the newline definition that was chosen or defaulted when +the pattern was compiled. For details, see the description of +\fBpcre_compile()\fP above. During matching, the newline choice affects the +behaviour of the dot, circumflex, and dollar metacharacters. It may also alter +the way the match position is advanced after a match failure for an unanchored +pattern. +.P +When PCRE_NEWLINE_CRLF, PCRE_NEWLINE_ANYCRLF, or PCRE_NEWLINE_ANY is set, and a +match attempt for an unanchored pattern fails when the current position is at a +CRLF sequence, and the pattern contains no explicit matches for CR or LF +characters, the match position is advanced by two characters instead of one, in +other words, to after the CRLF. +.P +The above rule is a compromise that makes the most common cases work as +expected. For example, if the pattern is .+A (and the PCRE_DOTALL option is not +set), it does not match the string "\er\enA" because, after failing at the +start, it skips both the CR and the LF before retrying. However, the pattern +[\er\en]A does match that string, because it contains an explicit CR or LF +reference, and so advances only by one character after the first failure. +.P +An explicit match for CR of LF is either a literal appearance of one of those +characters, or one of the \er or \en escape sequences. Implicit matches such as +[^X] do not count, nor does \es (which includes CR and LF in the characters +that it matches). +.P +Notwithstanding the above, anomalous effects may still occur when CRLF is a +valid newline sequence and explicit \er or \en escapes appear in the pattern. +.sp + PCRE_NOTBOL +.sp +This option specifies that first character of the subject string is not the +beginning of a line, so the circumflex metacharacter should not match before +it. Setting this without PCRE_MULTILINE (at compile time) causes circumflex +never to match. This option affects only the behaviour of the circumflex +metacharacter. It does not affect \eA. +.sp + PCRE_NOTEOL +.sp +This option specifies that the end of the subject string is not the end of a +line, so the dollar metacharacter should not match it nor (except in multiline +mode) a newline immediately before it. Setting this without PCRE_MULTILINE (at +compile time) causes dollar never to match. This option affects only the +behaviour of the dollar metacharacter. It does not affect \eZ or \ez. +.sp + PCRE_NOTEMPTY +.sp +An empty string is not considered to be a valid match if this option is set. If +there are alternatives in the pattern, they are tried. If all the alternatives +match the empty string, the entire match fails. For example, if the pattern +.sp + a?b? +.sp +is applied to a string not beginning with "a" or "b", it matches an empty +string at the start of the subject. With PCRE_NOTEMPTY set, this match is not +valid, so PCRE searches further into the string for occurrences of "a" or "b". +.sp + PCRE_NOTEMPTY_ATSTART +.sp +This is like PCRE_NOTEMPTY, except that an empty string match that is not at +the start of the subject is permitted. If the pattern is anchored, such a match +can occur only if the pattern contains \eK. +.P +Perl has no direct equivalent of PCRE_NOTEMPTY or PCRE_NOTEMPTY_ATSTART, but it +does make a special case of a pattern match of the empty string within its +\fBsplit()\fP function, and when using the /g modifier. It is possible to +emulate Perl's behaviour after matching a null string by first trying the match +again at the same offset with PCRE_NOTEMPTY_ATSTART and PCRE_ANCHORED, and then +if that fails, by advancing the starting offset (see below) and trying an +ordinary match again. There is some code that demonstrates how to do this in +the +.\" HREF +\fBpcredemo\fP +.\" +sample program. In the most general case, you have to check to see if the +newline convention recognizes CRLF as a newline, and if so, and the current +character is CR followed by LF, advance the starting offset by two characters +instead of one. +.sp + PCRE_NO_START_OPTIMIZE +.sp +There are a number of optimizations that \fBpcre_exec()\fP uses at the start of +a match, in order to speed up the process. For example, if it is known that an +unanchored match must start with a specific character, it searches the subject +for that character, and fails immediately if it cannot find it, without +actually running the main matching function. This means that a special item +such as (*COMMIT) at the start of a pattern is not considered until after a +suitable starting point for the match has been found. Also, when callouts or +(*MARK) items are in use, these "start-up" optimizations can cause them to be +skipped if the pattern is never actually used. The start-up optimizations are +in effect a pre-scan of the subject that takes place before the pattern is run. +.P +The PCRE_NO_START_OPTIMIZE option disables the start-up optimizations, possibly +causing performance to suffer, but ensuring that in cases where the result is +"no match", the callouts do occur, and that items such as (*COMMIT) and (*MARK) +are considered at every possible starting position in the subject string. If +PCRE_NO_START_OPTIMIZE is set at compile time, it cannot be unset at matching +time. The use of PCRE_NO_START_OPTIMIZE at matching time (that is, passing it +to \fBpcre_exec()\fP) disables JIT execution; in this situation, matching is +always done using interpretively. +.P +Setting PCRE_NO_START_OPTIMIZE can change the outcome of a matching operation. +Consider the pattern +.sp + (*COMMIT)ABC +.sp +When this is compiled, PCRE records the fact that a match must start with the +character "A". Suppose the subject string is "DEFABC". The start-up +optimization scans along the subject, finds "A" and runs the first match +attempt from there. The (*COMMIT) item means that the pattern must match the +current starting position, which in this case, it does. However, if the same +match is run with PCRE_NO_START_OPTIMIZE set, the initial scan along the +subject string does not happen. The first match attempt is run starting from +"D" and when this fails, (*COMMIT) prevents any further matches being tried, so +the overall result is "no match". If the pattern is studied, more start-up +optimizations may be used. For example, a minimum length for the subject may be +recorded. Consider the pattern +.sp + (*MARK:A)(X|Y) +.sp +The minimum length for a match is one character. If the subject is "ABC", there +will be attempts to match "ABC", "BC", "C", and then finally an empty string. +If the pattern is studied, the final attempt does not take place, because PCRE +knows that the subject is too short, and so the (*MARK) is never encountered. +In this case, studying the pattern does not affect the overall match result, +which is still "no match", but it does affect the auxiliary information that is +returned. +.sp + PCRE_NO_UTF8_CHECK +.sp +When PCRE_UTF8 is set at compile time, the validity of the subject as a UTF-8 +string is automatically checked when \fBpcre_exec()\fP is subsequently called. +The entire string is checked before any other processing takes place. The value +of \fIstartoffset\fP is also checked to ensure that it points to the start of a +UTF-8 character. There is a discussion about the +.\" HTML +.\" +validity of UTF-8 strings +.\" +in the +.\" HREF +\fBpcreunicode\fP +.\" +page. If an invalid sequence of bytes is found, \fBpcre_exec()\fP returns the +error PCRE_ERROR_BADUTF8 or, if PCRE_PARTIAL_HARD is set and the problem is a +truncated character at the end of the subject, PCRE_ERROR_SHORTUTF8. In both +cases, information about the precise nature of the error may also be returned +(see the descriptions of these errors in the section entitled \fIError return +values from\fP \fBpcre_exec()\fP +.\" HTML +.\" +below). +.\" +If \fIstartoffset\fP contains a value that does not point to the start of a +UTF-8 character (or to the end of the subject), PCRE_ERROR_BADUTF8_OFFSET is +returned. +.P +If you already know that your subject is valid, and you want to skip these +checks for performance reasons, you can set the PCRE_NO_UTF8_CHECK option when +calling \fBpcre_exec()\fP. You might want to do this for the second and +subsequent calls to \fBpcre_exec()\fP if you are making repeated calls to find +all the matches in a single subject string. However, you should be sure that +the value of \fIstartoffset\fP points to the start of a character (or the end +of the subject). When PCRE_NO_UTF8_CHECK is set, the effect of passing an +invalid string as a subject or an invalid value of \fIstartoffset\fP is +undefined. Your program may crash or loop. +.sp + PCRE_PARTIAL_HARD + PCRE_PARTIAL_SOFT +.sp +These options turn on the partial matching feature. For backwards +compatibility, PCRE_PARTIAL is a synonym for PCRE_PARTIAL_SOFT. A partial match +occurs if the end of the subject string is reached successfully, but there are +not enough subject characters to complete the match. If this happens when +PCRE_PARTIAL_SOFT (but not PCRE_PARTIAL_HARD) is set, matching continues by +testing any remaining alternatives. Only if no complete match can be found is +PCRE_ERROR_PARTIAL returned instead of PCRE_ERROR_NOMATCH. In other words, +PCRE_PARTIAL_SOFT says that the caller is prepared to handle a partial match, +but only if no complete match can be found. +.P +If PCRE_PARTIAL_HARD is set, it overrides PCRE_PARTIAL_SOFT. In this case, if a +partial match is found, \fBpcre_exec()\fP immediately returns +PCRE_ERROR_PARTIAL, without considering any other alternatives. In other words, +when PCRE_PARTIAL_HARD is set, a partial match is considered to be more +important that an alternative complete match. +.P +In both cases, the portion of the string that was inspected when the partial +match was found is set as the first matching string. There is a more detailed +discussion of partial and multi-segment matching, with examples, in the +.\" HREF +\fBpcrepartial\fP +.\" +documentation. +. +. +.SS "The string to be matched by \fBpcre_exec()\fP" +.rs +.sp +The subject string is passed to \fBpcre_exec()\fP as a pointer in +\fIsubject\fP, a length in \fIlength\fP, and a starting offset in +\fIstartoffset\fP. The units for \fIlength\fP and \fIstartoffset\fP are bytes +for the 8-bit library, 16-bit data items for the 16-bit library, and 32-bit +data items for the 32-bit library. +.P +If \fIstartoffset\fP is negative or greater than the length of the subject, +\fBpcre_exec()\fP returns PCRE_ERROR_BADOFFSET. When the starting offset is +zero, the search for a match starts at the beginning of the subject, and this +is by far the most common case. In UTF-8 or UTF-16 mode, the offset must point +to the start of a character, or the end of the subject (in UTF-32 mode, one +data unit equals one character, so all offsets are valid). Unlike the pattern +string, the subject may contain binary zeroes. +.P +A non-zero starting offset is useful when searching for another match in the +same subject by calling \fBpcre_exec()\fP again after a previous success. +Setting \fIstartoffset\fP differs from just passing over a shortened string and +setting PCRE_NOTBOL in the case of a pattern that begins with any kind of +lookbehind. For example, consider the pattern +.sp + \eBiss\eB +.sp +which finds occurrences of "iss" in the middle of words. (\eB matches only if +the current position in the subject is not a word boundary.) When applied to +the string "Mississipi" the first call to \fBpcre_exec()\fP finds the first +occurrence. If \fBpcre_exec()\fP is called again with just the remainder of the +subject, namely "issipi", it does not match, because \eB is always false at the +start of the subject, which is deemed to be a word boundary. However, if +\fBpcre_exec()\fP is passed the entire string again, but with \fIstartoffset\fP +set to 4, it finds the second occurrence of "iss" because it is able to look +behind the starting point to discover that it is preceded by a letter. +.P +Finding all the matches in a subject is tricky when the pattern can match an +empty string. It is possible to emulate Perl's /g behaviour by first trying the +match again at the same offset, with the PCRE_NOTEMPTY_ATSTART and +PCRE_ANCHORED options, and then if that fails, advancing the starting offset +and trying an ordinary match again. There is some code that demonstrates how to +do this in the +.\" HREF +\fBpcredemo\fP +.\" +sample program. In the most general case, you have to check to see if the +newline convention recognizes CRLF as a newline, and if so, and the current +character is CR followed by LF, advance the starting offset by two characters +instead of one. +.P +If a non-zero starting offset is passed when the pattern is anchored, one +attempt to match at the given offset is made. This can only succeed if the +pattern does not require the match to be at the start of the subject. +. +. +.SS "How \fBpcre_exec()\fP returns captured substrings" +.rs +.sp +In general, a pattern matches a certain portion of the subject, and in +addition, further substrings from the subject may be picked out by parts of the +pattern. Following the usage in Jeffrey Friedl's book, this is called +"capturing" in what follows, and the phrase "capturing subpattern" is used for +a fragment of a pattern that picks out a substring. PCRE supports several other +kinds of parenthesized subpattern that do not cause substrings to be captured. +.P +Captured substrings are returned to the caller via a vector of integers whose +address is passed in \fIovector\fP. The number of elements in the vector is +passed in \fIovecsize\fP, which must be a non-negative number. \fBNote\fP: this +argument is NOT the size of \fIovector\fP in bytes. +.P +The first two-thirds of the vector is used to pass back captured substrings, +each substring using a pair of integers. The remaining third of the vector is +used as workspace by \fBpcre_exec()\fP while matching capturing subpatterns, +and is not available for passing back information. The number passed in +\fIovecsize\fP should always be a multiple of three. If it is not, it is +rounded down. +.P +When a match is successful, information about captured substrings is returned +in pairs of integers, starting at the beginning of \fIovector\fP, and +continuing up to two-thirds of its length at the most. The first element of +each pair is set to the offset of the first character in a substring, and the +second is set to the offset of the first character after the end of a +substring. These values are always data unit offsets, even in UTF mode. They +are byte offsets in the 8-bit library, 16-bit data item offsets in the 16-bit +library, and 32-bit data item offsets in the 32-bit library. \fBNote\fP: they +are not character counts. +.P +The first pair of integers, \fIovector[0]\fP and \fIovector[1]\fP, identify the +portion of the subject string matched by the entire pattern. The next pair is +used for the first capturing subpattern, and so on. The value returned by +\fBpcre_exec()\fP is one more than the highest numbered pair that has been set. +For example, if two substrings have been captured, the returned value is 3. If +there are no capturing subpatterns, the return value from a successful match is +1, indicating that just the first pair of offsets has been set. +.P +If a capturing subpattern is matched repeatedly, it is the last portion of the +string that it matched that is returned. +.P +If the vector is too small to hold all the captured substring offsets, it is +used as far as possible (up to two-thirds of its length), and the function +returns a value of zero. If neither the actual string matched nor any captured +substrings are of interest, \fBpcre_exec()\fP may be called with \fIovector\fP +passed as NULL and \fIovecsize\fP as zero. However, if the pattern contains +back references and the \fIovector\fP is not big enough to remember the related +substrings, PCRE has to get additional memory for use during matching. Thus it +is usually advisable to supply an \fIovector\fP of reasonable size. +.P +There are some cases where zero is returned (indicating vector overflow) when +in fact the vector is exactly the right size for the final match. For example, +consider the pattern +.sp + (a)(?:(b)c|bd) +.sp +If a vector of 6 elements (allowing for only 1 captured substring) is given +with subject string "abd", \fBpcre_exec()\fP will try to set the second +captured string, thereby recording a vector overflow, before failing to match +"c" and backing up to try the second alternative. The zero return, however, +does correctly indicate that the maximum number of slots (namely 2) have been +filled. In similar cases where there is temporary overflow, but the final +number of used slots is actually less than the maximum, a non-zero value is +returned. +.P +The \fBpcre_fullinfo()\fP function can be used to find out how many capturing +subpatterns there are in a compiled pattern. The smallest size for +\fIovector\fP that will allow for \fIn\fP captured substrings, in addition to +the offsets of the substring matched by the whole pattern, is (\fIn\fP+1)*3. +.P +It is possible for capturing subpattern number \fIn+1\fP to match some part of +the subject when subpattern \fIn\fP has not been used at all. For example, if +the string "abc" is matched against the pattern (a|(z))(bc) the return from the +function is 4, and subpatterns 1 and 3 are matched, but 2 is not. When this +happens, both values in the offset pairs corresponding to unused subpatterns +are set to -1. +.P +Offset values that correspond to unused subpatterns at the end of the +expression are also set to -1. For example, if the string "abc" is matched +against the pattern (abc)(x(yz)?)? subpatterns 2 and 3 are not matched. The +return from the function is 2, because the highest used capturing subpattern +number is 1, and the offsets for for the second and third capturing subpatterns +(assuming the vector is large enough, of course) are set to -1. +.P +\fBNote\fP: Elements in the first two-thirds of \fIovector\fP that do not +correspond to capturing parentheses in the pattern are never changed. That is, +if a pattern contains \fIn\fP capturing parentheses, no more than +\fIovector[0]\fP to \fIovector[2n+1]\fP are set by \fBpcre_exec()\fP. The other +elements (in the first two-thirds) retain whatever values they previously had. +.P +Some convenience functions are provided for extracting the captured substrings +as separate strings. These are described below. +. +. +.\" HTML +.SS "Error return values from \fBpcre_exec()\fP" +.rs +.sp +If \fBpcre_exec()\fP fails, it returns a negative number. The following are +defined in the header file: +.sp + PCRE_ERROR_NOMATCH (-1) +.sp +The subject string did not match the pattern. +.sp + PCRE_ERROR_NULL (-2) +.sp +Either \fIcode\fP or \fIsubject\fP was passed as NULL, or \fIovector\fP was +NULL and \fIovecsize\fP was not zero. +.sp + PCRE_ERROR_BADOPTION (-3) +.sp +An unrecognized bit was set in the \fIoptions\fP argument. +.sp + PCRE_ERROR_BADMAGIC (-4) +.sp +PCRE stores a 4-byte "magic number" at the start of the compiled code, to catch +the case when it is passed a junk pointer and to detect when a pattern that was +compiled in an environment of one endianness is run in an environment with the +other endianness. This is the error that PCRE gives when the magic number is +not present. +.sp + PCRE_ERROR_UNKNOWN_OPCODE (-5) +.sp +While running the pattern match, an unknown item was encountered in the +compiled pattern. This error could be caused by a bug in PCRE or by overwriting +of the compiled pattern. +.sp + PCRE_ERROR_NOMEMORY (-6) +.sp +If a pattern contains back references, but the \fIovector\fP that is passed to +\fBpcre_exec()\fP is not big enough to remember the referenced substrings, PCRE +gets a block of memory at the start of matching to use for this purpose. If the +call via \fBpcre_malloc()\fP fails, this error is given. The memory is +automatically freed at the end of matching. +.P +This error is also given if \fBpcre_stack_malloc()\fP fails in +\fBpcre_exec()\fP. This can happen only when PCRE has been compiled with +\fB--disable-stack-for-recursion\fP. +.sp + PCRE_ERROR_NOSUBSTRING (-7) +.sp +This error is used by the \fBpcre_copy_substring()\fP, +\fBpcre_get_substring()\fP, and \fBpcre_get_substring_list()\fP functions (see +below). It is never returned by \fBpcre_exec()\fP. +.sp + PCRE_ERROR_MATCHLIMIT (-8) +.sp +The backtracking limit, as specified by the \fImatch_limit\fP field in a +\fBpcre_extra\fP structure (or defaulted) was reached. See the description +above. +.sp + PCRE_ERROR_CALLOUT (-9) +.sp +This error is never generated by \fBpcre_exec()\fP itself. It is provided for +use by callout functions that want to yield a distinctive error code. See the +.\" HREF +\fBpcrecallout\fP +.\" +documentation for details. +.sp + PCRE_ERROR_BADUTF8 (-10) +.sp +A string that contains an invalid UTF-8 byte sequence was passed as a subject, +and the PCRE_NO_UTF8_CHECK option was not set. If the size of the output vector +(\fIovecsize\fP) is at least 2, the byte offset to the start of the the invalid +UTF-8 character is placed in the first element, and a reason code is placed in +the second element. The reason codes are listed in the +.\" HTML +.\" +following section. +.\" +For backward compatibility, if PCRE_PARTIAL_HARD is set and the problem is a +truncated UTF-8 character at the end of the subject (reason codes 1 to 5), +PCRE_ERROR_SHORTUTF8 is returned instead of PCRE_ERROR_BADUTF8. +.sp + PCRE_ERROR_BADUTF8_OFFSET (-11) +.sp +The UTF-8 byte sequence that was passed as a subject was checked and found to +be valid (the PCRE_NO_UTF8_CHECK option was not set), but the value of +\fIstartoffset\fP did not point to the beginning of a UTF-8 character or the +end of the subject. +.sp + PCRE_ERROR_PARTIAL (-12) +.sp +The subject string did not match, but it did match partially. See the +.\" HREF +\fBpcrepartial\fP +.\" +documentation for details of partial matching. +.sp + PCRE_ERROR_BADPARTIAL (-13) +.sp +This code is no longer in use. It was formerly returned when the PCRE_PARTIAL +option was used with a compiled pattern containing items that were not +supported for partial matching. From release 8.00 onwards, there are no +restrictions on partial matching. +.sp + PCRE_ERROR_INTERNAL (-14) +.sp +An unexpected internal error has occurred. This error could be caused by a bug +in PCRE or by overwriting of the compiled pattern. +.sp + PCRE_ERROR_BADCOUNT (-15) +.sp +This error is given if the value of the \fIovecsize\fP argument is negative. +.sp + PCRE_ERROR_RECURSIONLIMIT (-21) +.sp +The internal recursion limit, as specified by the \fImatch_limit_recursion\fP +field in a \fBpcre_extra\fP structure (or defaulted) was reached. See the +description above. +.sp + PCRE_ERROR_BADNEWLINE (-23) +.sp +An invalid combination of PCRE_NEWLINE_\fIxxx\fP options was given. +.sp + PCRE_ERROR_BADOFFSET (-24) +.sp +The value of \fIstartoffset\fP was negative or greater than the length of the +subject, that is, the value in \fIlength\fP. +.sp + PCRE_ERROR_SHORTUTF8 (-25) +.sp +This error is returned instead of PCRE_ERROR_BADUTF8 when the subject string +ends with a truncated UTF-8 character and the PCRE_PARTIAL_HARD option is set. +Information about the failure is returned as for PCRE_ERROR_BADUTF8. It is in +fact sufficient to detect this case, but this special error code for +PCRE_PARTIAL_HARD precedes the implementation of returned information; it is +retained for backwards compatibility. +.sp + PCRE_ERROR_RECURSELOOP (-26) +.sp +This error is returned when \fBpcre_exec()\fP detects a recursion loop within +the pattern. Specifically, it means that either the whole pattern or a +subpattern has been called recursively for the second time at the same position +in the subject string. Some simple patterns that might do this are detected and +faulted at compile time, but more complicated cases, in particular mutual +recursions between two different subpatterns, cannot be detected until run +time. +.sp + PCRE_ERROR_JIT_STACKLIMIT (-27) +.sp +This error is returned when a pattern that was successfully studied using a +JIT compile option is being matched, but the memory available for the +just-in-time processing stack is not large enough. See the +.\" HREF +\fBpcrejit\fP +.\" +documentation for more details. +.sp + PCRE_ERROR_BADMODE (-28) +.sp +This error is given if a pattern that was compiled by the 8-bit library is +passed to a 16-bit or 32-bit library function, or vice versa. +.sp + PCRE_ERROR_BADENDIANNESS (-29) +.sp +This error is given if a pattern that was compiled and saved is reloaded on a +host with different endianness. The utility function +\fBpcre_pattern_to_host_byte_order()\fP can be used to convert such a pattern +so that it runs on the new host. +.sp + PCRE_ERROR_JIT_BADOPTION +.sp +This error is returned when a pattern that was successfully studied using a JIT +compile option is being matched, but the matching mode (partial or complete +match) does not correspond to any JIT compilation mode. When the JIT fast path +function is used, this error may be also given for invalid options. See the +.\" HREF +\fBpcrejit\fP +.\" +documentation for more details. +.sp + PCRE_ERROR_BADLENGTH (-32) +.sp +This error is given if \fBpcre_exec()\fP is called with a negative value for +the \fIlength\fP argument. +.P +Error numbers -16 to -20, -22, and 30 are not used by \fBpcre_exec()\fP. +. +. +.\" HTML +.SS "Reason codes for invalid UTF-8 strings" +.rs +.sp +This section applies only to the 8-bit library. The corresponding information +for the 16-bit and 32-bit libraries is given in the +.\" HREF +\fBpcre16\fP +.\" +and +.\" HREF +\fBpcre32\fP +.\" +pages. +.P +When \fBpcre_exec()\fP returns either PCRE_ERROR_BADUTF8 or +PCRE_ERROR_SHORTUTF8, and the size of the output vector (\fIovecsize\fP) is at +least 2, the offset of the start of the invalid UTF-8 character is placed in +the first output vector element (\fIovector[0]\fP) and a reason code is placed +in the second element (\fIovector[1]\fP). The reason codes are given names in +the \fBpcre.h\fP header file: +.sp + PCRE_UTF8_ERR1 + PCRE_UTF8_ERR2 + PCRE_UTF8_ERR3 + PCRE_UTF8_ERR4 + PCRE_UTF8_ERR5 +.sp +The string ends with a truncated UTF-8 character; the code specifies how many +bytes are missing (1 to 5). Although RFC 3629 restricts UTF-8 characters to be +no longer than 4 bytes, the encoding scheme (originally defined by RFC 2279) +allows for up to 6 bytes, and this is checked first; hence the possibility of +4 or 5 missing bytes. +.sp + PCRE_UTF8_ERR6 + PCRE_UTF8_ERR7 + PCRE_UTF8_ERR8 + PCRE_UTF8_ERR9 + PCRE_UTF8_ERR10 +.sp +The two most significant bits of the 2nd, 3rd, 4th, 5th, or 6th byte of the +character do not have the binary value 0b10 (that is, either the most +significant bit is 0, or the next bit is 1). +.sp + PCRE_UTF8_ERR11 + PCRE_UTF8_ERR12 +.sp +A character that is valid by the RFC 2279 rules is either 5 or 6 bytes long; +these code points are excluded by RFC 3629. +.sp + PCRE_UTF8_ERR13 +.sp +A 4-byte character has a value greater than 0x10fff; these code points are +excluded by RFC 3629. +.sp + PCRE_UTF8_ERR14 +.sp +A 3-byte character has a value in the range 0xd800 to 0xdfff; this range of +code points are reserved by RFC 3629 for use with UTF-16, and so are excluded +from UTF-8. +.sp + PCRE_UTF8_ERR15 + PCRE_UTF8_ERR16 + PCRE_UTF8_ERR17 + PCRE_UTF8_ERR18 + PCRE_UTF8_ERR19 +.sp +A 2-, 3-, 4-, 5-, or 6-byte character is "overlong", that is, it codes for a +value that can be represented by fewer bytes, which is invalid. For example, +the two bytes 0xc0, 0xae give the value 0x2e, whose correct coding uses just +one byte. +.sp + PCRE_UTF8_ERR20 +.sp +The two most significant bits of the first byte of a character have the binary +value 0b10 (that is, the most significant bit is 1 and the second is 0). Such a +byte can only validly occur as the second or subsequent byte of a multi-byte +character. +.sp + PCRE_UTF8_ERR21 +.sp +The first byte of a character has the value 0xfe or 0xff. These values can +never occur in a valid UTF-8 string. +.sp + PCRE_UTF8_ERR22 +.sp +This error code was formerly used when the presence of a so-called +"non-character" caused an error. Unicode corrigendum #9 makes it clear that +such characters should not cause a string to be rejected, and so this code is +no longer in use and is never returned. +. +. +.SH "EXTRACTING CAPTURED SUBSTRINGS BY NUMBER" +.rs +.sp +.nf +.B int pcre_copy_substring(const char *\fIsubject\fP, int *\fIovector\fP, +.B " int \fIstringcount\fP, int \fIstringnumber\fP, char *\fIbuffer\fP," +.B " int \fIbuffersize\fP);" +.sp +.B int pcre_get_substring(const char *\fIsubject\fP, int *\fIovector\fP, +.B " int \fIstringcount\fP, int \fIstringnumber\fP," +.B " const char **\fIstringptr\fP);" +.sp +.B int pcre_get_substring_list(const char *\fIsubject\fP, +.B " int *\fIovector\fP, int \fIstringcount\fP, const char ***\fIlistptr\fP);" +.fi +.PP +Captured substrings can be accessed directly by using the offsets returned by +\fBpcre_exec()\fP in \fIovector\fP. For convenience, the functions +\fBpcre_copy_substring()\fP, \fBpcre_get_substring()\fP, and +\fBpcre_get_substring_list()\fP are provided for extracting captured substrings +as new, separate, zero-terminated strings. These functions identify substrings +by number. The next section describes functions for extracting named +substrings. +.P +A substring that contains a binary zero is correctly extracted and has a +further zero added on the end, but the result is not, of course, a C string. +However, you can process such a string by referring to the length that is +returned by \fBpcre_copy_substring()\fP and \fBpcre_get_substring()\fP. +Unfortunately, the interface to \fBpcre_get_substring_list()\fP is not adequate +for handling strings containing binary zeros, because the end of the final +string is not independently indicated. +.P +The first three arguments are the same for all three of these functions: +\fIsubject\fP is the subject string that has just been successfully matched, +\fIovector\fP is a pointer to the vector of integer offsets that was passed to +\fBpcre_exec()\fP, and \fIstringcount\fP is the number of substrings that were +captured by the match, including the substring that matched the entire regular +expression. This is the value returned by \fBpcre_exec()\fP if it is greater +than zero. If \fBpcre_exec()\fP returned zero, indicating that it ran out of +space in \fIovector\fP, the value passed as \fIstringcount\fP should be the +number of elements in the vector divided by three. +.P +The functions \fBpcre_copy_substring()\fP and \fBpcre_get_substring()\fP +extract a single substring, whose number is given as \fIstringnumber\fP. A +value of zero extracts the substring that matched the entire pattern, whereas +higher values extract the captured substrings. For \fBpcre_copy_substring()\fP, +the string is placed in \fIbuffer\fP, whose length is given by +\fIbuffersize\fP, while for \fBpcre_get_substring()\fP a new block of memory is +obtained via \fBpcre_malloc\fP, and its address is returned via +\fIstringptr\fP. The yield of the function is the length of the string, not +including the terminating zero, or one of these error codes: +.sp + PCRE_ERROR_NOMEMORY (-6) +.sp +The buffer was too small for \fBpcre_copy_substring()\fP, or the attempt to get +memory failed for \fBpcre_get_substring()\fP. +.sp + PCRE_ERROR_NOSUBSTRING (-7) +.sp +There is no substring whose number is \fIstringnumber\fP. +.P +The \fBpcre_get_substring_list()\fP function extracts all available substrings +and builds a list of pointers to them. All this is done in a single block of +memory that is obtained via \fBpcre_malloc\fP. The address of the memory block +is returned via \fIlistptr\fP, which is also the start of the list of string +pointers. The end of the list is marked by a NULL pointer. The yield of the +function is zero if all went well, or the error code +.sp + PCRE_ERROR_NOMEMORY (-6) +.sp +if the attempt to get the memory block failed. +.P +When any of these functions encounter a substring that is unset, which can +happen when capturing subpattern number \fIn+1\fP matches some part of the +subject, but subpattern \fIn\fP has not been used at all, they return an empty +string. This can be distinguished from a genuine zero-length substring by +inspecting the appropriate offset in \fIovector\fP, which is negative for unset +substrings. +.P +The two convenience functions \fBpcre_free_substring()\fP and +\fBpcre_free_substring_list()\fP can be used to free the memory returned by +a previous call of \fBpcre_get_substring()\fP or +\fBpcre_get_substring_list()\fP, respectively. They do nothing more than call +the function pointed to by \fBpcre_free\fP, which of course could be called +directly from a C program. However, PCRE is used in some situations where it is +linked via a special interface to another programming language that cannot use +\fBpcre_free\fP directly; it is for these cases that the functions are +provided. +. +. +.SH "EXTRACTING CAPTURED SUBSTRINGS BY NAME" +.rs +.sp +.nf +.B int pcre_get_stringnumber(const pcre *\fIcode\fP, +.B " const char *\fIname\fP);" +.sp +.B int pcre_copy_named_substring(const pcre *\fIcode\fP, +.B " const char *\fIsubject\fP, int *\fIovector\fP," +.B " int \fIstringcount\fP, const char *\fIstringname\fP," +.B " char *\fIbuffer\fP, int \fIbuffersize\fP);" +.sp +.B int pcre_get_named_substring(const pcre *\fIcode\fP, +.B " const char *\fIsubject\fP, int *\fIovector\fP," +.B " int \fIstringcount\fP, const char *\fIstringname\fP," +.B " const char **\fIstringptr\fP);" +.fi +.PP +To extract a substring by name, you first have to find associated number. +For example, for this pattern +.sp + (a+)b(?\ed+)... +.sp +the number of the subpattern called "xxx" is 2. If the name is known to be +unique (PCRE_DUPNAMES was not set), you can find the number from the name by +calling \fBpcre_get_stringnumber()\fP. The first argument is the compiled +pattern, and the second is the name. The yield of the function is the +subpattern number, or PCRE_ERROR_NOSUBSTRING (-7) if there is no subpattern of +that name. +.P +Given the number, you can extract the substring directly, or use one of the +functions described in the previous section. For convenience, there are also +two functions that do the whole job. +.P +Most of the arguments of \fBpcre_copy_named_substring()\fP and +\fBpcre_get_named_substring()\fP are the same as those for the similarly named +functions that extract by number. As these are described in the previous +section, they are not re-described here. There are just two differences: +.P +First, instead of a substring number, a substring name is given. Second, there +is an extra argument, given at the start, which is a pointer to the compiled +pattern. This is needed in order to gain access to the name-to-number +translation table. +.P +These functions call \fBpcre_get_stringnumber()\fP, and if it succeeds, they +then call \fBpcre_copy_substring()\fP or \fBpcre_get_substring()\fP, as +appropriate. \fBNOTE:\fP If PCRE_DUPNAMES is set and there are duplicate names, +the behaviour may not be what you want (see the next section). +.P +\fBWarning:\fP If the pattern uses the (?| feature to set up multiple +subpatterns with the same number, as described in the +.\" HTML +.\" +section on duplicate subpattern numbers +.\" +in the +.\" HREF +\fBpcrepattern\fP +.\" +page, you cannot use names to distinguish the different subpatterns, because +names are not included in the compiled code. The matching process uses only +numbers. For this reason, the use of different names for subpatterns of the +same number causes an error at compile time. +. +. +.SH "DUPLICATE SUBPATTERN NAMES" +.rs +.sp +.nf +.B int pcre_get_stringtable_entries(const pcre *\fIcode\fP, +.B " const char *\fIname\fP, char **\fIfirst\fP, char **\fIlast\fP);" +.fi +.PP +When a pattern is compiled with the PCRE_DUPNAMES option, names for subpatterns +are not required to be unique. (Duplicate names are always allowed for +subpatterns with the same number, created by using the (?| feature. Indeed, if +such subpatterns are named, they are required to use the same names.) +.P +Normally, patterns with duplicate names are such that in any one match, only +one of the named subpatterns participates. An example is shown in the +.\" HREF +\fBpcrepattern\fP +.\" +documentation. +.P +When duplicates are present, \fBpcre_copy_named_substring()\fP and +\fBpcre_get_named_substring()\fP return the first substring corresponding to +the given name that is set. If none are set, PCRE_ERROR_NOSUBSTRING (-7) is +returned; no data is returned. The \fBpcre_get_stringnumber()\fP function +returns one of the numbers that are associated with the name, but it is not +defined which it is. +.P +If you want to get full details of all captured substrings for a given name, +you must use the \fBpcre_get_stringtable_entries()\fP function. The first +argument is the compiled pattern, and the second is the name. The third and +fourth are pointers to variables which are updated by the function. After it +has run, they point to the first and last entries in the name-to-number table +for the given name. The function itself returns the length of each entry, or +PCRE_ERROR_NOSUBSTRING (-7) if there are none. The format of the table is +described above in the section entitled \fIInformation about a pattern\fP +.\" HTML +.\" +above. +.\" +Given all the relevant entries for the name, you can extract each of their +numbers, and hence the captured data, if any. +. +. +.SH "FINDING ALL POSSIBLE MATCHES" +.rs +.sp +The traditional matching function uses a similar algorithm to Perl, which stops +when it finds the first match, starting at a given point in the subject. If you +want to find all possible matches, or the longest possible match, consider +using the alternative matching function (see below) instead. If you cannot use +the alternative function, but still need to find all possible matches, you +can kludge it up by making use of the callout facility, which is described in +the +.\" HREF +\fBpcrecallout\fP +.\" +documentation. +.P +What you have to do is to insert a callout right at the end of the pattern. +When your callout function is called, extract and save the current matched +substring. Then return 1, which forces \fBpcre_exec()\fP to backtrack and try +other alternatives. Ultimately, when it runs out of matches, \fBpcre_exec()\fP +will yield PCRE_ERROR_NOMATCH. +. +. +.SH "OBTAINING AN ESTIMATE OF STACK USAGE" +.rs +.sp +Matching certain patterns using \fBpcre_exec()\fP can use a lot of process +stack, which in certain environments can be rather limited in size. Some users +find it helpful to have an estimate of the amount of stack that is used by +\fBpcre_exec()\fP, to help them set recursion limits, as described in the +.\" HREF +\fBpcrestack\fP +.\" +documentation. The estimate that is output by \fBpcretest\fP when called with +the \fB-m\fP and \fB-C\fP options is obtained by calling \fBpcre_exec\fP with +the values NULL, NULL, NULL, -999, and -999 for its first five arguments. +.P +Normally, if its first argument is NULL, \fBpcre_exec()\fP immediately returns +the negative error code PCRE_ERROR_NULL, but with this special combination of +arguments, it returns instead a negative number whose absolute value is the +approximate stack frame size in bytes. (A negative number is used so that it is +clear that no match has happened.) The value is approximate because in some +cases, recursive calls to \fBpcre_exec()\fP occur when there are one or two +additional variables on the stack. +.P +If PCRE has been compiled to use the heap instead of the stack for recursion, +the value returned is the size of each block that is obtained from the heap. +. +. +.\" HTML +.SH "MATCHING A PATTERN: THE ALTERNATIVE FUNCTION" +.rs +.sp +.nf +.B int pcre_dfa_exec(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP," +.B " const char *\fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," +.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP," +.B " int *\fIworkspace\fP, int \fIwscount\fP);" +.fi +.P +The function \fBpcre_dfa_exec()\fP is called to match a subject string against +a compiled pattern, using a matching algorithm that scans the subject string +just once, and does not backtrack. This has different characteristics to the +normal algorithm, and is not compatible with Perl. Some of the features of PCRE +patterns are not supported. Nevertheless, there are times when this kind of +matching can be useful. For a discussion of the two matching algorithms, and a +list of features that \fBpcre_dfa_exec()\fP does not support, see the +.\" HREF +\fBpcrematching\fP +.\" +documentation. +.P +The arguments for the \fBpcre_dfa_exec()\fP function are the same as for +\fBpcre_exec()\fP, plus two extras. The \fIovector\fP argument is used in a +different way, and this is described below. The other common arguments are used +in the same way as for \fBpcre_exec()\fP, so their description is not repeated +here. +.P +The two additional arguments provide workspace for the function. The workspace +vector should contain at least 20 elements. It is used for keeping track of +multiple paths through the pattern tree. More workspace will be needed for +patterns and subjects where there are a lot of potential matches. +.P +Here is an example of a simple call to \fBpcre_dfa_exec()\fP: +.sp + int rc; + int ovector[10]; + int wspace[20]; + rc = pcre_dfa_exec( + re, /* result of pcre_compile() */ + NULL, /* we didn't study the pattern */ + "some string", /* the subject string */ + 11, /* the length of the subject string */ + 0, /* start at offset 0 in the subject */ + 0, /* default options */ + ovector, /* vector of integers for substring information */ + 10, /* number of elements (NOT size in bytes) */ + wspace, /* working space vector */ + 20); /* number of elements (NOT size in bytes) */ +. +.SS "Option bits for \fBpcre_dfa_exec()\fP" +.rs +.sp +The unused bits of the \fIoptions\fP argument for \fBpcre_dfa_exec()\fP must be +zero. The only bits that may be set are PCRE_ANCHORED, PCRE_NEWLINE_\fIxxx\fP, +PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, +PCRE_NO_UTF8_CHECK, PCRE_BSR_ANYCRLF, PCRE_BSR_UNICODE, PCRE_NO_START_OPTIMIZE, +PCRE_PARTIAL_HARD, PCRE_PARTIAL_SOFT, PCRE_DFA_SHORTEST, and PCRE_DFA_RESTART. +All but the last four of these are exactly the same as for \fBpcre_exec()\fP, +so their description is not repeated here. +.sp + PCRE_PARTIAL_HARD + PCRE_PARTIAL_SOFT +.sp +These have the same general effect as they do for \fBpcre_exec()\fP, but the +details are slightly different. When PCRE_PARTIAL_HARD is set for +\fBpcre_dfa_exec()\fP, it returns PCRE_ERROR_PARTIAL if the end of the subject +is reached and there is still at least one matching possibility that requires +additional characters. This happens even if some complete matches have also +been found. When PCRE_PARTIAL_SOFT is set, the return code PCRE_ERROR_NOMATCH +is converted into PCRE_ERROR_PARTIAL if the end of the subject is reached, +there have been no complete matches, but there is still at least one matching +possibility. The portion of the string that was inspected when the longest +partial match was found is set as the first matching string in both cases. +There is a more detailed discussion of partial and multi-segment matching, with +examples, in the +.\" HREF +\fBpcrepartial\fP +.\" +documentation. +.sp + PCRE_DFA_SHORTEST +.sp +Setting the PCRE_DFA_SHORTEST option causes the matching algorithm to stop as +soon as it has found one match. Because of the way the alternative algorithm +works, this is necessarily the shortest possible match at the first possible +matching point in the subject string. +.sp + PCRE_DFA_RESTART +.sp +When \fBpcre_dfa_exec()\fP returns a partial match, it is possible to call it +again, with additional subject characters, and have it continue with the same +match. The PCRE_DFA_RESTART option requests this action; when it is set, the +\fIworkspace\fP and \fIwscount\fP options must reference the same vector as +before because data about the match so far is left in them after a partial +match. There is more discussion of this facility in the +.\" HREF +\fBpcrepartial\fP +.\" +documentation. +. +. +.SS "Successful returns from \fBpcre_dfa_exec()\fP" +.rs +.sp +When \fBpcre_dfa_exec()\fP succeeds, it may have matched more than one +substring in the subject. Note, however, that all the matches from one run of +the function start at the same point in the subject. The shorter matches are +all initial substrings of the longer matches. For example, if the pattern +.sp + <.*> +.sp +is matched against the string +.sp + This is no more +.sp +the three matched strings are +.sp + + + +.sp +On success, the yield of the function is a number greater than zero, which is +the number of matched substrings. The substrings themselves are returned in +\fIovector\fP. Each string uses two elements; the first is the offset to the +start, and the second is the offset to the end. In fact, all the strings have +the same start offset. (Space could have been saved by giving this only once, +but it was decided to retain some compatibility with the way \fBpcre_exec()\fP +returns data, even though the meaning of the strings is different.) +.P +The strings are returned in reverse order of length; that is, the longest +matching string is given first. If there were too many matches to fit into +\fIovector\fP, the yield of the function is zero, and the vector is filled with +the longest matches. Unlike \fBpcre_exec()\fP, \fBpcre_dfa_exec()\fP can use +the entire \fIovector\fP for returning matched strings. +.P +NOTE: PCRE's "auto-possessification" optimization usually applies to character +repeats at the end of a pattern (as well as internally). For example, the +pattern "a\ed+" is compiled as if it were "a\ed++" because there is no point +even considering the possibility of backtracking into the repeated digits. For +DFA matching, this means that only one possible match is found. If you really +do want multiple matches in such cases, either use an ungreedy repeat +("a\ed+?") or set the PCRE_NO_AUTO_POSSESS option when compiling. +. +. +.SS "Error returns from \fBpcre_dfa_exec()\fP" +.rs +.sp +The \fBpcre_dfa_exec()\fP function returns a negative number when it fails. +Many of the errors are the same as for \fBpcre_exec()\fP, and these are +described +.\" HTML +.\" +above. +.\" +There are in addition the following errors that are specific to +\fBpcre_dfa_exec()\fP: +.sp + PCRE_ERROR_DFA_UITEM (-16) +.sp +This return is given if \fBpcre_dfa_exec()\fP encounters an item in the pattern +that it does not support, for instance, the use of \eC or a back reference. +.sp + PCRE_ERROR_DFA_UCOND (-17) +.sp +This return is given if \fBpcre_dfa_exec()\fP encounters a condition item that +uses a back reference for the condition, or a test for recursion in a specific +group. These are not supported. +.sp + PCRE_ERROR_DFA_UMLIMIT (-18) +.sp +This return is given if \fBpcre_dfa_exec()\fP is called with an \fIextra\fP +block that contains a setting of the \fImatch_limit\fP or +\fImatch_limit_recursion\fP fields. This is not supported (these fields are +meaningless for DFA matching). +.sp + PCRE_ERROR_DFA_WSSIZE (-19) +.sp +This return is given if \fBpcre_dfa_exec()\fP runs out of space in the +\fIworkspace\fP vector. +.sp + PCRE_ERROR_DFA_RECURSE (-20) +.sp +When a recursive subpattern is processed, the matching function calls itself +recursively, using private vectors for \fIovector\fP and \fIworkspace\fP. This +error is given if the output vector is not large enough. This should be +extremely rare, as a vector of size 1000 is used. +.sp + PCRE_ERROR_DFA_BADRESTART (-30) +.sp +When \fBpcre_dfa_exec()\fP is called with the \fBPCRE_DFA_RESTART\fP option, +some plausibility checks are made on the contents of the workspace, which +should contain data about the previous partial match. If any of these checks +fail, this error is given. +. +. +.SH "SEE ALSO" +.rs +.sp +\fBpcre16\fP(3), \fBpcre32\fP(3), \fBpcrebuild\fP(3), \fBpcrecallout\fP(3), +\fBpcrecpp(3)\fP(3), \fBpcrematching\fP(3), \fBpcrepartial\fP(3), +\fBpcreposix\fP(3), \fBpcreprecompile\fP(3), \fBpcresample\fP(3), +\fBpcrestack\fP(3). +. +. +.SH AUTHOR +.rs +.sp +.nf +Philip Hazel +University Computing Service +Cambridge CB2 3QH, England. +.fi +. +. +.SH REVISION +.rs +.sp +.nf +Last updated: 18 December 2015 +Copyright (c) 1997-2015 University of Cambridge. +.fi diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcrebuild.3 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcrebuild.3 new file mode 100755 index 000000000..403f2ae32 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcrebuild.3 @@ -0,0 +1,550 @@ +.TH PCREBUILD 3 "12 May 2013" "PCRE 8.33" +.SH NAME +PCRE - Perl-compatible regular expressions +. +. +.SH "BUILDING PCRE" +.rs +.sp +PCRE is distributed with a \fBconfigure\fP script that can be used to build the +library in Unix-like environments using the applications known as Autotools. +Also in the distribution are files to support building using \fBCMake\fP +instead of \fBconfigure\fP. The text file +.\" HTML +.\" +\fBREADME\fP +.\" +contains general information about building with Autotools (some of which is +repeated below), and also has some comments about building on various operating +systems. There is a lot more information about building PCRE without using +Autotools (including information about using \fBCMake\fP and building "by +hand") in the text file called +.\" HTML +.\" +\fBNON-AUTOTOOLS-BUILD\fP. +.\" +You should consult this file as well as the +.\" HTML +.\" +\fBREADME\fP +.\" +file if you are building in a non-Unix-like environment. +. +. +.SH "PCRE BUILD-TIME OPTIONS" +.rs +.sp +The rest of this document describes the optional features of PCRE that can be +selected when the library is compiled. It assumes use of the \fBconfigure\fP +script, where the optional features are selected or deselected by providing +options to \fBconfigure\fP before running the \fBmake\fP command. However, the +same options can be selected in both Unix-like and non-Unix-like environments +using the GUI facility of \fBcmake-gui\fP if you are using \fBCMake\fP instead +of \fBconfigure\fP to build PCRE. +.P +If you are not using Autotools or \fBCMake\fP, option selection can be done by +editing the \fBconfig.h\fP file, or by passing parameter settings to the +compiler, as described in +.\" HTML +.\" +\fBNON-AUTOTOOLS-BUILD\fP. +.\" +.P +The complete list of options for \fBconfigure\fP (which includes the standard +ones such as the selection of the installation directory) can be obtained by +running +.sp + ./configure --help +.sp +The following sections include descriptions of options whose names begin with +--enable or --disable. These settings specify changes to the defaults for the +\fBconfigure\fP command. Because of the way that \fBconfigure\fP works, +--enable and --disable always come in pairs, so the complementary option always +exists as well, but as it specifies the default, it is not described. +. +. +.SH "BUILDING 8-BIT, 16-BIT AND 32-BIT LIBRARIES" +.rs +.sp +By default, a library called \fBlibpcre\fP is built, containing functions that +take string arguments contained in vectors of bytes, either as single-byte +characters, or interpreted as UTF-8 strings. You can also build a separate +library, called \fBlibpcre16\fP, in which strings are contained in vectors of +16-bit data units and interpreted either as single-unit characters or UTF-16 +strings, by adding +.sp + --enable-pcre16 +.sp +to the \fBconfigure\fP command. You can also build yet another separate +library, called \fBlibpcre32\fP, in which strings are contained in vectors of +32-bit data units and interpreted either as single-unit characters or UTF-32 +strings, by adding +.sp + --enable-pcre32 +.sp +to the \fBconfigure\fP command. If you do not want the 8-bit library, add +.sp + --disable-pcre8 +.sp +as well. At least one of the three libraries must be built. Note that the C++ +and POSIX wrappers are for the 8-bit library only, and that \fBpcregrep\fP is +an 8-bit program. None of these are built if you select only the 16-bit or +32-bit libraries. +. +. +.SH "BUILDING SHARED AND STATIC LIBRARIES" +.rs +.sp +The Autotools PCRE building process uses \fBlibtool\fP to build both shared and +static libraries by default. You can suppress one of these by adding one of +.sp + --disable-shared + --disable-static +.sp +to the \fBconfigure\fP command, as required. +. +. +.SH "C++ SUPPORT" +.rs +.sp +By default, if the 8-bit library is being built, the \fBconfigure\fP script +will search for a C++ compiler and C++ header files. If it finds them, it +automatically builds the C++ wrapper library (which supports only 8-bit +strings). You can disable this by adding +.sp + --disable-cpp +.sp +to the \fBconfigure\fP command. +. +. +.SH "UTF-8, UTF-16 AND UTF-32 SUPPORT" +.rs +.sp +To build PCRE with support for UTF Unicode character strings, add +.sp + --enable-utf +.sp +to the \fBconfigure\fP command. This setting applies to all three libraries, +adding support for UTF-8 to the 8-bit library, support for UTF-16 to the 16-bit +library, and support for UTF-32 to the to the 32-bit library. There are no +separate options for enabling UTF-8, UTF-16 and UTF-32 independently because +that would allow ridiculous settings such as requesting UTF-16 support while +building only the 8-bit library. It is not possible to build one library with +UTF support and another without in the same configuration. (For backwards +compatibility, --enable-utf8 is a synonym of --enable-utf.) +.P +Of itself, this setting does not make PCRE treat strings as UTF-8, UTF-16 or +UTF-32. As well as compiling PCRE with this option, you also have have to set +the PCRE_UTF8, PCRE_UTF16 or PCRE_UTF32 option (as appropriate) when you call +one of the pattern compiling functions. +.P +If you set --enable-utf when compiling in an EBCDIC environment, PCRE expects +its input to be either ASCII or UTF-8 (depending on the run-time option). It is +not possible to support both EBCDIC and UTF-8 codes in the same version of the +library. Consequently, --enable-utf and --enable-ebcdic are mutually +exclusive. +. +. +.SH "UNICODE CHARACTER PROPERTY SUPPORT" +.rs +.sp +UTF support allows the libraries to process character codepoints up to 0x10ffff +in the strings that they handle. On its own, however, it does not provide any +facilities for accessing the properties of such characters. If you want to be +able to use the pattern escapes \eP, \ep, and \eX, which refer to Unicode +character properties, you must add +.sp + --enable-unicode-properties +.sp +to the \fBconfigure\fP command. This implies UTF support, even if you have +not explicitly requested it. +.P +Including Unicode property support adds around 30K of tables to the PCRE +library. Only the general category properties such as \fILu\fP and \fINd\fP are +supported. Details are given in the +.\" HREF +\fBpcrepattern\fP +.\" +documentation. +. +. +.SH "JUST-IN-TIME COMPILER SUPPORT" +.rs +.sp +Just-in-time compiler support is included in the build by specifying +.sp + --enable-jit +.sp +This support is available only for certain hardware architectures. If this +option is set for an unsupported architecture, a compile time error occurs. +See the +.\" HREF +\fBpcrejit\fP +.\" +documentation for a discussion of JIT usage. When JIT support is enabled, +pcregrep automatically makes use of it, unless you add +.sp + --disable-pcregrep-jit +.sp +to the "configure" command. +. +. +.SH "CODE VALUE OF NEWLINE" +.rs +.sp +By default, PCRE interprets the linefeed (LF) character as indicating the end +of a line. This is the normal newline character on Unix-like systems. You can +compile PCRE to use carriage return (CR) instead, by adding +.sp + --enable-newline-is-cr +.sp +to the \fBconfigure\fP command. There is also a --enable-newline-is-lf option, +which explicitly specifies linefeed as the newline character. +.sp +Alternatively, you can specify that line endings are to be indicated by the two +character sequence CRLF. If you want this, add +.sp + --enable-newline-is-crlf +.sp +to the \fBconfigure\fP command. There is a fourth option, specified by +.sp + --enable-newline-is-anycrlf +.sp +which causes PCRE to recognize any of the three sequences CR, LF, or CRLF as +indicating a line ending. Finally, a fifth option, specified by +.sp + --enable-newline-is-any +.sp +causes PCRE to recognize any Unicode newline sequence. +.P +Whatever line ending convention is selected when PCRE is built can be +overridden when the library functions are called. At build time it is +conventional to use the standard for your operating system. +. +. +.SH "WHAT \eR MATCHES" +.rs +.sp +By default, the sequence \eR in a pattern matches any Unicode newline sequence, +whatever has been selected as the line ending sequence. If you specify +.sp + --enable-bsr-anycrlf +.sp +the default is changed so that \eR matches only CR, LF, or CRLF. Whatever is +selected when PCRE is built can be overridden when the library functions are +called. +. +. +.SH "POSIX MALLOC USAGE" +.rs +.sp +When the 8-bit library is called through the POSIX interface (see the +.\" HREF +\fBpcreposix\fP +.\" +documentation), additional working storage is required for holding the pointers +to capturing substrings, because PCRE requires three integers per substring, +whereas the POSIX interface provides only two. If the number of expected +substrings is small, the wrapper function uses space on the stack, because this +is faster than using \fBmalloc()\fP for each call. The default threshold above +which the stack is no longer used is 10; it can be changed by adding a setting +such as +.sp + --with-posix-malloc-threshold=20 +.sp +to the \fBconfigure\fP command. +. +. +.SH "HANDLING VERY LARGE PATTERNS" +.rs +.sp +Within a compiled pattern, offset values are used to point from one part to +another (for example, from an opening parenthesis to an alternation +metacharacter). By default, in the 8-bit and 16-bit libraries, two-byte values +are used for these offsets, leading to a maximum size for a compiled pattern of +around 64K. This is sufficient to handle all but the most gigantic patterns. +Nevertheless, some people do want to process truly enormous patterns, so it is +possible to compile PCRE to use three-byte or four-byte offsets by adding a +setting such as +.sp + --with-link-size=3 +.sp +to the \fBconfigure\fP command. The value given must be 2, 3, or 4. For the +16-bit library, a value of 3 is rounded up to 4. In these libraries, using +longer offsets slows down the operation of PCRE because it has to load +additional data when handling them. For the 32-bit library the value is always +4 and cannot be overridden; the value of --with-link-size is ignored. +. +. +.SH "AVOIDING EXCESSIVE STACK USAGE" +.rs +.sp +When matching with the \fBpcre_exec()\fP function, PCRE implements backtracking +by making recursive calls to an internal function called \fBmatch()\fP. In +environments where the size of the stack is limited, this can severely limit +PCRE's operation. (The Unix environment does not usually suffer from this +problem, but it may sometimes be necessary to increase the maximum stack size. +There is a discussion in the +.\" HREF +\fBpcrestack\fP +.\" +documentation.) An alternative approach to recursion that uses memory from the +heap to remember data, instead of using recursive function calls, has been +implemented to work round the problem of limited stack size. If you want to +build a version of PCRE that works this way, add +.sp + --disable-stack-for-recursion +.sp +to the \fBconfigure\fP command. With this configuration, PCRE will use the +\fBpcre_stack_malloc\fP and \fBpcre_stack_free\fP variables to call memory +management functions. By default these point to \fBmalloc()\fP and +\fBfree()\fP, but you can replace the pointers so that your own functions are +used instead. +.P +Separate functions are provided rather than using \fBpcre_malloc\fP and +\fBpcre_free\fP because the usage is very predictable: the block sizes +requested are always the same, and the blocks are always freed in reverse +order. A calling program might be able to implement optimized functions that +perform better than \fBmalloc()\fP and \fBfree()\fP. PCRE runs noticeably more +slowly when built in this way. This option affects only the \fBpcre_exec()\fP +function; it is not relevant for \fBpcre_dfa_exec()\fP. +. +. +.SH "LIMITING PCRE RESOURCE USAGE" +.rs +.sp +Internally, PCRE has a function called \fBmatch()\fP, which it calls repeatedly +(sometimes recursively) when matching a pattern with the \fBpcre_exec()\fP +function. By controlling the maximum number of times this function may be +called during a single matching operation, a limit can be placed on the +resources used by a single call to \fBpcre_exec()\fP. The limit can be changed +at run time, as described in the +.\" HREF +\fBpcreapi\fP +.\" +documentation. The default is 10 million, but this can be changed by adding a +setting such as +.sp + --with-match-limit=500000 +.sp +to the \fBconfigure\fP command. This setting has no effect on the +\fBpcre_dfa_exec()\fP matching function. +.P +In some environments it is desirable to limit the depth of recursive calls of +\fBmatch()\fP more strictly than the total number of calls, in order to +restrict the maximum amount of stack (or heap, if --disable-stack-for-recursion +is specified) that is used. A second limit controls this; it defaults to the +value that is set for --with-match-limit, which imposes no additional +constraints. However, you can set a lower limit by adding, for example, +.sp + --with-match-limit-recursion=10000 +.sp +to the \fBconfigure\fP command. This value can also be overridden at run time. +. +. +.SH "CREATING CHARACTER TABLES AT BUILD TIME" +.rs +.sp +PCRE uses fixed tables for processing characters whose code values are less +than 256. By default, PCRE is built with a set of tables that are distributed +in the file \fIpcre_chartables.c.dist\fP. These tables are for ASCII codes +only. If you add +.sp + --enable-rebuild-chartables +.sp +to the \fBconfigure\fP command, the distributed tables are no longer used. +Instead, a program called \fBdftables\fP is compiled and run. This outputs the +source for new set of tables, created in the default locale of your C run-time +system. (This method of replacing the tables does not work if you are cross +compiling, because \fBdftables\fP is run on the local host. If you need to +create alternative tables when cross compiling, you will have to do so "by +hand".) +. +. +.SH "USING EBCDIC CODE" +.rs +.sp +PCRE assumes by default that it will run in an environment where the character +code is ASCII (or Unicode, which is a superset of ASCII). This is the case for +most computer operating systems. PCRE can, however, be compiled to run in an +EBCDIC environment by adding +.sp + --enable-ebcdic +.sp +to the \fBconfigure\fP command. This setting implies +--enable-rebuild-chartables. You should only use it if you know that you are in +an EBCDIC environment (for example, an IBM mainframe operating system). The +--enable-ebcdic option is incompatible with --enable-utf. +.P +The EBCDIC character that corresponds to an ASCII LF is assumed to have the +value 0x15 by default. However, in some EBCDIC environments, 0x25 is used. In +such an environment you should use +.sp + --enable-ebcdic-nl25 +.sp +as well as, or instead of, --enable-ebcdic. The EBCDIC character for CR has the +same value as in ASCII, namely, 0x0d. Whichever of 0x15 and 0x25 is \fInot\fP +chosen as LF is made to correspond to the Unicode NEL character (which, in +Unicode, is 0x85). +.P +The options that select newline behaviour, such as --enable-newline-is-cr, +and equivalent run-time options, refer to these character values in an EBCDIC +environment. +. +. +.SH "PCREGREP OPTIONS FOR COMPRESSED FILE SUPPORT" +.rs +.sp +By default, \fBpcregrep\fP reads all files as plain text. You can build it so +that it recognizes files whose names end in \fB.gz\fP or \fB.bz2\fP, and reads +them with \fBlibz\fP or \fBlibbz2\fP, respectively, by adding one or both of +.sp + --enable-pcregrep-libz + --enable-pcregrep-libbz2 +.sp +to the \fBconfigure\fP command. These options naturally require that the +relevant libraries are installed on your system. Configuration will fail if +they are not. +. +. +.SH "PCREGREP BUFFER SIZE" +.rs +.sp +\fBpcregrep\fP uses an internal buffer to hold a "window" on the file it is +scanning, in order to be able to output "before" and "after" lines when it +finds a match. The size of the buffer is controlled by a parameter whose +default value is 20K. The buffer itself is three times this size, but because +of the way it is used for holding "before" lines, the longest line that is +guaranteed to be processable is the parameter size. You can change the default +parameter value by adding, for example, +.sp + --with-pcregrep-bufsize=50K +.sp +to the \fBconfigure\fP command. The caller of \fPpcregrep\fP can, however, +override this value by specifying a run-time option. +. +. +.SH "PCRETEST OPTION FOR LIBREADLINE SUPPORT" +.rs +.sp +If you add +.sp + --enable-pcretest-libreadline +.sp +to the \fBconfigure\fP command, \fBpcretest\fP is linked with the +\fBlibreadline\fP library, and when its input is from a terminal, it reads it +using the \fBreadline()\fP function. This provides line-editing and history +facilities. Note that \fBlibreadline\fP is GPL-licensed, so if you distribute a +binary of \fBpcretest\fP linked in this way, there may be licensing issues. +.P +Setting this option causes the \fB-lreadline\fP option to be added to the +\fBpcretest\fP build. In many operating environments with a sytem-installed +\fBlibreadline\fP this is sufficient. However, in some environments (e.g. +if an unmodified distribution version of readline is in use), some extra +configuration may be necessary. The INSTALL file for \fBlibreadline\fP says +this: +.sp + "Readline uses the termcap functions, but does not link with the + termcap or curses library itself, allowing applications which link + with readline the to choose an appropriate library." +.sp +If your environment has not been set up so that an appropriate library is +automatically included, you may need to add something like +.sp + LIBS="-ncurses" +.sp +immediately before the \fBconfigure\fP command. +. +. +.SH "DEBUGGING WITH VALGRIND SUPPORT" +.rs +.sp +By adding the +.sp + --enable-valgrind +.sp +option to to the \fBconfigure\fP command, PCRE will use valgrind annotations +to mark certain memory regions as unaddressable. This allows it to detect +invalid memory accesses, and is mostly useful for debugging PCRE itself. +. +. +.SH "CODE COVERAGE REPORTING" +.rs +.sp +If your C compiler is gcc, you can build a version of PCRE that can generate a +code coverage report for its test suite. To enable this, you must install +\fBlcov\fP version 1.6 or above. Then specify +.sp + --enable-coverage +.sp +to the \fBconfigure\fP command and build PCRE in the usual way. +.P +Note that using \fBccache\fP (a caching C compiler) is incompatible with code +coverage reporting. If you have configured \fBccache\fP to run automatically +on your system, you must set the environment variable +.sp + CCACHE_DISABLE=1 +.sp +before running \fBmake\fP to build PCRE, so that \fBccache\fP is not used. +.P +When --enable-coverage is used, the following addition targets are added to the +\fIMakefile\fP: +.sp + make coverage +.sp +This creates a fresh coverage report for the PCRE test suite. It is equivalent +to running "make coverage-reset", "make coverage-baseline", "make check", and +then "make coverage-report". +.sp + make coverage-reset +.sp +This zeroes the coverage counters, but does nothing else. +.sp + make coverage-baseline +.sp +This captures baseline coverage information. +.sp + make coverage-report +.sp +This creates the coverage report. +.sp + make coverage-clean-report +.sp +This removes the generated coverage report without cleaning the coverage data +itself. +.sp + make coverage-clean-data +.sp +This removes the captured coverage data without removing the coverage files +created at compile time (*.gcno). +.sp + make coverage-clean +.sp +This cleans all coverage data including the generated coverage report. For more +information about code coverage, see the \fBgcov\fP and \fBlcov\fP +documentation. +. +. +.SH "SEE ALSO" +.rs +.sp +\fBpcreapi\fP(3), \fBpcre16\fP, \fBpcre32\fP, \fBpcre_config\fP(3). +. +. +.SH AUTHOR +.rs +.sp +.nf +Philip Hazel +University Computing Service +Cambridge CB2 3QH, England. +.fi +. +. +.SH REVISION +.rs +.sp +.nf +Last updated: 12 May 2013 +Copyright (c) 1997-2013 University of Cambridge. +.fi diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcrecallout.3 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcrecallout.3 new file mode 100755 index 000000000..8ebc99595 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcrecallout.3 @@ -0,0 +1,255 @@ +.TH PCRECALLOUT 3 "12 November 2013" "PCRE 8.34" +.SH NAME +PCRE - Perl-compatible regular expressions +.SH SYNOPSIS +.rs +.sp +.B #include +.PP +.SM +.B int (*pcre_callout)(pcre_callout_block *); +.PP +.B int (*pcre16_callout)(pcre16_callout_block *); +.PP +.B int (*pcre32_callout)(pcre32_callout_block *); +. +.SH DESCRIPTION +.rs +.sp +PCRE provides a feature called "callout", which is a means of temporarily +passing control to the caller of PCRE in the middle of pattern matching. The +caller of PCRE provides an external function by putting its entry point in the +global variable \fIpcre_callout\fP (\fIpcre16_callout\fP for the 16-bit +library, \fIpcre32_callout\fP for the 32-bit library). By default, this +variable contains NULL, which disables all calling out. +.P +Within a regular expression, (?C) indicates the points at which the external +function is to be called. Different callout points can be identified by putting +a number less than 256 after the letter C. The default value is zero. +For example, this pattern has two callout points: +.sp + (?C1)abc(?C2)def +.sp +If the PCRE_AUTO_CALLOUT option bit is set when a pattern is compiled, PCRE +automatically inserts callouts, all with number 255, before each item in the +pattern. For example, if PCRE_AUTO_CALLOUT is used with the pattern +.sp + A(\ed{2}|--) +.sp +it is processed as if it were +.sp +(?C255)A(?C255)((?C255)\ed{2}(?C255)|(?C255)-(?C255)-(?C255))(?C255) +.sp +Notice that there is a callout before and after each parenthesis and +alternation bar. If the pattern contains a conditional group whose condition is +an assertion, an automatic callout is inserted immediately before the +condition. Such a callout may also be inserted explicitly, for example: +.sp + (?(?C9)(?=a)ab|de) +.sp +This applies only to assertion conditions (because they are themselves +independent groups). +.P +Automatic callouts can be used for tracking the progress of pattern matching. +The +.\" HREF +\fBpcretest\fP +.\" +program has a pattern qualifier (/C) that sets automatic callouts; when it is +used, the output indicates how the pattern is being matched. This is useful +information when you are trying to optimize the performance of a particular +pattern. +. +. +.SH "MISSING CALLOUTS" +.rs +.sp +You should be aware that, because of optimizations in the way PCRE compiles and +matches patterns, callouts sometimes do not happen exactly as you might expect. +.P +At compile time, PCRE "auto-possessifies" repeated items when it knows that +what follows cannot be part of the repeat. For example, a+[bc] is compiled as +if it were a++[bc]. The \fBpcretest\fP output when this pattern is anchored and +then applied with automatic callouts to the string "aaaa" is: +.sp + --->aaaa + +0 ^ ^ + +1 ^ a+ + +3 ^ ^ [bc] + No match +.sp +This indicates that when matching [bc] fails, there is no backtracking into a+ +and therefore the callouts that would be taken for the backtracks do not occur. +You can disable the auto-possessify feature by passing PCRE_NO_AUTO_POSSESS +to \fBpcre_compile()\fP, or starting the pattern with (*NO_AUTO_POSSESS). If +this is done in \fBpcretest\fP (using the /O qualifier), the output changes to +this: +.sp + --->aaaa + +0 ^ ^ + +1 ^ a+ + +3 ^ ^ [bc] + +3 ^ ^ [bc] + +3 ^ ^ [bc] + +3 ^^ [bc] + No match +.sp +This time, when matching [bc] fails, the matcher backtracks into a+ and tries +again, repeatedly, until a+ itself fails. +.P +Other optimizations that provide fast "no match" results also affect callouts. +For example, if the pattern is +.sp + ab(?C4)cd +.sp +PCRE knows that any matching string must contain the letter "d". If the subject +string is "abyz", the lack of "d" means that matching doesn't ever start, and +the callout is never reached. However, with "abyd", though the result is still +no match, the callout is obeyed. +.P +If the pattern is studied, PCRE knows the minimum length of a matching string, +and will immediately give a "no match" return without actually running a match +if the subject is not long enough, or, for unanchored patterns, if it has +been scanned far enough. +.P +You can disable these optimizations by passing the PCRE_NO_START_OPTIMIZE +option to the matching function, or by starting the pattern with +(*NO_START_OPT). This slows down the matching process, but does ensure that +callouts such as the example above are obeyed. +. +. +.SH "THE CALLOUT INTERFACE" +.rs +.sp +During matching, when PCRE reaches a callout point, the external function +defined by \fIpcre_callout\fP or \fIpcre[16|32]_callout\fP is called (if it is +set). This applies to both normal and DFA matching. The only argument to the +callout function is a pointer to a \fBpcre_callout\fP or +\fBpcre[16|32]_callout\fP block. These structures contains the following +fields: +.sp + int \fIversion\fP; + int \fIcallout_number\fP; + int *\fIoffset_vector\fP; + const char *\fIsubject\fP; (8-bit version) + PCRE_SPTR16 \fIsubject\fP; (16-bit version) + PCRE_SPTR32 \fIsubject\fP; (32-bit version) + int \fIsubject_length\fP; + int \fIstart_match\fP; + int \fIcurrent_position\fP; + int \fIcapture_top\fP; + int \fIcapture_last\fP; + void *\fIcallout_data\fP; + int \fIpattern_position\fP; + int \fInext_item_length\fP; + const unsigned char *\fImark\fP; (8-bit version) + const PCRE_UCHAR16 *\fImark\fP; (16-bit version) + const PCRE_UCHAR32 *\fImark\fP; (32-bit version) +.sp +The \fIversion\fP field is an integer containing the version number of the +block format. The initial version was 0; the current version is 2. The version +number will change again in future if additional fields are added, but the +intention is never to remove any of the existing fields. +.P +The \fIcallout_number\fP field contains the number of the callout, as compiled +into the pattern (that is, the number after ?C for manual callouts, and 255 for +automatically generated callouts). +.P +The \fIoffset_vector\fP field is a pointer to the vector of offsets that was +passed by the caller to the matching function. When \fBpcre_exec()\fP or +\fBpcre[16|32]_exec()\fP is used, the contents can be inspected, in order to +extract substrings that have been matched so far, in the same way as for +extracting substrings after a match has completed. For the DFA matching +functions, this field is not useful. +.P +The \fIsubject\fP and \fIsubject_length\fP fields contain copies of the values +that were passed to the matching function. +.P +The \fIstart_match\fP field normally contains the offset within the subject at +which the current match attempt started. However, if the escape sequence \eK +has been encountered, this value is changed to reflect the modified starting +point. If the pattern is not anchored, the callout function may be called +several times from the same point in the pattern for different starting points +in the subject. +.P +The \fIcurrent_position\fP field contains the offset within the subject of the +current match pointer. +.P +When the \fBpcre_exec()\fP or \fBpcre[16|32]_exec()\fP is used, the +\fIcapture_top\fP field contains one more than the number of the highest +numbered captured substring so far. If no substrings have been captured, the +value of \fIcapture_top\fP is one. This is always the case when the DFA +functions are used, because they do not support captured substrings. +.P +The \fIcapture_last\fP field contains the number of the most recently captured +substring. However, when a recursion exits, the value reverts to what it was +outside the recursion, as do the values of all captured substrings. If no +substrings have been captured, the value of \fIcapture_last\fP is -1. This is +always the case for the DFA matching functions. +.P +The \fIcallout_data\fP field contains a value that is passed to a matching +function specifically so that it can be passed back in callouts. It is passed +in the \fIcallout_data\fP field of a \fBpcre_extra\fP or \fBpcre[16|32]_extra\fP +data structure. If no such data was passed, the value of \fIcallout_data\fP in +a callout block is NULL. There is a description of the \fBpcre_extra\fP +structure in the +.\" HREF +\fBpcreapi\fP +.\" +documentation. +.P +The \fIpattern_position\fP field is present from version 1 of the callout +structure. It contains the offset to the next item to be matched in the pattern +string. +.P +The \fInext_item_length\fP field is present from version 1 of the callout +structure. It contains the length of the next item to be matched in the pattern +string. When the callout immediately precedes an alternation bar, a closing +parenthesis, or the end of the pattern, the length is zero. When the callout +precedes an opening parenthesis, the length is that of the entire subpattern. +.P +The \fIpattern_position\fP and \fInext_item_length\fP fields are intended to +help in distinguishing between different automatic callouts, which all have the +same callout number. However, they are set for all callouts. +.P +The \fImark\fP field is present from version 2 of the callout structure. In +callouts from \fBpcre_exec()\fP or \fBpcre[16|32]_exec()\fP it contains a +pointer to the zero-terminated name of the most recently passed (*MARK), +(*PRUNE), or (*THEN) item in the match, or NULL if no such items have been +passed. Instances of (*PRUNE) or (*THEN) without a name do not obliterate a +previous (*MARK). In callouts from the DFA matching functions this field always +contains NULL. +. +. +.SH "RETURN VALUES" +.rs +.sp +The external callout function returns an integer to PCRE. If the value is zero, +matching proceeds as normal. If the value is greater than zero, matching fails +at the current point, but the testing of other matching possibilities goes +ahead, just as if a lookahead assertion had failed. If the value is less than +zero, the match is abandoned, the matching function returns the negative value. +.P +Negative values should normally be chosen from the set of PCRE_ERROR_xxx +values. In particular, PCRE_ERROR_NOMATCH forces a standard "no match" failure. +The error number PCRE_ERROR_CALLOUT is reserved for use by callout functions; +it will never be used by PCRE itself. +. +. +.SH AUTHOR +.rs +.sp +.nf +Philip Hazel +University Computing Service +Cambridge CB2 3QH, England. +.fi +. +. +.SH REVISION +.rs +.sp +.nf +Last updated: 12 November 2013 +Copyright (c) 1997-2013 University of Cambridge. +.fi diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcrecompat.3 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcrecompat.3 new file mode 100755 index 000000000..6156e776f --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcrecompat.3 @@ -0,0 +1,200 @@ +.TH PCRECOMPAT 3 "10 November 2013" "PCRE 8.34" +.SH NAME +PCRE - Perl-compatible regular expressions +.SH "DIFFERENCES BETWEEN PCRE AND PERL" +.rs +.sp +This document describes the differences in the ways that PCRE and Perl handle +regular expressions. The differences described here are with respect to Perl +versions 5.10 and above. +.P +1. PCRE has only a subset of Perl's Unicode support. Details of what it does +have are given in the +.\" HREF +\fBpcreunicode\fP +.\" +page. +.P +2. PCRE allows repeat quantifiers only on parenthesized assertions, but they do +not mean what you might think. For example, (?!a){3} does not assert that the +next three characters are not "a". It just asserts that the next character is +not "a" three times (in principle: PCRE optimizes this to run the assertion +just once). Perl allows repeat quantifiers on other assertions such as \eb, but +these do not seem to have any use. +.P +3. Capturing subpatterns that occur inside negative lookahead assertions are +counted, but their entries in the offsets vector are never set. Perl sometimes +(but not always) sets its numerical variables from inside negative assertions. +.P +4. Though binary zero characters are supported in the subject string, they are +not allowed in a pattern string because it is passed as a normal C string, +terminated by zero. The escape sequence \e0 can be used in the pattern to +represent a binary zero. +.P +5. The following Perl escape sequences are not supported: \el, \eu, \eL, +\eU, and \eN when followed by a character name or Unicode value. (\eN on its +own, matching a non-newline character, is supported.) In fact these are +implemented by Perl's general string-handling and are not part of its pattern +matching engine. If any of these are encountered by PCRE, an error is +generated by default. However, if the PCRE_JAVASCRIPT_COMPAT option is set, +\eU and \eu are interpreted as JavaScript interprets them. +.P +6. The Perl escape sequences \ep, \eP, and \eX are supported only if PCRE is +built with Unicode character property support. The properties that can be +tested with \ep and \eP are limited to the general category properties such as +Lu and Nd, script names such as Greek or Han, and the derived properties Any +and L&. PCRE does support the Cs (surrogate) property, which Perl does not; the +Perl documentation says "Because Perl hides the need for the user to understand +the internal representation of Unicode characters, there is no need to +implement the somewhat messy concept of surrogates." +.P +7. PCRE does support the \eQ...\eE escape for quoting substrings. Characters in +between are treated as literals. This is slightly different from Perl in that $ +and @ are also handled as literals inside the quotes. In Perl, they cause +variable interpolation (but of course PCRE does not have variables). Note the +following examples: +.sp + Pattern PCRE matches Perl matches +.sp +.\" JOIN + \eQabc$xyz\eE abc$xyz abc followed by the + contents of $xyz + \eQabc\e$xyz\eE abc\e$xyz abc\e$xyz + \eQabc\eE\e$\eQxyz\eE abc$xyz abc$xyz +.sp +The \eQ...\eE sequence is recognized both inside and outside character classes. +.P +8. Fairly obviously, PCRE does not support the (?{code}) and (??{code}) +constructions. However, there is support for recursive patterns. This is not +available in Perl 5.8, but it is in Perl 5.10. Also, the PCRE "callout" +feature allows an external function to be called during pattern matching. See +the +.\" HREF +\fBpcrecallout\fP +.\" +documentation for details. +.P +9. Subpatterns that are called as subroutines (whether or not recursively) are +always treated as atomic groups in PCRE. This is like Python, but unlike Perl. +Captured values that are set outside a subroutine call can be reference from +inside in PCRE, but not in Perl. There is a discussion that explains these +differences in more detail in the +.\" HTML +.\" +section on recursion differences from Perl +.\" +in the +.\" HREF +\fBpcrepattern\fP +.\" +page. +.P +10. If any of the backtracking control verbs are used in a subpattern that is +called as a subroutine (whether or not recursively), their effect is confined +to that subpattern; it does not extend to the surrounding pattern. This is not +always the case in Perl. In particular, if (*THEN) is present in a group that +is called as a subroutine, its action is limited to that group, even if the +group does not contain any | characters. Note that such subpatterns are +processed as anchored at the point where they are tested. +.P +11. If a pattern contains more than one backtracking control verb, the first +one that is backtracked onto acts. For example, in the pattern +A(*COMMIT)B(*PRUNE)C a failure in B triggers (*COMMIT), but a failure in C +triggers (*PRUNE). Perl's behaviour is more complex; in many cases it is the +same as PCRE, but there are examples where it differs. +.P +12. Most backtracking verbs in assertions have their normal actions. They are +not confined to the assertion. +.P +13. There are some differences that are concerned with the settings of captured +strings when part of a pattern is repeated. For example, matching "aba" against +the pattern /^(a(b)?)+$/ in Perl leaves $2 unset, but in PCRE it is set to "b". +.P +14. PCRE's handling of duplicate subpattern numbers and duplicate subpattern +names is not as general as Perl's. This is a consequence of the fact the PCRE +works internally just with numbers, using an external table to translate +between numbers and names. In particular, a pattern such as (?|(?A)|(?B), +where the two capturing parentheses have the same number but different names, +is not supported, and causes an error at compile time. If it were allowed, it +would not be possible to distinguish which parentheses matched, because both +names map to capturing subpattern number 1. To avoid this confusing situation, +an error is given at compile time. +.P +15. Perl recognizes comments in some places that PCRE does not, for example, +between the ( and ? at the start of a subpattern. If the /x modifier is set, +Perl allows white space between ( and ? (though current Perls warn that this is +deprecated) but PCRE never does, even if the PCRE_EXTENDED option is set. +.P +16. Perl, when in warning mode, gives warnings for character classes such as +[A-\ed] or [a-[:digit:]]. It then treats the hyphens as literals. PCRE has no +warning features, so it gives an error in these cases because they are almost +certainly user mistakes. +.P +17. In PCRE, the upper/lower case character properties Lu and Ll are not +affected when case-independent matching is specified. For example, \ep{Lu} +always matches an upper case letter. I think Perl has changed in this respect; +in the release at the time of writing (5.16), \ep{Lu} and \ep{Ll} match all +letters, regardless of case, when case independence is specified. +.P +18. PCRE provides some extensions to the Perl regular expression facilities. +Perl 5.10 includes new features that are not in earlier versions of Perl, some +of which (such as named parentheses) have been in PCRE for some time. This list +is with respect to Perl 5.10: +.sp +(a) Although lookbehind assertions in PCRE must match fixed length strings, +each alternative branch of a lookbehind assertion can match a different length +of string. Perl requires them all to have the same length. +.sp +(b) If PCRE_DOLLAR_ENDONLY is set and PCRE_MULTILINE is not set, the $ +meta-character matches only at the very end of the string. +.sp +(c) If PCRE_EXTRA is set, a backslash followed by a letter with no special +meaning is faulted. Otherwise, like Perl, the backslash is quietly ignored. +(Perl can be made to issue a warning.) +.sp +(d) If PCRE_UNGREEDY is set, the greediness of the repetition quantifiers is +inverted, that is, by default they are not greedy, but if followed by a +question mark they are. +.sp +(e) PCRE_ANCHORED can be used at matching time to force a pattern to be tried +only at the first matching position in the subject string. +.sp +(f) The PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, and +PCRE_NO_AUTO_CAPTURE options for \fBpcre_exec()\fP have no Perl equivalents. +.sp +(g) The \eR escape sequence can be restricted to match only CR, LF, or CRLF +by the PCRE_BSR_ANYCRLF option. +.sp +(h) The callout facility is PCRE-specific. +.sp +(i) The partial matching facility is PCRE-specific. +.sp +(j) Patterns compiled by PCRE can be saved and re-used at a later time, even on +different hosts that have the other endianness. However, this does not apply to +optimized data created by the just-in-time compiler. +.sp +(k) The alternative matching functions (\fBpcre_dfa_exec()\fP, +\fBpcre16_dfa_exec()\fP and \fBpcre32_dfa_exec()\fP,) match in a different way +and are not Perl-compatible. +.sp +(l) PCRE recognizes some special sequences such as (*CR) at the start of +a pattern that set overall options that cannot be changed within the pattern. +. +. +.SH AUTHOR +.rs +.sp +.nf +Philip Hazel +University Computing Service +Cambridge CB2 3QH, England. +.fi +. +. +.SH REVISION +.rs +.sp +.nf +Last updated: 10 November 2013 +Copyright (c) 1997-2013 University of Cambridge. +.fi diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcrecpp.3 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcrecpp.3 new file mode 100755 index 000000000..fbddd86ab --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcrecpp.3 @@ -0,0 +1,348 @@ +.TH PCRECPP 3 "08 January 2012" "PCRE 8.30" +.SH NAME +PCRE - Perl-compatible regular expressions. +.SH "SYNOPSIS OF C++ WRAPPER" +.rs +.sp +.B #include +. +.SH DESCRIPTION +.rs +.sp +The C++ wrapper for PCRE was provided by Google Inc. Some additional +functionality was added by Giuseppe Maxia. This brief man page was constructed +from the notes in the \fIpcrecpp.h\fP file, which should be consulted for +further details. Note that the C++ wrapper supports only the original 8-bit +PCRE library. There is no 16-bit or 32-bit support at present. +. +. +.SH "MATCHING INTERFACE" +.rs +.sp +The "FullMatch" operation checks that supplied text matches a supplied pattern +exactly. If pointer arguments are supplied, it copies matched sub-strings that +match sub-patterns into them. +.sp + Example: successful match + pcrecpp::RE re("h.*o"); + re.FullMatch("hello"); +.sp + Example: unsuccessful match (requires full match): + pcrecpp::RE re("e"); + !re.FullMatch("hello"); +.sp + Example: creating a temporary RE object: + pcrecpp::RE("h.*o").FullMatch("hello"); +.sp +You can pass in a "const char*" or a "string" for "text". The examples below +tend to use a const char*. You can, as in the different examples above, store +the RE object explicitly in a variable or use a temporary RE object. The +examples below use one mode or the other arbitrarily. Either could correctly be +used for any of these examples. +.P +You must supply extra pointer arguments to extract matched subpieces. +.sp + Example: extracts "ruby" into "s" and 1234 into "i" + int i; + string s; + pcrecpp::RE re("(\e\ew+):(\e\ed+)"); + re.FullMatch("ruby:1234", &s, &i); +.sp + Example: does not try to extract any extra sub-patterns + re.FullMatch("ruby:1234", &s); +.sp + Example: does not try to extract into NULL + re.FullMatch("ruby:1234", NULL, &i); +.sp + Example: integer overflow causes failure + !re.FullMatch("ruby:1234567891234", NULL, &i); +.sp + Example: fails because there aren't enough sub-patterns: + !pcrecpp::RE("\e\ew+:\e\ed+").FullMatch("ruby:1234", &s); +.sp + Example: fails because string cannot be stored in integer + !pcrecpp::RE("(.*)").FullMatch("ruby", &i); +.sp +The provided pointer arguments can be pointers to any scalar numeric +type, or one of: +.sp + string (matched piece is copied to string) + StringPiece (StringPiece is mutated to point to matched piece) + T (where "bool T::ParseFrom(const char*, int)" exists) + NULL (the corresponding matched sub-pattern is not copied) +.sp +The function returns true iff all of the following conditions are satisfied: +.sp + a. "text" matches "pattern" exactly; +.sp + b. The number of matched sub-patterns is >= number of supplied + pointers; +.sp + c. The "i"th argument has a suitable type for holding the + string captured as the "i"th sub-pattern. If you pass in + void * NULL for the "i"th argument, or a non-void * NULL + of the correct type, or pass fewer arguments than the + number of sub-patterns, "i"th captured sub-pattern is + ignored. +.sp +CAVEAT: An optional sub-pattern that does not exist in the matched +string is assigned the empty string. Therefore, the following will +return false (because the empty string is not a valid number): +.sp + int number; + pcrecpp::RE::FullMatch("abc", "[a-z]+(\e\ed+)?", &number); +.sp +The matching interface supports at most 16 arguments per call. +If you need more, consider using the more general interface +\fBpcrecpp::RE::DoMatch\fP. See \fBpcrecpp.h\fP for the signature for +\fBDoMatch\fP. +.P +NOTE: Do not use \fBno_arg\fP, which is used internally to mark the end of a +list of optional arguments, as a placeholder for missing arguments, as this can +lead to segfaults. +. +. +.SH "QUOTING METACHARACTERS" +.rs +.sp +You can use the "QuoteMeta" operation to insert backslashes before all +potentially meaningful characters in a string. The returned string, used as a +regular expression, will exactly match the original string. +.sp + Example: + string quoted = RE::QuoteMeta(unquoted); +.sp +Note that it's legal to escape a character even if it has no special meaning in +a regular expression -- so this function does that. (This also makes it +identical to the perl function of the same name; see "perldoc -f quotemeta".) +For example, "1.5-2.0?" becomes "1\e.5\e-2\e.0\e?". +. +.SH "PARTIAL MATCHES" +.rs +.sp +You can use the "PartialMatch" operation when you want the pattern +to match any substring of the text. +.sp + Example: simple search for a string: + pcrecpp::RE("ell").PartialMatch("hello"); +.sp + Example: find first number in a string: + int number; + pcrecpp::RE re("(\e\ed+)"); + re.PartialMatch("x*100 + 20", &number); + assert(number == 100); +. +. +.SH "UTF-8 AND THE MATCHING INTERFACE" +.rs +.sp +By default, pattern and text are plain text, one byte per character. The UTF8 +flag, passed to the constructor, causes both pattern and string to be treated +as UTF-8 text, still a byte stream but potentially multiple bytes per +character. In practice, the text is likelier to be UTF-8 than the pattern, but +the match returned may depend on the UTF8 flag, so always use it when matching +UTF8 text. For example, "." will match one byte normally but with UTF8 set may +match up to three bytes of a multi-byte character. +.sp + Example: + pcrecpp::RE_Options options; + options.set_utf8(); + pcrecpp::RE re(utf8_pattern, options); + re.FullMatch(utf8_string); +.sp + Example: using the convenience function UTF8(): + pcrecpp::RE re(utf8_pattern, pcrecpp::UTF8()); + re.FullMatch(utf8_string); +.sp +NOTE: The UTF8 flag is ignored if pcre was not configured with the + --enable-utf8 flag. +. +. +.SH "PASSING MODIFIERS TO THE REGULAR EXPRESSION ENGINE" +.rs +.sp +PCRE defines some modifiers to change the behavior of the regular expression +engine. The C++ wrapper defines an auxiliary class, RE_Options, as a vehicle to +pass such modifiers to a RE class. Currently, the following modifiers are +supported: +.sp + modifier description Perl corresponding +.sp + PCRE_CASELESS case insensitive match /i + PCRE_MULTILINE multiple lines match /m + PCRE_DOTALL dot matches newlines /s + PCRE_DOLLAR_ENDONLY $ matches only at end N/A + PCRE_EXTRA strict escape parsing N/A + PCRE_EXTENDED ignore white spaces /x + PCRE_UTF8 handles UTF8 chars built-in + PCRE_UNGREEDY reverses * and *? N/A + PCRE_NO_AUTO_CAPTURE disables capturing parens N/A (*) +.sp +(*) Both Perl and PCRE allow non capturing parentheses by means of the +"?:" modifier within the pattern itself. e.g. (?:ab|cd) does not +capture, while (ab|cd) does. +.P +For a full account on how each modifier works, please check the +PCRE API reference page. +.P +For each modifier, there are two member functions whose name is made +out of the modifier in lowercase, without the "PCRE_" prefix. For +instance, PCRE_CASELESS is handled by +.sp + bool caseless() +.sp +which returns true if the modifier is set, and +.sp + RE_Options & set_caseless(bool) +.sp +which sets or unsets the modifier. Moreover, PCRE_EXTRA_MATCH_LIMIT can be +accessed through the \fBset_match_limit()\fP and \fBmatch_limit()\fP member +functions. Setting \fImatch_limit\fP to a non-zero value will limit the +execution of pcre to keep it from doing bad things like blowing the stack or +taking an eternity to return a result. A value of 5000 is good enough to stop +stack blowup in a 2MB thread stack. Setting \fImatch_limit\fP to zero disables +match limiting. Alternatively, you can call \fBmatch_limit_recursion()\fP +which uses PCRE_EXTRA_MATCH_LIMIT_RECURSION to limit how much PCRE +recurses. \fBmatch_limit()\fP limits the number of matches PCRE does; +\fBmatch_limit_recursion()\fP limits the depth of internal recursion, and +therefore the amount of stack that is used. +.P +Normally, to pass one or more modifiers to a RE class, you declare +a \fIRE_Options\fP object, set the appropriate options, and pass this +object to a RE constructor. Example: +.sp + RE_Options opt; + opt.set_caseless(true); + if (RE("HELLO", opt).PartialMatch("hello world")) ... +.sp +RE_options has two constructors. The default constructor takes no arguments and +creates a set of flags that are off by default. The optional parameter +\fIoption_flags\fP is to facilitate transfer of legacy code from C programs. +This lets you do +.sp + RE(pattern, + RE_Options(PCRE_CASELESS|PCRE_MULTILINE)).PartialMatch(str); +.sp +However, new code is better off doing +.sp + RE(pattern, + RE_Options().set_caseless(true).set_multiline(true)) + .PartialMatch(str); +.sp +If you are going to pass one of the most used modifiers, there are some +convenience functions that return a RE_Options class with the +appropriate modifier already set: \fBCASELESS()\fP, \fBUTF8()\fP, +\fBMULTILINE()\fP, \fBDOTALL\fP(), and \fBEXTENDED()\fP. +.P +If you need to set several options at once, and you don't want to go through +the pains of declaring a RE_Options object and setting several options, there +is a parallel method that give you such ability on the fly. You can concatenate +several \fBset_xxxxx()\fP member functions, since each of them returns a +reference to its class object. For example, to pass PCRE_CASELESS, +PCRE_EXTENDED, and PCRE_MULTILINE to a RE with one statement, you may write: +.sp + RE(" ^ xyz \e\es+ .* blah$", + RE_Options() + .set_caseless(true) + .set_extended(true) + .set_multiline(true)).PartialMatch(sometext); +.sp +. +. +.SH "SCANNING TEXT INCREMENTALLY" +.rs +.sp +The "Consume" operation may be useful if you want to repeatedly +match regular expressions at the front of a string and skip over +them as they match. This requires use of the "StringPiece" type, +which represents a sub-range of a real string. Like RE, StringPiece +is defined in the pcrecpp namespace. +.sp + Example: read lines of the form "var = value" from a string. + string contents = ...; // Fill string somehow + pcrecpp::StringPiece input(contents); // Wrap in a StringPiece +.sp + string var; + int value; + pcrecpp::RE re("(\e\ew+) = (\e\ed+)\en"); + while (re.Consume(&input, &var, &value)) { + ...; + } +.sp +Each successful call to "Consume" will set "var/value", and also +advance "input" so it points past the matched text. +.P +The "FindAndConsume" operation is similar to "Consume" but does not +anchor your match at the beginning of the string. For example, you +could extract all words from a string by repeatedly calling +.sp + pcrecpp::RE("(\e\ew+)").FindAndConsume(&input, &word) +. +. +.SH "PARSING HEX/OCTAL/C-RADIX NUMBERS" +.rs +.sp +By default, if you pass a pointer to a numeric value, the +corresponding text is interpreted as a base-10 number. You can +instead wrap the pointer with a call to one of the operators Hex(), +Octal(), or CRadix() to interpret the text in another base. The +CRadix operator interprets C-style "0" (base-8) and "0x" (base-16) +prefixes, but defaults to base-10. +.sp + Example: + int a, b, c, d; + pcrecpp::RE re("(.*) (.*) (.*) (.*)"); + re.FullMatch("100 40 0100 0x40", + pcrecpp::Octal(&a), pcrecpp::Hex(&b), + pcrecpp::CRadix(&c), pcrecpp::CRadix(&d)); +.sp +will leave 64 in a, b, c, and d. +. +. +.SH "REPLACING PARTS OF STRINGS" +.rs +.sp +You can replace the first match of "pattern" in "str" with "rewrite". +Within "rewrite", backslash-escaped digits (\e1 to \e9) can be +used to insert text matching corresponding parenthesized group +from the pattern. \e0 in "rewrite" refers to the entire matching +text. For example: +.sp + string s = "yabba dabba doo"; + pcrecpp::RE("b+").Replace("d", &s); +.sp +will leave "s" containing "yada dabba doo". The result is true if the pattern +matches and a replacement occurs, false otherwise. +.P +\fBGlobalReplace\fP is like \fBReplace\fP except that it replaces all +occurrences of the pattern in the string with the rewrite. Replacements are +not subject to re-matching. For example: +.sp + string s = "yabba dabba doo"; + pcrecpp::RE("b+").GlobalReplace("d", &s); +.sp +will leave "s" containing "yada dada doo". It returns the number of +replacements made. +.P +\fBExtract\fP is like \fBReplace\fP, except that if the pattern matches, +"rewrite" is copied into "out" (an additional argument) with substitutions. +The non-matching portions of "text" are ignored. Returns true iff a match +occurred and the extraction happened successfully; if no match occurs, the +string is left unaffected. +. +. +.SH AUTHOR +.rs +.sp +.nf +The C++ wrapper was contributed by Google Inc. +Copyright (c) 2007 Google Inc. +.fi +. +. +.SH REVISION +.rs +.sp +.nf +Last updated: 08 January 2012 +.fi diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcredemo.3 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcredemo.3 new file mode 100755 index 000000000..194629b1f --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcredemo.3 @@ -0,0 +1,424 @@ +.\" Start example. +.de EX +. nr mE \\n(.f +. nf +. nh +. ft CW +.. +. +. +.\" End example. +.de EE +. ft \\n(mE +. fi +. hy \\n(HY +.. +. +.EX +/************************************************* +* PCRE DEMONSTRATION PROGRAM * +*************************************************/ + +/* This is a demonstration program to illustrate the most straightforward ways +of calling the PCRE regular expression library from a C program. See the +pcresample documentation for a short discussion ("man pcresample" if you have +the PCRE man pages installed). + +In Unix-like environments, if PCRE is installed in your standard system +libraries, you should be able to compile this program using this command: + +gcc -Wall pcredemo.c -lpcre -o pcredemo + +If PCRE is not installed in a standard place, it is likely to be installed with +support for the pkg-config mechanism. If you have pkg-config, you can compile +this program using this command: + +gcc -Wall pcredemo.c `pkg-config --cflags --libs libpcre` -o pcredemo + +If you do not have pkg-config, you may have to use this: + +gcc -Wall pcredemo.c -I/usr/local/include -L/usr/local/lib \e + -R/usr/local/lib -lpcre -o pcredemo + +Replace "/usr/local/include" and "/usr/local/lib" with wherever the include and +library files for PCRE are installed on your system. Only some operating +systems (e.g. Solaris) use the -R option. + +Building under Windows: + +If you want to statically link this program against a non-dll .a file, you must +define PCRE_STATIC before including pcre.h, otherwise the pcre_malloc() and +pcre_free() exported functions will be declared __declspec(dllimport), with +unwanted results. So in this environment, uncomment the following line. */ + +/* #define PCRE_STATIC */ + +#include +#include +#include + +#define OVECCOUNT 30 /* should be a multiple of 3 */ + + +int main(int argc, char **argv) +{ +pcre *re; +const char *error; +char *pattern; +char *subject; +unsigned char *name_table; +unsigned int option_bits; +int erroffset; +int find_all; +int crlf_is_newline; +int namecount; +int name_entry_size; +int ovector[OVECCOUNT]; +int subject_length; +int rc, i; +int utf8; + + +/************************************************************************** +* First, sort out the command line. There is only one possible option at * +* the moment, "-g" to request repeated matching to find all occurrences, * +* like Perl's /g option. We set the variable find_all to a non-zero value * +* if the -g option is present. Apart from that, there must be exactly two * +* arguments. * +**************************************************************************/ + +find_all = 0; +for (i = 1; i < argc; i++) + { + if (strcmp(argv[i], "-g") == 0) find_all = 1; + else break; + } + +/* After the options, we require exactly two arguments, which are the pattern, +and the subject string. */ + +if (argc - i != 2) + { + printf("Two arguments required: a regex and a subject string\en"); + return 1; + } + +pattern = argv[i]; +subject = argv[i+1]; +subject_length = (int)strlen(subject); + + +/************************************************************************* +* Now we are going to compile the regular expression pattern, and handle * +* and errors that are detected. * +*************************************************************************/ + +re = pcre_compile( + pattern, /* the pattern */ + 0, /* default options */ + &error, /* for error message */ + &erroffset, /* for error offset */ + NULL); /* use default character tables */ + +/* Compilation failed: print the error message and exit */ + +if (re == NULL) + { + printf("PCRE compilation failed at offset %d: %s\en", erroffset, error); + return 1; + } + + +/************************************************************************* +* If the compilation succeeded, we call PCRE again, in order to do a * +* pattern match against the subject string. This does just ONE match. If * +* further matching is needed, it will be done below. * +*************************************************************************/ + +rc = pcre_exec( + re, /* the compiled pattern */ + NULL, /* no extra data - we didn't study the pattern */ + subject, /* the subject string */ + subject_length, /* the length of the subject */ + 0, /* start at offset 0 in the subject */ + 0, /* default options */ + ovector, /* output vector for substring information */ + OVECCOUNT); /* number of elements in the output vector */ + +/* Matching failed: handle error cases */ + +if (rc < 0) + { + switch(rc) + { + case PCRE_ERROR_NOMATCH: printf("No match\en"); break; + /* + Handle other special cases if you like + */ + default: printf("Matching error %d\en", rc); break; + } + pcre_free(re); /* Release memory used for the compiled pattern */ + return 1; + } + +/* Match succeded */ + +printf("\enMatch succeeded at offset %d\en", ovector[0]); + + +/************************************************************************* +* We have found the first match within the subject string. If the output * +* vector wasn't big enough, say so. Then output any substrings that were * +* captured. * +*************************************************************************/ + +/* The output vector wasn't big enough */ + +if (rc == 0) + { + rc = OVECCOUNT/3; + printf("ovector only has room for %d captured substrings\en", rc - 1); + } + +/* Show substrings stored in the output vector by number. Obviously, in a real +application you might want to do things other than print them. */ + +for (i = 0; i < rc; i++) + { + char *substring_start = subject + ovector[2*i]; + int substring_length = ovector[2*i+1] - ovector[2*i]; + printf("%2d: %.*s\en", i, substring_length, substring_start); + } + + +/************************************************************************** +* That concludes the basic part of this demonstration program. We have * +* compiled a pattern, and performed a single match. The code that follows * +* shows first how to access named substrings, and then how to code for * +* repeated matches on the same subject. * +**************************************************************************/ + +/* See if there are any named substrings, and if so, show them by name. First +we have to extract the count of named parentheses from the pattern. */ + +(void)pcre_fullinfo( + re, /* the compiled pattern */ + NULL, /* no extra data - we didn't study the pattern */ + PCRE_INFO_NAMECOUNT, /* number of named substrings */ + &namecount); /* where to put the answer */ + +if (namecount <= 0) printf("No named substrings\en"); else + { + unsigned char *tabptr; + printf("Named substrings\en"); + + /* Before we can access the substrings, we must extract the table for + translating names to numbers, and the size of each entry in the table. */ + + (void)pcre_fullinfo( + re, /* the compiled pattern */ + NULL, /* no extra data - we didn't study the pattern */ + PCRE_INFO_NAMETABLE, /* address of the table */ + &name_table); /* where to put the answer */ + + (void)pcre_fullinfo( + re, /* the compiled pattern */ + NULL, /* no extra data - we didn't study the pattern */ + PCRE_INFO_NAMEENTRYSIZE, /* size of each entry in the table */ + &name_entry_size); /* where to put the answer */ + + /* Now we can scan the table and, for each entry, print the number, the name, + and the substring itself. */ + + tabptr = name_table; + for (i = 0; i < namecount; i++) + { + int n = (tabptr[0] << 8) | tabptr[1]; + printf("(%d) %*s: %.*s\en", n, name_entry_size - 3, tabptr + 2, + ovector[2*n+1] - ovector[2*n], subject + ovector[2*n]); + tabptr += name_entry_size; + } + } + + +/************************************************************************* +* If the "-g" option was given on the command line, we want to continue * +* to search for additional matches in the subject string, in a similar * +* way to the /g option in Perl. This turns out to be trickier than you * +* might think because of the possibility of matching an empty string. * +* What happens is as follows: * +* * +* If the previous match was NOT for an empty string, we can just start * +* the next match at the end of the previous one. * +* * +* If the previous match WAS for an empty string, we can't do that, as it * +* would lead to an infinite loop. Instead, a special call of pcre_exec() * +* is made with the PCRE_NOTEMPTY_ATSTART and PCRE_ANCHORED flags set. * +* The first of these tells PCRE that an empty string at the start of the * +* subject is not a valid match; other possibilities must be tried. The * +* second flag restricts PCRE to one match attempt at the initial string * +* position. If this match succeeds, an alternative to the empty string * +* match has been found, and we can print it and proceed round the loop, * +* advancing by the length of whatever was found. If this match does not * +* succeed, we still stay in the loop, advancing by just one character. * +* In UTF-8 mode, which can be set by (*UTF8) in the pattern, this may be * +* more than one byte. * +* * +* However, there is a complication concerned with newlines. When the * +* newline convention is such that CRLF is a valid newline, we must * +* advance by two characters rather than one. The newline convention can * +* be set in the regex by (*CR), etc.; if not, we must find the default. * +*************************************************************************/ + +if (!find_all) /* Check for -g */ + { + pcre_free(re); /* Release the memory used for the compiled pattern */ + return 0; /* Finish unless -g was given */ + } + +/* Before running the loop, check for UTF-8 and whether CRLF is a valid newline +sequence. First, find the options with which the regex was compiled; extract +the UTF-8 state, and mask off all but the newline options. */ + +(void)pcre_fullinfo(re, NULL, PCRE_INFO_OPTIONS, &option_bits); +utf8 = option_bits & PCRE_UTF8; +option_bits &= PCRE_NEWLINE_CR|PCRE_NEWLINE_LF|PCRE_NEWLINE_CRLF| + PCRE_NEWLINE_ANY|PCRE_NEWLINE_ANYCRLF; + +/* If no newline options were set, find the default newline convention from the +build configuration. */ + +if (option_bits == 0) + { + int d; + (void)pcre_config(PCRE_CONFIG_NEWLINE, &d); + /* Note that these values are always the ASCII ones, even in + EBCDIC environments. CR = 13, NL = 10. */ + option_bits = (d == 13)? PCRE_NEWLINE_CR : + (d == 10)? PCRE_NEWLINE_LF : + (d == (13<<8 | 10))? PCRE_NEWLINE_CRLF : + (d == -2)? PCRE_NEWLINE_ANYCRLF : + (d == -1)? PCRE_NEWLINE_ANY : 0; + } + +/* See if CRLF is a valid newline sequence. */ + +crlf_is_newline = + option_bits == PCRE_NEWLINE_ANY || + option_bits == PCRE_NEWLINE_CRLF || + option_bits == PCRE_NEWLINE_ANYCRLF; + +/* Loop for second and subsequent matches */ + +for (;;) + { + int options = 0; /* Normally no options */ + int start_offset = ovector[1]; /* Start at end of previous match */ + + /* If the previous match was for an empty string, we are finished if we are + at the end of the subject. Otherwise, arrange to run another match at the + same point to see if a non-empty match can be found. */ + + if (ovector[0] == ovector[1]) + { + if (ovector[0] == subject_length) break; + options = PCRE_NOTEMPTY_ATSTART | PCRE_ANCHORED; + } + + /* Run the next matching operation */ + + rc = pcre_exec( + re, /* the compiled pattern */ + NULL, /* no extra data - we didn't study the pattern */ + subject, /* the subject string */ + subject_length, /* the length of the subject */ + start_offset, /* starting offset in the subject */ + options, /* options */ + ovector, /* output vector for substring information */ + OVECCOUNT); /* number of elements in the output vector */ + + /* This time, a result of NOMATCH isn't an error. If the value in "options" + is zero, it just means we have found all possible matches, so the loop ends. + Otherwise, it means we have failed to find a non-empty-string match at a + point where there was a previous empty-string match. In this case, we do what + Perl does: advance the matching position by one character, and continue. We + do this by setting the "end of previous match" offset, because that is picked + up at the top of the loop as the point at which to start again. + + There are two complications: (a) When CRLF is a valid newline sequence, and + the current position is just before it, advance by an extra byte. (b) + Otherwise we must ensure that we skip an entire UTF-8 character if we are in + UTF-8 mode. */ + + if (rc == PCRE_ERROR_NOMATCH) + { + if (options == 0) break; /* All matches found */ + ovector[1] = start_offset + 1; /* Advance one byte */ + if (crlf_is_newline && /* If CRLF is newline & */ + start_offset < subject_length - 1 && /* we are at CRLF, */ + subject[start_offset] == '\er' && + subject[start_offset + 1] == '\en') + ovector[1] += 1; /* Advance by one more. */ + else if (utf8) /* Otherwise, ensure we */ + { /* advance a whole UTF-8 */ + while (ovector[1] < subject_length) /* character. */ + { + if ((subject[ovector[1]] & 0xc0) != 0x80) break; + ovector[1] += 1; + } + } + continue; /* Go round the loop again */ + } + + /* Other matching errors are not recoverable. */ + + if (rc < 0) + { + printf("Matching error %d\en", rc); + pcre_free(re); /* Release memory used for the compiled pattern */ + return 1; + } + + /* Match succeded */ + + printf("\enMatch succeeded again at offset %d\en", ovector[0]); + + /* The match succeeded, but the output vector wasn't big enough. */ + + if (rc == 0) + { + rc = OVECCOUNT/3; + printf("ovector only has room for %d captured substrings\en", rc - 1); + } + + /* As before, show substrings stored in the output vector by number, and then + also any named substrings. */ + + for (i = 0; i < rc; i++) + { + char *substring_start = subject + ovector[2*i]; + int substring_length = ovector[2*i+1] - ovector[2*i]; + printf("%2d: %.*s\en", i, substring_length, substring_start); + } + + if (namecount <= 0) printf("No named substrings\en"); else + { + unsigned char *tabptr = name_table; + printf("Named substrings\en"); + for (i = 0; i < namecount; i++) + { + int n = (tabptr[0] << 8) | tabptr[1]; + printf("(%d) %*s: %.*s\en", n, name_entry_size - 3, tabptr + 2, + ovector[2*n+1] - ovector[2*n], subject + ovector[2*n]); + tabptr += name_entry_size; + } + } + } /* End of loop to find second and subsequent matches */ + +printf("\en"); +pcre_free(re); /* Release memory used for the compiled pattern */ +return 0; +} + +/* End of pcredemo.c */ +.EE diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcregrep.1 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcregrep.1 new file mode 100755 index 000000000..988667542 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcregrep.1 @@ -0,0 +1,683 @@ +.TH PCREGREP 1 "03 April 2014" "PCRE 8.35" +.SH NAME +pcregrep - a grep with Perl-compatible regular expressions. +.SH SYNOPSIS +.B pcregrep [options] [long options] [pattern] [path1 path2 ...] +. +.SH DESCRIPTION +.rs +.sp +\fBpcregrep\fP searches files for character patterns, in the same way as other +grep commands do, but it uses the PCRE regular expression library to support +patterns that are compatible with the regular expressions of Perl 5. See +.\" HREF +\fBpcresyntax\fP(3) +.\" +for a quick-reference summary of pattern syntax, or +.\" HREF +\fBpcrepattern\fP(3) +.\" +for a full description of the syntax and semantics of the regular expressions +that PCRE supports. +.P +Patterns, whether supplied on the command line or in a separate file, are given +without delimiters. For example: +.sp + pcregrep Thursday /etc/motd +.sp +If you attempt to use delimiters (for example, by surrounding a pattern with +slashes, as is common in Perl scripts), they are interpreted as part of the +pattern. Quotes can of course be used to delimit patterns on the command line +because they are interpreted by the shell, and indeed quotes are required if a +pattern contains white space or shell metacharacters. +.P +The first argument that follows any option settings is treated as the single +pattern to be matched when neither \fB-e\fP nor \fB-f\fP is present. +Conversely, when one or both of these options are used to specify patterns, all +arguments are treated as path names. At least one of \fB-e\fP, \fB-f\fP, or an +argument pattern must be provided. +.P +If no files are specified, \fBpcregrep\fP reads the standard input. The +standard input can also be referenced by a name consisting of a single hyphen. +For example: +.sp + pcregrep some-pattern /file1 - /file3 +.sp +By default, each line that matches a pattern is copied to the standard +output, and if there is more than one file, the file name is output at the +start of each line, followed by a colon. However, there are options that can +change how \fBpcregrep\fP behaves. In particular, the \fB-M\fP option makes it +possible to search for patterns that span line boundaries. What defines a line +boundary is controlled by the \fB-N\fP (\fB--newline\fP) option. +.P +The amount of memory used for buffering files that are being scanned is +controlled by a parameter that can be set by the \fB--buffer-size\fP option. +The default value for this parameter is specified when \fBpcregrep\fP is built, +with the default default being 20K. A block of memory three times this size is +used (to allow for buffering "before" and "after" lines). An error occurs if a +line overflows the buffer. +.P +Patterns can be no longer than 8K or BUFSIZ bytes, whichever is the greater. +BUFSIZ is defined in \fB\fP. When there is more than one pattern +(specified by the use of \fB-e\fP and/or \fB-f\fP), each pattern is applied to +each line in the order in which they are defined, except that all the \fB-e\fP +patterns are tried before the \fB-f\fP patterns. +.P +By default, as soon as one pattern matches a line, no further patterns are +considered. However, if \fB--colour\fP (or \fB--color\fP) is used to colour the +matching substrings, or if \fB--only-matching\fP, \fB--file-offsets\fP, or +\fB--line-offsets\fP is used to output only the part of the line that matched +(either shown literally, or as an offset), scanning resumes immediately +following the match, so that further matches on the same line can be found. If +there are multiple patterns, they are all tried on the remainder of the line, +but patterns that follow the one that matched are not tried on the earlier part +of the line. +.P +This behaviour means that the order in which multiple patterns are specified +can affect the output when one of the above options is used. This is no longer +the same behaviour as GNU grep, which now manages to display earlier matches +for later patterns (as long as there is no overlap). +.P +Patterns that can match an empty string are accepted, but empty string +matches are never recognized. An example is the pattern "(super)?(man)?", in +which all components are optional. This pattern finds all occurrences of both +"super" and "man"; the output differs from matching with "super|man" when only +the matching substrings are being shown. +.P +If the \fBLC_ALL\fP or \fBLC_CTYPE\fP environment variable is set, +\fBpcregrep\fP uses the value to set a locale when calling the PCRE library. +The \fB--locale\fP option can be used to override this. +. +. +.SH "SUPPORT FOR COMPRESSED FILES" +.rs +.sp +It is possible to compile \fBpcregrep\fP so that it uses \fBlibz\fP or +\fBlibbz2\fP to read files whose names end in \fB.gz\fP or \fB.bz2\fP, +respectively. You can find out whether your binary has support for one or both +of these file types by running it with the \fB--help\fP option. If the +appropriate support is not present, files are treated as plain text. The +standard input is always so treated. +. +. +.SH "BINARY FILES" +.rs +.sp +By default, a file that contains a binary zero byte within the first 1024 bytes +is identified as a binary file, and is processed specially. (GNU grep also +identifies binary files in this manner.) See the \fB--binary-files\fP option +for a means of changing the way binary files are handled. +. +. +.SH OPTIONS +.rs +.sp +The order in which some of the options appear can affect the output. For +example, both the \fB-h\fP and \fB-l\fP options affect the printing of file +names. Whichever comes later in the command line will be the one that takes +effect. Similarly, except where noted below, if an option is given twice, the +later setting is used. Numerical values for options may be followed by K or M, +to signify multiplication by 1024 or 1024*1024 respectively. +.TP 10 +\fB--\fP +This terminates the list of options. It is useful if the next item on the +command line starts with a hyphen but is not an option. This allows for the +processing of patterns and filenames that start with hyphens. +.TP +\fB-A\fP \fInumber\fP, \fB--after-context=\fP\fInumber\fP +Output \fInumber\fP lines of context after each matching line. If filenames +and/or line numbers are being output, a hyphen separator is used instead of a +colon for the context lines. A line containing "--" is output between each +group of lines, unless they are in fact contiguous in the input file. The value +of \fInumber\fP is expected to be relatively small. However, \fBpcregrep\fP +guarantees to have up to 8K of following text available for context output. +.TP +\fB-a\fP, \fB--text\fP +Treat binary files as text. This is equivalent to +\fB--binary-files\fP=\fItext\fP. +.TP +\fB-B\fP \fInumber\fP, \fB--before-context=\fP\fInumber\fP +Output \fInumber\fP lines of context before each matching line. If filenames +and/or line numbers are being output, a hyphen separator is used instead of a +colon for the context lines. A line containing "--" is output between each +group of lines, unless they are in fact contiguous in the input file. The value +of \fInumber\fP is expected to be relatively small. However, \fBpcregrep\fP +guarantees to have up to 8K of preceding text available for context output. +.TP +\fB--binary-files=\fP\fIword\fP +Specify how binary files are to be processed. If the word is "binary" (the +default), pattern matching is performed on binary files, but the only output is +"Binary file matches" when a match succeeds. If the word is "text", +which is equivalent to the \fB-a\fP or \fB--text\fP option, binary files are +processed in the same way as any other file. In this case, when a match +succeeds, the output may be binary garbage, which can have nasty effects if +sent to a terminal. If the word is "without-match", which is equivalent to the +\fB-I\fP option, binary files are not processed at all; they are assumed not to +be of interest. +.TP +\fB--buffer-size=\fP\fInumber\fP +Set the parameter that controls how much memory is used for buffering files +that are being scanned. +.TP +\fB-C\fP \fInumber\fP, \fB--context=\fP\fInumber\fP +Output \fInumber\fP lines of context both before and after each matching line. +This is equivalent to setting both \fB-A\fP and \fB-B\fP to the same value. +.TP +\fB-c\fP, \fB--count\fP +Do not output individual lines from the files that are being scanned; instead +output the number of lines that would otherwise have been shown. If no lines +are selected, the number zero is output. If several files are are being +scanned, a count is output for each of them. However, if the +\fB--files-with-matches\fP option is also used, only those files whose counts +are greater than zero are listed. When \fB-c\fP is used, the \fB-A\fP, +\fB-B\fP, and \fB-C\fP options are ignored. +.TP +\fB--colour\fP, \fB--color\fP +If this option is given without any data, it is equivalent to "--colour=auto". +If data is required, it must be given in the same shell item, separated by an +equals sign. +.TP +\fB--colour=\fP\fIvalue\fP, \fB--color=\fP\fIvalue\fP +This option specifies under what circumstances the parts of a line that matched +a pattern should be coloured in the output. By default, the output is not +coloured. The value (which is optional, see above) may be "never", "always", or +"auto". In the latter case, colouring happens only if the standard output is +connected to a terminal. More resources are used when colouring is enabled, +because \fBpcregrep\fP has to search for all possible matches in a line, not +just one, in order to colour them all. +.sp +The colour that is used can be specified by setting the environment variable +PCREGREP_COLOUR or PCREGREP_COLOR. The value of this variable should be a +string of two numbers, separated by a semicolon. They are copied directly into +the control string for setting colour on a terminal, so it is your +responsibility to ensure that they make sense. If neither of the environment +variables is set, the default is "1;31", which gives red. +.TP +\fB-D\fP \fIaction\fP, \fB--devices=\fP\fIaction\fP +If an input path is not a regular file or a directory, "action" specifies how +it is to be processed. Valid values are "read" (the default) or "skip" +(silently skip the path). +.TP +\fB-d\fP \fIaction\fP, \fB--directories=\fP\fIaction\fP +If an input path is a directory, "action" specifies how it is to be processed. +Valid values are "read" (the default in non-Windows environments, for +compatibility with GNU grep), "recurse" (equivalent to the \fB-r\fP option), or +"skip" (silently skip the path, the default in Windows environments). In the +"read" case, directories are read as if they were ordinary files. In some +operating systems the effect of reading a directory like this is an immediate +end-of-file; in others it may provoke an error. +.TP +\fB-e\fP \fIpattern\fP, \fB--regex=\fP\fIpattern\fP, \fB--regexp=\fP\fIpattern\fP +Specify a pattern to be matched. This option can be used multiple times in +order to specify several patterns. It can also be used as a way of specifying a +single pattern that starts with a hyphen. When \fB-e\fP is used, no argument +pattern is taken from the command line; all arguments are treated as file +names. There is no limit to the number of patterns. They are applied to each +line in the order in which they are defined until one matches. +.sp +If \fB-f\fP is used with \fB-e\fP, the command line patterns are matched first, +followed by the patterns from the file(s), independent of the order in which +these options are specified. Note that multiple use of \fB-e\fP is not the same +as a single pattern with alternatives. For example, X|Y finds the first +character in a line that is X or Y, whereas if the two patterns are given +separately, with X first, \fBpcregrep\fP finds X if it is present, even if it +follows Y in the line. It finds Y only if there is no X in the line. This +matters only if you are using \fB-o\fP or \fB--colo(u)r\fP to show the part(s) +of the line that matched. +.TP +\fB--exclude\fP=\fIpattern\fP +Files (but not directories) whose names match the pattern are skipped without +being processed. This applies to all files, whether listed on the command line, +obtained from \fB--file-list\fP, or by scanning a directory. The pattern is a +PCRE regular expression, and is matched against the final component of the file +name, not the entire path. The \fB-F\fP, \fB-w\fP, and \fB-x\fP options do not +apply to this pattern. The option may be given any number of times in order to +specify multiple patterns. If a file name matches both an \fB--include\fP +and an \fB--exclude\fP pattern, it is excluded. There is no short form for this +option. +.TP +\fB--exclude-from=\fP\fIfilename\fP +Treat each non-empty line of the file as the data for an \fB--exclude\fP +option. What constitutes a newline when reading the file is the operating +system's default. The \fB--newline\fP option has no effect on this option. This +option may be given more than once in order to specify a number of files to +read. +.TP +\fB--exclude-dir\fP=\fIpattern\fP +Directories whose names match the pattern are skipped without being processed, +whatever the setting of the \fB--recursive\fP option. This applies to all +directories, whether listed on the command line, obtained from +\fB--file-list\fP, or by scanning a parent directory. The pattern is a PCRE +regular expression, and is matched against the final component of the directory +name, not the entire path. The \fB-F\fP, \fB-w\fP, and \fB-x\fP options do not +apply to this pattern. The option may be given any number of times in order to +specify more than one pattern. If a directory matches both \fB--include-dir\fP +and \fB--exclude-dir\fP, it is excluded. There is no short form for this +option. +.TP +\fB-F\fP, \fB--fixed-strings\fP +Interpret each data-matching pattern as a list of fixed strings, separated by +newlines, instead of as a regular expression. What constitutes a newline for +this purpose is controlled by the \fB--newline\fP option. The \fB-w\fP (match +as a word) and \fB-x\fP (match whole line) options can be used with \fB-F\fP. +They apply to each of the fixed strings. A line is selected if any of the fixed +strings are found in it (subject to \fB-w\fP or \fB-x\fP, if present). This +option applies only to the patterns that are matched against the contents of +files; it does not apply to patterns specified by any of the \fB--include\fP or +\fB--exclude\fP options. +.TP +\fB-f\fP \fIfilename\fP, \fB--file=\fP\fIfilename\fP +Read patterns from the file, one per line, and match them against +each line of input. What constitutes a newline when reading the file is the +operating system's default. The \fB--newline\fP option has no effect on this +option. Trailing white space is removed from each line, and blank lines are +ignored. An empty file contains no patterns and therefore matches nothing. See +also the comments about multiple patterns versus a single pattern with +alternatives in the description of \fB-e\fP above. +.sp +If this option is given more than once, all the specified files are +read. A data line is output if any of the patterns match it. A filename can +be given as "-" to refer to the standard input. When \fB-f\fP is used, patterns +specified on the command line using \fB-e\fP may also be present; they are +tested before the file's patterns. However, no other pattern is taken from the +command line; all arguments are treated as the names of paths to be searched. +.TP +\fB--file-list\fP=\fIfilename\fP +Read a list of files and/or directories that are to be scanned from the given +file, one per line. Trailing white space is removed from each line, and blank +lines are ignored. These paths are processed before any that are listed on the +command line. The filename can be given as "-" to refer to the standard input. +If \fB--file\fP and \fB--file-list\fP are both specified as "-", patterns are +read first. This is useful only when the standard input is a terminal, from +which further lines (the list of files) can be read after an end-of-file +indication. If this option is given more than once, all the specified files are +read. +.TP +\fB--file-offsets\fP +Instead of showing lines or parts of lines that match, show each match as an +offset from the start of the file and a length, separated by a comma. In this +mode, no context is shown. That is, the \fB-A\fP, \fB-B\fP, and \fB-C\fP +options are ignored. If there is more than one match in a line, each of them is +shown separately. This option is mutually exclusive with \fB--line-offsets\fP +and \fB--only-matching\fP. +.TP +\fB-H\fP, \fB--with-filename\fP +Force the inclusion of the filename at the start of output lines when searching +a single file. By default, the filename is not shown in this case. For matching +lines, the filename is followed by a colon; for context lines, a hyphen +separator is used. If a line number is also being output, it follows the file +name. +.TP +\fB-h\fP, \fB--no-filename\fP +Suppress the output filenames when searching multiple files. By default, +filenames are shown when multiple files are searched. For matching lines, the +filename is followed by a colon; for context lines, a hyphen separator is used. +If a line number is also being output, it follows the file name. +.TP +\fB--help\fP +Output a help message, giving brief details of the command options and file +type support, and then exit. Anything else on the command line is +ignored. +.TP +\fB-I\fP +Treat binary files as never matching. This is equivalent to +\fB--binary-files\fP=\fIwithout-match\fP. +.TP +\fB-i\fP, \fB--ignore-case\fP +Ignore upper/lower case distinctions during comparisons. +.TP +\fB--include\fP=\fIpattern\fP +If any \fB--include\fP patterns are specified, the only files that are +processed are those that match one of the patterns (and do not match an +\fB--exclude\fP pattern). This option does not affect directories, but it +applies to all files, whether listed on the command line, obtained from +\fB--file-list\fP, or by scanning a directory. The pattern is a PCRE regular +expression, and is matched against the final component of the file name, not +the entire path. The \fB-F\fP, \fB-w\fP, and \fB-x\fP options do not apply to +this pattern. The option may be given any number of times. If a file name +matches both an \fB--include\fP and an \fB--exclude\fP pattern, it is excluded. +There is no short form for this option. +.TP +\fB--include-from=\fP\fIfilename\fP +Treat each non-empty line of the file as the data for an \fB--include\fP +option. What constitutes a newline for this purpose is the operating system's +default. The \fB--newline\fP option has no effect on this option. This option +may be given any number of times; all the files are read. +.TP +\fB--include-dir\fP=\fIpattern\fP +If any \fB--include-dir\fP patterns are specified, the only directories that +are processed are those that match one of the patterns (and do not match an +\fB--exclude-dir\fP pattern). This applies to all directories, whether listed +on the command line, obtained from \fB--file-list\fP, or by scanning a parent +directory. The pattern is a PCRE regular expression, and is matched against the +final component of the directory name, not the entire path. The \fB-F\fP, +\fB-w\fP, and \fB-x\fP options do not apply to this pattern. The option may be +given any number of times. If a directory matches both \fB--include-dir\fP and +\fB--exclude-dir\fP, it is excluded. There is no short form for this option. +.TP +\fB-L\fP, \fB--files-without-match\fP +Instead of outputting lines from the files, just output the names of the files +that do not contain any lines that would have been output. Each file name is +output once, on a separate line. +.TP +\fB-l\fP, \fB--files-with-matches\fP +Instead of outputting lines from the files, just output the names of the files +containing lines that would have been output. Each file name is output +once, on a separate line. Searching normally stops as soon as a matching line +is found in a file. However, if the \fB-c\fP (count) option is also used, +matching continues in order to obtain the correct count, and those files that +have at least one match are listed along with their counts. Using this option +with \fB-c\fP is a way of suppressing the listing of files with no matches. +.TP +\fB--label\fP=\fIname\fP +This option supplies a name to be used for the standard input when file names +are being output. If not supplied, "(standard input)" is used. There is no +short form for this option. +.TP +\fB--line-buffered\fP +When this option is given, input is read and processed line by line, and the +output is flushed after each write. By default, input is read in large chunks, +unless \fBpcregrep\fP can determine that it is reading from a terminal (which +is currently possible only in Unix-like environments). Output to terminal is +normally automatically flushed by the operating system. This option can be +useful when the input or output is attached to a pipe and you do not want +\fBpcregrep\fP to buffer up large amounts of data. However, its use will affect +performance, and the \fB-M\fP (multiline) option ceases to work. +.TP +\fB--line-offsets\fP +Instead of showing lines or parts of lines that match, show each match as a +line number, the offset from the start of the line, and a length. The line +number is terminated by a colon (as usual; see the \fB-n\fP option), and the +offset and length are separated by a comma. In this mode, no context is shown. +That is, the \fB-A\fP, \fB-B\fP, and \fB-C\fP options are ignored. If there is +more than one match in a line, each of them is shown separately. This option is +mutually exclusive with \fB--file-offsets\fP and \fB--only-matching\fP. +.TP +\fB--locale\fP=\fIlocale-name\fP +This option specifies a locale to be used for pattern matching. It overrides +the value in the \fBLC_ALL\fP or \fBLC_CTYPE\fP environment variables. If no +locale is specified, the PCRE library's default (usually the "C" locale) is +used. There is no short form for this option. +.TP +\fB--match-limit\fP=\fInumber\fP +Processing some regular expression patterns can require a very large amount of +memory, leading in some cases to a program crash if not enough is available. +Other patterns may take a very long time to search for all possible matching +strings. The \fBpcre_exec()\fP function that is called by \fBpcregrep\fP to do +the matching has two parameters that can limit the resources that it uses. +.sp +The \fB--match-limit\fP option provides a means of limiting resource usage +when processing patterns that are not going to match, but which have a very +large number of possibilities in their search trees. The classic example is a +pattern that uses nested unlimited repeats. Internally, PCRE uses a function +called \fBmatch()\fP which it calls repeatedly (sometimes recursively). The +limit set by \fB--match-limit\fP is imposed on the number of times this +function is called during a match, which has the effect of limiting the amount +of backtracking that can take place. +.sp +The \fB--recursion-limit\fP option is similar to \fB--match-limit\fP, but +instead of limiting the total number of times that \fBmatch()\fP is called, it +limits the depth of recursive calls, which in turn limits the amount of memory +that can be used. The recursion depth is a smaller number than the total number +of calls, because not all calls to \fBmatch()\fP are recursive. This limit is +of use only if it is set smaller than \fB--match-limit\fP. +.sp +There are no short forms for these options. The default settings are specified +when the PCRE library is compiled, with the default default being 10 million. +.TP +\fB-M\fP, \fB--multiline\fP +Allow patterns to match more than one line. When this option is given, patterns +may usefully contain literal newline characters and internal occurrences of ^ +and $ characters. The output for a successful match may consist of more than +one line, the last of which is the one in which the match ended. If the matched +string ends with a newline sequence the output ends at the end of that line. +.sp +When this option is set, the PCRE library is called in "multiline" mode. +There is a limit to the number of lines that can be matched, imposed by the way +that \fBpcregrep\fP buffers the input file as it scans it. However, +\fBpcregrep\fP ensures that at least 8K characters or the rest of the document +(whichever is the shorter) are available for forward matching, and similarly +the previous 8K characters (or all the previous characters, if fewer than 8K) +are guaranteed to be available for lookbehind assertions. This option does not +work when input is read line by line (see \fP--line-buffered\fP.) +.TP +\fB-N\fP \fInewline-type\fP, \fB--newline\fP=\fInewline-type\fP +The PCRE library supports five different conventions for indicating +the ends of lines. They are the single-character sequences CR (carriage return) +and LF (linefeed), the two-character sequence CRLF, an "anycrlf" convention, +which recognizes any of the preceding three types, and an "any" convention, in +which any Unicode line ending sequence is assumed to end a line. The Unicode +sequences are the three just mentioned, plus VT (vertical tab, U+000B), FF +(form feed, U+000C), NEL (next line, U+0085), LS (line separator, U+2028), and +PS (paragraph separator, U+2029). +.sp +When the PCRE library is built, a default line-ending sequence is specified. +This is normally the standard sequence for the operating system. Unless +otherwise specified by this option, \fBpcregrep\fP uses the library's default. +The possible values for this option are CR, LF, CRLF, ANYCRLF, or ANY. This +makes it possible to use \fBpcregrep\fP to scan files that have come from other +environments without having to modify their line endings. If the data that is +being scanned does not agree with the convention set by this option, +\fBpcregrep\fP may behave in strange ways. Note that this option does not +apply to files specified by the \fB-f\fP, \fB--exclude-from\fP, or +\fB--include-from\fP options, which are expected to use the operating system's +standard newline sequence. +.TP +\fB-n\fP, \fB--line-number\fP +Precede each output line by its line number in the file, followed by a colon +for matching lines or a hyphen for context lines. If the filename is also being +output, it precedes the line number. This option is forced if +\fB--line-offsets\fP is used. +.TP +\fB--no-jit\fP +If the PCRE library is built with support for just-in-time compiling (which +speeds up matching), \fBpcregrep\fP automatically makes use of this, unless it +was explicitly disabled at build time. This option can be used to disable the +use of JIT at run time. It is provided for testing and working round problems. +It should never be needed in normal use. +.TP +\fB-o\fP, \fB--only-matching\fP +Show only the part of the line that matched a pattern instead of the whole +line. In this mode, no context is shown. That is, the \fB-A\fP, \fB-B\fP, and +\fB-C\fP options are ignored. If there is more than one match in a line, each +of them is shown separately. If \fB-o\fP is combined with \fB-v\fP (invert the +sense of the match to find non-matching lines), no output is generated, but the +return code is set appropriately. If the matched portion of the line is empty, +nothing is output unless the file name or line number are being printed, in +which case they are shown on an otherwise empty line. This option is mutually +exclusive with \fB--file-offsets\fP and \fB--line-offsets\fP. +.TP +\fB-o\fP\fInumber\fP, \fB--only-matching\fP=\fInumber\fP +Show only the part of the line that matched the capturing parentheses of the +given number. Up to 32 capturing parentheses are supported, and -o0 is +equivalent to \fB-o\fP without a number. Because these options can be given +without an argument (see above), if an argument is present, it must be given in +the same shell item, for example, -o3 or --only-matching=2. The comments given +for the non-argument case above also apply to this case. If the specified +capturing parentheses do not exist in the pattern, or were not set in the +match, nothing is output unless the file name or line number are being printed. +.sp +If this option is given multiple times, multiple substrings are output, in the +order the options are given. For example, -o3 -o1 -o3 causes the substrings +matched by capturing parentheses 3 and 1 and then 3 again to be output. By +default, there is no separator (but see the next option). +.TP +\fB--om-separator\fP=\fItext\fP +Specify a separating string for multiple occurrences of \fB-o\fP. The default +is an empty string. Separating strings are never coloured. +.TP +\fB-q\fP, \fB--quiet\fP +Work quietly, that is, display nothing except error messages. The exit +status indicates whether or not any matches were found. +.TP +\fB-r\fP, \fB--recursive\fP +If any given path is a directory, recursively scan the files it contains, +taking note of any \fB--include\fP and \fB--exclude\fP settings. By default, a +directory is read as a normal file; in some operating systems this gives an +immediate end-of-file. This option is a shorthand for setting the \fB-d\fP +option to "recurse". +.TP +\fB--recursion-limit\fP=\fInumber\fP +See \fB--match-limit\fP above. +.TP +\fB-s\fP, \fB--no-messages\fP +Suppress error messages about non-existent or unreadable files. Such files are +quietly skipped. However, the return code is still 2, even if matches were +found in other files. +.TP +\fB-u\fP, \fB--utf-8\fP +Operate in UTF-8 mode. This option is available only if PCRE has been compiled +with UTF-8 support. All patterns (including those for any \fB--exclude\fP and +\fB--include\fP options) and all subject lines that are scanned must be valid +strings of UTF-8 characters. +.TP +\fB-V\fP, \fB--version\fP +Write the version numbers of \fBpcregrep\fP and the PCRE library to the +standard output and then exit. Anything else on the command line is +ignored. +.TP +\fB-v\fP, \fB--invert-match\fP +Invert the sense of the match, so that lines which do \fInot\fP match any of +the patterns are the ones that are found. +.TP +\fB-w\fP, \fB--word-regex\fP, \fB--word-regexp\fP +Force the patterns to match only whole words. This is equivalent to having \eb +at the start and end of the pattern. This option applies only to the patterns +that are matched against the contents of files; it does not apply to patterns +specified by any of the \fB--include\fP or \fB--exclude\fP options. +.TP +\fB-x\fP, \fB--line-regex\fP, \fB--line-regexp\fP +Force the patterns to be anchored (each must start matching at the beginning of +a line) and in addition, require them to match entire lines. This is equivalent +to having ^ and $ characters at the start and end of each alternative branch in +every pattern. This option applies only to the patterns that are matched +against the contents of files; it does not apply to patterns specified by any +of the \fB--include\fP or \fB--exclude\fP options. +. +. +.SH "ENVIRONMENT VARIABLES" +.rs +.sp +The environment variables \fBLC_ALL\fP and \fBLC_CTYPE\fP are examined, in that +order, for a locale. The first one that is set is used. This can be overridden +by the \fB--locale\fP option. If no locale is set, the PCRE library's default +(usually the "C" locale) is used. +. +. +.SH "NEWLINES" +.rs +.sp +The \fB-N\fP (\fB--newline\fP) option allows \fBpcregrep\fP to scan files with +different newline conventions from the default. Any parts of the input files +that are written to the standard output are copied identically, with whatever +newline sequences they have in the input. However, the setting of this option +does not affect the interpretation of files specified by the \fB-f\fP, +\fB--exclude-from\fP, or \fB--include-from\fP options, which are assumed to use +the operating system's standard newline sequence, nor does it affect the way in +which \fBpcregrep\fP writes informational messages to the standard error and +output streams. For these it uses the string "\en" to indicate newlines, +relying on the C I/O library to convert this to an appropriate sequence. +. +. +.SH "OPTIONS COMPATIBILITY" +.rs +.sp +Many of the short and long forms of \fBpcregrep\fP's options are the same +as in the GNU \fBgrep\fP program. Any long option of the form +\fB--xxx-regexp\fP (GNU terminology) is also available as \fB--xxx-regex\fP +(PCRE terminology). However, the \fB--file-list\fP, \fB--file-offsets\fP, +\fB--include-dir\fP, \fB--line-offsets\fP, \fB--locale\fP, \fB--match-limit\fP, +\fB-M\fP, \fB--multiline\fP, \fB-N\fP, \fB--newline\fP, \fB--om-separator\fP, +\fB--recursion-limit\fP, \fB-u\fP, and \fB--utf-8\fP options are specific to +\fBpcregrep\fP, as is the use of the \fB--only-matching\fP option with a +capturing parentheses number. +.P +Although most of the common options work the same way, a few are different in +\fBpcregrep\fP. For example, the \fB--include\fP option's argument is a glob +for GNU \fBgrep\fP, but a regular expression for \fBpcregrep\fP. If both the +\fB-c\fP and \fB-l\fP options are given, GNU grep lists only file names, +without counts, but \fBpcregrep\fP gives the counts. +. +. +.SH "OPTIONS WITH DATA" +.rs +.sp +There are four different ways in which an option with data can be specified. +If a short form option is used, the data may follow immediately, or (with one +exception) in the next command line item. For example: +.sp + -f/some/file + -f /some/file +.sp +The exception is the \fB-o\fP option, which may appear with or without data. +Because of this, if data is present, it must follow immediately in the same +item, for example -o3. +.P +If a long form option is used, the data may appear in the same command line +item, separated by an equals character, or (with two exceptions) it may appear +in the next command line item. For example: +.sp + --file=/some/file + --file /some/file +.sp +Note, however, that if you want to supply a file name beginning with ~ as data +in a shell command, and have the shell expand ~ to a home directory, you must +separate the file name from the option, because the shell does not treat ~ +specially unless it is at the start of an item. +.P +The exceptions to the above are the \fB--colour\fP (or \fB--color\fP) and +\fB--only-matching\fP options, for which the data is optional. If one of these +options does have data, it must be given in the first form, using an equals +character. Otherwise \fBpcregrep\fP will assume that it has no data. +. +. +.SH "MATCHING ERRORS" +.rs +.sp +It is possible to supply a regular expression that takes a very long time to +fail to match certain lines. Such patterns normally involve nested indefinite +repeats, for example: (a+)*\ed when matched against a line of a's with no final +digit. The PCRE matching function has a resource limit that causes it to abort +in these circumstances. If this happens, \fBpcregrep\fP outputs an error +message and the line that caused the problem to the standard error stream. If +there are more than 20 such errors, \fBpcregrep\fP gives up. +.P +The \fB--match-limit\fP option of \fBpcregrep\fP can be used to set the overall +resource limit; there is a second option called \fB--recursion-limit\fP that +sets a limit on the amount of memory (usually stack) that is used (see the +discussion of these options above). +. +. +.SH DIAGNOSTICS +.rs +.sp +Exit status is 0 if any matches were found, 1 if no matches were found, and 2 +for syntax errors, overlong lines, non-existent or inaccessible files (even if +matches were found in other files) or too many matching errors. Using the +\fB-s\fP option to suppress error messages about inaccessible files does not +affect the return code. +. +. +.SH "SEE ALSO" +.rs +.sp +\fBpcrepattern\fP(3), \fBpcresyntax\fP(3), \fBpcretest\fP(1). +. +. +.SH AUTHOR +.rs +.sp +.nf +Philip Hazel +University Computing Service +Cambridge CB2 3QH, England. +.fi +. +. +.SH REVISION +.rs +.sp +.nf +Last updated: 03 April 2014 +Copyright (c) 1997-2014 University of Cambridge. +.fi diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcregrep.txt b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcregrep.txt new file mode 100755 index 000000000..0c873c7a8 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcregrep.txt @@ -0,0 +1,741 @@ +PCREGREP(1) General Commands Manual PCREGREP(1) + + + +NAME + pcregrep - a grep with Perl-compatible regular expressions. + +SYNOPSIS + pcregrep [options] [long options] [pattern] [path1 path2 ...] + + +DESCRIPTION + + pcregrep searches files for character patterns, in the same way as + other grep commands do, but it uses the PCRE regular expression library + to support patterns that are compatible with the regular expressions of + Perl 5. See pcresyntax(3) for a quick-reference summary of pattern syn- + tax, or pcrepattern(3) for a full description of the syntax and seman- + tics of the regular expressions that PCRE supports. + + Patterns, whether supplied on the command line or in a separate file, + are given without delimiters. For example: + + pcregrep Thursday /etc/motd + + If you attempt to use delimiters (for example, by surrounding a pattern + with slashes, as is common in Perl scripts), they are interpreted as + part of the pattern. Quotes can of course be used to delimit patterns + on the command line because they are interpreted by the shell, and in- + deed quotes are required if a pattern contains white space or shell + metacharacters. + + The first argument that follows any option settings is treated as the + single pattern to be matched when neither -e nor -f is present. Con- + versely, when one or both of these options are used to specify pat- + terns, all arguments are treated as path names. At least one of -e, -f, + or an argument pattern must be provided. + + If no files are specified, pcregrep reads the standard input. The stan- + dard input can also be referenced by a name consisting of a single hy- + phen. For example: + + pcregrep some-pattern /file1 - /file3 + + By default, each line that matches a pattern is copied to the standard + output, and if there is more than one file, the file name is output at + the start of each line, followed by a colon. However, there are options + that can change how pcregrep behaves. In particular, the -M option + makes it possible to search for patterns that span line boundaries. + What defines a line boundary is controlled by the -N (--newline) op- + tion. + + The amount of memory used for buffering files that are being scanned is + controlled by a parameter that can be set by the --buffer-size option. + The default value for this parameter is specified when pcregrep is + built, with the default default being 20K. A block of memory three + times this size is used (to allow for buffering "before" and "after" + lines). An error occurs if a line overflows the buffer. + + Patterns can be no longer than 8K or BUFSIZ bytes, whichever is the + greater. BUFSIZ is defined in . When there is more than one + pattern (specified by the use of -e and/or -f), each pattern is applied + to each line in the order in which they are defined, except that all + the -e patterns are tried before the -f patterns. + + By default, as soon as one pattern matches a line, no further patterns + are considered. However, if --colour (or --color) is used to colour the + matching substrings, or if --only-matching, --file-offsets, or --line- + offsets is used to output only the part of the line that matched (ei- + ther shown literally, or as an offset), scanning resumes immediately + following the match, so that further matches on the same line can be + found. If there are multiple patterns, they are all tried on the re- + mainder of the line, but patterns that follow the one that matched are + not tried on the earlier part of the line. + + This behaviour means that the order in which multiple patterns are + specified can affect the output when one of the above options is used. + This is no longer the same behaviour as GNU grep, which now manages to + display earlier matches for later patterns (as long as there is no + overlap). + + Patterns that can match an empty string are accepted, but empty string + matches are never recognized. An example is the pattern "(su- + per)?(man)?", in which all components are optional. This pattern finds + all occurrences of both "super" and "man"; the output differs from + matching with "super|man" when only the matching substrings are being + shown. + + If the LC_ALL or LC_CTYPE environment variable is set, pcregrep uses + the value to set a locale when calling the PCRE library. The --locale + option can be used to override this. + + +SUPPORT FOR COMPRESSED FILES + + It is possible to compile pcregrep so that it uses libz or libbz2 to + read files whose names end in .gz or .bz2, respectively. You can find + out whether your binary has support for one or both of these file types + by running it with the --help option. If the appropriate support is not + present, files are treated as plain text. The standard input is always + so treated. + + +BINARY FILES + + By default, a file that contains a binary zero byte within the first + 1024 bytes is identified as a binary file, and is processed specially. + (GNU grep also identifies binary files in this manner.) See the --bi- + nary-files option for a means of changing the way binary files are han- + dled. + + +OPTIONS + + The order in which some of the options appear can affect the output. + For example, both the -h and -l options affect the printing of file + names. Whichever comes later in the command line will be the one that + takes effect. Similarly, except where noted below, if an option is + given twice, the later setting is used. Numerical values for options + may be followed by K or M, to signify multiplication by 1024 or + 1024*1024 respectively. + + -- This terminates the list of options. It is useful if the next + item on the command line starts with a hyphen but is not an + option. This allows for the processing of patterns and file- + names that start with hyphens. + + -A number, --after-context=number + Output number lines of context after each matching line. If + filenames and/or line numbers are being output, a hyphen sep- + arator is used instead of a colon for the context lines. A + line containing "--" is output between each group of lines, + unless they are in fact contiguous in the input file. The + value of number is expected to be relatively small. However, + pcregrep guarantees to have up to 8K of following text avail- + able for context output. + + -a, --text + Treat binary files as text. This is equivalent to --binary- + files=text. + + -B number, --before-context=number + Output number lines of context before each matching line. If + filenames and/or line numbers are being output, a hyphen sep- + arator is used instead of a colon for the context lines. A + line containing "--" is output between each group of lines, + unless they are in fact contiguous in the input file. The + value of number is expected to be relatively small. However, + pcregrep guarantees to have up to 8K of preceding text avail- + able for context output. + + --binary-files=word + Specify how binary files are to be processed. If the word is + "binary" (the default), pattern matching is performed on bi- + nary files, but the only output is "Binary file + matches" when a match succeeds. If the word is "text", which + is equivalent to the -a or --text option, binary files are + processed in the same way as any other file. In this case, + when a match succeeds, the output may be binary garbage, + which can have nasty effects if sent to a terminal. If the + word is "without-match", which is equivalent to the -I op- + tion, binary files are not processed at all; they are assumed + not to be of interest. + + --buffer-size=number + Set the parameter that controls how much memory is used for + buffering files that are being scanned. + + -C number, --context=number + Output number lines of context both before and after each + matching line. This is equivalent to setting both -A and -B + to the same value. + + -c, --count + Do not output individual lines from the files that are being + scanned; instead output the number of lines that would other- + wise have been shown. If no lines are selected, the number + zero is output. If several files are are being scanned, a + count is output for each of them. However, if the --files- + with-matches option is also used, only those files whose + counts are greater than zero are listed. When -c is used, the + -A, -B, and -C options are ignored. + + --colour, --color + If this option is given without any data, it is equivalent to + "--colour=auto". If data is required, it must be given in + the same shell item, separated by an equals sign. + + --colour=value, --color=value + This option specifies under what circumstances the parts of a + line that matched a pattern should be coloured in the output. + By default, the output is not coloured. The value (which is + optional, see above) may be "never", "always", or "auto". In + the latter case, colouring happens only if the standard out- + put is connected to a terminal. More resources are used when + colouring is enabled, because pcregrep has to search for all + possible matches in a line, not just one, in order to colour + them all. + + The colour that is used can be specified by setting the envi- + ronment variable PCREGREP_COLOUR or PCREGREP_COLOR. The value + of this variable should be a string of two numbers, separated + by a semicolon. They are copied directly into the control + string for setting colour on a terminal, so it is your re- + sponsibility to ensure that they make sense. If neither of + the environment variables is set, the default is "1;31", + which gives red. + + -D action, --devices=action + If an input path is not a regular file or a directory, "ac- + tion" specifies how it is to be processed. Valid values are + "read" (the default) or "skip" (silently skip the path). + + -d action, --directories=action + If an input path is a directory, "action" specifies how it is + to be processed. Valid values are "read" (the default in + non-Windows environments, for compatibility with GNU grep), + "recurse" (equivalent to the -r option), or "skip" (silently + skip the path, the default in Windows environments). In the + "read" case, directories are read as if they were ordinary + files. In some operating systems the effect of reading a di- + rectory like this is an immediate end-of-file; in others it + may provoke an error. + + -e pattern, --regex=pattern, --regexp=pattern + Specify a pattern to be matched. This option can be used mul- + tiple times in order to specify several patterns. It can also + be used as a way of specifying a single pattern that starts + with a hyphen. When -e is used, no argument pattern is taken + from the command line; all arguments are treated as file + names. There is no limit to the number of patterns. They are + applied to each line in the order in which they are defined + until one matches. + + If -f is used with -e, the command line patterns are matched + first, followed by the patterns from the file(s), independent + of the order in which these options are specified. Note that + multiple use of -e is not the same as a single pattern with + alternatives. For example, X|Y finds the first character in a + line that is X or Y, whereas if the two patterns are given + separately, with X first, pcregrep finds X if it is present, + even if it follows Y in the line. It finds Y only if there is + no X in the line. This matters only if you are using -o or + --colo(u)r to show the part(s) of the line that matched. + + --exclude=pattern + Files (but not directories) whose names match the pattern are + skipped without being processed. This applies to all files, + whether listed on the command line, obtained from --file- + list, or by scanning a directory. The pattern is a PCRE regu- + lar expression, and is matched against the final component of + the file name, not the entire path. The -F, -w, and -x op- + tions do not apply to this pattern. The option may be given + any number of times in order to specify multiple patterns. If + a file name matches both an --include and an --exclude pat- + tern, it is excluded. There is no short form for this option. + + --exclude-from=filename + Treat each non-empty line of the file as the data for an + --exclude option. What constitutes a newline when reading the + file is the operating system's default. The --newline option + has no effect on this option. This option may be given more + than once in order to specify a number of files to read. + + --exclude-dir=pattern + Directories whose names match the pattern are skipped without + being processed, whatever the setting of the --recursive op- + tion. This applies to all directories, whether listed on the + command line, obtained from --file-list, or by scanning a + parent directory. The pattern is a PCRE regular expression, + and is matched against the final component of the directory + name, not the entire path. The -F, -w, and -x options do not + apply to this pattern. The option may be given any number of + times in order to specify more than one pattern. If a direc- + tory matches both --include-dir and --exclude-dir, it is ex- + cluded. There is no short form for this option. + + -F, --fixed-strings + Interpret each data-matching pattern as a list of fixed + strings, separated by newlines, instead of as a regular ex- + pression. What constitutes a newline for this purpose is con- + trolled by the --newline option. The -w (match as a word) and + -x (match whole line) options can be used with -F. They ap- + ply to each of the fixed strings. A line is selected if any + of the fixed strings are found in it (subject to -w or -x, if + present). This option applies only to the patterns that are + matched against the contents of files; it does not apply to + patterns specified by any of the --include or --exclude op- + tions. + + -f filename, --file=filename + Read patterns from the file, one per line, and match them + against each line of input. What constitutes a newline when + reading the file is the operating system's default. The + --newline option has no effect on this option. Trailing white + space is removed from each line, and blank lines are ignored. + An empty file contains no patterns and therefore matches + nothing. See also the comments about multiple patterns versus + a single pattern with alternatives in the description of -e + above. + + If this option is given more than once, all the specified + files are read. A data line is output if any of the patterns + match it. A filename can be given as "-" to refer to the + standard input. When -f is used, patterns specified on the + command line using -e may also be present; they are tested + before the file's patterns. However, no other pattern is + taken from the command line; all arguments are treated as the + names of paths to be searched. + + --file-list=filename + Read a list of files and/or directories that are to be + scanned from the given file, one per line. Trailing white + space is removed from each line, and blank lines are ignored. + These paths are processed before any that are listed on the + command line. The filename can be given as "-" to refer to + the standard input. If --file and --file-list are both spec- + ified as "-", patterns are read first. This is useful only + when the standard input is a terminal, from which further + lines (the list of files) can be read after an end-of-file + indication. If this option is given more than once, all the + specified files are read. + + --file-offsets + Instead of showing lines or parts of lines that match, show + each match as an offset from the start of the file and a + length, separated by a comma. In this mode, no context is + shown. That is, the -A, -B, and -C options are ignored. If + there is more than one match in a line, each of them is shown + separately. This option is mutually exclusive with --line- + offsets and --only-matching. + + -H, --with-filename + Force the inclusion of the filename at the start of output + lines when searching a single file. By default, the filename + is not shown in this case. For matching lines, the filename + is followed by a colon; for context lines, a hyphen separator + is used. If a line number is also being output, it follows + the file name. + + -h, --no-filename + Suppress the output filenames when searching multiple files. + By default, filenames are shown when multiple files are + searched. For matching lines, the filename is followed by a + colon; for context lines, a hyphen separator is used. If a + line number is also being output, it follows the file name. + + --help Output a help message, giving brief details of the command + options and file type support, and then exit. Anything else + on the command line is ignored. + + -I Treat binary files as never matching. This is equivalent to + --binary-files=without-match. + + -i, --ignore-case + Ignore upper/lower case distinctions during comparisons. + + --include=pattern + If any --include patterns are specified, the only files that + are processed are those that match one of the patterns (and + do not match an --exclude pattern). This option does not af- + fect directories, but it applies to all files, whether listed + on the command line, obtained from --file-list, or by scan- + ning a directory. The pattern is a PCRE regular expression, + and is matched against the final component of the file name, + not the entire path. The -F, -w, and -x options do not apply + to this pattern. The option may be given any number of times. + If a file name matches both an --include and an --exclude + pattern, it is excluded. There is no short form for this op- + tion. + + --include-from=filename + Treat each non-empty line of the file as the data for an + --include option. What constitutes a newline for this purpose + is the operating system's default. The --newline option has + no effect on this option. This option may be given any number + of times; all the files are read. + + --include-dir=pattern + If any --include-dir patterns are specified, the only direc- + tories that are processed are those that match one of the + patterns (and do not match an --exclude-dir pattern). This + applies to all directories, whether listed on the command + line, obtained from --file-list, or by scanning a parent di- + rectory. The pattern is a PCRE regular expression, and is + matched against the final component of the directory name, + not the entire path. The -F, -w, and -x options do not apply + to this pattern. The option may be given any number of times. + If a directory matches both --include-dir and --exclude-dir, + it is excluded. There is no short form for this option. + + -L, --files-without-match + Instead of outputting lines from the files, just output the + names of the files that do not contain any lines that would + have been output. Each file name is output once, on a sepa- + rate line. + + -l, --files-with-matches + Instead of outputting lines from the files, just output the + names of the files containing lines that would have been out- + put. Each file name is output once, on a separate line. + Searching normally stops as soon as a matching line is found + in a file. However, if the -c (count) option is also used, + matching continues in order to obtain the correct count, and + those files that have at least one match are listed along + with their counts. Using this option with -c is a way of sup- + pressing the listing of files with no matches. + + --label=name + This option supplies a name to be used for the standard input + when file names are being output. If not supplied, "(standard + input)" is used. There is no short form for this option. + + --line-buffered + When this option is given, input is read and processed line + by line, and the output is flushed after each write. By de- + fault, input is read in large chunks, unless pcregrep can de- + termine that it is reading from a terminal (which is cur- + rently possible only in Unix-like environments). Output to + terminal is normally automatically flushed by the operating + system. This option can be useful when the input or output is + attached to a pipe and you do not want pcregrep to buffer up + large amounts of data. However, its use will affect perfor- + mance, and the -M (multiline) option ceases to work. + + --line-offsets + Instead of showing lines or parts of lines that match, show + each match as a line number, the offset from the start of the + line, and a length. The line number is terminated by a colon + (as usual; see the -n option), and the offset and length are + separated by a comma. In this mode, no context is shown. + That is, the -A, -B, and -C options are ignored. If there is + more than one match in a line, each of them is shown sepa- + rately. This option is mutually exclusive with --file-offsets + and --only-matching. + + --locale=locale-name + This option specifies a locale to be used for pattern match- + ing. It overrides the value in the LC_ALL or LC_CTYPE envi- + ronment variables. If no locale is specified, the PCRE li- + brary's default (usually the "C" locale) is used. There is no + short form for this option. + + --match-limit=number + Processing some regular expression patterns can require a + very large amount of memory, leading in some cases to a pro- + gram crash if not enough is available. Other patterns may + take a very long time to search for all possible matching + strings. The pcre_exec() function that is called by pcregrep + to do the matching has two parameters that can limit the re- + sources that it uses. + + The --match-limit option provides a means of limiting re- + source usage when processing patterns that are not going to + match, but which have a very large number of possibilities in + their search trees. The classic example is a pattern that + uses nested unlimited repeats. Internally, PCRE uses a func- + tion called match() which it calls repeatedly (sometimes re- + cursively). The limit set by --match-limit is imposed on the + number of times this function is called during a match, which + has the effect of limiting the amount of backtracking that + can take place. + + The --recursion-limit option is similar to --match-limit, but + instead of limiting the total number of times that match() is + called, it limits the depth of recursive calls, which in turn + limits the amount of memory that can be used. The recursion + depth is a smaller number than the total number of calls, be- + cause not all calls to match() are recursive. This limit is + of use only if it is set smaller than --match-limit. + + There are no short forms for these options. The default set- + tings are specified when the PCRE library is compiled, with + the default default being 10 million. + + -M, --multiline + Allow patterns to match more than one line. When this option + is given, patterns may usefully contain literal newline char- + acters and internal occurrences of ^ and $ characters. The + output for a successful match may consist of more than one + line, the last of which is the one in which the match ended. + If the matched string ends with a newline sequence the output + ends at the end of that line. + + When this option is set, the PCRE library is called in "mul- + tiline" mode. There is a limit to the number of lines that + can be matched, imposed by the way that pcregrep buffers the + input file as it scans it. However, pcregrep ensures that at + least 8K characters or the rest of the document (whichever is + the shorter) are available for forward matching, and simi- + larly the previous 8K characters (or all the previous charac- + ters, if fewer than 8K) are guaranteed to be available for + lookbehind assertions. This option does not work when input + is read line by line (see --line-buffered.) + + -N newline-type, --newline=newline-type + The PCRE library supports five different conventions for in- + dicating the ends of lines. They are the single-character se- + quences CR (carriage return) and LF (linefeed), the two-char- + acter sequence CRLF, an "anycrlf" convention, which recog- + nizes any of the preceding three types, and an "any" conven- + tion, in which any Unicode line ending sequence is assumed to + end a line. The Unicode sequences are the three just men- + tioned, plus VT (vertical tab, U+000B), FF (form feed, + U+000C), NEL (next line, U+0085), LS (line separator, + U+2028), and PS (paragraph separator, U+2029). + + When the PCRE library is built, a default line-ending se- + quence is specified. This is normally the standard sequence + for the operating system. Unless otherwise specified by this + option, pcregrep uses the library's default. The possible + values for this option are CR, LF, CRLF, ANYCRLF, or ANY. + This makes it possible to use pcregrep to scan files that + have come from other environments without having to modify + their line endings. If the data that is being scanned does + not agree with the convention set by this option, pcregrep + may behave in strange ways. Note that this option does not + apply to files specified by the -f, --exclude-from, or --in- + clude-from options, which are expected to use the operating + system's standard newline sequence. + + -n, --line-number + Precede each output line by its line number in the file, fol- + lowed by a colon for matching lines or a hyphen for context + lines. If the filename is also being output, it precedes the + line number. This option is forced if --line-offsets is used. + + --no-jit If the PCRE library is built with support for just-in-time + compiling (which speeds up matching), pcregrep automatically + makes use of this, unless it was explicitly disabled at build + time. This option can be used to disable the use of JIT at + run time. It is provided for testing and working round prob- + lems. It should never be needed in normal use. + + -o, --only-matching + Show only the part of the line that matched a pattern instead + of the whole line. In this mode, no context is shown. That + is, the -A, -B, and -C options are ignored. If there is more + than one match in a line, each of them is shown separately. + If -o is combined with -v (invert the sense of the match to + find non-matching lines), no output is generated, but the re- + turn code is set appropriately. If the matched portion of the + line is empty, nothing is output unless the file name or line + number are being printed, in which case they are shown on an + otherwise empty line. This option is mutually exclusive with + --file-offsets and --line-offsets. + + -onumber, --only-matching=number + Show only the part of the line that matched the capturing + parentheses of the given number. Up to 32 capturing parenthe- + ses are supported, and -o0 is equivalent to -o without a num- + ber. Because these options can be given without an argument + (see above), if an argument is present, it must be given in + the same shell item, for example, -o3 or --only-matching=2. + The comments given for the non-argument case above also apply + to this case. If the specified capturing parentheses do not + exist in the pattern, or were not set in the match, nothing + is output unless the file name or line number are being + printed. + + If this option is given multiple times, multiple substrings + are output, in the order the options are given. For example, + -o3 -o1 -o3 causes the substrings matched by capturing paren- + theses 3 and 1 and then 3 again to be output. By default, + there is no separator (but see the next option). + + --om-separator=text + Specify a separating string for multiple occurrences of -o. + The default is an empty string. Separating strings are never + coloured. + + -q, --quiet + Work quietly, that is, display nothing except error messages. + The exit status indicates whether or not any matches were + found. + + -r, --recursive + If any given path is a directory, recursively scan the files + it contains, taking note of any --include and --exclude set- + tings. By default, a directory is read as a normal file; in + some operating systems this gives an immediate end-of-file. + This option is a shorthand for setting the -d option to "re- + curse". + + --recursion-limit=number + See --match-limit above. + + -s, --no-messages + Suppress error messages about non-existent or unreadable + files. Such files are quietly skipped. However, the return + code is still 2, even if matches were found in other files. + + -u, --utf-8 + Operate in UTF-8 mode. This option is available only if PCRE + has been compiled with UTF-8 support. All patterns (including + those for any --exclude and --include options) and all sub- + ject lines that are scanned must be valid strings of UTF-8 + characters. + + -V, --version + Write the version numbers of pcregrep and the PCRE library to + the standard output and then exit. Anything else on the com- + mand line is ignored. + + -v, --invert-match + Invert the sense of the match, so that lines which do not + match any of the patterns are the ones that are found. + + -w, --word-regex, --word-regexp + Force the patterns to match only whole words. This is equiva- + lent to having \b at the start and end of the pattern. This + option applies only to the patterns that are matched against + the contents of files; it does not apply to patterns speci- + fied by any of the --include or --exclude options. + + -x, --line-regex, --line-regexp + Force the patterns to be anchored (each must start matching + at the beginning of a line) and in addition, require them to + match entire lines. This is equivalent to having ^ and $ + characters at the start and end of each alternative branch in + every pattern. This option applies only to the patterns that + are matched against the contents of files; it does not apply + to patterns specified by any of the --include or --exclude + options. + + +ENVIRONMENT VARIABLES + + The environment variables LC_ALL and LC_CTYPE are examined, in that or- + der, for a locale. The first one that is set is used. This can be over- + ridden by the --locale option. If no locale is set, the PCRE library's + default (usually the "C" locale) is used. + + +NEWLINES + + The -N (--newline) option allows pcregrep to scan files with different + newline conventions from the default. Any parts of the input files that + are written to the standard output are copied identically, with what- + ever newline sequences they have in the input. However, the setting of + this option does not affect the interpretation of files specified by + the -f, --exclude-from, or --include-from options, which are assumed to + use the operating system's standard newline sequence, nor does it af- + fect the way in which pcregrep writes informational messages to the + standard error and output streams. For these it uses the string "\n" to + indicate newlines, relying on the C I/O library to convert this to an + appropriate sequence. + + +OPTIONS COMPATIBILITY + + Many of the short and long forms of pcregrep's options are the same as + in the GNU grep program. Any long option of the form --xxx-regexp (GNU + terminology) is also available as --xxx-regex (PCRE terminology). How- + ever, the --file-list, --file-offsets, --include-dir, --line-offsets, + --locale, --match-limit, -M, --multiline, -N, --newline, --om-separa- + tor, --recursion-limit, -u, and --utf-8 options are specific to pcre- + grep, as is the use of the --only-matching option with a capturing + parentheses number. + + Although most of the common options work the same way, a few are dif- + ferent in pcregrep. For example, the --include option's argument is a + glob for GNU grep, but a regular expression for pcregrep. If both the + -c and -l options are given, GNU grep lists only file names, without + counts, but pcregrep gives the counts. + + +OPTIONS WITH DATA + + There are four different ways in which an option with data can be spec- + ified. If a short form option is used, the data may follow immedi- + ately, or (with one exception) in the next command line item. For exam- + ple: + + -f/some/file + -f /some/file + + The exception is the -o option, which may appear with or without data. + Because of this, if data is present, it must follow immediately in the + same item, for example -o3. + + If a long form option is used, the data may appear in the same command + line item, separated by an equals character, or (with two exceptions) + it may appear in the next command line item. For example: + + --file=/some/file + --file /some/file + + Note, however, that if you want to supply a file name beginning with ~ + as data in a shell command, and have the shell expand ~ to a home di- + rectory, you must separate the file name from the option, because the + shell does not treat ~ specially unless it is at the start of an item. + + The exceptions to the above are the --colour (or --color) and --only- + matching options, for which the data is optional. If one of these op- + tions does have data, it must be given in the first form, using an + equals character. Otherwise pcregrep will assume that it has no data. + + +MATCHING ERRORS + + It is possible to supply a regular expression that takes a very long + time to fail to match certain lines. Such patterns normally involve + nested indefinite repeats, for example: (a+)*\d when matched against a + line of a's with no final digit. The PCRE matching function has a re- + source limit that causes it to abort in these circumstances. If this + happens, pcregrep outputs an error message and the line that caused the + problem to the standard error stream. If there are more than 20 such + errors, pcregrep gives up. + + The --match-limit option of pcregrep can be used to set the overall re- + source limit; there is a second option called --recursion-limit that + sets a limit on the amount of memory (usually stack) that is used (see + the discussion of these options above). + + +DIAGNOSTICS + + Exit status is 0 if any matches were found, 1 if no matches were found, + and 2 for syntax errors, overlong lines, non-existent or inaccessible + files (even if matches were found in other files) or too many matching + errors. Using the -s option to suppress error messages about inaccessi- + ble files does not affect the return code. + + +SEE ALSO + + pcrepattern(3), pcresyntax(3), pcretest(1). + + +AUTHOR + + Philip Hazel + University Computing Service + Cambridge CB2 3QH, England. + + +REVISION + + Last updated: 03 April 2014 + Copyright (c) 1997-2014 University of Cambridge. diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcrejit.3 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcrejit.3 new file mode 100755 index 000000000..3b785f0f6 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcrejit.3 @@ -0,0 +1,473 @@ +.TH PCREJIT 3 "05 July 2017" "PCRE 8.41" +.SH NAME +PCRE - Perl-compatible regular expressions +.SH "PCRE JUST-IN-TIME COMPILER SUPPORT" +.rs +.sp +Just-in-time compiling is a heavyweight optimization that can greatly speed up +pattern matching. However, it comes at the cost of extra processing before the +match is performed. Therefore, it is of most benefit when the same pattern is +going to be matched many times. This does not necessarily mean many calls of a +matching function; if the pattern is not anchored, matching attempts may take +place many times at various positions in the subject, even for a single call. +Therefore, if the subject string is very long, it may still pay to use JIT for +one-off matches. +.P +JIT support applies only to the traditional Perl-compatible matching function. +It does not apply when the DFA matching function is being used. The code for +this support was written by Zoltan Herczeg. +. +. +.SH "8-BIT, 16-BIT AND 32-BIT SUPPORT" +.rs +.sp +JIT support is available for all of the 8-bit, 16-bit and 32-bit PCRE +libraries. To keep this documentation simple, only the 8-bit interface is +described in what follows. If you are using the 16-bit library, substitute the +16-bit functions and 16-bit structures (for example, \fIpcre16_jit_stack\fP +instead of \fIpcre_jit_stack\fP). If you are using the 32-bit library, +substitute the 32-bit functions and 32-bit structures (for example, +\fIpcre32_jit_stack\fP instead of \fIpcre_jit_stack\fP). +. +. +.SH "AVAILABILITY OF JIT SUPPORT" +.rs +.sp +JIT support is an optional feature of PCRE. The "configure" option --enable-jit +(or equivalent CMake option) must be set when PCRE is built if you want to use +JIT. The support is limited to the following hardware platforms: +.sp + ARM v5, v7, and Thumb2 + Intel x86 32-bit and 64-bit + MIPS 32-bit + Power PC 32-bit and 64-bit + SPARC 32-bit (experimental) +.sp +If --enable-jit is set on an unsupported platform, compilation fails. +.P +A program that is linked with PCRE 8.20 or later can tell if JIT support is +available by calling \fBpcre_config()\fP with the PCRE_CONFIG_JIT option. The +result is 1 when JIT is available, and 0 otherwise. However, a simple program +does not need to check this in order to use JIT. The normal API is implemented +in a way that falls back to the interpretive code if JIT is not available. For +programs that need the best possible performance, there is also a "fast path" +API that is JIT-specific. +.P +If your program may sometimes be linked with versions of PCRE that are older +than 8.20, but you want to use JIT when it is available, you can test the +values of PCRE_MAJOR and PCRE_MINOR, or the existence of a JIT macro such as +PCRE_CONFIG_JIT, for compile-time control of your code. Also beware that the +\fBpcre_jit_exec()\fP function was not available at all before 8.32, +and may not be available at all if PCRE isn't compiled with +--enable-jit. See the "JIT FAST PATH API" section below for details. +. +. +.SH "SIMPLE USE OF JIT" +.rs +.sp +You have to do two things to make use of the JIT support in the simplest way: +.sp + (1) Call \fBpcre_study()\fP with the PCRE_STUDY_JIT_COMPILE option for + each compiled pattern, and pass the resulting \fBpcre_extra\fP block to + \fBpcre_exec()\fP. +.sp + (2) Use \fBpcre_free_study()\fP to free the \fBpcre_extra\fP block when it is + no longer needed, instead of just freeing it yourself. This ensures that + any JIT data is also freed. +.sp +For a program that may be linked with pre-8.20 versions of PCRE, you can insert +.sp + #ifndef PCRE_STUDY_JIT_COMPILE + #define PCRE_STUDY_JIT_COMPILE 0 + #endif +.sp +so that no option is passed to \fBpcre_study()\fP, and then use something like +this to free the study data: +.sp + #ifdef PCRE_CONFIG_JIT + pcre_free_study(study_ptr); + #else + pcre_free(study_ptr); + #endif +.sp +PCRE_STUDY_JIT_COMPILE requests the JIT compiler to generate code for complete +matches. If you want to run partial matches using the PCRE_PARTIAL_HARD or +PCRE_PARTIAL_SOFT options of \fBpcre_exec()\fP, you should set one or both of +the following options in addition to, or instead of, PCRE_STUDY_JIT_COMPILE +when you call \fBpcre_study()\fP: +.sp + PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE + PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE +.sp +If using \fBpcre_jit_exec()\fP and supporting a pre-8.32 version of +PCRE, you can insert: +.sp + #if PCRE_MAJOR >= 8 && PCRE_MINOR >= 32 + pcre_jit_exec(...); + #else + pcre_exec(...) + #endif +.sp +but as described in the "JIT FAST PATH API" section below this assumes +version 8.32 and later are compiled with --enable-jit, which may +break. +.sp +The JIT compiler generates different optimized code for each of the three +modes (normal, soft partial, hard partial). When \fBpcre_exec()\fP is called, +the appropriate code is run if it is available. Otherwise, the pattern is +matched using interpretive code. +.P +In some circumstances you may need to call additional functions. These are +described in the section entitled +.\" HTML +.\" +"Controlling the JIT stack" +.\" +below. +.P +If JIT support is not available, PCRE_STUDY_JIT_COMPILE etc. are ignored, and +no JIT data is created. Otherwise, the compiled pattern is passed to the JIT +compiler, which turns it into machine code that executes much faster than the +normal interpretive code. When \fBpcre_exec()\fP is passed a \fBpcre_extra\fP +block containing a pointer to JIT code of the appropriate mode (normal or +hard/soft partial), it obeys that code instead of running the interpreter. The +result is identical, but the compiled JIT code runs much faster. +.P +There are some \fBpcre_exec()\fP options that are not supported for JIT +execution. There are also some pattern items that JIT cannot handle. Details +are given below. In both cases, execution automatically falls back to the +interpretive code. If you want to know whether JIT was actually used for a +particular match, you should arrange for a JIT callback function to be set up +as described in the section entitled +.\" HTML +.\" +"Controlling the JIT stack" +.\" +below, even if you do not need to supply a non-default JIT stack. Such a +callback function is called whenever JIT code is about to be obeyed. If the +execution options are not right for JIT execution, the callback function is not +obeyed. +.P +If the JIT compiler finds an unsupported item, no JIT data is generated. You +can find out if JIT execution is available after studying a pattern by calling +\fBpcre_fullinfo()\fP with the PCRE_INFO_JIT option. A result of 1 means that +JIT compilation was successful. A result of 0 means that JIT support is not +available, or the pattern was not studied with PCRE_STUDY_JIT_COMPILE etc., or +the JIT compiler was not able to handle the pattern. +.P +Once a pattern has been studied, with or without JIT, it can be used as many +times as you like for matching different subject strings. +. +. +.SH "UNSUPPORTED OPTIONS AND PATTERN ITEMS" +.rs +.sp +The only \fBpcre_exec()\fP options that are supported for JIT execution are +PCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK, PCRE_NO_UTF32_CHECK, PCRE_NOTBOL, +PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, PCRE_PARTIAL_HARD, and +PCRE_PARTIAL_SOFT. +.P +The only unsupported pattern items are \eC (match a single data unit) when +running in a UTF mode, and a callout immediately before an assertion condition +in a conditional group. +. +. +.SH "RETURN VALUES FROM JIT EXECUTION" +.rs +.sp +When a pattern is matched using JIT execution, the return values are the same +as those given by the interpretive \fBpcre_exec()\fP code, with the addition of +one new error code: PCRE_ERROR_JIT_STACKLIMIT. This means that the memory used +for the JIT stack was insufficient. See +.\" HTML +.\" +"Controlling the JIT stack" +.\" +below for a discussion of JIT stack usage. For compatibility with the +interpretive \fBpcre_exec()\fP code, no more than two-thirds of the +\fIovector\fP argument is used for passing back captured substrings. +.P +The error code PCRE_ERROR_MATCHLIMIT is returned by the JIT code if searching a +very large pattern tree goes on for too long, as it is in the same circumstance +when JIT is not used, but the details of exactly what is counted are not the +same. The PCRE_ERROR_RECURSIONLIMIT error code is never returned by JIT +execution. +. +. +.SH "SAVING AND RESTORING COMPILED PATTERNS" +.rs +.sp +The code that is generated by the JIT compiler is architecture-specific, and is +also position dependent. For those reasons it cannot be saved (in a file or +database) and restored later like the bytecode and other data of a compiled +pattern. Saving and restoring compiled patterns is not something many people +do. More detail about this facility is given in the +.\" HREF +\fBpcreprecompile\fP +.\" +documentation. It should be possible to run \fBpcre_study()\fP on a saved and +restored pattern, and thereby recreate the JIT data, but because JIT +compilation uses significant resources, it is probably not worth doing this; +you might as well recompile the original pattern. +. +. +.\" HTML +.SH "CONTROLLING THE JIT STACK" +.rs +.sp +When the compiled JIT code runs, it needs a block of memory to use as a stack. +By default, it uses 32K on the machine stack. However, some large or +complicated patterns need more than this. The error PCRE_ERROR_JIT_STACKLIMIT +is given when there is not enough stack. Three functions are provided for +managing blocks of memory for use as JIT stacks. There is further discussion +about the use of JIT stacks in the section entitled +.\" HTML +.\" +"JIT stack FAQ" +.\" +below. +.P +The \fBpcre_jit_stack_alloc()\fP function creates a JIT stack. Its arguments +are a starting size and a maximum size, and it returns a pointer to an opaque +structure of type \fBpcre_jit_stack\fP, or NULL if there is an error. The +\fBpcre_jit_stack_free()\fP function can be used to free a stack that is no +longer needed. (For the technically minded: the address space is allocated by +mmap or VirtualAlloc.) +.P +JIT uses far less memory for recursion than the interpretive code, +and a maximum stack size of 512K to 1M should be more than enough for any +pattern. +.P +The \fBpcre_assign_jit_stack()\fP function specifies which stack JIT code +should use. Its arguments are as follows: +.sp + pcre_extra *extra + pcre_jit_callback callback + void *data +.sp +The \fIextra\fP argument must be the result of studying a pattern with +PCRE_STUDY_JIT_COMPILE etc. There are three cases for the values of the other +two options: +.sp + (1) If \fIcallback\fP is NULL and \fIdata\fP is NULL, an internal 32K block + on the machine stack is used. +.sp + (2) If \fIcallback\fP is NULL and \fIdata\fP is not NULL, \fIdata\fP must be + a valid JIT stack, the result of calling \fBpcre_jit_stack_alloc()\fP. +.sp + (3) If \fIcallback\fP is not NULL, it must point to a function that is + called with \fIdata\fP as an argument at the start of matching, in + order to set up a JIT stack. If the return from the callback + function is NULL, the internal 32K stack is used; otherwise the + return value must be a valid JIT stack, the result of calling + \fBpcre_jit_stack_alloc()\fP. +.sp +A callback function is obeyed whenever JIT code is about to be run; it is not +obeyed when \fBpcre_exec()\fP is called with options that are incompatible for +JIT execution. A callback function can therefore be used to determine whether a +match operation was executed by JIT or by the interpreter. +.P +You may safely use the same JIT stack for more than one pattern (either by +assigning directly or by callback), as long as the patterns are all matched +sequentially in the same thread. In a multithread application, if you do not +specify a JIT stack, or if you assign or pass back NULL from a callback, that +is thread-safe, because each thread has its own machine stack. However, if you +assign or pass back a non-NULL JIT stack, this must be a different stack for +each thread so that the application is thread-safe. +.P +Strictly speaking, even more is allowed. You can assign the same non-NULL stack +to any number of patterns as long as they are not used for matching by multiple +threads at the same time. For example, you can assign the same stack to all +compiled patterns, and use a global mutex in the callback to wait until the +stack is available for use. However, this is an inefficient solution, and not +recommended. +.P +This is a suggestion for how a multithreaded program that needs to set up +non-default JIT stacks might operate: +.sp + During thread initalization + thread_local_var = pcre_jit_stack_alloc(...) +.sp + During thread exit + pcre_jit_stack_free(thread_local_var) +.sp + Use a one-line callback function + return thread_local_var +.sp +All the functions described in this section do nothing if JIT is not available, +and \fBpcre_assign_jit_stack()\fP does nothing unless the \fBextra\fP argument +is non-NULL and points to a \fBpcre_extra\fP block that is the result of a +successful study with PCRE_STUDY_JIT_COMPILE etc. +. +. +.\" HTML +.SH "JIT STACK FAQ" +.rs +.sp +(1) Why do we need JIT stacks? +.sp +PCRE (and JIT) is a recursive, depth-first engine, so it needs a stack where +the local data of the current node is pushed before checking its child nodes. +Allocating real machine stack on some platforms is difficult. For example, the +stack chain needs to be updated every time if we extend the stack on PowerPC. +Although it is possible, its updating time overhead decreases performance. So +we do the recursion in memory. +.P +(2) Why don't we simply allocate blocks of memory with \fBmalloc()\fP? +.sp +Modern operating systems have a nice feature: they can reserve an address space +instead of allocating memory. We can safely allocate memory pages inside this +address space, so the stack could grow without moving memory data (this is +important because of pointers). Thus we can allocate 1M address space, and use +only a single memory page (usually 4K) if that is enough. However, we can still +grow up to 1M anytime if needed. +.P +(3) Who "owns" a JIT stack? +.sp +The owner of the stack is the user program, not the JIT studied pattern or +anything else. The user program must ensure that if a stack is used by +\fBpcre_exec()\fP, (that is, it is assigned to the pattern currently running), +that stack must not be used by any other threads (to avoid overwriting the same +memory area). The best practice for multithreaded programs is to allocate a +stack for each thread, and return this stack through the JIT callback function. +.P +(4) When should a JIT stack be freed? +.sp +You can free a JIT stack at any time, as long as it will not be used by +\fBpcre_exec()\fP again. When you assign the stack to a pattern, only a pointer +is set. There is no reference counting or any other magic. You can free the +patterns and stacks in any order, anytime. Just \fIdo not\fP call +\fBpcre_exec()\fP with a pattern pointing to an already freed stack, as that +will cause SEGFAULT. (Also, do not free a stack currently used by +\fBpcre_exec()\fP in another thread). You can also replace the stack for a +pattern at any time. You can even free the previous stack before assigning a +replacement. +.P +(5) Should I allocate/free a stack every time before/after calling +\fBpcre_exec()\fP? +.sp +No, because this is too costly in terms of resources. However, you could +implement some clever idea which release the stack if it is not used in let's +say two minutes. The JIT callback can help to achieve this without keeping a +list of the currently JIT studied patterns. +.P +(6) OK, the stack is for long term memory allocation. But what happens if a +pattern causes stack overflow with a stack of 1M? Is that 1M kept until the +stack is freed? +.sp +Especially on embedded sytems, it might be a good idea to release memory +sometimes without freeing the stack. There is no API for this at the moment. +Probably a function call which returns with the currently allocated memory for +any stack and another which allows releasing memory (shrinking the stack) would +be a good idea if someone needs this. +.P +(7) This is too much of a headache. Isn't there any better solution for JIT +stack handling? +.sp +No, thanks to Windows. If POSIX threads were used everywhere, we could throw +out this complicated API. +. +. +.SH "EXAMPLE CODE" +.rs +.sp +This is a single-threaded example that specifies a JIT stack without using a +callback. +.sp + int rc; + int ovector[30]; + pcre *re; + pcre_extra *extra; + pcre_jit_stack *jit_stack; +.sp + re = pcre_compile(pattern, 0, &error, &erroffset, NULL); + /* Check for errors */ + extra = pcre_study(re, PCRE_STUDY_JIT_COMPILE, &error); + jit_stack = pcre_jit_stack_alloc(32*1024, 512*1024); + /* Check for error (NULL) */ + pcre_assign_jit_stack(extra, NULL, jit_stack); + rc = pcre_exec(re, extra, subject, length, 0, 0, ovector, 30); + /* Check results */ + pcre_free(re); + pcre_free_study(extra); + pcre_jit_stack_free(jit_stack); +.sp +. +. +.SH "JIT FAST PATH API" +.rs +.sp +Because the API described above falls back to interpreted execution when JIT is +not available, it is convenient for programs that are written for general use +in many environments. However, calling JIT via \fBpcre_exec()\fP does have a +performance impact. Programs that are written for use where JIT is known to be +available, and which need the best possible performance, can instead use a +"fast path" API to call JIT execution directly instead of calling +\fBpcre_exec()\fP (obviously only for patterns that have been successfully +studied by JIT). +.P +The fast path function is called \fBpcre_jit_exec()\fP, and it takes exactly +the same arguments as \fBpcre_exec()\fP, plus one additional argument that +must point to a JIT stack. The JIT stack arrangements described above do not +apply. The return values are the same as for \fBpcre_exec()\fP. +.P +When you call \fBpcre_exec()\fP, as well as testing for invalid options, a +number of other sanity checks are performed on the arguments. For example, if +the subject pointer is NULL, or its length is negative, an immediate error is +given. Also, unless PCRE_NO_UTF[8|16|32] is set, a UTF subject string is tested +for validity. In the interests of speed, these checks do not happen on the JIT +fast path, and if invalid data is passed, the result is undefined. +.P +Bypassing the sanity checks and the \fBpcre_exec()\fP wrapping can give +speedups of more than 10%. +.P +Note that the \fBpcre_jit_exec()\fP function is not available in versions of +PCRE before 8.32 (released in November 2012). If you need to support versions +that old you must either use the slower \fBpcre_exec()\fP, or switch between +the two codepaths by checking the values of PCRE_MAJOR and PCRE_MINOR. +.P +Due to an unfortunate implementation oversight, even in versions 8.32 +and later there will be no \fBpcre_jit_exec()\fP stub function defined +when PCRE is compiled with --disable-jit, which is the default, and +there's no way to detect whether PCRE was compiled with --enable-jit +via a macro. +.P +If you need to support versions older than 8.32, or versions that may +not build with --enable-jit, you must either use the slower +\fBpcre_exec()\fP, or switch between the two codepaths by checking the +values of PCRE_MAJOR and PCRE_MINOR. +.P +Switching between the two by checking the version assumes that all the +versions being targeted are built with --enable-jit. To also support +builds that may use --disable-jit either \fBpcre_exec()\fP must be +used, or a compile-time check for JIT via \fBpcre_config()\fP (which +assumes the runtime environment will be the same), or as the Git +project decided to do, simply assume that \fBpcre_jit_exec()\fP is +present in 8.32 or later unless a compile-time flag is provided, see +the "grep: un-break building with PCRE >= 8.32 without --enable-jit" +commit in git.git for an example of that. +. +. +.SH "SEE ALSO" +.rs +.sp +\fBpcreapi\fP(3) +. +. +.SH AUTHOR +.rs +.sp +.nf +Philip Hazel (FAQ by Zoltan Herczeg) +University Computing Service +Cambridge CB2 3QH, England. +.fi +. +. +.SH REVISION +.rs +.sp +.nf +Last updated: 05 July 2017 +Copyright (c) 1997-2017 University of Cambridge. +.fi diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcrelimits.3 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcrelimits.3 new file mode 100755 index 000000000..423d6a276 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcrelimits.3 @@ -0,0 +1,71 @@ +.TH PCRELIMITS 3 "05 November 2013" "PCRE 8.34" +.SH NAME +PCRE - Perl-compatible regular expressions +.SH "SIZE AND OTHER LIMITATIONS" +.rs +.sp +There are some size limitations in PCRE but it is hoped that they will never in +practice be relevant. +.P +The maximum length of a compiled pattern is approximately 64K data units (bytes +for the 8-bit library, 16-bit units for the 16-bit library, and 32-bit units for +the 32-bit library) if PCRE is compiled with the default internal linkage size, +which is 2 bytes for the 8-bit and 16-bit libraries, and 4 bytes for the 32-bit +library. If you want to process regular expressions that are truly enormous, +you can compile PCRE with an internal linkage size of 3 or 4 (when building the +16-bit or 32-bit library, 3 is rounded up to 4). See the \fBREADME\fP file in +the source distribution and the +.\" HREF +\fBpcrebuild\fP +.\" +documentation for details. In these cases the limit is substantially larger. +However, the speed of execution is slower. +.P +All values in repeating quantifiers must be less than 65536. +.P +There is no limit to the number of parenthesized subpatterns, but there can be +no more than 65535 capturing subpatterns. There is, however, a limit to the +depth of nesting of parenthesized subpatterns of all kinds. This is imposed in +order to limit the amount of system stack used at compile time. The limit can +be specified when PCRE is built; the default is 250. +.P +There is a limit to the number of forward references to subsequent subpatterns +of around 200,000. Repeated forward references with fixed upper limits, for +example, (?2){0,100} when subpattern number 2 is to the right, are included in +the count. There is no limit to the number of backward references. +.P +The maximum length of name for a named subpattern is 32 characters, and the +maximum number of named subpatterns is 10000. +.P +The maximum length of a name in a (*MARK), (*PRUNE), (*SKIP), or (*THEN) verb +is 255 for the 8-bit library and 65535 for the 16-bit and 32-bit libraries. +.P +The maximum length of a subject string is the largest positive number that an +integer variable can hold. However, when using the traditional matching +function, PCRE uses recursion to handle subpatterns and indefinite repetition. +This means that the available stack space may limit the size of a subject +string that can be processed by certain patterns. For a discussion of stack +issues, see the +.\" HREF +\fBpcrestack\fP +.\" +documentation. +. +. +.SH AUTHOR +.rs +.sp +.nf +Philip Hazel +University Computing Service +Cambridge CB2 3QH, England. +.fi +. +. +.SH REVISION +.rs +.sp +.nf +Last updated: 05 November 2013 +Copyright (c) 1997-2013 University of Cambridge. +.fi diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcrematching.3 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcrematching.3 new file mode 100755 index 000000000..268baf9b8 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcrematching.3 @@ -0,0 +1,214 @@ +.TH PCREMATCHING 3 "12 November 2013" "PCRE 8.34" +.SH NAME +PCRE - Perl-compatible regular expressions +.SH "PCRE MATCHING ALGORITHMS" +.rs +.sp +This document describes the two different algorithms that are available in PCRE +for matching a compiled regular expression against a given subject string. The +"standard" algorithm is the one provided by the \fBpcre_exec()\fP, +\fBpcre16_exec()\fP and \fBpcre32_exec()\fP functions. These work in the same +as as Perl's matching function, and provide a Perl-compatible matching operation. +The just-in-time (JIT) optimization that is described in the +.\" HREF +\fBpcrejit\fP +.\" +documentation is compatible with these functions. +.P +An alternative algorithm is provided by the \fBpcre_dfa_exec()\fP, +\fBpcre16_dfa_exec()\fP and \fBpcre32_dfa_exec()\fP functions; they operate in +a different way, and are not Perl-compatible. This alternative has advantages +and disadvantages compared with the standard algorithm, and these are described +below. +.P +When there is only one possible way in which a given subject string can match a +pattern, the two algorithms give the same answer. A difference arises, however, +when there are multiple possibilities. For example, if the pattern +.sp + ^<.*> +.sp +is matched against the string +.sp + +.sp +there are three possible answers. The standard algorithm finds only one of +them, whereas the alternative algorithm finds all three. +. +. +.SH "REGULAR EXPRESSIONS AS TREES" +.rs +.sp +The set of strings that are matched by a regular expression can be represented +as a tree structure. An unlimited repetition in the pattern makes the tree of +infinite size, but it is still a tree. Matching the pattern to a given subject +string (from a given starting point) can be thought of as a search of the tree. +There are two ways to search a tree: depth-first and breadth-first, and these +correspond to the two matching algorithms provided by PCRE. +. +. +.SH "THE STANDARD MATCHING ALGORITHM" +.rs +.sp +In the terminology of Jeffrey Friedl's book "Mastering Regular +Expressions", the standard algorithm is an "NFA algorithm". It conducts a +depth-first search of the pattern tree. That is, it proceeds along a single +path through the tree, checking that the subject matches what is required. When +there is a mismatch, the algorithm tries any alternatives at the current point, +and if they all fail, it backs up to the previous branch point in the tree, and +tries the next alternative branch at that level. This often involves backing up +(moving to the left) in the subject string as well. The order in which +repetition branches are tried is controlled by the greedy or ungreedy nature of +the quantifier. +.P +If a leaf node is reached, a matching string has been found, and at that point +the algorithm stops. Thus, if there is more than one possible match, this +algorithm returns the first one that it finds. Whether this is the shortest, +the longest, or some intermediate length depends on the way the greedy and +ungreedy repetition quantifiers are specified in the pattern. +.P +Because it ends up with a single path through the tree, it is relatively +straightforward for this algorithm to keep track of the substrings that are +matched by portions of the pattern in parentheses. This provides support for +capturing parentheses and back references. +. +. +.SH "THE ALTERNATIVE MATCHING ALGORITHM" +.rs +.sp +This algorithm conducts a breadth-first search of the tree. Starting from the +first matching point in the subject, it scans the subject string from left to +right, once, character by character, and as it does this, it remembers all the +paths through the tree that represent valid matches. In Friedl's terminology, +this is a kind of "DFA algorithm", though it is not implemented as a +traditional finite state machine (it keeps multiple states active +simultaneously). +.P +Although the general principle of this matching algorithm is that it scans the +subject string only once, without backtracking, there is one exception: when a +lookaround assertion is encountered, the characters following or preceding the +current point have to be independently inspected. +.P +The scan continues until either the end of the subject is reached, or there are +no more unterminated paths. At this point, terminated paths represent the +different matching possibilities (if there are none, the match has failed). +Thus, if there is more than one possible match, this algorithm finds all of +them, and in particular, it finds the longest. The matches are returned in +decreasing order of length. There is an option to stop the algorithm after the +first match (which is necessarily the shortest) is found. +.P +Note that all the matches that are found start at the same point in the +subject. If the pattern +.sp + cat(er(pillar)?)? +.sp +is matched against the string "the caterpillar catchment", the result will be +the three strings "caterpillar", "cater", and "cat" that start at the fifth +character of the subject. The algorithm does not automatically move on to find +matches that start at later positions. +.P +PCRE's "auto-possessification" optimization usually applies to character +repeats at the end of a pattern (as well as internally). For example, the +pattern "a\ed+" is compiled as if it were "a\ed++" because there is no point +even considering the possibility of backtracking into the repeated digits. For +DFA matching, this means that only one possible match is found. If you really +do want multiple matches in such cases, either use an ungreedy repeat +("a\ed+?") or set the PCRE_NO_AUTO_POSSESS option when compiling. +.P +There are a number of features of PCRE regular expressions that are not +supported by the alternative matching algorithm. They are as follows: +.P +1. Because the algorithm finds all possible matches, the greedy or ungreedy +nature of repetition quantifiers is not relevant. Greedy and ungreedy +quantifiers are treated in exactly the same way. However, possessive +quantifiers can make a difference when what follows could also match what is +quantified, for example in a pattern like this: +.sp + ^a++\ew! +.sp +This pattern matches "aaab!" but not "aaa!", which would be matched by a +non-possessive quantifier. Similarly, if an atomic group is present, it is +matched as if it were a standalone pattern at the current point, and the +longest match is then "locked in" for the rest of the overall pattern. +.P +2. When dealing with multiple paths through the tree simultaneously, it is not +straightforward to keep track of captured substrings for the different matching +possibilities, and PCRE's implementation of this algorithm does not attempt to +do this. This means that no captured substrings are available. +.P +3. Because no substrings are captured, back references within the pattern are +not supported, and cause errors if encountered. +.P +4. For the same reason, conditional expressions that use a backreference as the +condition or test for a specific group recursion are not supported. +.P +5. Because many paths through the tree may be active, the \eK escape sequence, +which resets the start of the match when encountered (but may be on some paths +and not on others), is not supported. It causes an error if encountered. +.P +6. Callouts are supported, but the value of the \fIcapture_top\fP field is +always 1, and the value of the \fIcapture_last\fP field is always -1. +.P +7. The \eC escape sequence, which (in the standard algorithm) always matches a +single data unit, even in UTF-8, UTF-16 or UTF-32 modes, is not supported in +these modes, because the alternative algorithm moves through the subject string +one character (not data unit) at a time, for all active paths through the tree. +.P +8. Except for (*FAIL), the backtracking control verbs such as (*PRUNE) are not +supported. (*FAIL) is supported, and behaves like a failing negative assertion. +. +. +.SH "ADVANTAGES OF THE ALTERNATIVE ALGORITHM" +.rs +.sp +Using the alternative matching algorithm provides the following advantages: +.P +1. All possible matches (at a single point in the subject) are automatically +found, and in particular, the longest match is found. To find more than one +match using the standard algorithm, you have to do kludgy things with +callouts. +.P +2. Because the alternative algorithm scans the subject string just once, and +never needs to backtrack (except for lookbehinds), it is possible to pass very +long subject strings to the matching function in several pieces, checking for +partial matching each time. Although it is possible to do multi-segment +matching using the standard algorithm by retaining partially matched +substrings, it is more complicated. The +.\" HREF +\fBpcrepartial\fP +.\" +documentation gives details of partial matching and discusses multi-segment +matching. +. +. +.SH "DISADVANTAGES OF THE ALTERNATIVE ALGORITHM" +.rs +.sp +The alternative algorithm suffers from a number of disadvantages: +.P +1. It is substantially slower than the standard algorithm. This is partly +because it has to search for all possible matches, but is also because it is +less susceptible to optimization. +.P +2. Capturing parentheses and back references are not supported. +.P +3. Although atomic groups are supported, their use does not provide the +performance advantage that it does for the standard algorithm. +. +. +.SH AUTHOR +.rs +.sp +.nf +Philip Hazel +University Computing Service +Cambridge CB2 3QH, England. +.fi +. +. +.SH REVISION +.rs +.sp +.nf +Last updated: 12 November 2013 +Copyright (c) 1997-2012 University of Cambridge. +.fi diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcrepartial.3 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcrepartial.3 new file mode 100755 index 000000000..14d0124f1 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcrepartial.3 @@ -0,0 +1,476 @@ +.TH PCREPARTIAL 3 "02 July 2013" "PCRE 8.34" +.SH NAME +PCRE - Perl-compatible regular expressions +.SH "PARTIAL MATCHING IN PCRE" +.rs +.sp +In normal use of PCRE, if the subject string that is passed to a matching +function matches as far as it goes, but is too short to match the entire +pattern, PCRE_ERROR_NOMATCH is returned. There are circumstances where it might +be helpful to distinguish this case from other cases in which there is no +match. +.P +Consider, for example, an application where a human is required to type in data +for a field with specific formatting requirements. An example might be a date +in the form \fIddmmmyy\fP, defined by this pattern: +.sp + ^\ed?\ed(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\ed\ed$ +.sp +If the application sees the user's keystrokes one by one, and can check that +what has been typed so far is potentially valid, it is able to raise an error +as soon as a mistake is made, by beeping and not reflecting the character that +has been typed, for example. This immediate feedback is likely to be a better +user interface than a check that is delayed until the entire string has been +entered. Partial matching can also be useful when the subject string is very +long and is not all available at once. +.P +PCRE supports partial matching by means of the PCRE_PARTIAL_SOFT and +PCRE_PARTIAL_HARD options, which can be set when calling any of the matching +functions. For backwards compatibility, PCRE_PARTIAL is a synonym for +PCRE_PARTIAL_SOFT. The essential difference between the two options is whether +or not a partial match is preferred to an alternative complete match, though +the details differ between the two types of matching function. If both options +are set, PCRE_PARTIAL_HARD takes precedence. +.P +If you want to use partial matching with just-in-time optimized code, you must +call \fBpcre_study()\fP, \fBpcre16_study()\fP or \fBpcre32_study()\fP with one +or both of these options: +.sp + PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE + PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE +.sp +PCRE_STUDY_JIT_COMPILE should also be set if you are going to run non-partial +matches on the same pattern. If the appropriate JIT study mode has not been set +for a match, the interpretive matching code is used. +.P +Setting a partial matching option disables two of PCRE's standard +optimizations. PCRE remembers the last literal data unit in a pattern, and +abandons matching immediately if it is not present in the subject string. This +optimization cannot be used for a subject string that might match only +partially. If the pattern was studied, PCRE knows the minimum length of a +matching string, and does not bother to run the matching function on shorter +strings. This optimization is also disabled for partial matching. +. +. +.SH "PARTIAL MATCHING USING pcre_exec() OR pcre[16|32]_exec()" +.rs +.sp +A partial match occurs during a call to \fBpcre_exec()\fP or +\fBpcre[16|32]_exec()\fP when the end of the subject string is reached +successfully, but matching cannot continue because more characters are needed. +However, at least one character in the subject must have been inspected. This +character need not form part of the final matched string; lookbehind assertions +and the \eK escape sequence provide ways of inspecting characters before the +start of a matched substring. The requirement for inspecting at least one +character exists because an empty string can always be matched; without such a +restriction there would always be a partial match of an empty string at the end +of the subject. +.P +If there are at least two slots in the offsets vector when a partial match is +returned, the first slot is set to the offset of the earliest character that +was inspected. For convenience, the second offset points to the end of the +subject so that a substring can easily be identified. If there are at least +three slots in the offsets vector, the third slot is set to the offset of the +character where matching started. +.P +For the majority of patterns, the contents of the first and third slots will be +the same. However, for patterns that contain lookbehind assertions, or begin +with \eb or \eB, characters before the one where matching started may have been +inspected while carrying out the match. For example, consider this pattern: +.sp + /(?<=abc)123/ +.sp +This pattern matches "123", but only if it is preceded by "abc". If the subject +string is "xyzabc12", the first two offsets after a partial match are for the +substring "abc12", because all these characters were inspected. However, the +third offset is set to 6, because that is the offset where matching began. +.P +What happens when a partial match is identified depends on which of the two +partial matching options are set. +. +. +.SS "PCRE_PARTIAL_SOFT WITH pcre_exec() OR pcre[16|32]_exec()" +.rs +.sp +If PCRE_PARTIAL_SOFT is set when \fBpcre_exec()\fP or \fBpcre[16|32]_exec()\fP +identifies a partial match, the partial match is remembered, but matching +continues as normal, and other alternatives in the pattern are tried. If no +complete match can be found, PCRE_ERROR_PARTIAL is returned instead of +PCRE_ERROR_NOMATCH. +.P +This option is "soft" because it prefers a complete match over a partial match. +All the various matching items in a pattern behave as if the subject string is +potentially complete. For example, \ez, \eZ, and $ match at the end of the +subject, as normal, and for \eb and \eB the end of the subject is treated as a +non-alphanumeric. +.P +If there is more than one partial match, the first one that was found provides +the data that is returned. Consider this pattern: +.sp + /123\ew+X|dogY/ +.sp +If this is matched against the subject string "abc123dog", both +alternatives fail to match, but the end of the subject is reached during +matching, so PCRE_ERROR_PARTIAL is returned. The offsets are set to 3 and 9, +identifying "123dog" as the first partial match that was found. (In this +example, there are two partial matches, because "dog" on its own partially +matches the second alternative.) +. +. +.SS "PCRE_PARTIAL_HARD WITH pcre_exec() OR pcre[16|32]_exec()" +.rs +.sp +If PCRE_PARTIAL_HARD is set for \fBpcre_exec()\fP or \fBpcre[16|32]_exec()\fP, +PCRE_ERROR_PARTIAL is returned as soon as a partial match is found, without +continuing to search for possible complete matches. This option is "hard" +because it prefers an earlier partial match over a later complete match. For +this reason, the assumption is made that the end of the supplied subject string +may not be the true end of the available data, and so, if \ez, \eZ, \eb, \eB, +or $ are encountered at the end of the subject, the result is +PCRE_ERROR_PARTIAL, provided that at least one character in the subject has +been inspected. +.P +Setting PCRE_PARTIAL_HARD also affects the way UTF-8 and UTF-16 +subject strings are checked for validity. Normally, an invalid sequence +causes the error PCRE_ERROR_BADUTF8 or PCRE_ERROR_BADUTF16. However, in the +special case of a truncated character at the end of the subject, +PCRE_ERROR_SHORTUTF8 or PCRE_ERROR_SHORTUTF16 is returned when +PCRE_PARTIAL_HARD is set. +. +. +.SS "Comparing hard and soft partial matching" +.rs +.sp +The difference between the two partial matching options can be illustrated by a +pattern such as: +.sp + /dog(sbody)?/ +.sp +This matches either "dog" or "dogsbody", greedily (that is, it prefers the +longer string if possible). If it is matched against the string "dog" with +PCRE_PARTIAL_SOFT, it yields a complete match for "dog". However, if +PCRE_PARTIAL_HARD is set, the result is PCRE_ERROR_PARTIAL. On the other hand, +if the pattern is made ungreedy the result is different: +.sp + /dog(sbody)??/ +.sp +In this case the result is always a complete match because that is found first, +and matching never continues after finding a complete match. It might be easier +to follow this explanation by thinking of the two patterns like this: +.sp + /dog(sbody)?/ is the same as /dogsbody|dog/ + /dog(sbody)??/ is the same as /dog|dogsbody/ +.sp +The second pattern will never match "dogsbody", because it will always find the +shorter match first. +. +. +.SH "PARTIAL MATCHING USING pcre_dfa_exec() OR pcre[16|32]_dfa_exec()" +.rs +.sp +The DFA functions move along the subject string character by character, without +backtracking, searching for all possible matches simultaneously. If the end of +the subject is reached before the end of the pattern, there is the possibility +of a partial match, again provided that at least one character has been +inspected. +.P +When PCRE_PARTIAL_SOFT is set, PCRE_ERROR_PARTIAL is returned only if there +have been no complete matches. Otherwise, the complete matches are returned. +However, if PCRE_PARTIAL_HARD is set, a partial match takes precedence over any +complete matches. The portion of the string that was inspected when the longest +partial match was found is set as the first matching string, provided there are +at least two slots in the offsets vector. +.P +Because the DFA functions always search for all possible matches, and there is +no difference between greedy and ungreedy repetition, their behaviour is +different from the standard functions when PCRE_PARTIAL_HARD is set. Consider +the string "dog" matched against the ungreedy pattern shown above: +.sp + /dog(sbody)??/ +.sp +Whereas the standard functions stop as soon as they find the complete match for +"dog", the DFA functions also find the partial match for "dogsbody", and so +return that when PCRE_PARTIAL_HARD is set. +. +. +.SH "PARTIAL MATCHING AND WORD BOUNDARIES" +.rs +.sp +If a pattern ends with one of sequences \eb or \eB, which test for word +boundaries, partial matching with PCRE_PARTIAL_SOFT can give counter-intuitive +results. Consider this pattern: +.sp + /\ebcat\eb/ +.sp +This matches "cat", provided there is a word boundary at either end. If the +subject string is "the cat", the comparison of the final "t" with a following +character cannot take place, so a partial match is found. However, normal +matching carries on, and \eb matches at the end of the subject when the last +character is a letter, so a complete match is found. The result, therefore, is +\fInot\fP PCRE_ERROR_PARTIAL. Using PCRE_PARTIAL_HARD in this case does yield +PCRE_ERROR_PARTIAL, because then the partial match takes precedence. +. +. +.SH "FORMERLY RESTRICTED PATTERNS" +.rs +.sp +For releases of PCRE prior to 8.00, because of the way certain internal +optimizations were implemented in the \fBpcre_exec()\fP function, the +PCRE_PARTIAL option (predecessor of PCRE_PARTIAL_SOFT) could not be used with +all patterns. From release 8.00 onwards, the restrictions no longer apply, and +partial matching with can be requested for any pattern. +.P +Items that were formerly restricted were repeated single characters and +repeated metasequences. If PCRE_PARTIAL was set for a pattern that did not +conform to the restrictions, \fBpcre_exec()\fP returned the error code +PCRE_ERROR_BADPARTIAL (-13). This error code is no longer in use. The +PCRE_INFO_OKPARTIAL call to \fBpcre_fullinfo()\fP to find out if a compiled +pattern can be used for partial matching now always returns 1. +. +. +.SH "EXAMPLE OF PARTIAL MATCHING USING PCRETEST" +.rs +.sp +If the escape sequence \eP is present in a \fBpcretest\fP data line, the +PCRE_PARTIAL_SOFT option is used for the match. Here is a run of \fBpcretest\fP +that uses the date example quoted above: +.sp + re> /^\ed?\ed(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\ed\ed$/ + data> 25jun04\eP + 0: 25jun04 + 1: jun + data> 25dec3\eP + Partial match: 23dec3 + data> 3ju\eP + Partial match: 3ju + data> 3juj\eP + No match + data> j\eP + No match +.sp +The first data string is matched completely, so \fBpcretest\fP shows the +matched substrings. The remaining four strings do not match the complete +pattern, but the first two are partial matches. Similar output is obtained +if DFA matching is used. +.P +If the escape sequence \eP is present more than once in a \fBpcretest\fP data +line, the PCRE_PARTIAL_HARD option is set for the match. +. +. +.SH "MULTI-SEGMENT MATCHING WITH pcre_dfa_exec() OR pcre[16|32]_dfa_exec()" +.rs +.sp +When a partial match has been found using a DFA matching function, it is +possible to continue the match by providing additional subject data and calling +the function again with the same compiled regular expression, this time setting +the PCRE_DFA_RESTART option. You must pass the same working space as before, +because this is where details of the previous partial match are stored. Here is +an example using \fBpcretest\fP, using the \eR escape sequence to set the +PCRE_DFA_RESTART option (\eD specifies the use of the DFA matching function): +.sp + re> /^\ed?\ed(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\ed\ed$/ + data> 23ja\eP\eD + Partial match: 23ja + data> n05\eR\eD + 0: n05 +.sp +The first call has "23ja" as the subject, and requests partial matching; the +second call has "n05" as the subject for the continued (restarted) match. +Notice that when the match is complete, only the last part is shown; PCRE does +not retain the previously partially-matched string. It is up to the calling +program to do that if it needs to. +.P +That means that, for an unanchored pattern, if a continued match fails, it is +not possible to try again at a new starting point. All this facility is capable +of doing is continuing with the previous match attempt. In the previous +example, if the second set of data is "ug23" the result is no match, even +though there would be a match for "aug23" if the entire string were given at +once. Depending on the application, this may or may not be what you want. +The only way to allow for starting again at the next character is to retain the +matched part of the subject and try a new complete match. +.P +You can set the PCRE_PARTIAL_SOFT or PCRE_PARTIAL_HARD options with +PCRE_DFA_RESTART to continue partial matching over multiple segments. This +facility can be used to pass very long subject strings to the DFA matching +functions. +. +. +.SH "MULTI-SEGMENT MATCHING WITH pcre_exec() OR pcre[16|32]_exec()" +.rs +.sp +From release 8.00, the standard matching functions can also be used to do +multi-segment matching. Unlike the DFA functions, it is not possible to +restart the previous match with a new segment of data. Instead, new data must +be added to the previous subject string, and the entire match re-run, starting +from the point where the partial match occurred. Earlier data can be discarded. +.P +It is best to use PCRE_PARTIAL_HARD in this situation, because it does not +treat the end of a segment as the end of the subject when matching \ez, \eZ, +\eb, \eB, and $. Consider an unanchored pattern that matches dates: +.sp + re> /\ed?\ed(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\ed\ed/ + data> The date is 23ja\eP\eP + Partial match: 23ja +.sp +At this stage, an application could discard the text preceding "23ja", add on +text from the next segment, and call the matching function again. Unlike the +DFA matching functions, the entire matching string must always be available, +and the complete matching process occurs for each call, so more memory and more +processing time is needed. +.P +\fBNote:\fP If the pattern contains lookbehind assertions, or \eK, or starts +with \eb or \eB, the string that is returned for a partial match includes +characters that precede the start of what would be returned for a complete +match, because it contains all the characters that were inspected during the +partial match. +. +. +.SH "ISSUES WITH MULTI-SEGMENT MATCHING" +.rs +.sp +Certain types of pattern may give problems with multi-segment matching, +whichever matching function is used. +.P +1. If the pattern contains a test for the beginning of a line, you need to pass +the PCRE_NOTBOL option when the subject string for any call does start at the +beginning of a line. There is also a PCRE_NOTEOL option, but in practice when +doing multi-segment matching you should be using PCRE_PARTIAL_HARD, which +includes the effect of PCRE_NOTEOL. +.P +2. Lookbehind assertions that have already been obeyed are catered for in the +offsets that are returned for a partial match. However a lookbehind assertion +later in the pattern could require even earlier characters to be inspected. You +can handle this case by using the PCRE_INFO_MAXLOOKBEHIND option of the +\fBpcre_fullinfo()\fP or \fBpcre[16|32]_fullinfo()\fP functions to obtain the +length of the longest lookbehind in the pattern. This length is given in +characters, not bytes. If you always retain at least that many characters +before the partially matched string, all should be well. (Of course, near the +start of the subject, fewer characters may be present; in that case all +characters should be retained.) +.P +From release 8.33, there is a more accurate way of deciding which characters to +retain. Instead of subtracting the length of the longest lookbehind from the +earliest inspected character (\fIoffsets[0]\fP), the match start position +(\fIoffsets[2]\fP) should be used, and the next match attempt started at the +\fIoffsets[2]\fP character by setting the \fIstartoffset\fP argument of +\fBpcre_exec()\fP or \fBpcre_dfa_exec()\fP. +.P +For example, if the pattern "(?<=123)abc" is partially +matched against the string "xx123a", the three offset values returned are 2, 6, +and 5. This indicates that the matching process that gave a partial match +started at offset 5, but the characters "123a" were all inspected. The maximum +lookbehind for that pattern is 3, so taking that away from 5 shows that we need +only keep "123a", and the next match attempt can be started at offset 3 (that +is, at "a") when further characters have been added. When the match start is +not the earliest inspected character, \fBpcretest\fP shows it explicitly: +.sp + re> "(?<=123)abc" + data> xx123a\eP\eP + Partial match at offset 5: 123a +.P +3. Because a partial match must always contain at least one character, what +might be considered a partial match of an empty string actually gives a "no +match" result. For example: +.sp + re> /c(?<=abc)x/ + data> ab\eP + No match +.sp +If the next segment begins "cx", a match should be found, but this will only +happen if characters from the previous segment are retained. For this reason, a +"no match" result should be interpreted as "partial match of an empty string" +when the pattern contains lookbehinds. +.P +4. Matching a subject string that is split into multiple segments may not +always produce exactly the same result as matching over one single long string, +especially when PCRE_PARTIAL_SOFT is used. The section "Partial Matching and +Word Boundaries" above describes an issue that arises if the pattern ends with +\eb or \eB. Another kind of difference may occur when there are multiple +matching possibilities, because (for PCRE_PARTIAL_SOFT) a partial match result +is given only when there are no completed matches. This means that as soon as +the shortest match has been found, continuation to a new subject segment is no +longer possible. Consider again this \fBpcretest\fP example: +.sp + re> /dog(sbody)?/ + data> dogsb\eP + 0: dog + data> do\eP\eD + Partial match: do + data> gsb\eR\eP\eD + 0: g + data> dogsbody\eD + 0: dogsbody + 1: dog +.sp +The first data line passes the string "dogsb" to a standard matching function, +setting the PCRE_PARTIAL_SOFT option. Although the string is a partial match +for "dogsbody", the result is not PCRE_ERROR_PARTIAL, because the shorter +string "dog" is a complete match. Similarly, when the subject is presented to +a DFA matching function in several parts ("do" and "gsb" being the first two) +the match stops when "dog" has been found, and it is not possible to continue. +On the other hand, if "dogsbody" is presented as a single string, a DFA +matching function finds both matches. +.P +Because of these problems, it is best to use PCRE_PARTIAL_HARD when matching +multi-segment data. The example above then behaves differently: +.sp + re> /dog(sbody)?/ + data> dogsb\eP\eP + Partial match: dogsb + data> do\eP\eD + Partial match: do + data> gsb\eR\eP\eP\eD + Partial match: gsb +.sp +5. Patterns that contain alternatives at the top level which do not all start +with the same pattern item may not work as expected when PCRE_DFA_RESTART is +used. For example, consider this pattern: +.sp + 1234|3789 +.sp +If the first part of the subject is "ABC123", a partial match of the first +alternative is found at offset 3. There is no partial match for the second +alternative, because such a match does not start at the same point in the +subject string. Attempting to continue with the string "7890" does not yield a +match because only those alternatives that match at one point in the subject +are remembered. The problem arises because the start of the second alternative +matches within the first alternative. There is no problem with anchored +patterns or patterns such as: +.sp + 1234|ABCD +.sp +where no string can be a partial match for both alternatives. This is not a +problem if a standard matching function is used, because the entire match has +to be rerun each time: +.sp + re> /1234|3789/ + data> ABC123\eP\eP + Partial match: 123 + data> 1237890 + 0: 3789 +.sp +Of course, instead of using PCRE_DFA_RESTART, the same technique of re-running +the entire match can also be used with the DFA matching functions. Another +possibility is to work with two buffers. If a partial match at offset \fIn\fP +in the first buffer is followed by "no match" when PCRE_DFA_RESTART is used on +the second buffer, you can then try a new match starting at offset \fIn+1\fP in +the first buffer. +. +. +.SH AUTHOR +.rs +.sp +.nf +Philip Hazel +University Computing Service +Cambridge CB2 3QH, England. +.fi +. +. +.SH REVISION +.rs +.sp +.nf +Last updated: 02 July 2013 +Copyright (c) 1997-2013 University of Cambridge. +.fi diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcrepattern.3 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcrepattern.3 new file mode 100755 index 000000000..97df217fd --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcrepattern.3 @@ -0,0 +1,3304 @@ +.TH PCREPATTERN 3 "23 October 2016" "PCRE 8.40" +.SH NAME +PCRE - Perl-compatible regular expressions +.SH "PCRE REGULAR EXPRESSION DETAILS" +.rs +.sp +The syntax and semantics of the regular expressions that are supported by PCRE +are described in detail below. There is a quick-reference syntax summary in the +.\" HREF +\fBpcresyntax\fP +.\" +page. PCRE tries to match Perl syntax and semantics as closely as it can. PCRE +also supports some alternative regular expression syntax (which does not +conflict with the Perl syntax) in order to provide some compatibility with +regular expressions in Python, .NET, and Oniguruma. +.P +Perl's regular expressions are described in its own documentation, and +regular expressions in general are covered in a number of books, some of which +have copious examples. Jeffrey Friedl's "Mastering Regular Expressions", +published by O'Reilly, covers regular expressions in great detail. This +description of PCRE's regular expressions is intended as reference material. +.P +This document discusses the patterns that are supported by PCRE when one its +main matching functions, \fBpcre_exec()\fP (8-bit) or \fBpcre[16|32]_exec()\fP +(16- or 32-bit), is used. PCRE also has alternative matching functions, +\fBpcre_dfa_exec()\fP and \fBpcre[16|32_dfa_exec()\fP, which match using a +different algorithm that is not Perl-compatible. Some of the features discussed +below are not available when DFA matching is used. The advantages and +disadvantages of the alternative functions, and how they differ from the normal +functions, are discussed in the +.\" HREF +\fBpcrematching\fP +.\" +page. +. +. +.SH "SPECIAL START-OF-PATTERN ITEMS" +.rs +.sp +A number of options that can be passed to \fBpcre_compile()\fP can also be set +by special items at the start of a pattern. These are not Perl-compatible, but +are provided to make these options accessible to pattern writers who are not +able to change the program that processes the pattern. Any number of these +items may appear, but they must all be together right at the start of the +pattern string, and the letters must be in upper case. +. +. +.SS "UTF support" +.rs +.sp +The original operation of PCRE was on strings of one-byte characters. However, +there is now also support for UTF-8 strings in the original library, an +extra library that supports 16-bit and UTF-16 character strings, and a +third library that supports 32-bit and UTF-32 character strings. To use these +features, PCRE must be built to include appropriate support. When using UTF +strings you must either call the compiling function with the PCRE_UTF8, +PCRE_UTF16, or PCRE_UTF32 option, or the pattern must start with one of +these special sequences: +.sp + (*UTF8) + (*UTF16) + (*UTF32) + (*UTF) +.sp +(*UTF) is a generic sequence that can be used with any of the libraries. +Starting a pattern with such a sequence is equivalent to setting the relevant +option. How setting a UTF mode affects pattern matching is mentioned in several +places below. There is also a summary of features in the +.\" HREF +\fBpcreunicode\fP +.\" +page. +.P +Some applications that allow their users to supply patterns may wish to +restrict them to non-UTF data for security reasons. If the PCRE_NEVER_UTF +option is set at compile time, (*UTF) etc. are not allowed, and their +appearance causes an error. +. +. +.SS "Unicode property support" +.rs +.sp +Another special sequence that may appear at the start of a pattern is (*UCP). +This has the same effect as setting the PCRE_UCP option: it causes sequences +such as \ed and \ew to use Unicode properties to determine character types, +instead of recognizing only characters with codes less than 128 via a lookup +table. +. +. +.SS "Disabling auto-possessification" +.rs +.sp +If a pattern starts with (*NO_AUTO_POSSESS), it has the same effect as setting +the PCRE_NO_AUTO_POSSESS option at compile time. This stops PCRE from making +quantifiers possessive when what follows cannot match the repeated item. For +example, by default a+b is treated as a++b. For more details, see the +.\" HREF +\fBpcreapi\fP +.\" +documentation. +. +. +.SS "Disabling start-up optimizations" +.rs +.sp +If a pattern starts with (*NO_START_OPT), it has the same effect as setting the +PCRE_NO_START_OPTIMIZE option either at compile or matching time. This disables +several optimizations for quickly reaching "no match" results. For more +details, see the +.\" HREF +\fBpcreapi\fP +.\" +documentation. +. +. +.\" HTML +.SS "Newline conventions" +.rs +.sp +PCRE supports five different conventions for indicating line breaks in +strings: a single CR (carriage return) character, a single LF (linefeed) +character, the two-character sequence CRLF, any of the three preceding, or any +Unicode newline sequence. The +.\" HREF +\fBpcreapi\fP +.\" +page has +.\" HTML +.\" +further discussion +.\" +about newlines, and shows how to set the newline convention in the +\fIoptions\fP arguments for the compiling and matching functions. +.P +It is also possible to specify a newline convention by starting a pattern +string with one of the following five sequences: +.sp + (*CR) carriage return + (*LF) linefeed + (*CRLF) carriage return, followed by linefeed + (*ANYCRLF) any of the three above + (*ANY) all Unicode newline sequences +.sp +These override the default and the options given to the compiling function. For +example, on a Unix system where LF is the default newline sequence, the pattern +.sp + (*CR)a.b +.sp +changes the convention to CR. That pattern matches "a\enb" because LF is no +longer a newline. If more than one of these settings is present, the last one +is used. +.P +The newline convention affects where the circumflex and dollar assertions are +true. It also affects the interpretation of the dot metacharacter when +PCRE_DOTALL is not set, and the behaviour of \eN. However, it does not affect +what the \eR escape sequence matches. By default, this is any Unicode newline +sequence, for Perl compatibility. However, this can be changed; see the +description of \eR in the section entitled +.\" HTML +.\" +"Newline sequences" +.\" +below. A change of \eR setting can be combined with a change of newline +convention. +. +. +.SS "Setting match and recursion limits" +.rs +.sp +The caller of \fBpcre_exec()\fP can set a limit on the number of times the +internal \fBmatch()\fP function is called and on the maximum depth of +recursive calls. These facilities are provided to catch runaway matches that +are provoked by patterns with huge matching trees (a typical example is a +pattern with nested unlimited repeats) and to avoid running out of system stack +by too much recursion. When one of these limits is reached, \fBpcre_exec()\fP +gives an error return. The limits can also be set by items at the start of the +pattern of the form +.sp + (*LIMIT_MATCH=d) + (*LIMIT_RECURSION=d) +.sp +where d is any number of decimal digits. However, the value of the setting must +be less than the value set (or defaulted) by the caller of \fBpcre_exec()\fP +for it to have any effect. In other words, the pattern writer can lower the +limits set by the programmer, but not raise them. If there is more than one +setting of one of these limits, the lower value is used. +. +. +.SH "EBCDIC CHARACTER CODES" +.rs +.sp +PCRE can be compiled to run in an environment that uses EBCDIC as its character +code rather than ASCII or Unicode (typically a mainframe system). In the +sections below, character code values are ASCII or Unicode; in an EBCDIC +environment these characters may have different code values, and there are no +code points greater than 255. +. +. +.SH "CHARACTERS AND METACHARACTERS" +.rs +.sp +A regular expression is a pattern that is matched against a subject string from +left to right. Most characters stand for themselves in a pattern, and match the +corresponding characters in the subject. As a trivial example, the pattern +.sp + The quick brown fox +.sp +matches a portion of a subject string that is identical to itself. When +caseless matching is specified (the PCRE_CASELESS option), letters are matched +independently of case. In a UTF mode, PCRE always understands the concept of +case for characters whose values are less than 128, so caseless matching is +always possible. For characters with higher values, the concept of case is +supported if PCRE is compiled with Unicode property support, but not otherwise. +If you want to use caseless matching for characters 128 and above, you must +ensure that PCRE is compiled with Unicode property support as well as with +UTF support. +.P +The power of regular expressions comes from the ability to include alternatives +and repetitions in the pattern. These are encoded in the pattern by the use of +\fImetacharacters\fP, which do not stand for themselves but instead are +interpreted in some special way. +.P +There are two different sets of metacharacters: those that are recognized +anywhere in the pattern except within square brackets, and those that are +recognized within square brackets. Outside square brackets, the metacharacters +are as follows: +.sp + \e general escape character with several uses + ^ assert start of string (or line, in multiline mode) + $ assert end of string (or line, in multiline mode) + . match any character except newline (by default) + [ start character class definition + | start of alternative branch + ( start subpattern + ) end subpattern + ? extends the meaning of ( + also 0 or 1 quantifier + also quantifier minimizer + * 0 or more quantifier + + 1 or more quantifier + also "possessive quantifier" + { start min/max quantifier +.sp +Part of a pattern that is in square brackets is called a "character class". In +a character class the only metacharacters are: +.sp + \e general escape character + ^ negate the class, but only if the first character + - indicates character range +.\" JOIN + [ POSIX character class (only if followed by POSIX + syntax) + ] terminates the character class +.sp +The following sections describe the use of each of the metacharacters. +. +. +.SH BACKSLASH +.rs +.sp +The backslash character has several uses. Firstly, if it is followed by a +character that is not a number or a letter, it takes away any special meaning +that character may have. This use of backslash as an escape character applies +both inside and outside character classes. +.P +For example, if you want to match a * character, you write \e* in the pattern. +This escaping action applies whether or not the following character would +otherwise be interpreted as a metacharacter, so it is always safe to precede a +non-alphanumeric with backslash to specify that it stands for itself. In +particular, if you want to match a backslash, you write \e\e. +.P +In a UTF mode, only ASCII numbers and letters have any special meaning after a +backslash. All other characters (in particular, those whose codepoints are +greater than 127) are treated as literals. +.P +If a pattern is compiled with the PCRE_EXTENDED option, most white space in the +pattern (other than in a character class), and characters between a # outside a +character class and the next newline, inclusive, are ignored. An escaping +backslash can be used to include a white space or # character as part of the +pattern. +.P +If you want to remove the special meaning from a sequence of characters, you +can do so by putting them between \eQ and \eE. This is different from Perl in +that $ and @ are handled as literals in \eQ...\eE sequences in PCRE, whereas in +Perl, $ and @ cause variable interpolation. Note the following examples: +.sp + Pattern PCRE matches Perl matches +.sp +.\" JOIN + \eQabc$xyz\eE abc$xyz abc followed by the + contents of $xyz + \eQabc\e$xyz\eE abc\e$xyz abc\e$xyz + \eQabc\eE\e$\eQxyz\eE abc$xyz abc$xyz +.sp +The \eQ...\eE sequence is recognized both inside and outside character classes. +An isolated \eE that is not preceded by \eQ is ignored. If \eQ is not followed +by \eE later in the pattern, the literal interpretation continues to the end of +the pattern (that is, \eE is assumed at the end). If the isolated \eQ is inside +a character class, this causes an error, because the character class is not +terminated. +. +. +.\" HTML +.SS "Non-printing characters" +.rs +.sp +A second use of backslash provides a way of encoding non-printing characters +in patterns in a visible manner. There is no restriction on the appearance of +non-printing characters, apart from the binary zero that terminates a pattern, +but when a pattern is being prepared by text editing, it is often easier to use +one of the following escape sequences than the binary character it represents. +In an ASCII or Unicode environment, these escapes are as follows: +.sp + \ea alarm, that is, the BEL character (hex 07) + \ecx "control-x", where x is any ASCII character + \ee escape (hex 1B) + \ef form feed (hex 0C) + \en linefeed (hex 0A) + \er carriage return (hex 0D) + \et tab (hex 09) + \e0dd character with octal code 0dd + \eddd character with octal code ddd, or back reference + \eo{ddd..} character with octal code ddd.. + \exhh character with hex code hh + \ex{hhh..} character with hex code hhh.. (non-JavaScript mode) + \euhhhh character with hex code hhhh (JavaScript mode only) +.sp +The precise effect of \ecx on ASCII characters is as follows: if x is a lower +case letter, it is converted to upper case. Then bit 6 of the character (hex +40) is inverted. Thus \ecA to \ecZ become hex 01 to hex 1A (A is 41, Z is 5A), +but \ec{ becomes hex 3B ({ is 7B), and \ec; becomes hex 7B (; is 3B). If the +data item (byte or 16-bit value) following \ec has a value greater than 127, a +compile-time error occurs. This locks out non-ASCII characters in all modes. +.P +When PCRE is compiled in EBCDIC mode, \ea, \ee, \ef, \en, \er, and \et +generate the appropriate EBCDIC code values. The \ec escape is processed +as specified for Perl in the \fBperlebcdic\fP document. The only characters +that are allowed after \ec are A-Z, a-z, or one of @, [, \e, ], ^, _, or ?. Any +other character provokes a compile-time error. The sequence \ec@ encodes +character code 0; after \ec the letters (in either case) encode characters 1-26 +(hex 01 to hex 1A); [, \e, ], ^, and _ encode characters 27-31 (hex 1B to hex +1F), and \ec? becomes either 255 (hex FF) or 95 (hex 5F). +.P +Thus, apart from \ec?, these escapes generate the same character code values as +they do in an ASCII environment, though the meanings of the values mostly +differ. For example, \ecG always generates code value 7, which is BEL in ASCII +but DEL in EBCDIC. +.P +The sequence \ec? generates DEL (127, hex 7F) in an ASCII environment, but +because 127 is not a control character in EBCDIC, Perl makes it generate the +APC character. Unfortunately, there are several variants of EBCDIC. In most of +them the APC character has the value 255 (hex FF), but in the one Perl calls +POSIX-BC its value is 95 (hex 5F). If certain other characters have POSIX-BC +values, PCRE makes \ec? generate 95; otherwise it generates 255. +.P +After \e0 up to two further octal digits are read. If there are fewer than two +digits, just those that are present are used. Thus the sequence \e0\ex\e015 +specifies two binary zeros followed by a CR character (code value 13). Make +sure you supply two digits after the initial zero if the pattern character that +follows is itself an octal digit. +.P +The escape \eo must be followed by a sequence of octal digits, enclosed in +braces. An error occurs if this is not the case. This escape is a recent +addition to Perl; it provides way of specifying character code points as octal +numbers greater than 0777, and it also allows octal numbers and back references +to be unambiguously specified. +.P +For greater clarity and unambiguity, it is best to avoid following \e by a +digit greater than zero. Instead, use \eo{} or \ex{} to specify character +numbers, and \eg{} to specify back references. The following paragraphs +describe the old, ambiguous syntax. +.P +The handling of a backslash followed by a digit other than 0 is complicated, +and Perl has changed in recent releases, causing PCRE also to change. Outside a +character class, PCRE reads the digit and any following digits as a decimal +number. If the number is less than 8, or if there have been at least that many +previous capturing left parentheses in the expression, the entire sequence is +taken as a \fIback reference\fP. A description of how this works is given +.\" HTML +.\" +later, +.\" +following the discussion of +.\" HTML +.\" +parenthesized subpatterns. +.\" +.P +Inside a character class, or if the decimal number following \e is greater than +7 and there have not been that many capturing subpatterns, PCRE handles \e8 and +\e9 as the literal characters "8" and "9", and otherwise re-reads up to three +octal digits following the backslash, using them to generate a data character. +Any subsequent digits stand for themselves. For example: +.sp + \e040 is another way of writing an ASCII space +.\" JOIN + \e40 is the same, provided there are fewer than 40 + previous capturing subpatterns + \e7 is always a back reference +.\" JOIN + \e11 might be a back reference, or another way of + writing a tab + \e011 is always a tab + \e0113 is a tab followed by the character "3" +.\" JOIN + \e113 might be a back reference, otherwise the + character with octal code 113 +.\" JOIN + \e377 might be a back reference, otherwise + the value 255 (decimal) +.\" JOIN + \e81 is either a back reference, or the two + characters "8" and "1" +.sp +Note that octal values of 100 or greater that are specified using this syntax +must not be introduced by a leading zero, because no more than three octal +digits are ever read. +.P +By default, after \ex that is not followed by {, from zero to two hexadecimal +digits are read (letters can be in upper or lower case). Any number of +hexadecimal digits may appear between \ex{ and }. If a character other than +a hexadecimal digit appears between \ex{ and }, or if there is no terminating +}, an error occurs. +.P +If the PCRE_JAVASCRIPT_COMPAT option is set, the interpretation of \ex is +as just described only when it is followed by two hexadecimal digits. +Otherwise, it matches a literal "x" character. In JavaScript mode, support for +code points greater than 256 is provided by \eu, which must be followed by +four hexadecimal digits; otherwise it matches a literal "u" character. +.P +Characters whose value is less than 256 can be defined by either of the two +syntaxes for \ex (or by \eu in JavaScript mode). There is no difference in the +way they are handled. For example, \exdc is exactly the same as \ex{dc} (or +\eu00dc in JavaScript mode). +. +. +.SS "Constraints on character values" +.rs +.sp +Characters that are specified using octal or hexadecimal numbers are +limited to certain values, as follows: +.sp + 8-bit non-UTF mode less than 0x100 + 8-bit UTF-8 mode less than 0x10ffff and a valid codepoint + 16-bit non-UTF mode less than 0x10000 + 16-bit UTF-16 mode less than 0x10ffff and a valid codepoint + 32-bit non-UTF mode less than 0x100000000 + 32-bit UTF-32 mode less than 0x10ffff and a valid codepoint +.sp +Invalid Unicode codepoints are the range 0xd800 to 0xdfff (the so-called +"surrogate" codepoints), and 0xffef. +. +. +.SS "Escape sequences in character classes" +.rs +.sp +All the sequences that define a single character value can be used both inside +and outside character classes. In addition, inside a character class, \eb is +interpreted as the backspace character (hex 08). +.P +\eN is not allowed in a character class. \eB, \eR, and \eX are not special +inside a character class. Like other unrecognized escape sequences, they are +treated as the literal characters "B", "R", and "X" by default, but cause an +error if the PCRE_EXTRA option is set. Outside a character class, these +sequences have different meanings. +. +. +.SS "Unsupported escape sequences" +.rs +.sp +In Perl, the sequences \el, \eL, \eu, and \eU are recognized by its string +handler and used to modify the case of following characters. By default, PCRE +does not support these escape sequences. However, if the PCRE_JAVASCRIPT_COMPAT +option is set, \eU matches a "U" character, and \eu can be used to define a +character by code point, as described in the previous section. +. +. +.SS "Absolute and relative back references" +.rs +.sp +The sequence \eg followed by an unsigned or a negative number, optionally +enclosed in braces, is an absolute or relative back reference. A named back +reference can be coded as \eg{name}. Back references are discussed +.\" HTML +.\" +later, +.\" +following the discussion of +.\" HTML +.\" +parenthesized subpatterns. +.\" +. +. +.SS "Absolute and relative subroutine calls" +.rs +.sp +For compatibility with Oniguruma, the non-Perl syntax \eg followed by a name or +a number enclosed either in angle brackets or single quotes, is an alternative +syntax for referencing a subpattern as a "subroutine". Details are discussed +.\" HTML +.\" +later. +.\" +Note that \eg{...} (Perl syntax) and \eg<...> (Oniguruma syntax) are \fInot\fP +synonymous. The former is a back reference; the latter is a +.\" HTML +.\" +subroutine +.\" +call. +. +. +.\" HTML +.SS "Generic character types" +.rs +.sp +Another use of backslash is for specifying generic character types: +.sp + \ed any decimal digit + \eD any character that is not a decimal digit + \eh any horizontal white space character + \eH any character that is not a horizontal white space character + \es any white space character + \eS any character that is not a white space character + \ev any vertical white space character + \eV any character that is not a vertical white space character + \ew any "word" character + \eW any "non-word" character +.sp +There is also the single sequence \eN, which matches a non-newline character. +This is the same as +.\" HTML +.\" +the "." metacharacter +.\" +when PCRE_DOTALL is not set. Perl also uses \eN to match characters by name; +PCRE does not support this. +.P +Each pair of lower and upper case escape sequences partitions the complete set +of characters into two disjoint sets. Any given character matches one, and only +one, of each pair. The sequences can appear both inside and outside character +classes. They each match one character of the appropriate type. If the current +matching point is at the end of the subject string, all of them fail, because +there is no character to match. +.P +For compatibility with Perl, \es did not used to match the VT character (code +11), which made it different from the the POSIX "space" class. However, Perl +added VT at release 5.18, and PCRE followed suit at release 8.34. The default +\es characters are now HT (9), LF (10), VT (11), FF (12), CR (13), and space +(32), which are defined as white space in the "C" locale. This list may vary if +locale-specific matching is taking place. For example, in some locales the +"non-breaking space" character (\exA0) is recognized as white space, and in +others the VT character is not. +.P +A "word" character is an underscore or any character that is a letter or digit. +By default, the definition of letters and digits is controlled by PCRE's +low-valued character tables, and may vary if locale-specific matching is taking +place (see +.\" HTML +.\" +"Locale support" +.\" +in the +.\" HREF +\fBpcreapi\fP +.\" +page). For example, in a French locale such as "fr_FR" in Unix-like systems, +or "french" in Windows, some character codes greater than 127 are used for +accented letters, and these are then matched by \ew. The use of locales with +Unicode is discouraged. +.P +By default, characters whose code points are greater than 127 never match \ed, +\es, or \ew, and always match \eD, \eS, and \eW, although this may vary for +characters in the range 128-255 when locale-specific matching is happening. +These escape sequences retain their original meanings from before Unicode +support was available, mainly for efficiency reasons. If PCRE is compiled with +Unicode property support, and the PCRE_UCP option is set, the behaviour is +changed so that Unicode properties are used to determine character types, as +follows: +.sp + \ed any character that matches \ep{Nd} (decimal digit) + \es any character that matches \ep{Z} or \eh or \ev + \ew any character that matches \ep{L} or \ep{N}, plus underscore +.sp +The upper case escapes match the inverse sets of characters. Note that \ed +matches only decimal digits, whereas \ew matches any Unicode digit, as well as +any Unicode letter, and underscore. Note also that PCRE_UCP affects \eb, and +\eB because they are defined in terms of \ew and \eW. Matching these sequences +is noticeably slower when PCRE_UCP is set. +.P +The sequences \eh, \eH, \ev, and \eV are features that were added to Perl at +release 5.10. In contrast to the other sequences, which match only ASCII +characters by default, these always match certain high-valued code points, +whether or not PCRE_UCP is set. The horizontal space characters are: +.sp + U+0009 Horizontal tab (HT) + U+0020 Space + U+00A0 Non-break space + U+1680 Ogham space mark + U+180E Mongolian vowel separator + U+2000 En quad + U+2001 Em quad + U+2002 En space + U+2003 Em space + U+2004 Three-per-em space + U+2005 Four-per-em space + U+2006 Six-per-em space + U+2007 Figure space + U+2008 Punctuation space + U+2009 Thin space + U+200A Hair space + U+202F Narrow no-break space + U+205F Medium mathematical space + U+3000 Ideographic space +.sp +The vertical space characters are: +.sp + U+000A Linefeed (LF) + U+000B Vertical tab (VT) + U+000C Form feed (FF) + U+000D Carriage return (CR) + U+0085 Next line (NEL) + U+2028 Line separator + U+2029 Paragraph separator +.sp +In 8-bit, non-UTF-8 mode, only the characters with codepoints less than 256 are +relevant. +. +. +.\" HTML +.SS "Newline sequences" +.rs +.sp +Outside a character class, by default, the escape sequence \eR matches any +Unicode newline sequence. In 8-bit non-UTF-8 mode \eR is equivalent to the +following: +.sp + (?>\er\en|\en|\ex0b|\ef|\er|\ex85) +.sp +This is an example of an "atomic group", details of which are given +.\" HTML +.\" +below. +.\" +This particular group matches either the two-character sequence CR followed by +LF, or one of the single characters LF (linefeed, U+000A), VT (vertical tab, +U+000B), FF (form feed, U+000C), CR (carriage return, U+000D), or NEL (next +line, U+0085). The two-character sequence is treated as a single unit that +cannot be split. +.P +In other modes, two additional characters whose codepoints are greater than 255 +are added: LS (line separator, U+2028) and PS (paragraph separator, U+2029). +Unicode character property support is not needed for these characters to be +recognized. +.P +It is possible to restrict \eR to match only CR, LF, or CRLF (instead of the +complete set of Unicode line endings) by setting the option PCRE_BSR_ANYCRLF +either at compile time or when the pattern is matched. (BSR is an abbrevation +for "backslash R".) This can be made the default when PCRE is built; if this is +the case, the other behaviour can be requested via the PCRE_BSR_UNICODE option. +It is also possible to specify these settings by starting a pattern string with +one of the following sequences: +.sp + (*BSR_ANYCRLF) CR, LF, or CRLF only + (*BSR_UNICODE) any Unicode newline sequence +.sp +These override the default and the options given to the compiling function, but +they can themselves be overridden by options given to a matching function. Note +that these special settings, which are not Perl-compatible, are recognized only +at the very start of a pattern, and that they must be in upper case. If more +than one of them is present, the last one is used. They can be combined with a +change of newline convention; for example, a pattern can start with: +.sp + (*ANY)(*BSR_ANYCRLF) +.sp +They can also be combined with the (*UTF8), (*UTF16), (*UTF32), (*UTF) or +(*UCP) special sequences. Inside a character class, \eR is treated as an +unrecognized escape sequence, and so matches the letter "R" by default, but +causes an error if PCRE_EXTRA is set. +. +. +.\" HTML +.SS Unicode character properties +.rs +.sp +When PCRE is built with Unicode character property support, three additional +escape sequences that match characters with specific properties are available. +When in 8-bit non-UTF-8 mode, these sequences are of course limited to testing +characters whose codepoints are less than 256, but they do work in this mode. +The extra escape sequences are: +.sp + \ep{\fIxx\fP} a character with the \fIxx\fP property + \eP{\fIxx\fP} a character without the \fIxx\fP property + \eX a Unicode extended grapheme cluster +.sp +The property names represented by \fIxx\fP above are limited to the Unicode +script names, the general category properties, "Any", which matches any +character (including newline), and some special PCRE properties (described +in the +.\" HTML +.\" +next section). +.\" +Other Perl properties such as "InMusicalSymbols" are not currently supported by +PCRE. Note that \eP{Any} does not match any characters, so always causes a +match failure. +.P +Sets of Unicode characters are defined as belonging to certain scripts. A +character from one of these sets can be matched using a script name. For +example: +.sp + \ep{Greek} + \eP{Han} +.sp +Those that are not part of an identified script are lumped together as +"Common". The current list of scripts is: +.P +Arabic, +Armenian, +Avestan, +Balinese, +Bamum, +Bassa_Vah, +Batak, +Bengali, +Bopomofo, +Brahmi, +Braille, +Buginese, +Buhid, +Canadian_Aboriginal, +Carian, +Caucasian_Albanian, +Chakma, +Cham, +Cherokee, +Common, +Coptic, +Cuneiform, +Cypriot, +Cyrillic, +Deseret, +Devanagari, +Duployan, +Egyptian_Hieroglyphs, +Elbasan, +Ethiopic, +Georgian, +Glagolitic, +Gothic, +Grantha, +Greek, +Gujarati, +Gurmukhi, +Han, +Hangul, +Hanunoo, +Hebrew, +Hiragana, +Imperial_Aramaic, +Inherited, +Inscriptional_Pahlavi, +Inscriptional_Parthian, +Javanese, +Kaithi, +Kannada, +Katakana, +Kayah_Li, +Kharoshthi, +Khmer, +Khojki, +Khudawadi, +Lao, +Latin, +Lepcha, +Limbu, +Linear_A, +Linear_B, +Lisu, +Lycian, +Lydian, +Mahajani, +Malayalam, +Mandaic, +Manichaean, +Meetei_Mayek, +Mende_Kikakui, +Meroitic_Cursive, +Meroitic_Hieroglyphs, +Miao, +Modi, +Mongolian, +Mro, +Myanmar, +Nabataean, +New_Tai_Lue, +Nko, +Ogham, +Ol_Chiki, +Old_Italic, +Old_North_Arabian, +Old_Permic, +Old_Persian, +Old_South_Arabian, +Old_Turkic, +Oriya, +Osmanya, +Pahawh_Hmong, +Palmyrene, +Pau_Cin_Hau, +Phags_Pa, +Phoenician, +Psalter_Pahlavi, +Rejang, +Runic, +Samaritan, +Saurashtra, +Sharada, +Shavian, +Siddham, +Sinhala, +Sora_Sompeng, +Sundanese, +Syloti_Nagri, +Syriac, +Tagalog, +Tagbanwa, +Tai_Le, +Tai_Tham, +Tai_Viet, +Takri, +Tamil, +Telugu, +Thaana, +Thai, +Tibetan, +Tifinagh, +Tirhuta, +Ugaritic, +Vai, +Warang_Citi, +Yi. +.P +Each character has exactly one Unicode general category property, specified by +a two-letter abbreviation. For compatibility with Perl, negation can be +specified by including a circumflex between the opening brace and the property +name. For example, \ep{^Lu} is the same as \eP{Lu}. +.P +If only one letter is specified with \ep or \eP, it includes all the general +category properties that start with that letter. In this case, in the absence +of negation, the curly brackets in the escape sequence are optional; these two +examples have the same effect: +.sp + \ep{L} + \epL +.sp +The following general category property codes are supported: +.sp + C Other + Cc Control + Cf Format + Cn Unassigned + Co Private use + Cs Surrogate +.sp + L Letter + Ll Lower case letter + Lm Modifier letter + Lo Other letter + Lt Title case letter + Lu Upper case letter +.sp + M Mark + Mc Spacing mark + Me Enclosing mark + Mn Non-spacing mark +.sp + N Number + Nd Decimal number + Nl Letter number + No Other number +.sp + P Punctuation + Pc Connector punctuation + Pd Dash punctuation + Pe Close punctuation + Pf Final punctuation + Pi Initial punctuation + Po Other punctuation + Ps Open punctuation +.sp + S Symbol + Sc Currency symbol + Sk Modifier symbol + Sm Mathematical symbol + So Other symbol +.sp + Z Separator + Zl Line separator + Zp Paragraph separator + Zs Space separator +.sp +The special property L& is also supported: it matches a character that has +the Lu, Ll, or Lt property, in other words, a letter that is not classified as +a modifier or "other". +.P +The Cs (Surrogate) property applies only to characters in the range U+D800 to +U+DFFF. Such characters are not valid in Unicode strings and so +cannot be tested by PCRE, unless UTF validity checking has been turned off +(see the discussion of PCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK and +PCRE_NO_UTF32_CHECK in the +.\" HREF +\fBpcreapi\fP +.\" +page). Perl does not support the Cs property. +.P +The long synonyms for property names that Perl supports (such as \ep{Letter}) +are not supported by PCRE, nor is it permitted to prefix any of these +properties with "Is". +.P +No character that is in the Unicode table has the Cn (unassigned) property. +Instead, this property is assumed for any code point that is not in the +Unicode table. +.P +Specifying caseless matching does not affect these escape sequences. For +example, \ep{Lu} always matches only upper case letters. This is different from +the behaviour of current versions of Perl. +.P +Matching characters by Unicode property is not fast, because PCRE has to do a +multistage table lookup in order to find a character's property. That is why +the traditional escape sequences such as \ed and \ew do not use Unicode +properties in PCRE by default, though you can make them do so by setting the +PCRE_UCP option or by starting the pattern with (*UCP). +. +. +.SS Extended grapheme clusters +.rs +.sp +The \eX escape matches any number of Unicode characters that form an "extended +grapheme cluster", and treats the sequence as an atomic group +.\" HTML +.\" +(see below). +.\" +Up to and including release 8.31, PCRE matched an earlier, simpler definition +that was equivalent to +.sp + (?>\ePM\epM*) +.sp +That is, it matched a character without the "mark" property, followed by zero +or more characters with the "mark" property. Characters with the "mark" +property are typically non-spacing accents that affect the preceding character. +.P +This simple definition was extended in Unicode to include more complicated +kinds of composite character by giving each character a grapheme breaking +property, and creating rules that use these properties to define the boundaries +of extended grapheme clusters. In releases of PCRE later than 8.31, \eX matches +one of these clusters. +.P +\eX always matches at least one character. Then it decides whether to add +additional characters according to the following rules for ending a cluster: +.P +1. End at the end of the subject string. +.P +2. Do not end between CR and LF; otherwise end after any control character. +.P +3. Do not break Hangul (a Korean script) syllable sequences. Hangul characters +are of five types: L, V, T, LV, and LVT. An L character may be followed by an +L, V, LV, or LVT character; an LV or V character may be followed by a V or T +character; an LVT or T character may be follwed only by a T character. +.P +4. Do not end before extending characters or spacing marks. Characters with +the "mark" property always have the "extend" grapheme breaking property. +.P +5. Do not end after prepend characters. +.P +6. Otherwise, end the cluster. +. +. +.\" HTML +.SS PCRE's additional properties +.rs +.sp +As well as the standard Unicode properties described above, PCRE supports four +more that make it possible to convert traditional escape sequences such as \ew +and \es to use Unicode properties. PCRE uses these non-standard, non-Perl +properties internally when PCRE_UCP is set. However, they may also be used +explicitly. These properties are: +.sp + Xan Any alphanumeric character + Xps Any POSIX space character + Xsp Any Perl space character + Xwd Any Perl "word" character +.sp +Xan matches characters that have either the L (letter) or the N (number) +property. Xps matches the characters tab, linefeed, vertical tab, form feed, or +carriage return, and any other character that has the Z (separator) property. +Xsp is the same as Xps; it used to exclude vertical tab, for Perl +compatibility, but Perl changed, and so PCRE followed at release 8.34. Xwd +matches the same characters as Xan, plus underscore. +.P +There is another non-standard property, Xuc, which matches any character that +can be represented by a Universal Character Name in C++ and other programming +languages. These are the characters $, @, ` (grave accent), and all characters +with Unicode code points greater than or equal to U+00A0, except for the +surrogates U+D800 to U+DFFF. Note that most base (ASCII) characters are +excluded. (Universal Character Names are of the form \euHHHH or \eUHHHHHHHH +where H is a hexadecimal digit. Note that the Xuc property does not match these +sequences but the characters that they represent.) +. +. +.\" HTML +.SS "Resetting the match start" +.rs +.sp +The escape sequence \eK causes any previously matched characters not to be +included in the final matched sequence. For example, the pattern: +.sp + foo\eKbar +.sp +matches "foobar", but reports that it has matched "bar". This feature is +similar to a lookbehind assertion +.\" HTML +.\" +(described below). +.\" +However, in this case, the part of the subject before the real match does not +have to be of fixed length, as lookbehind assertions do. The use of \eK does +not interfere with the setting of +.\" HTML +.\" +captured substrings. +.\" +For example, when the pattern +.sp + (foo)\eKbar +.sp +matches "foobar", the first substring is still set to "foo". +.P +Perl documents that the use of \eK within assertions is "not well defined". In +PCRE, \eK is acted upon when it occurs inside positive assertions, but is +ignored in negative assertions. Note that when a pattern such as (?=ab\eK) +matches, the reported start of the match can be greater than the end of the +match. +. +. +.\" HTML +.SS "Simple assertions" +.rs +.sp +The final use of backslash is for certain simple assertions. An assertion +specifies a condition that has to be met at a particular point in a match, +without consuming any characters from the subject string. The use of +subpatterns for more complicated assertions is described +.\" HTML +.\" +below. +.\" +The backslashed assertions are: +.sp + \eb matches at a word boundary + \eB matches when not at a word boundary + \eA matches at the start of the subject + \eZ matches at the end of the subject + also matches before a newline at the end of the subject + \ez matches only at the end of the subject + \eG matches at the first matching position in the subject +.sp +Inside a character class, \eb has a different meaning; it matches the backspace +character. If any other of these assertions appears in a character class, by +default it matches the corresponding literal character (for example, \eB +matches the letter B). However, if the PCRE_EXTRA option is set, an "invalid +escape sequence" error is generated instead. +.P +A word boundary is a position in the subject string where the current character +and the previous character do not both match \ew or \eW (i.e. one matches +\ew and the other matches \eW), or the start or end of the string if the +first or last character matches \ew, respectively. In a UTF mode, the meanings +of \ew and \eW can be changed by setting the PCRE_UCP option. When this is +done, it also affects \eb and \eB. Neither PCRE nor Perl has a separate "start +of word" or "end of word" metasequence. However, whatever follows \eb normally +determines which it is. For example, the fragment \eba matches "a" at the start +of a word. +.P +The \eA, \eZ, and \ez assertions differ from the traditional circumflex and +dollar (described in the next section) in that they only ever match at the very +start and end of the subject string, whatever options are set. Thus, they are +independent of multiline mode. These three assertions are not affected by the +PCRE_NOTBOL or PCRE_NOTEOL options, which affect only the behaviour of the +circumflex and dollar metacharacters. However, if the \fIstartoffset\fP +argument of \fBpcre_exec()\fP is non-zero, indicating that matching is to start +at a point other than the beginning of the subject, \eA can never match. The +difference between \eZ and \ez is that \eZ matches before a newline at the end +of the string as well as at the very end, whereas \ez matches only at the end. +.P +The \eG assertion is true only when the current matching position is at the +start point of the match, as specified by the \fIstartoffset\fP argument of +\fBpcre_exec()\fP. It differs from \eA when the value of \fIstartoffset\fP is +non-zero. By calling \fBpcre_exec()\fP multiple times with appropriate +arguments, you can mimic Perl's /g option, and it is in this kind of +implementation where \eG can be useful. +.P +Note, however, that PCRE's interpretation of \eG, as the start of the current +match, is subtly different from Perl's, which defines it as the end of the +previous match. In Perl, these can be different when the previously matched +string was empty. Because PCRE does just one match at a time, it cannot +reproduce this behaviour. +.P +If all the alternatives of a pattern begin with \eG, the expression is anchored +to the starting match position, and the "anchored" flag is set in the compiled +regular expression. +. +. +.SH "CIRCUMFLEX AND DOLLAR" +.rs +.sp +The circumflex and dollar metacharacters are zero-width assertions. That is, +they test for a particular condition being true without consuming any +characters from the subject string. +.P +Outside a character class, in the default matching mode, the circumflex +character is an assertion that is true only if the current matching point is at +the start of the subject string. If the \fIstartoffset\fP argument of +\fBpcre_exec()\fP is non-zero, circumflex can never match if the PCRE_MULTILINE +option is unset. Inside a character class, circumflex has an entirely different +meaning +.\" HTML +.\" +(see below). +.\" +.P +Circumflex need not be the first character of the pattern if a number of +alternatives are involved, but it should be the first thing in each alternative +in which it appears if the pattern is ever to match that branch. If all +possible alternatives start with a circumflex, that is, if the pattern is +constrained to match only at the start of the subject, it is said to be an +"anchored" pattern. (There are also other constructs that can cause a pattern +to be anchored.) +.P +The dollar character is an assertion that is true only if the current matching +point is at the end of the subject string, or immediately before a newline at +the end of the string (by default). Note, however, that it does not actually +match the newline. Dollar need not be the last character of the pattern if a +number of alternatives are involved, but it should be the last item in any +branch in which it appears. Dollar has no special meaning in a character class. +.P +The meaning of dollar can be changed so that it matches only at the very end of +the string, by setting the PCRE_DOLLAR_ENDONLY option at compile time. This +does not affect the \eZ assertion. +.P +The meanings of the circumflex and dollar characters are changed if the +PCRE_MULTILINE option is set. When this is the case, a circumflex matches +immediately after internal newlines as well as at the start of the subject +string. It does not match after a newline that ends the string. A dollar +matches before any newlines in the string, as well as at the very end, when +PCRE_MULTILINE is set. When newline is specified as the two-character +sequence CRLF, isolated CR and LF characters do not indicate newlines. +.P +For example, the pattern /^abc$/ matches the subject string "def\enabc" (where +\en represents a newline) in multiline mode, but not otherwise. Consequently, +patterns that are anchored in single line mode because all branches start with +^ are not anchored in multiline mode, and a match for circumflex is possible +when the \fIstartoffset\fP argument of \fBpcre_exec()\fP is non-zero. The +PCRE_DOLLAR_ENDONLY option is ignored if PCRE_MULTILINE is set. +.P +Note that the sequences \eA, \eZ, and \ez can be used to match the start and +end of the subject in both modes, and if all branches of a pattern start with +\eA it is always anchored, whether or not PCRE_MULTILINE is set. +. +. +.\" HTML +.SH "FULL STOP (PERIOD, DOT) AND \eN" +.rs +.sp +Outside a character class, a dot in the pattern matches any one character in +the subject string except (by default) a character that signifies the end of a +line. +.P +When a line ending is defined as a single character, dot never matches that +character; when the two-character sequence CRLF is used, dot does not match CR +if it is immediately followed by LF, but otherwise it matches all characters +(including isolated CRs and LFs). When any Unicode line endings are being +recognized, dot does not match CR or LF or any of the other line ending +characters. +.P +The behaviour of dot with regard to newlines can be changed. If the PCRE_DOTALL +option is set, a dot matches any one character, without exception. If the +two-character sequence CRLF is present in the subject string, it takes two dots +to match it. +.P +The handling of dot is entirely independent of the handling of circumflex and +dollar, the only relationship being that they both involve newlines. Dot has no +special meaning in a character class. +.P +The escape sequence \eN behaves like a dot, except that it is not affected by +the PCRE_DOTALL option. In other words, it matches any character except one +that signifies the end of a line. Perl also uses \eN to match characters by +name; PCRE does not support this. +. +. +.SH "MATCHING A SINGLE DATA UNIT" +.rs +.sp +Outside a character class, the escape sequence \eC matches any one data unit, +whether or not a UTF mode is set. In the 8-bit library, one data unit is one +byte; in the 16-bit library it is a 16-bit unit; in the 32-bit library it is +a 32-bit unit. Unlike a dot, \eC always +matches line-ending characters. The feature is provided in Perl in order to +match individual bytes in UTF-8 mode, but it is unclear how it can usefully be +used. Because \eC breaks up characters into individual data units, matching one +unit with \eC in a UTF mode means that the rest of the string may start with a +malformed UTF character. This has undefined results, because PCRE assumes that +it is dealing with valid UTF strings (and by default it checks this at the +start of processing unless the PCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK or +PCRE_NO_UTF32_CHECK option is used). +.P +PCRE does not allow \eC to appear in lookbehind assertions +.\" HTML +.\" +(described below) +.\" +in a UTF mode, because this would make it impossible to calculate the length of +the lookbehind. +.P +In general, the \eC escape sequence is best avoided. However, one +way of using it that avoids the problem of malformed UTF characters is to use a +lookahead to check the length of the next character, as in this pattern, which +could be used with a UTF-8 string (ignore white space and line breaks): +.sp + (?| (?=[\ex00-\ex7f])(\eC) | + (?=[\ex80-\ex{7ff}])(\eC)(\eC) | + (?=[\ex{800}-\ex{ffff}])(\eC)(\eC)(\eC) | + (?=[\ex{10000}-\ex{1fffff}])(\eC)(\eC)(\eC)(\eC)) +.sp +A group that starts with (?| resets the capturing parentheses numbers in each +alternative (see +.\" HTML +.\" +"Duplicate Subpattern Numbers" +.\" +below). The assertions at the start of each branch check the next UTF-8 +character for values whose encoding uses 1, 2, 3, or 4 bytes, respectively. The +character's individual bytes are then captured by the appropriate number of +groups. +. +. +.\" HTML +.SH "SQUARE BRACKETS AND CHARACTER CLASSES" +.rs +.sp +An opening square bracket introduces a character class, terminated by a closing +square bracket. A closing square bracket on its own is not special by default. +However, if the PCRE_JAVASCRIPT_COMPAT option is set, a lone closing square +bracket causes a compile-time error. If a closing square bracket is required as +a member of the class, it should be the first data character in the class +(after an initial circumflex, if present) or escaped with a backslash. +.P +A character class matches a single character in the subject. In a UTF mode, the +character may be more than one data unit long. A matched character must be in +the set of characters defined by the class, unless the first character in the +class definition is a circumflex, in which case the subject character must not +be in the set defined by the class. If a circumflex is actually required as a +member of the class, ensure it is not the first character, or escape it with a +backslash. +.P +For example, the character class [aeiou] matches any lower case vowel, while +[^aeiou] matches any character that is not a lower case vowel. Note that a +circumflex is just a convenient notation for specifying the characters that +are in the class by enumerating those that are not. A class that starts with a +circumflex is not an assertion; it still consumes a character from the subject +string, and therefore it fails if the current pointer is at the end of the +string. +.P +In UTF-8 (UTF-16, UTF-32) mode, characters with values greater than 255 (0xffff) +can be included in a class as a literal string of data units, or by using the +\ex{ escaping mechanism. +.P +When caseless matching is set, any letters in a class represent both their +upper case and lower case versions, so for example, a caseless [aeiou] matches +"A" as well as "a", and a caseless [^aeiou] does not match "A", whereas a +caseful version would. In a UTF mode, PCRE always understands the concept of +case for characters whose values are less than 128, so caseless matching is +always possible. For characters with higher values, the concept of case is +supported if PCRE is compiled with Unicode property support, but not otherwise. +If you want to use caseless matching in a UTF mode for characters 128 and +above, you must ensure that PCRE is compiled with Unicode property support as +well as with UTF support. +.P +Characters that might indicate line breaks are never treated in any special way +when matching character classes, whatever line-ending sequence is in use, and +whatever setting of the PCRE_DOTALL and PCRE_MULTILINE options is used. A class +such as [^a] always matches one of these characters. +.P +The minus (hyphen) character can be used to specify a range of characters in a +character class. For example, [d-m] matches any letter between d and m, +inclusive. If a minus character is required in a class, it must be escaped with +a backslash or appear in a position where it cannot be interpreted as +indicating a range, typically as the first or last character in the class, or +immediately after a range. For example, [b-d-z] matches letters in the range b +to d, a hyphen character, or z. +.P +It is not possible to have the literal character "]" as the end character of a +range. A pattern such as [W-]46] is interpreted as a class of two characters +("W" and "-") followed by a literal string "46]", so it would match "W46]" or +"-46]". However, if the "]" is escaped with a backslash it is interpreted as +the end of range, so [W-\e]46] is interpreted as a class containing a range +followed by two other characters. The octal or hexadecimal representation of +"]" can also be used to end a range. +.P +An error is generated if a POSIX character class (see below) or an escape +sequence other than one that defines a single character appears at a point +where a range ending character is expected. For example, [z-\exff] is valid, +but [A-\ed] and [A-[:digit:]] are not. +.P +Ranges operate in the collating sequence of character values. They can also be +used for characters specified numerically, for example [\e000-\e037]. Ranges +can include any characters that are valid for the current mode. +.P +If a range that includes letters is used when caseless matching is set, it +matches the letters in either case. For example, [W-c] is equivalent to +[][\e\e^_`wxyzabc], matched caselessly, and in a non-UTF mode, if character +tables for a French locale are in use, [\exc8-\excb] matches accented E +characters in both cases. In UTF modes, PCRE supports the concept of case for +characters with values greater than 128 only when it is compiled with Unicode +property support. +.P +The character escape sequences \ed, \eD, \eh, \eH, \ep, \eP, \es, \eS, \ev, +\eV, \ew, and \eW may appear in a character class, and add the characters that +they match to the class. For example, [\edABCDEF] matches any hexadecimal +digit. In UTF modes, the PCRE_UCP option affects the meanings of \ed, \es, \ew +and their upper case partners, just as it does when they appear outside a +character class, as described in the section entitled +.\" HTML +.\" +"Generic character types" +.\" +above. The escape sequence \eb has a different meaning inside a character +class; it matches the backspace character. The sequences \eB, \eN, \eR, and \eX +are not special inside a character class. Like any other unrecognized escape +sequences, they are treated as the literal characters "B", "N", "R", and "X" by +default, but cause an error if the PCRE_EXTRA option is set. +.P +A circumflex can conveniently be used with the upper case character types to +specify a more restricted set of characters than the matching lower case type. +For example, the class [^\eW_] matches any letter or digit, but not underscore, +whereas [\ew] includes underscore. A positive character class should be read as +"something OR something OR ..." and a negative class as "NOT something AND NOT +something AND NOT ...". +.P +The only metacharacters that are recognized in character classes are backslash, +hyphen (only where it can be interpreted as specifying a range), circumflex +(only at the start), opening square bracket (only when it can be interpreted as +introducing a POSIX class name, or for a special compatibility feature - see +the next two sections), and the terminating closing square bracket. However, +escaping other non-alphanumeric characters does no harm. +. +. +.SH "POSIX CHARACTER CLASSES" +.rs +.sp +Perl supports the POSIX notation for character classes. This uses names +enclosed by [: and :] within the enclosing square brackets. PCRE also supports +this notation. For example, +.sp + [01[:alpha:]%] +.sp +matches "0", "1", any alphabetic character, or "%". The supported class names +are: +.sp + alnum letters and digits + alpha letters + ascii character codes 0 - 127 + blank space or tab only + cntrl control characters + digit decimal digits (same as \ed) + graph printing characters, excluding space + lower lower case letters + print printing characters, including space + punct printing characters, excluding letters and digits and space + space white space (the same as \es from PCRE 8.34) + upper upper case letters + word "word" characters (same as \ew) + xdigit hexadecimal digits +.sp +The default "space" characters are HT (9), LF (10), VT (11), FF (12), CR (13), +and space (32). If locale-specific matching is taking place, the list of space +characters may be different; there may be fewer or more of them. "Space" used +to be different to \es, which did not include VT, for Perl compatibility. +However, Perl changed at release 5.18, and PCRE followed at release 8.34. +"Space" and \es now match the same set of characters. +.P +The name "word" is a Perl extension, and "blank" is a GNU extension from Perl +5.8. Another Perl extension is negation, which is indicated by a ^ character +after the colon. For example, +.sp + [12[:^digit:]] +.sp +matches "1", "2", or any non-digit. PCRE (and Perl) also recognize the POSIX +syntax [.ch.] and [=ch=] where "ch" is a "collating element", but these are not +supported, and an error is given if they are encountered. +.P +By default, characters with values greater than 128 do not match any of the +POSIX character classes. However, if the PCRE_UCP option is passed to +\fBpcre_compile()\fP, some of the classes are changed so that Unicode character +properties are used. This is achieved by replacing certain POSIX classes by +other sequences, as follows: +.sp + [:alnum:] becomes \ep{Xan} + [:alpha:] becomes \ep{L} + [:blank:] becomes \eh + [:digit:] becomes \ep{Nd} + [:lower:] becomes \ep{Ll} + [:space:] becomes \ep{Xps} + [:upper:] becomes \ep{Lu} + [:word:] becomes \ep{Xwd} +.sp +Negated versions, such as [:^alpha:] use \eP instead of \ep. Three other POSIX +classes are handled specially in UCP mode: +.TP 10 +[:graph:] +This matches characters that have glyphs that mark the page when printed. In +Unicode property terms, it matches all characters with the L, M, N, P, S, or Cf +properties, except for: +.sp + U+061C Arabic Letter Mark + U+180E Mongolian Vowel Separator + U+2066 - U+2069 Various "isolate"s +.sp +.TP 10 +[:print:] +This matches the same characters as [:graph:] plus space characters that are +not controls, that is, characters with the Zs property. +.TP 10 +[:punct:] +This matches all characters that have the Unicode P (punctuation) property, +plus those characters whose code points are less than 128 that have the S +(Symbol) property. +.P +The other POSIX classes are unchanged, and match only characters with code +points less than 128. +. +. +.SH "COMPATIBILITY FEATURE FOR WORD BOUNDARIES" +.rs +.sp +In the POSIX.2 compliant library that was included in 4.4BSD Unix, the ugly +syntax [[:<:]] and [[:>:]] is used for matching "start of word" and "end of +word". PCRE treats these items as follows: +.sp + [[:<:]] is converted to \eb(?=\ew) + [[:>:]] is converted to \eb(?<=\ew) +.sp +Only these exact character sequences are recognized. A sequence such as +[a[:<:]b] provokes error for an unrecognized POSIX class name. This support is +not compatible with Perl. It is provided to help migrations from other +environments, and is best not used in any new patterns. Note that \eb matches +at the start and the end of a word (see +.\" HTML +.\" +"Simple assertions" +.\" +above), and in a Perl-style pattern the preceding or following character +normally shows which is wanted, without the need for the assertions that are +used above in order to give exactly the POSIX behaviour. +. +. +.SH "VERTICAL BAR" +.rs +.sp +Vertical bar characters are used to separate alternative patterns. For example, +the pattern +.sp + gilbert|sullivan +.sp +matches either "gilbert" or "sullivan". Any number of alternatives may appear, +and an empty alternative is permitted (matching the empty string). The matching +process tries each alternative in turn, from left to right, and the first one +that succeeds is used. If the alternatives are within a subpattern +.\" HTML +.\" +(defined below), +.\" +"succeeds" means matching the rest of the main pattern as well as the +alternative in the subpattern. +. +. +.SH "INTERNAL OPTION SETTING" +.rs +.sp +The settings of the PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL, and +PCRE_EXTENDED options (which are Perl-compatible) can be changed from within +the pattern by a sequence of Perl option letters enclosed between "(?" and ")". +The option letters are +.sp + i for PCRE_CASELESS + m for PCRE_MULTILINE + s for PCRE_DOTALL + x for PCRE_EXTENDED +.sp +For example, (?im) sets caseless, multiline matching. It is also possible to +unset these options by preceding the letter with a hyphen, and a combined +setting and unsetting such as (?im-sx), which sets PCRE_CASELESS and +PCRE_MULTILINE while unsetting PCRE_DOTALL and PCRE_EXTENDED, is also +permitted. If a letter appears both before and after the hyphen, the option is +unset. +.P +The PCRE-specific options PCRE_DUPNAMES, PCRE_UNGREEDY, and PCRE_EXTRA can be +changed in the same way as the Perl-compatible options by using the characters +J, U and X respectively. +.P +When one of these option changes occurs at top level (that is, not inside +subpattern parentheses), the change applies to the remainder of the pattern +that follows. An option change within a subpattern (see below for a description +of subpatterns) affects only that part of the subpattern that follows it, so +.sp + (a(?i)b)c +.sp +matches abc and aBc and no other strings (assuming PCRE_CASELESS is not used). +By this means, options can be made to have different settings in different +parts of the pattern. Any changes made in one alternative do carry on +into subsequent branches within the same subpattern. For example, +.sp + (a(?i)b|c) +.sp +matches "ab", "aB", "c", and "C", even though when matching "C" the first +branch is abandoned before the option setting. This is because the effects of +option settings happen at compile time. There would be some very weird +behaviour otherwise. +.P +\fBNote:\fP There are other PCRE-specific options that can be set by the +application when the compiling or matching functions are called. In some cases +the pattern can contain special leading sequences such as (*CRLF) to override +what the application has set or what has been defaulted. Details are given in +the section entitled +.\" HTML +.\" +"Newline sequences" +.\" +above. There are also the (*UTF8), (*UTF16),(*UTF32), and (*UCP) leading +sequences that can be used to set UTF and Unicode property modes; they are +equivalent to setting the PCRE_UTF8, PCRE_UTF16, PCRE_UTF32 and the PCRE_UCP +options, respectively. The (*UTF) sequence is a generic version that can be +used with any of the libraries. However, the application can set the +PCRE_NEVER_UTF option, which locks out the use of the (*UTF) sequences. +. +. +.\" HTML +.SH SUBPATTERNS +.rs +.sp +Subpatterns are delimited by parentheses (round brackets), which can be nested. +Turning part of a pattern into a subpattern does two things: +.sp +1. It localizes a set of alternatives. For example, the pattern +.sp + cat(aract|erpillar|) +.sp +matches "cataract", "caterpillar", or "cat". Without the parentheses, it would +match "cataract", "erpillar" or an empty string. +.sp +2. It sets up the subpattern as a capturing subpattern. This means that, when +the whole pattern matches, that portion of the subject string that matched the +subpattern is passed back to the caller via the \fIovector\fP argument of the +matching function. (This applies only to the traditional matching functions; +the DFA matching functions do not support capturing.) +.P +Opening parentheses are counted from left to right (starting from 1) to obtain +numbers for the capturing subpatterns. For example, if the string "the red +king" is matched against the pattern +.sp + the ((red|white) (king|queen)) +.sp +the captured substrings are "red king", "red", and "king", and are numbered 1, +2, and 3, respectively. +.P +The fact that plain parentheses fulfil two functions is not always helpful. +There are often times when a grouping subpattern is required without a +capturing requirement. If an opening parenthesis is followed by a question mark +and a colon, the subpattern does not do any capturing, and is not counted when +computing the number of any subsequent capturing subpatterns. For example, if +the string "the white queen" is matched against the pattern +.sp + the ((?:red|white) (king|queen)) +.sp +the captured substrings are "white queen" and "queen", and are numbered 1 and +2. The maximum number of capturing subpatterns is 65535. +.P +As a convenient shorthand, if any option settings are required at the start of +a non-capturing subpattern, the option letters may appear between the "?" and +the ":". Thus the two patterns +.sp + (?i:saturday|sunday) + (?:(?i)saturday|sunday) +.sp +match exactly the same set of strings. Because alternative branches are tried +from left to right, and options are not reset until the end of the subpattern +is reached, an option setting in one branch does affect subsequent branches, so +the above patterns match "SUNDAY" as well as "Saturday". +. +. +.\" HTML +.SH "DUPLICATE SUBPATTERN NUMBERS" +.rs +.sp +Perl 5.10 introduced a feature whereby each alternative in a subpattern uses +the same numbers for its capturing parentheses. Such a subpattern starts with +(?| and is itself a non-capturing subpattern. For example, consider this +pattern: +.sp + (?|(Sat)ur|(Sun))day +.sp +Because the two alternatives are inside a (?| group, both sets of capturing +parentheses are numbered one. Thus, when the pattern matches, you can look +at captured substring number one, whichever alternative matched. This construct +is useful when you want to capture part, but not all, of one of a number of +alternatives. Inside a (?| group, parentheses are numbered as usual, but the +number is reset at the start of each branch. The numbers of any capturing +parentheses that follow the subpattern start after the highest number used in +any branch. The following example is taken from the Perl documentation. The +numbers underneath show in which buffer the captured content will be stored. +.sp + # before ---------------branch-reset----------- after + / ( a ) (?| x ( y ) z | (p (q) r) | (t) u (v) ) ( z ) /x + # 1 2 2 3 2 3 4 +.sp +A back reference to a numbered subpattern uses the most recent value that is +set for that number by any subpattern. The following pattern matches "abcabc" +or "defdef": +.sp + /(?|(abc)|(def))\e1/ +.sp +In contrast, a subroutine call to a numbered subpattern always refers to the +first one in the pattern with the given number. The following pattern matches +"abcabc" or "defabc": +.sp + /(?|(abc)|(def))(?1)/ +.sp +If a +.\" HTML +.\" +condition test +.\" +for a subpattern's having matched refers to a non-unique number, the test is +true if any of the subpatterns of that number have matched. +.P +An alternative approach to using this "branch reset" feature is to use +duplicate named subpatterns, as described in the next section. +. +. +.SH "NAMED SUBPATTERNS" +.rs +.sp +Identifying capturing parentheses by number is simple, but it can be very hard +to keep track of the numbers in complicated regular expressions. Furthermore, +if an expression is modified, the numbers may change. To help with this +difficulty, PCRE supports the naming of subpatterns. This feature was not +added to Perl until release 5.10. Python had the feature earlier, and PCRE +introduced it at release 4.0, using the Python syntax. PCRE now supports both +the Perl and the Python syntax. Perl allows identically numbered subpatterns to +have different names, but PCRE does not. +.P +In PCRE, a subpattern can be named in one of three ways: (?...) or +(?'name'...) as in Perl, or (?P...) as in Python. References to capturing +parentheses from other parts of the pattern, such as +.\" HTML +.\" +back references, +.\" +.\" HTML +.\" +recursion, +.\" +and +.\" HTML +.\" +conditions, +.\" +can be made by name as well as by number. +.P +Names consist of up to 32 alphanumeric characters and underscores, but must +start with a non-digit. Named capturing parentheses are still allocated numbers +as well as names, exactly as if the names were not present. The PCRE API +provides function calls for extracting the name-to-number translation table +from a compiled pattern. There is also a convenience function for extracting a +captured substring by name. +.P +By default, a name must be unique within a pattern, but it is possible to relax +this constraint by setting the PCRE_DUPNAMES option at compile time. (Duplicate +names are also always permitted for subpatterns with the same number, set up as +described in the previous section.) Duplicate names can be useful for patterns +where only one instance of the named parentheses can match. Suppose you want to +match the name of a weekday, either as a 3-letter abbreviation or as the full +name, and in both cases you want to extract the abbreviation. This pattern +(ignoring the line breaks) does the job: +.sp + (?Mon|Fri|Sun)(?:day)?| + (?Tue)(?:sday)?| + (?Wed)(?:nesday)?| + (?Thu)(?:rsday)?| + (?Sat)(?:urday)? +.sp +There are five capturing substrings, but only one is ever set after a match. +(An alternative way of solving this problem is to use a "branch reset" +subpattern, as described in the previous section.) +.P +The convenience function for extracting the data by name returns the substring +for the first (and in this example, the only) subpattern of that name that +matched. This saves searching to find which numbered subpattern it was. +.P +If you make a back reference to a non-unique named subpattern from elsewhere in +the pattern, the subpatterns to which the name refers are checked in the order +in which they appear in the overall pattern. The first one that is set is used +for the reference. For example, this pattern matches both "foofoo" and +"barbar" but not "foobar" or "barfoo": +.sp + (?:(?foo)|(?bar))\ek +.sp +.P +If you make a subroutine call to a non-unique named subpattern, the one that +corresponds to the first occurrence of the name is used. In the absence of +duplicate numbers (see the previous section) this is the one with the lowest +number. +.P +If you use a named reference in a condition +test (see the +.\" +.\" HTML +.\" +section about conditions +.\" +below), either to check whether a subpattern has matched, or to check for +recursion, all subpatterns with the same name are tested. If the condition is +true for any one of them, the overall condition is true. This is the same +behaviour as testing by number. For further details of the interfaces for +handling named subpatterns, see the +.\" HREF +\fBpcreapi\fP +.\" +documentation. +.P +\fBWarning:\fP You cannot use different names to distinguish between two +subpatterns with the same number because PCRE uses only the numbers when +matching. For this reason, an error is given at compile time if different names +are given to subpatterns with the same number. However, you can always give the +same name to subpatterns with the same number, even when PCRE_DUPNAMES is not +set. +. +. +.SH REPETITION +.rs +.sp +Repetition is specified by quantifiers, which can follow any of the following +items: +.sp + a literal data character + the dot metacharacter + the \eC escape sequence + the \eX escape sequence + the \eR escape sequence + an escape such as \ed or \epL that matches a single character + a character class + a back reference (see next section) + a parenthesized subpattern (including assertions) + a subroutine call to a subpattern (recursive or otherwise) +.sp +The general repetition quantifier specifies a minimum and maximum number of +permitted matches, by giving the two numbers in curly brackets (braces), +separated by a comma. The numbers must be less than 65536, and the first must +be less than or equal to the second. For example: +.sp + z{2,4} +.sp +matches "zz", "zzz", or "zzzz". A closing brace on its own is not a special +character. If the second number is omitted, but the comma is present, there is +no upper limit; if the second number and the comma are both omitted, the +quantifier specifies an exact number of required matches. Thus +.sp + [aeiou]{3,} +.sp +matches at least 3 successive vowels, but may match many more, while +.sp + \ed{8} +.sp +matches exactly 8 digits. An opening curly bracket that appears in a position +where a quantifier is not allowed, or one that does not match the syntax of a +quantifier, is taken as a literal character. For example, {,6} is not a +quantifier, but a literal string of four characters. +.P +In UTF modes, quantifiers apply to characters rather than to individual data +units. Thus, for example, \ex{100}{2} matches two characters, each of +which is represented by a two-byte sequence in a UTF-8 string. Similarly, +\eX{3} matches three Unicode extended grapheme clusters, each of which may be +several data units long (and they may be of different lengths). +.P +The quantifier {0} is permitted, causing the expression to behave as if the +previous item and the quantifier were not present. This may be useful for +subpatterns that are referenced as +.\" HTML +.\" +subroutines +.\" +from elsewhere in the pattern (but see also the section entitled +.\" HTML +.\" +"Defining subpatterns for use by reference only" +.\" +below). Items other than subpatterns that have a {0} quantifier are omitted +from the compiled pattern. +.P +For convenience, the three most common quantifiers have single-character +abbreviations: +.sp + * is equivalent to {0,} + + is equivalent to {1,} + ? is equivalent to {0,1} +.sp +It is possible to construct infinite loops by following a subpattern that can +match no characters with a quantifier that has no upper limit, for example: +.sp + (a?)* +.sp +Earlier versions of Perl and PCRE used to give an error at compile time for +such patterns. However, because there are cases where this can be useful, such +patterns are now accepted, but if any repetition of the subpattern does in fact +match no characters, the loop is forcibly broken. +.P +By default, the quantifiers are "greedy", that is, they match as much as +possible (up to the maximum number of permitted times), without causing the +rest of the pattern to fail. The classic example of where this gives problems +is in trying to match comments in C programs. These appear between /* and */ +and within the comment, individual * and / characters may appear. An attempt to +match C comments by applying the pattern +.sp + /\e*.*\e*/ +.sp +to the string +.sp + /* first comment */ not comment /* second comment */ +.sp +fails, because it matches the entire string owing to the greediness of the .* +item. +.P +However, if a quantifier is followed by a question mark, it ceases to be +greedy, and instead matches the minimum number of times possible, so the +pattern +.sp + /\e*.*?\e*/ +.sp +does the right thing with the C comments. The meaning of the various +quantifiers is not otherwise changed, just the preferred number of matches. +Do not confuse this use of question mark with its use as a quantifier in its +own right. Because it has two uses, it can sometimes appear doubled, as in +.sp + \ed??\ed +.sp +which matches one digit by preference, but can match two if that is the only +way the rest of the pattern matches. +.P +If the PCRE_UNGREEDY option is set (an option that is not available in Perl), +the quantifiers are not greedy by default, but individual ones can be made +greedy by following them with a question mark. In other words, it inverts the +default behaviour. +.P +When a parenthesized subpattern is quantified with a minimum repeat count that +is greater than 1 or with a limited maximum, more memory is required for the +compiled pattern, in proportion to the size of the minimum or maximum. +.P +If a pattern starts with .* or .{0,} and the PCRE_DOTALL option (equivalent +to Perl's /s) is set, thus allowing the dot to match newlines, the pattern is +implicitly anchored, because whatever follows will be tried against every +character position in the subject string, so there is no point in retrying the +overall match at any position after the first. PCRE normally treats such a +pattern as though it were preceded by \eA. +.P +In cases where it is known that the subject string contains no newlines, it is +worth setting PCRE_DOTALL in order to obtain this optimization, or +alternatively using ^ to indicate anchoring explicitly. +.P +However, there are some cases where the optimization cannot be used. When .* +is inside capturing parentheses that are the subject of a back reference +elsewhere in the pattern, a match at the start may fail where a later one +succeeds. Consider, for example: +.sp + (.*)abc\e1 +.sp +If the subject is "xyz123abc123" the match point is the fourth character. For +this reason, such a pattern is not implicitly anchored. +.P +Another case where implicit anchoring is not applied is when the leading .* is +inside an atomic group. Once again, a match at the start may fail where a later +one succeeds. Consider this pattern: +.sp + (?>.*?a)b +.sp +It matches "ab" in the subject "aab". The use of the backtracking control verbs +(*PRUNE) and (*SKIP) also disable this optimization. +.P +When a capturing subpattern is repeated, the value captured is the substring +that matched the final iteration. For example, after +.sp + (tweedle[dume]{3}\es*)+ +.sp +has matched "tweedledum tweedledee" the value of the captured substring is +"tweedledee". However, if there are nested capturing subpatterns, the +corresponding captured values may have been set in previous iterations. For +example, after +.sp + /(a|(b))+/ +.sp +matches "aba" the value of the second captured substring is "b". +. +. +.\" HTML +.SH "ATOMIC GROUPING AND POSSESSIVE QUANTIFIERS" +.rs +.sp +With both maximizing ("greedy") and minimizing ("ungreedy" or "lazy") +repetition, failure of what follows normally causes the repeated item to be +re-evaluated to see if a different number of repeats allows the rest of the +pattern to match. Sometimes it is useful to prevent this, either to change the +nature of the match, or to cause it fail earlier than it otherwise might, when +the author of the pattern knows there is no point in carrying on. +.P +Consider, for example, the pattern \ed+foo when applied to the subject line +.sp + 123456bar +.sp +After matching all 6 digits and then failing to match "foo", the normal +action of the matcher is to try again with only 5 digits matching the \ed+ +item, and then with 4, and so on, before ultimately failing. "Atomic grouping" +(a term taken from Jeffrey Friedl's book) provides the means for specifying +that once a subpattern has matched, it is not to be re-evaluated in this way. +.P +If we use atomic grouping for the previous example, the matcher gives up +immediately on failing to match "foo" the first time. The notation is a kind of +special parenthesis, starting with (?> as in this example: +.sp + (?>\ed+)foo +.sp +This kind of parenthesis "locks up" the part of the pattern it contains once +it has matched, and a failure further into the pattern is prevented from +backtracking into it. Backtracking past it to previous items, however, works as +normal. +.P +An alternative description is that a subpattern of this type matches the string +of characters that an identical standalone pattern would match, if anchored at +the current point in the subject string. +.P +Atomic grouping subpatterns are not capturing subpatterns. Simple cases such as +the above example can be thought of as a maximizing repeat that must swallow +everything it can. So, while both \ed+ and \ed+? are prepared to adjust the +number of digits they match in order to make the rest of the pattern match, +(?>\ed+) can only match an entire sequence of digits. +.P +Atomic groups in general can of course contain arbitrarily complicated +subpatterns, and can be nested. However, when the subpattern for an atomic +group is just a single repeated item, as in the example above, a simpler +notation, called a "possessive quantifier" can be used. This consists of an +additional + character following a quantifier. Using this notation, the +previous example can be rewritten as +.sp + \ed++foo +.sp +Note that a possessive quantifier can be used with an entire group, for +example: +.sp + (abc|xyz){2,3}+ +.sp +Possessive quantifiers are always greedy; the setting of the PCRE_UNGREEDY +option is ignored. They are a convenient notation for the simpler forms of +atomic group. However, there is no difference in the meaning of a possessive +quantifier and the equivalent atomic group, though there may be a performance +difference; possessive quantifiers should be slightly faster. +.P +The possessive quantifier syntax is an extension to the Perl 5.8 syntax. +Jeffrey Friedl originated the idea (and the name) in the first edition of his +book. Mike McCloskey liked it, so implemented it when he built Sun's Java +package, and PCRE copied it from there. It ultimately found its way into Perl +at release 5.10. +.P +PCRE has an optimization that automatically "possessifies" certain simple +pattern constructs. For example, the sequence A+B is treated as A++B because +there is no point in backtracking into a sequence of A's when B must follow. +.P +When a pattern contains an unlimited repeat inside a subpattern that can itself +be repeated an unlimited number of times, the use of an atomic group is the +only way to avoid some failing matches taking a very long time indeed. The +pattern +.sp + (\eD+|<\ed+>)*[!?] +.sp +matches an unlimited number of substrings that either consist of non-digits, or +digits enclosed in <>, followed by either ! or ?. When it matches, it runs +quickly. However, if it is applied to +.sp + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +.sp +it takes a long time before reporting failure. This is because the string can +be divided between the internal \eD+ repeat and the external * repeat in a +large number of ways, and all have to be tried. (The example uses [!?] rather +than a single character at the end, because both PCRE and Perl have an +optimization that allows for fast failure when a single character is used. They +remember the last single character that is required for a match, and fail early +if it is not present in the string.) If the pattern is changed so that it uses +an atomic group, like this: +.sp + ((?>\eD+)|<\ed+>)*[!?] +.sp +sequences of non-digits cannot be broken, and failure happens quickly. +. +. +.\" HTML +.SH "BACK REFERENCES" +.rs +.sp +Outside a character class, a backslash followed by a digit greater than 0 (and +possibly further digits) is a back reference to a capturing subpattern earlier +(that is, to its left) in the pattern, provided there have been that many +previous capturing left parentheses. +.P +However, if the decimal number following the backslash is less than 10, it is +always taken as a back reference, and causes an error only if there are not +that many capturing left parentheses in the entire pattern. In other words, the +parentheses that are referenced need not be to the left of the reference for +numbers less than 10. A "forward back reference" of this type can make sense +when a repetition is involved and the subpattern to the right has participated +in an earlier iteration. +.P +It is not possible to have a numerical "forward back reference" to a subpattern +whose number is 10 or more using this syntax because a sequence such as \e50 is +interpreted as a character defined in octal. See the subsection entitled +"Non-printing characters" +.\" HTML +.\" +above +.\" +for further details of the handling of digits following a backslash. There is +no such problem when named parentheses are used. A back reference to any +subpattern is possible using named parentheses (see below). +.P +Another way of avoiding the ambiguity inherent in the use of digits following a +backslash is to use the \eg escape sequence. This escape must be followed by an +unsigned number or a negative number, optionally enclosed in braces. These +examples are all identical: +.sp + (ring), \e1 + (ring), \eg1 + (ring), \eg{1} +.sp +An unsigned number specifies an absolute reference without the ambiguity that +is present in the older syntax. It is also useful when literal digits follow +the reference. A negative number is a relative reference. Consider this +example: +.sp + (abc(def)ghi)\eg{-1} +.sp +The sequence \eg{-1} is a reference to the most recently started capturing +subpattern before \eg, that is, is it equivalent to \e2 in this example. +Similarly, \eg{-2} would be equivalent to \e1. The use of relative references +can be helpful in long patterns, and also in patterns that are created by +joining together fragments that contain references within themselves. +.P +A back reference matches whatever actually matched the capturing subpattern in +the current subject string, rather than anything matching the subpattern +itself (see +.\" HTML +.\" +"Subpatterns as subroutines" +.\" +below for a way of doing that). So the pattern +.sp + (sens|respons)e and \e1ibility +.sp +matches "sense and sensibility" and "response and responsibility", but not +"sense and responsibility". If caseful matching is in force at the time of the +back reference, the case of letters is relevant. For example, +.sp + ((?i)rah)\es+\e1 +.sp +matches "rah rah" and "RAH RAH", but not "RAH rah", even though the original +capturing subpattern is matched caselessly. +.P +There are several different ways of writing back references to named +subpatterns. The .NET syntax \ek{name} and the Perl syntax \ek or +\ek'name' are supported, as is the Python syntax (?P=name). Perl 5.10's unified +back reference syntax, in which \eg can be used for both numeric and named +references, is also supported. We could rewrite the above example in any of +the following ways: +.sp + (?(?i)rah)\es+\ek + (?'p1'(?i)rah)\es+\ek{p1} + (?P(?i)rah)\es+(?P=p1) + (?(?i)rah)\es+\eg{p1} +.sp +A subpattern that is referenced by name may appear in the pattern before or +after the reference. +.P +There may be more than one back reference to the same subpattern. If a +subpattern has not actually been used in a particular match, any back +references to it always fail by default. For example, the pattern +.sp + (a|(bc))\e2 +.sp +always fails if it starts to match "a" rather than "bc". However, if the +PCRE_JAVASCRIPT_COMPAT option is set at compile time, a back reference to an +unset value matches an empty string. +.P +Because there may be many capturing parentheses in a pattern, all digits +following a backslash are taken as part of a potential back reference number. +If the pattern continues with a digit character, some delimiter must be used to +terminate the back reference. If the PCRE_EXTENDED option is set, this can be +white space. Otherwise, the \eg{ syntax or an empty comment (see +.\" HTML +.\" +"Comments" +.\" +below) can be used. +. +.SS "Recursive back references" +.rs +.sp +A back reference that occurs inside the parentheses to which it refers fails +when the subpattern is first used, so, for example, (a\e1) never matches. +However, such references can be useful inside repeated subpatterns. For +example, the pattern +.sp + (a|b\e1)+ +.sp +matches any number of "a"s and also "aba", "ababbaa" etc. At each iteration of +the subpattern, the back reference matches the character string corresponding +to the previous iteration. In order for this to work, the pattern must be such +that the first iteration does not need to match the back reference. This can be +done using alternation, as in the example above, or by a quantifier with a +minimum of zero. +.P +Back references of this type cause the group that they reference to be treated +as an +.\" HTML +.\" +atomic group. +.\" +Once the whole group has been matched, a subsequent matching failure cannot +cause backtracking into the middle of the group. +. +. +.\" HTML +.SH ASSERTIONS +.rs +.sp +An assertion is a test on the characters following or preceding the current +matching point that does not actually consume any characters. The simple +assertions coded as \eb, \eB, \eA, \eG, \eZ, \ez, ^ and $ are described +.\" HTML +.\" +above. +.\" +.P +More complicated assertions are coded as subpatterns. There are two kinds: +those that look ahead of the current position in the subject string, and those +that look behind it. An assertion subpattern is matched in the normal way, +except that it does not cause the current matching position to be changed. +.P +Assertion subpatterns are not capturing subpatterns. If such an assertion +contains capturing subpatterns within it, these are counted for the purposes of +numbering the capturing subpatterns in the whole pattern. However, substring +capturing is carried out only for positive assertions. (Perl sometimes, but not +always, does do capturing in negative assertions.) +.P +WARNING: If a positive assertion containing one or more capturing subpatterns +succeeds, but failure to match later in the pattern causes backtracking over +this assertion, the captures within the assertion are reset only if no higher +numbered captures are already set. This is, unfortunately, a fundamental +limitation of the current implementation, and as PCRE1 is now in +maintenance-only status, it is unlikely ever to change. +.P +For compatibility with Perl, assertion subpatterns may be repeated; though +it makes no sense to assert the same thing several times, the side effect of +capturing parentheses may occasionally be useful. In practice, there only three +cases: +.sp +(1) If the quantifier is {0}, the assertion is never obeyed during matching. +However, it may contain internal capturing parenthesized groups that are called +from elsewhere via the +.\" HTML +.\" +subroutine mechanism. +.\" +.sp +(2) If quantifier is {0,n} where n is greater than zero, it is treated as if it +were {0,1}. At run time, the rest of the pattern match is tried with and +without the assertion, the order depending on the greediness of the quantifier. +.sp +(3) If the minimum repetition is greater than zero, the quantifier is ignored. +The assertion is obeyed just once when encountered during matching. +. +. +.SS "Lookahead assertions" +.rs +.sp +Lookahead assertions start with (?= for positive assertions and (?! for +negative assertions. For example, +.sp + \ew+(?=;) +.sp +matches a word followed by a semicolon, but does not include the semicolon in +the match, and +.sp + foo(?!bar) +.sp +matches any occurrence of "foo" that is not followed by "bar". Note that the +apparently similar pattern +.sp + (?!foo)bar +.sp +does not find an occurrence of "bar" that is preceded by something other than +"foo"; it finds any occurrence of "bar" whatsoever, because the assertion +(?!foo) is always true when the next three characters are "bar". A +lookbehind assertion is needed to achieve the other effect. +.P +If you want to force a matching failure at some point in a pattern, the most +convenient way to do it is with (?!) because an empty string always matches, so +an assertion that requires there not to be an empty string must always fail. +The backtracking control verb (*FAIL) or (*F) is a synonym for (?!). +. +. +.\" HTML +.SS "Lookbehind assertions" +.rs +.sp +Lookbehind assertions start with (?<= for positive assertions and (? +.\" +(see above) +.\" +can be used instead of a lookbehind assertion to get round the fixed-length +restriction. +.P +The implementation of lookbehind assertions is, for each alternative, to +temporarily move the current position back by the fixed length and then try to +match. If there are insufficient characters before the current position, the +assertion fails. +.P +In a UTF mode, PCRE does not allow the \eC escape (which matches a single data +unit even in a UTF mode) to appear in lookbehind assertions, because it makes +it impossible to calculate the length of the lookbehind. The \eX and \eR +escapes, which can match different numbers of data units, are also not +permitted. +.P +.\" HTML +.\" +"Subroutine" +.\" +calls (see below) such as (?2) or (?&X) are permitted in lookbehinds, as long +as the subpattern matches a fixed-length string. +.\" HTML +.\" +Recursion, +.\" +however, is not supported. +.P +Possessive quantifiers can be used in conjunction with lookbehind assertions to +specify efficient matching of fixed-length strings at the end of subject +strings. Consider a simple pattern such as +.sp + abcd$ +.sp +when applied to a long string that does not match. Because matching proceeds +from left to right, PCRE will look for each "a" in the subject and then see if +what follows matches the rest of the pattern. If the pattern is specified as +.sp + ^.*abcd$ +.sp +the initial .* matches the entire string at first, but when this fails (because +there is no following "a"), it backtracks to match all but the last character, +then all but the last two characters, and so on. Once again the search for "a" +covers the entire string, from right to left, so we are no better off. However, +if the pattern is written as +.sp + ^.*+(?<=abcd) +.sp +there can be no backtracking for the .*+ item; it can match only the entire +string. The subsequent lookbehind assertion does a single test on the last four +characters. If it fails, the match fails immediately. For long strings, this +approach makes a significant difference to the processing time. +. +. +.SS "Using multiple assertions" +.rs +.sp +Several assertions (of any sort) may occur in succession. For example, +.sp + (?<=\ed{3})(? +.SH "CONDITIONAL SUBPATTERNS" +.rs +.sp +It is possible to cause the matching process to obey a subpattern +conditionally or to choose between two alternative subpatterns, depending on +the result of an assertion, or whether a specific capturing subpattern has +already been matched. The two possible forms of conditional subpattern are: +.sp + (?(condition)yes-pattern) + (?(condition)yes-pattern|no-pattern) +.sp +If the condition is satisfied, the yes-pattern is used; otherwise the +no-pattern (if present) is used. If there are more than two alternatives in the +subpattern, a compile-time error occurs. Each of the two alternatives may +itself contain nested subpatterns of any form, including conditional +subpatterns; the restriction to two alternatives applies only at the level of +the condition. This pattern fragment is an example where the alternatives are +complex: +.sp + (?(1) (A|B|C) | (D | (?(2)E|F) | E) ) +.sp +.P +There are four kinds of condition: references to subpatterns, references to +recursion, a pseudo-condition called DEFINE, and assertions. +. +.SS "Checking for a used subpattern by number" +.rs +.sp +If the text between the parentheses consists of a sequence of digits, the +condition is true if a capturing subpattern of that number has previously +matched. If there is more than one capturing subpattern with the same number +(see the earlier +.\" +.\" HTML +.\" +section about duplicate subpattern numbers), +.\" +the condition is true if any of them have matched. An alternative notation is +to precede the digits with a plus or minus sign. In this case, the subpattern +number is relative rather than absolute. The most recently opened parentheses +can be referenced by (?(-1), the next most recent by (?(-2), and so on. Inside +loops it can also make sense to refer to subsequent groups. The next +parentheses to be opened can be referenced as (?(+1), and so on. (The value +zero in any of these forms is not used; it provokes a compile-time error.) +.P +Consider the following pattern, which contains non-significant white space to +make it more readable (assume the PCRE_EXTENDED option) and to divide it into +three parts for ease of discussion: +.sp + ( \e( )? [^()]+ (?(1) \e) ) +.sp +The first part matches an optional opening parenthesis, and if that +character is present, sets it as the first captured substring. The second part +matches one or more characters that are not parentheses. The third part is a +conditional subpattern that tests whether or not the first set of parentheses +matched. If they did, that is, if subject started with an opening parenthesis, +the condition is true, and so the yes-pattern is executed and a closing +parenthesis is required. Otherwise, since no-pattern is not present, the +subpattern matches nothing. In other words, this pattern matches a sequence of +non-parentheses, optionally enclosed in parentheses. +.P +If you were embedding this pattern in a larger one, you could use a relative +reference: +.sp + ...other stuff... ( \e( )? [^()]+ (?(-1) \e) ) ... +.sp +This makes the fragment independent of the parentheses in the larger pattern. +. +.SS "Checking for a used subpattern by name" +.rs +.sp +Perl uses the syntax (?()...) or (?('name')...) to test for a used +subpattern by name. For compatibility with earlier versions of PCRE, which had +this facility before Perl, the syntax (?(name)...) is also recognized. +.P +Rewriting the above example to use a named subpattern gives this: +.sp + (? \e( )? [^()]+ (?() \e) ) +.sp +If the name used in a condition of this kind is a duplicate, the test is +applied to all subpatterns of the same name, and is true if any one of them has +matched. +. +.SS "Checking for pattern recursion" +.rs +.sp +If the condition is the string (R), and there is no subpattern with the name R, +the condition is true if a recursive call to the whole pattern or any +subpattern has been made. If digits or a name preceded by ampersand follow the +letter R, for example: +.sp + (?(R3)...) or (?(R&name)...) +.sp +the condition is true if the most recent recursion is into a subpattern whose +number or name is given. This condition does not check the entire recursion +stack. If the name used in a condition of this kind is a duplicate, the test is +applied to all subpatterns of the same name, and is true if any one of them is +the most recent recursion. +.P +At "top level", all these recursion test conditions are false. +.\" HTML +.\" +The syntax for recursive patterns +.\" +is described below. +. +.\" HTML +.SS "Defining subpatterns for use by reference only" +.rs +.sp +If the condition is the string (DEFINE), and there is no subpattern with the +name DEFINE, the condition is always false. In this case, there may be only one +alternative in the subpattern. It is always skipped if control reaches this +point in the pattern; the idea of DEFINE is that it can be used to define +subroutines that can be referenced from elsewhere. (The use of +.\" HTML +.\" +subroutines +.\" +is described below.) For example, a pattern to match an IPv4 address such as +"192.168.23.245" could be written like this (ignore white space and line +breaks): +.sp + (?(DEFINE) (? 2[0-4]\ed | 25[0-5] | 1\ed\ed | [1-9]?\ed) ) + \eb (?&byte) (\e.(?&byte)){3} \eb +.sp +The first part of the pattern is a DEFINE group inside which a another group +named "byte" is defined. This matches an individual component of an IPv4 +address (a number less than 256). When matching takes place, this part of the +pattern is skipped because DEFINE acts like a false condition. The rest of the +pattern uses references to the named group to match the four dot-separated +components of an IPv4 address, insisting on a word boundary at each end. +. +.SS "Assertion conditions" +.rs +.sp +If the condition is not in any of the above formats, it must be an assertion. +This may be a positive or negative lookahead or lookbehind assertion. Consider +this pattern, again containing non-significant white space, and with the two +alternatives on the second line: +.sp + (?(?=[^a-z]*[a-z]) + \ed{2}-[a-z]{3}-\ed{2} | \ed{2}-\ed{2}-\ed{2} ) +.sp +The condition is a positive lookahead assertion that matches an optional +sequence of non-letters followed by a letter. In other words, it tests for the +presence of at least one letter in the subject. If a letter is found, the +subject is matched against the first alternative; otherwise it is matched +against the second. This pattern matches strings in one of the two forms +dd-aaa-dd or dd-dd-dd, where aaa are letters and dd are digits. +. +. +.\" HTML +.SH COMMENTS +.rs +.sp +There are two ways of including comments in patterns that are processed by +PCRE. In both cases, the start of the comment must not be in a character class, +nor in the middle of any other sequence of related characters such as (?: or a +subpattern name or number. The characters that make up a comment play no part +in the pattern matching. +.P +The sequence (?# marks the start of a comment that continues up to the next +closing parenthesis. Nested parentheses are not permitted. If the PCRE_EXTENDED +option is set, an unescaped # character also introduces a comment, which in +this case continues to immediately after the next newline character or +character sequence in the pattern. Which characters are interpreted as newlines +is controlled by the options passed to a compiling function or by a special +sequence at the start of the pattern, as described in the section entitled +.\" HTML +.\" +"Newline conventions" +.\" +above. Note that the end of this type of comment is a literal newline sequence +in the pattern; escape sequences that happen to represent a newline do not +count. For example, consider this pattern when PCRE_EXTENDED is set, and the +default newline convention is in force: +.sp + abc #comment \en still comment +.sp +On encountering the # character, \fBpcre_compile()\fP skips along, looking for +a newline in the pattern. The sequence \en is still literal at this stage, so +it does not terminate the comment. Only an actual character with the code value +0x0a (the default newline) does so. +. +. +.\" HTML +.SH "RECURSIVE PATTERNS" +.rs +.sp +Consider the problem of matching a string in parentheses, allowing for +unlimited nested parentheses. Without the use of recursion, the best that can +be done is to use a pattern that matches up to some fixed depth of nesting. It +is not possible to handle an arbitrary nesting depth. +.P +For some time, Perl has provided a facility that allows regular expressions to +recurse (amongst other things). It does this by interpolating Perl code in the +expression at run time, and the code can refer to the expression itself. A Perl +pattern using code interpolation to solve the parentheses problem can be +created like this: +.sp + $re = qr{\e( (?: (?>[^()]+) | (?p{$re}) )* \e)}x; +.sp +The (?p{...}) item interpolates Perl code at run time, and in this case refers +recursively to the pattern in which it appears. +.P +Obviously, PCRE cannot support the interpolation of Perl code. Instead, it +supports special syntax for recursion of the entire pattern, and also for +individual subpattern recursion. After its introduction in PCRE and Python, +this kind of recursion was subsequently introduced into Perl at release 5.10. +.P +A special item that consists of (? followed by a number greater than zero and a +closing parenthesis is a recursive subroutine call of the subpattern of the +given number, provided that it occurs inside that subpattern. (If not, it is a +.\" HTML +.\" +non-recursive subroutine +.\" +call, which is described in the next section.) The special item (?R) or (?0) is +a recursive call of the entire regular expression. +.P +This PCRE pattern solves the nested parentheses problem (assume the +PCRE_EXTENDED option is set so that white space is ignored): +.sp + \e( ( [^()]++ | (?R) )* \e) +.sp +First it matches an opening parenthesis. Then it matches any number of +substrings which can either be a sequence of non-parentheses, or a recursive +match of the pattern itself (that is, a correctly parenthesized substring). +Finally there is a closing parenthesis. Note the use of a possessive quantifier +to avoid backtracking into sequences of non-parentheses. +.P +If this were part of a larger pattern, you would not want to recurse the entire +pattern, so instead you could use this: +.sp + ( \e( ( [^()]++ | (?1) )* \e) ) +.sp +We have put the pattern into parentheses, and caused the recursion to refer to +them instead of the whole pattern. +.P +In a larger pattern, keeping track of parenthesis numbers can be tricky. This +is made easier by the use of relative references. Instead of (?1) in the +pattern above you can write (?-2) to refer to the second most recently opened +parentheses preceding the recursion. In other words, a negative number counts +capturing parentheses leftwards from the point at which it is encountered. +.P +It is also possible to refer to subsequently opened parentheses, by writing +references such as (?+2). However, these cannot be recursive because the +reference is not inside the parentheses that are referenced. They are always +.\" HTML +.\" +non-recursive subroutine +.\" +calls, as described in the next section. +.P +An alternative approach is to use named parentheses instead. The Perl syntax +for this is (?&name); PCRE's earlier syntax (?P>name) is also supported. We +could rewrite the above example as follows: +.sp + (? \e( ( [^()]++ | (?&pn) )* \e) ) +.sp +If there is more than one subpattern with the same name, the earliest one is +used. +.P +This particular example pattern that we have been looking at contains nested +unlimited repeats, and so the use of a possessive quantifier for matching +strings of non-parentheses is important when applying the pattern to strings +that do not match. For example, when this pattern is applied to +.sp + (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa() +.sp +it yields "no match" quickly. However, if a possessive quantifier is not used, +the match runs for a very long time indeed because there are so many different +ways the + and * repeats can carve up the subject, and all have to be tested +before failure can be reported. +.P +At the end of a match, the values of capturing parentheses are those from +the outermost level. If you want to obtain intermediate values, a callout +function can be used (see below and the +.\" HREF +\fBpcrecallout\fP +.\" +documentation). If the pattern above is matched against +.sp + (ab(cd)ef) +.sp +the value for the inner capturing parentheses (numbered 2) is "ef", which is +the last value taken on at the top level. If a capturing subpattern is not +matched at the top level, its final captured value is unset, even if it was +(temporarily) set at a deeper level during the matching process. +.P +If there are more than 15 capturing parentheses in a pattern, PCRE has to +obtain extra memory to store data during a recursion, which it does by using +\fBpcre_malloc\fP, freeing it via \fBpcre_free\fP afterwards. If no memory can +be obtained, the match fails with the PCRE_ERROR_NOMEMORY error. +.P +Do not confuse the (?R) item with the condition (R), which tests for recursion. +Consider this pattern, which matches text in angle brackets, allowing for +arbitrary nesting. Only digits are allowed in nested brackets (that is, when +recursing), whereas any characters are permitted at the outer level. +.sp + < (?: (?(R) \ed++ | [^<>]*+) | (?R)) * > +.sp +In this pattern, (?(R) is the start of a conditional subpattern, with two +different alternatives for the recursive and non-recursive cases. The (?R) item +is the actual recursive call. +. +. +.\" HTML +.SS "Differences in recursion processing between PCRE and Perl" +.rs +.sp +Recursion processing in PCRE differs from Perl in two important ways. In PCRE +(like Python, but unlike Perl), a recursive subpattern call is always treated +as an atomic group. That is, once it has matched some of the subject string, it +is never re-entered, even if it contains untried alternatives and there is a +subsequent matching failure. This can be illustrated by the following pattern, +which purports to match a palindromic string that contains an odd number of +characters (for example, "a", "aba", "abcba", "abcdcba"): +.sp + ^(.|(.)(?1)\e2)$ +.sp +The idea is that it either matches a single character, or two identical +characters surrounding a sub-palindrome. In Perl, this pattern works; in PCRE +it does not if the pattern is longer than three characters. Consider the +subject string "abcba": +.P +At the top level, the first character is matched, but as it is not at the end +of the string, the first alternative fails; the second alternative is taken +and the recursion kicks in. The recursive call to subpattern 1 successfully +matches the next character ("b"). (Note that the beginning and end of line +tests are not part of the recursion). +.P +Back at the top level, the next character ("c") is compared with what +subpattern 2 matched, which was "a". This fails. Because the recursion is +treated as an atomic group, there are now no backtracking points, and so the +entire match fails. (Perl is able, at this point, to re-enter the recursion and +try the second alternative.) However, if the pattern is written with the +alternatives in the other order, things are different: +.sp + ^((.)(?1)\e2|.)$ +.sp +This time, the recursing alternative is tried first, and continues to recurse +until it runs out of characters, at which point the recursion fails. But this +time we do have another alternative to try at the higher level. That is the big +difference: in the previous case the remaining alternative is at a deeper +recursion level, which PCRE cannot use. +.P +To change the pattern so that it matches all palindromic strings, not just +those with an odd number of characters, it is tempting to change the pattern to +this: +.sp + ^((.)(?1)\e2|.?)$ +.sp +Again, this works in Perl, but not in PCRE, and for the same reason. When a +deeper recursion has matched a single character, it cannot be entered again in +order to match an empty string. The solution is to separate the two cases, and +write out the odd and even cases as alternatives at the higher level: +.sp + ^(?:((.)(?1)\e2|)|((.)(?3)\e4|.)) +.sp +If you want to match typical palindromic phrases, the pattern has to ignore all +non-word characters, which can be done like this: +.sp + ^\eW*+(?:((.)\eW*+(?1)\eW*+\e2|)|((.)\eW*+(?3)\eW*+\e4|\eW*+.\eW*+))\eW*+$ +.sp +If run with the PCRE_CASELESS option, this pattern matches phrases such as "A +man, a plan, a canal: Panama!" and it works well in both PCRE and Perl. Note +the use of the possessive quantifier *+ to avoid backtracking into sequences of +non-word characters. Without this, PCRE takes a great deal longer (ten times or +more) to match typical phrases, and Perl takes so long that you think it has +gone into a loop. +.P +\fBWARNING\fP: The palindrome-matching patterns above work only if the subject +string does not start with a palindrome that is shorter than the entire string. +For example, although "abcba" is correctly matched, if the subject is "ababa", +PCRE finds the palindrome "aba" at the start, then fails at top level because +the end of the string does not follow. Once again, it cannot jump back into the +recursion to try other alternatives, so the entire match fails. +.P +The second way in which PCRE and Perl differ in their recursion processing is +in the handling of captured values. In Perl, when a subpattern is called +recursively or as a subpattern (see the next section), it has no access to any +values that were captured outside the recursion, whereas in PCRE these values +can be referenced. Consider this pattern: +.sp + ^(.)(\e1|a(?2)) +.sp +In PCRE, this pattern matches "bab". The first capturing parentheses match "b", +then in the second group, when the back reference \e1 fails to match "b", the +second alternative matches "a" and then recurses. In the recursion, \e1 does +now match "b" and so the whole match succeeds. In Perl, the pattern fails to +match because inside the recursive call \e1 cannot access the externally set +value. +. +. +.\" HTML +.SH "SUBPATTERNS AS SUBROUTINES" +.rs +.sp +If the syntax for a recursive subpattern call (either by number or by +name) is used outside the parentheses to which it refers, it operates like a +subroutine in a programming language. The called subpattern may be defined +before or after the reference. A numbered reference can be absolute or +relative, as in these examples: +.sp + (...(absolute)...)...(?2)... + (...(relative)...)...(?-1)... + (...(?+1)...(relative)... +.sp +An earlier example pointed out that the pattern +.sp + (sens|respons)e and \e1ibility +.sp +matches "sense and sensibility" and "response and responsibility", but not +"sense and responsibility". If instead the pattern +.sp + (sens|respons)e and (?1)ibility +.sp +is used, it does match "sense and responsibility" as well as the other two +strings. Another example is given in the discussion of DEFINE above. +.P +All subroutine calls, whether recursive or not, are always treated as atomic +groups. That is, once a subroutine has matched some of the subject string, it +is never re-entered, even if it contains untried alternatives and there is a +subsequent matching failure. Any capturing parentheses that are set during the +subroutine call revert to their previous values afterwards. +.P +Processing options such as case-independence are fixed when a subpattern is +defined, so if it is used as a subroutine, such options cannot be changed for +different calls. For example, consider this pattern: +.sp + (abc)(?i:(?-1)) +.sp +It matches "abcabc". It does not match "abcABC" because the change of +processing option does not affect the called subpattern. +. +. +.\" HTML +.SH "ONIGURUMA SUBROUTINE SYNTAX" +.rs +.sp +For compatibility with Oniguruma, the non-Perl syntax \eg followed by a name or +a number enclosed either in angle brackets or single quotes, is an alternative +syntax for referencing a subpattern as a subroutine, possibly recursively. Here +are two of the examples used above, rewritten using this syntax: +.sp + (? \e( ( (?>[^()]+) | \eg )* \e) ) + (sens|respons)e and \eg'1'ibility +.sp +PCRE supports an extension to Oniguruma: if a number is preceded by a +plus or a minus sign it is taken as a relative reference. For example: +.sp + (abc)(?i:\eg<-1>) +.sp +Note that \eg{...} (Perl syntax) and \eg<...> (Oniguruma syntax) are \fInot\fP +synonymous. The former is a back reference; the latter is a subroutine call. +. +. +.SH CALLOUTS +.rs +.sp +Perl has a feature whereby using the sequence (?{...}) causes arbitrary Perl +code to be obeyed in the middle of matching a regular expression. This makes it +possible, amongst other things, to extract different substrings that match the +same pair of parentheses when there is a repetition. +.P +PCRE provides a similar feature, but of course it cannot obey arbitrary Perl +code. The feature is called "callout". The caller of PCRE provides an external +function by putting its entry point in the global variable \fIpcre_callout\fP +(8-bit library) or \fIpcre[16|32]_callout\fP (16-bit or 32-bit library). +By default, this variable contains NULL, which disables all calling out. +.P +Within a regular expression, (?C) indicates the points at which the external +function is to be called. If you want to identify different callout points, you +can put a number less than 256 after the letter C. The default value is zero. +For example, this pattern has two callout points: +.sp + (?C1)abc(?C2)def +.sp +If the PCRE_AUTO_CALLOUT flag is passed to a compiling function, callouts are +automatically installed before each item in the pattern. They are all numbered +255. If there is a conditional group in the pattern whose condition is an +assertion, an additional callout is inserted just before the condition. An +explicit callout may also be set at this position, as in this example: +.sp + (?(?C9)(?=a)abc|def) +.sp +Note that this applies only to assertion conditions, not to other types of +condition. +.P +During matching, when PCRE reaches a callout point, the external function is +called. It is provided with the number of the callout, the position in the +pattern, and, optionally, one item of data originally supplied by the caller of +the matching function. The callout function may cause matching to proceed, to +backtrack, or to fail altogether. +.P +By default, PCRE implements a number of optimizations at compile time and +matching time, and one side-effect is that sometimes callouts are skipped. If +you need all possible callouts to happen, you need to set options that disable +the relevant optimizations. More details, and a complete description of the +interface to the callout function, are given in the +.\" HREF +\fBpcrecallout\fP +.\" +documentation. +. +. +.\" HTML +.SH "BACKTRACKING CONTROL" +.rs +.sp +Perl 5.10 introduced a number of "Special Backtracking Control Verbs", which +are still described in the Perl documentation as "experimental and subject to +change or removal in a future version of Perl". It goes on to say: "Their usage +in production code should be noted to avoid problems during upgrades." The same +remarks apply to the PCRE features described in this section. +.P +The new verbs make use of what was previously invalid syntax: an opening +parenthesis followed by an asterisk. They are generally of the form +(*VERB) or (*VERB:NAME). Some may take either form, possibly behaving +differently depending on whether or not a name is present. A name is any +sequence of characters that does not include a closing parenthesis. The maximum +length of name is 255 in the 8-bit library and 65535 in the 16-bit and 32-bit +libraries. If the name is empty, that is, if the closing parenthesis +immediately follows the colon, the effect is as if the colon were not there. +Any number of these verbs may occur in a pattern. +.P +Since these verbs are specifically related to backtracking, most of them can be +used only when the pattern is to be matched using one of the traditional +matching functions, because these use a backtracking algorithm. With the +exception of (*FAIL), which behaves like a failing negative assertion, the +backtracking control verbs cause an error if encountered by a DFA matching +function. +.P +The behaviour of these verbs in +.\" HTML +.\" +repeated groups, +.\" +.\" HTML +.\" +assertions, +.\" +and in +.\" HTML +.\" +subpatterns called as subroutines +.\" +(whether or not recursively) is documented below. +. +. +.\" HTML +.SS "Optimizations that affect backtracking verbs" +.rs +.sp +PCRE contains some optimizations that are used to speed up matching by running +some checks at the start of each match attempt. For example, it may know the +minimum length of matching subject, or that a particular character must be +present. When one of these optimizations bypasses the running of a match, any +included backtracking verbs will not, of course, be processed. You can suppress +the start-of-match optimizations by setting the PCRE_NO_START_OPTIMIZE option +when calling \fBpcre_compile()\fP or \fBpcre_exec()\fP, or by starting the +pattern with (*NO_START_OPT). There is more discussion of this option in the +section entitled +.\" HTML +.\" +"Option bits for \fBpcre_exec()\fP" +.\" +in the +.\" HREF +\fBpcreapi\fP +.\" +documentation. +.P +Experiments with Perl suggest that it too has similar optimizations, sometimes +leading to anomalous results. +. +. +.SS "Verbs that act immediately" +.rs +.sp +The following verbs act as soon as they are encountered. They may not be +followed by a name. +.sp + (*ACCEPT) +.sp +This verb causes the match to end successfully, skipping the remainder of the +pattern. However, when it is inside a subpattern that is called as a +subroutine, only that subpattern is ended successfully. Matching then continues +at the outer level. If (*ACCEPT) in triggered in a positive assertion, the +assertion succeeds; in a negative assertion, the assertion fails. +.P +If (*ACCEPT) is inside capturing parentheses, the data so far is captured. For +example: +.sp + A((?:A|B(*ACCEPT)|C)D) +.sp +This matches "AB", "AAD", or "ACD"; when it matches "AB", "B" is captured by +the outer parentheses. +.sp + (*FAIL) or (*F) +.sp +This verb causes a matching failure, forcing backtracking to occur. It is +equivalent to (?!) but easier to read. The Perl documentation notes that it is +probably useful only when combined with (?{}) or (??{}). Those are, of course, +Perl features that are not present in PCRE. The nearest equivalent is the +callout feature, as for example in this pattern: +.sp + a+(?C)(*FAIL) +.sp +A match with the string "aaaa" always fails, but the callout is taken before +each backtrack happens (in this example, 10 times). +. +. +.SS "Recording which path was taken" +.rs +.sp +There is one verb whose main purpose is to track how a match was arrived at, +though it also has a secondary use in conjunction with advancing the match +starting point (see (*SKIP) below). +.sp + (*MARK:NAME) or (*:NAME) +.sp +A name is always required with this verb. There may be as many instances of +(*MARK) as you like in a pattern, and their names do not have to be unique. +.P +When a match succeeds, the name of the last-encountered (*MARK:NAME), +(*PRUNE:NAME), or (*THEN:NAME) on the matching path is passed back to the +caller as described in the section entitled +.\" HTML +.\" +"Extra data for \fBpcre_exec()\fP" +.\" +in the +.\" HREF +\fBpcreapi\fP +.\" +documentation. Here is an example of \fBpcretest\fP output, where the /K +modifier requests the retrieval and outputting of (*MARK) data: +.sp + re> /X(*MARK:A)Y|X(*MARK:B)Z/K + data> XY + 0: XY + MK: A + XZ + 0: XZ + MK: B +.sp +The (*MARK) name is tagged with "MK:" in this output, and in this example it +indicates which of the two alternatives matched. This is a more efficient way +of obtaining this information than putting each alternative in its own +capturing parentheses. +.P +If a verb with a name is encountered in a positive assertion that is true, the +name is recorded and passed back if it is the last-encountered. This does not +happen for negative assertions or failing positive assertions. +.P +After a partial match or a failed match, the last encountered name in the +entire match process is returned. For example: +.sp + re> /X(*MARK:A)Y|X(*MARK:B)Z/K + data> XP + No match, mark = B +.sp +Note that in this unanchored example the mark is retained from the match +attempt that started at the letter "X" in the subject. Subsequent match +attempts starting at "P" and then with an empty string do not get as far as the +(*MARK) item, but nevertheless do not reset it. +.P +If you are interested in (*MARK) values after failed matches, you should +probably set the PCRE_NO_START_OPTIMIZE option +.\" HTML +.\" +(see above) +.\" +to ensure that the match is always attempted. +. +. +.SS "Verbs that act after backtracking" +.rs +.sp +The following verbs do nothing when they are encountered. Matching continues +with what follows, but if there is no subsequent match, causing a backtrack to +the verb, a failure is forced. That is, backtracking cannot pass to the left of +the verb. However, when one of these verbs appears inside an atomic group or an +assertion that is true, its effect is confined to that group, because once the +group has been matched, there is never any backtracking into it. In this +situation, backtracking can "jump back" to the left of the entire atomic group +or assertion. (Remember also, as stated above, that this localization also +applies in subroutine calls.) +.P +These verbs differ in exactly what kind of failure occurs when backtracking +reaches them. The behaviour described below is what happens when the verb is +not in a subroutine or an assertion. Subsequent sections cover these special +cases. +.sp + (*COMMIT) +.sp +This verb, which may not be followed by a name, causes the whole match to fail +outright if there is a later matching failure that causes backtracking to reach +it. Even if the pattern is unanchored, no further attempts to find a match by +advancing the starting point take place. If (*COMMIT) is the only backtracking +verb that is encountered, once it has been passed \fBpcre_exec()\fP is +committed to finding a match at the current starting point, or not at all. For +example: +.sp + a+(*COMMIT)b +.sp +This matches "xxaab" but not "aacaab". It can be thought of as a kind of +dynamic anchor, or "I've started, so I must finish." The name of the most +recently passed (*MARK) in the path is passed back when (*COMMIT) forces a +match failure. +.P +If there is more than one backtracking verb in a pattern, a different one that +follows (*COMMIT) may be triggered first, so merely passing (*COMMIT) during a +match does not always guarantee that a match must be at this starting point. +.P +Note that (*COMMIT) at the start of a pattern is not the same as an anchor, +unless PCRE's start-of-match optimizations are turned off, as shown in this +output from \fBpcretest\fP: +.sp + re> /(*COMMIT)abc/ + data> xyzabc + 0: abc + data> xyzabc\eY + No match +.sp +For this pattern, PCRE knows that any match must start with "a", so the +optimization skips along the subject to "a" before applying the pattern to the +first set of data. The match attempt then succeeds. In the second set of data, +the escape sequence \eY is interpreted by the \fBpcretest\fP program. It causes +the PCRE_NO_START_OPTIMIZE option to be set when \fBpcre_exec()\fP is called. +This disables the optimization that skips along to the first character. The +pattern is now applied starting at "x", and so the (*COMMIT) causes the match +to fail without trying any other starting points. +.sp + (*PRUNE) or (*PRUNE:NAME) +.sp +This verb causes the match to fail at the current starting position in the +subject if there is a later matching failure that causes backtracking to reach +it. If the pattern is unanchored, the normal "bumpalong" advance to the next +starting character then happens. Backtracking can occur as usual to the left of +(*PRUNE), before it is reached, or when matching to the right of (*PRUNE), but +if there is no match to the right, backtracking cannot cross (*PRUNE). In +simple cases, the use of (*PRUNE) is just an alternative to an atomic group or +possessive quantifier, but there are some uses of (*PRUNE) that cannot be +expressed in any other way. In an anchored pattern (*PRUNE) has the same effect +as (*COMMIT). +.P +The behaviour of (*PRUNE:NAME) is the not the same as (*MARK:NAME)(*PRUNE). +It is like (*MARK:NAME) in that the name is remembered for passing back to the +caller. However, (*SKIP:NAME) searches only for names set with (*MARK). +.sp + (*SKIP) +.sp +This verb, when given without a name, is like (*PRUNE), except that if the +pattern is unanchored, the "bumpalong" advance is not to the next character, +but to the position in the subject where (*SKIP) was encountered. (*SKIP) +signifies that whatever text was matched leading up to it cannot be part of a +successful match. Consider: +.sp + a+(*SKIP)b +.sp +If the subject is "aaaac...", after the first match attempt fails (starting at +the first character in the string), the starting point skips on to start the +next attempt at "c". Note that a possessive quantifer does not have the same +effect as this example; although it would suppress backtracking during the +first match attempt, the second attempt would start at the second character +instead of skipping on to "c". +.sp + (*SKIP:NAME) +.sp +When (*SKIP) has an associated name, its behaviour is modified. When it is +triggered, the previous path through the pattern is searched for the most +recent (*MARK) that has the same name. If one is found, the "bumpalong" advance +is to the subject position that corresponds to that (*MARK) instead of to where +(*SKIP) was encountered. If no (*MARK) with a matching name is found, the +(*SKIP) is ignored. +.P +Note that (*SKIP:NAME) searches only for names set by (*MARK:NAME). It ignores +names that are set by (*PRUNE:NAME) or (*THEN:NAME). +.sp + (*THEN) or (*THEN:NAME) +.sp +This verb causes a skip to the next innermost alternative when backtracking +reaches it. That is, it cancels any further backtracking within the current +alternative. Its name comes from the observation that it can be used for a +pattern-based if-then-else block: +.sp + ( COND1 (*THEN) FOO | COND2 (*THEN) BAR | COND3 (*THEN) BAZ ) ... +.sp +If the COND1 pattern matches, FOO is tried (and possibly further items after +the end of the group if FOO succeeds); on failure, the matcher skips to the +second alternative and tries COND2, without backtracking into COND1. If that +succeeds and BAR fails, COND3 is tried. If subsequently BAZ fails, there are no +more alternatives, so there is a backtrack to whatever came before the entire +group. If (*THEN) is not inside an alternation, it acts like (*PRUNE). +.P +The behaviour of (*THEN:NAME) is the not the same as (*MARK:NAME)(*THEN). +It is like (*MARK:NAME) in that the name is remembered for passing back to the +caller. However, (*SKIP:NAME) searches only for names set with (*MARK). +.P +A subpattern that does not contain a | character is just a part of the +enclosing alternative; it is not a nested alternation with only one +alternative. The effect of (*THEN) extends beyond such a subpattern to the +enclosing alternative. Consider this pattern, where A, B, etc. are complex +pattern fragments that do not contain any | characters at this level: +.sp + A (B(*THEN)C) | D +.sp +If A and B are matched, but there is a failure in C, matching does not +backtrack into A; instead it moves to the next alternative, that is, D. +However, if the subpattern containing (*THEN) is given an alternative, it +behaves differently: +.sp + A (B(*THEN)C | (*FAIL)) | D +.sp +The effect of (*THEN) is now confined to the inner subpattern. After a failure +in C, matching moves to (*FAIL), which causes the whole subpattern to fail +because there are no more alternatives to try. In this case, matching does now +backtrack into A. +.P +Note that a conditional subpattern is not considered as having two +alternatives, because only one is ever used. In other words, the | character in +a conditional subpattern has a different meaning. Ignoring white space, +consider: +.sp + ^.*? (?(?=a) a | b(*THEN)c ) +.sp +If the subject is "ba", this pattern does not match. Because .*? is ungreedy, +it initially matches zero characters. The condition (?=a) then fails, the +character "b" is matched, but "c" is not. At this point, matching does not +backtrack to .*? as might perhaps be expected from the presence of the | +character. The conditional subpattern is part of the single alternative that +comprises the whole pattern, and so the match fails. (If there was a backtrack +into .*?, allowing it to match "b", the match would succeed.) +.P +The verbs just described provide four different "strengths" of control when +subsequent matching fails. (*THEN) is the weakest, carrying on the match at the +next alternative. (*PRUNE) comes next, failing the match at the current +starting position, but allowing an advance to the next character (for an +unanchored pattern). (*SKIP) is similar, except that the advance may be more +than one character. (*COMMIT) is the strongest, causing the entire match to +fail. +. +. +.SS "More than one backtracking verb" +.rs +.sp +If more than one backtracking verb is present in a pattern, the one that is +backtracked onto first acts. For example, consider this pattern, where A, B, +etc. are complex pattern fragments: +.sp + (A(*COMMIT)B(*THEN)C|ABD) +.sp +If A matches but B fails, the backtrack to (*COMMIT) causes the entire match to +fail. However, if A and B match, but C fails, the backtrack to (*THEN) causes +the next alternative (ABD) to be tried. This behaviour is consistent, but is +not always the same as Perl's. It means that if two or more backtracking verbs +appear in succession, all the the last of them has no effect. Consider this +example: +.sp + ...(*COMMIT)(*PRUNE)... +.sp +If there is a matching failure to the right, backtracking onto (*PRUNE) causes +it to be triggered, and its action is taken. There can never be a backtrack +onto (*COMMIT). +. +. +.\" HTML +.SS "Backtracking verbs in repeated groups" +.rs +.sp +PCRE differs from Perl in its handling of backtracking verbs in repeated +groups. For example, consider: +.sp + /(a(*COMMIT)b)+ac/ +.sp +If the subject is "abac", Perl matches, but PCRE fails because the (*COMMIT) in +the second repeat of the group acts. +. +. +.\" HTML +.SS "Backtracking verbs in assertions" +.rs +.sp +(*FAIL) in an assertion has its normal effect: it forces an immediate backtrack. +.P +(*ACCEPT) in a positive assertion causes the assertion to succeed without any +further processing. In a negative assertion, (*ACCEPT) causes the assertion to +fail without any further processing. +.P +The other backtracking verbs are not treated specially if they appear in a +positive assertion. In particular, (*THEN) skips to the next alternative in the +innermost enclosing group that has alternations, whether or not this is within +the assertion. +.P +Negative assertions are, however, different, in order to ensure that changing a +positive assertion into a negative assertion changes its result. Backtracking +into (*COMMIT), (*SKIP), or (*PRUNE) causes a negative assertion to be true, +without considering any further alternative branches in the assertion. +Backtracking into (*THEN) causes it to skip to the next enclosing alternative +within the assertion (the normal behaviour), but if the assertion does not have +such an alternative, (*THEN) behaves like (*PRUNE). +. +. +.\" HTML +.SS "Backtracking verbs in subroutines" +.rs +.sp +These behaviours occur whether or not the subpattern is called recursively. +Perl's treatment of subroutines is different in some cases. +.P +(*FAIL) in a subpattern called as a subroutine has its normal effect: it forces +an immediate backtrack. +.P +(*ACCEPT) in a subpattern called as a subroutine causes the subroutine match to +succeed without any further processing. Matching then continues after the +subroutine call. +.P +(*COMMIT), (*SKIP), and (*PRUNE) in a subpattern called as a subroutine cause +the subroutine match to fail. +.P +(*THEN) skips to the next alternative in the innermost enclosing group within +the subpattern that has alternatives. If there is no such group within the +subpattern, (*THEN) causes the subroutine match to fail. +. +. +.SH "SEE ALSO" +.rs +.sp +\fBpcreapi\fP(3), \fBpcrecallout\fP(3), \fBpcrematching\fP(3), +\fBpcresyntax\fP(3), \fBpcre\fP(3), \fBpcre16(3)\fP, \fBpcre32(3)\fP. +. +. +.SH AUTHOR +.rs +.sp +.nf +Philip Hazel +University Computing Service +Cambridge CB2 3QH, England. +.fi +. +. +.SH REVISION +.rs +.sp +.nf +Last updated: 23 October 2016 +Copyright (c) 1997-2016 University of Cambridge. +.fi diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcreperform.3 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcreperform.3 new file mode 100755 index 000000000..fb2aa9592 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcreperform.3 @@ -0,0 +1,177 @@ +.TH PCREPERFORM 3 "09 January 2012" "PCRE 8.30" +.SH NAME +PCRE - Perl-compatible regular expressions +.SH "PCRE PERFORMANCE" +.rs +.sp +Two aspects of performance are discussed below: memory usage and processing +time. The way you express your pattern as a regular expression can affect both +of them. +. +.SH "COMPILED PATTERN MEMORY USAGE" +.rs +.sp +Patterns are compiled by PCRE into a reasonably efficient interpretive code, so +that most simple patterns do not use much memory. However, there is one case +where the memory usage of a compiled pattern can be unexpectedly large. If a +parenthesized subpattern has a quantifier with a minimum greater than 1 and/or +a limited maximum, the whole subpattern is repeated in the compiled code. For +example, the pattern +.sp + (abc|def){2,4} +.sp +is compiled as if it were +.sp + (abc|def)(abc|def)((abc|def)(abc|def)?)? +.sp +(Technical aside: It is done this way so that backtrack points within each of +the repetitions can be independently maintained.) +.P +For regular expressions whose quantifiers use only small numbers, this is not +usually a problem. However, if the numbers are large, and particularly if such +repetitions are nested, the memory usage can become an embarrassment. For +example, the very simple pattern +.sp + ((ab){1,1000}c){1,3} +.sp +uses 51K bytes when compiled using the 8-bit library. When PCRE is compiled +with its default internal pointer size of two bytes, the size limit on a +compiled pattern is 64K data units, and this is reached with the above pattern +if the outer repetition is increased from 3 to 4. PCRE can be compiled to use +larger internal pointers and thus handle larger compiled patterns, but it is +better to try to rewrite your pattern to use less memory if you can. +.P +One way of reducing the memory usage for such patterns is to make use of PCRE's +.\" HTML +.\" +"subroutine" +.\" +facility. Re-writing the above pattern as +.sp + ((ab)(?2){0,999}c)(?1){0,2} +.sp +reduces the memory requirements to 18K, and indeed it remains under 20K even +with the outer repetition increased to 100. However, this pattern is not +exactly equivalent, because the "subroutine" calls are treated as +.\" HTML +.\" +atomic groups +.\" +into which there can be no backtracking if there is a subsequent matching +failure. Therefore, PCRE cannot do this kind of rewriting automatically. +Furthermore, there is a noticeable loss of speed when executing the modified +pattern. Nevertheless, if the atomic grouping is not a problem and the loss of +speed is acceptable, this kind of rewriting will allow you to process patterns +that PCRE cannot otherwise handle. +. +. +.SH "STACK USAGE AT RUN TIME" +.rs +.sp +When \fBpcre_exec()\fP or \fBpcre[16|32]_exec()\fP is used for matching, certain +kinds of pattern can cause it to use large amounts of the process stack. In +some environments the default process stack is quite small, and if it runs out +the result is often SIGSEGV. This issue is probably the most frequently raised +problem with PCRE. Rewriting your pattern can often help. The +.\" HREF +\fBpcrestack\fP +.\" +documentation discusses this issue in detail. +. +. +.SH "PROCESSING TIME" +.rs +.sp +Certain items in regular expression patterns are processed more efficiently +than others. It is more efficient to use a character class like [aeiou] than a +set of single-character alternatives such as (a|e|i|o|u). In general, the +simplest construction that provides the required behaviour is usually the most +efficient. Jeffrey Friedl's book contains a lot of useful general discussion +about optimizing regular expressions for efficient performance. This document +contains a few observations about PCRE. +.P +Using Unicode character properties (the \ep, \eP, and \eX escapes) is slow, +because PCRE has to use a multi-stage table lookup whenever it needs a +character's property. If you can find an alternative pattern that does not use +character properties, it will probably be faster. +.P +By default, the escape sequences \eb, \ed, \es, and \ew, and the POSIX +character classes such as [:alpha:] do not use Unicode properties, partly for +backwards compatibility, and partly for performance reasons. However, you can +set PCRE_UCP if you want Unicode character properties to be used. This can +double the matching time for items such as \ed, when matched with +a traditional matching function; the performance loss is less with +a DFA matching function, and in both cases there is not much difference for +\eb. +.P +When a pattern begins with .* not in parentheses, or in parentheses that are +not the subject of a backreference, and the PCRE_DOTALL option is set, the +pattern is implicitly anchored by PCRE, since it can match only at the start of +a subject string. However, if PCRE_DOTALL is not set, PCRE cannot make this +optimization, because the . metacharacter does not then match a newline, and if +the subject string contains newlines, the pattern may match from the character +immediately following one of them instead of from the very start. For example, +the pattern +.sp + .*second +.sp +matches the subject "first\enand second" (where \en stands for a newline +character), with the match starting at the seventh character. In order to do +this, PCRE has to retry the match starting after every newline in the subject. +.P +If you are using such a pattern with subject strings that do not contain +newlines, the best performance is obtained by setting PCRE_DOTALL, or starting +the pattern with ^.* or ^.*? to indicate explicit anchoring. That saves PCRE +from having to scan along the subject looking for a newline to restart at. +.P +Beware of patterns that contain nested indefinite repeats. These can take a +long time to run when applied to a string that does not match. Consider the +pattern fragment +.sp + ^(a+)* +.sp +This can match "aaaa" in 16 different ways, and this number increases very +rapidly as the string gets longer. (The * repeat can match 0, 1, 2, 3, or 4 +times, and for each of those cases other than 0 or 4, the + repeats can match +different numbers of times.) When the remainder of the pattern is such that the +entire match is going to fail, PCRE has in principle to try every possible +variation, and this can take an extremely long time, even for relatively short +strings. +.P +An optimization catches some of the more simple cases such as +.sp + (a+)*b +.sp +where a literal character follows. Before embarking on the standard matching +procedure, PCRE checks that there is a "b" later in the subject string, and if +there is not, it fails the match immediately. However, when there is no +following literal this optimization cannot be used. You can see the difference +by comparing the behaviour of +.sp + (a+)*\ed +.sp +with the pattern above. The former gives a failure almost instantly when +applied to a whole line of "a" characters, whereas the latter takes an +appreciable time with strings longer than about 20 characters. +.P +In many cases, the solution to this kind of performance issue is to use an +atomic group or a possessive quantifier. +. +. +.SH AUTHOR +.rs +.sp +.nf +Philip Hazel +University Computing Service +Cambridge CB2 3QH, England. +.fi +. +. +.SH REVISION +.rs +.sp +.nf +Last updated: 25 August 2012 +Copyright (c) 1997-2012 University of Cambridge. +.fi diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcreposix.3 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcreposix.3 new file mode 100755 index 000000000..77890f36b --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcreposix.3 @@ -0,0 +1,267 @@ +.TH PCREPOSIX 3 "09 January 2012" "PCRE 8.30" +.SH NAME +PCRE - Perl-compatible regular expressions. +.SH "SYNOPSIS" +.rs +.sp +.B #include +.PP +.nf +.B int regcomp(regex_t *\fIpreg\fP, const char *\fIpattern\fP, +.B " int \fIcflags\fP);" +.sp +.B int regexec(regex_t *\fIpreg\fP, const char *\fIstring\fP, +.B " size_t \fInmatch\fP, regmatch_t \fIpmatch\fP[], int \fIeflags\fP);" +.B " size_t regerror(int \fIerrcode\fP, const regex_t *\fIpreg\fP," +.B " char *\fIerrbuf\fP, size_t \fIerrbuf_size\fP);" +.sp +.B void regfree(regex_t *\fIpreg\fP); +.fi +. +.SH DESCRIPTION +.rs +.sp +This set of functions provides a POSIX-style API for the PCRE regular +expression 8-bit library. See the +.\" HREF +\fBpcreapi\fP +.\" +documentation for a description of PCRE's native API, which contains much +additional functionality. There is no POSIX-style wrapper for PCRE's 16-bit +and 32-bit library. +.P +The functions described here are just wrapper functions that ultimately call +the PCRE native API. Their prototypes are defined in the \fBpcreposix.h\fP +header file, and on Unix systems the library itself is called +\fBpcreposix.a\fP, so can be accessed by adding \fB-lpcreposix\fP to the +command for linking an application that uses them. Because the POSIX functions +call the native ones, it is also necessary to add \fB-lpcre\fP. +.P +I have implemented only those POSIX option bits that can be reasonably mapped +to PCRE native options. In addition, the option REG_EXTENDED is defined with +the value zero. This has no effect, but since programs that are written to the +POSIX interface often use it, this makes it easier to slot in PCRE as a +replacement library. Other POSIX options are not even defined. +.P +There are also some other options that are not defined by POSIX. These have +been added at the request of users who want to make use of certain +PCRE-specific features via the POSIX calling interface. +.P +When PCRE is called via these functions, it is only the API that is POSIX-like +in style. The syntax and semantics of the regular expressions themselves are +still those of Perl, subject to the setting of various PCRE options, as +described below. "POSIX-like in style" means that the API approximates to the +POSIX definition; it is not fully POSIX-compatible, and in multi-byte encoding +domains it is probably even less compatible. +.P +The header for these functions is supplied as \fBpcreposix.h\fP to avoid any +potential clash with other POSIX libraries. It can, of course, be renamed or +aliased as \fBregex.h\fP, which is the "correct" name. It provides two +structure types, \fIregex_t\fP for compiled internal forms, and +\fIregmatch_t\fP for returning captured substrings. It also defines some +constants whose names start with "REG_"; these are used for setting options and +identifying error codes. +. +. +.SH "COMPILING A PATTERN" +.rs +.sp +The function \fBregcomp()\fP is called to compile a pattern into an +internal form. The pattern is a C string terminated by a binary zero, and +is passed in the argument \fIpattern\fP. The \fIpreg\fP argument is a pointer +to a \fBregex_t\fP structure that is used as a base for storing information +about the compiled regular expression. +.P +The argument \fIcflags\fP is either zero, or contains one or more of the bits +defined by the following macros: +.sp + REG_DOTALL +.sp +The PCRE_DOTALL option is set when the regular expression is passed for +compilation to the native function. Note that REG_DOTALL is not part of the +POSIX standard. +.sp + REG_ICASE +.sp +The PCRE_CASELESS option is set when the regular expression is passed for +compilation to the native function. +.sp + REG_NEWLINE +.sp +The PCRE_MULTILINE option is set when the regular expression is passed for +compilation to the native function. Note that this does \fInot\fP mimic the +defined POSIX behaviour for REG_NEWLINE (see the following section). +.sp + REG_NOSUB +.sp +The PCRE_NO_AUTO_CAPTURE option is set when the regular expression is passed +for compilation to the native function. In addition, when a pattern that is +compiled with this flag is passed to \fBregexec()\fP for matching, the +\fInmatch\fP and \fIpmatch\fP arguments are ignored, and no captured strings +are returned. +.sp + REG_UCP +.sp +The PCRE_UCP option is set when the regular expression is passed for +compilation to the native function. This causes PCRE to use Unicode properties +when matchine \ed, \ew, etc., instead of just recognizing ASCII values. Note +that REG_UTF8 is not part of the POSIX standard. +.sp + REG_UNGREEDY +.sp +The PCRE_UNGREEDY option is set when the regular expression is passed for +compilation to the native function. Note that REG_UNGREEDY is not part of the +POSIX standard. +.sp + REG_UTF8 +.sp +The PCRE_UTF8 option is set when the regular expression is passed for +compilation to the native function. This causes the pattern itself and all data +strings used for matching it to be treated as UTF-8 strings. Note that REG_UTF8 +is not part of the POSIX standard. +.P +In the absence of these flags, no options are passed to the native function. +This means the the regex is compiled with PCRE default semantics. In +particular, the way it handles newline characters in the subject string is the +Perl way, not the POSIX way. Note that setting PCRE_MULTILINE has only +\fIsome\fP of the effects specified for REG_NEWLINE. It does not affect the way +newlines are matched by . (they are not) or by a negative class such as [^a] +(they are). +.P +The yield of \fBregcomp()\fP is zero on success, and non-zero otherwise. The +\fIpreg\fP structure is filled in on success, and one member of the structure +is public: \fIre_nsub\fP contains the number of capturing subpatterns in +the regular expression. Various error codes are defined in the header file. +.P +NOTE: If the yield of \fBregcomp()\fP is non-zero, you must not attempt to +use the contents of the \fIpreg\fP structure. If, for example, you pass it to +\fBregexec()\fP, the result is undefined and your program is likely to crash. +. +. +.SH "MATCHING NEWLINE CHARACTERS" +.rs +.sp +This area is not simple, because POSIX and Perl take different views of things. +It is not possible to get PCRE to obey POSIX semantics, but then PCRE was never +intended to be a POSIX engine. The following table lists the different +possibilities for matching newline characters in PCRE: +.sp + Default Change with +.sp + . matches newline no PCRE_DOTALL + newline matches [^a] yes not changeable + $ matches \en at end yes PCRE_DOLLARENDONLY + $ matches \en in middle no PCRE_MULTILINE + ^ matches \en in middle no PCRE_MULTILINE +.sp +This is the equivalent table for POSIX: +.sp + Default Change with +.sp + . matches newline yes REG_NEWLINE + newline matches [^a] yes REG_NEWLINE + $ matches \en at end no REG_NEWLINE + $ matches \en in middle no REG_NEWLINE + ^ matches \en in middle no REG_NEWLINE +.sp +PCRE's behaviour is the same as Perl's, except that there is no equivalent for +PCRE_DOLLAR_ENDONLY in Perl. In both PCRE and Perl, there is no way to stop +newline from matching [^a]. +.P +The default POSIX newline handling can be obtained by setting PCRE_DOTALL and +PCRE_DOLLAR_ENDONLY, but there is no way to make PCRE behave exactly as for the +REG_NEWLINE action. +. +. +.SH "MATCHING A PATTERN" +.rs +.sp +The function \fBregexec()\fP is called to match a compiled pattern \fIpreg\fP +against a given \fIstring\fP, which is by default terminated by a zero byte +(but see REG_STARTEND below), subject to the options in \fIeflags\fP. These can +be: +.sp + REG_NOTBOL +.sp +The PCRE_NOTBOL option is set when calling the underlying PCRE matching +function. +.sp + REG_NOTEMPTY +.sp +The PCRE_NOTEMPTY option is set when calling the underlying PCRE matching +function. Note that REG_NOTEMPTY is not part of the POSIX standard. However, +setting this option can give more POSIX-like behaviour in some situations. +.sp + REG_NOTEOL +.sp +The PCRE_NOTEOL option is set when calling the underlying PCRE matching +function. +.sp + REG_STARTEND +.sp +The string is considered to start at \fIstring\fP + \fIpmatch[0].rm_so\fP and +to have a terminating NUL located at \fIstring\fP + \fIpmatch[0].rm_eo\fP +(there need not actually be a NUL at that location), regardless of the value of +\fInmatch\fP. This is a BSD extension, compatible with but not specified by +IEEE Standard 1003.2 (POSIX.2), and should be used with caution in software +intended to be portable to other systems. Note that a non-zero \fIrm_so\fP does +not imply REG_NOTBOL; REG_STARTEND affects only the location of the string, not +how it is matched. +.P +If the pattern was compiled with the REG_NOSUB flag, no data about any matched +strings is returned. The \fInmatch\fP and \fIpmatch\fP arguments of +\fBregexec()\fP are ignored. +.P +If the value of \fInmatch\fP is zero, or if the value \fIpmatch\fP is NULL, +no data about any matched strings is returned. +.P +Otherwise,the portion of the string that was matched, and also any captured +substrings, are returned via the \fIpmatch\fP argument, which points to an +array of \fInmatch\fP structures of type \fIregmatch_t\fP, containing the +members \fIrm_so\fP and \fIrm_eo\fP. These contain the offset to the first +character of each substring and the offset to the first character after the end +of each substring, respectively. The 0th element of the vector relates to the +entire portion of \fIstring\fP that was matched; subsequent elements relate to +the capturing subpatterns of the regular expression. Unused entries in the +array have both structure members set to -1. +.P +A successful match yields a zero return; various error codes are defined in the +header file, of which REG_NOMATCH is the "expected" failure code. +. +. +.SH "ERROR MESSAGES" +.rs +.sp +The \fBregerror()\fP function maps a non-zero errorcode from either +\fBregcomp()\fP or \fBregexec()\fP to a printable message. If \fIpreg\fP is not +NULL, the error should have arisen from the use of that structure. A message +terminated by a binary zero is placed in \fIerrbuf\fP. The length of the +message, including the zero, is limited to \fIerrbuf_size\fP. The yield of the +function is the size of buffer needed to hold the whole message. +. +. +.SH MEMORY USAGE +.rs +.sp +Compiling a regular expression causes memory to be allocated and associated +with the \fIpreg\fP structure. The function \fBregfree()\fP frees all such +memory, after which \fIpreg\fP may no longer be used as a compiled expression. +. +. +.SH AUTHOR +.rs +.sp +.nf +Philip Hazel +University Computing Service +Cambridge CB2 3QH, England. +.fi +. +. +.SH REVISION +.rs +.sp +.nf +Last updated: 09 January 2012 +Copyright (c) 1997-2012 University of Cambridge. +.fi diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcreprecompile.3 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcreprecompile.3 new file mode 100755 index 000000000..40f257a98 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcreprecompile.3 @@ -0,0 +1,155 @@ +.TH PCREPRECOMPILE 3 "12 November 2013" "PCRE 8.34" +.SH NAME +PCRE - Perl-compatible regular expressions +.SH "SAVING AND RE-USING PRECOMPILED PCRE PATTERNS" +.rs +.sp +If you are running an application that uses a large number of regular +expression patterns, it may be useful to store them in a precompiled form +instead of having to compile them every time the application is run. +If you are not using any private character tables (see the +.\" HREF +\fBpcre_maketables()\fP +.\" +documentation), this is relatively straightforward. If you are using private +tables, it is a little bit more complicated. However, if you are using the +just-in-time optimization feature, it is not possible to save and reload the +JIT data. +.P +If you save compiled patterns to a file, you can copy them to a different host +and run them there. If the two hosts have different endianness (byte order), +you should run the \fBpcre[16|32]_pattern_to_host_byte_order()\fP function on the +new host before trying to match the pattern. The matching functions return +PCRE_ERROR_BADENDIANNESS if they detect a pattern with the wrong endianness. +.P +Compiling regular expressions with one version of PCRE for use with a different +version is not guaranteed to work and may cause crashes, and saving and +restoring a compiled pattern loses any JIT optimization data. +. +. +.SH "SAVING A COMPILED PATTERN" +.rs +.sp +The value returned by \fBpcre[16|32]_compile()\fP points to a single block of +memory that holds the compiled pattern and associated data. You can find the +length of this block in bytes by calling \fBpcre[16|32]_fullinfo()\fP with an +argument of PCRE_INFO_SIZE. You can then save the data in any appropriate +manner. Here is sample code for the 8-bit library that compiles a pattern and +writes it to a file. It assumes that the variable \fIfd\fP refers to a file +that is open for output: +.sp + int erroroffset, rc, size; + char *error; + pcre *re; +.sp + re = pcre_compile("my pattern", 0, &error, &erroroffset, NULL); + if (re == NULL) { ... handle errors ... } + rc = pcre_fullinfo(re, NULL, PCRE_INFO_SIZE, &size); + if (rc < 0) { ... handle errors ... } + rc = fwrite(re, 1, size, fd); + if (rc != size) { ... handle errors ... } +.sp +In this example, the bytes that comprise the compiled pattern are copied +exactly. Note that this is binary data that may contain any of the 256 possible +byte values. On systems that make a distinction between binary and non-binary +data, be sure that the file is opened for binary output. +.P +If you want to write more than one pattern to a file, you will have to devise a +way of separating them. For binary data, preceding each pattern with its length +is probably the most straightforward approach. Another possibility is to write +out the data in hexadecimal instead of binary, one pattern to a line. +.P +Saving compiled patterns in a file is only one possible way of storing them for +later use. They could equally well be saved in a database, or in the memory of +some daemon process that passes them via sockets to the processes that want +them. +.P +If the pattern has been studied, it is also possible to save the normal study +data in a similar way to the compiled pattern itself. However, if the +PCRE_STUDY_JIT_COMPILE was used, the just-in-time data that is created cannot +be saved because it is too dependent on the current environment. When studying +generates additional information, \fBpcre[16|32]_study()\fP returns a pointer to a +\fBpcre[16|32]_extra\fP data block. Its format is defined in the +.\" HTML +.\" +section on matching a pattern +.\" +in the +.\" HREF +\fBpcreapi\fP +.\" +documentation. The \fIstudy_data\fP field points to the binary study data, and +this is what you must save (not the \fBpcre[16|32]_extra\fP block itself). The +length of the study data can be obtained by calling \fBpcre[16|32]_fullinfo()\fP +with an argument of PCRE_INFO_STUDYSIZE. Remember to check that +\fBpcre[16|32]_study()\fP did return a non-NULL value before trying to save the +study data. +. +. +.SH "RE-USING A PRECOMPILED PATTERN" +.rs +.sp +Re-using a precompiled pattern is straightforward. Having reloaded it into main +memory, called \fBpcre[16|32]_pattern_to_host_byte_order()\fP if necessary, you +pass its pointer to \fBpcre[16|32]_exec()\fP or \fBpcre[16|32]_dfa_exec()\fP in +the usual way. +.P +However, if you passed a pointer to custom character tables when the pattern +was compiled (the \fItableptr\fP argument of \fBpcre[16|32]_compile()\fP), you +must now pass a similar pointer to \fBpcre[16|32]_exec()\fP or +\fBpcre[16|32]_dfa_exec()\fP, because the value saved with the compiled pattern +will obviously be nonsense. A field in a \fBpcre[16|32]_extra()\fP block is used +to pass this data, as described in the +.\" HTML +.\" +section on matching a pattern +.\" +in the +.\" HREF +\fBpcreapi\fP +.\" +documentation. +.P +\fBWarning:\fP The tables that \fBpcre_exec()\fP and \fBpcre_dfa_exec()\fP use +must be the same as those that were used when the pattern was compiled. If this +is not the case, the behaviour is undefined. +.P +If you did not provide custom character tables when the pattern was compiled, +the pointer in the compiled pattern is NULL, which causes the matching +functions to use PCRE's internal tables. Thus, you do not need to take any +special action at run time in this case. +.P +If you saved study data with the compiled pattern, you need to create your own +\fBpcre[16|32]_extra\fP data block and set the \fIstudy_data\fP field to point +to the reloaded study data. You must also set the PCRE_EXTRA_STUDY_DATA bit in +the \fIflags\fP field to indicate that study data is present. Then pass the +\fBpcre[16|32]_extra\fP block to the matching function in the usual way. If the +pattern was studied for just-in-time optimization, that data cannot be saved, +and so is lost by a save/restore cycle. +. +. +.SH "COMPATIBILITY WITH DIFFERENT PCRE RELEASES" +.rs +.sp +In general, it is safest to recompile all saved patterns when you update to a +new PCRE release, though not all updates actually require this. +. +. +. +.SH AUTHOR +.rs +.sp +.nf +Philip Hazel +University Computing Service +Cambridge CB2 3QH, England. +.fi +. +. +.SH REVISION +.rs +.sp +.nf +Last updated: 12 November 2013 +Copyright (c) 1997-2013 University of Cambridge. +.fi diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcresample.3 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcresample.3 new file mode 100755 index 000000000..d7fe7ec54 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcresample.3 @@ -0,0 +1,99 @@ +.TH PCRESAMPLE 3 "10 January 2012" "PCRE 8.30" +.SH NAME +PCRE - Perl-compatible regular expressions +.SH "PCRE SAMPLE PROGRAM" +.rs +.sp +A simple, complete demonstration program, to get you started with using PCRE, +is supplied in the file \fIpcredemo.c\fP in the PCRE distribution. A listing of +this program is given in the +.\" HREF +\fBpcredemo\fP +.\" +documentation. If you do not have a copy of the PCRE distribution, you can save +this listing to re-create \fIpcredemo.c\fP. +.P +The demonstration program, which uses the original PCRE 8-bit library, compiles +the regular expression that is its first argument, and matches it against the +subject string in its second argument. No PCRE options are set, and default +character tables are used. If matching succeeds, the program outputs the +portion of the subject that matched, together with the contents of any captured +substrings. +.P +If the -g option is given on the command line, the program then goes on to +check for further matches of the same regular expression in the same subject +string. The logic is a little bit tricky because of the possibility of matching +an empty string. Comments in the code explain what is going on. +.P +If PCRE is installed in the standard include and library directories for your +operating system, you should be able to compile the demonstration program using +this command: +.sp + gcc -o pcredemo pcredemo.c -lpcre +.sp +If PCRE is installed elsewhere, you may need to add additional options to the +command line. For example, on a Unix-like system that has PCRE installed in +\fI/usr/local\fP, you can compile the demonstration program using a command +like this: +.sp +.\" JOINSH + gcc -o pcredemo -I/usr/local/include pcredemo.c \e + -L/usr/local/lib -lpcre +.sp +In a Windows environment, if you want to statically link the program against a +non-dll \fBpcre.a\fP file, you must uncomment the line that defines PCRE_STATIC +before including \fBpcre.h\fP, because otherwise the \fBpcre_malloc()\fP and +\fBpcre_free()\fP exported functions will be declared +\fB__declspec(dllimport)\fP, with unwanted results. +.P +Once you have compiled and linked the demonstration program, you can run simple +tests like this: +.sp + ./pcredemo 'cat|dog' 'the cat sat on the mat' + ./pcredemo -g 'cat|dog' 'the dog sat on the cat' +.sp +Note that there is a much more comprehensive test program, called +.\" HREF +\fBpcretest\fP, +.\" +which supports many more facilities for testing regular expressions and both +PCRE libraries. The +.\" HREF +\fBpcredemo\fP +.\" +program is provided as a simple coding example. +.P +If you try to run +.\" HREF +\fBpcredemo\fP +.\" +when PCRE is not installed in the standard library directory, you may get an +error like this on some operating systems (e.g. Solaris): +.sp + ld.so.1: a.out: fatal: libpcre.so.0: open failed: No such file or directory +.sp +This is caused by the way shared library support works on those systems. You +need to add +.sp + -R/usr/local/lib +.sp +(for example) to the compile command to get round this problem. +. +. +.SH AUTHOR +.rs +.sp +.nf +Philip Hazel +University Computing Service +Cambridge CB2 3QH, England. +.fi +. +. +.SH REVISION +.rs +.sp +.nf +Last updated: 10 January 2012 +Copyright (c) 1997-2012 University of Cambridge. +.fi diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcrestack.3 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcrestack.3 new file mode 100755 index 000000000..798f0bca6 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcrestack.3 @@ -0,0 +1,215 @@ +.TH PCRESTACK 3 "24 June 2012" "PCRE 8.30" +.SH NAME +PCRE - Perl-compatible regular expressions +.SH "PCRE DISCUSSION OF STACK USAGE" +.rs +.sp +When you call \fBpcre[16|32]_exec()\fP, it makes use of an internal function +called \fBmatch()\fP. This calls itself recursively at branch points in the +pattern, in order to remember the state of the match so that it can back up and +try a different alternative if the first one fails. As matching proceeds deeper +and deeper into the tree of possibilities, the recursion depth increases. The +\fBmatch()\fP function is also called in other circumstances, for example, +whenever a parenthesized sub-pattern is entered, and in certain cases of +repetition. +.P +Not all calls of \fBmatch()\fP increase the recursion depth; for an item such +as a* it may be called several times at the same level, after matching +different numbers of a's. Furthermore, in a number of cases where the result of +the recursive call would immediately be passed back as the result of the +current call (a "tail recursion"), the function is just restarted instead. +.P +The above comments apply when \fBpcre[16|32]_exec()\fP is run in its normal +interpretive manner. If the pattern was studied with the +PCRE_STUDY_JIT_COMPILE option, and just-in-time compiling was successful, and +the options passed to \fBpcre[16|32]_exec()\fP were not incompatible, the matching +process uses the JIT-compiled code instead of the \fBmatch()\fP function. In +this case, the memory requirements are handled entirely differently. See the +.\" HREF +\fBpcrejit\fP +.\" +documentation for details. +.P +The \fBpcre[16|32]_dfa_exec()\fP function operates in an entirely different way, +and uses recursion only when there is a regular expression recursion or +subroutine call in the pattern. This includes the processing of assertion and +"once-only" subpatterns, which are handled like subroutine calls. Normally, +these are never very deep, and the limit on the complexity of +\fBpcre[16|32]_dfa_exec()\fP is controlled by the amount of workspace it is given. +However, it is possible to write patterns with runaway infinite recursions; +such patterns will cause \fBpcre[16|32]_dfa_exec()\fP to run out of stack. At +present, there is no protection against this. +.P +The comments that follow do NOT apply to \fBpcre[16|32]_dfa_exec()\fP; they are +relevant only for \fBpcre[16|32]_exec()\fP without the JIT optimization. +. +. +.SS "Reducing \fBpcre[16|32]_exec()\fP's stack usage" +.rs +.sp +Each time that \fBmatch()\fP is actually called recursively, it uses memory +from the process stack. For certain kinds of pattern and data, very large +amounts of stack may be needed, despite the recognition of "tail recursion". +You can often reduce the amount of recursion, and therefore the amount of stack +used, by modifying the pattern that is being matched. Consider, for example, +this pattern: +.sp + ([^<]|<(?!inet))+ +.sp +It matches from wherever it starts until it encounters " +.\" +section on extra data for \fBpcre[16|32]_exec()\fP +.\" +in the +.\" HREF +\fBpcreapi\fP +.\" +documentation. +.P +As a very rough rule of thumb, you should reckon on about 500 bytes per +recursion. Thus, if you want to limit your stack usage to 8Mb, you should set +the limit at 16000 recursions. A 64Mb stack, on the other hand, can support +around 128000 recursions. +.P +In Unix-like environments, the \fBpcretest\fP test program has a command line +option (\fB-S\fP) that can be used to increase the size of its stack. As long +as the stack is large enough, another option (\fB-M\fP) can be used to find the +smallest limits that allow a particular pattern to match a given subject +string. This is done by calling \fBpcre[16|32]_exec()\fP repeatedly with different +limits. +. +. +.SS "Obtaining an estimate of stack usage" +.rs +.sp +The actual amount of stack used per recursion can vary quite a lot, depending +on the compiler that was used to build PCRE and the optimization or debugging +options that were set for it. The rule of thumb value of 500 bytes mentioned +above may be larger or smaller than what is actually needed. A better +approximation can be obtained by running this command: +.sp + pcretest -m -C +.sp +The \fB-C\fP option causes \fBpcretest\fP to output information about the +options with which PCRE was compiled. When \fB-m\fP is also given (before +\fB-C\fP), information about stack use is given in a line like this: +.sp + Match recursion uses stack: approximate frame size = 640 bytes +.sp +The value is approximate because some recursions need a bit more (up to perhaps +16 more bytes). +.P +If the above command is given when PCRE is compiled to use the heap instead of +the stack for recursion, the value that is output is the size of each block +that is obtained from the heap. +. +. +.SS "Changing stack size in Unix-like systems" +.rs +.sp +In Unix-like environments, there is not often a problem with the stack unless +very long strings are involved, though the default limit on stack size varies +from system to system. Values from 8Mb to 64Mb are common. You can find your +default limit by running the command: +.sp + ulimit -s +.sp +Unfortunately, the effect of running out of stack is often SIGSEGV, though +sometimes a more explicit error message is given. You can normally increase the +limit on stack size by code such as this: +.sp + struct rlimit rlim; + getrlimit(RLIMIT_STACK, &rlim); + rlim.rlim_cur = 100*1024*1024; + setrlimit(RLIMIT_STACK, &rlim); +.sp +This reads the current limits (soft and hard) using \fBgetrlimit()\fP, then +attempts to increase the soft limit to 100Mb using \fBsetrlimit()\fP. You must +do this before calling \fBpcre[16|32]_exec()\fP. +. +. +.SS "Changing stack size in Mac OS X" +.rs +.sp +Using \fBsetrlimit()\fP, as described above, should also work on Mac OS X. It +is also possible to set a stack size when linking a program. There is a +discussion about stack sizes in Mac OS X at this web site: +.\" HTML +.\" +http://developer.apple.com/qa/qa2005/qa1419.html. +.\" +. +. +.SH AUTHOR +.rs +.sp +.nf +Philip Hazel +University Computing Service +Cambridge CB2 3QH, England. +.fi +. +. +.SH REVISION +.rs +.sp +.nf +Last updated: 24 June 2012 +Copyright (c) 1997-2012 University of Cambridge. +.fi diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcresyntax.3 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcresyntax.3 new file mode 100755 index 000000000..0850369f7 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcresyntax.3 @@ -0,0 +1,540 @@ +.TH PCRESYNTAX 3 "08 January 2014" "PCRE 8.35" +.SH NAME +PCRE - Perl-compatible regular expressions +.SH "PCRE REGULAR EXPRESSION SYNTAX SUMMARY" +.rs +.sp +The full syntax and semantics of the regular expressions that are supported by +PCRE are described in the +.\" HREF +\fBpcrepattern\fP +.\" +documentation. This document contains a quick-reference summary of the syntax. +. +. +.SH "QUOTING" +.rs +.sp + \ex where x is non-alphanumeric is a literal x + \eQ...\eE treat enclosed characters as literal +. +. +.SH "CHARACTERS" +.rs +.sp + \ea alarm, that is, the BEL character (hex 07) + \ecx "control-x", where x is any ASCII character + \ee escape (hex 1B) + \ef form feed (hex 0C) + \en newline (hex 0A) + \er carriage return (hex 0D) + \et tab (hex 09) + \e0dd character with octal code 0dd + \eddd character with octal code ddd, or backreference + \eo{ddd..} character with octal code ddd.. + \exhh character with hex code hh + \ex{hhh..} character with hex code hhh.. +.sp +Note that \e0dd is always an octal code, and that \e8 and \e9 are the literal +characters "8" and "9". +. +. +.SH "CHARACTER TYPES" +.rs +.sp + . any character except newline; + in dotall mode, any character whatsoever + \eC one data unit, even in UTF mode (best avoided) + \ed a decimal digit + \eD a character that is not a decimal digit + \eh a horizontal white space character + \eH a character that is not a horizontal white space character + \eN a character that is not a newline + \ep{\fIxx\fP} a character with the \fIxx\fP property + \eP{\fIxx\fP} a character without the \fIxx\fP property + \eR a newline sequence + \es a white space character + \eS a character that is not a white space character + \ev a vertical white space character + \eV a character that is not a vertical white space character + \ew a "word" character + \eW a "non-word" character + \eX a Unicode extended grapheme cluster +.sp +By default, \ed, \es, and \ew match only ASCII characters, even in UTF-8 mode +or in the 16- bit and 32-bit libraries. However, if locale-specific matching is +happening, \es and \ew may also match characters with code points in the range +128-255. If the PCRE_UCP option is set, the behaviour of these escape sequences +is changed to use Unicode properties and they match many more characters. +. +. +.SH "GENERAL CATEGORY PROPERTIES FOR \ep and \eP" +.rs +.sp + C Other + Cc Control + Cf Format + Cn Unassigned + Co Private use + Cs Surrogate +.sp + L Letter + Ll Lower case letter + Lm Modifier letter + Lo Other letter + Lt Title case letter + Lu Upper case letter + L& Ll, Lu, or Lt +.sp + M Mark + Mc Spacing mark + Me Enclosing mark + Mn Non-spacing mark +.sp + N Number + Nd Decimal number + Nl Letter number + No Other number +.sp + P Punctuation + Pc Connector punctuation + Pd Dash punctuation + Pe Close punctuation + Pf Final punctuation + Pi Initial punctuation + Po Other punctuation + Ps Open punctuation +.sp + S Symbol + Sc Currency symbol + Sk Modifier symbol + Sm Mathematical symbol + So Other symbol +.sp + Z Separator + Zl Line separator + Zp Paragraph separator + Zs Space separator +. +. +.SH "PCRE SPECIAL CATEGORY PROPERTIES FOR \ep and \eP" +.rs +.sp + Xan Alphanumeric: union of properties L and N + Xps POSIX space: property Z or tab, NL, VT, FF, CR + Xsp Perl space: property Z or tab, NL, VT, FF, CR + Xuc Univerally-named character: one that can be + represented by a Universal Character Name + Xwd Perl word: property Xan or underscore +.sp +Perl and POSIX space are now the same. Perl added VT to its space character set +at release 5.18 and PCRE changed at release 8.34. +. +. +.SH "SCRIPT NAMES FOR \ep AND \eP" +.rs +.sp +Arabic, +Armenian, +Avestan, +Balinese, +Bamum, +Bassa_Vah, +Batak, +Bengali, +Bopomofo, +Brahmi, +Braille, +Buginese, +Buhid, +Canadian_Aboriginal, +Carian, +Caucasian_Albanian, +Chakma, +Cham, +Cherokee, +Common, +Coptic, +Cuneiform, +Cypriot, +Cyrillic, +Deseret, +Devanagari, +Duployan, +Egyptian_Hieroglyphs, +Elbasan, +Ethiopic, +Georgian, +Glagolitic, +Gothic, +Grantha, +Greek, +Gujarati, +Gurmukhi, +Han, +Hangul, +Hanunoo, +Hebrew, +Hiragana, +Imperial_Aramaic, +Inherited, +Inscriptional_Pahlavi, +Inscriptional_Parthian, +Javanese, +Kaithi, +Kannada, +Katakana, +Kayah_Li, +Kharoshthi, +Khmer, +Khojki, +Khudawadi, +Lao, +Latin, +Lepcha, +Limbu, +Linear_A, +Linear_B, +Lisu, +Lycian, +Lydian, +Mahajani, +Malayalam, +Mandaic, +Manichaean, +Meetei_Mayek, +Mende_Kikakui, +Meroitic_Cursive, +Meroitic_Hieroglyphs, +Miao, +Modi, +Mongolian, +Mro, +Myanmar, +Nabataean, +New_Tai_Lue, +Nko, +Ogham, +Ol_Chiki, +Old_Italic, +Old_North_Arabian, +Old_Permic, +Old_Persian, +Old_South_Arabian, +Old_Turkic, +Oriya, +Osmanya, +Pahawh_Hmong, +Palmyrene, +Pau_Cin_Hau, +Phags_Pa, +Phoenician, +Psalter_Pahlavi, +Rejang, +Runic, +Samaritan, +Saurashtra, +Sharada, +Shavian, +Siddham, +Sinhala, +Sora_Sompeng, +Sundanese, +Syloti_Nagri, +Syriac, +Tagalog, +Tagbanwa, +Tai_Le, +Tai_Tham, +Tai_Viet, +Takri, +Tamil, +Telugu, +Thaana, +Thai, +Tibetan, +Tifinagh, +Tirhuta, +Ugaritic, +Vai, +Warang_Citi, +Yi. +. +. +.SH "CHARACTER CLASSES" +.rs +.sp + [...] positive character class + [^...] negative character class + [x-y] range (can be used for hex characters) + [[:xxx:]] positive POSIX named set + [[:^xxx:]] negative POSIX named set +.sp + alnum alphanumeric + alpha alphabetic + ascii 0-127 + blank space or tab + cntrl control character + digit decimal digit + graph printing, excluding space + lower lower case letter + print printing, including space + punct printing, excluding alphanumeric + space white space + upper upper case letter + word same as \ew + xdigit hexadecimal digit +.sp +In PCRE, POSIX character set names recognize only ASCII characters by default, +but some of them use Unicode properties if PCRE_UCP is set. You can use +\eQ...\eE inside a character class. +. +. +.SH "QUANTIFIERS" +.rs +.sp + ? 0 or 1, greedy + ?+ 0 or 1, possessive + ?? 0 or 1, lazy + * 0 or more, greedy + *+ 0 or more, possessive + *? 0 or more, lazy + + 1 or more, greedy + ++ 1 or more, possessive + +? 1 or more, lazy + {n} exactly n + {n,m} at least n, no more than m, greedy + {n,m}+ at least n, no more than m, possessive + {n,m}? at least n, no more than m, lazy + {n,} n or more, greedy + {n,}+ n or more, possessive + {n,}? n or more, lazy +. +. +.SH "ANCHORS AND SIMPLE ASSERTIONS" +.rs +.sp + \eb word boundary + \eB not a word boundary + ^ start of subject + also after internal newline in multiline mode + \eA start of subject + $ end of subject + also before newline at end of subject + also before internal newline in multiline mode + \eZ end of subject + also before newline at end of subject + \ez end of subject + \eG first matching position in subject +. +. +.SH "MATCH POINT RESET" +.rs +.sp + \eK reset start of match +.sp +\eK is honoured in positive assertions, but ignored in negative ones. +. +. +.SH "ALTERNATION" +.rs +.sp + expr|expr|expr... +. +. +.SH "CAPTURING" +.rs +.sp + (...) capturing group + (?...) named capturing group (Perl) + (?'name'...) named capturing group (Perl) + (?P...) named capturing group (Python) + (?:...) non-capturing group + (?|...) non-capturing group; reset group numbers for + capturing groups in each alternative +. +. +.SH "ATOMIC GROUPS" +.rs +.sp + (?>...) atomic, non-capturing group +. +. +. +. +.SH "COMMENT" +.rs +.sp + (?#....) comment (not nestable) +. +. +.SH "OPTION SETTING" +.rs +.sp + (?i) caseless + (?J) allow duplicate names + (?m) multiline + (?s) single line (dotall) + (?U) default ungreedy (lazy) + (?x) extended (ignore white space) + (?-...) unset option(s) +.sp +The following are recognized only at the very start of a pattern or after one +of the newline or \eR options with similar syntax. More than one of them may +appear. +.sp + (*LIMIT_MATCH=d) set the match limit to d (decimal number) + (*LIMIT_RECURSION=d) set the recursion limit to d (decimal number) + (*NO_AUTO_POSSESS) no auto-possessification (PCRE_NO_AUTO_POSSESS) + (*NO_START_OPT) no start-match optimization (PCRE_NO_START_OPTIMIZE) + (*UTF8) set UTF-8 mode: 8-bit library (PCRE_UTF8) + (*UTF16) set UTF-16 mode: 16-bit library (PCRE_UTF16) + (*UTF32) set UTF-32 mode: 32-bit library (PCRE_UTF32) + (*UTF) set appropriate UTF mode for the library in use + (*UCP) set PCRE_UCP (use Unicode properties for \ed etc) +.sp +Note that LIMIT_MATCH and LIMIT_RECURSION can only reduce the value of the +limits set by the caller of pcre_exec(), not increase them. +. +. +.SH "NEWLINE CONVENTION" +.rs +.sp +These are recognized only at the very start of the pattern or after option +settings with a similar syntax. +.sp + (*CR) carriage return only + (*LF) linefeed only + (*CRLF) carriage return followed by linefeed + (*ANYCRLF) all three of the above + (*ANY) any Unicode newline sequence +. +. +.SH "WHAT \eR MATCHES" +.rs +.sp +These are recognized only at the very start of the pattern or after option +setting with a similar syntax. +.sp + (*BSR_ANYCRLF) CR, LF, or CRLF + (*BSR_UNICODE) any Unicode newline sequence +. +. +.SH "LOOKAHEAD AND LOOKBEHIND ASSERTIONS" +.rs +.sp + (?=...) positive look ahead + (?!...) negative look ahead + (?<=...) positive look behind + (? reference by name (Perl) + \ek'name' reference by name (Perl) + \eg{name} reference by name (Perl) + \ek{name} reference by name (.NET) + (?P=name) reference by name (Python) +. +. +.SH "SUBROUTINE REFERENCES (POSSIBLY RECURSIVE)" +.rs +.sp + (?R) recurse whole pattern + (?n) call subpattern by absolute number + (?+n) call subpattern by relative number + (?-n) call subpattern by relative number + (?&name) call subpattern by name (Perl) + (?P>name) call subpattern by name (Python) + \eg call subpattern by name (Oniguruma) + \eg'name' call subpattern by name (Oniguruma) + \eg call subpattern by absolute number (Oniguruma) + \eg'n' call subpattern by absolute number (Oniguruma) + \eg<+n> call subpattern by relative number (PCRE extension) + \eg'+n' call subpattern by relative number (PCRE extension) + \eg<-n> call subpattern by relative number (PCRE extension) + \eg'-n' call subpattern by relative number (PCRE extension) +. +. +.SH "CONDITIONAL PATTERNS" +.rs +.sp + (?(condition)yes-pattern) + (?(condition)yes-pattern|no-pattern) +.sp + (?(n)... absolute reference condition + (?(+n)... relative reference condition + (?(-n)... relative reference condition + (?()... named reference condition (Perl) + (?('name')... named reference condition (Perl) + (?(name)... named reference condition (PCRE) + (?(R)... overall recursion condition + (?(Rn)... specific group recursion condition + (?(R&name)... specific recursion condition + (?(DEFINE)... define subpattern for reference + (?(assert)... assertion condition +. +. +.SH "BACKTRACKING CONTROL" +.rs +.sp +The following act immediately they are reached: +.sp + (*ACCEPT) force successful match + (*FAIL) force backtrack; synonym (*F) + (*MARK:NAME) set name to be passed back; synonym (*:NAME) +.sp +The following act only when a subsequent match failure causes a backtrack to +reach them. They all force a match failure, but they differ in what happens +afterwards. Those that advance the start-of-match point do so only if the +pattern is not anchored. +.sp + (*COMMIT) overall failure, no advance of starting point + (*PRUNE) advance to next starting character + (*PRUNE:NAME) equivalent to (*MARK:NAME)(*PRUNE) + (*SKIP) advance to current matching position + (*SKIP:NAME) advance to position corresponding to an earlier + (*MARK:NAME); if not found, the (*SKIP) is ignored + (*THEN) local failure, backtrack to next alternation + (*THEN:NAME) equivalent to (*MARK:NAME)(*THEN) +. +. +.SH "CALLOUTS" +.rs +.sp + (?C) callout + (?Cn) callout with data n +. +. +.SH "SEE ALSO" +.rs +.sp +\fBpcrepattern\fP(3), \fBpcreapi\fP(3), \fBpcrecallout\fP(3), +\fBpcrematching\fP(3), \fBpcre\fP(3). +. +. +.SH AUTHOR +.rs +.sp +.nf +Philip Hazel +University Computing Service +Cambridge CB2 3QH, England. +.fi +. +. +.SH REVISION +.rs +.sp +.nf +Last updated: 08 January 2014 +Copyright (c) 1997-2014 University of Cambridge. +.fi diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcretest.1 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcretest.1 new file mode 100755 index 000000000..fec964d78 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/pcretest.1 @@ -0,0 +1,1158 @@ +.TH PCRETEST 1 "10 February 2020" "PCRE 8.44" +.SH NAME +pcretest - a program for testing Perl-compatible regular expressions. +.SH SYNOPSIS +.rs +.sp +.B pcretest "[options] [input file [output file]]" +.sp +\fBpcretest\fP was written as a test program for the PCRE regular expression +library itself, but it can also be used for experimenting with regular +expressions. This document describes the features of the test program; for +details of the regular expressions themselves, see the +.\" HREF +\fBpcrepattern\fP +.\" +documentation. For details of the PCRE library function calls and their +options, see the +.\" HREF +\fBpcreapi\fP +.\" +, +.\" HREF +\fBpcre16\fP +and +.\" HREF +\fBpcre32\fP +.\" +documentation. +.P +The input for \fBpcretest\fP is a sequence of regular expression patterns and +strings to be matched, as described below. The output shows the result of each +match. Options on the command line and the patterns control PCRE options and +exactly what is output. +.P +As PCRE has evolved, it has acquired many different features, and as a result, +\fBpcretest\fP now has rather a lot of obscure options for testing every +possible feature. Some of these options are specifically designed for use in +conjunction with the test script and data files that are distributed as part of +PCRE, and are unlikely to be of use otherwise. They are all documented here, +but without much justification. +. +. +.SH "INPUT DATA FORMAT" +.rs +.sp +Input to \fBpcretest\fP is processed line by line, either by calling the C +library's \fBfgets()\fP function, or via the \fBlibreadline\fP library (see +below). In Unix-like environments, \fBfgets()\fP treats any bytes other than +newline as data characters. However, in some Windows environments character 26 +(hex 1A) causes an immediate end of file, and no further data is read. For +maximum portability, therefore, it is safest to use only ASCII characters in +\fBpcretest\fP input files. +.P +The input is processed using using C's string functions, so must not +contain binary zeroes, even though in Unix-like environments, \fBfgets()\fP +treats any bytes other than newline as data characters. +. +. +.SH "PCRE's 8-BIT, 16-BIT AND 32-BIT LIBRARIES" +.rs +.sp +From release 8.30, two separate PCRE libraries can be built. The original one +supports 8-bit character strings, whereas the newer 16-bit library supports +character strings encoded in 16-bit units. From release 8.32, a third library +can be built, supporting character strings encoded in 32-bit units. The +\fBpcretest\fP program can be used to test all three libraries. However, it is +itself still an 8-bit program, reading 8-bit input and writing 8-bit output. +When testing the 16-bit or 32-bit library, the patterns and data strings are +converted to 16- or 32-bit format before being passed to the PCRE library +functions. Results are converted to 8-bit for output. +.P +References to functions and structures of the form \fBpcre[16|32]_xx\fP below +mean "\fBpcre_xx\fP when using the 8-bit library, \fBpcre16_xx\fP when using +the 16-bit library, or \fBpcre32_xx\fP when using the 32-bit library". +. +. +.SH "COMMAND LINE OPTIONS" +.rs +.TP 10 +\fB-8\fP +If the 8-bit library has been built, this option causes it to be used (this is +the default). If the 8-bit library has not been built, this option causes an +error. +.TP 10 +\fB-16\fP +If the 16-bit library has been built, this option causes it to be used. If only +the 16-bit library has been built, this is the default. If the 16-bit library +has not been built, this option causes an error. +.TP 10 +\fB-32\fP +If the 32-bit library has been built, this option causes it to be used. If only +the 32-bit library has been built, this is the default. If the 32-bit library +has not been built, this option causes an error. +.TP 10 +\fB-b\fP +Behave as if each pattern has the \fB/B\fP (show byte code) modifier; the +internal form is output after compilation. +.TP 10 +\fB-C\fP +Output the version number of the PCRE library, and all available information +about the optional features that are included, and then exit with zero exit +code. All other options are ignored. +.TP 10 +\fB-C\fP \fIoption\fP +Output information about a specific build-time option, then exit. This +functionality is intended for use in scripts such as \fBRunTest\fP. The +following options output the value and set the exit code as indicated: +.sp + ebcdic-nl the code for LF (= NL) in an EBCDIC environment: + 0x15 or 0x25 + 0 if used in an ASCII environment + exit code is always 0 + linksize the configured internal link size (2, 3, or 4) + exit code is set to the link size + newline the default newline setting: + CR, LF, CRLF, ANYCRLF, or ANY + exit code is always 0 + bsr the default setting for what \eR matches: + ANYCRLF or ANY + exit code is always 0 +.sp +The following options output 1 for true or 0 for false, and set the exit code +to the same value: +.sp + ebcdic compiled for an EBCDIC environment + jit just-in-time support is available + pcre16 the 16-bit library was built + pcre32 the 32-bit library was built + pcre8 the 8-bit library was built + ucp Unicode property support is available + utf UTF-8 and/or UTF-16 and/or UTF-32 support + is available +.sp +If an unknown option is given, an error message is output; the exit code is 0. +.TP 10 +\fB-d\fP +Behave as if each pattern has the \fB/D\fP (debug) modifier; the internal +form and information about the compiled pattern is output after compilation; +\fB-d\fP is equivalent to \fB-b -i\fP. +.TP 10 +\fB-dfa\fP +Behave as if each data line contains the \eD escape sequence; this causes the +alternative matching function, \fBpcre[16|32]_dfa_exec()\fP, to be used instead +of the standard \fBpcre[16|32]_exec()\fP function (more detail is given below). +.TP 10 +\fB-help\fP +Output a brief summary these options and then exit. +.TP 10 +\fB-i\fP +Behave as if each pattern has the \fB/I\fP modifier; information about the +compiled pattern is given after compilation. +.TP 10 +\fB-M\fP +Behave as if each data line contains the \eM escape sequence; this causes +PCRE to discover the minimum MATCH_LIMIT and MATCH_LIMIT_RECURSION settings by +calling \fBpcre[16|32]_exec()\fP repeatedly with different limits. +.TP 10 +\fB-m\fP +Output the size of each compiled pattern after it has been compiled. This is +equivalent to adding \fB/M\fP to each regular expression. The size is given in +bytes for both libraries. +.TP 10 +\fB-O\fP +Behave as if each pattern has the \fB/O\fP modifier, that is disable +auto-possessification for all patterns. +.TP 10 +\fB-o\fP \fIosize\fP +Set the number of elements in the output vector that is used when calling +\fBpcre[16|32]_exec()\fP or \fBpcre[16|32]_dfa_exec()\fP to be \fIosize\fP. The +default value is 45, which is enough for 14 capturing subexpressions for +\fBpcre[16|32]_exec()\fP or 22 different matches for +\fBpcre[16|32]_dfa_exec()\fP. +The vector size can be changed for individual matching calls by including \eO +in the data line (see below). +.TP 10 +\fB-p\fP +Behave as if each pattern has the \fB/P\fP modifier; the POSIX wrapper API is +used to call PCRE. None of the other options has any effect when \fB-p\fP is +set. This option can be used only with the 8-bit library. +.TP 10 +\fB-q\fP +Do not output the version number of \fBpcretest\fP at the start of execution. +.TP 10 +\fB-S\fP \fIsize\fP +On Unix-like systems, set the size of the run-time stack to \fIsize\fP +megabytes. +.TP 10 +\fB-s\fP or \fB-s+\fP +Behave as if each pattern has the \fB/S\fP modifier; in other words, force each +pattern to be studied. If \fB-s+\fP is used, all the JIT compile options are +passed to \fBpcre[16|32]_study()\fP, causing just-in-time optimization to be set +up if it is available, for both full and partial matching. Specific JIT compile +options can be selected by following \fB-s+\fP with a digit in the range 1 to +7, which selects the JIT compile modes as follows: +.sp + 1 normal match only + 2 soft partial match only + 3 normal match and soft partial match + 4 hard partial match only + 6 soft and hard partial match + 7 all three modes (default) +.sp +If \fB-s++\fP is used instead of \fB-s+\fP (with or without a following digit), +the text "(JIT)" is added to the first output line after a match or no match +when JIT-compiled code was actually used. +.sp +Note that there are pattern options that can override \fB-s\fP, either +specifying no studying at all, or suppressing JIT compilation. +.sp +If the \fB/I\fP or \fB/D\fP option is present on a pattern (requesting output +about the compiled pattern), information about the result of studying is not +included when studying is caused only by \fB-s\fP and neither \fB-i\fP nor +\fB-d\fP is present on the command line. This behaviour means that the output +from tests that are run with and without \fB-s\fP should be identical, except +when options that output information about the actual running of a match are +set. +.sp +The \fB-M\fP, \fB-t\fP, and \fB-tm\fP options, which give information about +resources used, are likely to produce different output with and without +\fB-s\fP. Output may also differ if the \fB/C\fP option is present on an +individual pattern. This uses callouts to trace the the matching process, and +this may be different between studied and non-studied patterns. If the pattern +contains (*MARK) items there may also be differences, for the same reason. The +\fB-s\fP command line option can be overridden for specific patterns that +should never be studied (see the \fB/S\fP pattern modifier below). +.TP 10 +\fB-t\fP +Run each compile, study, and match many times with a timer, and output the +resulting times per compile, study, or match (in milliseconds). Do not set +\fB-m\fP with \fB-t\fP, because you will then get the size output a zillion +times, and the timing will be distorted. You can control the number of +iterations that are used for timing by following \fB-t\fP with a number (as a +separate item on the command line). For example, "-t 1000" iterates 1000 times. +The default is to iterate 500000 times. +.TP 10 +\fB-tm\fP +This is like \fB-t\fP except that it times only the matching phase, not the +compile or study phases. +.TP 10 +\fB-T\fP \fB-TM\fP +These behave like \fB-t\fP and \fB-tm\fP, but in addition, at the end of a run, +the total times for all compiles, studies, and matches are output. +. +. +.SH DESCRIPTION +.rs +.sp +If \fBpcretest\fP is given two filename arguments, it reads from the first and +writes to the second. If it is given only one filename argument, it reads from +that file and writes to stdout. Otherwise, it reads from stdin and writes to +stdout, and prompts for each line of input, using "re>" to prompt for regular +expressions, and "data>" to prompt for data lines. +.P +When \fBpcretest\fP is built, a configuration option can specify that it should +be linked with the \fBlibreadline\fP library. When this is done, if the input +is from a terminal, it is read using the \fBreadline()\fP function. This +provides line-editing and history facilities. The output from the \fB-help\fP +option states whether or not \fBreadline()\fP will be used. +.P +The program handles any number of sets of input on a single input file. Each +set starts with a regular expression, and continues with any number of data +lines to be matched against that pattern. +.P +Each data line is matched separately and independently. If you want to do +multi-line matches, you have to use the \en escape sequence (or \er or \er\en, +etc., depending on the newline setting) in a single line of input to encode the +newline sequences. There is no limit on the length of data lines; the input +buffer is automatically extended if it is too small. +.P +An empty line signals the end of the data lines, at which point a new regular +expression is read. The regular expressions are given enclosed in any +non-alphanumeric delimiters other than backslash, for example: +.sp + /(a|bc)x+yz/ +.sp +White space before the initial delimiter is ignored. A regular expression may +be continued over several input lines, in which case the newline characters are +included within it. It is possible to include the delimiter within the pattern +by escaping it, for example +.sp + /abc\e/def/ +.sp +If you do so, the escape and the delimiter form part of the pattern, but since +delimiters are always non-alphanumeric, this does not affect its interpretation. +If the terminating delimiter is immediately followed by a backslash, for +example, +.sp + /abc/\e +.sp +then a backslash is added to the end of the pattern. This is done to provide a +way of testing the error condition that arises if a pattern finishes with a +backslash, because +.sp + /abc\e/ +.sp +is interpreted as the first line of a pattern that starts with "abc/", causing +pcretest to read the next line as a continuation of the regular expression. +. +. +.SH "PATTERN MODIFIERS" +.rs +.sp +A pattern may be followed by any number of modifiers, which are mostly single +characters, though some of these can be qualified by further characters. +Following Perl usage, these are referred to below as, for example, "the +\fB/i\fP modifier", even though the delimiter of the pattern need not always be +a slash, and no slash is used when writing modifiers. White space may appear +between the final pattern delimiter and the first modifier, and between the +modifiers themselves. For reference, here is a complete list of modifiers. They +fall into several groups that are described in detail in the following +sections. +.sp + \fB/8\fP set UTF mode + \fB/9\fP set PCRE_NEVER_UTF (locks out UTF mode) + \fB/?\fP disable UTF validity check + \fB/+\fP show remainder of subject after match + \fB/=\fP show all captures (not just those that are set) +.sp + \fB/A\fP set PCRE_ANCHORED + \fB/B\fP show compiled code + \fB/C\fP set PCRE_AUTO_CALLOUT + \fB/D\fP same as \fB/B\fP plus \fB/I\fP + \fB/E\fP set PCRE_DOLLAR_ENDONLY + \fB/F\fP flip byte order in compiled pattern + \fB/f\fP set PCRE_FIRSTLINE + \fB/G\fP find all matches (shorten string) + \fB/g\fP find all matches (use startoffset) + \fB/I\fP show information about pattern + \fB/i\fP set PCRE_CASELESS + \fB/J\fP set PCRE_DUPNAMES + \fB/K\fP show backtracking control names + \fB/L\fP set locale + \fB/M\fP show compiled memory size + \fB/m\fP set PCRE_MULTILINE + \fB/N\fP set PCRE_NO_AUTO_CAPTURE + \fB/O\fP set PCRE_NO_AUTO_POSSESS + \fB/P\fP use the POSIX wrapper + \fB/Q\fP test external stack check function + \fB/S\fP study the pattern after compilation + \fB/s\fP set PCRE_DOTALL + \fB/T\fP select character tables + \fB/U\fP set PCRE_UNGREEDY + \fB/W\fP set PCRE_UCP + \fB/X\fP set PCRE_EXTRA + \fB/x\fP set PCRE_EXTENDED + \fB/Y\fP set PCRE_NO_START_OPTIMIZE + \fB/Z\fP don't show lengths in \fB/B\fP output +.sp + \fB/\fP set PCRE_NEWLINE_ANY + \fB/\fP set PCRE_NEWLINE_ANYCRLF + \fB/\fP set PCRE_NEWLINE_CR + \fB/\fP set PCRE_NEWLINE_CRLF + \fB/\fP set PCRE_NEWLINE_LF + \fB/\fP set PCRE_BSR_ANYCRLF + \fB/\fP set PCRE_BSR_UNICODE + \fB/\fP set PCRE_JAVASCRIPT_COMPAT +.sp +. +. +.SS "Perl-compatible modifiers" +.rs +.sp +The \fB/i\fP, \fB/m\fP, \fB/s\fP, and \fB/x\fP modifiers set the PCRE_CASELESS, +PCRE_MULTILINE, PCRE_DOTALL, or PCRE_EXTENDED options, respectively, when +\fBpcre[16|32]_compile()\fP is called. These four modifier letters have the same +effect as they do in Perl. For example: +.sp + /caseless/i +.sp +. +. +.SS "Modifiers for other PCRE options" +.rs +.sp +The following table shows additional modifiers for setting PCRE compile-time +options that do not correspond to anything in Perl: +.sp + \fB/8\fP PCRE_UTF8 ) when using the 8-bit + \fB/?\fP PCRE_NO_UTF8_CHECK ) library +.sp + \fB/8\fP PCRE_UTF16 ) when using the 16-bit + \fB/?\fP PCRE_NO_UTF16_CHECK ) library +.sp + \fB/8\fP PCRE_UTF32 ) when using the 32-bit + \fB/?\fP PCRE_NO_UTF32_CHECK ) library +.sp + \fB/9\fP PCRE_NEVER_UTF + \fB/A\fP PCRE_ANCHORED + \fB/C\fP PCRE_AUTO_CALLOUT + \fB/E\fP PCRE_DOLLAR_ENDONLY + \fB/f\fP PCRE_FIRSTLINE + \fB/J\fP PCRE_DUPNAMES + \fB/N\fP PCRE_NO_AUTO_CAPTURE + \fB/O\fP PCRE_NO_AUTO_POSSESS + \fB/U\fP PCRE_UNGREEDY + \fB/W\fP PCRE_UCP + \fB/X\fP PCRE_EXTRA + \fB/Y\fP PCRE_NO_START_OPTIMIZE + \fB/\fP PCRE_NEWLINE_ANY + \fB/\fP PCRE_NEWLINE_ANYCRLF + \fB/\fP PCRE_NEWLINE_CR + \fB/\fP PCRE_NEWLINE_CRLF + \fB/\fP PCRE_NEWLINE_LF + \fB/\fP PCRE_BSR_ANYCRLF + \fB/\fP PCRE_BSR_UNICODE + \fB/\fP PCRE_JAVASCRIPT_COMPAT +.sp +The modifiers that are enclosed in angle brackets are literal strings as shown, +including the angle brackets, but the letters within can be in either case. +This example sets multiline matching with CRLF as the line ending sequence: +.sp + /^abc/m +.sp +As well as turning on the PCRE_UTF8/16/32 option, the \fB/8\fP modifier causes +all non-printing characters in output strings to be printed using the +\ex{hh...} notation. Otherwise, those less than 0x100 are output in hex without +the curly brackets. +.P +Full details of the PCRE options are given in the +.\" HREF +\fBpcreapi\fP +.\" +documentation. +. +. +.SS "Finding all matches in a string" +.rs +.sp +Searching for all possible matches within each subject string can be requested +by the \fB/g\fP or \fB/G\fP modifier. After finding a match, PCRE is called +again to search the remainder of the subject string. The difference between +\fB/g\fP and \fB/G\fP is that the former uses the \fIstartoffset\fP argument to +\fBpcre[16|32]_exec()\fP to start searching at a new point within the entire +string (which is in effect what Perl does), whereas the latter passes over a +shortened substring. This makes a difference to the matching process if the +pattern begins with a lookbehind assertion (including \eb or \eB). +.P +If any call to \fBpcre[16|32]_exec()\fP in a \fB/g\fP or \fB/G\fP sequence matches +an empty string, the next call is done with the PCRE_NOTEMPTY_ATSTART and +PCRE_ANCHORED flags set in order to search for another, non-empty, match at the +same point. If this second match fails, the start offset is advanced, and the +normal match is retried. This imitates the way Perl handles such cases when +using the \fB/g\fP modifier or the \fBsplit()\fP function. Normally, the start +offset is advanced by one character, but if the newline convention recognizes +CRLF as a newline, and the current character is CR followed by LF, an advance +of two is used. +. +. +.SS "Other modifiers" +.rs +.sp +There are yet more modifiers for controlling the way \fBpcretest\fP +operates. +.P +The \fB/+\fP modifier requests that as well as outputting the substring that +matched the entire pattern, \fBpcretest\fP should in addition output the +remainder of the subject string. This is useful for tests where the subject +contains multiple copies of the same substring. If the \fB+\fP modifier appears +twice, the same action is taken for captured substrings. In each case the +remainder is output on the following line with a plus character following the +capture number. Note that this modifier must not immediately follow the /S +modifier because /S+ and /S++ have other meanings. +.P +The \fB/=\fP modifier requests that the values of all potential captured +parentheses be output after a match. By default, only those up to the highest +one actually used in the match are output (corresponding to the return code +from \fBpcre[16|32]_exec()\fP). Values in the offsets vector corresponding to +higher numbers should be set to -1, and these are output as "". This +modifier gives a way of checking that this is happening. +.P +The \fB/B\fP modifier is a debugging feature. It requests that \fBpcretest\fP +output a representation of the compiled code after compilation. Normally this +information contains length and offset values; however, if \fB/Z\fP is also +present, this data is replaced by spaces. This is a special feature for use in +the automatic test scripts; it ensures that the same output is generated for +different internal link sizes. +.P +The \fB/D\fP modifier is a PCRE debugging feature, and is equivalent to +\fB/BI\fP, that is, both the \fB/B\fP and the \fB/I\fP modifiers. +.P +The \fB/F\fP modifier causes \fBpcretest\fP to flip the byte order of the +2-byte and 4-byte fields in the compiled pattern. This facility is for testing +the feature in PCRE that allows it to execute patterns that were compiled on a +host with a different endianness. This feature is not available when the POSIX +interface to PCRE is being used, that is, when the \fB/P\fP pattern modifier is +specified. See also the section about saving and reloading compiled patterns +below. +.P +The \fB/I\fP modifier requests that \fBpcretest\fP output information about the +compiled pattern (whether it is anchored, has a fixed first character, and +so on). It does this by calling \fBpcre[16|32]_fullinfo()\fP after compiling a +pattern. If the pattern is studied, the results of that are also output. In +this output, the word "char" means a non-UTF character, that is, the value of a +single data item (8-bit, 16-bit, or 32-bit, depending on the library that is +being tested). +.P +The \fB/K\fP modifier requests \fBpcretest\fP to show names from backtracking +control verbs that are returned from calls to \fBpcre[16|32]_exec()\fP. It causes +\fBpcretest\fP to create a \fBpcre[16|32]_extra\fP block if one has not already +been created by a call to \fBpcre[16|32]_study()\fP, and to set the +PCRE_EXTRA_MARK flag and the \fBmark\fP field within it, every time that +\fBpcre[16|32]_exec()\fP is called. If the variable that the \fBmark\fP field +points to is non-NULL for a match, non-match, or partial match, \fBpcretest\fP +prints the string to which it points. For a match, this is shown on a line by +itself, tagged with "MK:". For a non-match it is added to the message. +.P +The \fB/L\fP modifier must be followed directly by the name of a locale, for +example, +.sp + /pattern/Lfr_FR +.sp +For this reason, it must be the last modifier. The given locale is set, +\fBpcre[16|32]_maketables()\fP is called to build a set of character tables for +the locale, and this is then passed to \fBpcre[16|32]_compile()\fP when compiling +the regular expression. Without an \fB/L\fP (or \fB/T\fP) modifier, NULL is +passed as the tables pointer; that is, \fB/L\fP applies only to the expression +on which it appears. +.P +The \fB/M\fP modifier causes the size in bytes of the memory block used to hold +the compiled pattern to be output. This does not include the size of the +\fBpcre[16|32]\fP block; it is just the actual compiled data. If the pattern is +successfully studied with the PCRE_STUDY_JIT_COMPILE option, the size of the +JIT compiled code is also output. +.P +The \fB/Q\fP modifier is used to test the use of \fBpcre_stack_guard\fP. It +must be followed by '0' or '1', specifying the return code to be given from an +external function that is passed to PCRE and used for stack checking during +compilation (see the +.\" HREF +\fBpcreapi\fP +.\" +documentation for details). +.P +The \fB/S\fP modifier causes \fBpcre[16|32]_study()\fP to be called after the +expression has been compiled, and the results used when the expression is +matched. There are a number of qualifying characters that may follow \fB/S\fP. +They may appear in any order. +.P +If \fB/S\fP is followed by an exclamation mark, \fBpcre[16|32]_study()\fP is +called with the PCRE_STUDY_EXTRA_NEEDED option, causing it always to return a +\fBpcre_extra\fP block, even when studying discovers no useful information. +.P +If \fB/S\fP is followed by a second S character, it suppresses studying, even +if it was requested externally by the \fB-s\fP command line option. This makes +it possible to specify that certain patterns are always studied, and others are +never studied, independently of \fB-s\fP. This feature is used in the test +files in a few cases where the output is different when the pattern is studied. +.P +If the \fB/S\fP modifier is followed by a + character, the call to +\fBpcre[16|32]_study()\fP is made with all the JIT study options, requesting +just-in-time optimization support if it is available, for both normal and +partial matching. If you want to restrict the JIT compiling modes, you can +follow \fB/S+\fP with a digit in the range 1 to 7: +.sp + 1 normal match only + 2 soft partial match only + 3 normal match and soft partial match + 4 hard partial match only + 6 soft and hard partial match + 7 all three modes (default) +.sp +If \fB/S++\fP is used instead of \fB/S+\fP (with or without a following digit), +the text "(JIT)" is added to the first output line after a match or no match +when JIT-compiled code was actually used. +.P +Note that there is also an independent \fB/+\fP modifier; it must not be given +immediately after \fB/S\fP or \fB/S+\fP because this will be misinterpreted. +.P +If JIT studying is successful, the compiled JIT code will automatically be used +when \fBpcre[16|32]_exec()\fP is run, except when incompatible run-time options +are specified. For more details, see the +.\" HREF +\fBpcrejit\fP +.\" +documentation. See also the \fB\eJ\fP escape sequence below for a way of +setting the size of the JIT stack. +.P +Finally, if \fB/S\fP is followed by a minus character, JIT compilation is +suppressed, even if it was requested externally by the \fB-s\fP command line +option. This makes it possible to specify that JIT is never to be used for +certain patterns. +.P +The \fB/T\fP modifier must be followed by a single digit. It causes a specific +set of built-in character tables to be passed to \fBpcre[16|32]_compile()\fP. It +is used in the standard PCRE tests to check behaviour with different character +tables. The digit specifies the tables as follows: +.sp + 0 the default ASCII tables, as distributed in + pcre_chartables.c.dist + 1 a set of tables defining ISO 8859 characters +.sp +In table 1, some characters whose codes are greater than 128 are identified as +letters, digits, spaces, etc. +. +. +.SS "Using the POSIX wrapper API" +.rs +.sp +The \fB/P\fP modifier causes \fBpcretest\fP to call PCRE via the POSIX wrapper +API rather than its native API. This supports only the 8-bit library. When +\fB/P\fP is set, the following modifiers set options for the \fBregcomp()\fP +function: +.sp + /i REG_ICASE + /m REG_NEWLINE + /N REG_NOSUB + /s REG_DOTALL ) + /U REG_UNGREEDY ) These options are not part of + /W REG_UCP ) the POSIX standard + /8 REG_UTF8 ) +.sp +The \fB/+\fP modifier works as described above. All other modifiers are +ignored. +. +. +.SS "Locking out certain modifiers" +.rs +.sp +PCRE can be compiled with or without support for certain features such as +UTF-8/16/32 or Unicode properties. Accordingly, the standard tests are split up +into a number of different files that are selected for running depending on +which features are available. When updating the tests, it is all too easy to +put a new test into the wrong file by mistake; for example, to put a test that +requires UTF support into a file that is used when it is not available. To help +detect such mistakes as early as possible, there is a facility for locking out +specific modifiers. If an input line for \fBpcretest\fP starts with the string +"< forbid " the following sequence of characters is taken as a list of +forbidden modifiers. For example, in the test files that must not use UTF or +Unicode property support, this line appears: +.sp + < forbid 8W +.sp +This locks out the /8 and /W modifiers. An immediate error is given if they are +subsequently encountered. If the character string contains < but not >, all the +multi-character modifiers that begin with < are locked out. Otherwise, such +modifiers must be explicitly listed, for example: +.sp + < forbid +.sp +There must be a single space between < and "forbid" for this feature to be +recognised. If there is not, the line is interpreted either as a request to +re-load a pre-compiled pattern (see "SAVING AND RELOADING COMPILED PATTERNS" +below) or, if there is a another < character, as a pattern that uses < as its +delimiter. +. +. +.SH "DATA LINES" +.rs +.sp +Before each data line is passed to \fBpcre[16|32]_exec()\fP, leading and trailing +white space is removed, and it is then scanned for \e escapes. Some of these +are pretty esoteric features, intended for checking out some of the more +complicated features of PCRE. If you are just testing "ordinary" regular +expressions, you probably don't need any of these. The following escapes are +recognized: +.sp + \ea alarm (BEL, \ex07) + \eb backspace (\ex08) + \ee escape (\ex27) + \ef form feed (\ex0c) + \en newline (\ex0a) +.\" JOIN + \eqdd set the PCRE_MATCH_LIMIT limit to dd + (any number of digits) + \er carriage return (\ex0d) + \et tab (\ex09) + \ev vertical tab (\ex0b) + \ennn octal character (up to 3 octal digits); always + a byte unless > 255 in UTF-8 or 16-bit or 32-bit mode + \eo{dd...} octal character (any number of octal digits} + \exhh hexadecimal byte (up to 2 hex digits) + \ex{hh...} hexadecimal character (any number of hex digits) +.\" JOIN + \eA pass the PCRE_ANCHORED option to \fBpcre[16|32]_exec()\fP + or \fBpcre[16|32]_dfa_exec()\fP +.\" JOIN + \eB pass the PCRE_NOTBOL option to \fBpcre[16|32]_exec()\fP + or \fBpcre[16|32]_dfa_exec()\fP +.\" JOIN + \eCdd call pcre[16|32]_copy_substring() for substring dd + after a successful match (number less than 32) +.\" JOIN + \eCname call pcre[16|32]_copy_named_substring() for substring + "name" after a successful match (name termin- + ated by next non alphanumeric character) +.\" JOIN + \eC+ show the current captured substrings at callout + time + \eC- do not supply a callout function +.\" JOIN + \eC!n return 1 instead of 0 when callout number n is + reached +.\" JOIN + \eC!n!m return 1 instead of 0 when callout number n is + reached for the nth time +.\" JOIN + \eC*n pass the number n (may be negative) as callout + data; this is used as the callout return value + \eD use the \fBpcre[16|32]_dfa_exec()\fP match function + \eF only shortest match for \fBpcre[16|32]_dfa_exec()\fP +.\" JOIN + \eGdd call pcre[16|32]_get_substring() for substring dd + after a successful match (number less than 32) +.\" JOIN + \eGname call pcre[16|32]_get_named_substring() for substring + "name" after a successful match (name termin- + ated by next non-alphanumeric character) +.\" JOIN + \eJdd set up a JIT stack of dd kilobytes maximum (any + number of digits) +.\" JOIN + \eL call pcre[16|32]_get_substringlist() after a + successful match +.\" JOIN + \eM discover the minimum MATCH_LIMIT and + MATCH_LIMIT_RECURSION settings +.\" JOIN + \eN pass the PCRE_NOTEMPTY option to \fBpcre[16|32]_exec()\fP + or \fBpcre[16|32]_dfa_exec()\fP; if used twice, pass the + PCRE_NOTEMPTY_ATSTART option +.\" JOIN + \eOdd set the size of the output vector passed to + \fBpcre[16|32]_exec()\fP to dd (any number of digits) +.\" JOIN + \eP pass the PCRE_PARTIAL_SOFT option to \fBpcre[16|32]_exec()\fP + or \fBpcre[16|32]_dfa_exec()\fP; if used twice, pass the + PCRE_PARTIAL_HARD option +.\" JOIN + \eQdd set the PCRE_MATCH_LIMIT_RECURSION limit to dd + (any number of digits) + \eR pass the PCRE_DFA_RESTART option to \fBpcre[16|32]_dfa_exec()\fP + \eS output details of memory get/free calls during matching +.\" JOIN + \eY pass the PCRE_NO_START_OPTIMIZE option to \fBpcre[16|32]_exec()\fP + or \fBpcre[16|32]_dfa_exec()\fP +.\" JOIN + \eZ pass the PCRE_NOTEOL option to \fBpcre[16|32]_exec()\fP + or \fBpcre[16|32]_dfa_exec()\fP +.\" JOIN + \e? pass the PCRE_NO_UTF[8|16|32]_CHECK option to + \fBpcre[16|32]_exec()\fP or \fBpcre[16|32]_dfa_exec()\fP +.\" JOIN + \e>dd start the match at offset dd (optional "-"; then + any number of digits); this sets the \fIstartoffset\fP + argument for \fBpcre[16|32]_exec()\fP or \fBpcre[16|32]_dfa_exec()\fP +.\" JOIN + \e pass the PCRE_NEWLINE_CR option to \fBpcre[16|32]_exec()\fP + or \fBpcre[16|32]_dfa_exec()\fP +.\" JOIN + \e pass the PCRE_NEWLINE_LF option to \fBpcre[16|32]_exec()\fP + or \fBpcre[16|32]_dfa_exec()\fP +.\" JOIN + \e pass the PCRE_NEWLINE_CRLF option to \fBpcre[16|32]_exec()\fP + or \fBpcre[16|32]_dfa_exec()\fP +.\" JOIN + \e pass the PCRE_NEWLINE_ANYCRLF option to \fBpcre[16|32]_exec()\fP + or \fBpcre[16|32]_dfa_exec()\fP +.\" JOIN + \e pass the PCRE_NEWLINE_ANY option to \fBpcre[16|32]_exec()\fP + or \fBpcre[16|32]_dfa_exec()\fP +.sp +The use of \ex{hh...} is not dependent on the use of the \fB/8\fP modifier on +the pattern. It is recognized always. There may be any number of hexadecimal +digits inside the braces; invalid values provoke error messages. +.P +Note that \exhh specifies one byte rather than one character in UTF-8 mode; +this makes it possible to construct invalid UTF-8 sequences for testing +purposes. On the other hand, \ex{hh} is interpreted as a UTF-8 character in +UTF-8 mode, generating more than one byte if the value is greater than 127. +When testing the 8-bit library not in UTF-8 mode, \ex{hh} generates one byte +for values less than 256, and causes an error for greater values. +.P +In UTF-16 mode, all 4-digit \ex{hhhh} values are accepted. This makes it +possible to construct invalid UTF-16 sequences for testing purposes. +.P +In UTF-32 mode, all 4- to 8-digit \ex{...} values are accepted. This makes it +possible to construct invalid UTF-32 sequences for testing purposes. +.P +The escapes that specify line ending sequences are literal strings, exactly as +shown. No more than one newline setting should be present in any data line. +.P +A backslash followed by anything else just escapes the anything else. If +the very last character is a backslash, it is ignored. This gives a way of +passing an empty line as data, since a real empty line terminates the data +input. +.P +The \fB\eJ\fP escape provides a way of setting the maximum stack size that is +used by the just-in-time optimization code. It is ignored if JIT optimization +is not being used. Providing a stack that is larger than the default 32K is +necessary only for very complicated patterns. +.P +If \eM is present, \fBpcretest\fP calls \fBpcre[16|32]_exec()\fP several times, +with different values in the \fImatch_limit\fP and \fImatch_limit_recursion\fP +fields of the \fBpcre[16|32]_extra\fP data structure, until it finds the minimum +numbers for each parameter that allow \fBpcre[16|32]_exec()\fP to complete without +error. Because this is testing a specific feature of the normal interpretive +\fBpcre[16|32]_exec()\fP execution, the use of any JIT optimization that might +have been set up by the \fB/S+\fP qualifier of \fB-s+\fP option is disabled. +.P +The \fImatch_limit\fP number is a measure of the amount of backtracking +that takes place, and checking it out can be instructive. For most simple +matches, the number is quite small, but for patterns with very large numbers of +matching possibilities, it can become large very quickly with increasing length +of subject string. The \fImatch_limit_recursion\fP number is a measure of how +much stack (or, if PCRE is compiled with NO_RECURSE, how much heap) memory is +needed to complete the match attempt. +.P +When \eO is used, the value specified may be higher or lower than the size set +by the \fB-O\fP command line option (or defaulted to 45); \eO applies only to +the call of \fBpcre[16|32]_exec()\fP for the line in which it appears. +.P +If the \fB/P\fP modifier was present on the pattern, causing the POSIX wrapper +API to be used, the only option-setting sequences that have any effect are \eB, +\eN, and \eZ, causing REG_NOTBOL, REG_NOTEMPTY, and REG_NOTEOL, respectively, +to be passed to \fBregexec()\fP. +. +. +.SH "THE ALTERNATIVE MATCHING FUNCTION" +.rs +.sp +By default, \fBpcretest\fP uses the standard PCRE matching function, +\fBpcre[16|32]_exec()\fP to match each data line. PCRE also supports an +alternative matching function, \fBpcre[16|32]_dfa_test()\fP, which operates in a +different way, and has some restrictions. The differences between the two +functions are described in the +.\" HREF +\fBpcrematching\fP +.\" +documentation. +.P +If a data line contains the \eD escape sequence, or if the command line +contains the \fB-dfa\fP option, the alternative matching function is used. +This function finds all possible matches at a given point. If, however, the \eF +escape sequence is present in the data line, it stops after the first match is +found. This is always the shortest possible match. +. +. +.SH "DEFAULT OUTPUT FROM PCRETEST" +.rs +.sp +This section describes the output when the normal matching function, +\fBpcre[16|32]_exec()\fP, is being used. +.P +When a match succeeds, \fBpcretest\fP outputs the list of captured substrings +that \fBpcre[16|32]_exec()\fP returns, starting with number 0 for the string that +matched the whole pattern. Otherwise, it outputs "No match" when the return is +PCRE_ERROR_NOMATCH, and "Partial match:" followed by the partially matching +substring when \fBpcre[16|32]_exec()\fP returns PCRE_ERROR_PARTIAL. (Note that +this is the entire substring that was inspected during the partial match; it +may include characters before the actual match start if a lookbehind assertion, +\eK, \eb, or \eB was involved.) For any other return, \fBpcretest\fP outputs +the PCRE negative error number and a short descriptive phrase. If the error is +a failed UTF string check, the offset of the start of the failing character and +the reason code are also output, provided that the size of the output vector is +at least two. Here is an example of an interactive \fBpcretest\fP run. +.sp + $ pcretest + PCRE version 8.13 2011-04-30 +.sp + re> /^abc(\ed+)/ + data> abc123 + 0: abc123 + 1: 123 + data> xyz + No match +.sp +Unset capturing substrings that are not followed by one that is set are not +returned by \fBpcre[16|32]_exec()\fP, and are not shown by \fBpcretest\fP. In the +following example, there are two capturing substrings, but when the first data +line is matched, the second, unset substring is not shown. An "internal" unset +substring is shown as "", as for the second data line. +.sp + re> /(a)|(b)/ + data> a + 0: a + 1: a + data> b + 0: b + 1: + 2: b +.sp +If the strings contain any non-printing characters, they are output as \exhh +escapes if the value is less than 256 and UTF mode is not set. Otherwise they +are output as \ex{hh...} escapes. See below for the definition of non-printing +characters. If the pattern has the \fB/+\fP modifier, the output for substring +0 is followed by the the rest of the subject string, identified by "0+" like +this: +.sp + re> /cat/+ + data> cataract + 0: cat + 0+ aract +.sp +If the pattern has the \fB/g\fP or \fB/G\fP modifier, the results of successive +matching attempts are output in sequence, like this: +.sp + re> /\eBi(\ew\ew)/g + data> Mississippi + 0: iss + 1: ss + 0: iss + 1: ss + 0: ipp + 1: pp +.sp +"No match" is output only if the first match attempt fails. Here is an example +of a failure message (the offset 4 that is specified by \e>4 is past the end of +the subject string): +.sp + re> /xyz/ + data> xyz\e>4 + Error -24 (bad offset value) +.P +If any of the sequences \fB\eC\fP, \fB\eG\fP, or \fB\eL\fP are present in a +data line that is successfully matched, the substrings extracted by the +convenience functions are output with C, G, or L after the string number +instead of a colon. This is in addition to the normal full list. The string +length (that is, the return from the extraction function) is given in +parentheses after each string for \fB\eC\fP and \fB\eG\fP. +.P +Note that whereas patterns can be continued over several lines (a plain ">" +prompt is used for continuations), data lines may not. However newlines can be +included in data by means of the \en escape (or \er, \er\en, etc., depending on +the newline sequence setting). +. +. +. +.SH "OUTPUT FROM THE ALTERNATIVE MATCHING FUNCTION" +.rs +.sp +When the alternative matching function, \fBpcre[16|32]_dfa_exec()\fP, is used (by +means of the \eD escape sequence or the \fB-dfa\fP command line option), the +output consists of a list of all the matches that start at the first point in +the subject where there is at least one match. For example: +.sp + re> /(tang|tangerine|tan)/ + data> yellow tangerine\eD + 0: tangerine + 1: tang + 2: tan +.sp +(Using the normal matching function on this data finds only "tang".) The +longest matching string is always given first (and numbered zero). After a +PCRE_ERROR_PARTIAL return, the output is "Partial match:", followed by the +partially matching substring. (Note that this is the entire substring that was +inspected during the partial match; it may include characters before the actual +match start if a lookbehind assertion, \eK, \eb, or \eB was involved.) +.P +If \fB/g\fP is present on the pattern, the search for further matches resumes +at the end of the longest match. For example: +.sp + re> /(tang|tangerine|tan)/g + data> yellow tangerine and tangy sultana\eD + 0: tangerine + 1: tang + 2: tan + 0: tang + 1: tan + 0: tan +.sp +Since the matching function does not support substring capture, the escape +sequences that are concerned with captured substrings are not relevant. +. +. +.SH "RESTARTING AFTER A PARTIAL MATCH" +.rs +.sp +When the alternative matching function has given the PCRE_ERROR_PARTIAL return, +indicating that the subject partially matched the pattern, you can restart the +match with additional subject data by means of the \eR escape sequence. For +example: +.sp + re> /^\ed?\ed(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\ed\ed$/ + data> 23ja\eP\eD + Partial match: 23ja + data> n05\eR\eD + 0: n05 +.sp +For further information about partial matching, see the +.\" HREF +\fBpcrepartial\fP +.\" +documentation. +. +. +.SH CALLOUTS +.rs +.sp +If the pattern contains any callout requests, \fBpcretest\fP's callout function +is called during matching. This works with both matching functions. By default, +the called function displays the callout number, the start and current +positions in the text at the callout time, and the next pattern item to be +tested. For example: +.sp + --->pqrabcdef + 0 ^ ^ \ed +.sp +This output indicates that callout number 0 occurred for a match attempt +starting at the fourth character of the subject string, when the pointer was at +the seventh character of the data, and when the next pattern item was \ed. Just +one circumflex is output if the start and current positions are the same. +.P +Callouts numbered 255 are assumed to be automatic callouts, inserted as a +result of the \fB/C\fP pattern modifier. In this case, instead of showing the +callout number, the offset in the pattern, preceded by a plus, is output. For +example: +.sp + re> /\ed?[A-E]\e*/C + data> E* + --->E* + +0 ^ \ed? + +3 ^ [A-E] + +8 ^^ \e* + +10 ^ ^ + 0: E* +.sp +If a pattern contains (*MARK) items, an additional line is output whenever +a change of latest mark is passed to the callout function. For example: +.sp + re> /a(*MARK:X)bc/C + data> abc + --->abc + +0 ^ a + +1 ^^ (*MARK:X) + +10 ^^ b + Latest Mark: X + +11 ^ ^ c + +12 ^ ^ + 0: abc +.sp +The mark changes between matching "a" and "b", but stays the same for the rest +of the match, so nothing more is output. If, as a result of backtracking, the +mark reverts to being unset, the text "" is output. +.P +The callout function in \fBpcretest\fP returns zero (carry on matching) by +default, but you can use a \eC item in a data line (as described above) to +change this and other parameters of the callout. +.P +Inserting callouts can be helpful when using \fBpcretest\fP to check +complicated regular expressions. For further information about callouts, see +the +.\" HREF +\fBpcrecallout\fP +.\" +documentation. +. +. +. +.SH "NON-PRINTING CHARACTERS" +.rs +.sp +When \fBpcretest\fP is outputting text in the compiled version of a pattern, +bytes other than 32-126 are always treated as non-printing characters are are +therefore shown as hex escapes. +.P +When \fBpcretest\fP is outputting text that is a matched part of a subject +string, it behaves in the same way, unless a different locale has been set for +the pattern (using the \fB/L\fP modifier). In this case, the \fBisprint()\fP +function to distinguish printing and non-printing characters. +. +. +. +.SH "SAVING AND RELOADING COMPILED PATTERNS" +.rs +.sp +The facilities described in this section are not available when the POSIX +interface to PCRE is being used, that is, when the \fB/P\fP pattern modifier is +specified. +.P +When the POSIX interface is not in use, you can cause \fBpcretest\fP to write a +compiled pattern to a file, by following the modifiers with > and a file name. +For example: +.sp + /pattern/im >/some/file +.sp +See the +.\" HREF +\fBpcreprecompile\fP +.\" +documentation for a discussion about saving and re-using compiled patterns. +Note that if the pattern was successfully studied with JIT optimization, the +JIT data cannot be saved. +.P +The data that is written is binary. The first eight bytes are the length of the +compiled pattern data followed by the length of the optional study data, each +written as four bytes in big-endian order (most significant byte first). If +there is no study data (either the pattern was not studied, or studying did not +return any data), the second length is zero. The lengths are followed by an +exact copy of the compiled pattern. If there is additional study data, this +(excluding any JIT data) follows immediately after the compiled pattern. After +writing the file, \fBpcretest\fP expects to read a new pattern. +.P +A saved pattern can be reloaded into \fBpcretest\fP by specifying < and a file +name instead of a pattern. There must be no space between < and the file name, +which must not contain a < character, as otherwise \fBpcretest\fP will +interpret the line as a pattern delimited by < characters. For example: +.sp + re> " to prompt for regular expressions, and "data>" to prompt for data + lines. + + When pcretest is built, a configuration option can specify that it + should be linked with the libreadline library. When this is done, if + the input is from a terminal, it is read using the readline() function. + This provides line-editing and history facilities. The output from the + -help option states whether or not readline() will be used. + + The program handles any number of sets of input on a single input file. + Each set starts with a regular expression, and continues with any num- + ber of data lines to be matched against that pattern. + + Each data line is matched separately and independently. If you want to + do multi-line matches, you have to use the \n escape sequence (or \r or + \r\n, etc., depending on the newline setting) in a single line of input + to encode the newline sequences. There is no limit on the length of + data lines; the input buffer is automatically extended if it is too + small. + + An empty line signals the end of the data lines, at which point a new + regular expression is read. The regular expressions are given enclosed + in any non-alphanumeric delimiters other than backslash, for example: + + /(a|bc)x+yz/ + + White space before the initial delimiter is ignored. A regular expres- + sion may be continued over several input lines, in which case the new- + line characters are included within it. It is possible to include the + delimiter within the pattern by escaping it, for example + + /abc\/def/ + + If you do so, the escape and the delimiter form part of the pattern, + but since delimiters are always non-alphanumeric, this does not affect + its interpretation. If the terminating delimiter is immediately fol- + lowed by a backslash, for example, + + /abc/\ + + then a backslash is added to the end of the pattern. This is done to + provide a way of testing the error condition that arises if a pattern + finishes with a backslash, because + + /abc\/ + + is interpreted as the first line of a pattern that starts with "abc/", + causing pcretest to read the next line as a continuation of the regular + expression. + + +PATTERN MODIFIERS + + A pattern may be followed by any number of modifiers, which are mostly + single characters, though some of these can be qualified by further + characters. Following Perl usage, these are referred to below as, for + example, "the /i modifier", even though the delimiter of the pattern + need not always be a slash, and no slash is used when writing modi- + fiers. White space may appear between the final pattern delimiter and + the first modifier, and between the modifiers themselves. For refer- + ence, here is a complete list of modifiers. They fall into several + groups that are described in detail in the following sections. + + /8 set UTF mode + /9 set PCRE_NEVER_UTF (locks out UTF mode) + /? disable UTF validity check + /+ show remainder of subject after match + /= show all captures (not just those that are set) + + /A set PCRE_ANCHORED + /B show compiled code + /C set PCRE_AUTO_CALLOUT + /D same as /B plus /I + /E set PCRE_DOLLAR_ENDONLY + /F flip byte order in compiled pattern + /f set PCRE_FIRSTLINE + /G find all matches (shorten string) + /g find all matches (use startoffset) + /I show information about pattern + /i set PCRE_CASELESS + /J set PCRE_DUPNAMES + /K show backtracking control names + /L set locale + /M show compiled memory size + /m set PCRE_MULTILINE + /N set PCRE_NO_AUTO_CAPTURE + /O set PCRE_NO_AUTO_POSSESS + /P use the POSIX wrapper + /Q test external stack check function + /S study the pattern after compilation + /s set PCRE_DOTALL + /T select character tables + /U set PCRE_UNGREEDY + /W set PCRE_UCP + /X set PCRE_EXTRA + /x set PCRE_EXTENDED + /Y set PCRE_NO_START_OPTIMIZE + /Z don't show lengths in /B output + + / set PCRE_NEWLINE_ANY + / set PCRE_NEWLINE_ANYCRLF + / set PCRE_NEWLINE_CR + / set PCRE_NEWLINE_CRLF + / set PCRE_NEWLINE_LF + / set PCRE_BSR_ANYCRLF + / set PCRE_BSR_UNICODE + / set PCRE_JAVASCRIPT_COMPAT + + + Perl-compatible modifiers + + The /i, /m, /s, and /x modifiers set the PCRE_CASELESS, PCRE_MULTILINE, + PCRE_DOTALL, or PCRE_EXTENDED options, respectively, when + pcre[16|32]_compile() is called. These four modifier letters have the + same effect as they do in Perl. For example: + + /caseless/i + + + Modifiers for other PCRE options + + The following table shows additional modifiers for setting PCRE com- + pile-time options that do not correspond to anything in Perl: + + /8 PCRE_UTF8 ) when using the 8-bit + /? PCRE_NO_UTF8_CHECK ) library + + /8 PCRE_UTF16 ) when using the 16-bit + /? PCRE_NO_UTF16_CHECK ) library + + /8 PCRE_UTF32 ) when using the 32-bit + /? PCRE_NO_UTF32_CHECK ) library + + /9 PCRE_NEVER_UTF + /A PCRE_ANCHORED + /C PCRE_AUTO_CALLOUT + /E PCRE_DOLLAR_ENDONLY + /f PCRE_FIRSTLINE + /J PCRE_DUPNAMES + /N PCRE_NO_AUTO_CAPTURE + /O PCRE_NO_AUTO_POSSESS + /U PCRE_UNGREEDY + /W PCRE_UCP + /X PCRE_EXTRA + /Y PCRE_NO_START_OPTIMIZE + / PCRE_NEWLINE_ANY + / PCRE_NEWLINE_ANYCRLF + / PCRE_NEWLINE_CR + / PCRE_NEWLINE_CRLF + / PCRE_NEWLINE_LF + / PCRE_BSR_ANYCRLF + / PCRE_BSR_UNICODE + / PCRE_JAVASCRIPT_COMPAT + + The modifiers that are enclosed in angle brackets are literal strings + as shown, including the angle brackets, but the letters within can be + in either case. This example sets multiline matching with CRLF as the + line ending sequence: + + /^abc/m + + As well as turning on the PCRE_UTF8/16/32 option, the /8 modifier + causes all non-printing characters in output strings to be printed us- + ing the \x{hh...} notation. Otherwise, those less than 0x100 are output + in hex without the curly brackets. + + Full details of the PCRE options are given in the pcreapi documenta- + tion. + + Finding all matches in a string + + Searching for all possible matches within each subject string can be + requested by the /g or /G modifier. After finding a match, PCRE is + called again to search the remainder of the subject string. The differ- + ence between /g and /G is that the former uses the startoffset argument + to pcre[16|32]_exec() to start searching at a new point within the en- + tire string (which is in effect what Perl does), whereas the latter + passes over a shortened substring. This makes a difference to the + matching process if the pattern begins with a lookbehind assertion (in- + cluding \b or \B). + + If any call to pcre[16|32]_exec() in a /g or /G sequence matches an + empty string, the next call is done with the PCRE_NOTEMPTY_ATSTART and + PCRE_ANCHORED flags set in order to search for another, non-empty, + match at the same point. If this second match fails, the start offset + is advanced, and the normal match is retried. This imitates the way + Perl handles such cases when using the /g modifier or the split() func- + tion. Normally, the start offset is advanced by one character, but if + the newline convention recognizes CRLF as a newline, and the current + character is CR followed by LF, an advance of two is used. + + Other modifiers + + There are yet more modifiers for controlling the way pcretest operates. + + The /+ modifier requests that as well as outputting the substring that + matched the entire pattern, pcretest should in addition output the re- + mainder of the subject string. This is useful for tests where the sub- + ject contains multiple copies of the same substring. If the + modifier + appears twice, the same action is taken for captured substrings. In + each case the remainder is output on the following line with a plus + character following the capture number. Note that this modifier must + not immediately follow the /S modifier because /S+ and /S++ have other + meanings. + + The /= modifier requests that the values of all potential captured + parentheses be output after a match. By default, only those up to the + highest one actually used in the match are output (corresponding to the + return code from pcre[16|32]_exec()). Values in the offsets vector cor- + responding to higher numbers should be set to -1, and these are output + as "". This modifier gives a way of checking that this is hap- + pening. + + The /B modifier is a debugging feature. It requests that pcretest out- + put a representation of the compiled code after compilation. Normally + this information contains length and offset values; however, if /Z is + also present, this data is replaced by spaces. This is a special fea- + ture for use in the automatic test scripts; it ensures that the same + output is generated for different internal link sizes. + + The /D modifier is a PCRE debugging feature, and is equivalent to /BI, + that is, both the /B and the /I modifiers. + + The /F modifier causes pcretest to flip the byte order of the 2-byte + and 4-byte fields in the compiled pattern. This facility is for testing + the feature in PCRE that allows it to execute patterns that were com- + piled on a host with a different endianness. This feature is not avail- + able when the POSIX interface to PCRE is being used, that is, when the + /P pattern modifier is specified. See also the section about saving and + reloading compiled patterns below. + + The /I modifier requests that pcretest output information about the + compiled pattern (whether it is anchored, has a fixed first character, + and so on). It does this by calling pcre[16|32]_fullinfo() after com- + piling a pattern. If the pattern is studied, the results of that are + also output. In this output, the word "char" means a non-UTF character, + that is, the value of a single data item (8-bit, 16-bit, or 32-bit, de- + pending on the library that is being tested). + + The /K modifier requests pcretest to show names from backtracking con- + trol verbs that are returned from calls to pcre[16|32]_exec(). It + causes pcretest to create a pcre[16|32]_extra block if one has not al- + ready been created by a call to pcre[16|32]_study(), and to set the + PCRE_EXTRA_MARK flag and the mark field within it, every time that + pcre[16|32]_exec() is called. If the variable that the mark field + points to is non-NULL for a match, non-match, or partial match, + pcretest prints the string to which it points. For a match, this is + shown on a line by itself, tagged with "MK:". For a non-match it is + added to the message. + + The /L modifier must be followed directly by the name of a locale, for + example, + + /pattern/Lfr_FR + + For this reason, it must be the last modifier. The given locale is set, + pcre[16|32]_maketables() is called to build a set of character tables + for the locale, and this is then passed to pcre[16|32]_compile() when + compiling the regular expression. Without an /L (or /T) modifier, NULL + is passed as the tables pointer; that is, /L applies only to the ex- + pression on which it appears. + + The /M modifier causes the size in bytes of the memory block used to + hold the compiled pattern to be output. This does not include the size + of the pcre[16|32] block; it is just the actual compiled data. If the + pattern is successfully studied with the PCRE_STUDY_JIT_COMPILE option, + the size of the JIT compiled code is also output. + + The /Q modifier is used to test the use of pcre_stack_guard. It must be + followed by '0' or '1', specifying the return code to be given from an + external function that is passed to PCRE and used for stack checking + during compilation (see the pcreapi documentation for details). + + The /S modifier causes pcre[16|32]_study() to be called after the ex- + pression has been compiled, and the results used when the expression is + matched. There are a number of qualifying characters that may follow + /S. They may appear in any order. + + If /S is followed by an exclamation mark, pcre[16|32]_study() is called + with the PCRE_STUDY_EXTRA_NEEDED option, causing it always to return a + pcre_extra block, even when studying discovers no useful information. + + If /S is followed by a second S character, it suppresses studying, even + if it was requested externally by the -s command line option. This + makes it possible to specify that certain patterns are always studied, + and others are never studied, independently of -s. This feature is used + in the test files in a few cases where the output is different when the + pattern is studied. + + If the /S modifier is followed by a + character, the call to + pcre[16|32]_study() is made with all the JIT study options, requesting + just-in-time optimization support if it is available, for both normal + and partial matching. If you want to restrict the JIT compiling modes, + you can follow /S+ with a digit in the range 1 to 7: + + 1 normal match only + 2 soft partial match only + 3 normal match and soft partial match + 4 hard partial match only + 6 soft and hard partial match + 7 all three modes (default) + + If /S++ is used instead of /S+ (with or without a following digit), the + text "(JIT)" is added to the first output line after a match or no + match when JIT-compiled code was actually used. + + Note that there is also an independent /+ modifier; it must not be + given immediately after /S or /S+ because this will be misinterpreted. + + If JIT studying is successful, the compiled JIT code will automatically + be used when pcre[16|32]_exec() is run, except when incompatible run- + time options are specified. For more details, see the pcrejit documen- + tation. See also the \J escape sequence below for a way of setting the + size of the JIT stack. + + Finally, if /S is followed by a minus character, JIT compilation is + suppressed, even if it was requested externally by the -s command line + option. This makes it possible to specify that JIT is never to be used + for certain patterns. + + The /T modifier must be followed by a single digit. It causes a spe- + cific set of built-in character tables to be passed to pcre[16|32]_com- + pile(). It is used in the standard PCRE tests to check behaviour with + different character tables. The digit specifies the tables as follows: + + 0 the default ASCII tables, as distributed in + pcre_chartables.c.dist + 1 a set of tables defining ISO 8859 characters + + In table 1, some characters whose codes are greater than 128 are iden- + tified as letters, digits, spaces, etc. + + Using the POSIX wrapper API + + The /P modifier causes pcretest to call PCRE via the POSIX wrapper API + rather than its native API. This supports only the 8-bit library. When + /P is set, the following modifiers set options for the regcomp() func- + tion: + + /i REG_ICASE + /m REG_NEWLINE + /N REG_NOSUB + /s REG_DOTALL ) + /U REG_UNGREEDY ) These options are not part of + /W REG_UCP ) the POSIX standard + /8 REG_UTF8 ) + + The /+ modifier works as described above. All other modifiers are ig- + nored. + + Locking out certain modifiers + + PCRE can be compiled with or without support for certain features such + as UTF-8/16/32 or Unicode properties. Accordingly, the standard tests + are split up into a number of different files that are selected for + running depending on which features are available. When updating the + tests, it is all too easy to put a new test into the wrong file by mis- + take; for example, to put a test that requires UTF support into a file + that is used when it is not available. To help detect such mistakes as + early as possible, there is a facility for locking out specific modi- + fiers. If an input line for pcretest starts with the string "< forbid " + the following sequence of characters is taken as a list of forbidden + modifiers. For example, in the test files that must not use UTF or Uni- + code property support, this line appears: + + < forbid 8W + + This locks out the /8 and /W modifiers. An immediate error is given if + they are subsequently encountered. If the character string contains < + but not >, all the multi-character modifiers that begin with < are + locked out. Otherwise, such modifiers must be explicitly listed, for + example: + + < forbid + + There must be a single space between < and "forbid" for this feature to + be recognised. If there is not, the line is interpreted either as a re- + quest to re-load a pre-compiled pattern (see "SAVING AND RELOADING COM- + PILED PATTERNS" below) or, if there is a another < character, as a pat- + tern that uses < as its delimiter. + + +DATA LINES + + Before each data line is passed to pcre[16|32]_exec(), leading and + trailing white space is removed, and it is then scanned for \ escapes. + Some of these are pretty esoteric features, intended for checking out + some of the more complicated features of PCRE. If you are just testing + "ordinary" regular expressions, you probably don't need any of these. + The following escapes are recognized: + + \a alarm (BEL, \x07) + \b backspace (\x08) + \e escape (\x27) + \f form feed (\x0c) + \n newline (\x0a) + \qdd set the PCRE_MATCH_LIMIT limit to dd + (any number of digits) + \r carriage return (\x0d) + \t tab (\x09) + \v vertical tab (\x0b) + \nnn octal character (up to 3 octal digits); always + a byte unless > 255 in UTF-8 or 16-bit or 32-bit mode + \o{dd...} octal character (any number of octal digits} + \xhh hexadecimal byte (up to 2 hex digits) + \x{hh...} hexadecimal character (any number of hex digits) + \A pass the PCRE_ANCHORED option to pcre[16|32]_exec() + or pcre[16|32]_dfa_exec() + \B pass the PCRE_NOTBOL option to pcre[16|32]_exec() + or pcre[16|32]_dfa_exec() + \Cdd call pcre[16|32]_copy_substring() for substring dd + after a successful match (number less than 32) + \Cname call pcre[16|32]_copy_named_substring() for substring + "name" after a successful match (name termin- + ated by next non alphanumeric character) + \C+ show the current captured substrings at callout + time + \C- do not supply a callout function + \C!n return 1 instead of 0 when callout number n is + reached + \C!n!m return 1 instead of 0 when callout number n is + reached for the nth time + \C*n pass the number n (may be negative) as callout + data; this is used as the callout return value + \D use the pcre[16|32]_dfa_exec() match function + \F only shortest match for pcre[16|32]_dfa_exec() + \Gdd call pcre[16|32]_get_substring() for substring dd + after a successful match (number less than 32) + \Gname call pcre[16|32]_get_named_substring() for substring + "name" after a successful match (name termin- + ated by next non-alphanumeric character) + \Jdd set up a JIT stack of dd kilobytes maximum (any + number of digits) + \L call pcre[16|32]_get_substringlist() after a + successful match + \M discover the minimum MATCH_LIMIT and + MATCH_LIMIT_RECURSION settings + \N pass the PCRE_NOTEMPTY option to pcre[16|32]_exec() + or pcre[16|32]_dfa_exec(); if used twice, pass the + PCRE_NOTEMPTY_ATSTART option + \Odd set the size of the output vector passed to + pcre[16|32]_exec() to dd (any number of digits) + \P pass the PCRE_PARTIAL_SOFT option to pcre[16|32]_exec() + or pcre[16|32]_dfa_exec(); if used twice, pass the + PCRE_PARTIAL_HARD option + \Qdd set the PCRE_MATCH_LIMIT_RECURSION limit to dd + (any number of digits) + \R pass the PCRE_DFA_RESTART option to pcre[16|32]_dfa_exec() + \S output details of memory get/free calls during matching + \Y pass the PCRE_NO_START_OPTIMIZE option to + pcre[16|32]_exec() + or pcre[16|32]_dfa_exec() + \Z pass the PCRE_NOTEOL option to pcre[16|32]_exec() + or pcre[16|32]_dfa_exec() + \? pass the PCRE_NO_UTF[8|16|32]_CHECK option to + pcre[16|32]_exec() or pcre[16|32]_dfa_exec() + \>dd start the match at offset dd (optional "-"; then + any number of digits); this sets the startoffset + argument for pcre[16|32]_exec() or + pcre[16|32]_dfa_exec() + \ pass the PCRE_NEWLINE_CR option to pcre[16|32]_exec() + or pcre[16|32]_dfa_exec() + \ pass the PCRE_NEWLINE_LF option to pcre[16|32]_exec() + or pcre[16|32]_dfa_exec() + \ pass the PCRE_NEWLINE_CRLF option to pcre[16|32]_exec() + or pcre[16|32]_dfa_exec() + \ pass the PCRE_NEWLINE_ANYCRLF option to pcre[16|32]_exec() + or pcre[16|32]_dfa_exec() + \ pass the PCRE_NEWLINE_ANY option to pcre[16|32]_exec() + or pcre[16|32]_dfa_exec() + + The use of \x{hh...} is not dependent on the use of the /8 modifier on + the pattern. It is recognized always. There may be any number of hexa- + decimal digits inside the braces; invalid values provoke error mes- + sages. + + Note that \xhh specifies one byte rather than one character in UTF-8 + mode; this makes it possible to construct invalid UTF-8 sequences for + testing purposes. On the other hand, \x{hh} is interpreted as a UTF-8 + character in UTF-8 mode, generating more than one byte if the value is + greater than 127. When testing the 8-bit library not in UTF-8 mode, + \x{hh} generates one byte for values less than 256, and causes an error + for greater values. + + In UTF-16 mode, all 4-digit \x{hhhh} values are accepted. This makes it + possible to construct invalid UTF-16 sequences for testing purposes. + + In UTF-32 mode, all 4- to 8-digit \x{...} values are accepted. This + makes it possible to construct invalid UTF-32 sequences for testing + purposes. + + The escapes that specify line ending sequences are literal strings, ex- + actly as shown. No more than one newline setting should be present in + any data line. + + A backslash followed by anything else just escapes the anything else. + If the very last character is a backslash, it is ignored. This gives a + way of passing an empty line as data, since a real empty line termi- + nates the data input. + + The \J escape provides a way of setting the maximum stack size that is + used by the just-in-time optimization code. It is ignored if JIT opti- + mization is not being used. Providing a stack that is larger than the + default 32K is necessary only for very complicated patterns. + + If \M is present, pcretest calls pcre[16|32]_exec() several times, with + different values in the match_limit and match_limit_recursion fields of + the pcre[16|32]_extra data structure, until it finds the minimum num- + bers for each parameter that allow pcre[16|32]_exec() to complete with- + out error. Because this is testing a specific feature of the normal in- + terpretive pcre[16|32]_exec() execution, the use of any JIT optimiza- + tion that might have been set up by the /S+ qualifier of -s+ option is + disabled. + + The match_limit number is a measure of the amount of backtracking that + takes place, and checking it out can be instructive. For most simple + matches, the number is quite small, but for patterns with very large + numbers of matching possibilities, it can become large very quickly + with increasing length of subject string. The match_limit_recursion + number is a measure of how much stack (or, if PCRE is compiled with + NO_RECURSE, how much heap) memory is needed to complete the match at- + tempt. + + When \O is used, the value specified may be higher or lower than the + size set by the -O command line option (or defaulted to 45); \O applies + only to the call of pcre[16|32]_exec() for the line in which it ap- + pears. + + If the /P modifier was present on the pattern, causing the POSIX wrap- + per API to be used, the only option-setting sequences that have any ef- + fect are \B, \N, and \Z, causing REG_NOTBOL, REG_NOTEMPTY, and REG_NO- + TEOL, respectively, to be passed to regexec(). + + +THE ALTERNATIVE MATCHING FUNCTION + + By default, pcretest uses the standard PCRE matching function, + pcre[16|32]_exec() to match each data line. PCRE also supports an al- + ternative matching function, pcre[16|32]_dfa_test(), which operates in + a different way, and has some restrictions. The differences between the + two functions are described in the pcrematching documentation. + + If a data line contains the \D escape sequence, or if the command line + contains the -dfa option, the alternative matching function is used. + This function finds all possible matches at a given point. If, however, + the \F escape sequence is present in the data line, it stops after the + first match is found. This is always the shortest possible match. + + +DEFAULT OUTPUT FROM PCRETEST + + This section describes the output when the normal matching function, + pcre[16|32]_exec(), is being used. + + When a match succeeds, pcretest outputs the list of captured substrings + that pcre[16|32]_exec() returns, starting with number 0 for the string + that matched the whole pattern. Otherwise, it outputs "No match" when + the return is PCRE_ERROR_NOMATCH, and "Partial match:" followed by the + partially matching substring when pcre[16|32]_exec() returns PCRE_ER- + ROR_PARTIAL. (Note that this is the entire substring that was inspected + during the partial match; it may include characters before the actual + match start if a lookbehind assertion, \K, \b, or \B was involved.) For + any other return, pcretest outputs the PCRE negative error number and a + short descriptive phrase. If the error is a failed UTF string check, + the offset of the start of the failing character and the reason code + are also output, provided that the size of the output vector is at + least two. Here is an example of an interactive pcretest run. + + $ pcretest + PCRE version 8.13 2011-04-30 + + re> /^abc(\d+)/ + data> abc123 + 0: abc123 + 1: 123 + data> xyz + No match + + Unset capturing substrings that are not followed by one that is set are + not returned by pcre[16|32]_exec(), and are not shown by pcretest. In + the following example, there are two capturing substrings, but when the + first data line is matched, the second, unset substring is not shown. + An "internal" unset substring is shown as "", as for the second + data line. + + re> /(a)|(b)/ + data> a + 0: a + 1: a + data> b + 0: b + 1: + 2: b + + If the strings contain any non-printing characters, they are output as + \xhh escapes if the value is less than 256 and UTF mode is not set. + Otherwise they are output as \x{hh...} escapes. See below for the defi- + nition of non-printing characters. If the pattern has the /+ modifier, + the output for substring 0 is followed by the the rest of the subject + string, identified by "0+" like this: + + re> /cat/+ + data> cataract + 0: cat + 0+ aract + + If the pattern has the /g or /G modifier, the results of successive + matching attempts are output in sequence, like this: + + re> /\Bi(\w\w)/g + data> Mississippi + 0: iss + 1: ss + 0: iss + 1: ss + 0: ipp + 1: pp + + "No match" is output only if the first match attempt fails. Here is an + example of a failure message (the offset 4 that is specified by \>4 is + past the end of the subject string): + + re> /xyz/ + data> xyz\>4 + Error -24 (bad offset value) + + If any of the sequences \C, \G, or \L are present in a data line that + is successfully matched, the substrings extracted by the convenience + functions are output with C, G, or L after the string number instead of + a colon. This is in addition to the normal full list. The string length + (that is, the return from the extraction function) is given in paren- + theses after each string for \C and \G. + + Note that whereas patterns can be continued over several lines (a plain + ">" prompt is used for continuations), data lines may not. However new- + lines can be included in data by means of the \n escape (or \r, \r\n, + etc., depending on the newline sequence setting). + + +OUTPUT FROM THE ALTERNATIVE MATCHING FUNCTION + + When the alternative matching function, pcre[16|32]_dfa_exec(), is used + (by means of the \D escape sequence or the -dfa command line option), + the output consists of a list of all the matches that start at the + first point in the subject where there is at least one match. For exam- + ple: + + re> /(tang|tangerine|tan)/ + data> yellow tangerine\D + 0: tangerine + 1: tang + 2: tan + + (Using the normal matching function on this data finds only "tang".) + The longest matching string is always given first (and numbered zero). + After a PCRE_ERROR_PARTIAL return, the output is "Partial match:", fol- + lowed by the partially matching substring. (Note that this is the en- + tire substring that was inspected during the partial match; it may in- + clude characters before the actual match start if a lookbehind asser- + tion, \K, \b, or \B was involved.) + + If /g is present on the pattern, the search for further matches resumes + at the end of the longest match. For example: + + re> /(tang|tangerine|tan)/g + data> yellow tangerine and tangy sultana\D + 0: tangerine + 1: tang + 2: tan + 0: tang + 1: tan + 0: tan + + Since the matching function does not support substring capture, the es- + cape sequences that are concerned with captured substrings are not rel- + evant. + + +RESTARTING AFTER A PARTIAL MATCH + + When the alternative matching function has given the PCRE_ERROR_PARTIAL + return, indicating that the subject partially matched the pattern, you + can restart the match with additional subject data by means of the \R + escape sequence. For example: + + re> /^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$/ + data> 23ja\P\D + Partial match: 23ja + data> n05\R\D + 0: n05 + + For further information about partial matching, see the pcrepartial + documentation. + + +CALLOUTS + + If the pattern contains any callout requests, pcretest's callout func- + tion is called during matching. This works with both matching func- + tions. By default, the called function displays the callout number, the + start and current positions in the text at the callout time, and the + next pattern item to be tested. For example: + + --->pqrabcdef + 0 ^ ^ \d + + This output indicates that callout number 0 occurred for a match at- + tempt starting at the fourth character of the subject string, when the + pointer was at the seventh character of the data, and when the next + pattern item was \d. Just one circumflex is output if the start and + current positions are the same. + + Callouts numbered 255 are assumed to be automatic callouts, inserted as + a result of the /C pattern modifier. In this case, instead of showing + the callout number, the offset in the pattern, preceded by a plus, is + output. For example: + + re> /\d?[A-E]\*/C + data> E* + --->E* + +0 ^ \d? + +3 ^ [A-E] + +8 ^^ \* + +10 ^ ^ + 0: E* + + If a pattern contains (*MARK) items, an additional line is output when- + ever a change of latest mark is passed to the callout function. For ex- + ample: + + re> /a(*MARK:X)bc/C + data> abc + --->abc + +0 ^ a + +1 ^^ (*MARK:X) + +10 ^^ b + Latest Mark: X + +11 ^ ^ c + +12 ^ ^ + 0: abc + + The mark changes between matching "a" and "b", but stays the same for + the rest of the match, so nothing more is output. If, as a result of + backtracking, the mark reverts to being unset, the text "" is + output. + + The callout function in pcretest returns zero (carry on matching) by + default, but you can use a \C item in a data line (as described above) + to change this and other parameters of the callout. + + Inserting callouts can be helpful when using pcretest to check compli- + cated regular expressions. For further information about callouts, see + the pcrecallout documentation. + + +NON-PRINTING CHARACTERS + + When pcretest is outputting text in the compiled version of a pattern, + bytes other than 32-126 are always treated as non-printing characters + are are therefore shown as hex escapes. + + When pcretest is outputting text that is a matched part of a subject + string, it behaves in the same way, unless a different locale has been + set for the pattern (using the /L modifier). In this case, the is- + print() function to distinguish printing and non-printing characters. + + +SAVING AND RELOADING COMPILED PATTERNS + + The facilities described in this section are not available when the + POSIX interface to PCRE is being used, that is, when the /P pattern + modifier is specified. + + When the POSIX interface is not in use, you can cause pcretest to write + a compiled pattern to a file, by following the modifiers with > and a + file name. For example: + + /pattern/im >/some/file + + See the pcreprecompile documentation for a discussion about saving and + re-using compiled patterns. Note that if the pattern was successfully + studied with JIT optimization, the JIT data cannot be saved. + + The data that is written is binary. The first eight bytes are the + length of the compiled pattern data followed by the length of the op- + tional study data, each written as four bytes in big-endian order (most + significant byte first). If there is no study data (either the pattern + was not studied, or studying did not return any data), the second + length is zero. The lengths are followed by an exact copy of the com- + piled pattern. If there is additional study data, this (excluding any + JIT data) follows immediately after the compiled pattern. After writing + the file, pcretest expects to read a new pattern. + + A saved pattern can be reloaded into pcretest by specifying < and a + file name instead of a pattern. There must be no space between < and + the file name, which must not contain a < character, as otherwise + pcretest will interpret the line as a pattern delimited by < charac- + ters. For example: + + re> +.SS "Validity of UTF-8 strings" +.rs +.sp +When you set the PCRE_UTF8 flag, the byte strings passed as patterns and +subjects are (by default) checked for validity on entry to the relevant +functions. The entire string is checked before any other processing takes +place. From release 7.3 of PCRE, the check is according the rules of RFC 3629, +which are themselves derived from the Unicode specification. Earlier releases +of PCRE followed the rules of RFC 2279, which allows the full range of 31-bit +values (0 to 0x7FFFFFFF). The current check allows only values in the range U+0 +to U+10FFFF, excluding the surrogate area. (From release 8.33 the so-called +"non-character" code points are no longer excluded because Unicode corrigendum +#9 makes it clear that they should not be.) +.P +Characters in the "Surrogate Area" of Unicode are reserved for use by UTF-16, +where they are used in pairs to encode codepoints with values greater than +0xFFFF. The code points that are encoded by UTF-16 pairs are available +independently in the UTF-8 and UTF-32 encodings. (In other words, the whole +surrogate thing is a fudge for UTF-16 which unfortunately messes up UTF-8 and +UTF-32.) +.P +If an invalid UTF-8 string is passed to PCRE, an error return is given. At +compile time, the only additional information is the offset to the first byte +of the failing character. The run-time functions \fBpcre_exec()\fP and +\fBpcre_dfa_exec()\fP also pass back this information, as well as a more +detailed reason code if the caller has provided memory in which to do this. +.P +In some situations, you may already know that your strings are valid, and +therefore want to skip these checks in order to improve performance, for +example in the case of a long subject string that is being scanned repeatedly. +If you set the PCRE_NO_UTF8_CHECK flag at compile time or at run time, PCRE +assumes that the pattern or subject it is given (respectively) contains only +valid UTF-8 codes. In this case, it does not diagnose an invalid UTF-8 string. +.P +Note that passing PCRE_NO_UTF8_CHECK to \fBpcre_compile()\fP just disables the +check for the pattern; it does not also apply to subject strings. If you want +to disable the check for a subject string you must pass this option to +\fBpcre_exec()\fP or \fBpcre_dfa_exec()\fP. +.P +If you pass an invalid UTF-8 string when PCRE_NO_UTF8_CHECK is set, the result +is undefined and your program may crash. +. +. +.\" HTML +.SS "Validity of UTF-16 strings" +.rs +.sp +When you set the PCRE_UTF16 flag, the strings of 16-bit data units that are +passed as patterns and subjects are (by default) checked for validity on entry +to the relevant functions. Values other than those in the surrogate range +U+D800 to U+DFFF are independent code points. Values in the surrogate range +must be used in pairs in the correct manner. +.P +If an invalid UTF-16 string is passed to PCRE, an error return is given. At +compile time, the only additional information is the offset to the first data +unit of the failing character. The run-time functions \fBpcre16_exec()\fP and +\fBpcre16_dfa_exec()\fP also pass back this information, as well as a more +detailed reason code if the caller has provided memory in which to do this. +.P +In some situations, you may already know that your strings are valid, and +therefore want to skip these checks in order to improve performance. If you set +the PCRE_NO_UTF16_CHECK flag at compile time or at run time, PCRE assumes that +the pattern or subject it is given (respectively) contains only valid UTF-16 +sequences. In this case, it does not diagnose an invalid UTF-16 string. +However, if an invalid string is passed, the result is undefined. +. +. +.\" HTML +.SS "Validity of UTF-32 strings" +.rs +.sp +When you set the PCRE_UTF32 flag, the strings of 32-bit data units that are +passed as patterns and subjects are (by default) checked for validity on entry +to the relevant functions. This check allows only values in the range U+0 +to U+10FFFF, excluding the surrogate area U+D800 to U+DFFF. +.P +If an invalid UTF-32 string is passed to PCRE, an error return is given. At +compile time, the only additional information is the offset to the first data +unit of the failing character. The run-time functions \fBpcre32_exec()\fP and +\fBpcre32_dfa_exec()\fP also pass back this information, as well as a more +detailed reason code if the caller has provided memory in which to do this. +.P +In some situations, you may already know that your strings are valid, and +therefore want to skip these checks in order to improve performance. If you set +the PCRE_NO_UTF32_CHECK flag at compile time or at run time, PCRE assumes that +the pattern or subject it is given (respectively) contains only valid UTF-32 +sequences. In this case, it does not diagnose an invalid UTF-32 string. +However, if an invalid string is passed, the result is undefined. +. +. +.SS "General comments about UTF modes" +.rs +.sp +1. Codepoints less than 256 can be specified in patterns by either braced or +unbraced hexadecimal escape sequences (for example, \ex{b3} or \exb3). Larger +values have to use braced sequences. +.P +2. Octal numbers up to \e777 are recognized, and in UTF-8 mode they match +two-byte characters for values greater than \e177. +.P +3. Repeat quantifiers apply to complete UTF characters, not to individual +data units, for example: \ex{100}{3}. +.P +4. The dot metacharacter matches one UTF character instead of a single data +unit. +.P +5. The escape sequence \eC can be used to match a single byte in UTF-8 mode, or +a single 16-bit data unit in UTF-16 mode, or a single 32-bit data unit in +UTF-32 mode, but its use can lead to some strange effects because it breaks up +multi-unit characters (see the description of \eC in the +.\" HREF +\fBpcrepattern\fP +.\" +documentation). The use of \eC is not supported in the alternative matching +function \fBpcre[16|32]_dfa_exec()\fP, nor is it supported in UTF mode by the +JIT optimization of \fBpcre[16|32]_exec()\fP. If JIT optimization is requested +for a UTF pattern that contains \eC, it will not succeed, and so the matching +will be carried out by the normal interpretive function. +.P +6. The character escapes \eb, \eB, \ed, \eD, \es, \eS, \ew, and \eW correctly +test characters of any code value, but, by default, the characters that PCRE +recognizes as digits, spaces, or word characters remain the same set as in +non-UTF mode, all with values less than 256. This remains true even when PCRE +is built to include Unicode property support, because to do otherwise would +slow down PCRE in many common cases. Note in particular that this applies to +\eb and \eB, because they are defined in terms of \ew and \eW. If you really +want to test for a wider sense of, say, "digit", you can use explicit Unicode +property tests such as \ep{Nd}. Alternatively, if you set the PCRE_UCP option, +the way that the character escapes work is changed so that Unicode properties +are used to determine which characters match. There are more details in the +section on +.\" HTML +.\" +generic character types +.\" +in the +.\" HREF +\fBpcrepattern\fP +.\" +documentation. +.P +7. Similarly, characters that match the POSIX named character classes are all +low-valued characters, unless the PCRE_UCP option is set. +.P +8. However, the horizontal and vertical white space matching escapes (\eh, \eH, +\ev, and \eV) do match all the appropriate Unicode characters, whether or not +PCRE_UCP is set. +.P +9. Case-insensitive matching applies only to characters whose values are less +than 128, unless PCRE is built with Unicode property support. A few Unicode +characters such as Greek sigma have more than two codepoints that are +case-equivalent. Up to and including PCRE release 8.31, only one-to-one case +mappings were supported, but later releases (with Unicode property support) do +treat as case-equivalent all versions of characters such as Greek sigma. +. +. +.SH AUTHOR +.rs +.sp +.nf +Philip Hazel +University Computing Service +Cambridge CB2 3QH, England. +.fi +. +. +.SH REVISION +.rs +.sp +.nf +Last updated: 27 February 2013 +Copyright (c) 1997-2013 University of Cambridge. +.fi diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/perltest.txt b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/perltest.txt new file mode 100755 index 000000000..bb1a52a48 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/doc/perltest.txt @@ -0,0 +1,42 @@ +The perltest program +-------------------- + +The perltest.pl script tests Perl's regular expressions; it has the same +specification as pcretest, and so can be given identical input, except that +input patterns can be followed only by Perl's lower case modifiers and certain +other pcretest modifiers that are either handled or ignored: + + /+ recognized and handled by perltest + /++ the second + is ignored + /8 recognized and handled by perltest + /J ignored + /K ignored + /W ignored + /S ignored + /SS ignored + /Y ignored + +The pcretest \Y escape in data lines is removed before matching. The data lines +are processed as Perl double-quoted strings, so if they contain " $ or @ +characters, these have to be escaped. For this reason, all such characters in +the Perl-compatible testinput1 file are escaped so that they can be used for +perltest as well as for pcretest. The special upper case pattern modifiers such +as /A that pcretest recognizes, and its special data line escapes, are not used +in the Perl-compatible test file. The output should be identical, apart from +the initial identifying banner. + +The perltest.pl script can also test UTF-8 features. It recognizes the special +modifier /8 that pcretest uses to invoke UTF-8 functionality. The testinput4 +and testinput6 files can be fed to perltest to run compatible UTF-8 tests. +However, it is necessary to add "use utf8; require Encode" to the script to +make this work correctly. I have not managed to find a way to handle this +automatically. + +The other testinput files are not suitable for feeding to perltest.pl, since +they make use of the special upper case modifiers and escapes that pcretest +uses to test certain features of PCRE. Some of these files also contain +malformed regular expressions, in order to check that PCRE diagnoses them +correctly. + +Philip Hazel +January 2012 diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/install-sh b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/install-sh new file mode 100755 index 000000000..8175c640f --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/install-sh @@ -0,0 +1,518 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2018-03-11.20; # UTC + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# 'make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. + +tab=' ' +nl=' +' +IFS=" $tab$nl" + +# Set DOITPROG to "echo" to test this script. + +doit=${DOITPROG-} +doit_exec=${doit:-exec} + +# Put in absolute file names if you don't have them in your path; +# or use environment vars. + +chgrpprog=${CHGRPPROG-chgrp} +chmodprog=${CHMODPROG-chmod} +chownprog=${CHOWNPROG-chown} +cmpprog=${CMPPROG-cmp} +cpprog=${CPPROG-cp} +mkdirprog=${MKDIRPROG-mkdir} +mvprog=${MVPROG-mv} +rmprog=${RMPROG-rm} +stripprog=${STRIPPROG-strip} + +posix_mkdir= + +# Desired mode of installed file. +mode=0755 + +chgrpcmd= +chmodcmd=$chmodprog +chowncmd= +mvcmd=$mvprog +rmcmd="$rmprog -f" +stripcmd= + +src= +dst= +dir_arg= +dst_arg= + +copy_on_change=false +is_target_a_directory=possibly + +usage="\ +Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 [OPTION]... -t DIRECTORY SRCFILES... + or: $0 [OPTION]... -d DIRECTORIES... + +In the 1st form, copy SRCFILE to DSTFILE. +In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. +In the 4th, create DIRECTORIES. + +Options: + --help display this help and exit. + --version display version info and exit. + + -c (ignored) + -C install only if different (preserve the last data modification time) + -d create directories instead of installing files. + -g GROUP $chgrpprog installed files to GROUP. + -m MODE $chmodprog installed files to MODE. + -o USER $chownprog installed files to USER. + -s $stripprog installed files. + -t DIRECTORY install into DIRECTORY. + -T report an error if DSTFILE is a directory. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG + RMPROG STRIPPROG +" + +while test $# -ne 0; do + case $1 in + -c) ;; + + -C) copy_on_change=true;; + + -d) dir_arg=true;; + + -g) chgrpcmd="$chgrpprog $2" + shift;; + + --help) echo "$usage"; exit $?;; + + -m) mode=$2 + case $mode in + *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; + + -o) chowncmd="$chownprog $2" + shift;; + + -s) stripcmd=$stripprog;; + + -t) + is_target_a_directory=always + dst_arg=$2 + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + shift;; + + -T) is_target_a_directory=never;; + + --version) echo "$0 $scriptversion"; exit $?;; + + --) shift + break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; + esac + shift +done + +# We allow the use of options -d and -T together, by making -d +# take the precedence; this is for compatibility with GNU install. + +if test -n "$dir_arg"; then + if test -n "$dst_arg"; then + echo "$0: target directory not allowed when installing a directory." >&2 + exit 1 + fi +fi + +if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then + # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dst_arg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dst_arg" + shift # fnord + fi + shift # arg + dst_arg=$arg + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + done +fi + +if test $# -eq 0; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call 'install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +if test -z "$dir_arg"; then + if test $# -gt 1 || test "$is_target_a_directory" = always; then + if test ! -d "$dst_arg"; then + echo "$0: $dst_arg: Is not a directory." >&2 + exit 1 + fi + fi +fi + +if test -z "$dir_arg"; then + do_exit='(exit $ret); exit $ret' + trap "ret=129; $do_exit" 1 + trap "ret=130; $do_exit" 2 + trap "ret=141; $do_exit" 13 + trap "ret=143; $do_exit" 15 + + # Set umask so as not to create temps with too-generous modes. + # However, 'strip' requires both read and write access to temps. + case $mode in + # Optimize common cases. + *644) cp_umask=133;; + *755) cp_umask=22;; + + *[0-7]) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw='% 200' + fi + cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; + *) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw=,u+rw + fi + cp_umask=$mode$u_plus_rw;; + esac +fi + +for src +do + # Protect names problematic for 'test' and other utilities. + case $src in + -* | [=\(\)!]) src=./$src;; + esac + + if test -n "$dir_arg"; then + dst=$src + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? + else + + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dst_arg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + dst=$dst_arg + + # If destination is a directory, append the input filename. + if test -d "$dst"; then + if test "$is_target_a_directory" = never; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 + fi + dstdir=$dst + dstbase=`basename "$src"` + case $dst in + */) dst=$dst$dstbase;; + *) dst=$dst/$dstbase;; + esac + dstdir_status=0 + else + dstdir=`dirname "$dst"` + test -d "$dstdir" + dstdir_status=$? + fi + fi + + case $dstdir in + */) dstdirslash=$dstdir;; + *) dstdirslash=$dstdir/;; + esac + + obsolete_mkdir_used=false + + if test $dstdir_status != 0; then + case $posix_mkdir in + '') + # Create intermediate dirs using mode 755 as modified by the umask. + # This is like FreeBSD 'install' as of 1997-10-28. + umask=`umask` + case $stripcmd.$umask in + # Optimize common cases. + *[2367][2367]) mkdir_umask=$umask;; + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; + + *[0-7]) + mkdir_umask=`expr $umask + 22 \ + - $umask % 100 % 40 + $umask % 20 \ + - $umask % 10 % 4 + $umask % 2 + `;; + *) mkdir_umask=$umask,go-w;; + esac + + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + case $umask in + *[123567][0-7][0-7]) + # POSIX mkdir -p sets u+wx bits regardless of umask, which + # is incompatible with FreeBSD 'install' when (umask & 300) != 0. + ;; + *) + # Note that $RANDOM variable is not portable (e.g. dash); Use it + # here however when possible just to lower collision chance. + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + + trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0 + + # Because "mkdir -p" follows existing symlinks and we likely work + # directly in world-writeable /tmp, make sure that the '$tmpdir' + # directory is successfully created first before we actually test + # 'mkdir -p' feature. + if (umask $mkdir_umask && + $mkdirprog $mkdir_mode "$tmpdir" && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + test_tmpdir="$tmpdir/a" + ls_ld_tmpdir=`ls -ld "$test_tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null + fi + trap '' 0;; + esac;; + esac + + if + $posix_mkdir && ( + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + ) + then : + else + + # The umask is ridiculous, or mkdir does not conform to POSIX, + # or it failed possibly due to a race condition. Create the + # directory the slow way, step by step, checking for races as we go. + + case $dstdir in + /*) prefix='/';; + [-=\(\)!]*) prefix='./';; + *) prefix='';; + esac + + oIFS=$IFS + IFS=/ + set -f + set fnord $dstdir + shift + set +f + IFS=$oIFS + + prefixes= + + for d + do + test X"$d" = X && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask=$mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ + done + + if test -n "$prefixes"; then + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true + fi + fi + fi + + if test -n "$dir_arg"; then + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || + test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 + else + + # Make a couple of temp file names in the proper directory. + dsttmp=${dstdirslash}_inst.$$_ + rmtmp=${dstdirslash}_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 + + # Copy the file name to the temp name. + (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && + { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && + { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && + + # If -C, don't bother to copy if it wouldn't change the file. + if $copy_on_change && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + set -f && + set X $old && old=:$2:$4:$5:$6 && + set X $new && new=:$2:$4:$5:$6 && + set +f && + test "$old" = "$new" && + $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 + then + rm -f "$dsttmp" + else + # Rename the file to the real destination. + $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || + + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + { + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + test ! -f "$dst" || + $doit $rmcmd -f "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } + } || + { echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" + } + fi || exit 1 + + trap '' 0 + fi +done + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/libpcre.pc.in b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/libpcre.pc.in new file mode 100755 index 000000000..0a35da87f --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/libpcre.pc.in @@ -0,0 +1,13 @@ +# Package Information for pkg-config + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: libpcre +Description: PCRE - Perl compatible regular expressions C library with 8 bit character support +Version: @PACKAGE_VERSION@ +Libs: -L${libdir} -lpcre +Libs.private: @PTHREAD_CFLAGS@ @PTHREAD_LIBS@ +Cflags: -I${includedir} @PCRE_STATIC_CFLAG@ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/libpcre16.pc.in b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/libpcre16.pc.in new file mode 100755 index 000000000..080c9dcfe --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/libpcre16.pc.in @@ -0,0 +1,13 @@ +# Package Information for pkg-config + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: libpcre16 +Description: PCRE - Perl compatible regular expressions C library with 16 bit character support +Version: @PACKAGE_VERSION@ +Libs: -L${libdir} -lpcre16 +Libs.private: @PTHREAD_CFLAGS@ @PTHREAD_LIBS@ +Cflags: -I${includedir} @PCRE_STATIC_CFLAG@ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/libpcre32.pc.in b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/libpcre32.pc.in new file mode 100755 index 000000000..a3ae0e11f --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/libpcre32.pc.in @@ -0,0 +1,13 @@ +# Package Information for pkg-config + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: libpcre32 +Description: PCRE - Perl compatible regular expressions C library with 32 bit character support +Version: @PACKAGE_VERSION@ +Libs: -L${libdir} -lpcre32 +Libs.private: @PTHREAD_CFLAGS@ @PTHREAD_LIBS@ +Cflags: -I${includedir} @PCRE_STATIC_CFLAG@ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/libpcrecpp.pc.in b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/libpcrecpp.pc.in new file mode 100755 index 000000000..ef006fe47 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/libpcrecpp.pc.in @@ -0,0 +1,12 @@ +# Package Information for pkg-config + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: libpcrecpp +Description: PCRECPP - C++ wrapper for PCRE +Version: @PACKAGE_VERSION@ +Libs: -L${libdir} -lpcre -lpcrecpp +Cflags: -I${includedir} @PCRE_STATIC_CFLAG@ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/libpcreposix.pc.in b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/libpcreposix.pc.in new file mode 100755 index 000000000..c6c0b0c6c --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/libpcreposix.pc.in @@ -0,0 +1,13 @@ +# Package Information for pkg-config + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: libpcreposix +Description: PCREPosix - Posix compatible interface to libpcre +Version: @PACKAGE_VERSION@ +Libs: -L${libdir} -lpcreposix +Cflags: -I${includedir} @PCRE_STATIC_CFLAG@ +Requires.private: libpcre diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/ltmain.sh b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/ltmain.sh new file mode 100755 index 000000000..d3ab94d6f --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/ltmain.sh @@ -0,0 +1,11369 @@ +#! /bin/sh +## DO NOT EDIT - This file generated from ./build-aux/ltmain.in +## by inline-source v2018-07-24.06 + +# libtool (GNU libtool) 2.4.6.42-b88ce +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit , 1996 + +# Copyright (C) 1996-2018 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +PROGRAM=libtool +PACKAGE=libtool +VERSION=2.4.6.42-b88ce +package_revision=2.4.6.42 + + +## ------ ## +## Usage. ## +## ------ ## + +# Run './libtool --help' for help with using this script from the +# command line. + + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# After configure completes, it has a better idea of some of the +# shell tools we need than the defaults used by the functions shared +# with bootstrap, so set those here where they can still be over- +# ridden by the user, but otherwise take precedence. + +: ${AUTOCONF="autoconf"} +: ${AUTOMAKE="automake"} + + +## -------------------------- ## +## Source external libraries. ## +## -------------------------- ## + +# Much of our low-level functionality needs to be sourced from external +# libraries, which are installed to $pkgauxdir. + +# Set a version string for this script. +scriptversion=2018-07-24.06; # UTC + +# General shell script boiler plate, and helper functions. +# Written by Gary V. Vaughan, 2004 + +# This is free software. There is NO warranty; not even for +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# +# Copyright (C) 2004-2018 Bootstrap Authors +# +# This file is dual licensed under the terms of the MIT license +# , and GPL version 3 or later +# . You must apply one of +# these licenses when using or redistributing this software or any of +# the files within it. See the URLs above, or the file `LICENSE` +# included in the Bootstrap distribution for the full license texts. + +# Please report bugs or propose patches to: +# + + +## ------ ## +## Usage. ## +## ------ ## + +# Evaluate this file near the top of your script to gain access to +# the functions and variables defined here: +# +# . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh +# +# If you need to override any of the default environment variable +# settings, do that before evaluating this file. + + +## -------------------- ## +## Shell normalisation. ## +## -------------------- ## + +# Some shells need a little help to be as Bourne compatible as possible. +# Before doing anything else, make sure all that help has been provided! + +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac +fi + +# NLS nuisances: We save the old values in case they are required later. +_G_user_locale= +_G_safe_locale= +for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES +do + eval "if test set = \"\${$_G_var+set}\"; then + save_$_G_var=\$$_G_var + $_G_var=C + export $_G_var + _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\" + _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\" + fi" +done + +# Make sure IFS has a sensible default +sp=' ' +nl=' +' +IFS="$sp $nl" + +# There are apparently some retarded systems that use ';' as a PATH separator! +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# func_unset VAR +# -------------- +# Portably unset VAR. +# In some shells, an 'unset VAR' statement leaves a non-zero return +# status if VAR is already unset, which might be problematic if the +# statement is used at the end of a function (thus poisoning its return +# value) or when 'set -e' is active (causing even a spurious abort of +# the script in this case). +func_unset () +{ + { eval $1=; (eval unset $1) >/dev/null 2>&1 && eval unset $1 || : ; } +} + + +# Make sure CDPATH doesn't cause `cd` commands to output the target dir. +func_unset CDPATH + +# Make sure ${,E,F}GREP behave sanely. +func_unset GREP_OPTIONS + + +## ------------------------- ## +## Locate command utilities. ## +## ------------------------- ## + + +# func_executable_p FILE +# ---------------------- +# Check that FILE is an executable regular file. +func_executable_p () +{ + test -f "$1" && test -x "$1" +} + + +# func_path_progs PROGS_LIST CHECK_FUNC [PATH] +# -------------------------------------------- +# Search for either a program that responds to --version with output +# containing "GNU", or else returned by CHECK_FUNC otherwise, by +# trying all the directories in PATH with each of the elements of +# PROGS_LIST. +# +# CHECK_FUNC should accept the path to a candidate program, and +# set $func_check_prog_result if it truncates its output less than +# $_G_path_prog_max characters. +func_path_progs () +{ + _G_progs_list=$1 + _G_check_func=$2 + _G_PATH=${3-"$PATH"} + + _G_path_prog_max=0 + _G_path_prog_found=false + _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:} + for _G_dir in $_G_PATH; do + IFS=$_G_save_IFS + test -z "$_G_dir" && _G_dir=. + for _G_prog_name in $_G_progs_list; do + for _exeext in '' .EXE; do + _G_path_prog=$_G_dir/$_G_prog_name$_exeext + func_executable_p "$_G_path_prog" || continue + case `"$_G_path_prog" --version 2>&1` in + *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;; + *) $_G_check_func $_G_path_prog + func_path_progs_result=$func_check_prog_result + ;; + esac + $_G_path_prog_found && break 3 + done + done + done + IFS=$_G_save_IFS + test -z "$func_path_progs_result" && { + echo "no acceptable sed could be found in \$PATH" >&2 + exit 1 + } +} + + +# We want to be able to use the functions in this file before configure +# has figured out where the best binaries are kept, which means we have +# to search for them ourselves - except when the results are already set +# where we skip the searches. + +# Unless the user overrides by setting SED, search the path for either GNU +# sed, or the sed that truncates its output the least. +test -z "$SED" && { + _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for _G_i in 1 2 3 4 5 6 7; do + _G_sed_script=$_G_sed_script$nl$_G_sed_script + done + echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed + _G_sed_script= + + func_check_prog_sed () + { + _G_path_prog=$1 + + _G_count=0 + printf 0123456789 >conftest.in + while : + do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo '' >> conftest.nl + "$_G_path_prog" -f conftest.sed conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + _G_count=`expr $_G_count + 1` + if test "$_G_count" -gt "$_G_path_prog_max"; then + # Best one so far, save it but keep looking for a better one + func_check_prog_result=$_G_path_prog + _G_path_prog_max=$_G_count + fi + # 10*(2^10) chars as input seems more than enough + test 10 -lt "$_G_count" && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out + } + + func_path_progs "sed gsed" func_check_prog_sed "$PATH:/usr/xpg4/bin" + rm -f conftest.sed + SED=$func_path_progs_result +} + + +# Unless the user overrides by setting GREP, search the path for either GNU +# grep, or the grep that truncates its output the least. +test -z "$GREP" && { + func_check_prog_grep () + { + _G_path_prog=$1 + + _G_count=0 + _G_path_prog_max=0 + printf 0123456789 >conftest.in + while : + do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo 'GREP' >> conftest.nl + "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + _G_count=`expr $_G_count + 1` + if test "$_G_count" -gt "$_G_path_prog_max"; then + # Best one so far, save it but keep looking for a better one + func_check_prog_result=$_G_path_prog + _G_path_prog_max=$_G_count + fi + # 10*(2^10) chars as input seems more than enough + test 10 -lt "$_G_count" && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out + } + + func_path_progs "grep ggrep" func_check_prog_grep "$PATH:/usr/xpg4/bin" + GREP=$func_path_progs_result +} + + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# All uppercase variable names are used for environment variables. These +# variables can be overridden by the user before calling a script that +# uses them if a suitable command of that name is not already available +# in the command search PATH. + +: ${CP="cp -f"} +: ${ECHO="printf %s\n"} +: ${EGREP="$GREP -E"} +: ${FGREP="$GREP -F"} +: ${LN_S="ln -s"} +: ${MAKE="make"} +: ${MKDIR="mkdir"} +: ${MV="mv -f"} +: ${RM="rm -f"} +: ${SHELL="${CONFIG_SHELL-/bin/sh}"} + + +## -------------------- ## +## Useful sed snippets. ## +## -------------------- ## + +sed_dirname='s|/[^/]*$||' +sed_basename='s|^.*/||' + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='s|\([`"$\\]\)|\\\1|g' + +# Same as above, but do not quote variable references. +sed_double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution that turns a string into a regex matching for the +# string literally. +sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g' + +# Sed substitution that converts a w32 file name or path +# that contains forward slashes, into one that contains +# (escaped) backslashes. A very naive implementation. +sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + +# Re-'\' parameter expansions in output of sed_double_quote_subst that +# were '\'-ed in input to the same. If an odd number of '\' preceded a +# '$' in input to sed_double_quote_subst, that '$' was protected from +# expansion. Since each input '\' is now two '\'s, look for any number +# of runs of four '\'s followed by two '\'s and then a '$'. '\' that '$'. +_G_bs='\\' +_G_bs2='\\\\' +_G_bs4='\\\\\\\\' +_G_dollar='\$' +sed_double_backslash="\ + s/$_G_bs4/&\\ +/g + s/^$_G_bs2$_G_dollar/$_G_bs&/ + s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g + s/\n//g" + + +## ----------------- ## +## Global variables. ## +## ----------------- ## + +# Except for the global variables explicitly listed below, the following +# functions in the '^func_' namespace, and the '^require_' namespace +# variables initialised in the 'Resource management' section, sourcing +# this file will not pollute your global namespace with anything +# else. There's no portable way to scope variables in Bourne shell +# though, so actually running these functions will sometimes place +# results into a variable named after the function, and often use +# temporary variables in the '^_G_' namespace. If you are careful to +# avoid using those namespaces casually in your sourcing script, things +# should continue to work as you expect. And, of course, you can freely +# overwrite any of the functions or variables defined here before +# calling anything to customize them. + +EXIT_SUCCESS=0 +EXIT_FAILURE=1 +EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. +EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. + +# Allow overriding, eg assuming that you follow the convention of +# putting '$debug_cmd' at the start of all your functions, you can get +# bash to show function call trace with: +# +# debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name +debug_cmd=${debug_cmd-":"} +exit_cmd=: + +# By convention, finish your script with: +# +# exit $exit_status +# +# so that you can set exit_status to non-zero if you want to indicate +# something went wrong during execution without actually bailing out at +# the point of failure. +exit_status=$EXIT_SUCCESS + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath=$0 + +# The name of this program. +progname=`$ECHO "$progpath" |$SED "$sed_basename"` + +# Make sure we have an absolute progpath for reexecution: +case $progpath in + [\\/]*|[A-Za-z]:\\*) ;; + *[\\/]*) + progdir=`$ECHO "$progpath" |$SED "$sed_dirname"` + progdir=`cd "$progdir" && pwd` + progpath=$progdir/$progname + ;; + *) + _G_IFS=$IFS + IFS=${PATH_SEPARATOR-:} + for progdir in $PATH; do + IFS=$_G_IFS + test -x "$progdir/$progname" && break + done + IFS=$_G_IFS + test -n "$progdir" || progdir=`pwd` + progpath=$progdir/$progname + ;; +esac + + +## ----------------- ## +## Standard options. ## +## ----------------- ## + +# The following options affect the operation of the functions defined +# below, and should be set appropriately depending on run-time para- +# meters passed on the command line. + +opt_dry_run=false +opt_quiet=false +opt_verbose=false + +# Categories 'all' and 'none' are always available. Append any others +# you will pass as the first argument to func_warning from your own +# code. +warning_categories= + +# By default, display warnings according to 'opt_warning_types'. Set +# 'warning_func' to ':' to elide all warnings, or func_fatal_error to +# treat the next displayed warning as a fatal error. +warning_func=func_warn_and_continue + +# Set to 'all' to display all warnings, 'none' to suppress all +# warnings, or a space delimited list of some subset of +# 'warning_categories' to display only the listed warnings. +opt_warning_types=all + + +## -------------------- ## +## Resource management. ## +## -------------------- ## + +# This section contains definitions for functions that each ensure a +# particular resource (a file, or a non-empty configuration variable for +# example) is available, and if appropriate to extract default values +# from pertinent package files. Call them using their associated +# 'require_*' variable to ensure that they are executed, at most, once. +# +# It's entirely deliberate that calling these functions can set +# variables that don't obey the namespace limitations obeyed by the rest +# of this file, in order that that they be as useful as possible to +# callers. + + +# require_term_colors +# ------------------- +# Allow display of bold text on terminals that support it. +require_term_colors=func_require_term_colors +func_require_term_colors () +{ + $debug_cmd + + test -t 1 && { + # COLORTERM and USE_ANSI_COLORS environment variables take + # precedence, because most terminfo databases neglect to describe + # whether color sequences are supported. + test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"} + + if test 1 = "$USE_ANSI_COLORS"; then + # Standard ANSI escape sequences + tc_reset='' + tc_bold=''; tc_standout='' + tc_red=''; tc_green='' + tc_blue=''; tc_cyan='' + else + # Otherwise trust the terminfo database after all. + test -n "`tput sgr0 2>/dev/null`" && { + tc_reset=`tput sgr0` + test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold` + tc_standout=$tc_bold + test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso` + test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1` + test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2` + test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4` + test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5` + } + fi + } + + require_term_colors=: +} + + +## ----------------- ## +## Function library. ## +## ----------------- ## + +# This section contains a variety of useful functions to call in your +# scripts. Take note of the portable wrappers for features provided by +# some modern shells, which will fall back to slower equivalents on +# less featureful shells. + + +# func_append VAR VALUE +# --------------------- +# Append VALUE onto the existing contents of VAR. + + # We should try to minimise forks, especially on Windows where they are + # unreasonably slow, so skip the feature probes when bash or zsh are + # being used: + if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then + : ${_G_HAVE_ARITH_OP="yes"} + : ${_G_HAVE_XSI_OPS="yes"} + # The += operator was introduced in bash 3.1 + case $BASH_VERSION in + [12].* | 3.0 | 3.0*) ;; + *) + : ${_G_HAVE_PLUSEQ_OP="yes"} + ;; + esac + fi + + # _G_HAVE_PLUSEQ_OP + # Can be empty, in which case the shell is probed, "yes" if += is + # useable or anything else if it does not work. + test -z "$_G_HAVE_PLUSEQ_OP" \ + && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \ + && _G_HAVE_PLUSEQ_OP=yes + +if test yes = "$_G_HAVE_PLUSEQ_OP" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_append () + { + $debug_cmd + + eval "$1+=\$2" + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_append () + { + $debug_cmd + + eval "$1=\$$1\$2" + } +fi + + +# func_append_quoted VAR VALUE +# ---------------------------- +# Quote VALUE and append to the end of shell variable VAR, separated +# by a space. +if test yes = "$_G_HAVE_PLUSEQ_OP"; then + eval 'func_append_quoted () + { + $debug_cmd + + func_quote_arg pretty "$2" + eval "$1+=\\ \$func_quote_arg_result" + }' +else + func_append_quoted () + { + $debug_cmd + + func_quote_arg pretty "$2" + eval "$1=\$$1\\ \$func_quote_arg_result" + } +fi + + +# func_append_uniq VAR VALUE +# -------------------------- +# Append unique VALUE onto the existing contents of VAR, assuming +# entries are delimited by the first character of VALUE. For example: +# +# func_append_uniq options " --another-option option-argument" +# +# will only append to $options if " --another-option option-argument " +# is not already present somewhere in $options already (note spaces at +# each end implied by leading space in second argument). +func_append_uniq () +{ + $debug_cmd + + eval _G_current_value='`$ECHO $'$1'`' + _G_delim=`expr "$2" : '\(.\)'` + + case $_G_delim$_G_current_value$_G_delim in + *"$2$_G_delim"*) ;; + *) func_append "$@" ;; + esac +} + + +# func_arith TERM... +# ------------------ +# Set func_arith_result to the result of evaluating TERMs. + test -z "$_G_HAVE_ARITH_OP" \ + && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \ + && _G_HAVE_ARITH_OP=yes + +if test yes = "$_G_HAVE_ARITH_OP"; then + eval 'func_arith () + { + $debug_cmd + + func_arith_result=$(( $* )) + }' +else + func_arith () + { + $debug_cmd + + func_arith_result=`expr "$@"` + } +fi + + +# func_basename FILE +# ------------------ +# Set func_basename_result to FILE with everything up to and including +# the last / stripped. +if test yes = "$_G_HAVE_XSI_OPS"; then + # If this shell supports suffix pattern removal, then use it to avoid + # forking. Hide the definitions single quotes in case the shell chokes + # on unsupported syntax... + _b='func_basename_result=${1##*/}' + _d='case $1 in + */*) func_dirname_result=${1%/*}$2 ;; + * ) func_dirname_result=$3 ;; + esac' + +else + # ...otherwise fall back to using sed. + _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`' + _d='func_dirname_result=`$ECHO "$1" |$SED "$sed_dirname"` + if test "X$func_dirname_result" = "X$1"; then + func_dirname_result=$3 + else + func_append func_dirname_result "$2" + fi' +fi + +eval 'func_basename () +{ + $debug_cmd + + '"$_b"' +}' + + +# func_dirname FILE APPEND NONDIR_REPLACEMENT +# ------------------------------------------- +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +eval 'func_dirname () +{ + $debug_cmd + + '"$_d"' +}' + + +# func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT +# -------------------------------------------------------- +# Perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# For efficiency, we do not delegate to the functions above but instead +# duplicate the functionality here. +eval 'func_dirname_and_basename () +{ + $debug_cmd + + '"$_b"' + '"$_d"' +}' + + +# func_echo ARG... +# ---------------- +# Echo program name prefixed message. +func_echo () +{ + $debug_cmd + + _G_message=$* + + func_echo_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS + $ECHO "$progname: $_G_line" + done + IFS=$func_echo_IFS +} + + +# func_echo_all ARG... +# -------------------- +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + + +# func_echo_infix_1 INFIX ARG... +# ------------------------------ +# Echo program name, followed by INFIX on the first line, with any +# additional lines not showing INFIX. +func_echo_infix_1 () +{ + $debug_cmd + + $require_term_colors + + _G_infix=$1; shift + _G_indent=$_G_infix + _G_prefix="$progname: $_G_infix: " + _G_message=$* + + # Strip color escape sequences before counting printable length + for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan" + do + test -n "$_G_tc" && { + _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"` + _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"` + } + done + _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`" " ## exclude from sc_prohibit_nested_quotes + + func_echo_infix_1_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_infix_1_IFS + $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2 + _G_prefix=$_G_indent + done + IFS=$func_echo_infix_1_IFS +} + + +# func_error ARG... +# ----------------- +# Echo program name prefixed message to standard error. +func_error () +{ + $debug_cmd + + $require_term_colors + + func_echo_infix_1 " $tc_standout${tc_red}error$tc_reset" "$*" >&2 +} + + +# func_fatal_error ARG... +# ----------------------- +# Echo program name prefixed message to standard error, and exit. +func_fatal_error () +{ + $debug_cmd + + func_error "$*" + exit $EXIT_FAILURE +} + + +# func_grep EXPRESSION FILENAME +# ----------------------------- +# Check whether EXPRESSION matches any line of FILENAME, without output. +func_grep () +{ + $debug_cmd + + $GREP "$1" "$2" >/dev/null 2>&1 +} + + +# func_len STRING +# --------------- +# Set func_len_result to the length of STRING. STRING may not +# start with a hyphen. + test -z "$_G_HAVE_XSI_OPS" \ + && (eval 'x=a/b/c; + test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ + && _G_HAVE_XSI_OPS=yes + +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_len () + { + $debug_cmd + + func_len_result=${#1} + }' +else + func_len () + { + $debug_cmd + + func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` + } +fi + + +# func_mkdir_p DIRECTORY-PATH +# --------------------------- +# Make sure the entire path to DIRECTORY-PATH is available. +func_mkdir_p () +{ + $debug_cmd + + _G_directory_path=$1 + _G_dir_list= + + if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then + + # Protect directory names starting with '-' + case $_G_directory_path in + -*) _G_directory_path=./$_G_directory_path ;; + esac + + # While some portion of DIR does not yet exist... + while test ! -d "$_G_directory_path"; do + # ...make a list in topmost first order. Use a colon delimited + # list incase some portion of path contains whitespace. + _G_dir_list=$_G_directory_path:$_G_dir_list + + # If the last portion added has no slash in it, the list is done + case $_G_directory_path in */*) ;; *) break ;; esac + + # ...otherwise throw away the child directory and loop + _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"` + done + _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'` + + func_mkdir_p_IFS=$IFS; IFS=: + for _G_dir in $_G_dir_list; do + IFS=$func_mkdir_p_IFS + # mkdir can fail with a 'File exist' error if two processes + # try to create one of the directories concurrently. Don't + # stop in that case! + $MKDIR "$_G_dir" 2>/dev/null || : + done + IFS=$func_mkdir_p_IFS + + # Bail out if we (or some other process) failed to create a directory. + test -d "$_G_directory_path" || \ + func_fatal_error "Failed to create '$1'" + fi +} + + +# func_mktempdir [BASENAME] +# ------------------------- +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, BASENAME is the basename for that directory. +func_mktempdir () +{ + $debug_cmd + + _G_template=${TMPDIR-/tmp}/${1-$progname} + + if test : = "$opt_dry_run"; then + # Return a directory name, but don't create it in dry-run mode + _G_tmpdir=$_G_template-$$ + else + + # If mktemp works, use that first and foremost + _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null` + + if test ! -d "$_G_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + _G_tmpdir=$_G_template-${RANDOM-0}$$ + + func_mktempdir_umask=`umask` + umask 0077 + $MKDIR "$_G_tmpdir" + umask $func_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$_G_tmpdir" || \ + func_fatal_error "cannot create temporary directory '$_G_tmpdir'" + fi + + $ECHO "$_G_tmpdir" +} + + +# func_normal_abspath PATH +# ------------------------ +# Remove doubled-up and trailing slashes, "." path components, +# and cancel out any ".." path components in PATH after making +# it an absolute path. +func_normal_abspath () +{ + $debug_cmd + + # These SED scripts presuppose an absolute path with a trailing slash. + _G_pathcar='s|^/\([^/]*\).*$|\1|' + _G_pathcdr='s|^/[^/]*||' + _G_removedotparts=':dotsl + s|/\./|/|g + t dotsl + s|/\.$|/|' + _G_collapseslashes='s|/\{1,\}|/|g' + _G_finalslash='s|/*$|/|' + + # Start from root dir and reassemble the path. + func_normal_abspath_result= + func_normal_abspath_tpath=$1 + func_normal_abspath_altnamespace= + case $func_normal_abspath_tpath in + "") + # Empty path, that just means $cwd. + func_stripname '' '/' "`pwd`" + func_normal_abspath_result=$func_stripname_result + return + ;; + # The next three entries are used to spot a run of precisely + # two leading slashes without using negated character classes; + # we take advantage of case's first-match behaviour. + ///*) + # Unusual form of absolute path, do nothing. + ;; + //*) + # Not necessarily an ordinary path; POSIX reserves leading '//' + # and for example Cygwin uses it to access remote file shares + # over CIFS/SMB, so we conserve a leading double slash if found. + func_normal_abspath_altnamespace=/ + ;; + /*) + # Absolute path, do nothing. + ;; + *) + # Relative path, prepend $cwd. + func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath + ;; + esac + + # Cancel out all the simple stuff to save iterations. We also want + # the path to end with a slash for ease of parsing, so make sure + # there is one (and only one) here. + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"` + while :; do + # Processed it all yet? + if test / = "$func_normal_abspath_tpath"; then + # If we ascended to the root using ".." the result may be empty now. + if test -z "$func_normal_abspath_result"; then + func_normal_abspath_result=/ + fi + break + fi + func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_pathcar"` + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_pathcdr"` + # Figure out what to do with it + case $func_normal_abspath_tcomponent in + "") + # Trailing empty path component, ignore it. + ;; + ..) + # Parent dir; strip last assembled component from result. + func_dirname "$func_normal_abspath_result" + func_normal_abspath_result=$func_dirname_result + ;; + *) + # Actual path component, append it. + func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent" + ;; + esac + done + # Restore leading double-slash if one was found on entry. + func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result +} + + +# func_notquiet ARG... +# -------------------- +# Echo program name prefixed message only when not in quiet mode. +func_notquiet () +{ + $debug_cmd + + $opt_quiet || func_echo ${1+"$@"} + + # A bug in bash halts the script if the last line of a function + # fails when set -e is in force, so we need another command to + # work around that: + : +} + + +# func_relative_path SRCDIR DSTDIR +# -------------------------------- +# Set func_relative_path_result to the relative path from SRCDIR to DSTDIR. +func_relative_path () +{ + $debug_cmd + + func_relative_path_result= + func_normal_abspath "$1" + func_relative_path_tlibdir=$func_normal_abspath_result + func_normal_abspath "$2" + func_relative_path_tbindir=$func_normal_abspath_result + + # Ascend the tree starting from libdir + while :; do + # check if we have found a prefix of bindir + case $func_relative_path_tbindir in + $func_relative_path_tlibdir) + # found an exact match + func_relative_path_tcancelled= + break + ;; + $func_relative_path_tlibdir*) + # found a matching prefix + func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" + func_relative_path_tcancelled=$func_stripname_result + if test -z "$func_relative_path_result"; then + func_relative_path_result=. + fi + break + ;; + *) + func_dirname $func_relative_path_tlibdir + func_relative_path_tlibdir=$func_dirname_result + if test -z "$func_relative_path_tlibdir"; then + # Have to descend all the way to the root! + func_relative_path_result=../$func_relative_path_result + func_relative_path_tcancelled=$func_relative_path_tbindir + break + fi + func_relative_path_result=../$func_relative_path_result + ;; + esac + done + + # Now calculate path; take care to avoid doubling-up slashes. + func_stripname '' '/' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + func_stripname '/' '/' "$func_relative_path_tcancelled" + if test -n "$func_stripname_result"; then + func_append func_relative_path_result "/$func_stripname_result" + fi + + # Normalisation. If bindir is libdir, return '.' else relative path. + if test -n "$func_relative_path_result"; then + func_stripname './' '' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + fi + + test -n "$func_relative_path_result" || func_relative_path_result=. + + : +} + + +# func_quote_portable EVAL ARG +# ---------------------------- +# Internal function to portably implement func_quote_arg. Note that we still +# keep attention to performance here so we as much as possible try to avoid +# calling sed binary (so far O(N) complexity as long as func_append is O(1)). +func_quote_portable () +{ + $debug_cmd + + func_quote_portable_result=$2 + + # one-time-loop (easy break) + while true + do + if $1; then + func_quote_portable_result=`$ECHO "$2" | $SED \ + -e "$sed_double_quote_subst" -e "$sed_double_backslash"` + break + fi + + # Quote for eval. + case $func_quote_portable_result in + *[\\\`\"\$]*) + case $func_quote_portable_result in + *[\[\*\?]*) + func_quote_portable_result=`$ECHO "$func_quote_portable_result" \ + | $SED "$sed_quote_subst"` + break + ;; + esac + + func_quote_portable_old_IFS=$IFS + for _G_char in '\' '`' '"' '$' + do + # STATE($1) PREV($2) SEPARATOR($3) + set start "" "" + func_quote_portable_result=dummy"$_G_char$func_quote_portable_result$_G_char"dummy + IFS=$_G_char + for _G_part in $func_quote_portable_result + do + case $1 in + quote) + func_append func_quote_portable_result "$3$2" + set quote "$_G_part" "\\$_G_char" + ;; + start) + set first "" "" + func_quote_portable_result= + ;; + first) + set quote "$_G_part" "" + ;; + esac + done + done + IFS=$func_quote_portable_old_IFS + ;; + *) ;; + esac + break + done + + func_quote_portable_unquoted_result=$func_quote_portable_result + case $func_quote_portable_result in + # double-quote args containing shell metacharacters to delay + # word splitting, command substitution and variable expansion + # for a subsequent eval. + # many bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + func_quote_portable_result=\"$func_quote_portable_result\" + ;; + esac +} + + +# func_quotefast_eval ARG +# ----------------------- +# Quote one ARG (internal). This is equivalent to 'func_quote_arg eval ARG', +# but optimized for speed. Result is stored in $func_quotefast_eval. +if test xyes = `(x=; printf -v x %q yes; echo x"$x") 2>/dev/null`; then + printf -v _GL_test_printf_tilde %q '~' + if test '\~' = "$_GL_test_printf_tilde"; then + func_quotefast_eval () + { + printf -v func_quotefast_eval_result %q "$1" + } + else + # Broken older Bash implementations. Make those faster too if possible. + func_quotefast_eval () + { + case $1 in + '~'*) + func_quote_portable false "$1" + func_quotefast_eval_result=$func_quote_portable_result + ;; + *) + printf -v func_quotefast_eval_result %q "$1" + ;; + esac + } + fi +else + func_quotefast_eval () + { + func_quote_portable false "$1" + func_quotefast_eval_result=$func_quote_portable_result + } +fi + + +# func_quote_arg MODEs ARG +# ------------------------ +# Quote one ARG to be evaled later. MODEs argument may contain zero or more +# specifiers listed below separated by ',' character. This function returns two +# values: +# i) func_quote_arg_result +# double-quoted (when needed), suitable for a subsequent eval +# ii) func_quote_arg_unquoted_result +# has all characters that are still active within double +# quotes backslashified. Available only if 'unquoted' is specified. +# +# Available modes: +# ---------------- +# 'eval' (default) +# - escape shell special characters +# 'expand' +# - the same as 'eval'; but do not quote variable references +# 'pretty' +# - request aesthetic output, i.e. '"a b"' instead of 'a\ b'. This might +# be used later in func_quote to get output like: 'echo "a b"' instead +# of 'echo a\ b'. This is slower than default on some shells. +# 'unquoted' +# - produce also $func_quote_arg_unquoted_result which does not contain +# wrapping double-quotes. +# +# Examples for 'func_quote_arg pretty,unquoted string': +# +# string | *_result | *_unquoted_result +# ------------+-----------------------+------------------- +# " | \" | \" +# a b | "a b" | a b +# "a b" | "\"a b\"" | \"a b\" +# * | "*" | * +# z="${x-$y}" | "z=\"\${x-\$y}\"" | z=\"\${x-\$y}\" +# +# Examples for 'func_quote_arg pretty,unquoted,expand string': +# +# string | *_result | *_unquoted_result +# --------------+---------------------+-------------------- +# z="${x-$y}" | "z=\"${x-$y}\"" | z=\"${x-$y}\" +func_quote_arg () +{ + _G_quote_expand=false + case ,$1, in + *,expand,*) + _G_quote_expand=: + ;; + esac + + case ,$1, in + *,pretty,*|*,expand,*|*,unquoted,*) + func_quote_portable $_G_quote_expand "$2" + func_quote_arg_result=$func_quote_portable_result + func_quote_arg_unquoted_result=$func_quote_portable_unquoted_result + ;; + *) + # Faster quote-for-eval for some shells. + func_quotefast_eval "$2" + func_quote_arg_result=$func_quotefast_eval_result + ;; + esac +} + + +# func_quote MODEs ARGs... +# ------------------------ +# Quote all ARGs to be evaled later and join them into single command. See +# func_quote_arg's description for more info. +func_quote () +{ + $debug_cmd + _G_func_quote_mode=$1 ; shift + func_quote_result= + while test 0 -lt $#; do + func_quote_arg "$_G_func_quote_mode" "$1" + if test -n "$func_quote_result"; then + func_append func_quote_result " $func_quote_arg_result" + else + func_append func_quote_result "$func_quote_arg_result" + fi + shift + done +} + + +# func_stripname PREFIX SUFFIX NAME +# --------------------------------- +# strip PREFIX and SUFFIX from NAME, and store in func_stripname_result. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_stripname () + { + $debug_cmd + + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary variable first. + func_stripname_result=$3 + func_stripname_result=${func_stripname_result#"$1"} + func_stripname_result=${func_stripname_result%"$2"} + }' +else + func_stripname () + { + $debug_cmd + + case $2 in + .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;; + *) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;; + esac + } +fi + + +# func_show_eval CMD [FAIL_EXP] +# ----------------------------- +# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. +func_show_eval () +{ + $debug_cmd + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + func_quote_arg pretty,expand "$_G_cmd" + eval "func_notquiet $func_quote_arg_result" + + $opt_dry_run || { + eval "$_G_cmd" + _G_status=$? + if test 0 -ne "$_G_status"; then + eval "(exit $_G_status); $_G_fail_exp" + fi + } +} + + +# func_show_eval_locale CMD [FAIL_EXP] +# ------------------------------------ +# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. Use the saved locale for evaluation. +func_show_eval_locale () +{ + $debug_cmd + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + $opt_quiet || { + func_quote_arg expand,pretty "$_G_cmd" + eval "func_echo $func_quote_arg_result" + } + + $opt_dry_run || { + eval "$_G_user_locale + $_G_cmd" + _G_status=$? + eval "$_G_safe_locale" + if test 0 -ne "$_G_status"; then + eval "(exit $_G_status); $_G_fail_exp" + fi + } +} + + +# func_tr_sh +# ---------- +# Turn $1 into a string suitable for a shell variable name. +# Result is stored in $func_tr_sh_result. All characters +# not in the set a-zA-Z0-9_ are replaced with '_'. Further, +# if $1 begins with a digit, a '_' is prepended as well. +func_tr_sh () +{ + $debug_cmd + + case $1 in + [0-9]* | *[!a-zA-Z0-9_]*) + func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'` + ;; + * ) + func_tr_sh_result=$1 + ;; + esac +} + + +# func_verbose ARG... +# ------------------- +# Echo program name prefixed message in verbose mode only. +func_verbose () +{ + $debug_cmd + + $opt_verbose && func_echo "$*" + + : +} + + +# func_warn_and_continue ARG... +# ----------------------------- +# Echo program name prefixed warning message to standard error. +func_warn_and_continue () +{ + $debug_cmd + + $require_term_colors + + func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2 +} + + +# func_warning CATEGORY ARG... +# ---------------------------- +# Echo program name prefixed warning message to standard error. Warning +# messages can be filtered according to CATEGORY, where this function +# elides messages where CATEGORY is not listed in the global variable +# 'opt_warning_types'. +func_warning () +{ + $debug_cmd + + # CATEGORY must be in the warning_categories list! + case " $warning_categories " in + *" $1 "*) ;; + *) func_internal_error "invalid warning category '$1'" ;; + esac + + _G_category=$1 + shift + + case " $opt_warning_types " in + *" $_G_category "*) $warning_func ${1+"$@"} ;; + esac +} + + +# func_sort_ver VER1 VER2 +# ----------------------- +# 'sort -V' is not generally available. +# Note this deviates from the version comparison in automake +# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a +# but this should suffice as we won't be specifying old +# version formats or redundant trailing .0 in bootstrap.conf. +# If we did want full compatibility then we should probably +# use m4_version_compare from autoconf. +func_sort_ver () +{ + $debug_cmd + + printf '%s\n%s\n' "$1" "$2" \ + | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n +} + +# func_lt_ver PREV CURR +# --------------------- +# Return true if PREV and CURR are in the correct order according to +# func_sort_ver, otherwise false. Use it like this: +# +# func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..." +func_lt_ver () +{ + $debug_cmd + + test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q` +} + + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: +#! /bin/sh + +# A portable, pluggable option parser for Bourne shell. +# Written by Gary V. Vaughan, 2010 + +# This is free software. There is NO warranty; not even for +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# +# Copyright (C) 2010-2018 Bootstrap Authors +# +# This file is dual licensed under the terms of the MIT license +# , and GPL version 3 or later +# . You must apply one of +# these licenses when using or redistributing this software or any of +# the files within it. See the URLs above, or the file `LICENSE` +# included in the Bootstrap distribution for the full license texts. + +# Please report bugs or propose patches to: +# + +# Set a version string for this script. +scriptversion=2018-07-24.06; # UTC + + +## ------ ## +## Usage. ## +## ------ ## + +# This file is a library for parsing options in your shell scripts along +# with assorted other useful supporting features that you can make use +# of too. +# +# For the simplest scripts you might need only: +# +# #!/bin/sh +# . relative/path/to/funclib.sh +# . relative/path/to/options-parser +# scriptversion=1.0 +# func_options ${1+"$@"} +# eval set dummy "$func_options_result"; shift +# ...rest of your script... +# +# In order for the '--version' option to work, you will need to have a +# suitably formatted comment like the one at the top of this file +# starting with '# Written by ' and ending with '# Copyright'. +# +# For '-h' and '--help' to work, you will also need a one line +# description of your script's purpose in a comment directly above the +# '# Written by ' line, like the one at the top of this file. +# +# The default options also support '--debug', which will turn on shell +# execution tracing (see the comment above debug_cmd below for another +# use), and '--verbose' and the func_verbose function to allow your script +# to display verbose messages only when your user has specified +# '--verbose'. +# +# After sourcing this file, you can plug in processing for additional +# options by amending the variables from the 'Configuration' section +# below, and following the instructions in the 'Option parsing' +# section further down. + +## -------------- ## +## Configuration. ## +## -------------- ## + +# You should override these variables in your script after sourcing this +# file so that they reflect the customisations you have added to the +# option parser. + +# The usage line for option parsing errors and the start of '-h' and +# '--help' output messages. You can embed shell variables for delayed +# expansion at the time the message is displayed, but you will need to +# quote other shell meta-characters carefully to prevent them being +# expanded when the contents are evaled. +usage='$progpath [OPTION]...' + +# Short help message in response to '-h' and '--help'. Add to this or +# override it after sourcing this library to reflect the full set of +# options your script accepts. +usage_message="\ + --debug enable verbose shell tracing + -W, --warnings=CATEGORY + report the warnings falling in CATEGORY [all] + -v, --verbose verbosely report processing + --version print version information and exit + -h, --help print short or long help message and exit +" + +# Additional text appended to 'usage_message' in response to '--help'. +long_help_message=" +Warning categories include: + 'all' show all warnings + 'none' turn off all the warnings + 'error' warnings are treated as fatal errors" + +# Help message printed before fatal option parsing errors. +fatal_help="Try '\$progname --help' for more information." + + + +## ------------------------- ## +## Hook function management. ## +## ------------------------- ## + +# This section contains functions for adding, removing, and running hooks +# in the main code. A hook is just a list of function names that can be +# run in order later on. + +# func_hookable FUNC_NAME +# ----------------------- +# Declare that FUNC_NAME will run hooks added with +# 'func_add_hook FUNC_NAME ...'. +func_hookable () +{ + $debug_cmd + + func_append hookable_fns " $1" +} + + +# func_add_hook FUNC_NAME HOOK_FUNC +# --------------------------------- +# Request that FUNC_NAME call HOOK_FUNC before it returns. FUNC_NAME must +# first have been declared "hookable" by a call to 'func_hookable'. +func_add_hook () +{ + $debug_cmd + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "'$1' does not accept hook functions." ;; + esac + + eval func_append ${1}_hooks '" $2"' +} + + +# func_remove_hook FUNC_NAME HOOK_FUNC +# ------------------------------------ +# Remove HOOK_FUNC from the list of hook functions to be called by +# FUNC_NAME. +func_remove_hook () +{ + $debug_cmd + + eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`' +} + + +# func_propagate_result FUNC_NAME_A FUNC_NAME_B +# --------------------------------------------- +# If the *_result variable of FUNC_NAME_A _is set_, assign its value to +# *_result variable of FUNC_NAME_B. +func_propagate_result () +{ + $debug_cmd + + func_propagate_result_result=: + if eval "test \"\${${1}_result+set}\" = set" + then + eval "${2}_result=\$${1}_result" + else + func_propagate_result_result=false + fi +} + + +# func_run_hooks FUNC_NAME [ARG]... +# --------------------------------- +# Run all hook functions registered to FUNC_NAME. +# It's assumed that the list of hook functions contains nothing more +# than a whitespace-delimited list of legal shell function names, and +# no effort is wasted trying to catch shell meta-characters or preserve +# whitespace. +func_run_hooks () +{ + $debug_cmd + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "'$1' does not support hook functions." ;; + esac + + eval _G_hook_fns=\$$1_hooks; shift + + for _G_hook in $_G_hook_fns; do + func_unset "${_G_hook}_result" + eval $_G_hook '${1+"$@"}' + func_propagate_result $_G_hook func_run_hooks + if $func_propagate_result_result; then + eval set dummy "$func_run_hooks_result"; shift + fi + done +} + + + +## --------------- ## +## Option parsing. ## +## --------------- ## + +# In order to add your own option parsing hooks, you must accept the +# full positional parameter list from your hook function. You may remove +# or edit any options that you action, and then pass back the remaining +# unprocessed options in '_result', escaped +# suitably for 'eval'. +# +# The '_result' variable is automatically unset +# before your hook gets called; for best performance, only set the +# *_result variable when necessary (i.e. don't call the 'func_quote' +# function unnecessarily because it can be an expensive operation on some +# machines). +# +# Like this: +# +# my_options_prep () +# { +# $debug_cmd +# +# # Extend the existing usage message. +# usage_message=$usage_message' +# -s, --silent don'\''t print informational messages +# ' +# # No change in '$@' (ignored completely by this hook). Leave +# # my_options_prep_result variable intact. +# } +# func_add_hook func_options_prep my_options_prep +# +# +# my_silent_option () +# { +# $debug_cmd +# +# args_changed=false +# +# # Note that, for efficiency, we parse as many options as we can +# # recognise in a loop before passing the remainder back to the +# # caller on the first unrecognised argument we encounter. +# while test $# -gt 0; do +# opt=$1; shift +# case $opt in +# --silent|-s) opt_silent=: +# args_changed=: +# ;; +# # Separate non-argument short options: +# -s*) func_split_short_opt "$_G_opt" +# set dummy "$func_split_short_opt_name" \ +# "-$func_split_short_opt_arg" ${1+"$@"} +# shift +# args_changed=: +# ;; +# *) # Make sure the first unrecognised option "$_G_opt" +# # is added back to "$@" in case we need it later, +# # if $args_changed was set to 'true'. +# set dummy "$_G_opt" ${1+"$@"}; shift; break ;; +# esac +# done +# +# # Only call 'func_quote' here if we processed at least one argument. +# if $args_changed; then +# func_quote eval ${1+"$@"} +# my_silent_option_result=$func_quote_result +# fi +# } +# func_add_hook func_parse_options my_silent_option +# +# +# my_option_validation () +# { +# $debug_cmd +# +# $opt_silent && $opt_verbose && func_fatal_help "\ +# '--silent' and '--verbose' options are mutually exclusive." +# } +# func_add_hook func_validate_options my_option_validation +# +# You'll also need to manually amend $usage_message to reflect the extra +# options you parse. It's preferable to append if you can, so that +# multiple option parsing hooks can be added safely. + + +# func_options_finish [ARG]... +# ---------------------------- +# Finishing the option parse loop (call 'func_options' hooks ATM). +func_options_finish () +{ + $debug_cmd + + func_run_hooks func_options ${1+"$@"} + func_propagate_result func_run_hooks func_options_finish +} + + +# func_options [ARG]... +# --------------------- +# All the functions called inside func_options are hookable. See the +# individual implementations for details. +func_hookable func_options +func_options () +{ + $debug_cmd + + _G_options_quoted=false + + for my_func in options_prep parse_options validate_options options_finish + do + func_unset func_${my_func}_result + func_unset func_run_hooks_result + eval func_$my_func '${1+"$@"}' + func_propagate_result func_$my_func func_options + if $func_propagate_result_result; then + eval set dummy "$func_options_result"; shift + _G_options_quoted=: + fi + done + + $_G_options_quoted || { + # As we (func_options) are top-level options-parser function and + # nobody quoted "$@" for us yet, we need to do it explicitly for + # caller. + func_quote eval ${1+"$@"} + func_options_result=$func_quote_result + } +} + + +# func_options_prep [ARG]... +# -------------------------- +# All initialisations required before starting the option parse loop. +# Note that when calling hook functions, we pass through the list of +# positional parameters. If a hook function modifies that list, and +# needs to propagate that back to rest of this script, then the complete +# modified list must be put in 'func_run_hooks_result' before returning. +func_hookable func_options_prep +func_options_prep () +{ + $debug_cmd + + # Option defaults: + opt_verbose=false + opt_warning_types= + + func_run_hooks func_options_prep ${1+"$@"} + func_propagate_result func_run_hooks func_options_prep +} + + +# func_parse_options [ARG]... +# --------------------------- +# The main option parsing loop. +func_hookable func_parse_options +func_parse_options () +{ + $debug_cmd + + _G_parse_options_requote=false + # this just eases exit handling + while test $# -gt 0; do + # Defer to hook functions for initial option parsing, so they + # get priority in the event of reusing an option name. + func_run_hooks func_parse_options ${1+"$@"} + func_propagate_result func_run_hooks func_parse_options + if $func_propagate_result_result; then + eval set dummy "$func_parse_options_result"; shift + # Even though we may have changed "$@", we passed the "$@" array + # down into the hook and it quoted it for us (because we are in + # this if-branch). No need to quote it again. + _G_parse_options_requote=false + fi + + # Break out of the loop if we already parsed every option. + test $# -gt 0 || break + + # We expect that one of the options parsed in this function matches + # and thus we remove _G_opt from "$@" and need to re-quote. + _G_match_parse_options=: + _G_opt=$1 + shift + case $_G_opt in + --debug|-x) debug_cmd='set -x' + func_echo "enabling shell trace mode" >&2 + $debug_cmd + ;; + + --no-warnings|--no-warning|--no-warn) + set dummy --warnings none ${1+"$@"} + shift + ;; + + --warnings|--warning|-W) + if test $# = 0 && func_missing_arg $_G_opt; then + _G_parse_options_requote=: + break + fi + case " $warning_categories $1" in + *" $1 "*) + # trailing space prevents matching last $1 above + func_append_uniq opt_warning_types " $1" + ;; + *all) + opt_warning_types=$warning_categories + ;; + *none) + opt_warning_types=none + warning_func=: + ;; + *error) + opt_warning_types=$warning_categories + warning_func=func_fatal_error + ;; + *) + func_fatal_error \ + "unsupported warning category: '$1'" + ;; + esac + shift + ;; + + --verbose|-v) opt_verbose=: ;; + --version) func_version ;; + -\?|-h) func_usage ;; + --help) func_help ;; + + # Separate optargs to long options (plugins may need this): + --*=*) func_split_equals "$_G_opt" + set dummy "$func_split_equals_lhs" \ + "$func_split_equals_rhs" ${1+"$@"} + shift + ;; + + # Separate optargs to short options: + -W*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + # Separate non-argument short options: + -\?*|-h*|-v*|-x*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "-$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + --) _G_parse_options_requote=: ; break ;; + -*) func_fatal_help "unrecognised option: '$_G_opt'" ;; + *) set dummy "$_G_opt" ${1+"$@"}; shift + _G_match_parse_options=false + break + ;; + esac + + if $_G_match_parse_options; then + _G_parse_options_requote=: + fi + done + + if $_G_parse_options_requote; then + # save modified positional parameters for caller + func_quote eval ${1+"$@"} + func_parse_options_result=$func_quote_result + fi +} + + +# func_validate_options [ARG]... +# ------------------------------ +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +func_hookable func_validate_options +func_validate_options () +{ + $debug_cmd + + # Display all warnings if -W was not given. + test -n "$opt_warning_types" || opt_warning_types=" $warning_categories" + + func_run_hooks func_validate_options ${1+"$@"} + func_propagate_result func_run_hooks func_validate_options + + # Bail if the options were screwed! + $exit_cmd $EXIT_FAILURE +} + + + +## ----------------- ## +## Helper functions. ## +## ----------------- ## + +# This section contains the helper functions used by the rest of the +# hookable option parser framework in ascii-betical order. + + +# func_fatal_help ARG... +# ---------------------- +# Echo program name prefixed message to standard error, followed by +# a help hint, and exit. +func_fatal_help () +{ + $debug_cmd + + eval \$ECHO \""Usage: $usage"\" + eval \$ECHO \""$fatal_help"\" + func_error ${1+"$@"} + exit $EXIT_FAILURE +} + + +# func_help +# --------- +# Echo long help message to standard output and exit. +func_help () +{ + $debug_cmd + + func_usage_message + $ECHO "$long_help_message" + exit 0 +} + + +# func_missing_arg ARGNAME +# ------------------------ +# Echo program name prefixed message to standard error and set global +# exit_cmd. +func_missing_arg () +{ + $debug_cmd + + func_error "Missing argument for '$1'." + exit_cmd=exit +} + + +# func_split_equals STRING +# ------------------------ +# Set func_split_equals_lhs and func_split_equals_rhs shell variables +# after splitting STRING at the '=' sign. +test -z "$_G_HAVE_XSI_OPS" \ + && (eval 'x=a/b/c; + test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ + && _G_HAVE_XSI_OPS=yes + +if test yes = "$_G_HAVE_XSI_OPS" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=${1%%=*} + func_split_equals_rhs=${1#*=} + if test "x$func_split_equals_lhs" = "x$1"; then + func_split_equals_rhs= + fi + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'` + func_split_equals_rhs= + test "x$func_split_equals_lhs" = "x$1" \ + || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'` + } +fi #func_split_equals + + +# func_split_short_opt SHORTOPT +# ----------------------------- +# Set func_split_short_opt_name and func_split_short_opt_arg shell +# variables after splitting SHORTOPT after the 2nd character. +if test yes = "$_G_HAVE_XSI_OPS" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_arg=${1#??} + func_split_short_opt_name=${1%"$func_split_short_opt_arg"} + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_name=`expr "x$1" : 'x-\(.\)'` + func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'` + } +fi #func_split_short_opt + + +# func_usage +# ---------- +# Echo short help message to standard output and exit. +func_usage () +{ + $debug_cmd + + func_usage_message + $ECHO "Run '$progname --help |${PAGER-more}' for full usage" + exit 0 +} + + +# func_usage_message +# ------------------ +# Echo short help message to standard output. +func_usage_message () +{ + $debug_cmd + + eval \$ECHO \""Usage: $usage"\" + echo + $SED -n 's|^# || + /^Written by/{ + x;p;x + } + h + /^Written by/q' < "$progpath" + echo + eval \$ECHO \""$usage_message"\" +} + + +# func_version +# ------------ +# Echo version message to standard output and exit. +# The version message is extracted from the calling file's header +# comments, with leading '# ' stripped: +# 1. First display the progname and version +# 2. Followed by the header comment line matching /^# Written by / +# 3. Then a blank line followed by the first following line matching +# /^# Copyright / +# 4. Immediately followed by any lines between the previous matches, +# except lines preceding the intervening completely blank line. +# For example, see the header comments of this file. +func_version () +{ + $debug_cmd + + printf '%s\n' "$progname $scriptversion" + $SED -n ' + /^# Written by /!b + s|^# ||; p; n + + :fwd2blnk + /./ { + n + b fwd2blnk + } + p; n + + :holdwrnt + s|^# || + s|^# *$|| + /^Copyright /!{ + /./H + n + b holdwrnt + } + + s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| + G + s|\(\n\)\n*|\1|g + p; q' < "$progpath" + + exit $? +} + + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "30/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: + +# Set a version string. +scriptversion='(GNU libtool) 2.4.6.42-b88ce' + + +# func_echo ARG... +# ---------------- +# Libtool also displays the current mode in messages, so override +# funclib.sh func_echo with this custom definition. +func_echo () +{ + $debug_cmd + + _G_message=$* + + func_echo_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS + $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line" + done + IFS=$func_echo_IFS +} + + +# func_warning ARG... +# ------------------- +# Libtool warnings are not categorized, so override funclib.sh +# func_warning with this simpler definition. +func_warning () +{ + $debug_cmd + + $warning_func ${1+"$@"} +} + + +## ---------------- ## +## Options parsing. ## +## ---------------- ## + +# Hook in the functions to make sure our own options are parsed during +# the option parsing loop. + +usage='$progpath [OPTION]... [MODE-ARG]...' + +# Short help message in response to '-h'. +usage_message="Options: + --config show all configuration variables + --debug enable verbose shell tracing + -n, --dry-run display commands without modifying any files + --features display basic configuration information and exit + --mode=MODE use operation mode MODE + --no-warnings equivalent to '-Wnone' + --preserve-dup-deps don't remove duplicate dependency libraries + --quiet, --silent don't print informational messages + --tag=TAG use configuration variables from tag TAG + -v, --verbose print more informational messages than default + --version print version information + -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] + -h, --help, --help-all print short, long, or detailed help message +" + +# Additional text appended to 'usage_message' in response to '--help'. +func_help () +{ + $debug_cmd + + func_usage_message + $ECHO "$long_help_message + +MODE must be one of the following: + + clean remove files from the build directory + compile compile a source file into a libtool object + execute automatically set library path, then run a program + finish complete the installation of libtool libraries + install install libraries or executables + link create a library or an executable + uninstall remove libraries from an installed directory + +MODE-ARGS vary depending on the MODE. When passed as first option, +'--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that. +Try '$progname --help --mode=MODE' for a more detailed description of MODE. + +When reporting a bug, please describe a test case to reproduce it and +include the following information: + + host-triplet: $host + shell: $SHELL + compiler: $LTCC + compiler flags: $LTCFLAGS + linker: $LD (gnu? $with_gnu_ld) + version: $progname (GNU libtool) 2.4.6.42-b88ce + automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` + autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` + +Report bugs to . +GNU libtool home page: . +General help using GNU software: ." + exit 0 +} + + +# func_lo2o OBJECT-NAME +# --------------------- +# Transform OBJECT-NAME from a '.lo' suffix to the platform specific +# object suffix. + +lo2o=s/\\.lo\$/.$objext/ +o2lo=s/\\.$objext\$/.lo/ + +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_lo2o () + { + case $1 in + *.lo) func_lo2o_result=${1%.lo}.$objext ;; + * ) func_lo2o_result=$1 ;; + esac + }' + + # func_xform LIBOBJ-OR-SOURCE + # --------------------------- + # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise) + # suffix to a '.lo' libtool-object suffix. + eval 'func_xform () + { + func_xform_result=${1%.*}.lo + }' +else + # ...otherwise fall back to using sed. + func_lo2o () + { + func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"` + } + + func_xform () + { + func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'` + } +fi + + +# func_fatal_configuration ARG... +# ------------------------------- +# Echo program name prefixed message to standard error, followed by +# a configuration failure hint, and exit. +func_fatal_configuration () +{ + func_fatal_error ${1+"$@"} \ + "See the $PACKAGE documentation for more information." \ + "Fatal configuration error." +} + + +# func_config +# ----------- +# Display the configuration for all the tags in this script. +func_config () +{ + re_begincf='^# ### BEGIN LIBTOOL' + re_endcf='^# ### END LIBTOOL' + + # Default configuration. + $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" + + # Now print the configurations for the tags. + for tagname in $taglist; do + $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" + done + + exit $? +} + + +# func_features +# ------------- +# Display the features supported by this script. +func_features () +{ + echo "host: $host" + if test yes = "$build_libtool_libs"; then + echo "enable shared libraries" + else + echo "disable shared libraries" + fi + if test yes = "$build_old_libs"; then + echo "enable static libraries" + else + echo "disable static libraries" + fi + + exit $? +} + + +# func_enable_tag TAGNAME +# ----------------------- +# Verify that TAGNAME is valid, and either flag an error and exit, or +# enable the TAGNAME tag. We also add TAGNAME to the global $taglist +# variable here. +func_enable_tag () +{ + # Global variable: + tagname=$1 + + re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" + re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" + sed_extractcf=/$re_begincf/,/$re_endcf/p + + # Validate tagname. + case $tagname in + *[!-_A-Za-z0-9,/]*) + func_fatal_error "invalid tag name: $tagname" + ;; + esac + + # Don't test for the "default" C tag, as we know it's + # there but not specially marked. + case $tagname in + CC) ;; + *) + if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then + taglist="$taglist $tagname" + + # Evaluate the configuration. Be careful to quote the path + # and the sed script, to avoid splitting on whitespace, but + # also don't use non-portable quotes within backquotes within + # quotes we have to do it in 2 steps: + extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` + eval "$extractedcf" + else + func_error "ignoring unknown tag $tagname" + fi + ;; + esac +} + + +# func_check_version_match +# ------------------------ +# Ensure that we are using m4 macros, and libtool script from the same +# release of libtool. +func_check_version_match () +{ + if test "$package_revision" != "$macro_revision"; then + if test "$VERSION" != "$macro_version"; then + if test -z "$macro_version"; then + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from an older release. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + fi + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, +$progname: but the definition of this LT_INIT comes from revision $macro_revision. +$progname: You should recreate aclocal.m4 with macros from revision $package_revision +$progname: of $PACKAGE $VERSION and run autoconf again. +_LT_EOF + fi + + exit $EXIT_MISMATCH + fi +} + + +# libtool_options_prep [ARG]... +# ----------------------------- +# Preparation for options parsed by libtool. +libtool_options_prep () +{ + $debug_mode + + # Option defaults: + opt_config=false + opt_dlopen= + opt_dry_run=false + opt_help=false + opt_mode= + opt_preserve_dup_deps=false + opt_quiet=false + + nonopt= + preserve_args= + + _G_rc_lt_options_prep=: + + # Shorthand for --mode=foo, only valid as the first argument + case $1 in + clean|clea|cle|cl) + shift; set dummy --mode clean ${1+"$@"}; shift + ;; + compile|compil|compi|comp|com|co|c) + shift; set dummy --mode compile ${1+"$@"}; shift + ;; + execute|execut|execu|exec|exe|ex|e) + shift; set dummy --mode execute ${1+"$@"}; shift + ;; + finish|finis|fini|fin|fi|f) + shift; set dummy --mode finish ${1+"$@"}; shift + ;; + install|instal|insta|inst|ins|in|i) + shift; set dummy --mode install ${1+"$@"}; shift + ;; + link|lin|li|l) + shift; set dummy --mode link ${1+"$@"}; shift + ;; + uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) + shift; set dummy --mode uninstall ${1+"$@"}; shift + ;; + *) + _G_rc_lt_options_prep=false + ;; + esac + + if $_G_rc_lt_options_prep; then + # Pass back the list of options. + func_quote eval ${1+"$@"} + libtool_options_prep_result=$func_quote_result + fi +} +func_add_hook func_options_prep libtool_options_prep + + +# libtool_parse_options [ARG]... +# --------------------------------- +# Provide handling for libtool specific options. +libtool_parse_options () +{ + $debug_cmd + + _G_rc_lt_parse_options=false + + # Perform our own loop to consume as many options as possible in + # each iteration. + while test $# -gt 0; do + _G_match_lt_parse_options=: + _G_opt=$1 + shift + case $_G_opt in + --dry-run|--dryrun|-n) + opt_dry_run=: + ;; + + --config) func_config ;; + + --dlopen|-dlopen) + opt_dlopen="${opt_dlopen+$opt_dlopen +}$1" + shift + ;; + + --preserve-dup-deps) + opt_preserve_dup_deps=: ;; + + --features) func_features ;; + + --finish) set dummy --mode finish ${1+"$@"}; shift ;; + + --help) opt_help=: ;; + + --help-all) opt_help=': help-all' ;; + + --mode) test $# = 0 && func_missing_arg $_G_opt && break + opt_mode=$1 + case $1 in + # Valid mode arguments: + clean|compile|execute|finish|install|link|relink|uninstall) ;; + + # Catch anything else as an error + *) func_error "invalid argument for $_G_opt" + exit_cmd=exit + break + ;; + esac + shift + ;; + + --no-silent|--no-quiet) + opt_quiet=false + func_append preserve_args " $_G_opt" + ;; + + --no-warnings|--no-warning|--no-warn) + opt_warning=false + func_append preserve_args " $_G_opt" + ;; + + --no-verbose) + opt_verbose=false + func_append preserve_args " $_G_opt" + ;; + + --silent|--quiet) + opt_quiet=: + opt_verbose=false + func_append preserve_args " $_G_opt" + ;; + + --tag) test $# = 0 && func_missing_arg $_G_opt && break + opt_tag=$1 + func_append preserve_args " $_G_opt $1" + func_enable_tag "$1" + shift + ;; + + --verbose|-v) opt_quiet=false + opt_verbose=: + func_append preserve_args " $_G_opt" + ;; + + # An option not handled by this hook function: + *) set dummy "$_G_opt" ${1+"$@"} ; shift + _G_match_lt_parse_options=false + break + ;; + esac + $_G_match_lt_parse_options && _G_rc_lt_parse_options=: + done + + if $_G_rc_lt_parse_options; then + # save modified positional parameters for caller + func_quote eval ${1+"$@"} + libtool_parse_options_result=$func_quote_result + fi +} +func_add_hook func_parse_options libtool_parse_options + + + +# libtool_validate_options [ARG]... +# --------------------------------- +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +libtool_validate_options () +{ + # save first non-option argument + if test 0 -lt $#; then + nonopt=$1 + shift + fi + + # preserve --debug + test : = "$debug_cmd" || func_append preserve_args " --debug" + + case $host in + # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452 + # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788 + *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*) + # don't eliminate duplications in $postdeps and $predeps + opt_duplicate_compiler_generated_deps=: + ;; + *) + opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps + ;; + esac + + $opt_help || { + # Sanity checks first: + func_check_version_match + + test yes != "$build_libtool_libs" \ + && test yes != "$build_old_libs" \ + && func_fatal_configuration "not configured to build any kind of library" + + # Darwin sucks + eval std_shrext=\"$shrext_cmds\" + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$opt_dlopen" && test execute != "$opt_mode"; then + func_error "unrecognized option '-dlopen'" + $ECHO "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help=$help + help="Try '$progname --help --mode=$opt_mode' for more information." + } + + # Pass back the unparsed argument list + func_quote eval ${1+"$@"} + libtool_validate_options_result=$func_quote_result +} +func_add_hook func_validate_options libtool_validate_options + + +# Process options as early as possible so that --help and --version +# can return quickly. +func_options ${1+"$@"} +eval set dummy "$func_options_result"; shift + + + +## ----------- ## +## Main. ## +## ----------- ## + +magic='%%%MAGIC variable%%%' +magic_exe='%%%MAGIC EXE variable%%%' + +# Global variables. +extracted_archives= +extracted_serial=0 + +# If this variable is set in any of the actions, the command in it +# will be execed at the end. This prevents here-documents from being +# left over by shells. +exec_cmd= + + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' +} + +# func_generated_by_libtool +# True iff stdin has been generated by Libtool. This function is only +# a basic sanity check; it will hardly flush out determined imposters. +func_generated_by_libtool_p () +{ + $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 +} + +# func_lalib_p file +# True iff FILE is a libtool '.la' library or '.lo' object file. +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_lalib_p () +{ + test -f "$1" && + $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p +} + +# func_lalib_unsafe_p file +# True iff FILE is a libtool '.la' library or '.lo' object file. +# This function implements the same check as func_lalib_p without +# resorting to external programs. To this end, it redirects stdin and +# closes it afterwards, without saving the original file descriptor. +# As a safety measure, use it only where a negative result would be +# fatal anyway. Works if 'file' does not exist. +func_lalib_unsafe_p () +{ + lalib_p=no + if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then + for lalib_p_l in 1 2 3 4 + do + read lalib_p_line + case $lalib_p_line in + \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; + esac + done + exec 0<&5 5<&- + fi + test yes = "$lalib_p" +} + +# func_ltwrapper_script_p file +# True iff FILE is a libtool wrapper script +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_script_p () +{ + test -f "$1" && + $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p +} + +# func_ltwrapper_executable_p file +# True iff FILE is a libtool wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_executable_p () +{ + func_ltwrapper_exec_suffix= + case $1 in + *.exe) ;; + *) func_ltwrapper_exec_suffix=.exe ;; + esac + $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 +} + +# func_ltwrapper_scriptname file +# Assumes file is an ltwrapper_executable +# uses $file to determine the appropriate filename for a +# temporary ltwrapper_script. +func_ltwrapper_scriptname () +{ + func_dirname_and_basename "$1" "" "." + func_stripname '' '.exe' "$func_basename_result" + func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper +} + +# func_ltwrapper_p file +# True iff FILE is a libtool wrapper script or wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_p () +{ + func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" +} + + +# func_execute_cmds commands fail_cmd +# Execute tilde-delimited COMMANDS. +# If FAIL_CMD is given, eval that upon failure. +# FAIL_CMD may read-access the current command in variable CMD! +func_execute_cmds () +{ + $debug_cmd + + save_ifs=$IFS; IFS='~' + for cmd in $1; do + IFS=$sp$nl + eval cmd=\"$cmd\" + IFS=$save_ifs + func_show_eval "$cmd" "${2-:}" + done + IFS=$save_ifs +} + + +# func_source file +# Source FILE, adding directory component if necessary. +# Note that it is not necessary on cygwin/mingw to append a dot to +# FILE even if both FILE and FILE.exe exist: automatic-append-.exe +# behavior happens only for exec(3), not for open(2)! Also, sourcing +# 'FILE.' does not work on cygwin managed mounts. +func_source () +{ + $debug_cmd + + case $1 in + */* | *\\*) . "$1" ;; + *) . "./$1" ;; + esac +} + + +# func_resolve_sysroot PATH +# Replace a leading = in PATH with a sysroot. Store the result into +# func_resolve_sysroot_result +func_resolve_sysroot () +{ + func_resolve_sysroot_result=$1 + case $func_resolve_sysroot_result in + =*) + func_stripname '=' '' "$func_resolve_sysroot_result" + func_resolve_sysroot_result=$lt_sysroot$func_stripname_result + ;; + esac +} + +# func_replace_sysroot PATH +# If PATH begins with the sysroot, replace it with = and +# store the result into func_replace_sysroot_result. +func_replace_sysroot () +{ + case $lt_sysroot:$1 in + ?*:"$lt_sysroot"*) + func_stripname "$lt_sysroot" '' "$1" + func_replace_sysroot_result='='$func_stripname_result + ;; + *) + # Including no sysroot. + func_replace_sysroot_result=$1 + ;; + esac +} + +# func_infer_tag arg +# Infer tagged configuration to use if any are available and +# if one wasn't chosen via the "--tag" command line option. +# Only attempt this if the compiler in the base compile +# command doesn't match the default compiler. +# arg is usually of the form 'gcc ...' +func_infer_tag () +{ + $debug_cmd + + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`$SED -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case "$@ " in + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + func_echo "unable to infer tagged configuration" + func_fatal_error "specify a tag with '--tag'" +# else +# func_verbose "using $tagname tagged configuration" + fi + ;; + esac + fi +} + + + +# func_write_libtool_object output_name pic_name nonpic_name +# Create a libtool object file (analogous to a ".la" file), +# but don't create it if we're doing a dry run. +func_write_libtool_object () +{ + write_libobj=$1 + if test yes = "$build_libtool_libs"; then + write_lobj=\'$2\' + else + write_lobj=none + fi + + if test yes = "$build_old_libs"; then + write_oldobj=\'$3\' + else + write_oldobj=none + fi + + $opt_dry_run || { + cat >${write_libobj}T </dev/null` + if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then + func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | + $SED -e "$sed_naive_backslashify"` + else + func_convert_core_file_wine_to_w32_result= + fi + fi +} +# end: func_convert_core_file_wine_to_w32 + + +# func_convert_core_path_wine_to_w32 ARG +# Helper function used by path conversion functions when $build is *nix, and +# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly +# configured wine environment available, with the winepath program in $build's +# $PATH. Assumes ARG has no leading or trailing path separator characters. +# +# ARG is path to be converted from $build format to win32. +# Result is available in $func_convert_core_path_wine_to_w32_result. +# Unconvertible file (directory) names in ARG are skipped; if no directory names +# are convertible, then the result may be empty. +func_convert_core_path_wine_to_w32 () +{ + $debug_cmd + + # unfortunately, winepath doesn't convert paths, only file names + func_convert_core_path_wine_to_w32_result= + if test -n "$1"; then + oldIFS=$IFS + IFS=: + for func_convert_core_path_wine_to_w32_f in $1; do + IFS=$oldIFS + func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" + if test -n "$func_convert_core_file_wine_to_w32_result"; then + if test -z "$func_convert_core_path_wine_to_w32_result"; then + func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result + else + func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" + fi + fi + done + IFS=$oldIFS + fi +} +# end: func_convert_core_path_wine_to_w32 + + +# func_cygpath ARGS... +# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when +# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) +# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or +# (2), returns the Cygwin file name or path in func_cygpath_result (input +# file name or path is assumed to be in w32 format, as previously converted +# from $build's *nix or MSYS format). In case (3), returns the w32 file name +# or path in func_cygpath_result (input file name or path is assumed to be in +# Cygwin format). Returns an empty string on error. +# +# ARGS are passed to cygpath, with the last one being the file name or path to +# be converted. +# +# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH +# environment variable; do not put it in $PATH. +func_cygpath () +{ + $debug_cmd + + if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then + func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` + if test "$?" -ne 0; then + # on failure, ensure result is empty + func_cygpath_result= + fi + else + func_cygpath_result= + func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'" + fi +} +#end: func_cygpath + + +# func_convert_core_msys_to_w32 ARG +# Convert file name or path ARG from MSYS format to w32 format. Return +# result in func_convert_core_msys_to_w32_result. +func_convert_core_msys_to_w32 () +{ + $debug_cmd + + # awkward: cmd appends spaces to result + func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | + $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"` +} +#end: func_convert_core_msys_to_w32 + + +# func_convert_file_check ARG1 ARG2 +# Verify that ARG1 (a file name in $build format) was converted to $host +# format in ARG2. Otherwise, emit an error message, but continue (resetting +# func_to_host_file_result to ARG1). +func_convert_file_check () +{ + $debug_cmd + + if test -z "$2" && test -n "$1"; then + func_error "Could not determine host file name corresponding to" + func_error " '$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback: + func_to_host_file_result=$1 + fi +} +# end func_convert_file_check + + +# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH +# Verify that FROM_PATH (a path in $build format) was converted to $host +# format in TO_PATH. Otherwise, emit an error message, but continue, resetting +# func_to_host_file_result to a simplistic fallback value (see below). +func_convert_path_check () +{ + $debug_cmd + + if test -z "$4" && test -n "$3"; then + func_error "Could not determine the host path corresponding to" + func_error " '$3'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback. This is a deliberately simplistic "conversion" and + # should not be "improved". See libtool.info. + if test "x$1" != "x$2"; then + lt_replace_pathsep_chars="s|$1|$2|g" + func_to_host_path_result=`echo "$3" | + $SED -e "$lt_replace_pathsep_chars"` + else + func_to_host_path_result=$3 + fi + fi +} +# end func_convert_path_check + + +# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG +# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT +# and appending REPL if ORIG matches BACKPAT. +func_convert_path_front_back_pathsep () +{ + $debug_cmd + + case $4 in + $1 ) func_to_host_path_result=$3$func_to_host_path_result + ;; + esac + case $4 in + $2 ) func_append func_to_host_path_result "$3" + ;; + esac +} +# end func_convert_path_front_back_pathsep + + +################################################## +# $build to $host FILE NAME CONVERSION FUNCTIONS # +################################################## +# invoked via '$to_host_file_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# Result will be available in $func_to_host_file_result. + + +# func_to_host_file ARG +# Converts the file name ARG from $build format to $host format. Return result +# in func_to_host_file_result. +func_to_host_file () +{ + $debug_cmd + + $to_host_file_cmd "$1" +} +# end func_to_host_file + + +# func_to_tool_file ARG LAZY +# converts the file name ARG from $build format to toolchain format. Return +# result in func_to_tool_file_result. If the conversion in use is listed +# in (the comma separated) LAZY, no conversion takes place. +func_to_tool_file () +{ + $debug_cmd + + case ,$2, in + *,"$to_tool_file_cmd",*) + func_to_tool_file_result=$1 + ;; + *) + $to_tool_file_cmd "$1" + func_to_tool_file_result=$func_to_host_file_result + ;; + esac +} +# end func_to_tool_file + + +# func_convert_file_noop ARG +# Copy ARG to func_to_host_file_result. +func_convert_file_noop () +{ + func_to_host_file_result=$1 +} +# end func_convert_file_noop + + +# func_convert_file_msys_to_w32 ARG +# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_file_result. +func_convert_file_msys_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_to_host_file_result=$func_convert_core_msys_to_w32_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_w32 + + +# func_convert_file_cygwin_to_w32 ARG +# Convert file name ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_file_cygwin_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + # because $build is cygwin, we call "the" cygpath in $PATH; no need to use + # LT_CYGPATH in this case. + func_to_host_file_result=`cygpath -m "$1"` + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_cygwin_to_w32 + + +# func_convert_file_nix_to_w32 ARG +# Convert file name ARG from *nix to w32 format. Requires a wine environment +# and a working winepath. Returns result in func_to_host_file_result. +func_convert_file_nix_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_file_wine_to_w32 "$1" + func_to_host_file_result=$func_convert_core_file_wine_to_w32_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_w32 + + +# func_convert_file_msys_to_cygwin ARG +# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_file_msys_to_cygwin () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_cygpath -u "$func_convert_core_msys_to_w32_result" + func_to_host_file_result=$func_cygpath_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_cygwin + + +# func_convert_file_nix_to_cygwin ARG +# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed +# in a wine environment, working winepath, and LT_CYGPATH set. Returns result +# in func_to_host_file_result. +func_convert_file_nix_to_cygwin () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. + func_convert_core_file_wine_to_w32 "$1" + func_cygpath -u "$func_convert_core_file_wine_to_w32_result" + func_to_host_file_result=$func_cygpath_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_cygwin + + +############################################# +# $build to $host PATH CONVERSION FUNCTIONS # +############################################# +# invoked via '$to_host_path_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# The result will be available in $func_to_host_path_result. +# +# Path separators are also converted from $build format to $host format. If +# ARG begins or ends with a path separator character, it is preserved (but +# converted to $host format) on output. +# +# All path conversion functions are named using the following convention: +# file name conversion function : func_convert_file_X_to_Y () +# path conversion function : func_convert_path_X_to_Y () +# where, for any given $build/$host combination the 'X_to_Y' value is the +# same. If conversion functions are added for new $build/$host combinations, +# the two new functions must follow this pattern, or func_init_to_host_path_cmd +# will break. + + +# func_init_to_host_path_cmd +# Ensures that function "pointer" variable $to_host_path_cmd is set to the +# appropriate value, based on the value of $to_host_file_cmd. +to_host_path_cmd= +func_init_to_host_path_cmd () +{ + $debug_cmd + + if test -z "$to_host_path_cmd"; then + func_stripname 'func_convert_file_' '' "$to_host_file_cmd" + to_host_path_cmd=func_convert_path_$func_stripname_result + fi +} + + +# func_to_host_path ARG +# Converts the path ARG from $build format to $host format. Return result +# in func_to_host_path_result. +func_to_host_path () +{ + $debug_cmd + + func_init_to_host_path_cmd + $to_host_path_cmd "$1" +} +# end func_to_host_path + + +# func_convert_path_noop ARG +# Copy ARG to func_to_host_path_result. +func_convert_path_noop () +{ + func_to_host_path_result=$1 +} +# end func_convert_path_noop + + +# func_convert_path_msys_to_w32 ARG +# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_path_result. +func_convert_path_msys_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # Remove leading and trailing path separator characters from ARG. MSYS + # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; + # and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result=$func_convert_core_msys_to_w32_result + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_msys_to_w32 + + +# func_convert_path_cygwin_to_w32 ARG +# Convert path ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_path_cygwin_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_cygwin_to_w32 + + +# func_convert_path_nix_to_w32 ARG +# Convert path ARG from *nix to w32 format. Requires a wine environment and +# a working winepath. Returns result in func_to_host_file_result. +func_convert_path_nix_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result=$func_convert_core_path_wine_to_w32_result + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_nix_to_w32 + + +# func_convert_path_msys_to_cygwin ARG +# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_path_msys_to_cygwin () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_msys_to_w32_result" + func_to_host_path_result=$func_cygpath_result + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_msys_to_cygwin + + +# func_convert_path_nix_to_cygwin ARG +# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a +# a wine environment, working winepath, and LT_CYGPATH set. Returns result in +# func_to_host_file_result. +func_convert_path_nix_to_cygwin () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # Remove leading and trailing path separator characters from + # ARG. msys behavior is inconsistent here, cygpath turns them + # into '.;' and ';.', and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" + func_to_host_path_result=$func_cygpath_result + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_nix_to_cygwin + + +# func_dll_def_p FILE +# True iff FILE is a Windows DLL '.def' file. +# Keep in sync with _LT_DLL_DEF_P in libtool.m4 +func_dll_def_p () +{ + $debug_cmd + + func_dll_def_p_tmp=`$SED -n \ + -e 's/^[ ]*//' \ + -e '/^\(;.*\)*$/d' \ + -e 's/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p' \ + -e q \ + "$1"` + test DEF = "$func_dll_def_p_tmp" +} + + +# func_mode_compile arg... +func_mode_compile () +{ + $debug_cmd + + # Get the compilation command and the source file. + base_compile= + srcfile=$nonopt # always keep a non-empty value in "srcfile" + suppress_opt=yes + suppress_output= + arg_mode=normal + libobj= + later= + pie_flag= + + for arg + do + case $arg_mode in + arg ) + # do not "continue". Instead, add this to base_compile + lastarg=$arg + arg_mode=normal + ;; + + target ) + libobj=$arg + arg_mode=normal + continue + ;; + + normal ) + # Accept any command-line options. + case $arg in + -o) + test -n "$libobj" && \ + func_fatal_error "you cannot specify '-o' more than once" + arg_mode=target + continue + ;; + + -pie | -fpie | -fPIE) + func_append pie_flag " $arg" + continue + ;; + + -shared | -static | -prefer-pic | -prefer-non-pic) + func_append later " $arg" + continue + ;; + + -no-suppress) + suppress_opt=no + continue + ;; + + -Xcompiler) + arg_mode=arg # the next one goes into the "base_compile" arg list + continue # The current "srcfile" will either be retained or + ;; # replaced later. I would guess that would be a bug. + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + lastarg= + save_ifs=$IFS; IFS=, + for arg in $args; do + IFS=$save_ifs + func_append_quoted lastarg "$arg" + done + IFS=$save_ifs + func_stripname ' ' '' "$lastarg" + lastarg=$func_stripname_result + + # Add the arguments to base_compile. + func_append base_compile " $lastarg" + continue + ;; + + *) + # Accept the current argument as the source file. + # The previous "srcfile" becomes the current argument. + # + lastarg=$srcfile + srcfile=$arg + ;; + esac # case $arg + ;; + esac # case $arg_mode + + # Aesthetically quote the previous argument. + func_append_quoted base_compile "$lastarg" + done # for arg + + case $arg_mode in + arg) + func_fatal_error "you must specify an argument for -Xcompile" + ;; + target) + func_fatal_error "you must specify a target with '-o'" + ;; + *) + # Get the name of the library object. + test -z "$libobj" && { + func_basename "$srcfile" + libobj=$func_basename_result + } + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + case $libobj in + *.[cCFSifmso] | \ + *.ada | *.adb | *.ads | *.asm | \ + *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ + *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) + func_xform "$libobj" + libobj=$func_xform_result + ;; + esac + + case $libobj in + *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; + *) + func_fatal_error "cannot determine name of library object from '$libobj'" + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -shared) + test yes = "$build_libtool_libs" \ + || func_fatal_configuration "cannot build a shared library" + build_old_libs=no + continue + ;; + + -static) + build_libtool_libs=no + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + func_quote_arg pretty "$libobj" + test "X$libobj" != "X$func_quote_arg_result" \ + && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ + && func_warning "libobj name '$libobj' may not contain shell special characters." + func_dirname_and_basename "$obj" "/" "" + objname=$func_basename_result + xdir=$func_dirname_result + lobj=$xdir$objdir/$objname + + test -z "$base_compile" && \ + func_fatal_help "you must specify a compilation command" + + # Delete any leftover library objects. + if test yes = "$build_old_libs"; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2* | cegcc*) + pic_mode=default + ;; + esac + if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test no = "$compiler_c_o"; then + output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext + lockfile=$output_obj.lock + else + output_obj= + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test yes = "$need_locks"; then + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + elif test warn = "$need_locks"; then + if test -f "$lockfile"; then + $ECHO "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + func_append removelist " $output_obj" + $ECHO "$srcfile" > "$lockfile" + fi + + $opt_dry_run || $RM $removelist + func_append removelist " $lockfile" + trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 + + func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 + srcfile=$func_to_tool_file_result + func_quote_arg pretty "$srcfile" + qsrcfile=$func_quote_arg_result + + # Only build a PIC object if we are building libtool libraries. + if test yes = "$build_libtool_libs"; then + # Without this assignment, base_compile gets emptied. + fbsd_hideous_sh_bug=$base_compile + + if test no != "$pic_mode"; then + command="$base_compile $qsrcfile $pic_flag" + else + # Don't build PIC code + command="$base_compile $qsrcfile" + fi + + func_mkdir_p "$xdir$objdir" + + if test -z "$output_obj"; then + # Place PIC objects in $objdir + func_append command " -o $lobj" + fi + + func_show_eval_locale "$command" \ + 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' + + if test warn = "$need_locks" && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed, then go on to compile the next one + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + func_show_eval '$MV "$output_obj" "$lobj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + + # Allow error messages only from the first compilation. + if test yes = "$suppress_opt"; then + suppress_output=' >/dev/null 2>&1' + fi + fi + + # Only build a position-dependent object if we build old libraries. + if test yes = "$build_old_libs"; then + if test yes != "$pic_mode"; then + # Don't build PIC code + command="$base_compile $qsrcfile$pie_flag" + else + command="$base_compile $qsrcfile $pic_flag" + fi + if test yes = "$compiler_c_o"; then + func_append command " -o $obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + func_append command "$suppress_output" + func_show_eval_locale "$command" \ + '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' + + if test warn = "$need_locks" && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + func_show_eval '$MV "$output_obj" "$obj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + fi + + $opt_dry_run || { + func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" + + # Unlock the critical section if it was locked + if test no != "$need_locks"; then + removelist=$lockfile + $RM "$lockfile" + fi + } + + exit $EXIT_SUCCESS +} + +$opt_help || { + test compile = "$opt_mode" && func_mode_compile ${1+"$@"} +} + +func_mode_help () +{ + # We need to display help for each of the modes. + case $opt_mode in + "") + # Generic help is extracted from the usage comments + # at the start of this file. + func_help + ;; + + clean) + $ECHO \ +"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... + +Remove files from the build directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed +to RM. + +If FILE is a libtool library, object or program, all the files associated +with it are deleted. Otherwise, only FILE itself is deleted using RM." + ;; + + compile) + $ECHO \ +"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -no-suppress do not suppress compiler output for multiple passes + -prefer-pic try to build PIC objects only + -prefer-non-pic try to build non-PIC objects only + -shared do not build a '.o' file suitable for static linking + -static only build a '.o' file suitable for static linking + -Wc,FLAG pass FLAG directly to the compiler + +COMPILE-COMMAND is a command to be used in creating a 'standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix '.c' with the +library object suffix, '.lo'." + ;; + + execute) + $ECHO \ +"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to '-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + + finish) + $ECHO \ +"Usage: $progname [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the '--dry-run' option if you just want to see what would be executed." + ;; + + install) + $ECHO \ +"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the 'install' or 'cp' program. + +The following components of INSTALL-COMMAND are treated specially: + + -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + + link) + $ECHO \ +"Usage: $progname [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -bindir BINDIR specify path to binaries directory (for systems where + libraries must be found in the PATH setting at runtime) + -dlopen FILE '-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-fast-install disable the fast-install mode + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE use a list of object files found in FILE to specify objects + -os2dllname NAME force a short DLL name on OS/2 (no effect on other OSes) + -precious-files-regex REGEX + don't remove output files matching REGEX + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -shared only do dynamic linking of libtool libraries + -shrext SUFFIX override the standard shared library file extension + -static do not do any dynamic linking of uninstalled libtool libraries + -static-libtool-libs + do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + -weak LIBNAME declare that the target provides the LIBNAME interface + -Wc,FLAG + -Xcompiler FLAG pass linker-specific FLAG directly to the compiler + -Wl,FLAG + -Xlinker FLAG pass linker-specific FLAG directly to the linker + -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) + +All other options (arguments beginning with '-') are ignored. + +Every other argument is treated as a filename. Files ending in '.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in '.la', then a libtool library is created, +only library objects ('.lo' files) may be specified, and '-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in '.a' or '.lib', then a standard library is created +using 'ar' and 'ranlib', or on Windows using 'lib'. + +If OUTPUT-FILE ends in '.lo' or '.$objext', then a reloadable object file +is created, otherwise an executable program is created." + ;; + + uninstall) + $ECHO \ +"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + + *) + func_fatal_help "invalid operation mode '$opt_mode'" + ;; + esac + + echo + $ECHO "Try '$progname --help' for more information about other modes." +} + +# Now that we've collected a possible --mode arg, show help if necessary +if $opt_help; then + if test : = "$opt_help"; then + func_mode_help + else + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + func_mode_help + done + } | $SED -n '1p; 2,$s/^Usage:/ or: /p' + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + echo + func_mode_help + done + } | + $SED '1d + /^When reporting/,/^Report/{ + H + d + } + $x + /information about other modes/d + /more detailed .*MODE/d + s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' + fi + exit $? +fi + + +# func_mode_execute arg... +func_mode_execute () +{ + $debug_cmd + + # The first argument is the command name. + cmd=$nonopt + test -z "$cmd" && \ + func_fatal_help "you must specify a COMMAND" + + # Handle -dlopen flags immediately. + for file in $opt_dlopen; do + test -f "$file" \ + || func_fatal_help "'$file' is not a file" + + dir= + case $file in + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "'$lib' is not a valid libtool archive" + + # Read the libtool library. + dlname= + library_names= + func_source "$file" + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && \ + func_warning "'$file' was not linked with '-export-dynamic'" + continue + fi + + func_dirname "$file" "" "." + dir=$func_dirname_result + + if test -f "$dir/$objdir/$dlname"; then + func_append dir "/$objdir" + else + if test ! -f "$dir/$dlname"; then + func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'" + fi + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + func_dirname "$file" "" "." + dir=$func_dirname_result + ;; + + *) + func_warning "'-dlopen' is ignored for non-libtool libraries and objects" + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir=$absdir + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic=$magic + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -* | *.la | *.lo ) ;; + *) + # Do a test to see if this is really a libtool program. + if func_ltwrapper_script_p "$file"; then + func_source "$file" + # Transform arg to wrapped name. + file=$progdir/$program + elif func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + func_source "$func_ltwrapper_scriptname_result" + # Transform arg to wrapped name. + file=$progdir/$program + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + func_append_quoted args "$file" + done + + if $opt_dry_run; then + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" + echo "export $shlibpath_var" + fi + $ECHO "$cmd$args" + exit $EXIT_SUCCESS + else + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES + do + eval "if test \"\${save_$lt_var+set}\" = set; then + $lt_var=\$save_$lt_var; export $lt_var + else + $lt_unset $lt_var + fi" + done + + # Now prepare to actually exec the command. + exec_cmd=\$cmd$args + fi +} + +test execute = "$opt_mode" && func_mode_execute ${1+"$@"} + + +# func_mode_finish arg... +func_mode_finish () +{ + $debug_cmd + + libs= + libdirs= + admincmds= + + for opt in "$nonopt" ${1+"$@"} + do + if test -d "$opt"; then + func_append libdirs " $opt" + + elif test -f "$opt"; then + if func_lalib_unsafe_p "$opt"; then + func_append libs " $opt" + else + func_warning "'$opt' is not a valid libtool archive" + fi + + else + func_fatal_error "invalid argument '$opt'" + fi + done + + if test -n "$libs"; then + if test -n "$lt_sysroot"; then + sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` + sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" + else + sysroot_cmd= + fi + + # Remove sysroot references + if $opt_dry_run; then + for lib in $libs; do + echo "removing references to $lt_sysroot and '=' prefixes from $lib" + done + else + tmpdir=`func_mktempdir` + for lib in $libs; do + $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ + > $tmpdir/tmp-la + mv -f $tmpdir/tmp-la $lib + done + ${RM}r "$tmpdir" + fi + fi + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + func_execute_cmds "$finish_cmds" 'admincmds="$admincmds +'"$cmd"'"' + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $opt_dry_run || eval "$cmds" || func_append admincmds " + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + $opt_quiet && exit $EXIT_SUCCESS + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + echo "----------------------------------------------------------------------" + echo "Libraries have been installed in:" + for libdir in $libdirs; do + $ECHO " $libdir" + done + echo + echo "If you ever happen to want to link against installed libraries" + echo "in a given directory, LIBDIR, you must either use libtool, and" + echo "specify the full pathname of the library, or use the '-LLIBDIR'" + echo "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + echo " - add LIBDIR to the '$shlibpath_var' environment variable" + echo " during execution" + fi + if test -n "$runpath_var"; then + echo " - add LIBDIR to the '$runpath_var' environment variable" + echo " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + $ECHO " - use the '$flag' linker flag" + fi + if test -n "$admincmds"; then + $ECHO " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + echo " - have your system administrator add LIBDIR to '/etc/ld.so.conf'" + fi + echo + + echo "See any operating system documentation about shared libraries for" + case $host in + solaris2.[6789]|solaris2.1[0-9]) + echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" + echo "pages." + ;; + *) + echo "more information, such as the ld(1) and ld.so(8) manual pages." + ;; + esac + echo "----------------------------------------------------------------------" + fi + exit $EXIT_SUCCESS +} + +test finish = "$opt_mode" && func_mode_finish ${1+"$@"} + + +# func_mode_install arg... +func_mode_install () +{ + $debug_cmd + + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" || + # Allow the use of GNU shtool's install command. + case $nonopt in *shtool*) :;; *) false;; esac + then + # Aesthetically quote it. + func_quote_arg pretty "$nonopt" + install_prog="$func_quote_arg_result " + arg=$1 + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + func_quote_arg pretty "$arg" + func_append install_prog "$func_quote_arg_result" + install_shared_prog=$install_prog + case " $install_prog " in + *[\\\ /]cp\ *) install_cp=: ;; + *) install_cp=false ;; + esac + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=false + stripme= + no_mode=: + for arg + do + arg2= + if test -n "$dest"; then + func_append files " $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=: ;; + -f) + if $install_cp; then :; else + prev=$arg + fi + ;; + -g | -m | -o) + prev=$arg + ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + if test X-m = "X$prev" && test -n "$install_override_mode"; then + arg2=$install_override_mode + no_mode=false + fi + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + func_quote_arg pretty "$arg" + func_append install_prog " $func_quote_arg_result" + if test -n "$arg2"; then + func_quote_arg pretty "$arg2" + fi + func_append install_shared_prog " $func_quote_arg_result" + done + + test -z "$install_prog" && \ + func_fatal_help "you must specify an install program" + + test -n "$prev" && \ + func_fatal_help "the '$prev' option requires an argument" + + if test -n "$install_override_mode" && $no_mode; then + if $install_cp; then :; else + func_quote_arg pretty "$install_override_mode" + func_append install_shared_prog " -m $func_quote_arg_result" + fi + fi + + if test -z "$files"; then + if test -z "$dest"; then + func_fatal_help "no file or destination specified" + else + func_fatal_help "you must specify a destination" + fi + fi + + # Strip any trailing slash from the destination. + func_stripname '' '/' "$dest" + dest=$func_stripname_result + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=: + if $isdir; then + destdir=$dest + destname= + else + func_dirname_and_basename "$dest" "" "." + destdir=$func_dirname_result + destname=$func_basename_result + + # Not a directory, so check to see that there is only one file specified. + set dummy $files; shift + test "$#" -gt 1 && \ + func_fatal_help "'$dest' is not a directory" + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + func_fatal_help "'$destdir' must be an absolute directory name" + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic=$magic + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case $file in + *.$libext) + # Do the static libraries later. + func_append staticlibs " $file" + ;; + + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "'$file' is not a valid libtool archive" + + library_names= + old_library= + relink_command= + func_source "$file" + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) func_append current_libdirs " $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) func_append future_libdirs " $libdir" ;; + esac + fi + + func_dirname "$file" "/" "" + dir=$func_dirname_result + func_append dir "$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + test "$inst_prefix_dir" = "$destdir" && \ + func_fatal_error "error: cannot install '$file' to a directory not ending in $libdir" + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` + fi + + func_warning "relinking '$file'" + func_show_eval "$relink_command" \ + 'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"' + fi + + # See the names of the shared library. + set dummy $library_names; shift + if test -n "$1"; then + realname=$1 + shift + + srcname=$realname + test -n "$relink_command" && srcname=${realname}T + + # Install the shared library and build the symlinks. + func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ + 'exit $?' + tstripme=$stripme + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + case $realname in + *.dll.a) + tstripme= + ;; + esac + ;; + os2*) + case $realname in + *_dll.a) + tstripme= + ;; + esac + ;; + esac + if test -n "$tstripme" && test -n "$striplib"; then + func_show_eval "$striplib $destdir/$realname" 'exit $?' + fi + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. + # Try 'ln -sf' first, because the 'ln' binary might depend on + # the symlink we replace! Solaris /bin/ln does not understand -f, + # so we also need to try rm && ln -s. + for linkname + do + test "$linkname" != "$realname" \ + && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" + done + fi + + # Do each command in the postinstall commands. + lib=$destdir/$realname + func_execute_cmds "$postinstall_cmds" 'exit $?' + fi + + # Install the pseudo-library for information purposes. + func_basename "$file" + name=$func_basename_result + instname=$dir/${name}i + func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' + + # Maybe install the static library, too. + test -n "$old_library" && func_append staticlibs " $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile=$destdir/$destname + else + func_basename "$file" + destfile=$func_basename_result + destfile=$destdir/$destfile + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + func_lo2o "$destfile" + staticdest=$func_lo2o_result + ;; + *.$objext) + staticdest=$destfile + destfile= + ;; + *) + func_fatal_help "cannot copy a libtool object to '$destfile'" + ;; + esac + + # Install the libtool object if requested. + test -n "$destfile" && \ + func_show_eval "$install_prog $file $destfile" 'exit $?' + + # Install the old object if enabled. + if test yes = "$build_old_libs"; then + # Deduce the name of the old-style object file. + func_lo2o "$file" + staticobj=$func_lo2o_result + func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile=$destdir/$destname + else + func_basename "$file" + destfile=$func_basename_result + destfile=$destdir/$destfile + fi + + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext= + case $file in + *.exe) + if test ! -f "$file"; then + func_stripname '' '.exe' "$file" + file=$func_stripname_result + stripped_ext=.exe + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin* | *mingw*) + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + wrapper=$func_ltwrapper_scriptname_result + else + func_stripname '' '.exe' "$file" + wrapper=$func_stripname_result + fi + ;; + *) + wrapper=$file + ;; + esac + if func_ltwrapper_script_p "$wrapper"; then + notinst_deplibs= + relink_command= + + func_source "$wrapper" + + # Check the variables that should have been set. + test -z "$generated_by_libtool_version" && \ + func_fatal_error "invalid libtool wrapper script '$wrapper'" + + finalize=: + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + func_source "$lib" + fi + libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'` + if test -n "$libdir" && test ! -f "$libfile"; then + func_warning "'$lib' has not been installed in '$libdir'" + finalize=false + fi + done + + relink_command= + func_source "$wrapper" + + outputname= + if test no = "$fast_install" && test -n "$relink_command"; then + $opt_dry_run || { + if $finalize; then + tmpdir=`func_mktempdir` + func_basename "$file$stripped_ext" + file=$func_basename_result + outputname=$tmpdir/$file + # Replace the output file specification. + relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` + + $opt_quiet || { + func_quote_arg expand,pretty "$relink_command" + eval "func_echo $func_quote_arg_result" + } + if eval "$relink_command"; then : + else + func_error "error: relink '$file' with the above command before installing it" + $opt_dry_run || ${RM}r "$tmpdir" + continue + fi + file=$outputname + else + func_warning "cannot relink '$file'" + fi + } + else + # Install the binary that we compiled earlier. + file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyway + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + func_stripname '' '.exe' "$destfile" + destfile=$func_stripname_result + ;; + esac + ;; + esac + func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' + $opt_dry_run || if test -n "$outputname"; then + ${RM}r "$tmpdir" + fi + ;; + esac + done + + for file in $staticlibs; do + func_basename "$file" + name=$func_basename_result + + # Set up the ranlib parameters. + oldlib=$destdir/$name + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + + func_show_eval "$install_prog \$file \$oldlib" 'exit $?' + + if test -n "$stripme" && test -n "$old_striplib"; then + func_show_eval "$old_striplib $tool_oldlib" 'exit $?' + fi + + # Do each command in the postinstall commands. + func_execute_cmds "$old_postinstall_cmds" 'exit $?' + done + + test -n "$future_libdirs" && \ + func_warning "remember to run '$progname --finish$future_libdirs'" + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + $opt_dry_run && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi +} + +test install = "$opt_mode" && func_mode_install ${1+"$@"} + + +# func_generate_dlsyms outputname originator pic_p +# Extract symbols from dlprefiles and create ${outputname}S.o with +# a dlpreopen symbol table. +func_generate_dlsyms () +{ + $debug_cmd + + my_outputname=$1 + my_originator=$2 + my_pic_p=${3-false} + my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'` + my_dlsyms= + + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + my_dlsyms=${my_outputname}S.c + else + func_error "not configured to extract global symbols from dlpreopened files" + fi + fi + + if test -n "$my_dlsyms"; then + case $my_dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist=$output_objdir/$my_outputname.nm + + func_show_eval "$RM $nlist ${nlist}S ${nlist}T" + + # Parse the name list into a source file. + func_verbose "creating $output_objdir/$my_dlsyms" + + $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ +/* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */ +/* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +#if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) +#pragma GCC diagnostic ignored \"-Wstrict-prototypes\" +#endif + +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) + +/* External symbol declarations for the compiler. */\ +" + + if test yes = "$dlself"; then + func_verbose "generating symbol list for '$output'" + + $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` + for progfile in $progfiles; do + func_to_tool_file "$progfile" func_convert_file_msys_to_w32 + func_verbose "extracting global C symbols from '$func_to_tool_file_result'" + $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $opt_dry_run || { + eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + if test -n "$export_symbols_regex"; then + $opt_dry_run || { + eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols=$output_objdir/$outputname.exp + $opt_dry_run || { + $RM $export_symbols + eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + } + else + $opt_dry_run || { + eval "$SED -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + } + fi + fi + + for dlprefile in $dlprefiles; do + func_verbose "extracting global C symbols from '$dlprefile'" + func_basename "$dlprefile" + name=$func_basename_result + case $host in + *cygwin* | *mingw* | *cegcc* ) + # if an import library, we need to obtain dlname + if func_win32_import_lib_p "$dlprefile"; then + func_tr_sh "$dlprefile" + eval "curr_lafile=\$libfile_$func_tr_sh_result" + dlprefile_dlbasename= + if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then + # Use subshell, to avoid clobbering current variable values + dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` + if test -n "$dlprefile_dlname"; then + func_basename "$dlprefile_dlname" + dlprefile_dlbasename=$func_basename_result + else + # no lafile. user explicitly requested -dlpreopen . + $sharedlib_from_linklib_cmd "$dlprefile" + dlprefile_dlbasename=$sharedlib_from_linklib_result + fi + fi + $opt_dry_run || { + if test -n "$dlprefile_dlbasename"; then + eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' + else + func_warning "Could not compute DLL name from $name" + eval '$ECHO ": $name " >> "$nlist"' + fi + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | + $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" + } + else # not an import lib + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + fi + ;; + *) + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + ;; + esac + done + + $opt_dry_run || { + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $MV "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if $GREP -v "^: " < "$nlist" | + if sort -k 3 /dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + uniq > "$nlist"S; then + : + else + $GREP -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' + else + echo '/* NONE */' >> "$output_objdir/$my_dlsyms" + fi + + func_show_eval '$RM "${nlist}I"' + if test -n "$global_symbol_to_import"; then + eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I' + fi + + echo >> "$output_objdir/$my_dlsyms" "\ + +/* The mapping between symbol names and symbols. */ +typedef struct { + const char *name; + void *address; +} lt_dlsymlist; +extern LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[];\ +" + + if test -s "$nlist"I; then + echo >> "$output_objdir/$my_dlsyms" "\ +static void lt_syminit(void) +{ + LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols; + for (; symbol->name; ++symbol) + {" + $SED 's/.*/ if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms" + echo >> "$output_objdir/$my_dlsyms" "\ + } +}" + fi + echo >> "$output_objdir/$my_dlsyms" "\ +LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[] = +{ {\"$my_originator\", (void *) 0}," + + if test -s "$nlist"I; then + echo >> "$output_objdir/$my_dlsyms" "\ + {\"@INIT@\", (void *) <_syminit}," + fi + + case $need_lib_prefix in + no) + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + *) + eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + esac + echo >> "$output_objdir/$my_dlsyms" "\ + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_${my_prefix}_LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + } # !$opt_dry_run + + pic_flag_for_symtable= + case "$compile_command " in + *" -static "*) ;; + *) + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; + *-*-hpux*) + pic_flag_for_symtable=" $pic_flag" ;; + *) + $my_pic_p && pic_flag_for_symtable=" $pic_flag" + ;; + esac + ;; + esac + symtab_cflags= + for arg in $LTCFLAGS; do + case $arg in + -pie | -fpie | -fPIE) ;; + *) func_append symtab_cflags " $arg" ;; + esac + done + + # Now compile the dynamic symbol file. + func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' + + # Clean up the generated files. + func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"' + + # Transform the symbol file into the correct name. + symfileobj=$output_objdir/${my_outputname}S.$objext + case $host in + *cygwin* | *mingw* | *cegcc* ) + if test -f "$output_objdir/$my_outputname.def"; then + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + else + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + fi + ;; + *) + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + ;; + esac + ;; + *) + func_fatal_error "unknown suffix for '$my_dlsyms'" + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` + fi +} + +# func_cygming_gnu_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is a GNU/binutils-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_gnu_implib_p () +{ + $debug_cmd + + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` + test -n "$func_cygming_gnu_implib_tmp" +} + +# func_cygming_ms_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is an MS-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_ms_implib_p () +{ + $debug_cmd + + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` + test -n "$func_cygming_ms_implib_tmp" +} + +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +# Despite the name, also deal with 64 bit binaries. +func_win32_libid () +{ + $debug_cmd + + win32_libid_type=unknown + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | + $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then + case $nm_interface in + "MS dumpbin") + if func_cygming_ms_implib_p "$1" || + func_cygming_gnu_implib_p "$1" + then + win32_nmres=import + else + win32_nmres= + fi + ;; + *) + func_to_tool_file "$1" func_convert_file_msys_to_w32 + win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | + $SED -n -e ' + 1,100{ + / I /{ + s|.*|import| + p + q + } + }'` + ;; + esac + case $win32_nmres in + import*) win32_libid_type="x86 archive import";; + *) win32_libid_type="x86 archive static";; + esac + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $ECHO "$win32_libid_type" +} + +# func_cygming_dll_for_implib ARG +# +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib () +{ + $debug_cmd + + sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` +} + +# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs +# +# The is the core of a fallback implementation of a +# platform-specific function to extract the name of the +# DLL associated with the specified import library LIBNAME. +# +# SECTION_NAME is either .idata$6 or .idata$7, depending +# on the platform and compiler that created the implib. +# +# Echos the name of the DLL associated with the +# specified import library. +func_cygming_dll_for_implib_fallback_core () +{ + $debug_cmd + + match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` + $OBJDUMP -s --section "$1" "$2" 2>/dev/null | + $SED '/^Contents of section '"$match_literal"':/{ + # Place marker at beginning of archive member dllname section + s/.*/====MARK====/ + p + d + } + # These lines can sometimes be longer than 43 characters, but + # are always uninteresting + /:[ ]*file format pe[i]\{,1\}-/d + /^In archive [^:]*:/d + # Ensure marker is printed + /^====MARK====/p + # Remove all lines with less than 43 characters + /^.\{43\}/!d + # From remaining lines, remove first 43 characters + s/^.\{43\}//' | + $SED -n ' + # Join marker and all lines until next marker into a single line + /^====MARK====/ b para + H + $ b para + b + :para + x + s/\n//g + # Remove the marker + s/^====MARK====// + # Remove trailing dots and whitespace + s/[\. \t]*$// + # Print + /./p' | + # we now have a list, one entry per line, of the stringified + # contents of the appropriate section of all members of the + # archive that possess that section. Heuristic: eliminate + # all those that have a first or second character that is + # a '.' (that is, objdump's representation of an unprintable + # character.) This should work for all archives with less than + # 0x302f exports -- but will fail for DLLs whose name actually + # begins with a literal '.' or a single character followed by + # a '.'. + # + # Of those that remain, print the first one. + $SED -e '/^\./d;/^.\./d;q' +} + +# func_cygming_dll_for_implib_fallback ARG +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# +# This fallback implementation is for use when $DLLTOOL +# does not support the --identify-strict option. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib_fallback () +{ + $debug_cmd + + if func_cygming_gnu_implib_p "$1"; then + # binutils import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` + elif func_cygming_ms_implib_p "$1"; then + # ms-generated import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` + else + # unknown + sharedlib_from_linklib_result= + fi +} + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + $debug_cmd + + f_ex_an_ar_dir=$1; shift + f_ex_an_ar_oldlib=$1 + if test yes = "$lock_old_archive_extraction"; then + lockfile=$f_ex_an_ar_oldlib.lock + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + fi + func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ + 'stat=$?; rm -f "$lockfile"; exit $stat' + if test yes = "$lock_old_archive_extraction"; then + $opt_dry_run || rm -f "$lockfile" + fi + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" + fi +} + + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + $debug_cmd + + my_gentop=$1; shift + my_oldlibs=${1+"$@"} + my_oldobjs= + my_xlib= + my_xabs= + my_xdir= + + for my_xlib in $my_oldlibs; do + # Extract the objects. + case $my_xlib in + [\\/]* | [A-Za-z]:[\\/]*) my_xabs=$my_xlib ;; + *) my_xabs=`pwd`"/$my_xlib" ;; + esac + func_basename "$my_xlib" + my_xlib=$func_basename_result + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + func_arith $extracted_serial + 1 + extracted_serial=$func_arith_result + my_xlib_u=lt$extracted_serial-$my_xlib ;; + *) break ;; + esac + done + extracted_archives="$extracted_archives $my_xlib_u" + my_xdir=$my_gentop/$my_xlib_u + + func_mkdir_p "$my_xdir" + + case $host in + *-darwin*) + func_verbose "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + $opt_dry_run || { + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + func_basename "$darwin_archive" + darwin_base_archive=$func_basename_result + darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` + if test -n "$darwin_arches"; then + darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches; do + func_mkdir_p "unfat-$$/$darwin_base_archive-$darwin_arch" + $LIPO -thin $darwin_arch -output "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" "$darwin_archive" + cd "unfat-$$/$darwin_base_archive-$darwin_arch" + func_extract_an_archive "`pwd`" "$darwin_base_archive" + cd "$darwin_curdir" + $RM "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" + done # $darwin_arches + ## Okay now we've a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$sed_basename" | sort -u` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` + $LIPO -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + $RM -rf unfat-$$ + cd "$darwin_orig_dir" + else + cd $darwin_orig_dir + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + } # !$opt_dry_run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` + done + + func_extract_archives_result=$my_oldobjs +} + + +# func_emit_wrapper [arg=no] +# +# Emit a libtool wrapper script on stdout. +# Don't directly open a file because we may want to +# incorporate the script contents within a cygwin/mingw +# wrapper executable. Must ONLY be called from within +# func_mode_link because it depends on a number of variables +# set therein. +# +# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR +# variable will take. If 'yes', then the emitted script +# will assume that the directory where it is stored is +# the $objdir directory. This is a cygwin/mingw-specific +# behavior. +func_emit_wrapper () +{ + func_emit_wrapper_arg1=${1-no} + + $ECHO "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM (GNU $PACKAGE) $VERSION +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='$sed_quote_subst' + +# Be Bourne compatible +if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variables: + generated_by_libtool_version='$macro_version' + notinst_deplibs='$notinst_deplibs' +else + # When we are sourced in execute mode, \$file and \$ECHO are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + file=\"\$0\"" + + func_quote_arg pretty "$ECHO" + qECHO=$func_quote_arg_result + $ECHO "\ + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + ECHO=$qECHO + fi + +# Very basic option parsing. These options are (a) specific to +# the libtool wrapper, (b) are identical between the wrapper +# /script/ and the wrapper /executable/ that is used only on +# windows platforms, and (c) all begin with the string "--lt-" +# (application programs are unlikely to have options that match +# this pattern). +# +# There are only two supported options: --lt-debug and +# --lt-dump-script. There is, deliberately, no --lt-help. +# +# The first argument to this parsing function should be the +# script's $0 value, followed by "$@". +lt_option_debug= +func_parse_lt_options () +{ + lt_script_arg0=\$0 + shift + for lt_opt + do + case \"\$lt_opt\" in + --lt-debug) lt_option_debug=1 ;; + --lt-dump-script) + lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` + test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. + lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` + cat \"\$lt_dump_D/\$lt_dump_F\" + exit 0 + ;; + --lt-*) + \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 + exit 1 + ;; + esac + done + + # Print the debug banner immediately: + if test -n \"\$lt_option_debug\"; then + echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2 + fi +} + +# Used when --lt-debug. Prints its arguments to stdout +# (redirection is the responsibility of the caller) +func_lt_dump_args () +{ + lt_dump_args_N=1; + for lt_arg + do + \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\" + lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` + done +} + +# Core function for launching the target application +func_exec_program_core () +{ +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2* | *-cegcc*) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $ECHO "\ + \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 + exit 1 +} + +# A function to encapsulate launching the target application +# Strips options in the --lt-* namespace from \$@ and +# launches target application with the remaining arguments. +func_exec_program () +{ + case \" \$* \" in + *\\ --lt-*) + for lt_wr_arg + do + case \$lt_wr_arg in + --lt-*) ;; + *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; + esac + shift + done ;; + esac + func_exec_program_core \${1+\"\$@\"} +} + + # Parse options + func_parse_lt_options \"\$0\" \${1+\"\$@\"} + + # Find the directory that this script lives in. + thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` + done + + # Usually 'no', except on cygwin/mingw when embedded into + # the cwrapper. + WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 + if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then + # special case for '.' + if test \"\$thisdir\" = \".\"; then + thisdir=\`pwd\` + fi + # remove .libs from thisdir + case \"\$thisdir\" in + *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; + $objdir ) thisdir=. ;; + esac + fi + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test yes = "$fast_install"; then + $ECHO "\ + program=lt-'$outputname'$exeext + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | $SED 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $MKDIR \"\$progdir\" + else + $RM \"\$progdir/\$file\" + fi" + + $ECHO "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if relink_command_output=\`eval \$relink_command 2>&1\`; then : + else + \$ECHO \"\$relink_command_output\" >&2 + $RM \"\$progdir/\$file\" + exit 1 + fi + fi + + $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $RM \"\$progdir/\$program\"; + $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $RM \"\$progdir/\$file\" + fi" + else + $ECHO "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $ECHO "\ + + if test -f \"\$progdir/\$program\"; then" + + # fixup the dll searchpath if we need to. + # + # Fix the DLL searchpath if we need to. Do this before prepending + # to shlibpath, because on Windows, both are PATH and uninstalled + # libraries must come first. + if test -n "$dllsearchpath"; then + $ECHO "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + # Export our shlibpath_var if we have one. + if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $ECHO "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` + + export $shlibpath_var +" + fi + + $ECHO "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. + func_exec_program \${1+\"\$@\"} + fi + else + # The program doesn't exist. + \$ECHO \"\$0: error: '\$progdir/\$program' does not exist\" 1>&2 + \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 + \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 + exit 1 + fi +fi\ +" +} + + +# func_emit_cwrapperexe_src +# emit the source code for a wrapper executable on stdout +# Must ONLY be called from within func_mode_link because +# it depends on a number of variable set therein. +func_emit_cwrapperexe_src () +{ + cat < +#include +#ifdef _MSC_VER +# include +# include +# include +#else +# include +# include +# ifdef __CYGWIN__ +# include +# endif +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) + +/* declarations of non-ANSI functions */ +#if defined __MINGW32__ +# ifdef __STRICT_ANSI__ +int _putenv (const char *); +# endif +#elif defined __CYGWIN__ +# ifdef __STRICT_ANSI__ +char *realpath (const char *, char *); +int putenv (char *); +int setenv (const char *, const char *, int); +# endif +/* #elif defined other_platform || defined ... */ +#endif + +/* portability defines, excluding path handling macros */ +#if defined _MSC_VER +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +# define S_IXUSR _S_IEXEC +#elif defined __MINGW32__ +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +#elif defined __CYGWIN__ +# define HAVE_SETENV +# define FOPEN_WB "wb" +/* #elif defined other platforms ... */ +#endif + +#if defined PATH_MAX +# define LT_PATHMAX PATH_MAX +#elif defined MAXPATHLEN +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef S_IXOTH +# define S_IXOTH 0 +#endif +#ifndef S_IXGRP +# define S_IXGRP 0 +#endif + +/* path handling portability macros */ +#ifndef DIR_SEPARATOR +# define DIR_SEPARATOR '/' +# define PATH_SEPARATOR ':' +#endif + +#if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \ + defined __OS2__ +# define HAVE_DOS_BASED_FILE_SYSTEM +# define FOPEN_WB "wb" +# ifndef DIR_SEPARATOR_2 +# define DIR_SEPARATOR_2 '\\' +# endif +# ifndef PATH_SEPARATOR_2 +# define PATH_SEPARATOR_2 ';' +# endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#ifndef PATH_SEPARATOR_2 +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) +#else /* PATH_SEPARATOR_2 */ +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) +#endif /* PATH_SEPARATOR_2 */ + +#ifndef FOPEN_WB +# define FOPEN_WB "w" +#endif +#ifndef _O_BINARY +# define _O_BINARY 0 +#endif + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free (stale); stale = 0; } \ +} while (0) + +#if defined LT_DEBUGWRAPPER +static int lt_debug = 1; +#else +static int lt_debug = 0; +#endif + +const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ + +void *xmalloc (size_t num); +char *xstrdup (const char *string); +const char *base_name (const char *name); +char *find_executable (const char *wrapper); +char *chase_symlinks (const char *pathspec); +int make_executable (const char *path); +int check_executable (const char *path); +char *strendzap (char *str, const char *pat); +void lt_debugprintf (const char *file, int line, const char *fmt, ...); +void lt_fatal (const char *file, int line, const char *message, ...); +static const char *nonnull (const char *s); +static const char *nonempty (const char *s); +void lt_setenv (const char *name, const char *value); +char *lt_extend_str (const char *orig_value, const char *add, int to_end); +void lt_update_exe_path (const char *name, const char *value); +void lt_update_lib_path (const char *name, const char *value); +char **prepare_spawn (char **argv); +void lt_dump_script (FILE *f); +EOF + + cat <= 0) + && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) + return 1; + else + return 0; +} + +int +make_executable (const char *path) +{ + int rval = 0; + struct stat st; + + lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", + nonempty (path)); + if ((!path) || (!*path)) + return 0; + + if (stat (path, &st) >= 0) + { + rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); + } + return rval; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise + Does not chase symlinks, even on platforms that support them. +*/ +char * +find_executable (const char *wrapper) +{ + int has_slash = 0; + const char *p; + const char *p_next; + /* static buffer for getcwd */ + char tmp[LT_PATHMAX + 1]; + size_t tmp_len; + char *concat_name; + + lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", + nonempty (wrapper)); + + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; + + /* Absolute path? */ +#if defined HAVE_DOS_BASED_FILE_SYSTEM + if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + else + { +#endif + if (IS_DIR_SEPARATOR (wrapper[0])) + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } +#if defined HAVE_DOS_BASED_FILE_SYSTEM + } +#endif + + for (p = wrapper; *p; p++) + if (*p == '/') + { + has_slash = 1; + break; + } + if (!has_slash) + { + /* no slashes; search PATH */ + const char *path = getenv ("PATH"); + if (path != NULL) + { + for (p = path; *p; p = p_next) + { + const char *q; + size_t p_len; + for (q = p; *q; q++) + if (IS_PATH_SEPARATOR (*q)) + break; + p_len = (size_t) (q - p); + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = + XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + } + else + { + concat_name = + XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, p, p_len); + concat_name[p_len] = '/'; + strcpy (concat_name + p_len + 1, wrapper); + } + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + } + /* not found in PATH; assume curdir */ + } + /* Relative path | not found in path: prepend cwd */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + return NULL; +} + +char * +chase_symlinks (const char *pathspec) +{ +#ifndef S_ISLNK + return xstrdup (pathspec); +#else + char buf[LT_PATHMAX]; + struct stat s; + char *tmp_pathspec = xstrdup (pathspec); + char *p; + int has_symlinks = 0; + while (strlen (tmp_pathspec) && !has_symlinks) + { + lt_debugprintf (__FILE__, __LINE__, + "checking path component for symlinks: %s\n", + tmp_pathspec); + if (lstat (tmp_pathspec, &s) == 0) + { + if (S_ISLNK (s.st_mode) != 0) + { + has_symlinks = 1; + break; + } + + /* search backwards for last DIR_SEPARATOR */ + p = tmp_pathspec + strlen (tmp_pathspec) - 1; + while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + p--; + if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + { + /* no more DIR_SEPARATORS left */ + break; + } + *p = '\0'; + } + else + { + lt_fatal (__FILE__, __LINE__, + "error accessing file \"%s\": %s", + tmp_pathspec, nonnull (strerror (errno))); + } + } + XFREE (tmp_pathspec); + + if (!has_symlinks) + { + return xstrdup (pathspec); + } + + tmp_pathspec = realpath (pathspec, buf); + if (tmp_pathspec == 0) + { + lt_fatal (__FILE__, __LINE__, + "could not follow symlinks for %s", pathspec); + } + return xstrdup (tmp_pathspec); +#endif +} + +char * +strendzap (char *str, const char *pat) +{ + size_t len, patlen; + + assert (str != NULL); + assert (pat != NULL); + + len = strlen (str); + patlen = strlen (pat); + + if (patlen <= len) + { + str += len - patlen; + if (STREQ (str, pat)) + *str = '\0'; + } + return str; +} + +void +lt_debugprintf (const char *file, int line, const char *fmt, ...) +{ + va_list args; + if (lt_debug) + { + (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); + va_start (args, fmt); + (void) vfprintf (stderr, fmt, args); + va_end (args); + } +} + +static void +lt_error_core (int exit_status, const char *file, + int line, const char *mode, + const char *message, va_list ap) +{ + fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *file, int line, const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); + va_end (ap); +} + +static const char * +nonnull (const char *s) +{ + return s ? s : "(null)"; +} + +static const char * +nonempty (const char *s) +{ + return (s && !*s) ? "(empty)" : nonnull (s); +} + +void +lt_setenv (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_setenv) setting '%s' to '%s'\n", + nonnull (name), nonnull (value)); + { +#ifdef HAVE_SETENV + /* always make a copy, for consistency with !HAVE_SETENV */ + char *str = xstrdup (value); + setenv (name, str, 1); +#else + size_t len = strlen (name) + 1 + strlen (value) + 1; + char *str = XMALLOC (char, len); + sprintf (str, "%s=%s", name, value); + if (putenv (str) != EXIT_SUCCESS) + { + XFREE (str); + } +#endif + } +} + +char * +lt_extend_str (const char *orig_value, const char *add, int to_end) +{ + char *new_value; + if (orig_value && *orig_value) + { + size_t orig_value_len = strlen (orig_value); + size_t add_len = strlen (add); + new_value = XMALLOC (char, add_len + orig_value_len + 1); + if (to_end) + { + strcpy (new_value, orig_value); + strcpy (new_value + orig_value_len, add); + } + else + { + strcpy (new_value, add); + strcpy (new_value + add_len, orig_value); + } + } + else + { + new_value = xstrdup (add); + } + return new_value; +} + +void +lt_update_exe_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + /* some systems can't cope with a ':'-terminated path #' */ + size_t len = strlen (new_value); + while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1])) + { + new_value[--len] = '\0'; + } + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +void +lt_update_lib_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +EOF + case $host_os in + mingw*) + cat <<"EOF" + +/* Prepares an argument vector before calling spawn(). + Note that spawn() does not by itself call the command interpreter + (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : + ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&v); + v.dwPlatformId == VER_PLATFORM_WIN32_NT; + }) ? "cmd.exe" : "command.com"). + Instead it simply concatenates the arguments, separated by ' ', and calls + CreateProcess(). We must quote the arguments since Win32 CreateProcess() + interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a + special way: + - Space and tab are interpreted as delimiters. They are not treated as + delimiters if they are surrounded by double quotes: "...". + - Unescaped double quotes are removed from the input. Their only effect is + that within double quotes, space and tab are treated like normal + characters. + - Backslashes not followed by double quotes are not special. + - But 2*n+1 backslashes followed by a double quote become + n backslashes followed by a double quote (n >= 0): + \" -> " + \\\" -> \" + \\\\\" -> \\" + */ +#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +char ** +prepare_spawn (char **argv) +{ + size_t argc; + char **new_argv; + size_t i; + + /* Count number of arguments. */ + for (argc = 0; argv[argc] != NULL; argc++) + ; + + /* Allocate new argument vector. */ + new_argv = XMALLOC (char *, argc + 1); + + /* Put quoted arguments into the new argument vector. */ + for (i = 0; i < argc; i++) + { + const char *string = argv[i]; + + if (string[0] == '\0') + new_argv[i] = xstrdup ("\"\""); + else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) + { + int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); + size_t length; + unsigned int backslashes; + const char *s; + char *quoted_string; + char *p; + + length = 0; + backslashes = 0; + if (quote_around) + length++; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + length += backslashes + 1; + length++; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + length += backslashes + 1; + + quoted_string = XMALLOC (char, length + 1); + + p = quoted_string; + backslashes = 0; + if (quote_around) + *p++ = '"'; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + { + unsigned int j; + for (j = backslashes + 1; j > 0; j--) + *p++ = '\\'; + } + *p++ = c; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + { + unsigned int j; + for (j = backslashes; j > 0; j--) + *p++ = '\\'; + *p++ = '"'; + } + *p = '\0'; + + new_argv[i] = quoted_string; + } + else + new_argv[i] = (char *) string; + } + new_argv[argc] = NULL; + + return new_argv; +} +EOF + ;; + esac + + cat <<"EOF" +void lt_dump_script (FILE* f) +{ +EOF + func_emit_wrapper yes | + $SED -n -e ' +s/^\(.\{79\}\)\(..*\)/\1\ +\2/ +h +s/\([\\"]\)/\\\1/g +s/$/\\n/ +s/\([^\n]*\).*/ fputs ("\1", f);/p +g +D' + cat <<"EOF" +} +EOF +} +# end: func_emit_cwrapperexe_src + +# func_win32_import_lib_p ARG +# True if ARG is an import lib, as indicated by $file_magic_cmd +func_win32_import_lib_p () +{ + $debug_cmd + + case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in + *import*) : ;; + *) false ;; + esac +} + +# func_suncc_cstd_abi +# !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!! +# Several compiler flags select an ABI that is incompatible with the +# Cstd library. Avoid specifying it if any are in CXXFLAGS. +func_suncc_cstd_abi () +{ + $debug_cmd + + case " $compile_command " in + *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*) + suncc_use_cstd_abi=no + ;; + *) + suncc_use_cstd_abi=yes + ;; + esac +} + +# func_mode_link arg... +func_mode_link () +{ + $debug_cmd + + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + # It is impossible to link a dll without this setting, and + # we shouldn't force the makefile maintainer to figure out + # what system we are compiling for in order to pass an extra + # flag for every libtool invocation. + # allow_undefined=no + + # FIXME: Unfortunately, there are problems with the above when trying + # to make a dll that has undefined symbols, in which case not + # even a static library is built. For now, we need to specify + # -no-undefined on the libtool link line when we can be certain + # that all symbols are satisfied, otherwise we get a static library. + allow_undefined=yes + ;; + *) + allow_undefined=yes + ;; + esac + libtool_args=$nonopt + base_compile="$nonopt $@" + compile_command=$nonopt + finalize_command=$nonopt + + compile_rpath= + finalize_rpath= + compile_shlibpath= + finalize_shlibpath= + convenience= + old_convenience= + deplibs= + old_deplibs= + compiler_flags= + linker_flags= + dllsearchpath= + lib_search_path=`pwd` + inst_prefix_dir= + new_inherited_linker_flags= + + avoid_version=no + bindir= + dlfiles= + dlprefiles= + dlself=no + export_dynamic=no + export_symbols= + export_symbols_regex= + generated= + libobjs= + ltlibs= + module=no + no_install=no + objs= + os2dllname= + non_pic_objects= + precious_files_regex= + prefer_static_libs=no + preload=false + prev= + prevarg= + release= + rpath= + xrpath= + perm_rpath= + temp_rpath= + thread_safe=no + vinfo= + vinfo_number=no + weak_libs= + single_module=$wl-single_module + func_infer_tag $base_compile + + # We need to know -static, to get the right output filenames. + for arg + do + case $arg in + -shared) + test yes != "$build_libtool_libs" \ + && func_fatal_configuration "cannot build a shared library" + build_old_libs=no + break + ;; + -all-static | -static | -static-libtool-libs) + case $arg in + -all-static) + if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then + func_warning "complete static linking is impossible in this configuration" + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + -static) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=built + ;; + -static-libtool-libs) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + esac + build_libtool_libs=no + build_old_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test "$#" -gt 0; do + arg=$1 + shift + func_quote_arg pretty,unquoted "$arg" + qarg=$func_quote_arg_unquoted_result + func_append libtool_args " $func_quote_arg_result" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + func_append compile_command " @OUTPUT@" + func_append finalize_command " @OUTPUT@" + ;; + esac + + case $prev in + bindir) + bindir=$arg + prev= + continue + ;; + dlfiles|dlprefiles) + $preload || { + # Add the symbol object into the linking commands. + func_append compile_command " @SYMFILE@" + func_append finalize_command " @SYMFILE@" + preload=: + } + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test no = "$dlself"; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test dlprefiles = "$prev"; then + dlself=yes + elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test dlfiles = "$prev"; then + func_append dlfiles " $arg" + else + func_append dlprefiles " $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols=$arg + test -f "$arg" \ + || func_fatal_error "symbol file '$arg' does not exist" + prev= + continue + ;; + expsyms_regex) + export_symbols_regex=$arg + prev= + continue + ;; + framework) + case $host in + *-*-darwin*) + case "$deplibs " in + *" $qarg.ltframework "*) ;; + *) func_append deplibs " $qarg.ltframework" # this is fixed later + ;; + esac + ;; + esac + prev= + continue + ;; + inst_prefix) + inst_prefix_dir=$arg + prev= + continue + ;; + mllvm) + # Clang does not use LLVM to link, so we can simply discard any + # '-mllvm $arg' options when doing the link step. + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat "$save_arg"` + do +# func_append moreargs " $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test none = "$pic_object" && + test none = "$non_pic_object"; then + func_fatal_error "cannot find name of object for '$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + if test none != "$pic_object"; then + # Prepend the subdirectory the object is found in. + pic_object=$xdir$pic_object + + if test dlfiles = "$prev"; then + if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test dlprefiles = "$prev"; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg=$pic_object + fi + + # Non-PIC object. + if test none != "$non_pic_object"; then + # Prepend the subdirectory the object is found in. + non_pic_object=$xdir$non_pic_object + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test none = "$pic_object"; then + arg=$non_pic_object + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object=$pic_object + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "'$arg' is not a valid libtool object" + fi + fi + done + else + func_fatal_error "link input file '$arg' does not exist" + fi + arg=$save_arg + prev= + continue + ;; + os2dllname) + os2dllname=$arg + prev= + continue + ;; + precious_regex) + precious_files_regex=$arg + prev= + continue + ;; + release) + release=-$arg + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + if test rpath = "$prev"; then + case "$rpath " in + *" $arg "*) ;; + *) func_append rpath " $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) func_append xrpath " $arg" ;; + esac + fi + prev= + continue + ;; + shrext) + shrext_cmds=$arg + prev= + continue + ;; + weak) + func_append weak_libs " $arg" + prev= + continue + ;; + xcclinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xcompiler) + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xlinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $wl$qarg" + prev= + func_append compile_command " $wl$qarg" + func_append finalize_command " $wl$qarg" + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi # test -n "$prev" + + prevarg=$arg + + case $arg in + -all-static) + if test -n "$link_static_flag"; then + # See comment for -static flag below, for more details. + func_append compile_command " $link_static_flag" + func_append finalize_command " $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + func_fatal_error "'-allow-undefined' must not be used because it is the default" + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -bindir) + prev=bindir + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + func_fatal_error "more than one -exported-symbols argument is not allowed" + fi + if test X-export-symbols = "X$arg"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework) + prev=framework + continue + ;; + + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* + # so, if we see these flags be careful not to treat them like -L + -L[A-Z][A-Z]*:*) + case $with_gcc/$host in + no/*-*-irix* | /*-*-irix*) + func_append compile_command " $arg" + func_append finalize_command " $arg" + ;; + esac + continue + ;; + + -L*) + func_stripname "-L" '' "$arg" + if test -z "$func_stripname_result"; then + if test "$#" -gt 0; then + func_fatal_error "require no space between '-L' and '$1'" + else + func_fatal_error "need path for '-L' option" + fi + fi + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + test -z "$absdir" && \ + func_fatal_error "cannot determine absolute directory name of '$dir'" + dir=$absdir + ;; + esac + case "$deplibs " in + *" -L$dir "* | *" $arg "*) + # Will only happen for absolute or sysroot arguments + ;; + *) + # Preserve sysroot, but never include relative directories + case $dir in + [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; + *) func_append deplibs " -L$dir" ;; + esac + func_append lib_search_path " $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + ::) dllsearchpath=$dir;; + *) func_append dllsearchpath ":$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test X-lc = "X$arg" || test X-lm = "X$arg"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-os2*) + # These systems don't actually have a C library (as such) + test X-lc = "X$arg" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) + # Do not include libc due to us having libc/libc_r. + test X-lc = "X$arg" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + func_append deplibs " System.ltframework" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test X-lc = "X$arg" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test X-lc = "X$arg" && continue + ;; + esac + elif test X-lc_r = "X$arg"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + func_append deplibs " $arg" + continue + ;; + + -mllvm) + prev=mllvm + continue + ;; + + -module) + module=yes + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + # Darwin uses the -arch flag to determine output architecture. + -model|-arch|-isysroot|--sysroot) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case "$new_inherited_linker_flags " in + *" $arg "*) ;; + * ) func_append new_inherited_linker_flags " $arg" ;; + esac + continue + ;; + + -multi_module) + single_module=$wl-multi_module + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) + # The PATH hackery in wrapper scripts is required on Windows + # and Darwin in order for the loader to find any dlls it needs. + func_warning "'-no-install' is ignored for $host" + func_warning "assuming '-no-fast-install' instead" + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -os2dllname) + prev=os2dllname + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + func_stripname '-R' '' "$arg" + dir=$func_stripname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + =*) + func_stripname '=' '' "$dir" + dir=$lt_sysroot$func_stripname_result + ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + continue + ;; + + -shared) + # The effects of -shared are defined in a previous loop. + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -static | -static-libtool-libs) + # The effects of -static are defined in a previous loop. + # We used to do the same as -all-static on platforms that + # didn't have a PIC flag, but the assumption that the effects + # would be equivalent was wrong. It would break on at least + # Digital Unix and AIX. + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + + -version-number) + prev=vinfo + vinfo_number=yes + continue + ;; + + -weak) + prev=weak + continue + ;; + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs=$IFS; IFS=, + for flag in $args; do + IFS=$save_ifs + func_quote_arg pretty "$flag" + func_append arg " $func_quote_arg_result" + func_append compiler_flags " $func_quote_arg_result" + done + IFS=$save_ifs + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Wl,*) + func_stripname '-Wl,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs=$IFS; IFS=, + for flag in $args; do + IFS=$save_ifs + func_quote_arg pretty "$flag" + func_append arg " $wl$func_quote_arg_result" + func_append compiler_flags " $wl$func_quote_arg_result" + func_append linker_flags " $func_quote_arg_result" + done + IFS=$save_ifs + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # -msg_* for osf cc + -msg_*) + func_quote_arg pretty "$arg" + arg=$func_quote_arg_result + ;; + + # Flags to be passed through unchanged, with rationale: + # -64, -mips[0-9] enable 64-bit mode for the SGI compiler + # -r[0-9][0-9]* specify processor for the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler + # +DA*, +DD* enable 64-bit mode for the HP compiler + # -q* compiler args for the IBM compiler + # -m*, -t[45]*, -txscale* architecture-specific flags for GCC + # -F/path path to uninstalled frameworks, gcc on darwin + # -p, -pg, --coverage, -fprofile-* profiling flags for GCC + # -fstack-protector* stack protector flags for GCC + # @file GCC response files + # -tp=* Portland pgcc target processor selection + # --sysroot=* for sysroot support + # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization + # -specs=* GCC specs files + # -stdlib=* select c++ std lib with clang + # -fsanitize=* Clang/GCC memory and address sanitizer + # -fuse-ld=* Linker select flags for GCC + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ + -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*| \ + -specs=*|-fsanitize=*|-fuse-ld=*) + func_quote_arg pretty "$arg" + arg=$func_quote_arg_result + func_append compile_command " $arg" + func_append finalize_command " $arg" + func_append compiler_flags " $arg" + continue + ;; + + -Z*) + if test os2 = "`expr $host : '.*\(os2\)'`"; then + # OS/2 uses -Zxxx to specify OS/2-specific options + compiler_flags="$compiler_flags $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case $arg in + -Zlinker | -Zstack) + prev=xcompiler + ;; + esac + continue + else + # Otherwise treat like 'Some other compiler flag' below + func_quote_arg pretty "$arg" + arg=$func_quote_arg_result + fi + ;; + + # Some other compiler flag. + -* | +*) + func_quote_arg pretty "$arg" + arg=$func_quote_arg_result + ;; + + *.$objext) + # A standard object. + func_append objs " $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test none = "$pic_object" && + test none = "$non_pic_object"; then + func_fatal_error "cannot find name of object for '$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + test none = "$pic_object" || { + # Prepend the subdirectory the object is found in. + pic_object=$xdir$pic_object + + if test dlfiles = "$prev"; then + if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test dlprefiles = "$prev"; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg=$pic_object + } + + # Non-PIC object. + if test none != "$non_pic_object"; then + # Prepend the subdirectory the object is found in. + non_pic_object=$xdir$non_pic_object + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test none = "$pic_object"; then + arg=$non_pic_object + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object=$pic_object + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "'$arg' is not a valid libtool object" + fi + fi + ;; + + *.$libext) + # An archive. + func_append deplibs " $arg" + func_append old_deplibs " $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + func_resolve_sysroot "$arg" + if test dlfiles = "$prev"; then + # This library was specified with -dlopen. + func_append dlfiles " $func_resolve_sysroot_result" + prev= + elif test dlprefiles = "$prev"; then + # The library was specified with -dlpreopen. + func_append dlprefiles " $func_resolve_sysroot_result" + prev= + else + func_append deplibs " $func_resolve_sysroot_result" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + func_quote_arg pretty "$arg" + arg=$func_quote_arg_result + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + done # argument parsing loop + + test -n "$prev" && \ + func_fatal_help "the '$prevarg' option requires an argument" + + if test yes = "$export_dynamic" && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + func_basename "$output" + outputname=$func_basename_result + libobjs_save=$libobjs + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$ECHO \"\$$shlibpath_var\" \| \$SED \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + # Definition is injected by LT_CONFIG during libtool generation. + func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH" + + func_dirname "$output" "/" "" + output_objdir=$func_dirname_result$objdir + func_to_tool_file "$output_objdir/" + tool_output_objdir=$func_to_tool_file_result + # Create the object directory. + func_mkdir_p "$output_objdir" + + # Determine the type of output + case $output in + "") + func_fatal_help "you must specify an output file" + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + specialdeplibs= + + libs= + # Find all interdependent deplibs by searching for libraries + # that are linked more than once (e.g. -la -lb -la) + for deplib in $deplibs; do + if $opt_preserve_dup_deps; then + case "$libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append libs " $deplib" + done + + if test lib = "$linkmode"; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if $opt_duplicate_compiler_generated_deps; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; + esac + func_append pre_post_deps " $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + notinst_path= # paths that contain not-installed libtool libraries + + case $linkmode in + lib) + passes="conv dlpreopen link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + func_fatal_help "libraries can '-dlopen' only libtool libraries: $file" + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=false + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + + for pass in $passes; do + # The preopen pass in lib mode reverses $deplibs; put it back here + # so that -L comes before libs that need it for instance... + if test lib,link = "$linkmode,$pass"; then + ## FIXME: Find the place where the list is rebuilt in the wrong + ## order, and fix it there properly + tmp_deplibs= + for deplib in $deplibs; do + tmp_deplibs="$deplib $tmp_deplibs" + done + deplibs=$tmp_deplibs + fi + + if test lib,link = "$linkmode,$pass" || + test prog,scan = "$linkmode,$pass"; then + libs=$deplibs + deplibs= + fi + if test prog = "$linkmode"; then + case $pass in + dlopen) libs=$dlfiles ;; + dlpreopen) libs=$dlprefiles ;; + link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; + esac + fi + if test lib,dlpreopen = "$linkmode,$pass"; then + # Collect and forward deplibs of preopened libtool libs + for lib in $dlprefiles; do + # Ignore non-libtool-libs + dependency_libs= + func_resolve_sysroot "$lib" + case $lib in + *.la) func_source "$func_resolve_sysroot_result" ;; + esac + + # Collect preopened libtool deplibs, except any this library + # has declared as weak libs + for deplib in $dependency_libs; do + func_basename "$deplib" + deplib_base=$func_basename_result + case " $weak_libs " in + *" $deplib_base "*) ;; + *) func_append deplibs " $deplib" ;; + esac + done + done + libs=$dlprefiles + fi + if test dlopen = "$pass"; then + # Collect dlpreopened libraries + save_deplibs=$deplibs + deplibs= + fi + + for deplib in $libs; do + lib= + found=false + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append compiler_flags " $deplib" + if test lib = "$linkmode"; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -l*) + if test lib != "$linkmode" && test prog != "$linkmode"; then + func_warning "'-l' is ignored for archives/objects" + continue + fi + func_stripname '-l' '' "$deplib" + name=$func_stripname_result + if test lib = "$linkmode"; then + searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" + else + searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" + fi + for searchdir in $searchdirs; do + for search_ext in .la $std_shrext .so .a; do + # Search the libtool library + lib=$searchdir/lib$name$search_ext + if test -f "$lib"; then + if test .la = "$search_ext"; then + found=: + else + found=false + fi + break 2 + fi + done + done + if $found; then + # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + case " $predeps $postdeps " in + *" $deplib "*) + if func_lalib_p "$lib"; then + library_names= + old_library= + func_source "$lib" + for l in $old_library $library_names; do + ll=$l + done + if test "X$ll" = "X$old_library"; then # only static version available + found=false + func_dirname "$lib" "" "." + ladir=$func_dirname_result + lib=$ladir/$old_library + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + else + # deplib doesn't seem to be a libtool library + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + ;; # -l + *.ltframework) + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + if test lib = "$linkmode"; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test conv = "$pass" && continue + newdependency_libs="$deplib $newdependency_libs" + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + prog) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + continue + fi + if test scan = "$pass"; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + *) + func_warning "'-L' is ignored for archives/objects" + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test link = "$pass"; then + func_stripname '-R' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) + func_resolve_sysroot "$deplib" + lib=$func_resolve_sysroot_result + ;; + *.$libext) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + # Linking convenience modules into shared libraries is allowed, + # but linking other static libraries is non-portable. + case " $dlpreconveniencelibs " in + *" $deplib "*) ;; + *) + valid_a_lib=false + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=: + fi + ;; + pass_all) + valid_a_lib=: + ;; + esac + if $valid_a_lib; then + echo + $ECHO "*** Warning: Linking the shared library $output against the" + $ECHO "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + else + echo + $ECHO "*** Warning: Trying to link with static lib archive $deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because the file extensions .$libext of this argument makes me believe" + echo "*** that it is just a static archive that I should not use here." + fi + ;; + esac + continue + ;; + prog) + if test link != "$pass"; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + elif test prog = "$linkmode"; then + if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + func_append newdlprefiles " $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append newdlfiles " $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=: + continue + ;; + esac # case $deplib + + $found || test -f "$lib" \ + || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'" + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$lib" \ + || func_fatal_error "'$lib' is not a valid libtool archive" + + func_dirname "$lib" "" "." + ladir=$func_dirname_result + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + inherited_linker_flags= + # If the library was installed with an old release of libtool, + # it will not redefine variables installed, or shouldnotlink + installed=yes + shouldnotlink=no + avoidtemprpath= + + + # Read the .la file + func_source "$lib" + + # Convert "-framework foo" to "foo.ltframework" + if test -n "$inherited_linker_flags"; then + tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` + for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do + case " $new_inherited_linker_flags " in + *" $tmp_inherited_linker_flag "*) ;; + *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; + esac + done + fi + dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + if test lib,link = "$linkmode,$pass" || + test prog,scan = "$linkmode,$pass" || + { test prog != "$linkmode" && test lib != "$linkmode"; }; then + test -n "$dlopen" && func_append dlfiles " $dlopen" + test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" + fi + + if test conv = "$pass"; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + func_fatal_error "cannot find name of link library for '$lib'" + fi + # It is a libtool convenience library, so add in its objects. + func_append convenience " $ladir/$objdir/$old_library" + func_append old_convenience " $ladir/$objdir/$old_library" + elif test prog != "$linkmode" && test lib != "$linkmode"; then + func_fatal_error "'$lib' is not a convenience library" + fi + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + if test -n "$old_library" && + { test yes = "$prefer_static_libs" || + test built,no = "$prefer_static_libs,$installed"; }; then + linklib=$old_library + else + for l in $old_library $library_names; do + linklib=$l + done + fi + if test -z "$linklib"; then + func_fatal_error "cannot find name of link library for '$lib'" + fi + + # This library was specified with -dlopen. + if test dlopen = "$pass"; then + test -z "$libdir" \ + && func_fatal_error "cannot -dlopen a convenience library: '$lib'" + if test -z "$dlname" || + test yes != "$dlopen_support" || + test no = "$build_libtool_libs" + then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + func_append dlprefiles " $lib $dependency_libs" + else + func_append newdlfiles " $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir=$ladir ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + func_warning "cannot determine absolute directory name of '$ladir'" + func_warning "passing it literally to the linker, although it might fail" + abs_ladir=$ladir + fi + ;; + esac + func_basename "$lib" + laname=$func_basename_result + + # Find the relevant object directory and library name. + if test yes = "$installed"; then + if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + func_warning "library '$lib' was moved." + dir=$ladir + absdir=$abs_ladir + libdir=$abs_ladir + else + dir=$lt_sysroot$libdir + absdir=$lt_sysroot$libdir + fi + test yes = "$hardcode_automatic" && avoidtemprpath=yes + else + if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then + dir=$ladir + absdir=$abs_ladir + # Remove this search path later + func_append notinst_path " $abs_ladir" + else + dir=$ladir/$objdir + absdir=$abs_ladir/$objdir + # Remove this search path later + func_append notinst_path " $abs_ladir" + fi + fi # $installed = yes + func_stripname 'lib' '.la' "$laname" + name=$func_stripname_result + + # This library was specified with -dlpreopen. + if test dlpreopen = "$pass"; then + if test -z "$libdir" && test prog = "$linkmode"; then + func_fatal_error "only libraries may -dlpreopen a convenience library: '$lib'" + fi + case $host in + # special handling for platforms with PE-DLLs. + *cygwin* | *mingw* | *cegcc* ) + # Linker will automatically link against shared library if both + # static and shared are present. Therefore, ensure we extract + # symbols from the import library if a shared library is present + # (otherwise, the dlopen module name will be incorrect). We do + # this by putting the import library name into $newdlprefiles. + # We recover the dlopen module name by 'saving' the la file + # name in a special purpose variable, and (later) extracting the + # dlname from the la file. + if test -n "$dlname"; then + func_tr_sh "$dir/$linklib" + eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" + func_append newdlprefiles " $dir/$linklib" + else + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + fi + ;; + * ) + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + func_append newdlprefiles " $dir/$dlname" + else + func_append newdlprefiles " $dir/$linklib" + fi + ;; + esac + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test lib = "$linkmode"; then + deplibs="$dir/$old_library $deplibs" + elif test prog,link = "$linkmode,$pass"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test prog = "$linkmode" && test link != "$pass"; then + func_append newlib_search_path " $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=false + if test no != "$link_all_deplibs" || test -z "$library_names" || + test no = "$build_libtool_libs"; then + linkalldeplibs=: + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + esac + # Need to link against all dependency_libs? + if $linkalldeplibs; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test prog,link = "$linkmode,$pass"; then + if test -n "$library_names" && + { { test no = "$prefer_static_libs" || + test built,yes = "$prefer_static_libs,$installed"; } || + test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var" && test -z "$avoidtemprpath"; then + # Make sure the rpath contains only unique directories. + case $temp_rpath: in + *"$absdir:"*) ;; + *) func_append temp_rpath "$absdir:" ;; + esac + fi + + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if $alldeplibs && + { test pass_all = "$deplibs_check_method" || + { test yes = "$build_libtool_libs" && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + fi + + link_static=no # Whether the deplib will be linked statically + use_static_libs=$prefer_static_libs + if test built = "$use_static_libs" && test yes = "$installed"; then + use_static_libs=no + fi + if test -n "$library_names" && + { test no = "$use_static_libs" || test -z "$old_library"; }; then + case $host in + *cygwin* | *mingw* | *cegcc* | *os2*) + # No point in relinking DLLs because paths are not encoded + func_append notinst_deplibs " $lib" + need_relink=no + ;; + *) + if test no = "$installed"; then + func_append notinst_deplibs " $lib" + need_relink=yes + fi + ;; + esac + # This is a shared library + + # Warn about portability, can't link against -module's on some + # systems (darwin). Don't bleat about dlopened modules though! + dlopenmodule= + for dlpremoduletest in $dlprefiles; do + if test "X$dlpremoduletest" = "X$lib"; then + dlopenmodule=$dlpremoduletest + break + fi + done + if test -z "$dlopenmodule" && test yes = "$shouldnotlink" && test link = "$pass"; then + echo + if test prog = "$linkmode"; then + $ECHO "*** Warning: Linking the executable $output against the loadable module" + else + $ECHO "*** Warning: Linking the shared library $output against the loadable module" + fi + $ECHO "*** $linklib is not portable!" + fi + if test lib = "$linkmode" && + test yes = "$hardcode_into_libs"; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + shift + realname=$1 + shift + libname=`eval "\\$ECHO \"$libname_spec\""` + # use dlname if we got it. it's perfectly good, no? + if test -n "$dlname"; then + soname=$dlname + elif test -n "$soname_spec"; then + # bleh windows + case $host in + *cygwin* | mingw* | *cegcc* | *os2*) + func_arith $current - $age + major=$func_arith_result + versuffix=-$major + ;; + esac + eval soname=\"$soname_spec\" + else + soname=$realname + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot=$soname + func_basename "$soroot" + soname=$func_basename_result + func_stripname 'lib' '.dll' "$soname" + newlib=libimp-$func_stripname_result.a + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + func_verbose "extracting exported symbol list from '$soname'" + func_execute_cmds "$extract_expsyms_cmds" 'exit $?' + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + func_verbose "generating import library for '$soname'" + func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' + fi + # make sure the library variables are pointing to the new library + dir=$output_objdir + linklib=$newlib + fi # test -n "$old_archive_from_expsyms_cmds" + + if test prog = "$linkmode" || test relink != "$opt_mode"; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test no = "$hardcode_direct"; then + add=$dir/$linklib + case $host in + *-*-sco3.2v5.0.[024]*) add_dir=-L$dir ;; + *-*-sysv4*uw2*) add_dir=-L$dir ;; + *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ + *-*-unixware7*) add_dir=-L$dir ;; + *-*-darwin* ) + # if the lib is a (non-dlopened) module then we cannot + # link against it, someone is ignoring the earlier warnings + if /usr/bin/file -L $add 2> /dev/null | + $GREP ": [^:]* bundle" >/dev/null; then + if test "X$dlopenmodule" != "X$lib"; then + $ECHO "*** Warning: lib $linklib is a module, not a shared library" + if test -z "$old_library"; then + echo + echo "*** And there doesn't seem to be a static archive available" + echo "*** The link will probably fail, sorry" + else + add=$dir/$old_library + fi + elif test -n "$old_library"; then + add=$dir/$old_library + fi + fi + esac + elif test no = "$hardcode_minus_L"; then + case $host in + *-*-sunos*) add_shlibpath=$dir ;; + esac + add_dir=-L$dir + add=-l$name + elif test no = "$hardcode_shlibpath_var"; then + add_shlibpath=$dir + add=-l$name + else + lib_linked=no + fi + ;; + relink) + if test yes = "$hardcode_direct" && + test no = "$hardcode_direct_absolute"; then + add=$dir/$linklib + elif test yes = "$hardcode_minus_L"; then + add_dir=-L$absdir + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add=-l$name + elif test yes = "$hardcode_shlibpath_var"; then + add_shlibpath=$dir + add=-l$name + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test yes != "$lib_linked"; then + func_fatal_configuration "unsupported hardcode properties" + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) func_append compile_shlibpath "$add_shlibpath:" ;; + esac + fi + if test prog = "$linkmode"; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test yes != "$hardcode_direct" && + test yes != "$hardcode_minus_L" && + test yes = "$hardcode_shlibpath_var"; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + fi + fi + fi + + if test prog = "$linkmode" || test relink = "$opt_mode"; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test yes = "$hardcode_direct" && + test no = "$hardcode_direct_absolute"; then + add=$libdir/$linklib + elif test yes = "$hardcode_minus_L"; then + add_dir=-L$libdir + add=-l$name + elif test yes = "$hardcode_shlibpath_var"; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + add=-l$name + elif test yes = "$hardcode_automatic"; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib"; then + add=$inst_prefix_dir$libdir/$linklib + else + add=$libdir/$linklib + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir=-L$libdir + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add=-l$name + fi + + if test prog = "$linkmode"; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi + fi + elif test prog = "$linkmode"; then + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test unsupported != "$hardcode_direct"; then + test -n "$old_library" && linklib=$old_library + compile_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" + else + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test yes = "$build_libtool_libs"; then + # Not a shared library + if test pass_all != "$deplibs_check_method"; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + echo + $ECHO "*** Warning: This system cannot link to static lib archive $lib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have." + if test yes = "$module"; then + echo "*** But as you try to build a module library, libtool will still create " + echo "*** a static module, that should work as long as the dlopening application" + echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using 'nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** 'nm' from GNU binutils and a full rebuild may help." + fi + if test no = "$build_old_libs"; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test lib = "$linkmode"; then + if test -n "$dependency_libs" && + { test yes != "$hardcode_into_libs" || + test yes = "$build_old_libs" || + test yes = "$link_static"; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) func_stripname '-R' '' "$libdir" + temp_xrpath=$func_stripname_result + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) func_append xrpath " $temp_xrpath";; + esac;; + *) func_append temp_deplibs " $libdir";; + esac + done + dependency_libs=$temp_deplibs + fi + + func_append newlib_search_path " $absdir" + # Link against this library + test no = "$link_static" && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result";; + *) func_resolve_sysroot "$deplib" ;; + esac + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $func_resolve_sysroot_result "*) + func_append specialdeplibs " $func_resolve_sysroot_result" ;; + esac + fi + func_append tmp_libs " $func_resolve_sysroot_result" + done + + if test no != "$link_all_deplibs"; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + path= + case $deplib in + -L*) path=$deplib ;; + *.la) + func_resolve_sysroot "$deplib" + deplib=$func_resolve_sysroot_result + func_dirname "$deplib" "" "." + dir=$func_dirname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir=$dir ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + func_warning "cannot determine absolute directory name of '$dir'" + absdir=$dir + fi + ;; + esac + if $GREP "^installed=no" $deplib > /dev/null; then + case $host in + *-*-darwin*) + depdepl= + eval deplibrary_names=`$SED -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names"; then + for tmp in $deplibrary_names; do + depdepl=$tmp + done + if test -f "$absdir/$objdir/$depdepl"; then + depdepl=$absdir/$objdir/$depdepl + darwin_install_name=`$OTOOL -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + if test -z "$darwin_install_name"; then + darwin_install_name=`$OTOOL64 -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + fi + func_append compiler_flags " $wl-dylib_file $wl$darwin_install_name:$depdepl" + func_append linker_flags " -dylib_file $darwin_install_name:$depdepl" + path= + fi + fi + ;; + *) + path=-L$absdir/$objdir + ;; + esac + else + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "'$deplib' is not a valid libtool archive" + test "$absdir" != "$libdir" && \ + func_warning "'$deplib' seems to be moved" + + path=-L$absdir + fi + ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + if test link = "$pass"; then + if test prog = "$linkmode"; then + compile_deplibs="$new_inherited_linker_flags $compile_deplibs" + finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" + else + compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + fi + fi + dependency_libs=$newdependency_libs + if test dlpreopen = "$pass"; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test dlopen != "$pass"; then + test conv = "$pass" || { + # Make sure lib_search_path contains only unique directories. + lib_search_path= + for dir in $newlib_search_path; do + case "$lib_search_path " in + *" $dir "*) ;; + *) func_append lib_search_path " $dir" ;; + esac + done + newlib_search_path= + } + + if test prog,link = "$linkmode,$pass"; then + vars="compile_deplibs finalize_deplibs" + else + vars=deplibs + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) func_append tmp_libs " $deplib" ;; + esac + ;; + *) func_append tmp_libs " $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + + # Add Sun CC postdeps if required: + test CXX = "$tagname" && { + case $host_os in + linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C++ 5.9 + func_suncc_cstd_abi + + if test no != "$suncc_use_cstd_abi"; then + func_append postdeps ' -library=Cstd -library=Crun' + fi + ;; + esac + ;; + + solaris*) + func_cc_basename "$CC" + case $func_cc_basename_result in + CC* | sunCC*) + func_suncc_cstd_abi + + if test no != "$suncc_use_cstd_abi"; then + func_append postdeps ' -library=Cstd -library=Crun' + fi + ;; + esac + ;; + esac + } + + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i= + ;; + esac + if test -n "$i"; then + func_append tmp_libs " $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test prog = "$linkmode"; then + dlfiles=$newdlfiles + fi + if test prog = "$linkmode" || test lib = "$linkmode"; then + dlprefiles=$newdlprefiles + fi + + case $linkmode in + oldlib) + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + func_warning "'-dlopen' is ignored for archives" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "'-l' and '-L' are ignored for archives" ;; + esac + + test -n "$rpath" && \ + func_warning "'-rpath' is ignored for archives" + + test -n "$xrpath" && \ + func_warning "'-R' is ignored for archives" + + test -n "$vinfo" && \ + func_warning "'-version-info/-version-number' is ignored for archives" + + test -n "$release" && \ + func_warning "'-release' is ignored for archives" + + test -n "$export_symbols$export_symbols_regex" && \ + func_warning "'-export-symbols' is ignored for archives" + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs=$output + func_append objs "$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form 'libNAME.la'. + case $outputname in + lib*) + func_stripname 'lib' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + test no = "$module" \ + && func_fatal_help "libtool library '$output' must begin with 'lib'" + + if test no != "$need_lib_prefix"; then + # Add the "lib" prefix for modules if required + func_stripname '' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + func_stripname '' '.la' "$outputname" + libname=$func_stripname_result + fi + ;; + esac + + if test -n "$objs"; then + if test pass_all != "$deplibs_check_method"; then + func_fatal_error "cannot build libtool library '$output' from non-libtool objects on this host:$objs" + else + echo + $ECHO "*** Warning: Linking the shared library $output against the non-libtool" + $ECHO "*** objects $objs is not portable!" + func_append libobjs " $objs" + fi + fi + + test no = "$dlself" \ + || func_warning "'-dlopen self' is ignored for libtool libraries" + + set dummy $rpath + shift + test 1 -lt "$#" \ + && func_warning "ignoring multiple '-rpath's for a libtool library" + + install_libdir=$1 + + oldlibs= + if test -z "$rpath"; then + if test yes = "$build_libtool_libs"; then + # Building a libtool convenience library. + # Some compilers have problems with a '.al' extension so + # convenience libraries should have the same extension an + # archive normally would. + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + test -n "$vinfo" && \ + func_warning "'-version-info/-version-number' is ignored for convenience libraries" + + test -n "$release" && \ + func_warning "'-release' is ignored for convenience libraries" + else + + # Parse the version information argument. + save_ifs=$IFS; IFS=: + set dummy $vinfo 0 0 0 + shift + IFS=$save_ifs + + test -n "$7" && \ + func_fatal_help "too many parameters to '-version-info'" + + # convert absolute version numbers to libtool ages + # this retains compatibility with .la files and attempts + # to make the code below a bit more comprehensible + + case $vinfo_number in + yes) + number_major=$1 + number_minor=$2 + number_revision=$3 + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # that has an extra 1 added just for fun + # + case $version_type in + # correct linux to gnu/linux during the next big refactor + darwin|freebsd-elf|linux|osf|windows|none) + func_arith $number_major + $number_minor + current=$func_arith_result + age=$number_minor + revision=$number_revision + ;; + freebsd-aout|qnx|sunos) + current=$number_major + revision=$number_minor + age=0 + ;; + irix|nonstopux) + func_arith $number_major + $number_minor + current=$func_arith_result + age=$number_minor + revision=$number_minor + lt_irix_increment=no + ;; + esac + ;; + no) + current=$1 + revision=$2 + age=$3 + ;; + esac + + # Check that each of the things are valid numbers. + case $current in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "CURRENT '$current' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + case $revision in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "REVISION '$revision' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + case $age in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "AGE '$age' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + if test "$age" -gt "$current"; then + func_error "AGE '$age' is greater than the current interface number '$current'" + func_fatal_error "'$vinfo' is not valid version information" + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case $version_type in + none) ;; + + darwin) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + # Darwin ld doesn't like 0 for these options... + func_arith $current + 1 + minor_current=$func_arith_result + xlcverstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + # On Darwin other compilers + case $CC in + nagfor*) + verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" + ;; + *) + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + esac + ;; + + freebsd-aout) + major=.$current + versuffix=.$current.$revision + ;; + + freebsd-elf) + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + ;; + + irix | nonstopux) + if test no = "$lt_irix_increment"; then + func_arith $current - $age + else + func_arith $current - $age + 1 + fi + major=$func_arith_result + + case $version_type in + nonstopux) verstring_prefix=nonstopux ;; + *) verstring_prefix=sgi ;; + esac + verstring=$verstring_prefix$major.$revision + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test 0 -ne "$loop"; do + func_arith $revision - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring=$verstring_prefix$major.$iface:$verstring + done + + # Before this point, $major must not contain '.'. + major=.$major + versuffix=$major.$revision + ;; + + linux) # correct to gnu/linux during the next big refactor + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + ;; + + osf) + func_arith $current - $age + major=.$func_arith_result + versuffix=.$current.$age.$revision + verstring=$current.$age.$revision + + # Add in all the interfaces that we are compatible with. + loop=$age + while test 0 -ne "$loop"; do + func_arith $current - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring=$verstring:$iface.0 + done + + # Make executables depend on our current version. + func_append verstring ":$current.0" + ;; + + qnx) + major=.$current + versuffix=.$current + ;; + + sco) + major=.$current + versuffix=.$current + ;; + + sunos) + major=.$current + versuffix=.$current.$revision + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 file systems. + func_arith $current - $age + major=$func_arith_result + versuffix=-$major + ;; + + *) + func_fatal_configuration "unknown library version type '$version_type'" + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely + verstring= + ;; + *) + verstring=0.0 + ;; + esac + if test no = "$need_version"; then + versuffix= + else + versuffix=.0.0 + fi + fi + + # Remove version info from name if versioning should be avoided + if test yes,no = "$avoid_version,$need_version"; then + major= + versuffix= + verstring= + fi + + # Check to see if the archive will have undefined symbols. + if test yes = "$allow_undefined"; then + if test unsupported = "$allow_undefined_flag"; then + if test yes = "$build_old_libs"; then + func_warning "undefined symbols not allowed in $host shared libraries; building static only" + build_libtool_libs=no + else + func_fatal_error "can't build $host shared library unless -no-undefined is specified" + fi + fi + else + # Don't allow undefined symbols. + allow_undefined_flag=$no_undefined_flag + fi + + fi + + func_generate_dlsyms "$libname" "$libname" : + func_append libobjs " $symfileobj" + test " " = "$libobjs" && libobjs= + + if test relink != "$opt_mode"; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$ECHO "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext | *.gcno) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/$libname$release.*) + if test -n "$precious_files_regex"; then + if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + func_append removelist " $p" + ;; + *) ;; + esac + done + test -n "$removelist" && \ + func_show_eval "${RM}r \$removelist" + fi + + # Now set the variables for building old libraries. + if test yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; then + func_append oldlibs " $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; $lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` + # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` + # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` + #done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do + func_replace_sysroot "$libdir" + func_append temp_xrpath " -R$func_replace_sysroot_result" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + if test yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles=$dlfiles + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) func_append dlfiles " $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles=$dlprefiles + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) func_append dlprefiles " $lib" ;; + esac + done + + if test yes = "$build_libtool_libs"; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + func_append deplibs " System.ltframework" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test yes = "$build_libtool_need_lc"; then + func_append deplibs " -lc" + fi + ;; + esac + fi + + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release= + versuffix= + major= + newdeplibs= + droppeddeps=no + case $deplibs_check_method in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behavior. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $opt_dry_run || $RM conftest.c + cat > conftest.c </dev/null` + $nocaseglob + else + potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` + fi + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null | + $GREP " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib=$potent_lib + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | $SED 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib=$potliblink;; + *) potlib=`$ECHO "$potlib" | $SED 's|[^/]*$||'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | + $SED -e 10q | + $EGREP "$file_magic_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib= + break 2 + fi + done + done + fi + if test -n "$a_deplib"; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib"; then + $ECHO "*** with $libname but no candidates were found. (...for file magic test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a file magic. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + for a_deplib in $deplibs; do + case $a_deplib in + -l*) + func_stripname -l '' "$a_deplib" + name=$func_stripname_result + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + case " $predeps $postdeps " in + *" $a_deplib "*) + func_append newdeplibs " $a_deplib" + a_deplib= + ;; + esac + fi + if test -n "$a_deplib"; then + libname=`eval "\\$ECHO \"$libname_spec\""` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib=$potent_lib # see symlink-check above in file_magic test + if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ + $EGREP "$match_pattern_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib= + break 2 + fi + done + done + fi + if test -n "$a_deplib"; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib"; then + $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a regex pattern. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs= + tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + for i in $predeps $postdeps; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s|$i||"` + done + fi + case $tmp_deplibs in + *[!\ \ ]*) + echo + if test none = "$deplibs_check_method"; then + echo "*** Warning: inter-library dependencies are not supported in this platform." + else + echo "*** Warning: inter-library dependencies are not known to be supported." + fi + echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + ;; + esac + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library with the System framework + newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + if test yes = "$droppeddeps"; then + if test yes = "$module"; then + echo + echo "*** Warning: libtool could not satisfy all declared inter-library" + $ECHO "*** dependencies of module $libname. Therefore, libtool will create" + echo "*** a static module, that should work as long as the dlopening" + echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using 'nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** 'nm' from GNU binutils and a full rebuild may help." + fi + if test no = "$build_old_libs"; then + oldlibs=$output_objdir/$libname.$libext + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + echo "*** The inter-library dependencies that have been dropped here will be" + echo "*** automatically added whenever a program is linked with this library" + echo "*** or is declared to -dlopen it." + + if test no = "$allow_undefined"; then + echo + echo "*** Since this library must not contain undefined symbols," + echo "*** because either the platform does not support them or" + echo "*** it was explicitly requested with -no-undefined," + echo "*** libtool will only create a static version of it." + if test no = "$build_old_libs"; then + oldlibs=$output_objdir/$libname.$libext + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + case $host in + *-*-darwin*) + newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + deplibs=$new_libs + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test yes = "$build_libtool_libs"; then + # Remove $wl instances when linking with ld. + # FIXME: should test the right _cmds variable. + case $archive_cmds in + *\$LD\ *) wl= ;; + esac + if test yes = "$hardcode_into_libs"; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath=$finalize_rpath + test relink = "$opt_mode" || rpath=$compile_rpath$rpath + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + func_replace_sysroot "$libdir" + libdir=$func_replace_sysroot_result + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append dep_rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath=$finalize_shlibpath + test relink = "$opt_mode" || shlibpath=$compile_shlibpath$shlibpath + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + shift + realname=$1 + shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname=$realname + fi + if test -z "$dlname"; then + dlname=$soname + fi + + lib=$output_objdir/$realname + linknames= + for link + do + func_append linknames " $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` + test "X$libobjs" = "X " && libobjs= + + delfiles= + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" + export_symbols=$output_objdir/$libname.uexp + func_append delfiles " $export_symbols" + fi + + orig_export_symbols= + case $host_os in + cygwin* | mingw* | cegcc*) + if test -n "$export_symbols" && test -z "$export_symbols_regex"; then + # exporting using user supplied symfile + func_dll_def_p "$export_symbols" || { + # and it's NOT already a .def file. Must figure out + # which of the given symbols are data symbols and tag + # them as such. So, trigger use of export_symbols_cmds. + # export_symbols gets reassigned inside the "prepare + # the list of exported symbols" if statement, so the + # include_expsyms logic still works. + orig_export_symbols=$export_symbols + export_symbols= + always_export_symbols=yes + } + fi + ;; + esac + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test yes = "$always_export_symbols" || test -n "$export_symbols_regex"; then + func_verbose "generating symbol list for '$libname.la'" + export_symbols=$output_objdir/$libname.exp + $opt_dry_run || $RM $export_symbols + cmds=$export_symbols_cmds + save_ifs=$IFS; IFS='~' + for cmd1 in $cmds; do + IFS=$save_ifs + # Take the normal branch if the nm_file_list_spec branch + # doesn't work or if tool conversion is not needed. + case $nm_file_list_spec~$to_tool_file_cmd in + *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) + try_normal_branch=yes + eval cmd=\"$cmd1\" + func_len " $cmd" + len=$func_len_result + ;; + *) + try_normal_branch=no + ;; + esac + if test yes = "$try_normal_branch" \ + && { test "$len" -lt "$max_cmd_len" \ + || test "$max_cmd_len" -le -1; } + then + func_show_eval "$cmd" 'exit $?' + skipped_export=false + elif test -n "$nm_file_list_spec"; then + func_basename "$output" + output_la=$func_basename_result + save_libobjs=$libobjs + save_output=$output + output=$output_objdir/$output_la.nm + func_to_tool_file "$output" + libobjs=$nm_file_list_spec$func_to_tool_file_result + func_append delfiles " $output" + func_verbose "creating $NM input file list: $output" + for obj in $save_libobjs; do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > "$output" + eval cmd=\"$cmd1\" + func_show_eval "$cmd" 'exit $?' + output=$save_output + libobjs=$save_libobjs + skipped_export=false + else + # The command line is too long to execute in one step. + func_verbose "using reloadable object file for export list..." + skipped_export=: + # Break out early, otherwise skipped_export may be + # set to false by a later but shorter cmd. + break + fi + done + IFS=$save_ifs + if test -n "$export_symbols_regex" && test : != "$skipped_export"; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols=$export_symbols + test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test : != "$skipped_export" && test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for '$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands, which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + func_append tmp_deplibs " $test_deplib" + ;; + esac + done + deplibs=$tmp_deplibs + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec" && + test yes = "$compiler_needs_object" && + test -z "$libobjs"; then + # extract the archives, so we have objects to list. + # TODO: could optimize this to just extract one archive. + whole_archive_flag_spec= + fi + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + else + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + fi + + if test yes = "$thread_safe" && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + func_append linker_flags " $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test relink = "$opt_mode"; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test yes = "$module" && test -n "$module_cmds"; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds + else + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi + fi + + if test : != "$skipped_export" && + func_len " $test_cmds" && + len=$func_len_result && + test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise + # or, if using GNU ld and skipped_export is not :, use a linker + # script. + + # Save the value of $output and $libobjs because we want to + # use them later. If we have whole_archive_flag_spec, we + # want to use save_libobjs as it was before + # whole_archive_flag_spec was expanded, because we can't + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output + func_basename "$output" + output_la=$func_basename_result + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + last_robj= + k=1 + + if test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then + output=$output_objdir/$output_la.lnkscript + func_verbose "creating GNU ld script: $output" + echo 'INPUT (' > $output + for obj in $save_libobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + echo ')' >> $output + func_append delfiles " $output" + func_to_tool_file "$output" + output=$func_to_tool_file_result + elif test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then + output=$output_objdir/$output_la.lnk + func_verbose "creating linker input file list: $output" + : > $output + set x $save_libobjs + shift + firstobj= + if test yes = "$compiler_needs_object"; then + firstobj="$1 " + shift + fi + for obj + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + func_append delfiles " $output" + func_to_tool_file "$output" + output=$firstobj\"$file_list_spec$func_to_tool_file_result\" + else + if test -n "$save_libobjs"; then + func_verbose "creating reloadable object files..." + output=$output_objdir/$output_la-$k.$objext + eval test_cmds=\"$reload_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + if test -z "$objlist" || + test "$len" -lt "$max_cmd_len"; then + func_append objlist " $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test 1 -eq "$k"; then + # The first file doesn't have a previous command to add. + reload_objs=$objlist + eval concat_cmds=\"$reload_cmds\" + else + # All subsequent reloadable object files will link in + # the last one created. + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" + fi + last_robj=$output_objdir/$output_la-$k.$objext + func_arith $k + 1 + k=$func_arith_result + output=$output_objdir/$output_la-$k.$objext + objlist=" $obj" + func_len " $last_robj" + func_arith $len0 + $func_len_result + len=$func_arith_result + fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds$reload_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + func_append delfiles " $output" + + else + output= + fi + + ${skipped_export-false} && { + func_verbose "generating symbol list for '$libname.la'" + export_symbols=$output_objdir/$libname.exp + $opt_dry_run || $RM $export_symbols + libobjs=$output + # Append the command to create the export file. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + } + + test -n "$save_libobjs" && + func_verbose "creating a temporary reloadable object file: $output" + + # Loop through the commands generated above and execute them. + save_ifs=$IFS; IFS='~' + for cmd in $concat_cmds; do + IFS=$save_ifs + $opt_quiet || { + func_quote_arg expand,pretty "$cmd" + eval "func_echo $func_quote_arg_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS=$save_ifs + + if test -n "$export_symbols_regex" && ${skipped_export-false}; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + + ${skipped_export-false} && { + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols=$export_symbols + test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for '$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands, which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + } + + libobjs=$output + # Restore the value of output. + output=$save_output + + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test yes = "$module" && test -n "$module_cmds"; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds + fi + fi + fi + + if test -n "$delfiles"; then + # Append the command to remove temporary files to $cmds. + eval cmds=\"\$cmds~\$RM $delfiles\" + fi + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + + save_ifs=$IFS; IFS='~' + for cmd in $cmds; do + IFS=$sp$nl + eval cmd=\"$cmd\" + IFS=$save_ifs + $opt_quiet || { + func_quote_arg expand,pretty "$cmd" + eval "func_echo $func_quote_arg_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS=$save_ifs + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? + + if test -n "$convenience"; then + if test -z "$whole_archive_flag_spec"; then + func_show_eval '${RM}r "$gentop"' + fi + fi + + exit $EXIT_SUCCESS + fi + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test yes = "$module" || test yes = "$export_dynamic"; then + # On all known operating systems, these are identical. + dlname=$soname + fi + fi + ;; + + obj) + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + func_warning "'-dlopen' is ignored for objects" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "'-l' and '-L' are ignored for objects" ;; + esac + + test -n "$rpath" && \ + func_warning "'-rpath' is ignored for objects" + + test -n "$xrpath" && \ + func_warning "'-R' is ignored for objects" + + test -n "$vinfo" && \ + func_warning "'-version-info' is ignored for objects" + + test -n "$release" && \ + func_warning "'-release' is ignored for objects" + + case $output in + *.lo) + test -n "$objs$old_deplibs" && \ + func_fatal_error "cannot build library object '$output' from non-libtool objects" + + libobj=$output + func_lo2o "$libobj" + obj=$func_lo2o_result + ;; + *) + libobj= + obj=$output + ;; + esac + + # Delete the old objects. + $opt_dry_run || $RM $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # if reload_cmds runs $LD directly, get rid of -Wl from + # whole_archive_flag_spec and hope we can get by with turning comma + # into space. + case $reload_cmds in + *\$LD[\ \$]*) wl= ;; + esac + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" + test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` + reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags + else + gentop=$output_objdir/${obj}x + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # If we're not building shared, we need to use non_pic_objs + test yes = "$build_libtool_libs" || libobjs=$non_pic_objects + + # Create the old-style object. + reload_objs=$objs$old_deplibs' '`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; /\.lib$/d; $lo2o" | $NL2SP`' '$reload_conv_objs + + output=$obj + func_execute_cmds "$reload_cmds" 'exit $?' + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + fi + + test yes = "$build_libtool_libs" || { + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + # $show "echo timestamp > $libobj" + # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + } + + if test -n "$pic_flag" || test default != "$pic_mode"; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output=$libobj + func_execute_cmds "$reload_cmds" 'exit $?' + fi + + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) func_stripname '' '.exe' "$output" + output=$func_stripname_result.exe;; + esac + test -n "$vinfo" && \ + func_warning "'-version-info' is ignored for programs" + + test -n "$release" && \ + func_warning "'-release' is ignored for programs" + + $preload \ + && test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \ + && func_warning "'LT_INIT([dlopen])' not used. Assuming no dlopen support." + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + case $host in + *-*-darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + # But is supposedly fixed on 10.4 or later (yay!). + if test CXX = "$tagname"; then + case ${MACOSX_DEPLOYMENT_TARGET-10.0} in + 10.[0123]) + func_append compile_command " $wl-bind_at_load" + func_append finalize_command " $wl-bind_at_load" + ;; + esac + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $compile_deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + compile_deplibs=$new_libs + + + func_append compile_command " $compile_deplibs" + func_append finalize_command " $finalize_deplibs" + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$libdir" | $SED -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + ::) dllsearchpath=$libdir;; + *) func_append dllsearchpath ":$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath=$rpath + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) func_append finalize_perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath=$rpath + + if test -n "$libobjs" && test yes = "$build_old_libs"; then + # Transform all the library objects into standard objects. + compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + fi + + func_generate_dlsyms "$outputname" "@PROGRAM@" false + + # template prelinking step + if test -n "$prelink_cmds"; then + func_execute_cmds "$prelink_cmds" 'exit $?' + fi + + wrappers_required=: + case $host in + *cegcc* | *mingw32ce*) + # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. + wrappers_required=false + ;; + *cygwin* | *mingw* ) + test yes = "$build_libtool_libs" || wrappers_required=false + ;; + *) + if test no = "$need_relink" || test yes != "$build_libtool_libs"; then + wrappers_required=false + fi + ;; + esac + $wrappers_required || { + # Replace the output file specification. + compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + link_command=$compile_command$compile_rpath + + # We have no uninstalled library dependencies, so finalize right now. + exit_status=0 + func_show_eval "$link_command" 'exit_status=$?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Delete the generated files. + if test -f "$output_objdir/${outputname}S.$objext"; then + func_show_eval '$RM "$output_objdir/${outputname}S.$objext"' + fi + + exit $exit_status + } + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + func_append rpath "$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test yes = "$no_install"; then + # We don't need to create a wrapper script. + link_command=$compile_var$compile_command$compile_rpath + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $opt_dry_run || $RM $output + # Link the executable and exit + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + exit $EXIT_SUCCESS + fi + + case $hardcode_action,$fast_install in + relink,*) + # Fast installation is not supported + link_command=$compile_var$compile_command$compile_rpath + relink_command=$finalize_var$finalize_command$finalize_rpath + + func_warning "this platform does not like uninstalled shared libraries" + func_warning "'$output' will be relinked during installation" + ;; + *,yes) + link_command=$finalize_var$compile_command$finalize_rpath + relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` + ;; + *,no) + link_command=$compile_var$compile_command$compile_rpath + relink_command=$finalize_var$finalize_command$finalize_rpath + ;; + *,needless) + link_command=$finalize_var$compile_command$finalize_rpath + relink_command= + ;; + esac + + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname + + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output_objdir/$outputname" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Now create the wrapper script. + func_verbose "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_arg pretty "$var_value" + relink_command="$var=$func_quote_arg_result; export $var; $relink_command" + fi + done + func_quote eval cd "`pwd`" + func_quote_arg pretty,unquoted "($func_quote_result; $relink_command)" + relink_command=$func_quote_arg_unquoted_result + fi + + # Only actually do things if not in dry run mode. + $opt_dry_run || { + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) func_stripname '' '.exe' "$output" + output=$func_stripname_result ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + func_stripname '' '.exe' "$outputname" + outputname=$func_stripname_result ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + func_dirname_and_basename "$output" "" "." + output_name=$func_basename_result + output_path=$func_dirname_result + cwrappersource=$output_path/$objdir/lt-$output_name.c + cwrapper=$output_path/$output_name.exe + $RM $cwrappersource $cwrapper + trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + + func_emit_cwrapperexe_src > $cwrappersource + + # The wrapper executable is built using the $host compiler, + # because it contains $host paths and files. If cross- + # compiling, it, like the target executable, must be + # executed on the $host or under an emulation environment. + $opt_dry_run || { + $LTCC $LTCFLAGS -o $cwrapper $cwrappersource + $STRIP $cwrapper + } + + # Now, create the wrapper script for func_source use: + func_ltwrapper_scriptname $cwrapper + $RM $func_ltwrapper_scriptname_result + trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 + $opt_dry_run || { + # note: this script will not be executed, so do not chmod. + if test "x$build" = "x$host"; then + $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result + else + func_emit_wrapper no > $func_ltwrapper_scriptname_result + fi + } + ;; + * ) + $RM $output + trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 + + func_emit_wrapper no > $output + chmod +x $output + ;; + esac + } + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + case $build_libtool_libs in + convenience) + oldobjs="$libobjs_save $symfileobj" + addlibs=$convenience + build_libtool_libs=no + ;; + module) + oldobjs=$libobjs_save + addlibs=$old_convenience + build_libtool_libs=no + ;; + *) + oldobjs="$old_deplibs $non_pic_objects" + $preload && test -f "$symfileobj" \ + && func_append oldobjs " $symfileobj" + addlibs=$old_convenience + ;; + esac + + if test -n "$addlibs"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $addlibs + func_append oldobjs " $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test yes = "$build_libtool_libs"; then + cmds=$old_archive_from_new_cmds + else + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append oldobjs " $func_extract_archives_result" + fi + + # POSIX demands no paths to be encoded in archives. We have + # to avoid creating archives with duplicate basenames if we + # might have to extract them afterwards, e.g., when creating a + # static archive out of a convenience library, or when linking + # the entirety of a libtool archive into another (currently + # not supported by libtool). + if (for obj in $oldobjs + do + func_basename "$obj" + $ECHO "$func_basename_result" + done | sort | sort -uc >/dev/null 2>&1); then + : + else + echo "copying selected object files to avoid basename conflicts..." + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + func_mkdir_p "$gentop" + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + func_basename "$obj" + objbase=$func_basename_result + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + func_arith $counter + 1 + counter=$func_arith_result + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + func_append oldobjs " $gentop/$newobj" + ;; + *) func_append oldobjs " $obj" ;; + esac + done + fi + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + eval cmds=\"$old_archive_cmds\" + + func_len " $cmds" + len=$func_len_result + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + elif test -n "$archiver_list_spec"; then + func_verbose "using command file archive linking..." + for obj in $oldobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > $output_objdir/$libname.libcmd + func_to_tool_file "$output_objdir/$libname.libcmd" + oldobjs=" $archiver_list_spec$func_to_tool_file_result" + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + func_verbose "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs + oldobjs= + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do + last_oldobj=$obj + done + eval test_cmds=\"$old_archive_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + for obj in $save_oldobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + func_append objlist " $obj" + if test "$len" -lt "$max_cmd_len"; then + : + else + # the above command should be used before it gets too long + oldobjs=$objlist + if test "$obj" = "$last_oldobj"; then + RANLIB=$save_RANLIB + fi + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$old_archive_cmds\" + objlist= + len=$len0 + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test -z "$oldobjs"; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + func_execute_cmds "$cmds" 'exit $?' + done + + test -n "$generated" && \ + func_show_eval "${RM}r$generated" + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test yes = "$build_old_libs" && old_library=$libname.$libext + func_verbose "creating $output" + + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_arg pretty,unquoted "$var_value" + relink_command="$var=$func_quote_arg_unquoted_result; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + func_quote eval cd "`pwd`" + relink_command="($func_quote_result; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + func_quote_arg pretty,unquoted "$relink_command" + relink_command=$func_quote_arg_unquoted_result + if test yes = "$hardcode_automatic"; then + relink_command= + fi + + # Only create the output if not a dry run. + $opt_dry_run || { + for installed in no yes; do + if test yes = "$installed"; then + if test -z "$install_libdir"; then + break + fi + output=$output_objdir/${outputname}i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + func_basename "$deplib" + name=$func_basename_result + func_resolve_sysroot "$deplib" + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` + test -z "$libdir" && \ + func_fatal_error "'$deplib' is not a valid libtool archive" + func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" + ;; + -L*) + func_stripname -L '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -L$func_replace_sysroot_result" + ;; + -R*) + func_stripname -R '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -R$func_replace_sysroot_result" + ;; + *) func_append newdependency_libs " $deplib" ;; + esac + done + dependency_libs=$newdependency_libs + newdlfiles= + + for lib in $dlfiles; do + case $lib in + *.la) + func_basename "$lib" + name=$func_basename_result + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "'$lib' is not a valid libtool archive" + func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" + ;; + *) func_append newdlfiles " $lib" ;; + esac + done + dlfiles=$newdlfiles + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + *.la) + # Only pass preopened files to the pseudo-archive (for + # eventual linking with the app. that links it) if we + # didn't already link the preopened objects directly into + # the library: + func_basename "$lib" + name=$func_basename_result + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "'$lib' is not a valid libtool archive" + func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" + ;; + esac + done + dlprefiles=$newdlprefiles + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlfiles " $abs" + done + dlfiles=$newdlfiles + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlprefiles " $abs" + done + dlprefiles=$newdlprefiles + fi + $RM $output + # place dlname in correct position for cygwin + # In fact, it would be nice if we could use this code for all target + # systems that can't hard-code library paths into their executables + # and that have no shared library path variable independent of PATH, + # but it turns out we can't easily determine that from inspecting + # libtool variables, so we have to hard-code the OSs to which it + # applies here; at the moment, that means platforms that use the PE + # object format with DLL files. See the long comment at the top of + # tests/bindir.at for full details. + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) + # If a -bindir argument was supplied, place the dll there. + if test -n "$bindir"; then + func_relative_path "$install_libdir" "$bindir" + tdlname=$func_relative_path_result/$dlname + else + # Otherwise fall back on heuristic. + tdlname=../bin/$dlname + fi + ;; + esac + $ECHO > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM (GNU $PACKAGE) $VERSION +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Linker flags that cannot go in dependency_libs. +inherited_linker_flags='$new_inherited_linker_flags' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Names of additional weak libraries provided by this library +weak_library_names='$weak_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Should we warn about portability when linking against -modules? +shouldnotlink=$module + +# Files to dlopen/dlpreopen +dlopen='$dlfiles' +dlpreopen='$dlprefiles' + +# Directory that this library needs to be installed in: +libdir='$install_libdir'" + if test no,yes = "$installed,$need_relink"; then + $ECHO >> $output "\ +relink_command=\"$relink_command\"" + fi + done + } + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' + ;; + esac + exit $EXIT_SUCCESS +} + +if test link = "$opt_mode" || test relink = "$opt_mode"; then + func_mode_link ${1+"$@"} +fi + + +# func_mode_uninstall arg... +func_mode_uninstall () +{ + $debug_cmd + + RM=$nonopt + files= + rmforce=false + exit_status=0 + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic=$magic + + for arg + do + case $arg in + -f) func_append RM " $arg"; rmforce=: ;; + -*) func_append RM " $arg" ;; + *) func_append files " $arg" ;; + esac + done + + test -z "$RM" && \ + func_fatal_help "you must specify an RM program" + + rmdirs= + + for file in $files; do + func_dirname "$file" "" "." + dir=$func_dirname_result + if test . = "$dir"; then + odir=$objdir + else + odir=$dir/$objdir + fi + func_basename "$file" + name=$func_basename_result + test uninstall = "$opt_mode" && odir=$dir + + # Remember odir for removal later, being careful to avoid duplicates + if test clean = "$opt_mode"; then + case " $rmdirs " in + *" $odir "*) ;; + *) func_append rmdirs " $odir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if { test -L "$file"; } >/dev/null 2>&1 || + { test -h "$file"; } >/dev/null 2>&1 || + test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif $rmforce; then + continue + fi + + rmfiles=$file + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if func_lalib_p "$file"; then + func_source $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + func_append rmfiles " $odir/$n" + done + test -n "$old_library" && func_append rmfiles " $odir/$old_library" + + case $opt_mode in + clean) + case " $library_names " in + *" $dlname "*) ;; + *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; + esac + test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + func_execute_cmds "$postuninstall_cmds" '$rmforce || exit_status=1' + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + func_execute_cmds "$old_postuninstall_cmds" '$rmforce || exit_status=1' + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if func_lalib_p "$file"; then + + # Read the .lo file + func_source $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" && test none != "$pic_object"; then + func_append rmfiles " $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" && test none != "$non_pic_object"; then + func_append rmfiles " $dir/$non_pic_object" + fi + fi + ;; + + *) + if test clean = "$opt_mode"; then + noexename=$name + case $file in + *.exe) + func_stripname '' '.exe' "$file" + file=$func_stripname_result + func_stripname '' '.exe' "$name" + noexename=$func_stripname_result + # $file with .exe has already been added to rmfiles, + # add $file without .exe + func_append rmfiles " $file" + ;; + esac + # Do a test to see if this is a libtool program. + if func_ltwrapper_p "$file"; then + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + relink_command= + func_source $func_ltwrapper_scriptname_result + func_append rmfiles " $func_ltwrapper_scriptname_result" + else + relink_command= + func_source $dir/$noexename + fi + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + func_append rmfiles " $odir/$name $odir/${name}S.$objext" + if test yes = "$fast_install" && test -n "$relink_command"; then + func_append rmfiles " $odir/lt-$name" + fi + if test "X$noexename" != "X$name"; then + func_append rmfiles " $odir/lt-$noexename.c" + fi + fi + fi + ;; + esac + func_show_eval "$RM $rmfiles" 'exit_status=1' + done + + # Try to remove the $objdir's in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + func_show_eval "rmdir $dir >/dev/null 2>&1" + fi + done + + exit $exit_status +} + +if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then + func_mode_uninstall ${1+"$@"} +fi + +test -z "$opt_mode" && { + help=$generic_help + func_fatal_help "you must specify a MODE" +} + +test -z "$exec_cmd" && \ + func_fatal_help "invalid operation mode '$opt_mode'" + +if test -n "$exec_cmd"; then + eval exec "$exec_cmd" + exit $EXIT_FAILURE +fi + +exit $exit_status + + +# The TAGs below are defined such that we never get into a situation +# where we disable both kinds of libraries. Given conflicting +# choices, we go for a static library, that is the most portable, +# since we can't tell whether shared libraries were disabled because +# the user asked for that or because the platform doesn't support +# them. This is particularly important on AIX, because we don't +# support having both static and shared libraries enabled at the same +# time on that platform, so we default to a shared-only configuration. +# If a disable-shared tag is given, we'll fallback to a static-only +# configuration. But we'll never go from static-only to shared-only. + +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared +build_libtool_libs=no +build_old_libs=yes +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/m4/ax_pthread.m4 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/m4/ax_pthread.m4 new file mode 100755 index 000000000..d90de34d1 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/m4/ax_pthread.m4 @@ -0,0 +1,309 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_pthread.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) +# +# DESCRIPTION +# +# This macro figures out how to build C programs using POSIX threads. It +# sets the PTHREAD_LIBS output variable to the threads library and linker +# flags, and the PTHREAD_CFLAGS output variable to any special C compiler +# flags that are needed. (The user can also force certain compiler +# flags/libs to be tested by setting these environment variables.) +# +# Also sets PTHREAD_CC to any special C compiler that is needed for +# multi-threaded programs (defaults to the value of CC otherwise). (This +# is necessary on AIX to use the special cc_r compiler alias.) +# +# NOTE: You are assumed to not only compile your program with these flags, +# but also link it with them as well. e.g. you should link with +# $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS +# +# If you are only building threads programs, you may wish to use these +# variables in your default LIBS, CFLAGS, and CC: +# +# LIBS="$PTHREAD_LIBS $LIBS" +# CFLAGS="$CFLAGS $PTHREAD_CFLAGS" +# CC="$PTHREAD_CC" +# +# In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant +# has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to that name +# (e.g. PTHREAD_CREATE_UNDETACHED on AIX). +# +# Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the +# PTHREAD_PRIO_INHERIT symbol is defined when compiling with +# PTHREAD_CFLAGS. +# +# ACTION-IF-FOUND is a list of shell commands to run if a threads library +# is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it +# is not found. If ACTION-IF-FOUND is not specified, the default action +# will define HAVE_PTHREAD. +# +# Please let the authors know if this macro fails on any platform, or if +# you have any other suggestions or comments. This macro was based on work +# by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help +# from M. Frigo), as well as ac_pthread and hb_pthread macros posted by +# Alejandro Forero Cuervo to the autoconf macro repository. We are also +# grateful for the helpful feedback of numerous users. +# +# Updated for Autoconf 2.68 by Daniel Richard G. +# +# LICENSE +# +# Copyright (c) 2008 Steven G. Johnson +# Copyright (c) 2011 Daniel Richard G. +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 18 + +AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD]) +AC_DEFUN([AX_PTHREAD], [ +AC_REQUIRE([AC_CANONICAL_HOST]) +AC_LANG_PUSH([C]) +ax_pthread_ok=no + +# We used to check for pthread.h first, but this fails if pthread.h +# requires special compiler flags (e.g. on True64 or Sequent). +# It gets checked for in the link test anyway. + +# First of all, check if the user has set any of the PTHREAD_LIBS, +# etcetera environment variables, and if threads linking works using +# them: +if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) + AC_TRY_LINK_FUNC(pthread_join, ax_pthread_ok=yes) + AC_MSG_RESULT($ax_pthread_ok) + if test x"$ax_pthread_ok" = xno; then + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" + fi + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" +fi + +# We must check for the threads library under a number of different +# names; the ordering is very important because some systems +# (e.g. DEC) have both -lpthread and -lpthreads, where one of the +# libraries is broken (non-POSIX). + +# Create a list of thread flags to try. Items starting with a "-" are +# C compiler flags, and other items are library names, except for "none" +# which indicates that we try without any flags at all, and "pthread-config" +# which is a program returning the flags for the Pth emulation library. + +ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" + +# The ordering *is* (sometimes) important. Some notes on the +# individual items follow: + +# pthreads: AIX (must check this before -lpthread) +# none: in case threads are in libc; should be tried before -Kthread and +# other compiler flags to prevent continual compiler warnings +# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) +# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) +# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) +# -pthreads: Solaris/gcc +# -mthreads: Mingw32/gcc, Lynx/gcc +# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it +# doesn't hurt to check since this sometimes defines pthreads too; +# also defines -D_REENTRANT) +# ... -mt is also the pthreads flag for HP/aCC +# pthread: Linux, etcetera +# --thread-safe: KAI C++ +# pthread-config: use pthread-config program (for GNU Pth library) + +case ${host_os} in + solaris*) + + # On Solaris (at least, for some versions), libc contains stubbed + # (non-functional) versions of the pthreads routines, so link-based + # tests will erroneously succeed. (We need to link with -pthreads/-mt/ + # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather + # a function called by this macro, so we could check for that, but + # who knows whether they'll stub that too in a future libc.) So, + # we'll just look for -pthreads and -lpthread first: + + ax_pthread_flags="-pthreads pthread -mt -pthread $ax_pthread_flags" + ;; + + darwin*) + ax_pthread_flags="-pthread $ax_pthread_flags" + ;; +esac + +if test x"$ax_pthread_ok" = xno; then +for flag in $ax_pthread_flags; do + + case $flag in + none) + AC_MSG_CHECKING([whether pthreads work without any flags]) + ;; + + -*) + AC_MSG_CHECKING([whether pthreads work with $flag]) + PTHREAD_CFLAGS="$flag" + ;; + + pthread-config) + AC_CHECK_PROG(ax_pthread_config, pthread-config, yes, no) + if test x"$ax_pthread_config" = xno; then continue; fi + PTHREAD_CFLAGS="`pthread-config --cflags`" + PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" + ;; + + *) + AC_MSG_CHECKING([for the pthreads library -l$flag]) + PTHREAD_LIBS="-l$flag" + ;; + esac + + save_LIBS="$LIBS" + save_CFLAGS="$CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Check for various functions. We must include pthread.h, + # since some functions may be macros. (On the Sequent, we + # need a special flag -Kthread to make this header compile.) + # We check for pthread_join because it is in -lpthread on IRIX + # while pthread_create is in libc. We check for pthread_attr_init + # due to DEC craziness with -lpthreads. We check for + # pthread_cleanup_push because it is one of the few pthread + # functions on Solaris that doesn't have a non-functional libc stub. + # We try pthread_create on general principles. + AC_LINK_IFELSE([AC_LANG_PROGRAM([#include + static void routine(void *a) { a = 0; } + static void *start_routine(void *a) { return a; }], + [pthread_t th; pthread_attr_t attr; + pthread_create(&th, 0, start_routine, 0); + pthread_join(th, 0); + pthread_attr_init(&attr); + pthread_cleanup_push(routine, 0); + pthread_cleanup_pop(0) /* ; */])], + [ax_pthread_ok=yes], + []) + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + AC_MSG_RESULT($ax_pthread_ok) + if test "x$ax_pthread_ok" = xyes; then + break; + fi + + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" +done +fi + +# Various other checks: +if test "x$ax_pthread_ok" = xyes; then + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. + AC_MSG_CHECKING([for joinable pthread attribute]) + attr_name=unknown + for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do + AC_LINK_IFELSE([AC_LANG_PROGRAM([#include ], + [int attr = $attr; return attr /* ; */])], + [attr_name=$attr; break], + []) + done + AC_MSG_RESULT($attr_name) + if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then + AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name, + [Define to necessary symbol if this constant + uses a non-standard name on your system.]) + fi + + AC_MSG_CHECKING([if more special flags are required for pthreads]) + flag=no + case ${host_os} in + aix* | freebsd* | darwin*) flag="-D_THREAD_SAFE";; + osf* | hpux*) flag="-D_REENTRANT";; + solaris*) + if test "$GCC" = "yes"; then + flag="-D_REENTRANT" + else + flag="-mt -D_REENTRANT" + fi + ;; + esac + AC_MSG_RESULT(${flag}) + if test "x$flag" != xno; then + PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" + fi + + AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT], + ax_cv_PTHREAD_PRIO_INHERIT, [ + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([[#include ]], [[int i = PTHREAD_PRIO_INHERIT;]])], + [ax_cv_PTHREAD_PRIO_INHERIT=yes], + [ax_cv_PTHREAD_PRIO_INHERIT=no]) + ]) + AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes"], + AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], 1, [Have PTHREAD_PRIO_INHERIT.])) + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + # More AIX lossage: must compile with xlc_r or cc_r + if test x"$GCC" != xyes; then + AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC}) + else + PTHREAD_CC=$CC + fi +else + PTHREAD_CC="$CC" +fi + +AC_SUBST(PTHREAD_LIBS) +AC_SUBST(PTHREAD_CFLAGS) +AC_SUBST(PTHREAD_CC) + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test x"$ax_pthread_ok" = xyes; then + ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1]) + : +else + ax_pthread_ok=no + $2 +fi +AC_LANG_POP +])dnl AX_PTHREAD diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/m4/libtool.m4 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/m4/libtool.m4 new file mode 100755 index 000000000..2b73e3844 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/m4/libtool.m4 @@ -0,0 +1,8393 @@ +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- +# +# Copyright (C) 1996-2001, 2003-2018 Free Software Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +m4_define([_LT_COPYING], [dnl +# Copyright (C) 2014 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program or library that is built +# using GNU Libtool, you may include this file under the same +# distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +]) + +# serial 58 LT_INIT + + +# LT_PREREQ(VERSION) +# ------------------ +# Complain and exit if this libtool version is less that VERSION. +m4_defun([LT_PREREQ], +[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, + [m4_default([$3], + [m4_fatal([Libtool version $1 or higher is required], + 63)])], + [$2])]) + + +# _LT_CHECK_BUILDDIR +# ------------------ +# Complain if the absolute build directory name contains unusual characters +m4_defun([_LT_CHECK_BUILDDIR], +[case `pwd` in + *\ * | *\ *) + AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; +esac +]) + + +# LT_INIT([OPTIONS]) +# ------------------ +AC_DEFUN([LT_INIT], +[AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK +AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +AC_BEFORE([$0], [LT_LANG])dnl +AC_BEFORE([$0], [LT_OUTPUT])dnl +AC_BEFORE([$0], [LTDL_INIT])dnl +m4_require([_LT_CHECK_BUILDDIR])dnl + +dnl Autoconf doesn't catch unexpanded LT_ macros by default: +m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl +m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl +dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 +dnl unless we require an AC_DEFUNed macro: +AC_REQUIRE([LTOPTIONS_VERSION])dnl +AC_REQUIRE([LTSUGAR_VERSION])dnl +AC_REQUIRE([LTVERSION_VERSION])dnl +AC_REQUIRE([LTOBSOLETE_VERSION])dnl +m4_require([_LT_PROG_LTMAIN])dnl + +_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) + +dnl Parse OPTIONS +_LT_SET_OPTIONS([$0], [$1]) + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS=$ltmain + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +_LT_SETUP + +# Only expand once: +m4_define([LT_INIT]) +])# LT_INIT + +# Old names: +AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) +AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PROG_LIBTOOL], []) +dnl AC_DEFUN([AM_PROG_LIBTOOL], []) + + +# _LT_PREPARE_CC_BASENAME +# ----------------------- +m4_defun([_LT_PREPARE_CC_BASENAME], [ +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in @S|@*""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} +])# _LT_PREPARE_CC_BASENAME + + +# _LT_CC_BASENAME(CC) +# ------------------- +# It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME, +# but that macro is also expanded into generated libtool script, which +# arranges for $SED and $ECHO to be set by different means. +m4_defun([_LT_CC_BASENAME], +[m4_require([_LT_PREPARE_CC_BASENAME])dnl +AC_REQUIRE([_LT_DECL_SED])dnl +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl +func_cc_basename $1 +cc_basename=$func_cc_basename_result +]) + + +# _LT_FILEUTILS_DEFAULTS +# ---------------------- +# It is okay to use these file commands and assume they have been set +# sensibly after 'm4_require([_LT_FILEUTILS_DEFAULTS])'. +m4_defun([_LT_FILEUTILS_DEFAULTS], +[: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} +])# _LT_FILEUTILS_DEFAULTS + + +# _LT_SETUP +# --------- +m4_defun([_LT_SETUP], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl + +_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl +dnl +_LT_DECL([], [host_alias], [0], [The host system])dnl +_LT_DECL([], [host], [0])dnl +_LT_DECL([], [host_os], [0])dnl +dnl +_LT_DECL([], [build_alias], [0], [The build system])dnl +_LT_DECL([], [build], [0])dnl +_LT_DECL([], [build_os], [0])dnl +dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +dnl +AC_REQUIRE([AC_PROG_LN_S])dnl +test -z "$LN_S" && LN_S="ln -s" +_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl +dnl +AC_REQUIRE([LT_CMD_MAX_LEN])dnl +_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl +_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl +dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl +m4_require([_LT_CMD_RELOAD])dnl +m4_require([_LT_CHECK_MAGIC_METHOD])dnl +m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl +m4_require([_LT_CMD_OLD_ARCHIVE])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_WITH_SYSROOT])dnl +m4_require([_LT_CMD_TRUNCATE])dnl + +_LT_CONFIG_LIBTOOL_INIT([ +# See if we are running on zsh, and set the options that allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi +]) +if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + +_LT_CHECK_OBJDIR + +m4_require([_LT_TAG_COMPILER])dnl + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a '.a' archive for static linking (except MSVC and +# ICC, which need '.lib'). +libext=a + +with_gnu_ld=$lt_cv_prog_gnu_ld + +old_CC=$CC +old_CFLAGS=$CFLAGS + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +_LT_CC_BASENAME([$compiler]) + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + _LT_PATH_MAGIC + fi + ;; +esac + +# Use C for the default configuration in the libtool script +LT_SUPPORTED_TAG([CC]) +_LT_LANG_C_CONFIG +_LT_LANG_DEFAULT_CONFIG +_LT_CONFIG_COMMANDS +])# _LT_SETUP + + +# _LT_PREPARE_SED_QUOTE_VARS +# -------------------------- +# Define a few sed substitution that help us do robust quoting. +m4_defun([_LT_PREPARE_SED_QUOTE_VARS], +[# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([["`\\]]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' +]) + +# _LT_PROG_LTMAIN +# --------------- +# Note that this code is called both from 'configure', and 'config.status' +# now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, +# 'config.status' has no value for ac_aux_dir unless we are using Automake, +# so we pass a copy along to make sure it has a sensible value anyway. +m4_defun([_LT_PROG_LTMAIN], +[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl +_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) +ltmain=$ac_aux_dir/ltmain.sh +])# _LT_PROG_LTMAIN + + +## ------------------------------------- ## +## Accumulate code for creating libtool. ## +## ------------------------------------- ## + +# So that we can recreate a full libtool script including additional +# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS +# in macros and then make a single call at the end using the 'libtool' +# label. + + +# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) +# ---------------------------------------- +# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL_INIT], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_INIT], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_INIT]) + + +# _LT_CONFIG_LIBTOOL([COMMANDS]) +# ------------------------------ +# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) + + +# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) +# ----------------------------------------------------- +m4_defun([_LT_CONFIG_SAVE_COMMANDS], +[_LT_CONFIG_LIBTOOL([$1]) +_LT_CONFIG_LIBTOOL_INIT([$2]) +]) + + +# _LT_FORMAT_COMMENT([COMMENT]) +# ----------------------------- +# Add leading comment marks to the start of each line, and a trailing +# full-stop to the whole comment if one is not present already. +m4_define([_LT_FORMAT_COMMENT], +[m4_ifval([$1], [ +m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], + [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) +)]) + + + +## ------------------------ ## +## FIXME: Eliminate VARNAME ## +## ------------------------ ## + + +# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) +# ------------------------------------------------------------------- +# CONFIGNAME is the name given to the value in the libtool script. +# VARNAME is the (base) name used in the configure script. +# VALUE may be 0, 1 or 2 for a computed quote escaped value based on +# VARNAME. Any other value will be used directly. +m4_define([_LT_DECL], +[lt_if_append_uniq([lt_decl_varnames], [$2], [, ], + [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], + [m4_ifval([$1], [$1], [$2])]) + lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) + m4_ifval([$4], + [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) + lt_dict_add_subkey([lt_decl_dict], [$2], + [tagged?], [m4_ifval([$5], [yes], [no])])]) +]) + + +# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) +# -------------------------------------------------------- +m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) + + +# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_tag_varnames], +[_lt_decl_filter([tagged?], [yes], $@)]) + + +# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) +# --------------------------------------------------------- +m4_define([_lt_decl_filter], +[m4_case([$#], + [0], [m4_fatal([$0: too few arguments: $#])], + [1], [m4_fatal([$0: too few arguments: $#: $1])], + [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], + [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], + [lt_dict_filter([lt_decl_dict], $@)])[]dnl +]) + + +# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) +# -------------------------------------------------- +m4_define([lt_decl_quote_varnames], +[_lt_decl_filter([value], [1], $@)]) + + +# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_dquote_varnames], +[_lt_decl_filter([value], [2], $@)]) + + +# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_varnames_tagged], +[m4_assert([$# <= 2])dnl +_$0(m4_quote(m4_default([$1], [[, ]])), + m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), + m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) +m4_define([_lt_decl_varnames_tagged], +[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) + + +# lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_all_varnames], +[_$0(m4_quote(m4_default([$1], [[, ]])), + m4_if([$2], [], + m4_quote(lt_decl_varnames), + m4_quote(m4_shift($@))))[]dnl +]) +m4_define([_lt_decl_all_varnames], +[lt_join($@, lt_decl_varnames_tagged([$1], + lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl +]) + + +# _LT_CONFIG_STATUS_DECLARE([VARNAME]) +# ------------------------------------ +# Quote a variable value, and forward it to 'config.status' so that its +# declaration there will have the same value as in 'configure'. VARNAME +# must have a single quote delimited value for this to work. +m4_define([_LT_CONFIG_STATUS_DECLARE], +[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) + + +# _LT_CONFIG_STATUS_DECLARATIONS +# ------------------------------ +# We delimit libtool config variables with single quotes, so when +# we write them to config.status, we have to be sure to quote all +# embedded single quotes properly. In configure, this macro expands +# each variable declared with _LT_DECL (and _LT_TAGDECL) into: +# +# ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' +m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], +[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), + [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAGS +# ---------------- +# Output comment and list of tags supported by the script +m4_defun([_LT_LIBTOOL_TAGS], +[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl +available_tags='_LT_TAGS'dnl +]) + + +# _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) +# ----------------------------------- +# Extract the dictionary values for VARNAME (optionally with TAG) and +# expand to a commented shell variable setting: +# +# # Some comment about what VAR is for. +# visible_name=$lt_internal_name +m4_define([_LT_LIBTOOL_DECLARE], +[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], + [description])))[]dnl +m4_pushdef([_libtool_name], + m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl +m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), + [0], [_libtool_name=[$]$1], + [1], [_libtool_name=$lt_[]$1], + [2], [_libtool_name=$lt_[]$1], + [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl +m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl +]) + + +# _LT_LIBTOOL_CONFIG_VARS +# ----------------------- +# Produce commented declarations of non-tagged libtool config variables +# suitable for insertion in the LIBTOOL CONFIG section of the 'libtool' +# script. Tagged libtool config variables (even for the LIBTOOL CONFIG +# section) are produced by _LT_LIBTOOL_TAG_VARS. +m4_defun([_LT_LIBTOOL_CONFIG_VARS], +[m4_foreach([_lt_var], + m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAG_VARS(TAG) +# ------------------------- +m4_define([_LT_LIBTOOL_TAG_VARS], +[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) + + +# _LT_TAGVAR(VARNAME, [TAGNAME]) +# ------------------------------ +m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) + + +# _LT_CONFIG_COMMANDS +# ------------------- +# Send accumulated output to $CONFIG_STATUS. Thanks to the lists of +# variables for single and double quote escaping we saved from calls +# to _LT_DECL, we can put quote escaped variables declarations +# into 'config.status', and then the shell code to quote escape them in +# for loops in 'config.status'. Finally, any additional code accumulated +# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. +m4_defun([_LT_CONFIG_COMMANDS], +[AC_PROVIDE_IFELSE([LT_OUTPUT], + dnl If the libtool generation code has been placed in $CONFIG_LT, + dnl instead of duplicating it all over again into config.status, + dnl then we will have config.status run $CONFIG_LT later, so it + dnl needs to know what name is stored there: + [AC_CONFIG_COMMANDS([libtool], + [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], + dnl If the libtool generation code is destined for config.status, + dnl expand the accumulated commands and init code now: + [AC_CONFIG_COMMANDS([libtool], + [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) +])#_LT_CONFIG_COMMANDS + + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], +[ + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +_LT_CONFIG_STATUS_DECLARATIONS +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$[]1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_quote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_dquote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +_LT_OUTPUT_LIBTOOL_INIT +]) + +# _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) +# ------------------------------------ +# Generate a child script FILE with all initialization necessary to +# reuse the environment learned by the parent script, and make the +# file executable. If COMMENT is supplied, it is inserted after the +# '#!' sequence but before initialization text begins. After this +# macro, additional text can be appended to FILE to form the body of +# the child script. The macro ends with non-zero status if the +# file could not be fully written (such as if the disk is full). +m4_ifdef([AS_INIT_GENERATED], +[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], +[m4_defun([_LT_GENERATED_FILE_INIT], +[m4_require([AS_PREPARE])]dnl +[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl +[lt_write_fail=0 +cat >$1 <<_ASEOF || lt_write_fail=1 +#! $SHELL +# Generated by $as_me. +$2 +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$1 <<\_ASEOF || lt_write_fail=1 +AS_SHELL_SANITIZE +_AS_PREPARE +exec AS_MESSAGE_FD>&1 +_ASEOF +test 0 = "$lt_write_fail" && chmod +x $1[]dnl +m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT + +# LT_OUTPUT +# --------- +# This macro allows early generation of the libtool script (before +# AC_OUTPUT is called), incase it is used in configure for compilation +# tests. +AC_DEFUN([LT_OUTPUT], +[: ${CONFIG_LT=./config.lt} +AC_MSG_NOTICE([creating $CONFIG_LT]) +_LT_GENERATED_FILE_INIT(["$CONFIG_LT"], +[# Run this file to recreate a libtool stub with the current configuration.]) + +cat >>"$CONFIG_LT" <<\_LTEOF +lt_cl_silent=false +exec AS_MESSAGE_LOG_FD>>config.log +{ + echo + AS_BOX([Running $as_me.]) +} >&AS_MESSAGE_LOG_FD + +lt_cl_help="\ +'$as_me' creates a local libtool stub from the current configuration, +for use in further configure time tests before the real libtool is +generated. + +Usage: $[0] [[OPTIONS]] + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + +Report bugs to ." + +lt_cl_version="\ +m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl +m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) +configured by $[0], generated by m4_PACKAGE_STRING. + +Copyright (C) 2011 Free Software Foundation, Inc. +This config.lt script is free software; the Free Software Foundation +gives unlimited permision to copy, distribute and modify it." + +while test 0 != $[#] +do + case $[1] in + --version | --v* | -V ) + echo "$lt_cl_version"; exit 0 ;; + --help | --h* | -h ) + echo "$lt_cl_help"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --quiet | --q* | --silent | --s* | -q ) + lt_cl_silent=: ;; + + -*) AC_MSG_ERROR([unrecognized option: $[1] +Try '$[0] --help' for more information.]) ;; + + *) AC_MSG_ERROR([unrecognized argument: $[1] +Try '$[0] --help' for more information.]) ;; + esac + shift +done + +if $lt_cl_silent; then + exec AS_MESSAGE_FD>/dev/null +fi +_LTEOF + +cat >>"$CONFIG_LT" <<_LTEOF +_LT_OUTPUT_LIBTOOL_COMMANDS_INIT +_LTEOF + +cat >>"$CONFIG_LT" <<\_LTEOF +AC_MSG_NOTICE([creating $ofile]) +_LT_OUTPUT_LIBTOOL_COMMANDS +AS_EXIT(0) +_LTEOF +chmod +x "$CONFIG_LT" + +# configure is writing to config.log, but config.lt does its own redirection, +# appending to config.log, which fails on DOS, as config.log is still kept +# open by configure. Here we exec the FD to /dev/null, effectively closing +# config.log, so it can be properly (re)opened and appended to by config.lt. +lt_cl_success=: +test yes = "$silent" && + lt_config_lt_args="$lt_config_lt_args --quiet" +exec AS_MESSAGE_LOG_FD>/dev/null +$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false +exec AS_MESSAGE_LOG_FD>>config.log +$lt_cl_success || AS_EXIT(1) +])# LT_OUTPUT + + +# _LT_CONFIG(TAG) +# --------------- +# If TAG is the built-in tag, create an initial libtool script with a +# default configuration from the untagged config vars. Otherwise add code +# to config.status for appending the configuration named by TAG from the +# matching tagged config vars. +m4_defun([_LT_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_CONFIG_SAVE_COMMANDS([ + m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl + m4_if(_LT_TAG, [C], [ + # See if we are running on zsh, and set the options that allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST + fi + + cfgfile=${ofile}T + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL +# Generated automatically by $as_me ($PACKAGE) $VERSION +# NOTE: Changes made to this file will be lost: look at ltmain.sh. + +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit, 1996 + +_LT_COPYING +_LT_LIBTOOL_TAGS + +# Configured defaults for sys_lib_dlsearch_path munging. +: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} + +# ### BEGIN LIBTOOL CONFIG +_LT_LIBTOOL_CONFIG_VARS +_LT_LIBTOOL_TAG_VARS +# ### END LIBTOOL CONFIG + +_LT_EOF + + cat <<'_LT_EOF' >> "$cfgfile" + +# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE + +_LT_PREPARE_MUNGE_PATH_LIST +_LT_PREPARE_CC_BASENAME + +# ### END FUNCTIONS SHARED WITH CONFIGURE + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + _LT_PROG_LTMAIN + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +], +[cat <<_LT_EOF >> "$ofile" + +dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded +dnl in a comment (ie after a #). +# ### BEGIN LIBTOOL TAG CONFIG: $1 +_LT_LIBTOOL_TAG_VARS(_LT_TAG) +# ### END LIBTOOL TAG CONFIG: $1 +_LT_EOF +])dnl /m4_if +], +[m4_if([$1], [], [ + PACKAGE='$PACKAGE' + VERSION='$VERSION' + RM='$RM' + ofile='$ofile'], []) +])dnl /_LT_CONFIG_SAVE_COMMANDS +])# _LT_CONFIG + + +# LT_SUPPORTED_TAG(TAG) +# --------------------- +# Trace this macro to discover what tags are supported by the libtool +# --tag option, using: +# autoconf --trace 'LT_SUPPORTED_TAG:$1' +AC_DEFUN([LT_SUPPORTED_TAG], []) + + +# C support is built-in for now +m4_define([_LT_LANG_C_enabled], []) +m4_define([_LT_TAGS], []) + + +# LT_LANG(LANG) +# ------------- +# Enable libtool support for the given language if not already enabled. +AC_DEFUN([LT_LANG], +[AC_BEFORE([$0], [LT_OUTPUT])dnl +m4_case([$1], + [C], [_LT_LANG(C)], + [C++], [_LT_LANG(CXX)], + [Go], [_LT_LANG(GO)], + [Java], [_LT_LANG(GCJ)], + [Fortran 77], [_LT_LANG(F77)], + [Fortran], [_LT_LANG(FC)], + [Windows Resource], [_LT_LANG(RC)], + [m4_ifdef([_LT_LANG_]$1[_CONFIG], + [_LT_LANG($1)], + [m4_fatal([$0: unsupported language: "$1"])])])dnl +])# LT_LANG + + +# _LT_LANG(LANGNAME) +# ------------------ +m4_defun([_LT_LANG], +[m4_ifdef([_LT_LANG_]$1[_enabled], [], + [LT_SUPPORTED_TAG([$1])dnl + m4_append([_LT_TAGS], [$1 ])dnl + m4_define([_LT_LANG_]$1[_enabled], [])dnl + _LT_LANG_$1_CONFIG($1)])dnl +])# _LT_LANG + + +m4_ifndef([AC_PROG_GO], [ +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_GO. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ +m4_defun([AC_PROG_GO], +[AC_LANG_PUSH(Go)dnl +AC_ARG_VAR([GOC], [Go compiler command])dnl +AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl +_AC_ARG_VAR_LDFLAGS()dnl +AC_CHECK_TOOL(GOC, gccgo) +if test -z "$GOC"; then + if test -n "$ac_tool_prefix"; then + AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) + fi +fi +if test -z "$GOC"; then + AC_CHECK_PROG(GOC, gccgo, gccgo, false) +fi +])#m4_defun +])#m4_ifndef + + +# _LT_LANG_DEFAULT_CONFIG +# ----------------------- +m4_defun([_LT_LANG_DEFAULT_CONFIG], +[AC_PROVIDE_IFELSE([AC_PROG_CXX], + [LT_LANG(CXX)], + [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) + +AC_PROVIDE_IFELSE([AC_PROG_F77], + [LT_LANG(F77)], + [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) + +AC_PROVIDE_IFELSE([AC_PROG_FC], + [LT_LANG(FC)], + [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) + +dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal +dnl pulling things in needlessly. +AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([LT_PROG_GCJ], + [LT_LANG(GCJ)], + [m4_ifdef([AC_PROG_GCJ], + [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([A][M_PROG_GCJ], + [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([LT_PROG_GCJ], + [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) + +AC_PROVIDE_IFELSE([AC_PROG_GO], + [LT_LANG(GO)], + [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) + +AC_PROVIDE_IFELSE([LT_PROG_RC], + [LT_LANG(RC)], + [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) +])# _LT_LANG_DEFAULT_CONFIG + +# Obsolete macros: +AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) +AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) +AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) +AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) +AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_CXX], []) +dnl AC_DEFUN([AC_LIBTOOL_F77], []) +dnl AC_DEFUN([AC_LIBTOOL_FC], []) +dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) +dnl AC_DEFUN([AC_LIBTOOL_RC], []) + + +# _LT_TAG_COMPILER +# ---------------- +m4_defun([_LT_TAG_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl +_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl +_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl +_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC +])# _LT_TAG_COMPILER + + +# _LT_COMPILER_BOILERPLATE +# ------------------------ +# Check for compiler boilerplate output or warnings with +# the simple compiler test code. +m4_defun([_LT_COMPILER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* +])# _LT_COMPILER_BOILERPLATE + + +# _LT_LINKER_BOILERPLATE +# ---------------------- +# Check for linker boilerplate output or warnings with +# the simple link test code. +m4_defun([_LT_LINKER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* +])# _LT_LINKER_BOILERPLATE + +# _LT_REQUIRED_DARWIN_CHECKS +# ------------------------- +m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ + case $host_os in + rhapsody* | darwin*) + AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) + AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) + AC_CHECK_TOOL([LIPO], [lipo], [:]) + AC_CHECK_TOOL([OTOOL], [otool], [:]) + AC_CHECK_TOOL([OTOOL64], [otool64], [:]) + _LT_DECL([], [DSYMUTIL], [1], + [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) + _LT_DECL([], [NMEDIT], [1], + [Tool to change global to local symbols on Mac OS X]) + _LT_DECL([], [LIPO], [1], + [Tool to manipulate fat objects and archives on Mac OS X]) + _LT_DECL([], [OTOOL], [1], + [ldd/readelf like tool for Mach-O binaries on Mac OS X]) + _LT_DECL([], [OTOOL64], [1], + [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) + + AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], + [lt_cv_apple_cc_single_mod=no + if test -z "$LT_MULTI_MODULE"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test 0 = "$_lt_result"; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi]) + + AC_CACHE_CHECK([for -exported_symbols_list linker flag], + [lt_cv_ld_exported_symbols_list], + [lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [lt_cv_ld_exported_symbols_list=yes], + [lt_cv_ld_exported_symbols_list=no]) + LDFLAGS=$save_LDFLAGS + ]) + + AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], + [lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD + echo "$AR $AR_FLAGS libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD + $AR $AR_FLAGS libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD + echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD + $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + ]) + case $host_os in + rhapsody* | darwin1.[[012]]) + _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + 10.[[012]][[,.]]*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test yes = "$lt_cv_apple_cc_single_mod"; then + _lt_dar_single_mod='$single_module' + fi + if test yes = "$lt_cv_ld_exported_symbols_list"; then + _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' + fi + if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac +]) + + +# _LT_DARWIN_LINKER_FEATURES([TAG]) +# --------------------------------- +# Checks for linker and compiler features on darwin +m4_defun([_LT_DARWIN_LINKER_FEATURES], +[ + m4_require([_LT_REQUIRED_DARWIN_CHECKS]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_automatic, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + if test yes = "$lt_cv_ld_force_load"; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], + [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='' + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=$_lt_dar_allow_undefined + case $cc_basename in + ifort*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; then + output_verbose_link_cmd=func_echo_all + _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" + m4_if([$1], [CXX], +[ if test yes != "$lt_cv_apple_cc_single_mod"; then + _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" + fi +],[]) + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi +]) + +# _LT_SYS_MODULE_PATH_AIX([TAGNAME]) +# ---------------------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +# Store the results from the different compilers for each TAGNAME. +# Allow to override them for all tags through lt_cv_aix_libpath. +m4_defun([_LT_SYS_MODULE_PATH_AIX], +[m4_require([_LT_DECL_SED])dnl +if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], + [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ + lt_aix_libpath_sed='[ + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }]' + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi],[]) + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=/usr/lib:/lib + fi + ]) + aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) +fi +])# _LT_SYS_MODULE_PATH_AIX + + +# _LT_SHELL_INIT(ARG) +# ------------------- +m4_define([_LT_SHELL_INIT], +[m4_divert_text([M4SH-INIT], [$1 +])])# _LT_SHELL_INIT + + + +# _LT_PROG_ECHO_BACKSLASH +# ----------------------- +# Find how we can fake an echo command that does not interpret backslash. +# In particular, with Autoconf 2.60 or later we add some code to the start +# of the generated configure script that will find a shell with a builtin +# printf (that we can use as an echo command). +m4_defun([_LT_PROG_ECHO_BACKSLASH], +[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +AC_MSG_CHECKING([how to print strings]) +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$[]1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + +case $ECHO in + printf*) AC_MSG_RESULT([printf]) ;; + print*) AC_MSG_RESULT([print -r]) ;; + *) AC_MSG_RESULT([cat]) ;; +esac + +m4_ifdef([_AS_DETECT_SUGGESTED], +[_AS_DETECT_SUGGESTED([ + test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test "X`printf %s $ECHO`" = "X$ECHO" \ + || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) + +_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) +_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) +])# _LT_PROG_ECHO_BACKSLASH + + +# _LT_WITH_SYSROOT +# ---------------- +AC_DEFUN([_LT_WITH_SYSROOT], +[AC_MSG_CHECKING([for sysroot]) +AC_ARG_WITH([sysroot], +[AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@], + [Search for dependent libraries within DIR (or the compiler's sysroot + if not specified).])], +[], [with_sysroot=no]) + +dnl lt_sysroot will always be passed unquoted. We quote it here +dnl in case the user passed a directory name. +lt_sysroot= +case $with_sysroot in #( + yes) + if test yes = "$GCC"; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + AC_MSG_RESULT([$with_sysroot]) + AC_MSG_ERROR([The sysroot must be an absolute path.]) + ;; +esac + + AC_MSG_RESULT([${lt_sysroot:-no}]) +_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl +[dependent libraries, and where our libraries should be installed.])]) + +# _LT_ENABLE_LOCK +# --------------- +m4_defun([_LT_ENABLE_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AS_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test no = "$enable_libtool_lock" || enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out what ABI is being produced by ac_compile, and set mode + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE=32 + ;; + *ELF-64*) + HPUX_IA64_MODE=64 + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test yes = "$lt_cv_prog_gnu_ld"; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +mips64*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + emul=elf + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + emul="${emul}32" + ;; + *64-bit*) + emul="${emul}64" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *MSB*) + emul="${emul}btsmip" + ;; + *LSB*) + emul="${emul}ltsmip" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *N32*) + emul="${emul}n32" + ;; + esac + LD="${LD-ld} -m $emul" + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. Note that the listed cases only cover the + # situations where additional linker options are needed (such as when + # doing 32-bit compilation for a host where ld defaults to 64-bit, or + # vice versa); the common cases where no linker options are needed do + # not appear in the list. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + case `/usr/bin/file conftest.o` in + *x86-64*) + LD="${LD-ld} -m elf32_x86_64" + ;; + *) + LD="${LD-ld} -m elf_i386" + ;; + esac + ;; + powerpc64le-*linux*) + LD="${LD-ld} -m elf32lppclinux" + ;; + powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + powerpcle-*linux*) + LD="${LD-ld} -m elf64lppc" + ;; + powerpc-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test yes != "$lt_cv_cc_needs_belf"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS=$SAVE_CFLAGS + fi + ;; +*-*solaris*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*|x86_64-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD=${LD-ld}_sol2 + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks=$enable_libtool_lock +])# _LT_ENABLE_LOCK + + +# _LT_PROG_AR +# ----------- +m4_defun([_LT_PROG_AR], +[AC_CHECK_TOOLS(AR, [ar], false) +: ${AR=ar} +_LT_DECL([], [AR], [1], [The archiver]) + +# Use ARFLAGS variable as AR's operation code to sync the variable naming with +# Automake. If both AR_FLAGS and ARFLAGS are specified, AR_FLAGS should have +# higher priority because thats what people were doing historically (setting +# ARFLAGS for automake and AR_FLAGS for libtool). FIXME: Make the AR_FLAGS +# variable obsoleted/removed. + +test ${AR_FLAGS+y} || AR_FLAGS=${ARFLAGS-cr} +lt_ar_flags=$AR_FLAGS +_LT_DECL([], [lt_ar_flags], [0], [Flags to create an archive (by configure)]) + +# Make AR_FLAGS overridable by 'make ARFLAGS='. Don't try to run-time override +# by AR_FLAGS because that was never working and AR_FLAGS is about to die. +_LT_DECL([], [AR_FLAGS], [\@S|@{ARFLAGS-"\@S|@lt_ar_flags"}], + [Flags to create an archive]) + +AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], + [lt_cv_ar_at_file=no + AC_COMPILE_IFELSE([AC_LANG_PROGRAM], + [echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' + AC_TRY_EVAL([lt_ar_try]) + if test 0 -eq "$ac_status"; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + AC_TRY_EVAL([lt_ar_try]) + if test 0 -ne "$ac_status"; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + ]) + ]) + +if test no = "$lt_cv_ar_at_file"; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi +_LT_DECL([], [archiver_list_spec], [1], + [How to feed a file listing to the archiver]) +])# _LT_PROG_AR + + +# _LT_CMD_OLD_ARCHIVE +# ------------------- +m4_defun([_LT_CMD_OLD_ARCHIVE], +[_LT_PROG_AR + +AC_CHECK_TOOL(STRIP, strip, :) +test -z "$STRIP" && STRIP=: +_LT_DECL([], [STRIP], [1], [A symbol stripping program]) + +AC_CHECK_TOOL(RANLIB, ranlib, :) +test -z "$RANLIB" && RANLIB=: +_LT_DECL([], [RANLIB], [1], + [Commands used to install an old-style archive]) + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + bitrig* | openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac +_LT_DECL([], [old_postinstall_cmds], [2]) +_LT_DECL([], [old_postuninstall_cmds], [2]) +_LT_TAGDECL([], [old_archive_cmds], [2], + [Commands used to build an old-style archive]) +_LT_DECL([], [lock_old_archive_extraction], [0], + [Whether to use a lock for old archive extraction]) +])# _LT_CMD_OLD_ARCHIVE + + +# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([_LT_COMPILER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + fi + $RM conftest* +]) + +if test yes = "[$]$2"; then + m4_if([$5], , :, [$5]) +else + m4_if([$6], , :, [$6]) +fi +])# _LT_COMPILER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) + + +# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------- +# Check whether the given linker option works +AC_DEFUN([_LT_LINKER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $3" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + else + $2=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS +]) + +if test yes = "[$]$2"; then + m4_if([$4], , :, [$4]) +else + m4_if([$5], , :, [$5]) +fi +])# _LT_LINKER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) + + +# LT_CMD_MAX_LEN +#--------------- +AC_DEFUN([LT_CMD_MAX_LEN], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + teststring=ABCD + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len" && \ + test undefined != "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test X`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test 17 != "$i" # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac +]) +if test -n "$lt_cv_sys_max_cmd_len"; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +max_cmd_len=$lt_cv_sys_max_cmd_len +_LT_DECL([], [max_cmd_len], [0], + [What is the maximum length of a command?]) +])# LT_CMD_MAX_LEN + +# Old name: +AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) + + +# _LT_HEADER_DLFCN +# ---------------- +m4_defun([_LT_HEADER_DLFCN], +[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl +])# _LT_HEADER_DLFCN + + +# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# ---------------------------------------------------------------- +m4_defun([_LT_TRY_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test yes = "$cross_compiling"; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +[#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +}] +_LT_EOF + if AC_TRY_EVAL(ac_link) && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_dlunknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_TRY_DLOPEN_SELF + + +# LT_SYS_DLOPEN_SELF +# ------------------ +AC_DEFUN([LT_SYS_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test yes != "$enable_dlopen"; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen=load_add_on + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen=LoadLibrary + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],[ + lt_cv_dlopen=dyld + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + tpf*) + # Don't try to run any link tests for TPF. We know it's impossible + # because TPF is a cross-compiler, and we know how we open DSOs. + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + lt_cv_dlopen_self=no + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen=shl_load], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen=dlopen], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test no = "$lt_cv_dlopen"; then + enable_dlopen=no + else + enable_dlopen=yes + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS=$CPPFLAGS + test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS=$LDFLAGS + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS=$LIBS + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test yes = "$lt_cv_dlopen_self"; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS=$save_CPPFLAGS + LDFLAGS=$save_LDFLAGS + LIBS=$save_LIBS + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +_LT_DECL([dlopen_support], [enable_dlopen], [0], + [Whether dlopen is supported]) +_LT_DECL([dlopen_self], [enable_dlopen_self], [0], + [Whether dlopen of programs is supported]) +_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], + [Whether dlopen of statically linked programs is supported]) +])# LT_SYS_DLOPEN_SELF + +# Old name: +AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) + + +# _LT_COMPILER_C_O([TAGNAME]) +# --------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler. +# This macro does not hard code the compiler like AC_PROG_CC_C_O. +m4_defun([_LT_COMPILER_C_O], +[m4_require([_LT_DECL_SED])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . 2>&AS_MESSAGE_LOG_FD + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* +]) +_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], + [Does compiler simultaneously support -c and -o options?]) +])# _LT_COMPILER_C_O + + +# _LT_COMPILER_FILE_LOCKS([TAGNAME]) +# ---------------------------------- +# Check to see if we can do hard links to lock some files if needed +m4_defun([_LT_COMPILER_FILE_LOCKS], +[m4_require([_LT_ENABLE_LOCK])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_COMPILER_C_O([$1]) + +hard_links=nottested +if test no = "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" && test no != "$need_locks"; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test no = "$hard_links"; then + AC_MSG_WARN(['$CC' does not support '-c -o', so 'make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi +_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) +])# _LT_COMPILER_FILE_LOCKS + + +# _LT_CHECK_OBJDIR +# ---------------- +m4_defun([_LT_CHECK_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +_LT_DECL([], [objdir], [0], + [The name of the directory that contains temporary libtool files])dnl +m4_pattern_allow([LT_OBJDIR])dnl +AC_DEFINE_UNQUOTED([LT_OBJDIR], "$lt_cv_objdir/", + [Define to the sub-directory where libtool stores uninstalled libraries.]) +])# _LT_CHECK_OBJDIR + + +# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) +# -------------------------------------- +# Check hardcoding attributes. +m4_defun([_LT_LINKER_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || + test -n "$_LT_TAGVAR(runpath_var, $1)" || + test yes = "$_LT_TAGVAR(hardcode_automatic, $1)"; then + + # We can hardcode non-existent directories. + if test no != "$_LT_TAGVAR(hardcode_direct, $1)" && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" && + test no != "$_LT_TAGVAR(hardcode_minus_L, $1)"; then + # Linking always hardcodes the temporary library directory. + _LT_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) + +if test relink = "$_LT_TAGVAR(hardcode_action, $1)" || + test yes = "$_LT_TAGVAR(inherit_rpath, $1)"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi +_LT_TAGDECL([], [hardcode_action], [0], + [How to hardcode a shared library path into an executable]) +])# _LT_LINKER_HARDCODE_LIBPATH + + +# _LT_CMD_STRIPLIB +# ---------------- +m4_defun([_LT_CMD_STRIPLIB], +[m4_require([_LT_DECL_EGREP]) +striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -z "$STRIP"; then + AC_MSG_RESULT([no]) +else + if $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + old_striplib="$STRIP --strip-debug" + striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) + else + case $host_os in + darwin*) + # FIXME - insert some real tests, host_os isn't really good enough + striplib="$STRIP -x" + old_striplib="$STRIP -S" + AC_MSG_RESULT([yes]) + ;; + freebsd*) + if $STRIP -V 2>&1 | $GREP "elftoolchain" >/dev/null; then + old_striplib="$STRIP --strip-debug" + striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac + fi +fi +_LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) +_LT_DECL([], [striplib], [1]) +])# _LT_CMD_STRIPLIB + + +# _LT_PREPARE_MUNGE_PATH_LIST +# --------------------------- +# Make sure func_munge_path_list() is defined correctly. +m4_defun([_LT_PREPARE_MUNGE_PATH_LIST], +[[# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x@S|@2 in + x) + ;; + *:) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\" + ;; + x:*) + eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\" + ;; + *) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + esac +} +]])# _LT_PREPARE_PATH_LIST + + +# _LT_SYS_DYNAMIC_LINKER([TAG]) +# ----------------------------- +# PORTME Fill in your ld.so characteristics +m4_defun([_LT_SYS_DYNAMIC_LINKER], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_OBJDUMP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl +AC_MSG_CHECKING([dynamic linker characteristics]) +m4_if([$1], + [], [ +if test yes = "$GCC"; then + case $host_os in + darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; + *) lt_awk_arg='/^libraries:/' ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq='s|=\([[A-Za-z]]:\)|\1|g' ;; + *) lt_sed_strip_eq='s|=/|/|g' ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary... + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + # ...but if some path component already ends with the multilib dir we assume + # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). + case "$lt_multi_os_dir; $lt_search_path_spec " in + "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) + lt_multi_os_dir= + ;; + esac + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" + elif test -n "$lt_multi_os_dir"; then + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS = " "; FS = "/|\n";} { + lt_foo = ""; + lt_count = 0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo = "/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[[lt_foo]]++; } + if (lt_freq[[lt_foo]] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's|/\([[A-Za-z]]:\)|\1|g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=.so +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +AC_ARG_VAR([LT_SYS_LIBRARY_PATH], +[User-defined run-time library search path.]) + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='$libname$release$shared_ext$major' + ;; + +aix[[4-9]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test ia64 = "$host_cpu"; then + # AIX 5 supports IA64 + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line '#! .'. This would cause the generated library to + # depend on '.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a[(]lib.so.V[)]' + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)]" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)], lib.a[(]lib.so.V[)]" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a[(]lib.so.V[)], lib.so.V[(]$shared_archive_member_spec.o[)]" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='$libname$shared_ext' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[[45]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl* | *,icl*) + # Native MSVC or ICC + libname_spec='$name' + soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec=$LIB + if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC and ICC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' + soname_spec='$libname$release$major$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[[23]].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[[01]]* | freebsdelf3.[[01]]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ + freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + if test 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[[3-9]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test yes = "$lt_cv_prog_gnu_ld"; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], + [lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ + LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], + [lt_cv_shlibpath_overrides_runpath=yes])]) + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + ]) + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec; then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' + soname_spec='$libname$shared_ext.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=sco + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + +_LT_DECL([], [variables_saved_for_relink], [1], + [Variables whose values should be saved in libtool wrapper scripts and + restored at link time]) +_LT_DECL([], [need_lib_prefix], [0], + [Do we need the "lib" prefix for modules?]) +_LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) +_LT_DECL([], [version_type], [0], [Library versioning type]) +_LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) +_LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) +_LT_DECL([], [shlibpath_overrides_runpath], [0], + [Is shlibpath searched before the hard-coded library search path?]) +_LT_DECL([], [libname_spec], [1], [Format of library name prefix]) +_LT_DECL([], [library_names_spec], [1], + [[List of archive names. First name is the real one, the rest are links. + The last name is the one that the linker finds with -lNAME]]) +_LT_DECL([], [soname_spec], [1], + [[The coded name of the library, if different from the real name]]) +_LT_DECL([], [install_override_mode], [1], + [Permission mode override for installation of shared libraries]) +_LT_DECL([], [postinstall_cmds], [2], + [Command to use after installation of a shared archive]) +_LT_DECL([], [postuninstall_cmds], [2], + [Command to use after uninstallation of a shared archive]) +_LT_DECL([], [finish_cmds], [2], + [Commands used to finish a libtool library installation in a directory]) +_LT_DECL([], [finish_eval], [1], + [[As "finish_cmds", except a single script fragment to be evaled but + not shown]]) +_LT_DECL([], [hardcode_into_libs], [0], + [Whether we should hardcode library paths into libraries]) +_LT_DECL([], [sys_lib_search_path_spec], [2], + [Compile-time system search path for libraries]) +_LT_DECL([sys_lib_dlsearch_path_spec], [configure_time_dlsearch_path], [2], + [Detected run-time system search path for libraries]) +_LT_DECL([], [configure_time_lt_sys_library_path], [2], + [Explicit LT_SYS_LIBRARY_PATH set during ./configure time]) +])# _LT_SYS_DYNAMIC_LINKER + + +# _LT_PATH_TOOL_PREFIX(TOOL) +# -------------------------- +# find a file program that can recognize shared library +AC_DEFUN([_LT_PATH_TOOL_PREFIX], +[m4_require([_LT_DECL_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="m4_if([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$1"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD=$lt_cv_path_MAGIC_CMD + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD + ;; +esac]) +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +_LT_DECL([], [MAGIC_CMD], [0], + [Used to examine libraries when file_magic_cmd begins with "file"])dnl +])# _LT_PATH_TOOL_PREFIX + +# Old name: +AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) + + +# _LT_PATH_MAGIC +# -------------- +# find a file program that can recognize a shared library +m4_defun([_LT_PATH_MAGIC], +[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# _LT_PATH_MAGIC + + +# LT_PATH_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([LT_PATH_LD], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PROG_ECHO_BACKSLASH])dnl + +AC_ARG_WITH([gnu-ld], + [AS_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test no = "$withval" || with_gnu_ld=yes], + [with_gnu_ld=no])dnl + +ac_prog=ld +if test yes = "$GCC"; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return, which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD=$ac_prog + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test yes = "$with_gnu_ld"; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD=$ac_dir/$ac_prog + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 conftest.i +cat conftest.i conftest.i >conftest2.i +: ${lt_DD:=$DD} +AC_PATH_PROGS_FEATURE_CHECK([lt_DD], [dd], +[if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: +fi]) +rm -f conftest.i conftest2.i conftest.out]) +])# _LT_PATH_DD + + +# _LT_CMD_TRUNCATE +# ---------------- +# find command to truncate a binary pipe +m4_defun([_LT_CMD_TRUNCATE], +[m4_require([_LT_PATH_DD]) +AC_CACHE_CHECK([how to truncate binary pipes], [lt_cv_truncate_bin], +[printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +lt_cv_truncate_bin= +if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" +fi +rm -f conftest.i conftest2.i conftest.out +test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"]) +_LT_DECL([lt_truncate_bin], [lt_cv_truncate_bin], [1], + [Command to truncate a binary pipe]) +])# _LT_CMD_TRUNCATE + + +# _LT_CHECK_MAGIC_METHOD +# ---------------------- +# how to check for library dependencies +# -- PORTME fill in with the dynamic library characteristics +m4_defun([_LT_CHECK_MAGIC_METHOD], +[m4_require([_LT_DECL_EGREP]) +m4_require([_LT_DECL_OBJDUMP]) +AC_CACHE_CHECK([how to recognize dependent libraries], +lt_cv_deplibs_check_method, +[lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# 'unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# that responds to the $file_magic_cmd with a given extended regex. +# If you have 'file' or equivalent on your system and you're not sure +# whether 'pass_all' will *always* work, you probably want this one. + +case $host_os in +aix[[4-9]]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[[45]]*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + if ( file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[[3-9]]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd* | bitrig*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +os2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + +_LT_DECL([], [deplibs_check_method], [1], + [Method to check whether dependent libraries are shared objects]) +_LT_DECL([], [file_magic_cmd], [1], + [Command to use when deplibs_check_method = "file_magic"]) +_LT_DECL([], [file_magic_glob], [1], + [How to find potential files when deplibs_check_method = "file_magic"]) +_LT_DECL([], [want_nocaseglob], [1], + [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) +])# _LT_CHECK_MAGIC_METHOD + + +# LT_PATH_NM +# ---------- +# find the pathname to a BSD- or MS-compatible name lister +AC_DEFUN([LT_PATH_NM], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM=$NM +else + lt_nm_to_check=${ac_tool_prefix}nm + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + tmp_nm=$ac_dir/$lt_tmp_nm + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the 'sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty + case $build_os in + mingw*) lt_bad_file=conftest.nm/nofile ;; + *) lt_bad_file=/dev/null ;; + esac + case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in + *$lt_bad_file* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break 2 + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break 2 + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS=$lt_save_ifs + done + : ${lt_cv_path_NM=no} +fi]) +if test no != "$lt_cv_path_NM"; then + NM=$lt_cv_path_NM +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) + case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols -headers" + ;; + *) + DUMPBIN=: + ;; + esac + fi + AC_SUBST([DUMPBIN]) + if test : != "$DUMPBIN"; then + NM=$DUMPBIN + fi +fi +test -z "$NM" && NM=nm +AC_SUBST([NM]) +_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl + +AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], + [lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) + cat conftest.out >&AS_MESSAGE_LOG_FD + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest*]) +])# LT_PATH_NM + +# Old names: +AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) +AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_PROG_NM], []) +dnl AC_DEFUN([AC_PROG_NM], []) + +# _LT_CHECK_SHAREDLIB_FROM_LINKLIB +# -------------------------------- +# how to determine the name of the shared library +# associated with a specific link library. +# -- PORTME fill in with the dynamic library characteristics +m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], +[m4_require([_LT_DECL_EGREP]) +m4_require([_LT_DECL_OBJDUMP]) +m4_require([_LT_DECL_DLLTOOL]) +AC_CACHE_CHECK([how to associate runtime and link libraries], +lt_cv_sharedlib_from_linklib_cmd, +[lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh; + # decide which one to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd=$ECHO + ;; +esac +]) +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + +_LT_DECL([], [sharedlib_from_linklib_cmd], [1], + [Command to associate shared and link libraries]) +])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB + + +# _LT_PATH_MANIFEST_TOOL +# ---------------------- +# locate the manifest tool +m4_defun([_LT_PATH_MANIFEST_TOOL], +[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], + [lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&AS_MESSAGE_LOG_FD + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest*]) +if test yes != "$lt_cv_path_mainfest_tool"; then + MANIFEST_TOOL=: +fi +_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl +])# _LT_PATH_MANIFEST_TOOL + + +# _LT_DLL_DEF_P([FILE]) +# --------------------- +# True iff FILE is a Windows DLL '.def' file. +# Keep in sync with func_dll_def_p in the libtool script +AC_DEFUN([_LT_DLL_DEF_P], +[dnl + test DEF = "`$SED -n dnl + -e '\''s/^[[ ]]*//'\'' dnl Strip leading whitespace + -e '\''/^\(;.*\)*$/d'\'' dnl Delete empty lines and comments + -e '\''s/^\(EXPORTS\|LIBRARY\)\([[ ]].*\)*$/DEF/p'\'' dnl + -e q dnl Only consider the first "real" line + $1`" dnl +])# _LT_DLL_DEF_P + + +# LT_LIB_M +# -------- +# check for math library +AC_DEFUN([LT_LIB_M], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=-lmw) + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM=-lm) + ;; +esac +AC_SUBST([LIBM]) +])# LT_LIB_M + +# Old name: +AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_CHECK_LIBM], []) + + +# _LT_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------- +m4_defun([_LT_COMPILER_NO_RTTI], +[m4_require([_LT_TAG_COMPILER])dnl + +_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test yes = "$GCC"; then + case $cc_basename in + nvcc*) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; + *) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; + esac + + _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], + [Compiler flag to turn off builtin functions]) +])# _LT_COMPILER_NO_RTTI + + +# _LT_CMD_GLOBAL_SYMBOLS +# ---------------------- +m4_defun([_LT_CMD_GLOBAL_SYMBOLS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([LT_PATH_NM])dnl +AC_REQUIRE([LT_PATH_LD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_TAG_COMPILER])dnl + +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) + if test ia64 = "$host_cpu"; then + symcode='[[ABCDEGRST]]' + fi + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris*) + symcode='[[BDRT]]' + ;; +sco3.2v5*) + symcode='[[DT]]' + ;; +sysv4.2uw2*) + symcode='[[DT]]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[[ABDT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGIRSTW]]' ;; +esac + +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Gets list of data symbols to import. + lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" + # Adjust the below global symbol transforms to fixup imported variables. + lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" + lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" + lt_c_name_lib_hook="\ + -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ + -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" +else + # Disable hooks by default. + lt_cv_sys_global_symbol_to_import= + lt_cdecl_hook= + lt_c_name_hook= + lt_c_name_lib_hook= +fi + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n"\ +$lt_cdecl_hook\ +" -e 's/^T .* \(.*\)$/extern int \1();/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ +$lt_c_name_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" + +# Transform an extracted symbol line into symbol name with lib prefix and +# symbol address. +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ +$lt_c_name_lib_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function, + # D for any global variable and I for any imported variable. + # Also find C++ and __fastcall symbols from MSVC++ or ICC, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK ['"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ +" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ +" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ +" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ +" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx]" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if AC_TRY_EVAL(ac_compile); then + # Now try to grab the symbols. + nlist=conftest.nm + if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT@&t@_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT@&t@_DLSYM_CONST +#else +# define LT@&t@_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT@&t@_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[[]] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS=conftstm.$ac_objext + CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest$ac_exeext; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test yes = "$pipe_works"; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + +_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], + [Take the output of nm and produce a listing of raw symbols and C names]) +_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], + [Transform the output of nm in a proper C declaration]) +_LT_DECL([global_symbol_to_import], [lt_cv_sys_global_symbol_to_import], [1], + [Transform the output of nm into a list of symbols to manually relocate]) +_LT_DECL([global_symbol_to_c_name_address], + [lt_cv_sys_global_symbol_to_c_name_address], [1], + [Transform the output of nm in a C name address pair]) +_LT_DECL([global_symbol_to_c_name_address_lib_prefix], + [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], + [Transform the output of nm in a C name address pair when lib prefix is needed]) +_LT_DECL([nm_interface], [lt_cv_nm_interface], [1], + [The name lister interface]) +_LT_DECL([], [nm_file_list_spec], [1], + [Specify filename containing input files for $NM]) +]) # _LT_CMD_GLOBAL_SYMBOLS + + +# _LT_COMPILER_PIC([TAGNAME]) +# --------------------------- +m4_defun([_LT_COMPILER_PIC], +[m4_require([_LT_TAG_COMPILER])dnl +_LT_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_TAGVAR(lt_prog_compiler_static, $1)= + +m4_if([$1], [CXX], [ + # C++ specific cases for pic, static, wl, etc. + if test yes = "$GXX"; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix[[4-9]]*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + dgux*) + case $cc_basename in + ec++*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' + if test ia64 != "$host_cpu"; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # KAI C++ Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64, which still supported -KPIC. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx*) + # Digital/Compaq C++ + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc*) + # Lucid + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test yes = "$GCC"; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' + if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + case $cc_basename in + nagfor*) + # NAG Fortran compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + + hpux9* | hpux10* | hpux11*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + # old Intel for x86_64, which still supported -KPIC. + ecc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' + _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' + ;; + nagfor*) + # NAG Fortran compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + ccc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='' + ;; + *Sun\ F* | *Sun*Fortran*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + *Intel*\ [[CF]]*Compiler*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + *Portland\ Group*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + rdos*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + solaris*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; + *) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; + esac + ;; + + sunos4*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + unicos*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + + uts4*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +case $host_os in + # For platforms that do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" + ;; +esac + +AC_CACHE_CHECK([for $compiler option to produce PIC], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) +_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], + [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], + [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], + [Additional compiler flags for building library objects]) + +_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], + [How to pass a linker flag through the compiler]) +# +# Check to make sure the static flag actually works. +# +wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" +_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], + _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), + $lt_tmp_static_flag, + [], + [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) +_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], + [Compiler flag to prevent dynamic linking]) +])# _LT_COMPILER_PIC + + +# _LT_LINKER_SHLIBS([TAGNAME]) +# ---------------------------- +# See if the linker supports building shared libraries. +m4_defun([_LT_LINKER_SHLIBS], +[AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +m4_if([$1], [CXX], [ + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + case $host_os in + aix[[4-9]]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds + ;; + cygwin* | mingw* | cegcc*) + case $cc_basename in + cl* | icl*) + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + ;; + esac + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac +], [ + runpath_var= + _LT_TAGVAR(allow_undefined_flag, $1)= + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(archive_cmds, $1)= + _LT_TAGVAR(archive_expsym_cmds, $1)= + _LT_TAGVAR(compiler_needs_object, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(hardcode_automatic, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(hardcode_libdir_separator, $1)= + _LT_TAGVAR(hardcode_minus_L, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_TAGVAR(inherit_rpath, $1)=no + _LT_TAGVAR(link_all_deplibs, $1)=unknown + _LT_TAGVAR(module_cmds, $1)= + _LT_TAGVAR(module_expsym_cmds, $1)= + _LT_TAGVAR(old_archive_from_new_cmds, $1)= + _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_TAGVAR(thread_safe_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ' (' and ')$', so one must not match beginning or + # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', + # as well as any symbol that contains 'd'. + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. +dnl Note also adjust exclude_expsyms for C++ above. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ and ICC port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++ or Intel C++ Compiler. + if test yes != "$GCC"; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++ or ICC) + with_gnu_ld=yes + ;; + openbsd* | bitrig*) + with_gnu_ld=no + ;; + esac + + _LT_TAGVAR(ld_shlibs, $1)=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test yes = "$with_gnu_ld"; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; + *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test yes = "$lt_use_gnu_ld_interface"; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='$wl' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + supports_anon_versioning=no + case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[[3-9]]*) + # On AIX/PPC, the GNU linker is very broken + if test ia64 != "$host_cpu"; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test linux-dietlibc = "$host_os"; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test no = "$tmp_diet" + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + _LT_TAGVAR(whole_archive_flag_spec, $1)= + tmp_sharedflag='--shared' ;; + nagfor*) # NAGFOR 5.3 + tmp_sharedflag='-Wl,-shared' ;; + xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + + if test yes = "$supports_anon_versioning"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + tcc*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic' + ;; + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test yes = "$supports_anon_versioning"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + sunos4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test no = "$_LT_TAGVAR(ld_shlibs, $1)"; then + runpath_var= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix[[4-9]]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then + aix_use_runtimelinking=yes + break + fi + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # traditional, no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + ;; + esac + + if test yes = "$GCC"; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag="$shared_flag "'$wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + bsdi[[45]]*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++ or Intel C++ Compiler. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl* | icl*) + # Native MSVC or ICC + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC and ICC wrapper + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + esac + ;; + + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + ;; + + hpux10*) + if test yes,no = "$GCC,$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + fi + ;; + + hpux11*) + if test yes,no = "$GCC,$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + m4_if($1, [], [ + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + _LT_LINKER_OPTION([if $CC understands -b], + _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], + [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) + ;; + esac + fi + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], + [lt_cv_irix_exported_symbol], + [save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" + AC_LINK_IFELSE( + [AC_LANG_SOURCE( + [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], + [C++], [[int foo (void) { return 0; }]], + [Fortran 77], [[ + subroutine foo + end]], + [Fortran], [[ + subroutine foo + end]])])], + [lt_cv_irix_exported_symbol=yes], + [lt_cv_irix_exported_symbol=no]) + LDFLAGS=$save_LDFLAGS]) + if test yes = "$lt_cv_irix_exported_symbol"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' + fi + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + linux*) + case $cc_basename in + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + _LT_TAGVAR(ld_shlibs, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *nto* | *qnx*) + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + fi + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + ;; + + osf3*) + if test yes = "$GCC"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test yes = "$GCC"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + solaris*) + _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' + if test yes = "$GCC"; then + wlarc='$wl' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + _LT_TAGVAR(archive_cmds, $1)='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='$wl' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. GCC discards it without '$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test yes = "$GCC"; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + fi + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test sequent = "$host_vendor"; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + if test sni = "$host_vendor"; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Blargedynsym' + ;; + esac + fi + fi +]) +AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) +test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no + +_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld + +_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl +_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl +_LT_DECL([], [extract_expsyms_cmds], [2], + [The commands to extract the exported symbol list from a shared archive]) + +# +# Do we need to explicitly link libc? +# +case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test yes,yes = "$GCC,$enable_shared"; then + case $_LT_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_CACHE_CHECK([whether -lc should be explicitly linked in], + [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), + [$RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) + pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) + _LT_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) + then + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no + else + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + ]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) + ;; + esac + fi + ;; +esac + +_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], + [Whether or not to add -lc for building shared libraries]) +_LT_TAGDECL([allow_libtool_libs_with_static_runtimes], + [enable_shared_with_static_runtimes], [0], + [Whether or not to disallow shared libs when runtime libs are static]) +_LT_TAGDECL([], [export_dynamic_flag_spec], [1], + [Compiler flag to allow reflexive dlopens]) +_LT_TAGDECL([], [whole_archive_flag_spec], [1], + [Compiler flag to generate shared objects directly from archives]) +_LT_TAGDECL([], [compiler_needs_object], [1], + [Whether the compiler copes with passing no objects directly]) +_LT_TAGDECL([], [old_archive_from_new_cmds], [2], + [Create an old-style archive from a shared archive]) +_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], + [Create a temporary old-style archive to link instead of a shared archive]) +_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) +_LT_TAGDECL([], [archive_expsym_cmds], [2]) +_LT_TAGDECL([], [module_cmds], [2], + [Commands used to build a loadable module if different from building + a shared archive.]) +_LT_TAGDECL([], [module_expsym_cmds], [2]) +_LT_TAGDECL([], [with_gnu_ld], [1], + [Whether we are building with GNU ld or not]) +_LT_TAGDECL([], [allow_undefined_flag], [1], + [Flag that allows shared libraries with undefined symbols to be built]) +_LT_TAGDECL([], [no_undefined_flag], [1], + [Flag that enforces no undefined symbols]) +_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], + [Flag to hardcode $libdir into a binary during linking. + This must work even if $libdir does not exist]) +_LT_TAGDECL([], [hardcode_libdir_separator], [1], + [Whether we need a single "-rpath" flag with a separated argument]) +_LT_TAGDECL([], [hardcode_direct], [0], + [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes + DIR into the resulting binary]) +_LT_TAGDECL([], [hardcode_direct_absolute], [0], + [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes + DIR into the resulting binary and the resulting library dependency is + "absolute", i.e impossible to change by setting $shlibpath_var if the + library is relocated]) +_LT_TAGDECL([], [hardcode_minus_L], [0], + [Set to "yes" if using the -LDIR flag during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_shlibpath_var], [0], + [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_automatic], [0], + [Set to "yes" if building a shared library automatically hardcodes DIR + into the library and all subsequent libraries and executables linked + against it]) +_LT_TAGDECL([], [inherit_rpath], [0], + [Set to yes if linker adds runtime paths of dependent libraries + to runtime path list]) +_LT_TAGDECL([], [link_all_deplibs], [0], + [Whether libtool must link a program against all its dependency libraries]) +_LT_TAGDECL([], [always_export_symbols], [0], + [Set to "yes" if exported symbols are required]) +_LT_TAGDECL([], [export_symbols_cmds], [2], + [The commands to list exported symbols]) +_LT_TAGDECL([], [exclude_expsyms], [1], + [Symbols that should not be listed in the preloaded symbols]) +_LT_TAGDECL([], [include_expsyms], [1], + [Symbols that must always be exported]) +_LT_TAGDECL([], [prelink_cmds], [2], + [Commands necessary for linking programs (against libraries) with templates]) +_LT_TAGDECL([], [postlink_cmds], [2], + [Commands necessary for finishing linking programs]) +_LT_TAGDECL([], [file_list_spec], [1], + [Specify filename containing input files]) +dnl FIXME: Not yet implemented +dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], +dnl [Compiler flag to generate thread safe objects]) +])# _LT_LINKER_SHLIBS + + +# _LT_LANG_C_CONFIG([TAG]) +# ------------------------ +# Ensure that the configuration variables for a C compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_C_CONFIG], +[m4_require([_LT_DECL_EGREP])dnl +lt_save_CC=$CC +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + +_LT_TAG_COMPILER +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + LT_SYS_DLOPEN_SELF + _LT_CMD_STRIPLIB + + # Report what library types will actually be built + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_CONFIG($1) +fi +AC_LANG_POP +CC=$lt_save_CC +])# _LT_LANG_C_CONFIG + + +# _LT_LANG_CXX_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a C++ compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_CXX_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +if test -n "$CXX" && ( test no != "$CXX" && + ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || + (test g++ != "$CXX"))); then + AC_PROG_CXXCPP +else + _lt_caught_CXX_error=yes +fi + +AC_LANG_PUSH(C++) +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(compiler_needs_object, $1)=no +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_caught_CXX_error"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_CFLAGS=$CFLAGS + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + CFLAGS=$CXXFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test yes = "$GXX"; then + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + else + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + fi + + if test yes = "$GXX"; then + # Set up default GNU C++ configuration + + LT_PATH_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test yes = "$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='$wl' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) + _LT_TAGVAR(ld_shlibs, $1)=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aix[[4-9]]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + ;; + esac + + if test yes = "$GXX"; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag=$shared_flag' $wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + # The "-G" linker flag allows undefined symbols. + _LT_TAGVAR(no_undefined_flag, $1)='-bernotok' + # Determine the default libpath from the value encoded in an empty + # executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared + # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + case $GXX,$cc_basename in + ,cl* | no,cl* | ,icl* | no,icl*) + # Native MSVC or ICC + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # g++ + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + freebsd2.*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + freebsd-elf*) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + hpux9*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' + fi + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) + _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' + _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 6 and above use weak symbols + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl--rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + ;; + cxx*) + # Compaq C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + ;; + xl* | mpixl* | bgxl*) + # IBM XL 8.0 on PPC, with GNU ld + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + if test yes = "$supports_anon_versioning"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + fi + output_verbose_link_cmd=func_echo_all + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + case $host in + osf3*) + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + ;; + *) + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ + $RM $lib.exp' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes,no = "$GXX,$with_gnu_ld"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + case $host in + osf3*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(archive_cmds_need_lc,$1)=yes + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test yes,no = "$GXX,$with_gnu_ld"; then + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + else + # g++ 2.7 appears to require '-G' NOT '-shared' on this + # platform. + _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + fi + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir' + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ + '"$_LT_TAGVAR(old_archive_cmds, $1)" + _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ + '"$_LT_TAGVAR(reload_cmds, $1)" + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) + test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no + + _LT_TAGVAR(GCC, $1)=$GXX + _LT_TAGVAR(LD, $1)=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test yes != "$_lt_caught_CXX_error" + +AC_LANG_POP +])# _LT_LANG_CXX_CONFIG + + +# _LT_FUNC_STRIPNAME_CNF +# ---------------------- +# func_stripname_cnf prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# +# This function is identical to the (non-XSI) version of func_stripname, +# except this one can be used by m4 code that may be executed by configure, +# rather than the libtool script. +m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl +AC_REQUIRE([_LT_DECL_SED]) +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) +func_stripname_cnf () +{ + case @S|@2 in + .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;; + *) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;; + esac +} # func_stripname_cnf +])# _LT_FUNC_STRIPNAME_CNF + + +# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) +# --------------------------------- +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +m4_defun([_LT_SYS_HIDDEN_LIBDEPS], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl +# Dependencies to place before and after the object being linked: +_LT_TAGVAR(predep_objects, $1)= +_LT_TAGVAR(postdep_objects, $1)= +_LT_TAGVAR(predeps, $1)= +_LT_TAGVAR(postdeps, $1)= +_LT_TAGVAR(compiler_lib_search_path, $1)= + +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF +int a; +void foo (void) { a = 0; } +_LT_EOF +], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF +], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer*4 a + a=0 + return + end +_LT_EOF +], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer a + a=0 + return + end +_LT_EOF +], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF +public class foo { + private int a; + public void bar (void) { + a = 0; + } +}; +_LT_EOF +], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF +package foo +func foo() { +} +_LT_EOF +]) + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; +esac + +dnl Parse the compiler output and extract the necessary +dnl objects, libraries and library flags. +if AC_TRY_EVAL(ac_compile); then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case $prev$p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test x-L = "$p" || + test x-R = "$p"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test no = "$pre_test_object_deps_done"; then + case $prev in + -L | -R) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then + _LT_TAGVAR(compiler_lib_search_path, $1)=$prev$p + else + _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} $prev$p" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$_LT_TAGVAR(postdeps, $1)"; then + _LT_TAGVAR(postdeps, $1)=$prev$p + else + _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} $prev$p" + fi + fi + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test no = "$pre_test_object_deps_done"; then + if test -z "$_LT_TAGVAR(predep_objects, $1)"; then + _LT_TAGVAR(predep_objects, $1)=$p + else + _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" + fi + else + if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then + _LT_TAGVAR(postdep_objects, $1)=$p + else + _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling $1 test program" +fi + +$RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken +m4_if([$1], [CXX], +[case $host_os in +interix[[3-9]]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + _LT_TAGVAR(predep_objects,$1)= + _LT_TAGVAR(postdep_objects,$1)= + _LT_TAGVAR(postdeps,$1)= + ;; +esac +]) + +case " $_LT_TAGVAR(postdeps, $1) " in +*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; +esac + _LT_TAGVAR(compiler_lib_search_dirs, $1)= +if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then + _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | $SED -e 's! -L! !g' -e 's!^ !!'` +fi +_LT_TAGDECL([], [compiler_lib_search_dirs], [1], + [The directories searched by this compiler when creating a shared library]) +_LT_TAGDECL([], [predep_objects], [1], + [Dependencies to place before and after the objects being linked to + create a shared library]) +_LT_TAGDECL([], [postdep_objects], [1]) +_LT_TAGDECL([], [predeps], [1]) +_LT_TAGDECL([], [postdeps], [1]) +_LT_TAGDECL([], [compiler_lib_search_path], [1], + [The library search path used internally by the compiler when linking + a shared library]) +])# _LT_SYS_HIDDEN_LIBDEPS + + +# _LT_LANG_F77_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a Fortran 77 compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_F77_CONFIG], +[AC_LANG_PUSH(Fortran 77) +if test -z "$F77" || test no = "$F77"; then + _lt_disable_F77=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the F77 compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_disable_F77"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${F77-"f77"} + CFLAGS=$FFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + GCC=$G77 + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)=$G77 + _LT_TAGVAR(LD, $1)=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS +fi # test yes != "$_lt_disable_F77" + +AC_LANG_POP +])# _LT_LANG_F77_CONFIG + + +# _LT_LANG_FC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for a Fortran compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_FC_CONFIG], +[AC_LANG_PUSH(Fortran) + +if test -z "$FC" || test no = "$FC"; then + _lt_disable_FC=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for fc test sources. +ac_ext=${ac_fc_srcext-f} + +# Object file extension for compiled fc test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the FC compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_disable_FC"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${FC-"f95"} + CFLAGS=$FCFLAGS + compiler=$CC + GCC=$ac_cv_fc_compiler_gnu + + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)=$ac_cv_fc_compiler_gnu + _LT_TAGVAR(LD, $1)=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS +fi # test yes != "$_lt_disable_FC" + +AC_LANG_POP +])# _LT_LANG_FC_CONFIG + + +# _LT_LANG_GCJ_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Java Compiler compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_GCJ_CONFIG], +[AC_REQUIRE([LT_PROG_GCJ])dnl +AC_LANG_SAVE + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}" + +# Code to be used in simple link tests +lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GCJ-"gcj"} +CFLAGS=$GCJFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)=$LD +_LT_CC_BASENAME([$compiler]) + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GCJ_CONFIG + + +# _LT_LANG_GO_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Go compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_GO_CONFIG], +[AC_REQUIRE([LT_PROG_GO])dnl +AC_LANG_SAVE + +# Source file extension for Go test sources. +ac_ext=go + +# Object file extension for compiled Go test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="package main; func main() { }" + +# Code to be used in simple link tests +lt_simple_link_test_code='package main; func main() { }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GOC-"gccgo"} +CFLAGS=$GOFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)=$LD +_LT_CC_BASENAME([$compiler]) + +# Go did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GO_CONFIG + + +# _LT_LANG_RC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for the Windows resource compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_RC_CONFIG], +[AC_REQUIRE([LT_PROG_RC])dnl +AC_LANG_SAVE + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' + +# Code to be used in simple link tests +lt_simple_link_test_code=$lt_simple_compile_test_code + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC= +CC=${RC-"windres"} +CFLAGS= +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) +_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + +if test -n "$compiler"; then + : + _LT_CONFIG($1) +fi + +GCC=$lt_save_GCC +AC_LANG_RESTORE +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_RC_CONFIG + + +# LT_PROG_GCJ +# ----------- +AC_DEFUN([LT_PROG_GCJ], +[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], + [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], + [AC_CHECK_TOOL(GCJ, gcj,) + test set = "${GCJFLAGS+set}" || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS)])])[]dnl +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_GCJ], []) + + +# LT_PROG_GO +# ---------- +AC_DEFUN([LT_PROG_GO], +[AC_CHECK_TOOL(GOC, gccgo,) +]) + + +# LT_PROG_RC +# ---------- +AC_DEFUN([LT_PROG_RC], +[AC_CHECK_TOOL(RC, windres,) +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_RC], []) + + +# _LT_DECL_EGREP +# -------------- +# If we don't have a new enough Autoconf to choose the best grep +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_EGREP], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_REQUIRE([AC_PROG_FGREP])dnl +test -z "$GREP" && GREP=grep +_LT_DECL([], [GREP], [1], [A grep program that handles long lines]) +_LT_DECL([], [EGREP], [1], [An ERE matcher]) +_LT_DECL([], [FGREP], [1], [A literal string matcher]) +dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too +AC_SUBST([GREP]) +]) + + +# _LT_DECL_OBJDUMP +# -------------- +# If we don't have a new enough Autoconf to choose the best objdump +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_OBJDUMP], +[AC_CHECK_TOOL(OBJDUMP, objdump, false) +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) +AC_SUBST([OBJDUMP]) +]) + +# _LT_DECL_DLLTOOL +# ---------------- +# Ensure DLLTOOL variable is set. +m4_defun([_LT_DECL_DLLTOOL], +[AC_CHECK_TOOL(DLLTOOL, dlltool, false) +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program]) +AC_SUBST([DLLTOOL]) +]) + +# _LT_DECL_SED +# ------------ +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +m4_defun([_LT_DECL_SED], +[AC_PROG_SED +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" +_LT_DECL([], [SED], [1], [A sed program that does not truncate output]) +_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], + [Sed that helps us avoid accidentally triggering echo(1) options like -n]) +])# _LT_DECL_SED + +m4_ifndef([AC_PROG_SED], [ +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ + +m4_defun([AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +IFS=$as_save_IFS +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f "$lt_ac_sed" && continue + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test 10 -lt "$lt_ac_count" && break + lt_ac_count=`expr $lt_ac_count + 1` + if test "$lt_ac_count" -gt "$lt_ac_max"; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +]) +SED=$lt_cv_path_SED +AC_SUBST([SED]) +AC_MSG_RESULT([$SED]) +])#AC_PROG_SED +])#m4_ifndef + +# Old name: +AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_SED], []) + + +# _LT_CHECK_SHELL_FEATURES +# ------------------------ +# Find out whether the shell is Bourne or XSI compatible, +# or has some other useful features. +m4_defun([_LT_CHECK_SHELL_FEATURES], +[if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi +_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac +_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl +_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl +])# _LT_CHECK_SHELL_FEATURES + + +# _LT_PATH_CONVERSION_FUNCTIONS +# ----------------------------- +# Determine what file name conversion functions should be used by +# func_to_host_file (and, implicitly, by func_to_host_path). These are needed +# for certain cross-compile configurations and native mingw. +m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_MSG_CHECKING([how to convert $build file names to $host format]) +AC_CACHE_VAL(lt_cv_to_host_file_cmd, +[case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac +]) +to_host_file_cmd=$lt_cv_to_host_file_cmd +AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) +_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], + [0], [convert $build file names to $host format])dnl + +AC_MSG_CHECKING([how to convert $build file names to toolchain format]) +AC_CACHE_VAL(lt_cv_to_tool_file_cmd, +[#assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac +]) +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) +_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], + [0], [convert $build files to toolchain format])dnl +])# _LT_PATH_CONVERSION_FUNCTIONS diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/m4/ltoptions.m4 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/m4/ltoptions.m4 new file mode 100755 index 000000000..07421d929 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/m4/ltoptions.m4 @@ -0,0 +1,437 @@ +# Helper functions for option handling. -*- Autoconf -*- +# +# Copyright (C) 2004-2005, 2007-2009, 2011-2018 Free Software +# Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 8 ltoptions.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) + + +# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) +# ------------------------------------------ +m4_define([_LT_MANGLE_OPTION], +[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) + + +# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) +# --------------------------------------- +# Set option OPTION-NAME for macro MACRO-NAME, and if there is a +# matching handler defined, dispatch to it. Other OPTION-NAMEs are +# saved as a flag. +m4_define([_LT_SET_OPTION], +[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl +m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), + _LT_MANGLE_DEFUN([$1], [$2]), + [m4_warning([Unknown $1 option '$2'])])[]dnl +]) + + +# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) +# ------------------------------------------------------------ +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +m4_define([_LT_IF_OPTION], +[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) + + +# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) +# ------------------------------------------------------- +# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME +# are set. +m4_define([_LT_UNLESS_OPTIONS], +[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), + [m4_define([$0_found])])])[]dnl +m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 +])[]dnl +]) + + +# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) +# ---------------------------------------- +# OPTION-LIST is a space-separated list of Libtool options associated +# with MACRO-NAME. If any OPTION has a matching handler declared with +# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about +# the unknown option and exit. +m4_defun([_LT_SET_OPTIONS], +[# Set options +m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [_LT_SET_OPTION([$1], _LT_Option)]) + +m4_if([$1],[LT_INIT],[ + dnl + dnl Simply set some default values (i.e off) if boolean options were not + dnl specified: + _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no + ]) + _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no + ]) + dnl + dnl If no reference was made to various pairs of opposing options, then + dnl we run the default mode handler for the pair. For example, if neither + dnl 'shared' nor 'disable-shared' was passed, we enable building of shared + dnl archives by default: + _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) + _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], + [_LT_ENABLE_FAST_INSTALL]) + _LT_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4], + [_LT_WITH_AIX_SONAME([aix])]) + ]) +])# _LT_SET_OPTIONS + + +## --------------------------------- ## +## Macros to handle LT_INIT options. ## +## --------------------------------- ## + +# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) +# ----------------------------------------- +m4_define([_LT_MANGLE_DEFUN], +[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) + + +# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) +# ----------------------------------------------- +m4_define([LT_OPTION_DEFINE], +[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl +])# LT_OPTION_DEFINE + + +# dlopen +# ------ +LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes +]) + +AU_DEFUN([AC_LIBTOOL_DLOPEN], +[_LT_SET_OPTION([LT_INIT], [dlopen]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the 'dlopen' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) + + +# win32-dll +# --------- +# Declare package support for building win32 dll's. +LT_OPTION_DEFINE([LT_INIT], [win32-dll], +[enable_win32_dll=yes + +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; +esac + +test -z "$AS" && AS=as +_LT_DECL([], [AS], [1], [Assembler program])dnl + +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl + +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl +])# win32-dll + +AU_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +_LT_SET_OPTION([LT_INIT], [win32-dll]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the 'win32-dll' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) + + +# _LT_ENABLE_SHARED([DEFAULT]) +# ---------------------------- +# implement the --enable-shared flag, and supports the 'shared' and +# 'disable-shared' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. +m4_define([_LT_ENABLE_SHARED], +[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([shared], + [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) + + _LT_DECL([build_libtool_libs], [enable_shared], [0], + [Whether or not to build shared libraries]) +])# _LT_ENABLE_SHARED + +LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) +]) + +AC_DEFUN([AC_DISABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], [disable-shared]) +]) + +AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_SHARED], []) +dnl AC_DEFUN([AM_DISABLE_SHARED], []) + + + +# _LT_ENABLE_STATIC([DEFAULT]) +# ---------------------------- +# implement the --enable-static flag, and support the 'static' and +# 'disable-static' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. +m4_define([_LT_ENABLE_STATIC], +[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([static], + [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [enable_static=]_LT_ENABLE_STATIC_DEFAULT) + + _LT_DECL([build_old_libs], [enable_static], [0], + [Whether or not to build static libraries]) +])# _LT_ENABLE_STATIC + +LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) +]) + +AC_DEFUN([AC_DISABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], [disable-static]) +]) + +AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_STATIC], []) +dnl AC_DEFUN([AM_DISABLE_STATIC], []) + + + +# _LT_ENABLE_FAST_INSTALL([DEFAULT]) +# ---------------------------------- +# implement the --enable-fast-install flag, and support the 'fast-install' +# and 'disable-fast-install' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. +m4_define([_LT_ENABLE_FAST_INSTALL], +[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([fast-install], + [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) + +_LT_DECL([fast_install], [enable_fast_install], [0], + [Whether or not to optimize for fast installation])dnl +])# _LT_ENABLE_FAST_INSTALL + +LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) + +# Old names: +AU_DEFUN([AC_ENABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the 'fast-install' option into LT_INIT's first parameter.]) +]) + +AU_DEFUN([AC_DISABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], [disable-fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the 'disable-fast-install' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) +dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) + + +# _LT_WITH_AIX_SONAME([DEFAULT]) +# ---------------------------------- +# implement the --with-aix-soname flag, and support the `aix-soname=aix' +# and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT +# is either `aix', `both' or `svr4'. If omitted, it defaults to `aix'. +m4_define([_LT_WITH_AIX_SONAME], +[m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl +shared_archive_member_spec= +case $host,$enable_shared in +power*-*-aix[[5-9]]*,yes) + AC_MSG_CHECKING([which variant of shared library versioning to provide]) + AC_ARG_WITH([aix-soname], + [AS_HELP_STRING([--with-aix-soname=aix|svr4|both], + [shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])], + [case $withval in + aix|svr4|both) + ;; + *) + AC_MSG_ERROR([Unknown argument to --with-aix-soname]) + ;; + esac + lt_cv_with_aix_soname=$with_aix_soname], + [AC_CACHE_VAL([lt_cv_with_aix_soname], + [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT) + with_aix_soname=$lt_cv_with_aix_soname]) + AC_MSG_RESULT([$with_aix_soname]) + if test aix != "$with_aix_soname"; then + # For the AIX way of multilib, we name the shared archive member + # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', + # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. + # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, + # the AIX toolchain works better with OBJECT_MODE set (default 32). + if test 64 = "${OBJECT_MODE-32}"; then + shared_archive_member_spec=shr_64 + else + shared_archive_member_spec=shr + fi + fi + ;; +*) + with_aix_soname=aix + ;; +esac + +_LT_DECL([], [shared_archive_member_spec], [0], + [Shared archive member basename, for filename based shared library versioning on AIX])dnl +])# _LT_WITH_AIX_SONAME + +LT_OPTION_DEFINE([LT_INIT], [aix-soname=aix], [_LT_WITH_AIX_SONAME([aix])]) +LT_OPTION_DEFINE([LT_INIT], [aix-soname=both], [_LT_WITH_AIX_SONAME([both])]) +LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])]) + + +# _LT_WITH_PIC([MODE]) +# -------------------- +# implement the --with-pic flag, and support the 'pic-only' and 'no-pic' +# LT_INIT options. +# MODE is either 'yes' or 'no'. If omitted, it defaults to 'both'. +m4_define([_LT_WITH_PIC], +[AC_ARG_WITH([pic], + [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for lt_pkg in $withval; do + IFS=$lt_save_ifs + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [pic_mode=m4_default([$1], [default])]) + +_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl +])# _LT_WITH_PIC + +LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) + +# Old name: +AU_DEFUN([AC_LIBTOOL_PICMODE], +[_LT_SET_OPTION([LT_INIT], [pic-only]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the 'pic-only' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) + +## ----------------- ## +## LTDL_INIT Options ## +## ----------------- ## + +m4_define([_LTDL_MODE], []) +LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], + [m4_define([_LTDL_MODE], [nonrecursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [recursive], + [m4_define([_LTDL_MODE], [recursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [subproject], + [m4_define([_LTDL_MODE], [subproject])]) + +m4_define([_LTDL_TYPE], []) +LT_OPTION_DEFINE([LTDL_INIT], [installable], + [m4_define([_LTDL_TYPE], [installable])]) +LT_OPTION_DEFINE([LTDL_INIT], [convenience], + [m4_define([_LTDL_TYPE], [convenience])]) diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/m4/ltsugar.m4 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/m4/ltsugar.m4 new file mode 100755 index 000000000..3985c5683 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/m4/ltsugar.m4 @@ -0,0 +1,124 @@ +# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- +# +# Copyright (C) 2004-2005, 2007-2008, 2011-2018 Free Software +# Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 6 ltsugar.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) + + +# lt_join(SEP, ARG1, [ARG2...]) +# ----------------------------- +# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their +# associated separator. +# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier +# versions in m4sugar had bugs. +m4_define([lt_join], +[m4_if([$#], [1], [], + [$#], [2], [[$2]], + [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) +m4_define([_lt_join], +[m4_if([$#$2], [2], [], + [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) + + +# lt_car(LIST) +# lt_cdr(LIST) +# ------------ +# Manipulate m4 lists. +# These macros are necessary as long as will still need to support +# Autoconf-2.59, which quotes differently. +m4_define([lt_car], [[$1]]) +m4_define([lt_cdr], +[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], + [$#], 1, [], + [m4_dquote(m4_shift($@))])]) +m4_define([lt_unquote], $1) + + +# lt_append(MACRO-NAME, STRING, [SEPARATOR]) +# ------------------------------------------ +# Redefine MACRO-NAME to hold its former content plus 'SEPARATOR''STRING'. +# Note that neither SEPARATOR nor STRING are expanded; they are appended +# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). +# No SEPARATOR is output if MACRO-NAME was previously undefined (different +# than defined and empty). +# +# This macro is needed until we can rely on Autoconf 2.62, since earlier +# versions of m4sugar mistakenly expanded SEPARATOR but not STRING. +m4_define([lt_append], +[m4_define([$1], + m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) + + + +# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) +# ---------------------------------------------------------- +# Produce a SEP delimited list of all paired combinations of elements of +# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list +# has the form PREFIXmINFIXSUFFIXn. +# Needed until we can rely on m4_combine added in Autoconf 2.62. +m4_define([lt_combine], +[m4_if(m4_eval([$# > 3]), [1], + [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl +[[m4_foreach([_Lt_prefix], [$2], + [m4_foreach([_Lt_suffix], + ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, + [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) + + +# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) +# ----------------------------------------------------------------------- +# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited +# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. +m4_define([lt_if_append_uniq], +[m4_ifdef([$1], + [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], + [lt_append([$1], [$2], [$3])$4], + [$5])], + [lt_append([$1], [$2], [$3])$4])]) + + +# lt_dict_add(DICT, KEY, VALUE) +# ----------------------------- +m4_define([lt_dict_add], +[m4_define([$1($2)], [$3])]) + + +# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) +# -------------------------------------------- +m4_define([lt_dict_add_subkey], +[m4_define([$1($2:$3)], [$4])]) + + +# lt_dict_fetch(DICT, KEY, [SUBKEY]) +# ---------------------------------- +m4_define([lt_dict_fetch], +[m4_ifval([$3], + m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), + m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) + + +# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) +# ----------------------------------------------------------------- +m4_define([lt_if_dict_fetch], +[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], + [$5], + [$6])]) + + +# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) +# -------------------------------------------------------------- +m4_define([lt_dict_filter], +[m4_if([$5], [], [], + [lt_join(m4_quote(m4_default([$4], [[, ]])), + lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), + [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl +]) diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/m4/ltversion.m4 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/m4/ltversion.m4 new file mode 100755 index 000000000..86b2ad723 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/m4/ltversion.m4 @@ -0,0 +1,23 @@ +# ltversion.m4 -- version numbers -*- Autoconf -*- +# +# Copyright (C) 2004, 2011-2018 Free Software Foundation, Inc. +# Written by Scott James Remnant, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# @configure_input@ + +# serial 4221 ltversion.m4 +# This file is part of GNU Libtool + +m4_define([LT_PACKAGE_VERSION], [2.4.6.42-b88ce]) +m4_define([LT_PACKAGE_REVISION], [2.4.6.42]) + +AC_DEFUN([LTVERSION_VERSION], +[macro_version='2.4.6.42-b88ce' +macro_revision='2.4.6.42' +_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) +_LT_DECL(, macro_revision, 0) +]) diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/m4/lt~obsolete.m4 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/m4/lt~obsolete.m4 new file mode 100755 index 000000000..54ea1c421 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/m4/lt~obsolete.m4 @@ -0,0 +1,99 @@ +# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- +# +# Copyright (C) 2004-2005, 2007, 2009, 2011-2018 Free Software +# Foundation, Inc. +# Written by Scott James Remnant, 2004. +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 5 lt~obsolete.m4 + +# These exist entirely to fool aclocal when bootstrapping libtool. +# +# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN), +# which have later been changed to m4_define as they aren't part of the +# exported API, or moved to Autoconf or Automake where they belong. +# +# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN +# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us +# using a macro with the same name in our local m4/libtool.m4 it'll +# pull the old libtool.m4 in (it doesn't see our shiny new m4_define +# and doesn't know about Autoconf macros at all.) +# +# So we provide this file, which has a silly filename so it's always +# included after everything else. This provides aclocal with the +# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything +# because those macros already exist, or will be overwritten later. +# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. +# +# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. +# Yes, that means every name once taken will need to remain here until +# we give up compatibility with versions before 1.7, at which point +# we need to keep only those names which we still refer to. + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) + +m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) +m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) +m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) +m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) +m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) +m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) +m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) +m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) +m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) +m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) +m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) +m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) +m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) +m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) +m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) +m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) +m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) +m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) +m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) +m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) +m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) +m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) +m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) +m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) +m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) +m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) +m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) +m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) +m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) +m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) +m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) +m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) +m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) +m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) +m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) +m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) +m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) +m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) +m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) +m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) +m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) +m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) +m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) +m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) +m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) +m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) +m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) +m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) +m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) +m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/m4/pcre_visibility.m4 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/m4/pcre_visibility.m4 new file mode 100755 index 000000000..30aff8719 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/m4/pcre_visibility.m4 @@ -0,0 +1,89 @@ +# visibility.m4 serial 4 (gettext-0.18.2) +dnl Copyright (C) 2005, 2008, 2010-2011 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. + +dnl Tests whether the compiler supports the command-line option +dnl -fvisibility=hidden and the function and variable attributes +dnl __attribute__((__visibility__("hidden"))) and +dnl __attribute__((__visibility__("default"))). +dnl Does *not* test for __visibility__("protected") - which has tricky +dnl semantics (see the 'vismain' test in glibc) and does not exist e.g. on +dnl MacOS X. +dnl Does *not* test for __visibility__("internal") - which has processor +dnl dependent semantics. +dnl Does *not* test for #pragma GCC visibility push(hidden) - which is +dnl "really only recommended for legacy code". +dnl Set the variable CFLAG_VISIBILITY. +dnl Defines and sets the variable HAVE_VISIBILITY. + +dnl Modified to fit with PCRE build environment by Cristian Rodríguez. + +AC_DEFUN([PCRE_VISIBILITY], +[ + AC_REQUIRE([AC_PROG_CC]) + VISIBILITY_CFLAGS= + VISIBILITY_CXXFLAGS= + HAVE_VISIBILITY=0 + if test -n "$GCC"; then + dnl First, check whether -Werror can be added to the command line, or + dnl whether it leads to an error because of some other option that the + dnl user has put into $CC $CFLAGS $CPPFLAGS. + AC_MSG_CHECKING([whether the -Werror option is usable]) + AC_CACHE_VAL([pcre_cv_cc_vis_werror], [ + pcre_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -Werror" + AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([[]], [[]])], + [pcre_cv_cc_vis_werror=yes], + [pcre_cv_cc_vis_werror=no]) + CFLAGS="$pcre_save_CFLAGS"]) + AC_MSG_RESULT([$pcre_cv_cc_vis_werror]) + dnl Now check whether visibility declarations are supported. + AC_MSG_CHECKING([for simple visibility declarations]) + AC_CACHE_VAL([pcre_cv_cc_visibility], [ + pcre_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -fvisibility=hidden" + dnl We use the option -Werror and a function dummyfunc, because on some + dnl platforms (Cygwin 1.7) the use of -fvisibility triggers a warning + dnl "visibility attribute not supported in this configuration; ignored" + dnl at the first function definition in every compilation unit, and we + dnl don't want to use the option in this case. + if test $pcre_cv_cc_vis_werror = yes; then + CFLAGS="$CFLAGS -Werror" + fi + AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [[extern __attribute__((__visibility__("hidden"))) int hiddenvar; + extern __attribute__((__visibility__("default"))) int exportedvar; + extern __attribute__((__visibility__("hidden"))) int hiddenfunc (void); + extern __attribute__((__visibility__("default"))) int exportedfunc (void); + void dummyfunc (void) {} + ]], + [[]])], + [pcre_cv_cc_visibility=yes], + [pcre_cv_cc_visibility=no]) + CFLAGS="$pcre_save_CFLAGS"]) + AC_MSG_RESULT([$pcre_cv_cc_visibility]) + if test $pcre_cv_cc_visibility = yes; then + VISIBILITY_CFLAGS="-fvisibility=hidden" + VISIBILITY_CXXFLAGS="-fvisibility=hidden -fvisibility-inlines-hidden" + HAVE_VISIBILITY=1 + AC_DEFINE(PCRE_EXP_DECL, [extern __attribute__ ((visibility ("default")))], [to make a symbol visible]) + AC_DEFINE(PCRE_EXP_DEFN, [__attribute__ ((visibility ("default")))], [to make a symbol visible]) + AC_DEFINE(PCRE_EXP_DATA_DEFN, [__attribute__ ((visibility ("default")))], [to make a symbol visible]) + AC_DEFINE(PCREPOSIX_EXP_DECL, [extern __attribute__ ((visibility ("default")))], [to make a symbol visible]) + AC_DEFINE(PCREPOSIX_EXP_DEFN, [extern __attribute__ ((visibility ("default")))], [to make a symbol visible]) + AC_DEFINE(PCRECPP_EXP_DECL, [extern __attribute__ ((visibility ("default")))], [to make a symbol visible]) + AC_DEFINE(PCRECPP_EXP_DEFN, [__attribute__ ((visibility ("default")))], [to make a symbol visible]) + fi + fi + AC_SUBST([VISIBILITY_CFLAGS]) + AC_SUBST([VISIBILITY_CXXFLAGS]) + AC_SUBST([HAVE_VISIBILITY]) + AC_DEFINE_UNQUOTED([HAVE_VISIBILITY], [$HAVE_VISIBILITY], + [Define to 1 if the compiler supports simple visibility declarations.]) +]) diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/makevp.bat b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/makevp.bat new file mode 100755 index 000000000..5f795487e --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/makevp.bat @@ -0,0 +1,66 @@ +:: AH 20-12-06 modified for new PCRE-7.0 and VP/BCC +:: PH 19-03-07 renamed !compile.txt and !linklib.txt as makevp-compile.txt and +:: makevp-linklib.txt +:: PH 26-03-07 re-renamed !compile.txt and !linklib.txt as makevp-c.txt and +:: makevp-l.txt +:: PH 29-03-07 hopefully the final rename to makevp_c and makevp_l +:: AH 27.08.08 updated for new PCRE-7.7 +:: required PCRE.H and CONFIG.H will be generated if not existing + +@echo off +echo. +echo Compiling PCRE with BORLAND C++ for VIRTUAL PASCAL +echo. + +REM This file was contributed by Alexander Tokarev for building PCRE for use +REM with Virtual Pascal. It has not been tested with the latest PCRE release. + +REM This file has been modified and extended to compile with newer PCRE releases +REM by Stefan Weber (Angels Holocaust). + +REM CHANGE THIS FOR YOUR BORLAND C++ COMPILER PATH +SET BORLAND=f:\bcc +REM location of the TASM binaries, if compiling with the -B BCC switch +SET TASM=f:\tasm + +SET PATH=%PATH%;%BORLAND%\bin;%TASM%\bin +SET PCRE_VER=77 +SET COMPILE_DEFAULTS=-DHAVE_CONFIG_H -DPCRE_STATIC -I%BORLAND%\include + +del pcre%PCRE_VER%.lib >nul 2>nul + +:: sh configure + +:: check for needed header files +if not exist pcre.h copy pcre.h.generic pcre.h +if not exist config.h copy config.h.generic config.h + +bcc32 -DDFTABLES %COMPILE_DEFAULTS% -L%BORLAND%\lib dftables.c +IF ERRORLEVEL 1 GOTO ERROR + +:: dftables > chartables.c +dftables pcre_chartables.c + +REM compile and link the PCRE library into lib: option -B for ASM compile works too +bcc32 -a4 -c -RT- -y- -v- -u- -R- -Q- -X -d -fp -ff -P- -O2 -Oc -Ov -3 -w-8004 -w-8064 -w-8065 -w-8012 -UDFTABLES -DVPCOMPAT %COMPILE_DEFAULTS% @makevp_c.txt +IF ERRORLEVEL 1 GOTO ERROR + +tlib %BORLAND%\lib\cw32.lib *calloc *del *strncmp *memcpy *memmove *memset *memcmp *strlen +IF ERRORLEVEL 1 GOTO ERROR +tlib pcre%PCRE_VER%.lib @makevp_l.txt +calloc.obj +del.obj +strncmp.obj +memcpy.obj +memmove.obj +memset.obj +memcmp.obj +strlen.obj +IF ERRORLEVEL 1 GOTO ERROR + +del *.obj *.tds *.bak >nul 2>nul + +echo --- +echo Now the library should be complete. Please check all messages above. +echo Don't care for warnings, it's OK. +goto END + +:ERROR +echo --- +echo Error while compiling PCRE. Aborting... +pause +goto END + +:END diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/makevp_c.txt b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/makevp_c.txt new file mode 100755 index 000000000..e5898c514 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/makevp_c.txt @@ -0,0 +1,21 @@ +pcre_byte_order.c +pcre_chartables.c +pcre_compile.c +pcre_config.c +pcre_dfa_exec.c +pcre_exec.c +pcre_fullinfo.c +pcre_get.c +pcre_globals.c +pcre_jit_compile.c +pcre_maketables.c +pcre_newline.c +pcre_ord2utf8.c +pcre_refcount.c +pcre_string_utils.c +pcre_study.c +pcre_tables.c +pcre_ucd.c +pcre_valid_utf8.c +pcre_version.c +pcre_xclass.c diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/makevp_l.txt b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/makevp_l.txt new file mode 100755 index 000000000..23e197560 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/makevp_l.txt @@ -0,0 +1,21 @@ ++pcre_byte_order.obj & ++pcre_chartables.obj & ++pcre_compile.obj & ++pcre_config.obj & ++pcre_dfa_exec.obj & ++pcre_exec.obj & ++pcre_fullinfo.obj & ++pcre_get.obj & ++pcre_globals.obj & ++pcre_jit_compile.obj & ++pcre_maketables.obj & ++pcre_newline.obj & ++pcre_ord2utf8.obj & ++pcre_refcount.obj & ++pcre_string_utils.obj & ++pcre_study.obj & ++pcre_tables.obj & ++pcre_ucd.obj & ++pcre_valid_utf8.obj & ++pcre_version.obj & ++pcre_xclass.obj diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/missing b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/missing new file mode 100755 index 000000000..625aeb118 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/missing @@ -0,0 +1,215 @@ +#! /bin/sh +# Common wrapper for a few potentially missing GNU programs. + +scriptversion=2018-03-07.03; # UTC + +# Copyright (C) 1996-2018 Free Software Foundation, Inc. +# Originally written by Fran,cois Pinard , 1996. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try '$0 --help' for more information" + exit 1 +fi + +case $1 in + + --is-lightweight) + # Used by our autoconf macros to check whether the available missing + # script is modern enough. + exit 0 + ;; + + --run) + # Back-compat with the calling convention used by older automake. + shift + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due +to PROGRAM being missing or too old. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + +Supported PROGRAM values: + aclocal autoconf autoheader autom4te automake makeinfo + bison yacc flex lex help2man + +Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and +'g' are ignored when checking the name. + +Send bug reports to ." + exit $? + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + exit $? + ;; + + -*) + echo 1>&2 "$0: unknown '$1' option" + echo 1>&2 "Try '$0 --help' for more information" + exit 1 + ;; + +esac + +# Run the given program, remember its exit status. +"$@"; st=$? + +# If it succeeded, we are done. +test $st -eq 0 && exit 0 + +# Also exit now if we it failed (or wasn't found), and '--version' was +# passed; such an option is passed most likely to detect whether the +# program is present and works. +case $2 in --version|--help) exit $st;; esac + +# Exit code 63 means version mismatch. This often happens when the user +# tries to use an ancient version of a tool on a file that requires a +# minimum version. +if test $st -eq 63; then + msg="probably too old" +elif test $st -eq 127; then + # Program was missing. + msg="missing on your system" +else + # Program was found and executed, but failed. Give up. + exit $st +fi + +perl_URL=https://www.perl.org/ +flex_URL=https://github.com/westes/flex +gnu_software_URL=https://www.gnu.org/software + +program_details () +{ + case $1 in + aclocal|automake) + echo "The '$1' program is part of the GNU Automake package:" + echo "<$gnu_software_URL/automake>" + echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/autoconf>" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + autoconf|autom4te|autoheader) + echo "The '$1' program is part of the GNU Autoconf package:" + echo "<$gnu_software_URL/autoconf/>" + echo "It also requires GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + esac +} + +give_advice () +{ + # Normalize program name to check for. + normalized_program=`echo "$1" | sed ' + s/^gnu-//; t + s/^gnu//; t + s/^g//; t'` + + printf '%s\n' "'$1' is $msg." + + configure_deps="'configure.ac' or m4 files included by 'configure.ac'" + case $normalized_program in + autoconf*) + echo "You should only need it if you modified 'configure.ac'," + echo "or m4 files included by it." + program_details 'autoconf' + ;; + autoheader*) + echo "You should only need it if you modified 'acconfig.h' or" + echo "$configure_deps." + program_details 'autoheader' + ;; + automake*) + echo "You should only need it if you modified 'Makefile.am' or" + echo "$configure_deps." + program_details 'automake' + ;; + aclocal*) + echo "You should only need it if you modified 'acinclude.m4' or" + echo "$configure_deps." + program_details 'aclocal' + ;; + autom4te*) + echo "You might have modified some maintainer files that require" + echo "the 'autom4te' program to be rebuilt." + program_details 'autom4te' + ;; + bison*|yacc*) + echo "You should only need it if you modified a '.y' file." + echo "You may want to install the GNU Bison package:" + echo "<$gnu_software_URL/bison/>" + ;; + lex*|flex*) + echo "You should only need it if you modified a '.l' file." + echo "You may want to install the Fast Lexical Analyzer package:" + echo "<$flex_URL>" + ;; + help2man*) + echo "You should only need it if you modified a dependency" \ + "of a man page." + echo "You may want to install the GNU Help2man package:" + echo "<$gnu_software_URL/help2man/>" + ;; + makeinfo*) + echo "You should only need it if you modified a '.texi' file, or" + echo "any other file indirectly affecting the aspect of the manual." + echo "You might want to install the Texinfo package:" + echo "<$gnu_software_URL/texinfo/>" + echo "The spurious makeinfo call might also be the consequence of" + echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" + echo "want to install GNU make:" + echo "<$gnu_software_URL/make/>" + ;; + *) + echo "You might have modified some files without having the proper" + echo "tools for further handling them. Check the 'README' file, it" + echo "often tells you about the needed prerequisites for installing" + echo "this package. You may also peek at any GNU archive site, in" + echo "case some other package contains this missing '$1' program." + ;; + esac +} + +give_advice "$1" | sed -e '1s/^/WARNING: /' \ + -e '2,$s/^/ /' >&2 + +# Propagate the correct exit status (expected to be 127 for a program +# not found, 63 for a program that failed due to version mismatch). +exit $st + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre-config.in b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre-config.in new file mode 100755 index 000000000..ac06a3325 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre-config.in @@ -0,0 +1,133 @@ +#!/bin/sh + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +exec_prefix_set=no + +cflags="[--cflags]" + +if test @enable_cpp@ = yes ; then + libs="[--libs-cpp]" +else + libs= +fi + +if test @enable_pcre16@ = yes ; then + libs="[--libs16] $libs" +fi + +if test @enable_pcre32@ = yes ; then + libs="[--libs32] $libs" +fi + +if test @enable_pcre8@ = yes ; then + libs="[--libs] [--libs-posix] $libs" + cflags="$cflags [--cflags-posix]" +fi + +usage="Usage: pcre-config [--prefix] [--exec-prefix] [--version] $libs $cflags" + +if test $# -eq 0; then + echo "${usage}" 1>&2 + exit 1 +fi + +libR= +case `uname -s` in + *SunOS*) + libR=" -R@libdir@" + ;; + *BSD*) + libR=" -Wl,-R@libdir@" + ;; +esac + +libS= +if test @libdir@ != /usr/lib ; then + libS=-L@libdir@ +fi + +while test $# -gt 0; do + case "$1" in + -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) optarg= ;; + esac + + case $1 in + --prefix=*) + prefix=$optarg + if test $exec_prefix_set = no ; then + exec_prefix=$optarg + fi + ;; + --prefix) + echo $prefix + ;; + --exec-prefix=*) + exec_prefix=$optarg + exec_prefix_set=yes + ;; + --exec-prefix) + echo $exec_prefix + ;; + --version) + echo @PACKAGE_VERSION@ + ;; + --cflags) + if test @includedir@ != /usr/include ; then + includes=-I@includedir@ + fi + echo $includes @PCRE_STATIC_CFLAG@ + ;; + --cflags-posix) + if test @enable_pcre8@ = yes ; then + if test @includedir@ != /usr/include ; then + includes=-I@includedir@ + fi + echo $includes @PCRE_STATIC_CFLAG@ + else + echo "${usage}" 1>&2 + fi + ;; + --libs-posix) + if test @enable_pcre8@ = yes ; then + echo $libS$libR -lpcreposix -lpcre + else + echo "${usage}" 1>&2 + fi + ;; + --libs) + if test @enable_pcre8@ = yes ; then + echo $libS$libR -lpcre + else + echo "${usage}" 1>&2 + fi + ;; + --libs16) + if test @enable_pcre16@ = yes ; then + echo $libS$libR -lpcre16 + else + echo "${usage}" 1>&2 + fi + ;; + --libs32) + if test @enable_pcre32@ = yes ; then + echo $libS$libR -lpcre32 + else + echo "${usage}" 1>&2 + fi + ;; + --libs-cpp) + if test @enable_cpp@ = yes ; then + echo $libS$libR -lpcrecpp -lpcre + else + echo "${usage}" 1>&2 + fi + ;; + *) + echo "${usage}" 1>&2 + exit 1 + ;; + esac + shift +done diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre.h.generic b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre.h.generic new file mode 100755 index 000000000..86e3956c2 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre.h.generic @@ -0,0 +1,677 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* This is the public header file for the PCRE library, to be #included by +applications that call the PCRE functions. + + Copyright (c) 1997-2014 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +#ifndef _PCRE_H +#define _PCRE_H + +/* The current PCRE version information. */ + +#define PCRE_MAJOR 8 +#define PCRE_MINOR 44 +#define PCRE_PRERELEASE +#define PCRE_DATE 2020-02-12 + +/* When an application links to a PCRE DLL in Windows, the symbols that are +imported have to be identified as such. When building PCRE, the appropriate +export setting is defined in pcre_internal.h, which includes this file. So we +don't change existing definitions of PCRE_EXP_DECL and PCRECPP_EXP_DECL. */ + +#if defined(_WIN32) && !defined(PCRE_STATIC) +# ifndef PCRE_EXP_DECL +# define PCRE_EXP_DECL extern __declspec(dllimport) +# endif +# ifdef __cplusplus +# ifndef PCRECPP_EXP_DECL +# define PCRECPP_EXP_DECL extern __declspec(dllimport) +# endif +# ifndef PCRECPP_EXP_DEFN +# define PCRECPP_EXP_DEFN __declspec(dllimport) +# endif +# endif +#endif + +/* By default, we use the standard "extern" declarations. */ + +#ifndef PCRE_EXP_DECL +# ifdef __cplusplus +# define PCRE_EXP_DECL extern "C" +# else +# define PCRE_EXP_DECL extern +# endif +#endif + +#ifdef __cplusplus +# ifndef PCRECPP_EXP_DECL +# define PCRECPP_EXP_DECL extern +# endif +# ifndef PCRECPP_EXP_DEFN +# define PCRECPP_EXP_DEFN +# endif +#endif + +/* Have to include stdlib.h in order to ensure that size_t is defined; +it is needed here for malloc. */ + +#include + +/* Allow for C++ users */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Public options. Some are compile-time only, some are run-time only, and some +are both. Most of the compile-time options are saved with the compiled regex so +that they can be inspected during studying (and therefore JIT compiling). Note +that pcre_study() has its own set of options. Originally, all the options +defined here used distinct bits. However, almost all the bits in a 32-bit word +are now used, so in order to conserve them, option bits that were previously +only recognized at matching time (i.e. by pcre_exec() or pcre_dfa_exec()) may +also be used for compile-time options that affect only compiling and are not +relevant for studying or JIT compiling. + +Some options for pcre_compile() change its behaviour but do not affect the +behaviour of the execution functions. Other options are passed through to the +execution functions and affect their behaviour, with or without affecting the +behaviour of pcre_compile(). + +Options that can be passed to pcre_compile() are tagged Cx below, with these +variants: + +C1 Affects compile only +C2 Does not affect compile; affects exec, dfa_exec +C3 Affects compile, exec, dfa_exec +C4 Affects compile, exec, dfa_exec, study +C5 Affects compile, exec, study + +Options that can be set for pcre_exec() and/or pcre_dfa_exec() are flagged with +E and D, respectively. They take precedence over C3, C4, and C5 settings passed +from pcre_compile(). Those that are compatible with JIT execution are flagged +with J. */ + +#define PCRE_CASELESS 0x00000001 /* C1 */ +#define PCRE_MULTILINE 0x00000002 /* C1 */ +#define PCRE_DOTALL 0x00000004 /* C1 */ +#define PCRE_EXTENDED 0x00000008 /* C1 */ +#define PCRE_ANCHORED 0x00000010 /* C4 E D */ +#define PCRE_DOLLAR_ENDONLY 0x00000020 /* C2 */ +#define PCRE_EXTRA 0x00000040 /* C1 */ +#define PCRE_NOTBOL 0x00000080 /* E D J */ +#define PCRE_NOTEOL 0x00000100 /* E D J */ +#define PCRE_UNGREEDY 0x00000200 /* C1 */ +#define PCRE_NOTEMPTY 0x00000400 /* E D J */ +#define PCRE_UTF8 0x00000800 /* C4 ) */ +#define PCRE_UTF16 0x00000800 /* C4 ) Synonyms */ +#define PCRE_UTF32 0x00000800 /* C4 ) */ +#define PCRE_NO_AUTO_CAPTURE 0x00001000 /* C1 */ +#define PCRE_NO_UTF8_CHECK 0x00002000 /* C1 E D J ) */ +#define PCRE_NO_UTF16_CHECK 0x00002000 /* C1 E D J ) Synonyms */ +#define PCRE_NO_UTF32_CHECK 0x00002000 /* C1 E D J ) */ +#define PCRE_AUTO_CALLOUT 0x00004000 /* C1 */ +#define PCRE_PARTIAL_SOFT 0x00008000 /* E D J ) Synonyms */ +#define PCRE_PARTIAL 0x00008000 /* E D J ) */ + +/* This pair use the same bit. */ +#define PCRE_NEVER_UTF 0x00010000 /* C1 ) Overlaid */ +#define PCRE_DFA_SHORTEST 0x00010000 /* D ) Overlaid */ + +/* This pair use the same bit. */ +#define PCRE_NO_AUTO_POSSESS 0x00020000 /* C1 ) Overlaid */ +#define PCRE_DFA_RESTART 0x00020000 /* D ) Overlaid */ + +#define PCRE_FIRSTLINE 0x00040000 /* C3 */ +#define PCRE_DUPNAMES 0x00080000 /* C1 */ +#define PCRE_NEWLINE_CR 0x00100000 /* C3 E D */ +#define PCRE_NEWLINE_LF 0x00200000 /* C3 E D */ +#define PCRE_NEWLINE_CRLF 0x00300000 /* C3 E D */ +#define PCRE_NEWLINE_ANY 0x00400000 /* C3 E D */ +#define PCRE_NEWLINE_ANYCRLF 0x00500000 /* C3 E D */ +#define PCRE_BSR_ANYCRLF 0x00800000 /* C3 E D */ +#define PCRE_BSR_UNICODE 0x01000000 /* C3 E D */ +#define PCRE_JAVASCRIPT_COMPAT 0x02000000 /* C5 */ +#define PCRE_NO_START_OPTIMIZE 0x04000000 /* C2 E D ) Synonyms */ +#define PCRE_NO_START_OPTIMISE 0x04000000 /* C2 E D ) */ +#define PCRE_PARTIAL_HARD 0x08000000 /* E D J */ +#define PCRE_NOTEMPTY_ATSTART 0x10000000 /* E D J */ +#define PCRE_UCP 0x20000000 /* C3 */ + +/* Exec-time and get/set-time error codes */ + +#define PCRE_ERROR_NOMATCH (-1) +#define PCRE_ERROR_NULL (-2) +#define PCRE_ERROR_BADOPTION (-3) +#define PCRE_ERROR_BADMAGIC (-4) +#define PCRE_ERROR_UNKNOWN_OPCODE (-5) +#define PCRE_ERROR_UNKNOWN_NODE (-5) /* For backward compatibility */ +#define PCRE_ERROR_NOMEMORY (-6) +#define PCRE_ERROR_NOSUBSTRING (-7) +#define PCRE_ERROR_MATCHLIMIT (-8) +#define PCRE_ERROR_CALLOUT (-9) /* Never used by PCRE itself */ +#define PCRE_ERROR_BADUTF8 (-10) /* Same for 8/16/32 */ +#define PCRE_ERROR_BADUTF16 (-10) /* Same for 8/16/32 */ +#define PCRE_ERROR_BADUTF32 (-10) /* Same for 8/16/32 */ +#define PCRE_ERROR_BADUTF8_OFFSET (-11) /* Same for 8/16 */ +#define PCRE_ERROR_BADUTF16_OFFSET (-11) /* Same for 8/16 */ +#define PCRE_ERROR_PARTIAL (-12) +#define PCRE_ERROR_BADPARTIAL (-13) +#define PCRE_ERROR_INTERNAL (-14) +#define PCRE_ERROR_BADCOUNT (-15) +#define PCRE_ERROR_DFA_UITEM (-16) +#define PCRE_ERROR_DFA_UCOND (-17) +#define PCRE_ERROR_DFA_UMLIMIT (-18) +#define PCRE_ERROR_DFA_WSSIZE (-19) +#define PCRE_ERROR_DFA_RECURSE (-20) +#define PCRE_ERROR_RECURSIONLIMIT (-21) +#define PCRE_ERROR_NULLWSLIMIT (-22) /* No longer actually used */ +#define PCRE_ERROR_BADNEWLINE (-23) +#define PCRE_ERROR_BADOFFSET (-24) +#define PCRE_ERROR_SHORTUTF8 (-25) +#define PCRE_ERROR_SHORTUTF16 (-25) /* Same for 8/16 */ +#define PCRE_ERROR_RECURSELOOP (-26) +#define PCRE_ERROR_JIT_STACKLIMIT (-27) +#define PCRE_ERROR_BADMODE (-28) +#define PCRE_ERROR_BADENDIANNESS (-29) +#define PCRE_ERROR_DFA_BADRESTART (-30) +#define PCRE_ERROR_JIT_BADOPTION (-31) +#define PCRE_ERROR_BADLENGTH (-32) +#define PCRE_ERROR_UNSET (-33) + +/* Specific error codes for UTF-8 validity checks */ + +#define PCRE_UTF8_ERR0 0 +#define PCRE_UTF8_ERR1 1 +#define PCRE_UTF8_ERR2 2 +#define PCRE_UTF8_ERR3 3 +#define PCRE_UTF8_ERR4 4 +#define PCRE_UTF8_ERR5 5 +#define PCRE_UTF8_ERR6 6 +#define PCRE_UTF8_ERR7 7 +#define PCRE_UTF8_ERR8 8 +#define PCRE_UTF8_ERR9 9 +#define PCRE_UTF8_ERR10 10 +#define PCRE_UTF8_ERR11 11 +#define PCRE_UTF8_ERR12 12 +#define PCRE_UTF8_ERR13 13 +#define PCRE_UTF8_ERR14 14 +#define PCRE_UTF8_ERR15 15 +#define PCRE_UTF8_ERR16 16 +#define PCRE_UTF8_ERR17 17 +#define PCRE_UTF8_ERR18 18 +#define PCRE_UTF8_ERR19 19 +#define PCRE_UTF8_ERR20 20 +#define PCRE_UTF8_ERR21 21 +#define PCRE_UTF8_ERR22 22 /* Unused (was non-character) */ + +/* Specific error codes for UTF-16 validity checks */ + +#define PCRE_UTF16_ERR0 0 +#define PCRE_UTF16_ERR1 1 +#define PCRE_UTF16_ERR2 2 +#define PCRE_UTF16_ERR3 3 +#define PCRE_UTF16_ERR4 4 /* Unused (was non-character) */ + +/* Specific error codes for UTF-32 validity checks */ + +#define PCRE_UTF32_ERR0 0 +#define PCRE_UTF32_ERR1 1 +#define PCRE_UTF32_ERR2 2 /* Unused (was non-character) */ +#define PCRE_UTF32_ERR3 3 + +/* Request types for pcre_fullinfo() */ + +#define PCRE_INFO_OPTIONS 0 +#define PCRE_INFO_SIZE 1 +#define PCRE_INFO_CAPTURECOUNT 2 +#define PCRE_INFO_BACKREFMAX 3 +#define PCRE_INFO_FIRSTBYTE 4 +#define PCRE_INFO_FIRSTCHAR 4 /* For backwards compatibility */ +#define PCRE_INFO_FIRSTTABLE 5 +#define PCRE_INFO_LASTLITERAL 6 +#define PCRE_INFO_NAMEENTRYSIZE 7 +#define PCRE_INFO_NAMECOUNT 8 +#define PCRE_INFO_NAMETABLE 9 +#define PCRE_INFO_STUDYSIZE 10 +#define PCRE_INFO_DEFAULT_TABLES 11 +#define PCRE_INFO_OKPARTIAL 12 +#define PCRE_INFO_JCHANGED 13 +#define PCRE_INFO_HASCRORLF 14 +#define PCRE_INFO_MINLENGTH 15 +#define PCRE_INFO_JIT 16 +#define PCRE_INFO_JITSIZE 17 +#define PCRE_INFO_MAXLOOKBEHIND 18 +#define PCRE_INFO_FIRSTCHARACTER 19 +#define PCRE_INFO_FIRSTCHARACTERFLAGS 20 +#define PCRE_INFO_REQUIREDCHAR 21 +#define PCRE_INFO_REQUIREDCHARFLAGS 22 +#define PCRE_INFO_MATCHLIMIT 23 +#define PCRE_INFO_RECURSIONLIMIT 24 +#define PCRE_INFO_MATCH_EMPTY 25 + +/* Request types for pcre_config(). Do not re-arrange, in order to remain +compatible. */ + +#define PCRE_CONFIG_UTF8 0 +#define PCRE_CONFIG_NEWLINE 1 +#define PCRE_CONFIG_LINK_SIZE 2 +#define PCRE_CONFIG_POSIX_MALLOC_THRESHOLD 3 +#define PCRE_CONFIG_MATCH_LIMIT 4 +#define PCRE_CONFIG_STACKRECURSE 5 +#define PCRE_CONFIG_UNICODE_PROPERTIES 6 +#define PCRE_CONFIG_MATCH_LIMIT_RECURSION 7 +#define PCRE_CONFIG_BSR 8 +#define PCRE_CONFIG_JIT 9 +#define PCRE_CONFIG_UTF16 10 +#define PCRE_CONFIG_JITTARGET 11 +#define PCRE_CONFIG_UTF32 12 +#define PCRE_CONFIG_PARENS_LIMIT 13 + +/* Request types for pcre_study(). Do not re-arrange, in order to remain +compatible. */ + +#define PCRE_STUDY_JIT_COMPILE 0x0001 +#define PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE 0x0002 +#define PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE 0x0004 +#define PCRE_STUDY_EXTRA_NEEDED 0x0008 + +/* Bit flags for the pcre[16|32]_extra structure. Do not re-arrange or redefine +these bits, just add new ones on the end, in order to remain compatible. */ + +#define PCRE_EXTRA_STUDY_DATA 0x0001 +#define PCRE_EXTRA_MATCH_LIMIT 0x0002 +#define PCRE_EXTRA_CALLOUT_DATA 0x0004 +#define PCRE_EXTRA_TABLES 0x0008 +#define PCRE_EXTRA_MATCH_LIMIT_RECURSION 0x0010 +#define PCRE_EXTRA_MARK 0x0020 +#define PCRE_EXTRA_EXECUTABLE_JIT 0x0040 + +/* Types */ + +struct real_pcre8_or_16; /* declaration; the definition is private */ +typedef struct real_pcre8_or_16 pcre; + +struct real_pcre8_or_16; /* declaration; the definition is private */ +typedef struct real_pcre8_or_16 pcre16; + +struct real_pcre32; /* declaration; the definition is private */ +typedef struct real_pcre32 pcre32; + +struct real_pcre_jit_stack; /* declaration; the definition is private */ +typedef struct real_pcre_jit_stack pcre_jit_stack; + +struct real_pcre16_jit_stack; /* declaration; the definition is private */ +typedef struct real_pcre16_jit_stack pcre16_jit_stack; + +struct real_pcre32_jit_stack; /* declaration; the definition is private */ +typedef struct real_pcre32_jit_stack pcre32_jit_stack; + +/* If PCRE is compiled with 16 bit character support, PCRE_UCHAR16 must contain +a 16 bit wide signed data type. Otherwise it can be a dummy data type since +pcre16 functions are not implemented. There is a check for this in pcre_internal.h. */ +#ifndef PCRE_UCHAR16 +#define PCRE_UCHAR16 unsigned short +#endif + +#ifndef PCRE_SPTR16 +#define PCRE_SPTR16 const PCRE_UCHAR16 * +#endif + +/* If PCRE is compiled with 32 bit character support, PCRE_UCHAR32 must contain +a 32 bit wide signed data type. Otherwise it can be a dummy data type since +pcre32 functions are not implemented. There is a check for this in pcre_internal.h. */ +#ifndef PCRE_UCHAR32 +#define PCRE_UCHAR32 unsigned int +#endif + +#ifndef PCRE_SPTR32 +#define PCRE_SPTR32 const PCRE_UCHAR32 * +#endif + +/* When PCRE is compiled as a C++ library, the subject pointer type can be +replaced with a custom type. For conventional use, the public interface is a +const char *. */ + +#ifndef PCRE_SPTR +#define PCRE_SPTR const char * +#endif + +/* The structure for passing additional data to pcre_exec(). This is defined in +such as way as to be extensible. Always add new fields at the end, in order to +remain compatible. */ + +typedef struct pcre_extra { + unsigned long int flags; /* Bits for which fields are set */ + void *study_data; /* Opaque data from pcre_study() */ + unsigned long int match_limit; /* Maximum number of calls to match() */ + void *callout_data; /* Data passed back in callouts */ + const unsigned char *tables; /* Pointer to character tables */ + unsigned long int match_limit_recursion; /* Max recursive calls to match() */ + unsigned char **mark; /* For passing back a mark pointer */ + void *executable_jit; /* Contains a pointer to a compiled jit code */ +} pcre_extra; + +/* Same structure as above, but with 16 bit char pointers. */ + +typedef struct pcre16_extra { + unsigned long int flags; /* Bits for which fields are set */ + void *study_data; /* Opaque data from pcre_study() */ + unsigned long int match_limit; /* Maximum number of calls to match() */ + void *callout_data; /* Data passed back in callouts */ + const unsigned char *tables; /* Pointer to character tables */ + unsigned long int match_limit_recursion; /* Max recursive calls to match() */ + PCRE_UCHAR16 **mark; /* For passing back a mark pointer */ + void *executable_jit; /* Contains a pointer to a compiled jit code */ +} pcre16_extra; + +/* Same structure as above, but with 32 bit char pointers. */ + +typedef struct pcre32_extra { + unsigned long int flags; /* Bits for which fields are set */ + void *study_data; /* Opaque data from pcre_study() */ + unsigned long int match_limit; /* Maximum number of calls to match() */ + void *callout_data; /* Data passed back in callouts */ + const unsigned char *tables; /* Pointer to character tables */ + unsigned long int match_limit_recursion; /* Max recursive calls to match() */ + PCRE_UCHAR32 **mark; /* For passing back a mark pointer */ + void *executable_jit; /* Contains a pointer to a compiled jit code */ +} pcre32_extra; + +/* The structure for passing out data via the pcre_callout_function. We use a +structure so that new fields can be added on the end in future versions, +without changing the API of the function, thereby allowing old clients to work +without modification. */ + +typedef struct pcre_callout_block { + int version; /* Identifies version of block */ + /* ------------------------ Version 0 ------------------------------- */ + int callout_number; /* Number compiled into pattern */ + int *offset_vector; /* The offset vector */ + PCRE_SPTR subject; /* The subject being matched */ + int subject_length; /* The length of the subject */ + int start_match; /* Offset to start of this match attempt */ + int current_position; /* Where we currently are in the subject */ + int capture_top; /* Max current capture */ + int capture_last; /* Most recently closed capture */ + void *callout_data; /* Data passed in with the call */ + /* ------------------- Added for Version 1 -------------------------- */ + int pattern_position; /* Offset to next item in the pattern */ + int next_item_length; /* Length of next item in the pattern */ + /* ------------------- Added for Version 2 -------------------------- */ + const unsigned char *mark; /* Pointer to current mark or NULL */ + /* ------------------------------------------------------------------ */ +} pcre_callout_block; + +/* Same structure as above, but with 16 bit char pointers. */ + +typedef struct pcre16_callout_block { + int version; /* Identifies version of block */ + /* ------------------------ Version 0 ------------------------------- */ + int callout_number; /* Number compiled into pattern */ + int *offset_vector; /* The offset vector */ + PCRE_SPTR16 subject; /* The subject being matched */ + int subject_length; /* The length of the subject */ + int start_match; /* Offset to start of this match attempt */ + int current_position; /* Where we currently are in the subject */ + int capture_top; /* Max current capture */ + int capture_last; /* Most recently closed capture */ + void *callout_data; /* Data passed in with the call */ + /* ------------------- Added for Version 1 -------------------------- */ + int pattern_position; /* Offset to next item in the pattern */ + int next_item_length; /* Length of next item in the pattern */ + /* ------------------- Added for Version 2 -------------------------- */ + const PCRE_UCHAR16 *mark; /* Pointer to current mark or NULL */ + /* ------------------------------------------------------------------ */ +} pcre16_callout_block; + +/* Same structure as above, but with 32 bit char pointers. */ + +typedef struct pcre32_callout_block { + int version; /* Identifies version of block */ + /* ------------------------ Version 0 ------------------------------- */ + int callout_number; /* Number compiled into pattern */ + int *offset_vector; /* The offset vector */ + PCRE_SPTR32 subject; /* The subject being matched */ + int subject_length; /* The length of the subject */ + int start_match; /* Offset to start of this match attempt */ + int current_position; /* Where we currently are in the subject */ + int capture_top; /* Max current capture */ + int capture_last; /* Most recently closed capture */ + void *callout_data; /* Data passed in with the call */ + /* ------------------- Added for Version 1 -------------------------- */ + int pattern_position; /* Offset to next item in the pattern */ + int next_item_length; /* Length of next item in the pattern */ + /* ------------------- Added for Version 2 -------------------------- */ + const PCRE_UCHAR32 *mark; /* Pointer to current mark or NULL */ + /* ------------------------------------------------------------------ */ +} pcre32_callout_block; + +/* Indirection for store get and free functions. These can be set to +alternative malloc/free functions if required. Special ones are used in the +non-recursive case for "frames". There is also an optional callout function +that is triggered by the (?) regex item. For Virtual Pascal, these definitions +have to take another form. */ + +#ifndef VPCOMPAT +PCRE_EXP_DECL void *(*pcre_malloc)(size_t); +PCRE_EXP_DECL void (*pcre_free)(void *); +PCRE_EXP_DECL void *(*pcre_stack_malloc)(size_t); +PCRE_EXP_DECL void (*pcre_stack_free)(void *); +PCRE_EXP_DECL int (*pcre_callout)(pcre_callout_block *); +PCRE_EXP_DECL int (*pcre_stack_guard)(void); + +PCRE_EXP_DECL void *(*pcre16_malloc)(size_t); +PCRE_EXP_DECL void (*pcre16_free)(void *); +PCRE_EXP_DECL void *(*pcre16_stack_malloc)(size_t); +PCRE_EXP_DECL void (*pcre16_stack_free)(void *); +PCRE_EXP_DECL int (*pcre16_callout)(pcre16_callout_block *); +PCRE_EXP_DECL int (*pcre16_stack_guard)(void); + +PCRE_EXP_DECL void *(*pcre32_malloc)(size_t); +PCRE_EXP_DECL void (*pcre32_free)(void *); +PCRE_EXP_DECL void *(*pcre32_stack_malloc)(size_t); +PCRE_EXP_DECL void (*pcre32_stack_free)(void *); +PCRE_EXP_DECL int (*pcre32_callout)(pcre32_callout_block *); +PCRE_EXP_DECL int (*pcre32_stack_guard)(void); +#else /* VPCOMPAT */ +PCRE_EXP_DECL void *pcre_malloc(size_t); +PCRE_EXP_DECL void pcre_free(void *); +PCRE_EXP_DECL void *pcre_stack_malloc(size_t); +PCRE_EXP_DECL void pcre_stack_free(void *); +PCRE_EXP_DECL int pcre_callout(pcre_callout_block *); +PCRE_EXP_DECL int pcre_stack_guard(void); + +PCRE_EXP_DECL void *pcre16_malloc(size_t); +PCRE_EXP_DECL void pcre16_free(void *); +PCRE_EXP_DECL void *pcre16_stack_malloc(size_t); +PCRE_EXP_DECL void pcre16_stack_free(void *); +PCRE_EXP_DECL int pcre16_callout(pcre16_callout_block *); +PCRE_EXP_DECL int pcre16_stack_guard(void); + +PCRE_EXP_DECL void *pcre32_malloc(size_t); +PCRE_EXP_DECL void pcre32_free(void *); +PCRE_EXP_DECL void *pcre32_stack_malloc(size_t); +PCRE_EXP_DECL void pcre32_stack_free(void *); +PCRE_EXP_DECL int pcre32_callout(pcre32_callout_block *); +PCRE_EXP_DECL int pcre32_stack_guard(void); +#endif /* VPCOMPAT */ + +/* User defined callback which provides a stack just before the match starts. */ + +typedef pcre_jit_stack *(*pcre_jit_callback)(void *); +typedef pcre16_jit_stack *(*pcre16_jit_callback)(void *); +typedef pcre32_jit_stack *(*pcre32_jit_callback)(void *); + +/* Exported PCRE functions */ + +PCRE_EXP_DECL pcre *pcre_compile(const char *, int, const char **, int *, + const unsigned char *); +PCRE_EXP_DECL pcre16 *pcre16_compile(PCRE_SPTR16, int, const char **, int *, + const unsigned char *); +PCRE_EXP_DECL pcre32 *pcre32_compile(PCRE_SPTR32, int, const char **, int *, + const unsigned char *); +PCRE_EXP_DECL pcre *pcre_compile2(const char *, int, int *, const char **, + int *, const unsigned char *); +PCRE_EXP_DECL pcre16 *pcre16_compile2(PCRE_SPTR16, int, int *, const char **, + int *, const unsigned char *); +PCRE_EXP_DECL pcre32 *pcre32_compile2(PCRE_SPTR32, int, int *, const char **, + int *, const unsigned char *); +PCRE_EXP_DECL int pcre_config(int, void *); +PCRE_EXP_DECL int pcre16_config(int, void *); +PCRE_EXP_DECL int pcre32_config(int, void *); +PCRE_EXP_DECL int pcre_copy_named_substring(const pcre *, const char *, + int *, int, const char *, char *, int); +PCRE_EXP_DECL int pcre16_copy_named_substring(const pcre16 *, PCRE_SPTR16, + int *, int, PCRE_SPTR16, PCRE_UCHAR16 *, int); +PCRE_EXP_DECL int pcre32_copy_named_substring(const pcre32 *, PCRE_SPTR32, + int *, int, PCRE_SPTR32, PCRE_UCHAR32 *, int); +PCRE_EXP_DECL int pcre_copy_substring(const char *, int *, int, int, + char *, int); +PCRE_EXP_DECL int pcre16_copy_substring(PCRE_SPTR16, int *, int, int, + PCRE_UCHAR16 *, int); +PCRE_EXP_DECL int pcre32_copy_substring(PCRE_SPTR32, int *, int, int, + PCRE_UCHAR32 *, int); +PCRE_EXP_DECL int pcre_dfa_exec(const pcre *, const pcre_extra *, + const char *, int, int, int, int *, int , int *, int); +PCRE_EXP_DECL int pcre16_dfa_exec(const pcre16 *, const pcre16_extra *, + PCRE_SPTR16, int, int, int, int *, int , int *, int); +PCRE_EXP_DECL int pcre32_dfa_exec(const pcre32 *, const pcre32_extra *, + PCRE_SPTR32, int, int, int, int *, int , int *, int); +PCRE_EXP_DECL int pcre_exec(const pcre *, const pcre_extra *, PCRE_SPTR, + int, int, int, int *, int); +PCRE_EXP_DECL int pcre16_exec(const pcre16 *, const pcre16_extra *, + PCRE_SPTR16, int, int, int, int *, int); +PCRE_EXP_DECL int pcre32_exec(const pcre32 *, const pcre32_extra *, + PCRE_SPTR32, int, int, int, int *, int); +PCRE_EXP_DECL int pcre_jit_exec(const pcre *, const pcre_extra *, + PCRE_SPTR, int, int, int, int *, int, + pcre_jit_stack *); +PCRE_EXP_DECL int pcre16_jit_exec(const pcre16 *, const pcre16_extra *, + PCRE_SPTR16, int, int, int, int *, int, + pcre16_jit_stack *); +PCRE_EXP_DECL int pcre32_jit_exec(const pcre32 *, const pcre32_extra *, + PCRE_SPTR32, int, int, int, int *, int, + pcre32_jit_stack *); +PCRE_EXP_DECL void pcre_free_substring(const char *); +PCRE_EXP_DECL void pcre16_free_substring(PCRE_SPTR16); +PCRE_EXP_DECL void pcre32_free_substring(PCRE_SPTR32); +PCRE_EXP_DECL void pcre_free_substring_list(const char **); +PCRE_EXP_DECL void pcre16_free_substring_list(PCRE_SPTR16 *); +PCRE_EXP_DECL void pcre32_free_substring_list(PCRE_SPTR32 *); +PCRE_EXP_DECL int pcre_fullinfo(const pcre *, const pcre_extra *, int, + void *); +PCRE_EXP_DECL int pcre16_fullinfo(const pcre16 *, const pcre16_extra *, int, + void *); +PCRE_EXP_DECL int pcre32_fullinfo(const pcre32 *, const pcre32_extra *, int, + void *); +PCRE_EXP_DECL int pcre_get_named_substring(const pcre *, const char *, + int *, int, const char *, const char **); +PCRE_EXP_DECL int pcre16_get_named_substring(const pcre16 *, PCRE_SPTR16, + int *, int, PCRE_SPTR16, PCRE_SPTR16 *); +PCRE_EXP_DECL int pcre32_get_named_substring(const pcre32 *, PCRE_SPTR32, + int *, int, PCRE_SPTR32, PCRE_SPTR32 *); +PCRE_EXP_DECL int pcre_get_stringnumber(const pcre *, const char *); +PCRE_EXP_DECL int pcre16_get_stringnumber(const pcre16 *, PCRE_SPTR16); +PCRE_EXP_DECL int pcre32_get_stringnumber(const pcre32 *, PCRE_SPTR32); +PCRE_EXP_DECL int pcre_get_stringtable_entries(const pcre *, const char *, + char **, char **); +PCRE_EXP_DECL int pcre16_get_stringtable_entries(const pcre16 *, PCRE_SPTR16, + PCRE_UCHAR16 **, PCRE_UCHAR16 **); +PCRE_EXP_DECL int pcre32_get_stringtable_entries(const pcre32 *, PCRE_SPTR32, + PCRE_UCHAR32 **, PCRE_UCHAR32 **); +PCRE_EXP_DECL int pcre_get_substring(const char *, int *, int, int, + const char **); +PCRE_EXP_DECL int pcre16_get_substring(PCRE_SPTR16, int *, int, int, + PCRE_SPTR16 *); +PCRE_EXP_DECL int pcre32_get_substring(PCRE_SPTR32, int *, int, int, + PCRE_SPTR32 *); +PCRE_EXP_DECL int pcre_get_substring_list(const char *, int *, int, + const char ***); +PCRE_EXP_DECL int pcre16_get_substring_list(PCRE_SPTR16, int *, int, + PCRE_SPTR16 **); +PCRE_EXP_DECL int pcre32_get_substring_list(PCRE_SPTR32, int *, int, + PCRE_SPTR32 **); +PCRE_EXP_DECL const unsigned char *pcre_maketables(void); +PCRE_EXP_DECL const unsigned char *pcre16_maketables(void); +PCRE_EXP_DECL const unsigned char *pcre32_maketables(void); +PCRE_EXP_DECL int pcre_refcount(pcre *, int); +PCRE_EXP_DECL int pcre16_refcount(pcre16 *, int); +PCRE_EXP_DECL int pcre32_refcount(pcre32 *, int); +PCRE_EXP_DECL pcre_extra *pcre_study(const pcre *, int, const char **); +PCRE_EXP_DECL pcre16_extra *pcre16_study(const pcre16 *, int, const char **); +PCRE_EXP_DECL pcre32_extra *pcre32_study(const pcre32 *, int, const char **); +PCRE_EXP_DECL void pcre_free_study(pcre_extra *); +PCRE_EXP_DECL void pcre16_free_study(pcre16_extra *); +PCRE_EXP_DECL void pcre32_free_study(pcre32_extra *); +PCRE_EXP_DECL const char *pcre_version(void); +PCRE_EXP_DECL const char *pcre16_version(void); +PCRE_EXP_DECL const char *pcre32_version(void); + +/* Utility functions for byte order swaps. */ +PCRE_EXP_DECL int pcre_pattern_to_host_byte_order(pcre *, pcre_extra *, + const unsigned char *); +PCRE_EXP_DECL int pcre16_pattern_to_host_byte_order(pcre16 *, pcre16_extra *, + const unsigned char *); +PCRE_EXP_DECL int pcre32_pattern_to_host_byte_order(pcre32 *, pcre32_extra *, + const unsigned char *); +PCRE_EXP_DECL int pcre16_utf16_to_host_byte_order(PCRE_UCHAR16 *, + PCRE_SPTR16, int, int *, int); +PCRE_EXP_DECL int pcre32_utf32_to_host_byte_order(PCRE_UCHAR32 *, + PCRE_SPTR32, int, int *, int); + +/* JIT compiler related functions. */ + +PCRE_EXP_DECL pcre_jit_stack *pcre_jit_stack_alloc(int, int); +PCRE_EXP_DECL pcre16_jit_stack *pcre16_jit_stack_alloc(int, int); +PCRE_EXP_DECL pcre32_jit_stack *pcre32_jit_stack_alloc(int, int); +PCRE_EXP_DECL void pcre_jit_stack_free(pcre_jit_stack *); +PCRE_EXP_DECL void pcre16_jit_stack_free(pcre16_jit_stack *); +PCRE_EXP_DECL void pcre32_jit_stack_free(pcre32_jit_stack *); +PCRE_EXP_DECL void pcre_assign_jit_stack(pcre_extra *, + pcre_jit_callback, void *); +PCRE_EXP_DECL void pcre16_assign_jit_stack(pcre16_extra *, + pcre16_jit_callback, void *); +PCRE_EXP_DECL void pcre32_assign_jit_stack(pcre32_extra *, + pcre32_jit_callback, void *); +PCRE_EXP_DECL void pcre_jit_free_unused_memory(void); +PCRE_EXP_DECL void pcre16_jit_free_unused_memory(void); +PCRE_EXP_DECL void pcre32_jit_free_unused_memory(void); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* End of pcre.h */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre.h.in b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre.h.in new file mode 100755 index 000000000..d4d789269 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre.h.in @@ -0,0 +1,677 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* This is the public header file for the PCRE library, to be #included by +applications that call the PCRE functions. + + Copyright (c) 1997-2014 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +#ifndef _PCRE_H +#define _PCRE_H + +/* The current PCRE version information. */ + +#define PCRE_MAJOR @PCRE_MAJOR@ +#define PCRE_MINOR @PCRE_MINOR@ +#define PCRE_PRERELEASE @PCRE_PRERELEASE@ +#define PCRE_DATE @PCRE_DATE@ + +/* When an application links to a PCRE DLL in Windows, the symbols that are +imported have to be identified as such. When building PCRE, the appropriate +export setting is defined in pcre_internal.h, which includes this file. So we +don't change existing definitions of PCRE_EXP_DECL and PCRECPP_EXP_DECL. */ + +#if defined(_WIN32) && !defined(PCRE_STATIC) +# ifndef PCRE_EXP_DECL +# define PCRE_EXP_DECL extern __declspec(dllimport) +# endif +# ifdef __cplusplus +# ifndef PCRECPP_EXP_DECL +# define PCRECPP_EXP_DECL extern __declspec(dllimport) +# endif +# ifndef PCRECPP_EXP_DEFN +# define PCRECPP_EXP_DEFN __declspec(dllimport) +# endif +# endif +#endif + +/* By default, we use the standard "extern" declarations. */ + +#ifndef PCRE_EXP_DECL +# ifdef __cplusplus +# define PCRE_EXP_DECL extern "C" +# else +# define PCRE_EXP_DECL extern +# endif +#endif + +#ifdef __cplusplus +# ifndef PCRECPP_EXP_DECL +# define PCRECPP_EXP_DECL extern +# endif +# ifndef PCRECPP_EXP_DEFN +# define PCRECPP_EXP_DEFN +# endif +#endif + +/* Have to include stdlib.h in order to ensure that size_t is defined; +it is needed here for malloc. */ + +#include + +/* Allow for C++ users */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Public options. Some are compile-time only, some are run-time only, and some +are both. Most of the compile-time options are saved with the compiled regex so +that they can be inspected during studying (and therefore JIT compiling). Note +that pcre_study() has its own set of options. Originally, all the options +defined here used distinct bits. However, almost all the bits in a 32-bit word +are now used, so in order to conserve them, option bits that were previously +only recognized at matching time (i.e. by pcre_exec() or pcre_dfa_exec()) may +also be used for compile-time options that affect only compiling and are not +relevant for studying or JIT compiling. + +Some options for pcre_compile() change its behaviour but do not affect the +behaviour of the execution functions. Other options are passed through to the +execution functions and affect their behaviour, with or without affecting the +behaviour of pcre_compile(). + +Options that can be passed to pcre_compile() are tagged Cx below, with these +variants: + +C1 Affects compile only +C2 Does not affect compile; affects exec, dfa_exec +C3 Affects compile, exec, dfa_exec +C4 Affects compile, exec, dfa_exec, study +C5 Affects compile, exec, study + +Options that can be set for pcre_exec() and/or pcre_dfa_exec() are flagged with +E and D, respectively. They take precedence over C3, C4, and C5 settings passed +from pcre_compile(). Those that are compatible with JIT execution are flagged +with J. */ + +#define PCRE_CASELESS 0x00000001 /* C1 */ +#define PCRE_MULTILINE 0x00000002 /* C1 */ +#define PCRE_DOTALL 0x00000004 /* C1 */ +#define PCRE_EXTENDED 0x00000008 /* C1 */ +#define PCRE_ANCHORED 0x00000010 /* C4 E D */ +#define PCRE_DOLLAR_ENDONLY 0x00000020 /* C2 */ +#define PCRE_EXTRA 0x00000040 /* C1 */ +#define PCRE_NOTBOL 0x00000080 /* E D J */ +#define PCRE_NOTEOL 0x00000100 /* E D J */ +#define PCRE_UNGREEDY 0x00000200 /* C1 */ +#define PCRE_NOTEMPTY 0x00000400 /* E D J */ +#define PCRE_UTF8 0x00000800 /* C4 ) */ +#define PCRE_UTF16 0x00000800 /* C4 ) Synonyms */ +#define PCRE_UTF32 0x00000800 /* C4 ) */ +#define PCRE_NO_AUTO_CAPTURE 0x00001000 /* C1 */ +#define PCRE_NO_UTF8_CHECK 0x00002000 /* C1 E D J ) */ +#define PCRE_NO_UTF16_CHECK 0x00002000 /* C1 E D J ) Synonyms */ +#define PCRE_NO_UTF32_CHECK 0x00002000 /* C1 E D J ) */ +#define PCRE_AUTO_CALLOUT 0x00004000 /* C1 */ +#define PCRE_PARTIAL_SOFT 0x00008000 /* E D J ) Synonyms */ +#define PCRE_PARTIAL 0x00008000 /* E D J ) */ + +/* This pair use the same bit. */ +#define PCRE_NEVER_UTF 0x00010000 /* C1 ) Overlaid */ +#define PCRE_DFA_SHORTEST 0x00010000 /* D ) Overlaid */ + +/* This pair use the same bit. */ +#define PCRE_NO_AUTO_POSSESS 0x00020000 /* C1 ) Overlaid */ +#define PCRE_DFA_RESTART 0x00020000 /* D ) Overlaid */ + +#define PCRE_FIRSTLINE 0x00040000 /* C3 */ +#define PCRE_DUPNAMES 0x00080000 /* C1 */ +#define PCRE_NEWLINE_CR 0x00100000 /* C3 E D */ +#define PCRE_NEWLINE_LF 0x00200000 /* C3 E D */ +#define PCRE_NEWLINE_CRLF 0x00300000 /* C3 E D */ +#define PCRE_NEWLINE_ANY 0x00400000 /* C3 E D */ +#define PCRE_NEWLINE_ANYCRLF 0x00500000 /* C3 E D */ +#define PCRE_BSR_ANYCRLF 0x00800000 /* C3 E D */ +#define PCRE_BSR_UNICODE 0x01000000 /* C3 E D */ +#define PCRE_JAVASCRIPT_COMPAT 0x02000000 /* C5 */ +#define PCRE_NO_START_OPTIMIZE 0x04000000 /* C2 E D ) Synonyms */ +#define PCRE_NO_START_OPTIMISE 0x04000000 /* C2 E D ) */ +#define PCRE_PARTIAL_HARD 0x08000000 /* E D J */ +#define PCRE_NOTEMPTY_ATSTART 0x10000000 /* E D J */ +#define PCRE_UCP 0x20000000 /* C3 */ + +/* Exec-time and get/set-time error codes */ + +#define PCRE_ERROR_NOMATCH (-1) +#define PCRE_ERROR_NULL (-2) +#define PCRE_ERROR_BADOPTION (-3) +#define PCRE_ERROR_BADMAGIC (-4) +#define PCRE_ERROR_UNKNOWN_OPCODE (-5) +#define PCRE_ERROR_UNKNOWN_NODE (-5) /* For backward compatibility */ +#define PCRE_ERROR_NOMEMORY (-6) +#define PCRE_ERROR_NOSUBSTRING (-7) +#define PCRE_ERROR_MATCHLIMIT (-8) +#define PCRE_ERROR_CALLOUT (-9) /* Never used by PCRE itself */ +#define PCRE_ERROR_BADUTF8 (-10) /* Same for 8/16/32 */ +#define PCRE_ERROR_BADUTF16 (-10) /* Same for 8/16/32 */ +#define PCRE_ERROR_BADUTF32 (-10) /* Same for 8/16/32 */ +#define PCRE_ERROR_BADUTF8_OFFSET (-11) /* Same for 8/16 */ +#define PCRE_ERROR_BADUTF16_OFFSET (-11) /* Same for 8/16 */ +#define PCRE_ERROR_PARTIAL (-12) +#define PCRE_ERROR_BADPARTIAL (-13) +#define PCRE_ERROR_INTERNAL (-14) +#define PCRE_ERROR_BADCOUNT (-15) +#define PCRE_ERROR_DFA_UITEM (-16) +#define PCRE_ERROR_DFA_UCOND (-17) +#define PCRE_ERROR_DFA_UMLIMIT (-18) +#define PCRE_ERROR_DFA_WSSIZE (-19) +#define PCRE_ERROR_DFA_RECURSE (-20) +#define PCRE_ERROR_RECURSIONLIMIT (-21) +#define PCRE_ERROR_NULLWSLIMIT (-22) /* No longer actually used */ +#define PCRE_ERROR_BADNEWLINE (-23) +#define PCRE_ERROR_BADOFFSET (-24) +#define PCRE_ERROR_SHORTUTF8 (-25) +#define PCRE_ERROR_SHORTUTF16 (-25) /* Same for 8/16 */ +#define PCRE_ERROR_RECURSELOOP (-26) +#define PCRE_ERROR_JIT_STACKLIMIT (-27) +#define PCRE_ERROR_BADMODE (-28) +#define PCRE_ERROR_BADENDIANNESS (-29) +#define PCRE_ERROR_DFA_BADRESTART (-30) +#define PCRE_ERROR_JIT_BADOPTION (-31) +#define PCRE_ERROR_BADLENGTH (-32) +#define PCRE_ERROR_UNSET (-33) + +/* Specific error codes for UTF-8 validity checks */ + +#define PCRE_UTF8_ERR0 0 +#define PCRE_UTF8_ERR1 1 +#define PCRE_UTF8_ERR2 2 +#define PCRE_UTF8_ERR3 3 +#define PCRE_UTF8_ERR4 4 +#define PCRE_UTF8_ERR5 5 +#define PCRE_UTF8_ERR6 6 +#define PCRE_UTF8_ERR7 7 +#define PCRE_UTF8_ERR8 8 +#define PCRE_UTF8_ERR9 9 +#define PCRE_UTF8_ERR10 10 +#define PCRE_UTF8_ERR11 11 +#define PCRE_UTF8_ERR12 12 +#define PCRE_UTF8_ERR13 13 +#define PCRE_UTF8_ERR14 14 +#define PCRE_UTF8_ERR15 15 +#define PCRE_UTF8_ERR16 16 +#define PCRE_UTF8_ERR17 17 +#define PCRE_UTF8_ERR18 18 +#define PCRE_UTF8_ERR19 19 +#define PCRE_UTF8_ERR20 20 +#define PCRE_UTF8_ERR21 21 +#define PCRE_UTF8_ERR22 22 /* Unused (was non-character) */ + +/* Specific error codes for UTF-16 validity checks */ + +#define PCRE_UTF16_ERR0 0 +#define PCRE_UTF16_ERR1 1 +#define PCRE_UTF16_ERR2 2 +#define PCRE_UTF16_ERR3 3 +#define PCRE_UTF16_ERR4 4 /* Unused (was non-character) */ + +/* Specific error codes for UTF-32 validity checks */ + +#define PCRE_UTF32_ERR0 0 +#define PCRE_UTF32_ERR1 1 +#define PCRE_UTF32_ERR2 2 /* Unused (was non-character) */ +#define PCRE_UTF32_ERR3 3 + +/* Request types for pcre_fullinfo() */ + +#define PCRE_INFO_OPTIONS 0 +#define PCRE_INFO_SIZE 1 +#define PCRE_INFO_CAPTURECOUNT 2 +#define PCRE_INFO_BACKREFMAX 3 +#define PCRE_INFO_FIRSTBYTE 4 +#define PCRE_INFO_FIRSTCHAR 4 /* For backwards compatibility */ +#define PCRE_INFO_FIRSTTABLE 5 +#define PCRE_INFO_LASTLITERAL 6 +#define PCRE_INFO_NAMEENTRYSIZE 7 +#define PCRE_INFO_NAMECOUNT 8 +#define PCRE_INFO_NAMETABLE 9 +#define PCRE_INFO_STUDYSIZE 10 +#define PCRE_INFO_DEFAULT_TABLES 11 +#define PCRE_INFO_OKPARTIAL 12 +#define PCRE_INFO_JCHANGED 13 +#define PCRE_INFO_HASCRORLF 14 +#define PCRE_INFO_MINLENGTH 15 +#define PCRE_INFO_JIT 16 +#define PCRE_INFO_JITSIZE 17 +#define PCRE_INFO_MAXLOOKBEHIND 18 +#define PCRE_INFO_FIRSTCHARACTER 19 +#define PCRE_INFO_FIRSTCHARACTERFLAGS 20 +#define PCRE_INFO_REQUIREDCHAR 21 +#define PCRE_INFO_REQUIREDCHARFLAGS 22 +#define PCRE_INFO_MATCHLIMIT 23 +#define PCRE_INFO_RECURSIONLIMIT 24 +#define PCRE_INFO_MATCH_EMPTY 25 + +/* Request types for pcre_config(). Do not re-arrange, in order to remain +compatible. */ + +#define PCRE_CONFIG_UTF8 0 +#define PCRE_CONFIG_NEWLINE 1 +#define PCRE_CONFIG_LINK_SIZE 2 +#define PCRE_CONFIG_POSIX_MALLOC_THRESHOLD 3 +#define PCRE_CONFIG_MATCH_LIMIT 4 +#define PCRE_CONFIG_STACKRECURSE 5 +#define PCRE_CONFIG_UNICODE_PROPERTIES 6 +#define PCRE_CONFIG_MATCH_LIMIT_RECURSION 7 +#define PCRE_CONFIG_BSR 8 +#define PCRE_CONFIG_JIT 9 +#define PCRE_CONFIG_UTF16 10 +#define PCRE_CONFIG_JITTARGET 11 +#define PCRE_CONFIG_UTF32 12 +#define PCRE_CONFIG_PARENS_LIMIT 13 + +/* Request types for pcre_study(). Do not re-arrange, in order to remain +compatible. */ + +#define PCRE_STUDY_JIT_COMPILE 0x0001 +#define PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE 0x0002 +#define PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE 0x0004 +#define PCRE_STUDY_EXTRA_NEEDED 0x0008 + +/* Bit flags for the pcre[16|32]_extra structure. Do not re-arrange or redefine +these bits, just add new ones on the end, in order to remain compatible. */ + +#define PCRE_EXTRA_STUDY_DATA 0x0001 +#define PCRE_EXTRA_MATCH_LIMIT 0x0002 +#define PCRE_EXTRA_CALLOUT_DATA 0x0004 +#define PCRE_EXTRA_TABLES 0x0008 +#define PCRE_EXTRA_MATCH_LIMIT_RECURSION 0x0010 +#define PCRE_EXTRA_MARK 0x0020 +#define PCRE_EXTRA_EXECUTABLE_JIT 0x0040 + +/* Types */ + +struct real_pcre8_or_16; /* declaration; the definition is private */ +typedef struct real_pcre8_or_16 pcre; + +struct real_pcre8_or_16; /* declaration; the definition is private */ +typedef struct real_pcre8_or_16 pcre16; + +struct real_pcre32; /* declaration; the definition is private */ +typedef struct real_pcre32 pcre32; + +struct real_pcre_jit_stack; /* declaration; the definition is private */ +typedef struct real_pcre_jit_stack pcre_jit_stack; + +struct real_pcre16_jit_stack; /* declaration; the definition is private */ +typedef struct real_pcre16_jit_stack pcre16_jit_stack; + +struct real_pcre32_jit_stack; /* declaration; the definition is private */ +typedef struct real_pcre32_jit_stack pcre32_jit_stack; + +/* If PCRE is compiled with 16 bit character support, PCRE_UCHAR16 must contain +a 16 bit wide signed data type. Otherwise it can be a dummy data type since +pcre16 functions are not implemented. There is a check for this in pcre_internal.h. */ +#ifndef PCRE_UCHAR16 +#define PCRE_UCHAR16 unsigned short +#endif + +#ifndef PCRE_SPTR16 +#define PCRE_SPTR16 const PCRE_UCHAR16 * +#endif + +/* If PCRE is compiled with 32 bit character support, PCRE_UCHAR32 must contain +a 32 bit wide signed data type. Otherwise it can be a dummy data type since +pcre32 functions are not implemented. There is a check for this in pcre_internal.h. */ +#ifndef PCRE_UCHAR32 +#define PCRE_UCHAR32 unsigned int +#endif + +#ifndef PCRE_SPTR32 +#define PCRE_SPTR32 const PCRE_UCHAR32 * +#endif + +/* When PCRE is compiled as a C++ library, the subject pointer type can be +replaced with a custom type. For conventional use, the public interface is a +const char *. */ + +#ifndef PCRE_SPTR +#define PCRE_SPTR const char * +#endif + +/* The structure for passing additional data to pcre_exec(). This is defined in +such as way as to be extensible. Always add new fields at the end, in order to +remain compatible. */ + +typedef struct pcre_extra { + unsigned long int flags; /* Bits for which fields are set */ + void *study_data; /* Opaque data from pcre_study() */ + unsigned long int match_limit; /* Maximum number of calls to match() */ + void *callout_data; /* Data passed back in callouts */ + const unsigned char *tables; /* Pointer to character tables */ + unsigned long int match_limit_recursion; /* Max recursive calls to match() */ + unsigned char **mark; /* For passing back a mark pointer */ + void *executable_jit; /* Contains a pointer to a compiled jit code */ +} pcre_extra; + +/* Same structure as above, but with 16 bit char pointers. */ + +typedef struct pcre16_extra { + unsigned long int flags; /* Bits for which fields are set */ + void *study_data; /* Opaque data from pcre_study() */ + unsigned long int match_limit; /* Maximum number of calls to match() */ + void *callout_data; /* Data passed back in callouts */ + const unsigned char *tables; /* Pointer to character tables */ + unsigned long int match_limit_recursion; /* Max recursive calls to match() */ + PCRE_UCHAR16 **mark; /* For passing back a mark pointer */ + void *executable_jit; /* Contains a pointer to a compiled jit code */ +} pcre16_extra; + +/* Same structure as above, but with 32 bit char pointers. */ + +typedef struct pcre32_extra { + unsigned long int flags; /* Bits for which fields are set */ + void *study_data; /* Opaque data from pcre_study() */ + unsigned long int match_limit; /* Maximum number of calls to match() */ + void *callout_data; /* Data passed back in callouts */ + const unsigned char *tables; /* Pointer to character tables */ + unsigned long int match_limit_recursion; /* Max recursive calls to match() */ + PCRE_UCHAR32 **mark; /* For passing back a mark pointer */ + void *executable_jit; /* Contains a pointer to a compiled jit code */ +} pcre32_extra; + +/* The structure for passing out data via the pcre_callout_function. We use a +structure so that new fields can be added on the end in future versions, +without changing the API of the function, thereby allowing old clients to work +without modification. */ + +typedef struct pcre_callout_block { + int version; /* Identifies version of block */ + /* ------------------------ Version 0 ------------------------------- */ + int callout_number; /* Number compiled into pattern */ + int *offset_vector; /* The offset vector */ + PCRE_SPTR subject; /* The subject being matched */ + int subject_length; /* The length of the subject */ + int start_match; /* Offset to start of this match attempt */ + int current_position; /* Where we currently are in the subject */ + int capture_top; /* Max current capture */ + int capture_last; /* Most recently closed capture */ + void *callout_data; /* Data passed in with the call */ + /* ------------------- Added for Version 1 -------------------------- */ + int pattern_position; /* Offset to next item in the pattern */ + int next_item_length; /* Length of next item in the pattern */ + /* ------------------- Added for Version 2 -------------------------- */ + const unsigned char *mark; /* Pointer to current mark or NULL */ + /* ------------------------------------------------------------------ */ +} pcre_callout_block; + +/* Same structure as above, but with 16 bit char pointers. */ + +typedef struct pcre16_callout_block { + int version; /* Identifies version of block */ + /* ------------------------ Version 0 ------------------------------- */ + int callout_number; /* Number compiled into pattern */ + int *offset_vector; /* The offset vector */ + PCRE_SPTR16 subject; /* The subject being matched */ + int subject_length; /* The length of the subject */ + int start_match; /* Offset to start of this match attempt */ + int current_position; /* Where we currently are in the subject */ + int capture_top; /* Max current capture */ + int capture_last; /* Most recently closed capture */ + void *callout_data; /* Data passed in with the call */ + /* ------------------- Added for Version 1 -------------------------- */ + int pattern_position; /* Offset to next item in the pattern */ + int next_item_length; /* Length of next item in the pattern */ + /* ------------------- Added for Version 2 -------------------------- */ + const PCRE_UCHAR16 *mark; /* Pointer to current mark or NULL */ + /* ------------------------------------------------------------------ */ +} pcre16_callout_block; + +/* Same structure as above, but with 32 bit char pointers. */ + +typedef struct pcre32_callout_block { + int version; /* Identifies version of block */ + /* ------------------------ Version 0 ------------------------------- */ + int callout_number; /* Number compiled into pattern */ + int *offset_vector; /* The offset vector */ + PCRE_SPTR32 subject; /* The subject being matched */ + int subject_length; /* The length of the subject */ + int start_match; /* Offset to start of this match attempt */ + int current_position; /* Where we currently are in the subject */ + int capture_top; /* Max current capture */ + int capture_last; /* Most recently closed capture */ + void *callout_data; /* Data passed in with the call */ + /* ------------------- Added for Version 1 -------------------------- */ + int pattern_position; /* Offset to next item in the pattern */ + int next_item_length; /* Length of next item in the pattern */ + /* ------------------- Added for Version 2 -------------------------- */ + const PCRE_UCHAR32 *mark; /* Pointer to current mark or NULL */ + /* ------------------------------------------------------------------ */ +} pcre32_callout_block; + +/* Indirection for store get and free functions. These can be set to +alternative malloc/free functions if required. Special ones are used in the +non-recursive case for "frames". There is also an optional callout function +that is triggered by the (?) regex item. For Virtual Pascal, these definitions +have to take another form. */ + +#ifndef VPCOMPAT +PCRE_EXP_DECL void *(*pcre_malloc)(size_t); +PCRE_EXP_DECL void (*pcre_free)(void *); +PCRE_EXP_DECL void *(*pcre_stack_malloc)(size_t); +PCRE_EXP_DECL void (*pcre_stack_free)(void *); +PCRE_EXP_DECL int (*pcre_callout)(pcre_callout_block *); +PCRE_EXP_DECL int (*pcre_stack_guard)(void); + +PCRE_EXP_DECL void *(*pcre16_malloc)(size_t); +PCRE_EXP_DECL void (*pcre16_free)(void *); +PCRE_EXP_DECL void *(*pcre16_stack_malloc)(size_t); +PCRE_EXP_DECL void (*pcre16_stack_free)(void *); +PCRE_EXP_DECL int (*pcre16_callout)(pcre16_callout_block *); +PCRE_EXP_DECL int (*pcre16_stack_guard)(void); + +PCRE_EXP_DECL void *(*pcre32_malloc)(size_t); +PCRE_EXP_DECL void (*pcre32_free)(void *); +PCRE_EXP_DECL void *(*pcre32_stack_malloc)(size_t); +PCRE_EXP_DECL void (*pcre32_stack_free)(void *); +PCRE_EXP_DECL int (*pcre32_callout)(pcre32_callout_block *); +PCRE_EXP_DECL int (*pcre32_stack_guard)(void); +#else /* VPCOMPAT */ +PCRE_EXP_DECL void *pcre_malloc(size_t); +PCRE_EXP_DECL void pcre_free(void *); +PCRE_EXP_DECL void *pcre_stack_malloc(size_t); +PCRE_EXP_DECL void pcre_stack_free(void *); +PCRE_EXP_DECL int pcre_callout(pcre_callout_block *); +PCRE_EXP_DECL int pcre_stack_guard(void); + +PCRE_EXP_DECL void *pcre16_malloc(size_t); +PCRE_EXP_DECL void pcre16_free(void *); +PCRE_EXP_DECL void *pcre16_stack_malloc(size_t); +PCRE_EXP_DECL void pcre16_stack_free(void *); +PCRE_EXP_DECL int pcre16_callout(pcre16_callout_block *); +PCRE_EXP_DECL int pcre16_stack_guard(void); + +PCRE_EXP_DECL void *pcre32_malloc(size_t); +PCRE_EXP_DECL void pcre32_free(void *); +PCRE_EXP_DECL void *pcre32_stack_malloc(size_t); +PCRE_EXP_DECL void pcre32_stack_free(void *); +PCRE_EXP_DECL int pcre32_callout(pcre32_callout_block *); +PCRE_EXP_DECL int pcre32_stack_guard(void); +#endif /* VPCOMPAT */ + +/* User defined callback which provides a stack just before the match starts. */ + +typedef pcre_jit_stack *(*pcre_jit_callback)(void *); +typedef pcre16_jit_stack *(*pcre16_jit_callback)(void *); +typedef pcre32_jit_stack *(*pcre32_jit_callback)(void *); + +/* Exported PCRE functions */ + +PCRE_EXP_DECL pcre *pcre_compile(const char *, int, const char **, int *, + const unsigned char *); +PCRE_EXP_DECL pcre16 *pcre16_compile(PCRE_SPTR16, int, const char **, int *, + const unsigned char *); +PCRE_EXP_DECL pcre32 *pcre32_compile(PCRE_SPTR32, int, const char **, int *, + const unsigned char *); +PCRE_EXP_DECL pcre *pcre_compile2(const char *, int, int *, const char **, + int *, const unsigned char *); +PCRE_EXP_DECL pcre16 *pcre16_compile2(PCRE_SPTR16, int, int *, const char **, + int *, const unsigned char *); +PCRE_EXP_DECL pcre32 *pcre32_compile2(PCRE_SPTR32, int, int *, const char **, + int *, const unsigned char *); +PCRE_EXP_DECL int pcre_config(int, void *); +PCRE_EXP_DECL int pcre16_config(int, void *); +PCRE_EXP_DECL int pcre32_config(int, void *); +PCRE_EXP_DECL int pcre_copy_named_substring(const pcre *, const char *, + int *, int, const char *, char *, int); +PCRE_EXP_DECL int pcre16_copy_named_substring(const pcre16 *, PCRE_SPTR16, + int *, int, PCRE_SPTR16, PCRE_UCHAR16 *, int); +PCRE_EXP_DECL int pcre32_copy_named_substring(const pcre32 *, PCRE_SPTR32, + int *, int, PCRE_SPTR32, PCRE_UCHAR32 *, int); +PCRE_EXP_DECL int pcre_copy_substring(const char *, int *, int, int, + char *, int); +PCRE_EXP_DECL int pcre16_copy_substring(PCRE_SPTR16, int *, int, int, + PCRE_UCHAR16 *, int); +PCRE_EXP_DECL int pcre32_copy_substring(PCRE_SPTR32, int *, int, int, + PCRE_UCHAR32 *, int); +PCRE_EXP_DECL int pcre_dfa_exec(const pcre *, const pcre_extra *, + const char *, int, int, int, int *, int , int *, int); +PCRE_EXP_DECL int pcre16_dfa_exec(const pcre16 *, const pcre16_extra *, + PCRE_SPTR16, int, int, int, int *, int , int *, int); +PCRE_EXP_DECL int pcre32_dfa_exec(const pcre32 *, const pcre32_extra *, + PCRE_SPTR32, int, int, int, int *, int , int *, int); +PCRE_EXP_DECL int pcre_exec(const pcre *, const pcre_extra *, PCRE_SPTR, + int, int, int, int *, int); +PCRE_EXP_DECL int pcre16_exec(const pcre16 *, const pcre16_extra *, + PCRE_SPTR16, int, int, int, int *, int); +PCRE_EXP_DECL int pcre32_exec(const pcre32 *, const pcre32_extra *, + PCRE_SPTR32, int, int, int, int *, int); +PCRE_EXP_DECL int pcre_jit_exec(const pcre *, const pcre_extra *, + PCRE_SPTR, int, int, int, int *, int, + pcre_jit_stack *); +PCRE_EXP_DECL int pcre16_jit_exec(const pcre16 *, const pcre16_extra *, + PCRE_SPTR16, int, int, int, int *, int, + pcre16_jit_stack *); +PCRE_EXP_DECL int pcre32_jit_exec(const pcre32 *, const pcre32_extra *, + PCRE_SPTR32, int, int, int, int *, int, + pcre32_jit_stack *); +PCRE_EXP_DECL void pcre_free_substring(const char *); +PCRE_EXP_DECL void pcre16_free_substring(PCRE_SPTR16); +PCRE_EXP_DECL void pcre32_free_substring(PCRE_SPTR32); +PCRE_EXP_DECL void pcre_free_substring_list(const char **); +PCRE_EXP_DECL void pcre16_free_substring_list(PCRE_SPTR16 *); +PCRE_EXP_DECL void pcre32_free_substring_list(PCRE_SPTR32 *); +PCRE_EXP_DECL int pcre_fullinfo(const pcre *, const pcre_extra *, int, + void *); +PCRE_EXP_DECL int pcre16_fullinfo(const pcre16 *, const pcre16_extra *, int, + void *); +PCRE_EXP_DECL int pcre32_fullinfo(const pcre32 *, const pcre32_extra *, int, + void *); +PCRE_EXP_DECL int pcre_get_named_substring(const pcre *, const char *, + int *, int, const char *, const char **); +PCRE_EXP_DECL int pcre16_get_named_substring(const pcre16 *, PCRE_SPTR16, + int *, int, PCRE_SPTR16, PCRE_SPTR16 *); +PCRE_EXP_DECL int pcre32_get_named_substring(const pcre32 *, PCRE_SPTR32, + int *, int, PCRE_SPTR32, PCRE_SPTR32 *); +PCRE_EXP_DECL int pcre_get_stringnumber(const pcre *, const char *); +PCRE_EXP_DECL int pcre16_get_stringnumber(const pcre16 *, PCRE_SPTR16); +PCRE_EXP_DECL int pcre32_get_stringnumber(const pcre32 *, PCRE_SPTR32); +PCRE_EXP_DECL int pcre_get_stringtable_entries(const pcre *, const char *, + char **, char **); +PCRE_EXP_DECL int pcre16_get_stringtable_entries(const pcre16 *, PCRE_SPTR16, + PCRE_UCHAR16 **, PCRE_UCHAR16 **); +PCRE_EXP_DECL int pcre32_get_stringtable_entries(const pcre32 *, PCRE_SPTR32, + PCRE_UCHAR32 **, PCRE_UCHAR32 **); +PCRE_EXP_DECL int pcre_get_substring(const char *, int *, int, int, + const char **); +PCRE_EXP_DECL int pcre16_get_substring(PCRE_SPTR16, int *, int, int, + PCRE_SPTR16 *); +PCRE_EXP_DECL int pcre32_get_substring(PCRE_SPTR32, int *, int, int, + PCRE_SPTR32 *); +PCRE_EXP_DECL int pcre_get_substring_list(const char *, int *, int, + const char ***); +PCRE_EXP_DECL int pcre16_get_substring_list(PCRE_SPTR16, int *, int, + PCRE_SPTR16 **); +PCRE_EXP_DECL int pcre32_get_substring_list(PCRE_SPTR32, int *, int, + PCRE_SPTR32 **); +PCRE_EXP_DECL const unsigned char *pcre_maketables(void); +PCRE_EXP_DECL const unsigned char *pcre16_maketables(void); +PCRE_EXP_DECL const unsigned char *pcre32_maketables(void); +PCRE_EXP_DECL int pcre_refcount(pcre *, int); +PCRE_EXP_DECL int pcre16_refcount(pcre16 *, int); +PCRE_EXP_DECL int pcre32_refcount(pcre32 *, int); +PCRE_EXP_DECL pcre_extra *pcre_study(const pcre *, int, const char **); +PCRE_EXP_DECL pcre16_extra *pcre16_study(const pcre16 *, int, const char **); +PCRE_EXP_DECL pcre32_extra *pcre32_study(const pcre32 *, int, const char **); +PCRE_EXP_DECL void pcre_free_study(pcre_extra *); +PCRE_EXP_DECL void pcre16_free_study(pcre16_extra *); +PCRE_EXP_DECL void pcre32_free_study(pcre32_extra *); +PCRE_EXP_DECL const char *pcre_version(void); +PCRE_EXP_DECL const char *pcre16_version(void); +PCRE_EXP_DECL const char *pcre32_version(void); + +/* Utility functions for byte order swaps. */ +PCRE_EXP_DECL int pcre_pattern_to_host_byte_order(pcre *, pcre_extra *, + const unsigned char *); +PCRE_EXP_DECL int pcre16_pattern_to_host_byte_order(pcre16 *, pcre16_extra *, + const unsigned char *); +PCRE_EXP_DECL int pcre32_pattern_to_host_byte_order(pcre32 *, pcre32_extra *, + const unsigned char *); +PCRE_EXP_DECL int pcre16_utf16_to_host_byte_order(PCRE_UCHAR16 *, + PCRE_SPTR16, int, int *, int); +PCRE_EXP_DECL int pcre32_utf32_to_host_byte_order(PCRE_UCHAR32 *, + PCRE_SPTR32, int, int *, int); + +/* JIT compiler related functions. */ + +PCRE_EXP_DECL pcre_jit_stack *pcre_jit_stack_alloc(int, int); +PCRE_EXP_DECL pcre16_jit_stack *pcre16_jit_stack_alloc(int, int); +PCRE_EXP_DECL pcre32_jit_stack *pcre32_jit_stack_alloc(int, int); +PCRE_EXP_DECL void pcre_jit_stack_free(pcre_jit_stack *); +PCRE_EXP_DECL void pcre16_jit_stack_free(pcre16_jit_stack *); +PCRE_EXP_DECL void pcre32_jit_stack_free(pcre32_jit_stack *); +PCRE_EXP_DECL void pcre_assign_jit_stack(pcre_extra *, + pcre_jit_callback, void *); +PCRE_EXP_DECL void pcre16_assign_jit_stack(pcre16_extra *, + pcre16_jit_callback, void *); +PCRE_EXP_DECL void pcre32_assign_jit_stack(pcre32_extra *, + pcre32_jit_callback, void *); +PCRE_EXP_DECL void pcre_jit_free_unused_memory(void); +PCRE_EXP_DECL void pcre16_jit_free_unused_memory(void); +PCRE_EXP_DECL void pcre32_jit_free_unused_memory(void); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* End of pcre.h */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_byte_order.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_byte_order.c new file mode 100755 index 000000000..11d2973a3 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_byte_order.c @@ -0,0 +1,45 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +/* Generate code with 16 bit character support. */ +#define COMPILE_PCRE16 + +#include "pcre_byte_order.c" + +/* End of pcre16_byte_order.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_chartables.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_chartables.c new file mode 100755 index 000000000..7c0ff35f5 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_chartables.c @@ -0,0 +1,45 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +/* Generate code with 16 bit character support. */ +#define COMPILE_PCRE16 + +#include "pcre_chartables.c" + +/* End of pcre16_chartables.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_compile.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_compile.c new file mode 100755 index 000000000..e499b6708 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_compile.c @@ -0,0 +1,45 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +/* Generate code with 16 bit character support. */ +#define COMPILE_PCRE16 + +#include "pcre_compile.c" + +/* End of pcre16_compile.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_config.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_config.c new file mode 100755 index 000000000..b52138764 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_config.c @@ -0,0 +1,45 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +/* Generate code with 16 bit character support. */ +#define COMPILE_PCRE16 + +#include "pcre_config.c" + +/* End of pcre16_config.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_dfa_exec.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_dfa_exec.c new file mode 100755 index 000000000..2ba740e97 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_dfa_exec.c @@ -0,0 +1,45 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +/* Generate code with 16 bit character support. */ +#define COMPILE_PCRE16 + +#include "pcre_dfa_exec.c" + +/* End of pcre16_dfa_exec.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_exec.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_exec.c new file mode 100755 index 000000000..7417b1770 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_exec.c @@ -0,0 +1,45 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +/* Generate code with 16 bit character support. */ +#define COMPILE_PCRE16 + +#include "pcre_exec.c" + +/* End of pcre16_exec.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_fullinfo.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_fullinfo.c new file mode 100755 index 000000000..544dca6ed --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_fullinfo.c @@ -0,0 +1,45 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +/* Generate code with 16 bit character support. */ +#define COMPILE_PCRE16 + +#include "pcre_fullinfo.c" + +/* End of pcre16_fullinfo.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_get.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_get.c new file mode 100755 index 000000000..3ded08c62 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_get.c @@ -0,0 +1,45 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +/* Generate code with 16 bit character support. */ +#define COMPILE_PCRE16 + +#include "pcre_get.c" + +/* End of pcre16_get.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_globals.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_globals.c new file mode 100755 index 000000000..a136b3d8c --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_globals.c @@ -0,0 +1,45 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +/* Generate code with 16 bit character support. */ +#define COMPILE_PCRE16 + +#include "pcre_globals.c" + +/* End of pcre16_globals.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_jit_compile.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_jit_compile.c new file mode 100755 index 000000000..ab0cacd76 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_jit_compile.c @@ -0,0 +1,45 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +/* Generate code with 16 bit character support. */ +#define COMPILE_PCRE16 + +#include "pcre_jit_compile.c" + +/* End of pcre16_jit_compile.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_maketables.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_maketables.c new file mode 100755 index 000000000..b1cd1c579 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_maketables.c @@ -0,0 +1,45 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +/* Generate code with 16 bit character support. */ +#define COMPILE_PCRE16 + +#include "pcre_maketables.c" + +/* End of pcre16_maketables.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_newline.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_newline.c new file mode 100755 index 000000000..7fe201400 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_newline.c @@ -0,0 +1,45 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +/* Generate code with 16 bit character support. */ +#define COMPILE_PCRE16 + +#include "pcre_newline.c" + +/* End of pcre16_newline.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_ord2utf16.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_ord2utf16.c new file mode 100755 index 000000000..8e2ce5ea6 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_ord2utf16.c @@ -0,0 +1,90 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + + +/* This file contains a private PCRE function that converts an ordinal +character value into a UTF16 string. */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +/* Generate code with 16 bit character support. */ +#define COMPILE_PCRE16 + +#include "pcre_internal.h" + +/************************************************* +* Convert character value to UTF-16 * +*************************************************/ + +/* This function takes an integer value in the range 0 - 0x10ffff +and encodes it as a UTF-16 character in 1 to 2 pcre_uchars. + +Arguments: + cvalue the character value + buffer pointer to buffer for result - at least 2 pcre_uchars long + +Returns: number of characters placed in the buffer +*/ + +unsigned int +PRIV(ord2utf)(pcre_uint32 cvalue, pcre_uchar *buffer) +{ +#ifdef SUPPORT_UTF + +if (cvalue <= 0xffff) + { + *buffer = (pcre_uchar)cvalue; + return 1; + } + +cvalue -= 0x10000; +*buffer++ = 0xd800 | (cvalue >> 10); +*buffer = 0xdc00 | (cvalue & 0x3ff); +return 2; + +#else /* SUPPORT_UTF */ +(void)(cvalue); /* Keep compiler happy; this function won't ever be */ +(void)(buffer); /* called when SUPPORT_UTF is not defined. */ +return 0; +#endif /* SUPPORT_UTF */ +} + +/* End of pcre16_ord2utf16.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_printint.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_printint.c new file mode 100755 index 000000000..33d8c3402 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_printint.c @@ -0,0 +1,45 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +/* Generate code with 16 bit character support. */ +#define COMPILE_PCRE16 + +#include "pcre_printint.c" + +/* End of pcre16_printint.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_refcount.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_refcount.c new file mode 100755 index 000000000..d3d154397 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_refcount.c @@ -0,0 +1,45 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +/* Generate code with 16 bit character support. */ +#define COMPILE_PCRE16 + +#include "pcre_refcount.c" + +/* End of pcre16_refcount.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_string_utils.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_string_utils.c new file mode 100755 index 000000000..382c40799 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_string_utils.c @@ -0,0 +1,45 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +/* Generate code with 16 bit character support. */ +#define COMPILE_PCRE16 + +#include "pcre_string_utils.c" + +/* End of pcre16_string_utils.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_study.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_study.c new file mode 100755 index 000000000..f87de081f --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_study.c @@ -0,0 +1,45 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +/* Generate code with 16 bit character support. */ +#define COMPILE_PCRE16 + +#include "pcre_study.c" + +/* End of pcre16_study.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_tables.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_tables.c new file mode 100755 index 000000000..d84297093 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_tables.c @@ -0,0 +1,45 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +/* Generate code with 16 bit character support. */ +#define COMPILE_PCRE16 + +#include "pcre_tables.c" + +/* End of pcre16_tables.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_ucd.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_ucd.c new file mode 100755 index 000000000..ee23439a0 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_ucd.c @@ -0,0 +1,45 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +/* Generate code with 16 bit character support. */ +#define COMPILE_PCRE16 + +#include "pcre_ucd.c" + +/* End of pcre16_ucd.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_utf16_utils.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_utf16_utils.c new file mode 100755 index 000000000..49ced0c0b --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_utf16_utils.c @@ -0,0 +1,130 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + + +/* This module contains a function for converting any UTF-16 character +strings to host byte order. */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +/* Generate code with 16 bit character support. */ +#define COMPILE_PCRE16 + +#include "pcre_internal.h" + +/************************************************* +* Convert any UTF-16 string to host byte order * +*************************************************/ + +/* This function takes an UTF-16 string and converts +it to host byte order. The length can be explicitly set, +or automatically detected for zero terminated strings. +BOMs can be kept or discarded during the conversion. +Conversion can be done in place (output == input). + +Arguments: + output the output buffer, its size must be greater + or equal than the input string + input any UTF-16 string + length the number of 16-bit units in the input string + can be less than zero for zero terminated strings + host_byte_order + A non-zero value means the input is in host byte + order, which can be dynamically changed by BOMs later. + Initially it contains the starting byte order and returns + with the last byte order so it can be used for stream + processing. It can be NULL, which set the host byte + order mode by default. + keep_boms for a non-zero value, the BOM (0xfeff) characters + are copied as well + +Returns: the number of 16-bit units placed into the output buffer, + including the zero-terminator +*/ + +int +pcre16_utf16_to_host_byte_order(PCRE_UCHAR16 *output, PCRE_SPTR16 input, + int length, int *host_byte_order, int keep_boms) +{ +#ifdef SUPPORT_UTF +/* This function converts any UTF-16 string to host byte order and optionally +removes any Byte Order Marks (BOMS). Returns with the remainig length. */ +int host_bo = host_byte_order != NULL ? *host_byte_order : 1; +pcre_uchar *optr = (pcre_uchar *)output; +const pcre_uchar *iptr = (const pcre_uchar *)input; +const pcre_uchar *end; +/* The c variable must be unsigned. */ +register pcre_uchar c; + +if (length < 0) + length = STRLEN_UC(iptr) + 1; +end = iptr + length; + +while (iptr < end) + { + c = *iptr++; + if (c == 0xfeff || c == 0xfffe) + { + /* Detecting the byte order of the machine is unnecessary, it is + enough to know that the UTF-16 string has the same byte order or not. */ + host_bo = c == 0xfeff; + if (keep_boms != 0) + *optr++ = 0xfeff; + else + length--; + } + else + *optr++ = host_bo ? c : ((c >> 8) | (c << 8)); /* Flip bytes if needed. */ + } +if (host_byte_order != NULL) + *host_byte_order = host_bo; + +#else /* Not SUPPORT_UTF */ +(void)(output); /* Keep picky compilers happy */ +(void)(input); +(void)(keep_boms); +(void)(host_byte_order); +#endif /* SUPPORT_UTF */ +return length; +} + +/* End of pcre16_utf16_utils.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_valid_utf16.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_valid_utf16.c new file mode 100755 index 000000000..09076539d --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_valid_utf16.c @@ -0,0 +1,137 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2013 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + + +/* This module contains an internal function for validating UTF-16 character +strings. */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +/* Generate code with 16 bit character support. */ +#define COMPILE_PCRE16 + +#include "pcre_internal.h" + + +/************************************************* +* Validate a UTF-16 string * +*************************************************/ + +/* This function is called (optionally) at the start of compile or match, to +check that a supposed UTF-16 string is actually valid. The early check means +that subsequent code can assume it is dealing with a valid string. The check +can be turned off for maximum performance, but the consequences of supplying an +invalid string are then undefined. + +From release 8.21 more information about the details of the error are passed +back in the returned value: + +PCRE_UTF16_ERR0 No error +PCRE_UTF16_ERR1 Missing low surrogate at the end of the string +PCRE_UTF16_ERR2 Invalid low surrogate +PCRE_UTF16_ERR3 Isolated low surrogate +PCRE_UTF16_ERR4 Unused (was non-character) + +Arguments: + string points to the string + length length of string, or -1 if the string is zero-terminated + errp pointer to an error position offset variable + +Returns: = 0 if the string is a valid UTF-16 string + > 0 otherwise, setting the offset of the bad character +*/ + +int +PRIV(valid_utf)(PCRE_PUCHAR string, int length, int *erroroffset) +{ +#ifdef SUPPORT_UTF +register PCRE_PUCHAR p; +register pcre_uint32 c; + +if (length < 0) + { + for (p = string; *p != 0; p++); + length = p - string; + } + +for (p = string; length-- > 0; p++) + { + c = *p; + + if ((c & 0xf800) != 0xd800) + { + /* Normal UTF-16 code point. Neither high nor low surrogate. */ + } + else if ((c & 0x0400) == 0) + { + /* High surrogate. Must be a followed by a low surrogate. */ + if (length == 0) + { + *erroroffset = p - string; + return PCRE_UTF16_ERR1; + } + p++; + length--; + if ((*p & 0xfc00) != 0xdc00) + { + *erroroffset = p - string; + return PCRE_UTF16_ERR2; + } + } + else + { + /* Isolated low surrogate. Always an error. */ + *erroroffset = p - string; + return PCRE_UTF16_ERR3; + } + } + +#else /* SUPPORT_UTF */ +(void)(string); /* Keep picky compilers happy */ +(void)(length); +(void)(erroroffset); +#endif /* SUPPORT_UTF */ + +return PCRE_UTF16_ERR0; /* This indicates success */ +} + +/* End of pcre16_valid_utf16.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_version.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_version.c new file mode 100755 index 000000000..e991b1a8c --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_version.c @@ -0,0 +1,45 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +/* Generate code with 16 bit character support. */ +#define COMPILE_PCRE16 + +#include "pcre_version.c" + +/* End of pcre16_version.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_xclass.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_xclass.c new file mode 100755 index 000000000..5aac2a36c --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre16_xclass.c @@ -0,0 +1,45 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +/* Generate code with 16 bit character support. */ +#define COMPILE_PCRE16 + +#include "pcre_xclass.c" + +/* End of pcre16_xclass.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_byte_order.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_byte_order.c new file mode 100755 index 000000000..9cf536273 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_byte_order.c @@ -0,0 +1,45 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +/* Generate code with 32 bit character support. */ +#define COMPILE_PCRE32 + +#include "pcre_byte_order.c" + +/* End of pcre32_byte_order.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_chartables.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_chartables.c new file mode 100755 index 000000000..b5d8c23db --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_chartables.c @@ -0,0 +1,45 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +/* Generate code with 32 bit character support. */ +#define COMPILE_PCRE32 + +#include "pcre_chartables.c" + +/* End of pcre32_chartables.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_compile.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_compile.c new file mode 100755 index 000000000..d781eb377 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_compile.c @@ -0,0 +1,45 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +/* Generate code with 32 bit character support. */ +#define COMPILE_PCRE32 + +#include "pcre_compile.c" + +/* End of pcre32_compile.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_config.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_config.c new file mode 100755 index 000000000..d63f3e9ea --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_config.c @@ -0,0 +1,45 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +/* Generate code with 32 bit character support. */ +#define COMPILE_PCRE32 + +#include "pcre_config.c" + +/* End of pcre32_config.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_dfa_exec.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_dfa_exec.c new file mode 100755 index 000000000..b0bfd34f0 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_dfa_exec.c @@ -0,0 +1,45 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +/* Generate code with 32 bit character support. */ +#define COMPILE_PCRE32 + +#include "pcre_dfa_exec.c" + +/* End of pcre32_dfa_exec.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_exec.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_exec.c new file mode 100755 index 000000000..8170ed77d --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_exec.c @@ -0,0 +1,45 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +/* Generate code with 32 bit character support. */ +#define COMPILE_PCRE32 + +#include "pcre_exec.c" + +/* End of pcre32_exec.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_fullinfo.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_fullinfo.c new file mode 100755 index 000000000..6ecc5209a --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_fullinfo.c @@ -0,0 +1,45 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +/* Generate code with 32 bit character support. */ +#define COMPILE_PCRE32 + +#include "pcre_fullinfo.c" + +/* End of pcre32_fullinfo.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_get.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_get.c new file mode 100755 index 000000000..d35deee0c --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_get.c @@ -0,0 +1,45 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +/* Generate code with 32 bit character support. */ +#define COMPILE_PCRE32 + +#include "pcre_get.c" + +/* End of pcre32_get.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_globals.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_globals.c new file mode 100755 index 000000000..32e0914ca --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_globals.c @@ -0,0 +1,45 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +/* Generate code with 32 bit character support. */ +#define COMPILE_PCRE32 + +#include "pcre_globals.c" + +/* End of pcre32_globals.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_jit_compile.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_jit_compile.c new file mode 100755 index 000000000..2e7c6f97c --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_jit_compile.c @@ -0,0 +1,45 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +/* Generate code with 32 bit character support. */ +#define COMPILE_PCRE32 + +#include "pcre_jit_compile.c" + +/* End of pcre32_jit_compile.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_maketables.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_maketables.c new file mode 100755 index 000000000..5d1b1c64c --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_maketables.c @@ -0,0 +1,45 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +/* Generate code with 32 bit character support. */ +#define COMPILE_PCRE32 + +#include "pcre_maketables.c" + +/* End of pcre32_maketables.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_newline.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_newline.c new file mode 100755 index 000000000..7f8d5360c --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_newline.c @@ -0,0 +1,45 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +/* Generate code with 32 bit character support. */ +#define COMPILE_PCRE32 + +#include "pcre_newline.c" + +/* End of pcre32_newline.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_ord2utf32.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_ord2utf32.c new file mode 100755 index 000000000..606bcb3d7 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_ord2utf32.c @@ -0,0 +1,82 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + + +/* This file contains a private PCRE function that converts an ordinal +character value into a UTF32 string. */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +/* Generate code with 32 bit character support. */ +#define COMPILE_PCRE32 + +#include "pcre_internal.h" + +/************************************************* +* Convert character value to UTF-32 * +*************************************************/ + +/* This function takes an integer value in the range 0 - 0x10ffff +and encodes it as a UTF-32 character in 1 pcre_uchars. + +Arguments: + cvalue the character value + buffer pointer to buffer for result - at least 1 pcre_uchars long + +Returns: number of characters placed in the buffer +*/ + +unsigned int +PRIV(ord2utf)(pcre_uint32 cvalue, pcre_uchar *buffer) +{ +#ifdef SUPPORT_UTF + +*buffer = (pcre_uchar)cvalue; +return 1; + +#else /* SUPPORT_UTF */ +(void)(cvalue); /* Keep compiler happy; this function won't ever be */ +(void)(buffer); /* called when SUPPORT_UTF is not defined. */ +return 0; +#endif /* SUPPORT_UTF */ +} + +/* End of pcre32_ord2utf32.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_printint.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_printint.c new file mode 100755 index 000000000..f3fd7b25e --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_printint.c @@ -0,0 +1,45 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +/* Generate code with 32 bit character support. */ +#define COMPILE_PCRE32 + +#include "pcre_printint.c" + +/* End of pcre32_printint.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_refcount.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_refcount.c new file mode 100755 index 000000000..dbdf432d8 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_refcount.c @@ -0,0 +1,45 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +/* Generate code with 32 bit character support. */ +#define COMPILE_PCRE32 + +#include "pcre_refcount.c" + +/* End of pcre32_refcount.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_string_utils.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_string_utils.c new file mode 100755 index 000000000..e37b3d480 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_string_utils.c @@ -0,0 +1,45 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +/* Generate code with 32 bit character support. */ +#define COMPILE_PCRE32 + +#include "pcre_string_utils.c" + +/* End of pcre32_string_utils.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_study.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_study.c new file mode 100755 index 000000000..d3a3afed7 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_study.c @@ -0,0 +1,45 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +/* Generate code with 32 bit character support. */ +#define COMPILE_PCRE32 + +#include "pcre_study.c" + +/* End of pcre32_study.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_tables.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_tables.c new file mode 100755 index 000000000..3d94cca33 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_tables.c @@ -0,0 +1,45 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +/* Generate code with 32 bit character support. */ +#define COMPILE_PCRE32 + +#include "pcre_tables.c" + +/* End of pcre32_tables.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_ucd.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_ucd.c new file mode 100755 index 000000000..befe22d34 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_ucd.c @@ -0,0 +1,45 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +/* Generate code with 32 bit character support. */ +#define COMPILE_PCRE32 + +#include "pcre_ucd.c" + +/* End of pcre32_ucd.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_utf32_utils.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_utf32_utils.c new file mode 100755 index 000000000..f844e2371 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_utf32_utils.c @@ -0,0 +1,141 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + + +/* This module contains a function for converting any UTF-32 character +strings to host byte order. */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +/* Generate code with 32 bit character support. */ +#define COMPILE_PCRE32 + +#include "pcre_internal.h" + +#ifdef SUPPORT_UTF +static pcre_uint32 +swap_uint32(pcre_uint32 value) +{ +return ((value & 0x000000ff) << 24) | + ((value & 0x0000ff00) << 8) | + ((value & 0x00ff0000) >> 8) | + (value >> 24); +} +#endif + + +/************************************************* +* Convert any UTF-32 string to host byte order * +*************************************************/ + +/* This function takes an UTF-32 string and converts +it to host byte order. The length can be explicitly set, +or automatically detected for zero terminated strings. +BOMs can be kept or discarded during the conversion. +Conversion can be done in place (output == input). + +Arguments: + output the output buffer, its size must be greater + or equal than the input string + input any UTF-32 string + length the number of 32-bit units in the input string + can be less than zero for zero terminated strings + host_byte_order + A non-zero value means the input is in host byte + order, which can be dynamically changed by BOMs later. + Initially it contains the starting byte order and returns + with the last byte order so it can be used for stream + processing. It can be NULL, which set the host byte + order mode by default. + keep_boms for a non-zero value, the BOM (0xfeff) characters + are copied as well + +Returns: the number of 32-bit units placed into the output buffer, + including the zero-terminator +*/ + +int +pcre32_utf32_to_host_byte_order(PCRE_UCHAR32 *output, PCRE_SPTR32 input, + int length, int *host_byte_order, int keep_boms) +{ +#ifdef SUPPORT_UTF +/* This function converts any UTF-32 string to host byte order and optionally +removes any Byte Order Marks (BOMS). Returns with the remainig length. */ +int host_bo = host_byte_order != NULL ? *host_byte_order : 1; +pcre_uchar *optr = (pcre_uchar *)output; +const pcre_uchar *iptr = (const pcre_uchar *)input; +const pcre_uchar *end; +/* The c variable must be unsigned. */ +register pcre_uchar c; + +if (length < 0) + end = iptr + STRLEN_UC(iptr) + 1; +else + end = iptr + length; + +while (iptr < end) + { + c = *iptr++; + if (c == 0x0000feffu || c == 0xfffe0000u) + { + /* Detecting the byte order of the machine is unnecessary, it is + enough to know that the UTF-32 string has the same byte order or not. */ + host_bo = c == 0x0000feffu; + if (keep_boms != 0) + *optr++ = 0x0000feffu; + } + else + *optr++ = host_bo ? c : swap_uint32(c); + } +if (host_byte_order != NULL) + *host_byte_order = host_bo; + +#else /* SUPPORT_UTF */ +(void)(output); /* Keep picky compilers happy */ +(void)(input); +(void)(keep_boms); +(void)(host_byte_order); +#endif /* SUPPORT_UTF */ +return length; +} + +/* End of pcre32_utf32_utils.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_valid_utf32.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_valid_utf32.c new file mode 100755 index 000000000..94cda1a2c --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_valid_utf32.c @@ -0,0 +1,124 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2013 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + + +/* This module contains an internal function for validating UTF-32 character +strings. */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +/* Generate code with 32 bit character support. */ +#define COMPILE_PCRE32 + +#include "pcre_internal.h" + +/************************************************* +* Validate a UTF-32 string * +*************************************************/ + +/* This function is called (optionally) at the start of compile or match, to +check that a supposed UTF-32 string is actually valid. The early check means +that subsequent code can assume it is dealing with a valid string. The check +can be turned off for maximum performance, but the consequences of supplying an +invalid string are then undefined. + +More information about the details of the error are passed +back in the returned value: + +PCRE_UTF32_ERR0 No error +PCRE_UTF32_ERR1 Surrogate character +PCRE_UTF32_ERR2 Unused (was non-character) +PCRE_UTF32_ERR3 Character > 0x10ffff + +Arguments: + string points to the string + length length of string, or -1 if the string is zero-terminated + errp pointer to an error position offset variable + +Returns: = 0 if the string is a valid UTF-32 string + > 0 otherwise, setting the offset of the bad character +*/ + +int +PRIV(valid_utf)(PCRE_PUCHAR string, int length, int *erroroffset) +{ +#ifdef SUPPORT_UTF +register PCRE_PUCHAR p; +register pcre_uchar c; + +if (length < 0) + { + for (p = string; *p != 0; p++); + length = p - string; + } + +for (p = string; length-- > 0; p++) + { + c = *p; + + if ((c & 0xfffff800u) != 0xd800u) + { + /* Normal UTF-32 code point. Neither high nor low surrogate. */ + if (c > 0x10ffffu) + { + *erroroffset = p - string; + return PCRE_UTF32_ERR3; + } + } + else + { + /* A surrogate */ + *erroroffset = p - string; + return PCRE_UTF32_ERR1; + } + } + +#else /* SUPPORT_UTF */ +(void)(string); /* Keep picky compilers happy */ +(void)(length); +(void)(erroroffset); +#endif /* SUPPORT_UTF */ + +return PCRE_UTF32_ERR0; /* This indicates success */ +} + +/* End of pcre32_valid_utf32.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_version.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_version.c new file mode 100755 index 000000000..fdaad9b08 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_version.c @@ -0,0 +1,45 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +/* Generate code with 32 bit character support. */ +#define COMPILE_PCRE32 + +#include "pcre_version.c" + +/* End of pcre32_version.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_xclass.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_xclass.c new file mode 100755 index 000000000..5662408ad --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre32_xclass.c @@ -0,0 +1,45 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +/* Generate code with 32 bit character support. */ +#define COMPILE_PCRE32 + +#include "pcre_xclass.c" + +/* End of pcre32_xclass.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_byte_order.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_byte_order.c new file mode 100755 index 000000000..cf5f12b04 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_byte_order.c @@ -0,0 +1,319 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2014 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + + +/* This module contains an internal function that tests a compiled pattern to +see if it was compiled with the opposite endianness. If so, it uses an +auxiliary local function to flip the appropriate bytes. */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "pcre_internal.h" + + +/************************************************* +* Swap byte functions * +*************************************************/ + +/* The following functions swap the bytes of a pcre_uint16 +and pcre_uint32 value. + +Arguments: + value any number + +Returns: the byte swapped value +*/ + +static pcre_uint32 +swap_uint32(pcre_uint32 value) +{ +return ((value & 0x000000ff) << 24) | + ((value & 0x0000ff00) << 8) | + ((value & 0x00ff0000) >> 8) | + (value >> 24); +} + +static pcre_uint16 +swap_uint16(pcre_uint16 value) +{ +return (value >> 8) | (value << 8); +} + + +/************************************************* +* Test for a byte-flipped compiled regex * +*************************************************/ + +/* This function swaps the bytes of a compiled pattern usually +loaded form the disk. It also sets the tables pointer, which +is likely an invalid pointer after reload. + +Arguments: + argument_re points to the compiled expression + extra_data points to extra data or is NULL + tables points to the character tables or NULL + +Returns: 0 if the swap is successful, negative on error +*/ + +#if defined COMPILE_PCRE8 +PCRE_EXP_DECL int pcre_pattern_to_host_byte_order(pcre *argument_re, + pcre_extra *extra_data, const unsigned char *tables) +#elif defined COMPILE_PCRE16 +PCRE_EXP_DECL int pcre16_pattern_to_host_byte_order(pcre16 *argument_re, + pcre16_extra *extra_data, const unsigned char *tables) +#elif defined COMPILE_PCRE32 +PCRE_EXP_DECL int pcre32_pattern_to_host_byte_order(pcre32 *argument_re, + pcre32_extra *extra_data, const unsigned char *tables) +#endif +{ +REAL_PCRE *re = (REAL_PCRE *)argument_re; +pcre_study_data *study; +#ifndef COMPILE_PCRE8 +pcre_uchar *ptr; +int length; +#if defined SUPPORT_UTF && defined COMPILE_PCRE16 +BOOL utf; +BOOL utf16_char; +#endif /* SUPPORT_UTF && COMPILE_PCRE16 */ +#endif /* !COMPILE_PCRE8 */ + +if (re == NULL) return PCRE_ERROR_NULL; +if (re->magic_number == MAGIC_NUMBER) + { + if ((re->flags & PCRE_MODE) == 0) return PCRE_ERROR_BADMODE; + re->tables = tables; + return 0; + } + +if (re->magic_number != REVERSED_MAGIC_NUMBER) return PCRE_ERROR_BADMAGIC; +if ((swap_uint32(re->flags) & PCRE_MODE) == 0) return PCRE_ERROR_BADMODE; + +re->magic_number = MAGIC_NUMBER; +re->size = swap_uint32(re->size); +re->options = swap_uint32(re->options); +re->flags = swap_uint32(re->flags); +re->limit_match = swap_uint32(re->limit_match); +re->limit_recursion = swap_uint32(re->limit_recursion); + +#if defined COMPILE_PCRE8 || defined COMPILE_PCRE16 +re->first_char = swap_uint16(re->first_char); +re->req_char = swap_uint16(re->req_char); +#elif defined COMPILE_PCRE32 +re->first_char = swap_uint32(re->first_char); +re->req_char = swap_uint32(re->req_char); +#endif + +re->max_lookbehind = swap_uint16(re->max_lookbehind); +re->top_bracket = swap_uint16(re->top_bracket); +re->top_backref = swap_uint16(re->top_backref); +re->name_table_offset = swap_uint16(re->name_table_offset); +re->name_entry_size = swap_uint16(re->name_entry_size); +re->name_count = swap_uint16(re->name_count); +re->ref_count = swap_uint16(re->ref_count); +re->tables = tables; + +if (extra_data != NULL && (extra_data->flags & PCRE_EXTRA_STUDY_DATA) != 0) + { + study = (pcre_study_data *)extra_data->study_data; + study->size = swap_uint32(study->size); + study->flags = swap_uint32(study->flags); + study->minlength = swap_uint32(study->minlength); + } + +#ifndef COMPILE_PCRE8 +ptr = (pcre_uchar *)re + re->name_table_offset; +length = re->name_count * re->name_entry_size; +#if defined SUPPORT_UTF && defined COMPILE_PCRE16 +utf = (re->options & PCRE_UTF16) != 0; +utf16_char = FALSE; +#endif /* SUPPORT_UTF && COMPILE_PCRE16 */ + +while(TRUE) + { + /* Swap previous characters. */ + while (length-- > 0) + { +#if defined COMPILE_PCRE16 + *ptr = swap_uint16(*ptr); +#elif defined COMPILE_PCRE32 + *ptr = swap_uint32(*ptr); +#endif + ptr++; + } +#if defined SUPPORT_UTF && defined COMPILE_PCRE16 + if (utf16_char) + { + if (HAS_EXTRALEN(ptr[-1])) + { + /* We know that there is only one extra character in UTF-16. */ + *ptr = swap_uint16(*ptr); + ptr++; + } + } + utf16_char = FALSE; +#endif /* SUPPORT_UTF */ + + /* Get next opcode. */ + length = 0; +#if defined COMPILE_PCRE16 + *ptr = swap_uint16(*ptr); +#elif defined COMPILE_PCRE32 + *ptr = swap_uint32(*ptr); +#endif + switch (*ptr) + { + case OP_END: + return 0; + +#if defined SUPPORT_UTF && defined COMPILE_PCRE16 + case OP_CHAR: + case OP_CHARI: + case OP_NOT: + case OP_NOTI: + case OP_STAR: + case OP_MINSTAR: + case OP_PLUS: + case OP_MINPLUS: + case OP_QUERY: + case OP_MINQUERY: + case OP_UPTO: + case OP_MINUPTO: + case OP_EXACT: + case OP_POSSTAR: + case OP_POSPLUS: + case OP_POSQUERY: + case OP_POSUPTO: + case OP_STARI: + case OP_MINSTARI: + case OP_PLUSI: + case OP_MINPLUSI: + case OP_QUERYI: + case OP_MINQUERYI: + case OP_UPTOI: + case OP_MINUPTOI: + case OP_EXACTI: + case OP_POSSTARI: + case OP_POSPLUSI: + case OP_POSQUERYI: + case OP_POSUPTOI: + case OP_NOTSTAR: + case OP_NOTMINSTAR: + case OP_NOTPLUS: + case OP_NOTMINPLUS: + case OP_NOTQUERY: + case OP_NOTMINQUERY: + case OP_NOTUPTO: + case OP_NOTMINUPTO: + case OP_NOTEXACT: + case OP_NOTPOSSTAR: + case OP_NOTPOSPLUS: + case OP_NOTPOSQUERY: + case OP_NOTPOSUPTO: + case OP_NOTSTARI: + case OP_NOTMINSTARI: + case OP_NOTPLUSI: + case OP_NOTMINPLUSI: + case OP_NOTQUERYI: + case OP_NOTMINQUERYI: + case OP_NOTUPTOI: + case OP_NOTMINUPTOI: + case OP_NOTEXACTI: + case OP_NOTPOSSTARI: + case OP_NOTPOSPLUSI: + case OP_NOTPOSQUERYI: + case OP_NOTPOSUPTOI: + if (utf) utf16_char = TRUE; +#endif + /* Fall through. */ + + default: + length = PRIV(OP_lengths)[*ptr] - 1; + break; + + case OP_CLASS: + case OP_NCLASS: + /* Skip the character bit map. */ + ptr += 32/sizeof(pcre_uchar); + length = 0; + break; + + case OP_XCLASS: + /* Reverse the size of the XCLASS instance. */ + ptr++; +#if defined COMPILE_PCRE16 + *ptr = swap_uint16(*ptr); +#elif defined COMPILE_PCRE32 + *ptr = swap_uint32(*ptr); +#endif +#ifndef COMPILE_PCRE32 + if (LINK_SIZE > 1) + { + /* LINK_SIZE can be 1 or 2 in 16 bit mode. */ + ptr++; + *ptr = swap_uint16(*ptr); + } +#endif + ptr++; + length = (GET(ptr, -LINK_SIZE)) - (1 + LINK_SIZE + 1); +#if defined COMPILE_PCRE16 + *ptr = swap_uint16(*ptr); +#elif defined COMPILE_PCRE32 + *ptr = swap_uint32(*ptr); +#endif + if ((*ptr & XCL_MAP) != 0) + { + /* Skip the character bit map. */ + ptr += 32/sizeof(pcre_uchar); + length -= 32/sizeof(pcre_uchar); + } + break; + } + ptr++; + } +/* Control should never reach here in 16/32 bit mode. */ +#else /* In 8-bit mode, the pattern does not need to be processed. */ +return 0; +#endif /* !COMPILE_PCRE8 */ +} + +/* End of pcre_byte_order.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_chartables.c.dist b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_chartables.c.dist new file mode 100755 index 000000000..1e20ec29d --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_chartables.c.dist @@ -0,0 +1,198 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* This file contains character tables that are used when no external tables +are passed to PCRE by the application that calls it. The tables are used only +for characters whose code values are less than 256. + +This is a default version of the tables that assumes ASCII encoding. A program +called dftables (which is distributed with PCRE) can be used to build +alternative versions of this file. This is necessary if you are running in an +EBCDIC environment, or if you want to default to a different encoding, for +example ISO-8859-1. When dftables is run, it creates these tables in the +current locale. If PCRE is configured with --enable-rebuild-chartables, this +happens automatically. + +The following #includes are present because without them gcc 4.x may remove the +array definition from the final binary if PCRE is built into a static library +and dead code stripping is activated. This leads to link errors. Pulling in the +header ensures that the array gets flagged as "someone outside this compilation +unit might reference this" and so it will always be supplied to the linker. */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "pcre_internal.h" + +const pcre_uint8 PRIV(default_tables)[] = { + +/* This table is a lower casing table. */ + + 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, + 64, 97, 98, 99,100,101,102,103, + 104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119, + 120,121,122, 91, 92, 93, 94, 95, + 96, 97, 98, 99,100,101,102,103, + 104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119, + 120,121,122,123,124,125,126,127, + 128,129,130,131,132,133,134,135, + 136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151, + 152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167, + 168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183, + 184,185,186,187,188,189,190,191, + 192,193,194,195,196,197,198,199, + 200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215, + 216,217,218,219,220,221,222,223, + 224,225,226,227,228,229,230,231, + 232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,247, + 248,249,250,251,252,253,254,255, + +/* This table is a case flipping table. */ + + 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, + 64, 97, 98, 99,100,101,102,103, + 104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119, + 120,121,122, 91, 92, 93, 94, 95, + 96, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90,123,124,125,126,127, + 128,129,130,131,132,133,134,135, + 136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151, + 152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167, + 168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183, + 184,185,186,187,188,189,190,191, + 192,193,194,195,196,197,198,199, + 200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215, + 216,217,218,219,220,221,222,223, + 224,225,226,227,228,229,230,231, + 232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,247, + 248,249,250,251,252,253,254,255, + +/* This table contains bit maps for various character classes. Each map is 32 +bytes long and the bits run from the least significant end of each byte. The +classes that have their own maps are: space, xdigit, digit, upper, lower, word, +graph, print, punct, and cntrl. Other classes are built from combinations. */ + + 0x00,0x3e,0x00,0x00,0x01,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + + 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03, + 0x7e,0x00,0x00,0x00,0x7e,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + + 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xfe,0xff,0xff,0x07,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0x07, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + + 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03, + 0xfe,0xff,0xff,0x87,0xfe,0xff,0xff,0x07, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + + 0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + + 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + + 0x00,0x00,0x00,0x00,0xfe,0xff,0x00,0xfc, + 0x01,0x00,0x00,0xf8,0x01,0x00,0x00,0x78, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + + 0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +/* This table identifies various classes of character by individual bits: + 0x01 white space character + 0x02 letter + 0x04 decimal digit + 0x08 hexadecimal digit + 0x10 alphanumeric or '_' + 0x80 regular expression metacharacter or binary zero +*/ + + 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0- 7 */ + 0x00,0x01,0x01,0x01,0x01,0x01,0x00,0x00, /* 8- 15 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 16- 23 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 24- 31 */ + 0x01,0x00,0x00,0x00,0x80,0x00,0x00,0x00, /* - ' */ + 0x80,0x80,0x80,0x80,0x00,0x00,0x80,0x00, /* ( - / */ + 0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c, /* 0 - 7 */ + 0x1c,0x1c,0x00,0x00,0x00,0x00,0x00,0x80, /* 8 - ? */ + 0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /* @ - G */ + 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* H - O */ + 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* P - W */ + 0x12,0x12,0x12,0x80,0x80,0x00,0x80,0x10, /* X - _ */ + 0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /* ` - g */ + 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* h - o */ + 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* p - w */ + 0x12,0x12,0x12,0x80,0x80,0x00,0x00,0x00, /* x -127 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 128-135 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 136-143 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 144-151 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 152-159 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 160-167 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 168-175 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 176-183 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 184-191 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 192-199 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 200-207 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 208-215 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 216-223 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 224-231 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 232-239 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 240-247 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/* 248-255 */ + +/* End of pcre_chartables.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_compile.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_compile.c new file mode 100755 index 000000000..3be0fbfb1 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_compile.c @@ -0,0 +1,9807 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2020 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + + +/* This module contains the external function pcre_compile(), along with +supporting internal functions that are not used by other modules. */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#define NLBLOCK cd /* Block containing newline information */ +#define PSSTART start_pattern /* Field containing pattern start */ +#define PSEND end_pattern /* Field containing pattern end */ + +#include "pcre_internal.h" + + +/* When PCRE_DEBUG is defined, we need the pcre(16|32)_printint() function, which +is also used by pcretest. PCRE_DEBUG is not defined when building a production +library. We do not need to select pcre16_printint.c specially, because the +COMPILE_PCREx macro will already be appropriately set. */ + +#ifdef PCRE_DEBUG +/* pcre_printint.c should not include any headers */ +#define PCRE_INCLUDED +#include "pcre_printint.c" +#undef PCRE_INCLUDED +#endif + + +/* Macro for setting individual bits in class bitmaps. */ + +#define SETBIT(a,b) a[(b)/8] |= (1U << ((b)&7)) + +/* Maximum length value to check against when making sure that the integer that +holds the compiled pattern length does not overflow. We make it a bit less than +INT_MAX to allow for adding in group terminating bytes, so that we don't have +to check them every time. */ + +#define OFLOW_MAX (INT_MAX - 20) + +/* Definitions to allow mutual recursion */ + +static int + add_list_to_class(pcre_uint8 *, pcre_uchar **, int, compile_data *, + const pcre_uint32 *, unsigned int); + +static BOOL + compile_regex(int, pcre_uchar **, const pcre_uchar **, int *, BOOL, BOOL, int, int, + pcre_uint32 *, pcre_int32 *, pcre_uint32 *, pcre_int32 *, branch_chain *, + compile_data *, int *); + + + +/************************************************* +* Code parameters and static tables * +*************************************************/ + +/* This value specifies the size of stack workspace that is used during the +first pre-compile phase that determines how much memory is required. The regex +is partly compiled into this space, but the compiled parts are discarded as +soon as they can be, so that hopefully there will never be an overrun. The code +does, however, check for an overrun. The largest amount I've seen used is 218, +so this number is very generous. + +The same workspace is used during the second, actual compile phase for +remembering forward references to groups so that they can be filled in at the +end. Each entry in this list occupies LINK_SIZE bytes, so even when LINK_SIZE +is 4 there is plenty of room for most patterns. However, the memory can get +filled up by repetitions of forward references, for example patterns like +/(?1){0,1999}(b)/, and one user did hit the limit. The code has been changed so +that the workspace is expanded using malloc() in this situation. The value +below is therefore a minimum, and we put a maximum on it for safety. The +minimum is now also defined in terms of LINK_SIZE so that the use of malloc() +kicks in at the same number of forward references in all cases. */ + +#define COMPILE_WORK_SIZE (2048*LINK_SIZE) +#define COMPILE_WORK_SIZE_MAX (100*COMPILE_WORK_SIZE) + +/* This value determines the size of the initial vector that is used for +remembering named groups during the pre-compile. It is allocated on the stack, +but if it is too small, it is expanded using malloc(), in a similar way to the +workspace. The value is the number of slots in the list. */ + +#define NAMED_GROUP_LIST_SIZE 20 + +/* The overrun tests check for a slightly smaller size so that they detect the +overrun before it actually does run off the end of the data block. */ + +#define WORK_SIZE_SAFETY_MARGIN (100) + +/* Private flags added to firstchar and reqchar. */ + +#define REQ_CASELESS (1U << 0) /* Indicates caselessness */ +#define REQ_VARY (1U << 1) /* Reqchar followed non-literal item */ +/* Negative values for the firstchar and reqchar flags */ +#define REQ_UNSET (-2) +#define REQ_NONE (-1) + +/* Repeated character flags. */ + +#define UTF_LENGTH 0x10000000l /* The char contains its length. */ + +/* Table for handling escaped characters in the range '0'-'z'. Positive returns +are simple data values; negative values are for special things like \d and so +on. Zero means further processing is needed (for things like \x), or the escape +is invalid. */ + +#ifndef EBCDIC + +/* This is the "normal" table for ASCII systems or for EBCDIC systems running +in UTF-8 mode. */ + +static const short int escapes[] = { + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + CHAR_COLON, CHAR_SEMICOLON, + CHAR_LESS_THAN_SIGN, CHAR_EQUALS_SIGN, + CHAR_GREATER_THAN_SIGN, CHAR_QUESTION_MARK, + CHAR_COMMERCIAL_AT, -ESC_A, + -ESC_B, -ESC_C, + -ESC_D, -ESC_E, + 0, -ESC_G, + -ESC_H, 0, + 0, -ESC_K, + 0, 0, + -ESC_N, 0, + -ESC_P, -ESC_Q, + -ESC_R, -ESC_S, + 0, 0, + -ESC_V, -ESC_W, + -ESC_X, 0, + -ESC_Z, CHAR_LEFT_SQUARE_BRACKET, + CHAR_BACKSLASH, CHAR_RIGHT_SQUARE_BRACKET, + CHAR_CIRCUMFLEX_ACCENT, CHAR_UNDERSCORE, + CHAR_GRAVE_ACCENT, ESC_a, + -ESC_b, 0, + -ESC_d, ESC_e, + ESC_f, 0, + -ESC_h, 0, + 0, -ESC_k, + 0, 0, + ESC_n, 0, + -ESC_p, 0, + ESC_r, -ESC_s, + ESC_tee, 0, + -ESC_v, -ESC_w, + 0, 0, + -ESC_z +}; + +#else + +/* This is the "abnormal" table for EBCDIC systems without UTF-8 support. */ + +static const short int escapes[] = { +/* 48 */ 0, 0, 0, '.', '<', '(', '+', '|', +/* 50 */ '&', 0, 0, 0, 0, 0, 0, 0, +/* 58 */ 0, 0, '!', '$', '*', ')', ';', '~', +/* 60 */ '-', '/', 0, 0, 0, 0, 0, 0, +/* 68 */ 0, 0, '|', ',', '%', '_', '>', '?', +/* 70 */ 0, 0, 0, 0, 0, 0, 0, 0, +/* 78 */ 0, '`', ':', '#', '@', '\'', '=', '"', +/* 80 */ 0, ESC_a, -ESC_b, 0, -ESC_d, ESC_e, ESC_f, 0, +/* 88 */-ESC_h, 0, 0, '{', 0, 0, 0, 0, +/* 90 */ 0, 0, -ESC_k, 0, 0, ESC_n, 0, -ESC_p, +/* 98 */ 0, ESC_r, 0, '}', 0, 0, 0, 0, +/* A0 */ 0, '~', -ESC_s, ESC_tee, 0,-ESC_v, -ESC_w, 0, +/* A8 */ 0,-ESC_z, 0, 0, 0, '[', 0, 0, +/* B0 */ 0, 0, 0, 0, 0, 0, 0, 0, +/* B8 */ 0, 0, 0, 0, 0, ']', '=', '-', +/* C0 */ '{',-ESC_A, -ESC_B, -ESC_C, -ESC_D,-ESC_E, 0, -ESC_G, +/* C8 */-ESC_H, 0, 0, 0, 0, 0, 0, 0, +/* D0 */ '}', 0, -ESC_K, 0, 0,-ESC_N, 0, -ESC_P, +/* D8 */-ESC_Q,-ESC_R, 0, 0, 0, 0, 0, 0, +/* E0 */ '\\', 0, -ESC_S, 0, 0,-ESC_V, -ESC_W, -ESC_X, +/* E8 */ 0,-ESC_Z, 0, 0, 0, 0, 0, 0, +/* F0 */ 0, 0, 0, 0, 0, 0, 0, 0, +/* F8 */ 0, 0, 0, 0, 0, 0, 0, 0 +}; + +/* We also need a table of characters that may follow \c in an EBCDIC +environment for characters 0-31. */ + +static unsigned char ebcdic_escape_c[] = "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_"; + +#endif + + +/* Table of special "verbs" like (*PRUNE). This is a short table, so it is +searched linearly. Put all the names into a single string, in order to reduce +the number of relocations when a shared library is dynamically linked. The +string is built from string macros so that it works in UTF-8 mode on EBCDIC +platforms. */ + +typedef struct verbitem { + int len; /* Length of verb name */ + int op; /* Op when no arg, or -1 if arg mandatory */ + int op_arg; /* Op when arg present, or -1 if not allowed */ +} verbitem; + +static const char verbnames[] = + "\0" /* Empty name is a shorthand for MARK */ + STRING_MARK0 + STRING_ACCEPT0 + STRING_COMMIT0 + STRING_F0 + STRING_FAIL0 + STRING_PRUNE0 + STRING_SKIP0 + STRING_THEN; + +static const verbitem verbs[] = { + { 0, -1, OP_MARK }, + { 4, -1, OP_MARK }, + { 6, OP_ACCEPT, -1 }, + { 6, OP_COMMIT, -1 }, + { 1, OP_FAIL, -1 }, + { 4, OP_FAIL, -1 }, + { 5, OP_PRUNE, OP_PRUNE_ARG }, + { 4, OP_SKIP, OP_SKIP_ARG }, + { 4, OP_THEN, OP_THEN_ARG } +}; + +static const int verbcount = sizeof(verbs)/sizeof(verbitem); + + +/* Substitutes for [[:<:]] and [[:>:]], which mean start and end of word in +another regex library. */ + +static const pcre_uchar sub_start_of_word[] = { + CHAR_BACKSLASH, CHAR_b, CHAR_LEFT_PARENTHESIS, CHAR_QUESTION_MARK, + CHAR_EQUALS_SIGN, CHAR_BACKSLASH, CHAR_w, CHAR_RIGHT_PARENTHESIS, '\0' }; + +static const pcre_uchar sub_end_of_word[] = { + CHAR_BACKSLASH, CHAR_b, CHAR_LEFT_PARENTHESIS, CHAR_QUESTION_MARK, + CHAR_LESS_THAN_SIGN, CHAR_EQUALS_SIGN, CHAR_BACKSLASH, CHAR_w, + CHAR_RIGHT_PARENTHESIS, '\0' }; + + +/* Tables of names of POSIX character classes and their lengths. The names are +now all in a single string, to reduce the number of relocations when a shared +library is dynamically loaded. The list of lengths is terminated by a zero +length entry. The first three must be alpha, lower, upper, as this is assumed +for handling case independence. The indices for graph, print, and punct are +needed, so identify them. */ + +static const char posix_names[] = + STRING_alpha0 STRING_lower0 STRING_upper0 STRING_alnum0 + STRING_ascii0 STRING_blank0 STRING_cntrl0 STRING_digit0 + STRING_graph0 STRING_print0 STRING_punct0 STRING_space0 + STRING_word0 STRING_xdigit; + +static const pcre_uint8 posix_name_lengths[] = { + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 6, 0 }; + +#define PC_GRAPH 8 +#define PC_PRINT 9 +#define PC_PUNCT 10 + + +/* Table of class bit maps for each POSIX class. Each class is formed from a +base map, with an optional addition or removal of another map. Then, for some +classes, there is some additional tweaking: for [:blank:] the vertical space +characters are removed, and for [:alpha:] and [:alnum:] the underscore +character is removed. The triples in the table consist of the base map offset, +second map offset or -1 if no second map, and a non-negative value for map +addition or a negative value for map subtraction (if there are two maps). The +absolute value of the third field has these meanings: 0 => no tweaking, 1 => +remove vertical space characters, 2 => remove underscore. */ + +static const int posix_class_maps[] = { + cbit_word, cbit_digit, -2, /* alpha */ + cbit_lower, -1, 0, /* lower */ + cbit_upper, -1, 0, /* upper */ + cbit_word, -1, 2, /* alnum - word without underscore */ + cbit_print, cbit_cntrl, 0, /* ascii */ + cbit_space, -1, 1, /* blank - a GNU extension */ + cbit_cntrl, -1, 0, /* cntrl */ + cbit_digit, -1, 0, /* digit */ + cbit_graph, -1, 0, /* graph */ + cbit_print, -1, 0, /* print */ + cbit_punct, -1, 0, /* punct */ + cbit_space, -1, 0, /* space */ + cbit_word, -1, 0, /* word - a Perl extension */ + cbit_xdigit,-1, 0 /* xdigit */ +}; + +/* Table of substitutes for \d etc when PCRE_UCP is set. They are replaced by +Unicode property escapes. */ + +#ifdef SUPPORT_UCP +static const pcre_uchar string_PNd[] = { + CHAR_BACKSLASH, CHAR_P, CHAR_LEFT_CURLY_BRACKET, + CHAR_N, CHAR_d, CHAR_RIGHT_CURLY_BRACKET, '\0' }; +static const pcre_uchar string_pNd[] = { + CHAR_BACKSLASH, CHAR_p, CHAR_LEFT_CURLY_BRACKET, + CHAR_N, CHAR_d, CHAR_RIGHT_CURLY_BRACKET, '\0' }; +static const pcre_uchar string_PXsp[] = { + CHAR_BACKSLASH, CHAR_P, CHAR_LEFT_CURLY_BRACKET, + CHAR_X, CHAR_s, CHAR_p, CHAR_RIGHT_CURLY_BRACKET, '\0' }; +static const pcre_uchar string_pXsp[] = { + CHAR_BACKSLASH, CHAR_p, CHAR_LEFT_CURLY_BRACKET, + CHAR_X, CHAR_s, CHAR_p, CHAR_RIGHT_CURLY_BRACKET, '\0' }; +static const pcre_uchar string_PXwd[] = { + CHAR_BACKSLASH, CHAR_P, CHAR_LEFT_CURLY_BRACKET, + CHAR_X, CHAR_w, CHAR_d, CHAR_RIGHT_CURLY_BRACKET, '\0' }; +static const pcre_uchar string_pXwd[] = { + CHAR_BACKSLASH, CHAR_p, CHAR_LEFT_CURLY_BRACKET, + CHAR_X, CHAR_w, CHAR_d, CHAR_RIGHT_CURLY_BRACKET, '\0' }; + +static const pcre_uchar *substitutes[] = { + string_PNd, /* \D */ + string_pNd, /* \d */ + string_PXsp, /* \S */ /* Xsp is Perl space, but from 8.34, Perl */ + string_pXsp, /* \s */ /* space and POSIX space are the same. */ + string_PXwd, /* \W */ + string_pXwd /* \w */ +}; + +/* The POSIX class substitutes must be in the order of the POSIX class names, +defined above, and there are both positive and negative cases. NULL means no +general substitute of a Unicode property escape (\p or \P). However, for some +POSIX classes (e.g. graph, print, punct) a special property code is compiled +directly. */ + +static const pcre_uchar string_pL[] = { + CHAR_BACKSLASH, CHAR_p, CHAR_LEFT_CURLY_BRACKET, + CHAR_L, CHAR_RIGHT_CURLY_BRACKET, '\0' }; +static const pcre_uchar string_pLl[] = { + CHAR_BACKSLASH, CHAR_p, CHAR_LEFT_CURLY_BRACKET, + CHAR_L, CHAR_l, CHAR_RIGHT_CURLY_BRACKET, '\0' }; +static const pcre_uchar string_pLu[] = { + CHAR_BACKSLASH, CHAR_p, CHAR_LEFT_CURLY_BRACKET, + CHAR_L, CHAR_u, CHAR_RIGHT_CURLY_BRACKET, '\0' }; +static const pcre_uchar string_pXan[] = { + CHAR_BACKSLASH, CHAR_p, CHAR_LEFT_CURLY_BRACKET, + CHAR_X, CHAR_a, CHAR_n, CHAR_RIGHT_CURLY_BRACKET, '\0' }; +static const pcre_uchar string_h[] = { + CHAR_BACKSLASH, CHAR_h, '\0' }; +static const pcre_uchar string_pXps[] = { + CHAR_BACKSLASH, CHAR_p, CHAR_LEFT_CURLY_BRACKET, + CHAR_X, CHAR_p, CHAR_s, CHAR_RIGHT_CURLY_BRACKET, '\0' }; +static const pcre_uchar string_PL[] = { + CHAR_BACKSLASH, CHAR_P, CHAR_LEFT_CURLY_BRACKET, + CHAR_L, CHAR_RIGHT_CURLY_BRACKET, '\0' }; +static const pcre_uchar string_PLl[] = { + CHAR_BACKSLASH, CHAR_P, CHAR_LEFT_CURLY_BRACKET, + CHAR_L, CHAR_l, CHAR_RIGHT_CURLY_BRACKET, '\0' }; +static const pcre_uchar string_PLu[] = { + CHAR_BACKSLASH, CHAR_P, CHAR_LEFT_CURLY_BRACKET, + CHAR_L, CHAR_u, CHAR_RIGHT_CURLY_BRACKET, '\0' }; +static const pcre_uchar string_PXan[] = { + CHAR_BACKSLASH, CHAR_P, CHAR_LEFT_CURLY_BRACKET, + CHAR_X, CHAR_a, CHAR_n, CHAR_RIGHT_CURLY_BRACKET, '\0' }; +static const pcre_uchar string_H[] = { + CHAR_BACKSLASH, CHAR_H, '\0' }; +static const pcre_uchar string_PXps[] = { + CHAR_BACKSLASH, CHAR_P, CHAR_LEFT_CURLY_BRACKET, + CHAR_X, CHAR_p, CHAR_s, CHAR_RIGHT_CURLY_BRACKET, '\0' }; + +static const pcre_uchar *posix_substitutes[] = { + string_pL, /* alpha */ + string_pLl, /* lower */ + string_pLu, /* upper */ + string_pXan, /* alnum */ + NULL, /* ascii */ + string_h, /* blank */ + NULL, /* cntrl */ + string_pNd, /* digit */ + NULL, /* graph */ + NULL, /* print */ + NULL, /* punct */ + string_pXps, /* space */ /* Xps is POSIX space, but from 8.34 */ + string_pXwd, /* word */ /* Perl and POSIX space are the same */ + NULL, /* xdigit */ + /* Negated cases */ + string_PL, /* ^alpha */ + string_PLl, /* ^lower */ + string_PLu, /* ^upper */ + string_PXan, /* ^alnum */ + NULL, /* ^ascii */ + string_H, /* ^blank */ + NULL, /* ^cntrl */ + string_PNd, /* ^digit */ + NULL, /* ^graph */ + NULL, /* ^print */ + NULL, /* ^punct */ + string_PXps, /* ^space */ /* Xps is POSIX space, but from 8.34 */ + string_PXwd, /* ^word */ /* Perl and POSIX space are the same */ + NULL /* ^xdigit */ +}; +#define POSIX_SUBSIZE (sizeof(posix_substitutes) / sizeof(pcre_uchar *)) +#endif + +#define STRING(a) # a +#define XSTRING(s) STRING(s) + +/* The texts of compile-time error messages. These are "char *" because they +are passed to the outside world. Do not ever re-use any error number, because +they are documented. Always add a new error instead. Messages marked DEAD below +are no longer used. This used to be a table of strings, but in order to reduce +the number of relocations needed when a shared library is loaded dynamically, +it is now one long string. We cannot use a table of offsets, because the +lengths of inserts such as XSTRING(MAX_NAME_SIZE) are not known. Instead, we +simply count through to the one we want - this isn't a performance issue +because these strings are used only when there is a compilation error. + +Each substring ends with \0 to insert a null character. This includes the final +substring, so that the whole string ends with \0\0, which can be detected when +counting through. */ + +static const char error_texts[] = + "no error\0" + "\\ at end of pattern\0" + "\\c at end of pattern\0" + "unrecognized character follows \\\0" + "numbers out of order in {} quantifier\0" + /* 5 */ + "number too big in {} quantifier\0" + "missing terminating ] for character class\0" + "invalid escape sequence in character class\0" + "range out of order in character class\0" + "nothing to repeat\0" + /* 10 */ + "internal error: invalid forward reference offset\0" + "internal error: unexpected repeat\0" + "unrecognized character after (? or (?-\0" + "POSIX named classes are supported only within a class\0" + "missing )\0" + /* 15 */ + "reference to non-existent subpattern\0" + "erroffset passed as NULL\0" + "unknown option bit(s) set\0" + "missing ) after comment\0" + "parentheses nested too deeply\0" /** DEAD **/ + /* 20 */ + "regular expression is too large\0" + "failed to get memory\0" + "unmatched parentheses\0" + "internal error: code overflow\0" + "unrecognized character after (?<\0" + /* 25 */ + "lookbehind assertion is not fixed length\0" + "malformed number or name after (?(\0" + "conditional group contains more than two branches\0" + "assertion expected after (?( or (?(?C)\0" + "(?R or (?[+-]digits must be followed by )\0" + /* 30 */ + "unknown POSIX class name\0" + "POSIX collating elements are not supported\0" + "this version of PCRE is compiled without UTF support\0" + "spare error\0" /** DEAD **/ + "character value in \\x{} or \\o{} is too large\0" + /* 35 */ + "invalid condition (?(0)\0" + "\\C not allowed in lookbehind assertion\0" + "PCRE does not support \\L, \\l, \\N{name}, \\U, or \\u\0" + "number after (?C is > 255\0" + "closing ) for (?C expected\0" + /* 40 */ + "recursive call could loop indefinitely\0" + "unrecognized character after (?P\0" + "syntax error in subpattern name (missing terminator)\0" + "two named subpatterns have the same name\0" + "invalid UTF-8 string\0" + /* 45 */ + "support for \\P, \\p, and \\X has not been compiled\0" + "malformed \\P or \\p sequence\0" + "unknown property name after \\P or \\p\0" + "subpattern name is too long (maximum " XSTRING(MAX_NAME_SIZE) " characters)\0" + "too many named subpatterns (maximum " XSTRING(MAX_NAME_COUNT) ")\0" + /* 50 */ + "repeated subpattern is too long\0" /** DEAD **/ + "octal value is greater than \\377 in 8-bit non-UTF-8 mode\0" + "internal error: overran compiling workspace\0" + "internal error: previously-checked referenced subpattern not found\0" + "DEFINE group contains more than one branch\0" + /* 55 */ + "repeating a DEFINE group is not allowed\0" /** DEAD **/ + "inconsistent NEWLINE options\0" + "\\g is not followed by a braced, angle-bracketed, or quoted name/number or by a plain number\0" + "a numbered reference must not be zero\0" + "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)\0" + /* 60 */ + "(*VERB) not recognized or malformed\0" + "number is too big\0" + "subpattern name expected\0" + "digit expected after (?+\0" + "] is an invalid data character in JavaScript compatibility mode\0" + /* 65 */ + "different names for subpatterns of the same number are not allowed\0" + "(*MARK) must have an argument\0" + "this version of PCRE is not compiled with Unicode property support\0" +#ifndef EBCDIC + "\\c must be followed by an ASCII character\0" +#else + "\\c must be followed by a letter or one of [\\]^_?\0" +#endif + "\\k is not followed by a braced, angle-bracketed, or quoted name\0" + /* 70 */ + "internal error: unknown opcode in find_fixedlength()\0" + "\\N is not supported in a class\0" + "too many forward references\0" + "disallowed Unicode code point (>= 0xd800 && <= 0xdfff)\0" + "invalid UTF-16 string\0" + /* 75 */ + "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)\0" + "character value in \\u.... sequence is too large\0" + "invalid UTF-32 string\0" + "setting UTF is disabled by the application\0" + "non-hex character in \\x{} (closing brace missing?)\0" + /* 80 */ + "non-octal character in \\o{} (closing brace missing?)\0" + "missing opening brace after \\o\0" + "parentheses are too deeply nested\0" + "invalid range in character class\0" + "group name must start with a non-digit\0" + /* 85 */ + "parentheses are too deeply nested (stack check)\0" + "digits missing in \\x{} or \\o{}\0" + "regular expression is too complicated\0" + ; + +/* Table to identify digits and hex digits. This is used when compiling +patterns. Note that the tables in chartables are dependent on the locale, and +may mark arbitrary characters as digits - but the PCRE compiling code expects +to handle only 0-9, a-z, and A-Z as digits when compiling. That is why we have +a private table here. It costs 256 bytes, but it is a lot faster than doing +character value tests (at least in some simple cases I timed), and in some +applications one wants PCRE to compile efficiently as well as match +efficiently. + +For convenience, we use the same bit definitions as in chartables: + + 0x04 decimal digit + 0x08 hexadecimal digit + +Then we can use ctype_digit and ctype_xdigit in the code. */ + +/* Using a simple comparison for decimal numbers rather than a memory read +is much faster, and the resulting code is simpler (the compiler turns it +into a subtraction and unsigned comparison). */ + +#define IS_DIGIT(x) ((x) >= CHAR_0 && (x) <= CHAR_9) + +#ifndef EBCDIC + +/* This is the "normal" case, for ASCII systems, and EBCDIC systems running in +UTF-8 mode. */ + +static const pcre_uint8 digitab[] = + { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0- 7 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 8- 15 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 16- 23 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 24- 31 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* - ' */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* ( - / */ + 0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c, /* 0 - 7 */ + 0x0c,0x0c,0x00,0x00,0x00,0x00,0x00,0x00, /* 8 - ? */ + 0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00, /* @ - G */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* H - O */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* P - W */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* X - _ */ + 0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00, /* ` - g */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* h - o */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* p - w */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* x -127 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 128-135 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 136-143 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 144-151 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 152-159 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 160-167 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 168-175 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 176-183 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 184-191 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 192-199 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 200-207 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 208-215 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 216-223 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 224-231 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 232-239 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 240-247 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/* 248-255 */ + +#else + +/* This is the "abnormal" case, for EBCDIC systems not running in UTF-8 mode. */ + +static const pcre_uint8 digitab[] = + { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0- 7 0 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 8- 15 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 16- 23 10 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 24- 31 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 32- 39 20 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 40- 47 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 48- 55 30 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 56- 63 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* - 71 40 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 72- | */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* & - 87 50 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 88- 95 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* - -103 60 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 104- ? */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 112-119 70 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 120- " */ + 0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00, /* 128- g 80 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* h -143 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 144- p 90 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* q -159 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 160- x A0 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* y -175 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* ^ -183 B0 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 184-191 */ + 0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00, /* { - G C0 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* H -207 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* } - P D0 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* Q -223 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* \ - X E0 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* Y -239 */ + 0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c, /* 0 - 7 F0 */ + 0x0c,0x0c,0x00,0x00,0x00,0x00,0x00,0x00};/* 8 -255 */ + +static const pcre_uint8 ebcdic_chartab[] = { /* chartable partial dup */ + 0x80,0x00,0x00,0x00,0x00,0x01,0x00,0x00, /* 0- 7 */ + 0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00, /* 8- 15 */ + 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, /* 16- 23 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 24- 31 */ + 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, /* 32- 39 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 40- 47 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 48- 55 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 56- 63 */ + 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* - 71 */ + 0x00,0x00,0x00,0x80,0x00,0x80,0x80,0x80, /* 72- | */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* & - 87 */ + 0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00, /* 88- 95 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* - -103 */ + 0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x80, /* 104- ? */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 112-119 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 120- " */ + 0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /* 128- g */ + 0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /* h -143 */ + 0x00,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* 144- p */ + 0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /* q -159 */ + 0x00,0x00,0x12,0x12,0x12,0x12,0x12,0x12, /* 160- x */ + 0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /* y -175 */ + 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* ^ -183 */ + 0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00, /* 184-191 */ + 0x80,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /* { - G */ + 0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /* H -207 */ + 0x00,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* } - P */ + 0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /* Q -223 */ + 0x00,0x00,0x12,0x12,0x12,0x12,0x12,0x12, /* \ - X */ + 0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /* Y -239 */ + 0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c, /* 0 - 7 */ + 0x1c,0x1c,0x00,0x00,0x00,0x00,0x00,0x00};/* 8 -255 */ +#endif + + +/* This table is used to check whether auto-possessification is possible +between adjacent character-type opcodes. The left-hand (repeated) opcode is +used to select the row, and the right-hand opcode is use to select the column. +A value of 1 means that auto-possessification is OK. For example, the second +value in the first row means that \D+\d can be turned into \D++\d. + +The Unicode property types (\P and \p) have to be present to fill out the table +because of what their opcode values are, but the table values should always be +zero because property types are handled separately in the code. The last four +columns apply to items that cannot be repeated, so there is no need to have +rows for them. Note that OP_DIGIT etc. are generated only when PCRE_UCP is +*not* set. When it is set, \d etc. are converted into OP_(NOT_)PROP codes. */ + +#define APTROWS (LAST_AUTOTAB_LEFT_OP - FIRST_AUTOTAB_OP + 1) +#define APTCOLS (LAST_AUTOTAB_RIGHT_OP - FIRST_AUTOTAB_OP + 1) + +static const pcre_uint8 autoposstab[APTROWS][APTCOLS] = { +/* \D \d \S \s \W \w . .+ \C \P \p \R \H \h \V \v \X \Z \z $ $M */ + { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, /* \D */ + { 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1 }, /* \d */ + { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1 }, /* \S */ + { 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, /* \s */ + { 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, /* \W */ + { 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1 }, /* \w */ + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, /* . */ + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, /* .+ */ + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, /* \C */ + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* \P */ + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* \p */ + { 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0 }, /* \R */ + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0 }, /* \H */ + { 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0 }, /* \h */ + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0 }, /* \V */ + { 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0 }, /* \v */ + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 } /* \X */ +}; + + +/* This table is used to check whether auto-possessification is possible +between adjacent Unicode property opcodes (OP_PROP and OP_NOTPROP). The +left-hand (repeated) opcode is used to select the row, and the right-hand +opcode is used to select the column. The values are as follows: + + 0 Always return FALSE (never auto-possessify) + 1 Character groups are distinct (possessify if both are OP_PROP) + 2 Check character categories in the same group (general or particular) + 3 TRUE if the two opcodes are not the same (PROP vs NOTPROP) + + 4 Check left general category vs right particular category + 5 Check right general category vs left particular category + + 6 Left alphanum vs right general category + 7 Left space vs right general category + 8 Left word vs right general category + + 9 Right alphanum vs left general category + 10 Right space vs left general category + 11 Right word vs left general category + + 12 Left alphanum vs right particular category + 13 Left space vs right particular category + 14 Left word vs right particular category + + 15 Right alphanum vs left particular category + 16 Right space vs left particular category + 17 Right word vs left particular category +*/ + +static const pcre_uint8 propposstab[PT_TABSIZE][PT_TABSIZE] = { +/* ANY LAMP GC PC SC ALNUM SPACE PXSPACE WORD CLIST UCNC */ + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* PT_ANY */ + { 0, 3, 0, 0, 0, 3, 1, 1, 0, 0, 0 }, /* PT_LAMP */ + { 0, 0, 2, 4, 0, 9, 10, 10, 11, 0, 0 }, /* PT_GC */ + { 0, 0, 5, 2, 0, 15, 16, 16, 17, 0, 0 }, /* PT_PC */ + { 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0 }, /* PT_SC */ + { 0, 3, 6, 12, 0, 3, 1, 1, 0, 0, 0 }, /* PT_ALNUM */ + { 0, 1, 7, 13, 0, 1, 3, 3, 1, 0, 0 }, /* PT_SPACE */ + { 0, 1, 7, 13, 0, 1, 3, 3, 1, 0, 0 }, /* PT_PXSPACE */ + { 0, 0, 8, 14, 0, 0, 1, 1, 3, 0, 0 }, /* PT_WORD */ + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* PT_CLIST */ + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3 } /* PT_UCNC */ +}; + +/* This table is used to check whether auto-possessification is possible +between adjacent Unicode property opcodes (OP_PROP and OP_NOTPROP) when one +specifies a general category and the other specifies a particular category. The +row is selected by the general category and the column by the particular +category. The value is 1 if the particular category is not part of the general +category. */ + +static const pcre_uint8 catposstab[7][30] = { +/* Cc Cf Cn Co Cs Ll Lm Lo Lt Lu Mc Me Mn Nd Nl No Pc Pd Pe Pf Pi Po Ps Sc Sk Sm So Zl Zp Zs */ + { 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, /* C */ + { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, /* L */ + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, /* M */ + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, /* N */ + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 }, /* P */ + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1 }, /* S */ + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0 } /* Z */ +}; + +/* This table is used when checking ALNUM, (PX)SPACE, SPACE, and WORD against +a general or particular category. The properties in each row are those +that apply to the character set in question. Duplication means that a little +unnecessary work is done when checking, but this keeps things much simpler +because they can all use the same code. For more details see the comment where +this table is used. + +Note: SPACE and PXSPACE used to be different because Perl excluded VT from +"space", but from Perl 5.18 it's included, so both categories are treated the +same here. */ + +static const pcre_uint8 posspropstab[3][4] = { + { ucp_L, ucp_N, ucp_N, ucp_Nl }, /* ALNUM, 3rd and 4th values redundant */ + { ucp_Z, ucp_Z, ucp_C, ucp_Cc }, /* SPACE and PXSPACE, 2nd value redundant */ + { ucp_L, ucp_N, ucp_P, ucp_Po } /* WORD */ +}; + +/* This table is used when converting repeating opcodes into possessified +versions as a result of an explicit possessive quantifier such as ++. A zero +value means there is no possessified version - in those cases the item in +question must be wrapped in ONCE brackets. The table is truncated at OP_CALLOUT +because all relevant opcodes are less than that. */ + +static const pcre_uint8 opcode_possessify[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0 - 15 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 16 - 31 */ + + 0, /* NOTI */ + OP_POSSTAR, 0, /* STAR, MINSTAR */ + OP_POSPLUS, 0, /* PLUS, MINPLUS */ + OP_POSQUERY, 0, /* QUERY, MINQUERY */ + OP_POSUPTO, 0, /* UPTO, MINUPTO */ + 0, /* EXACT */ + 0, 0, 0, 0, /* POS{STAR,PLUS,QUERY,UPTO} */ + + OP_POSSTARI, 0, /* STARI, MINSTARI */ + OP_POSPLUSI, 0, /* PLUSI, MINPLUSI */ + OP_POSQUERYI, 0, /* QUERYI, MINQUERYI */ + OP_POSUPTOI, 0, /* UPTOI, MINUPTOI */ + 0, /* EXACTI */ + 0, 0, 0, 0, /* POS{STARI,PLUSI,QUERYI,UPTOI} */ + + OP_NOTPOSSTAR, 0, /* NOTSTAR, NOTMINSTAR */ + OP_NOTPOSPLUS, 0, /* NOTPLUS, NOTMINPLUS */ + OP_NOTPOSQUERY, 0, /* NOTQUERY, NOTMINQUERY */ + OP_NOTPOSUPTO, 0, /* NOTUPTO, NOTMINUPTO */ + 0, /* NOTEXACT */ + 0, 0, 0, 0, /* NOTPOS{STAR,PLUS,QUERY,UPTO} */ + + OP_NOTPOSSTARI, 0, /* NOTSTARI, NOTMINSTARI */ + OP_NOTPOSPLUSI, 0, /* NOTPLUSI, NOTMINPLUSI */ + OP_NOTPOSQUERYI, 0, /* NOTQUERYI, NOTMINQUERYI */ + OP_NOTPOSUPTOI, 0, /* NOTUPTOI, NOTMINUPTOI */ + 0, /* NOTEXACTI */ + 0, 0, 0, 0, /* NOTPOS{STARI,PLUSI,QUERYI,UPTOI} */ + + OP_TYPEPOSSTAR, 0, /* TYPESTAR, TYPEMINSTAR */ + OP_TYPEPOSPLUS, 0, /* TYPEPLUS, TYPEMINPLUS */ + OP_TYPEPOSQUERY, 0, /* TYPEQUERY, TYPEMINQUERY */ + OP_TYPEPOSUPTO, 0, /* TYPEUPTO, TYPEMINUPTO */ + 0, /* TYPEEXACT */ + 0, 0, 0, 0, /* TYPEPOS{STAR,PLUS,QUERY,UPTO} */ + + OP_CRPOSSTAR, 0, /* CRSTAR, CRMINSTAR */ + OP_CRPOSPLUS, 0, /* CRPLUS, CRMINPLUS */ + OP_CRPOSQUERY, 0, /* CRQUERY, CRMINQUERY */ + OP_CRPOSRANGE, 0, /* CRRANGE, CRMINRANGE */ + 0, 0, 0, 0, /* CRPOS{STAR,PLUS,QUERY,RANGE} */ + + 0, 0, 0, /* CLASS, NCLASS, XCLASS */ + 0, 0, /* REF, REFI */ + 0, 0, /* DNREF, DNREFI */ + 0, 0 /* RECURSE, CALLOUT */ +}; + + + +/************************************************* +* Find an error text * +*************************************************/ + +/* The error texts are now all in one long string, to save on relocations. As +some of the text is of unknown length, we can't use a table of offsets. +Instead, just count through the strings. This is not a performance issue +because it happens only when there has been a compilation error. + +Argument: the error number +Returns: pointer to the error string +*/ + +static const char * +find_error_text(int n) +{ +const char *s = error_texts; +for (; n > 0; n--) + { + while (*s++ != CHAR_NULL) {}; + if (*s == CHAR_NULL) return "Error text not found (please report)"; + } +return s; +} + + + +/************************************************* +* Expand the workspace * +*************************************************/ + +/* This function is called during the second compiling phase, if the number of +forward references fills the existing workspace, which is originally a block on +the stack. A larger block is obtained from malloc() unless the ultimate limit +has been reached or the increase will be rather small. + +Argument: pointer to the compile data block +Returns: 0 if all went well, else an error number +*/ + +static int +expand_workspace(compile_data *cd) +{ +pcre_uchar *newspace; +int newsize = cd->workspace_size * 2; + +if (newsize > COMPILE_WORK_SIZE_MAX) newsize = COMPILE_WORK_SIZE_MAX; +if (cd->workspace_size >= COMPILE_WORK_SIZE_MAX || + newsize - cd->workspace_size < WORK_SIZE_SAFETY_MARGIN) + return ERR72; + +newspace = (PUBL(malloc))(IN_UCHARS(newsize)); +if (newspace == NULL) return ERR21; +memcpy(newspace, cd->start_workspace, cd->workspace_size * sizeof(pcre_uchar)); +cd->hwm = (pcre_uchar *)newspace + (cd->hwm - cd->start_workspace); +if (cd->workspace_size > COMPILE_WORK_SIZE) + (PUBL(free))((void *)cd->start_workspace); +cd->start_workspace = newspace; +cd->workspace_size = newsize; +return 0; +} + + + +/************************************************* +* Check for counted repeat * +*************************************************/ + +/* This function is called when a '{' is encountered in a place where it might +start a quantifier. It looks ahead to see if it really is a quantifier or not. +It is only a quantifier if it is one of the forms {ddd} {ddd,} or {ddd,ddd} +where the ddds are digits. + +Arguments: + p pointer to the first char after '{' + +Returns: TRUE or FALSE +*/ + +static BOOL +is_counted_repeat(const pcre_uchar *p) +{ +if (!IS_DIGIT(*p)) return FALSE; +p++; +while (IS_DIGIT(*p)) p++; +if (*p == CHAR_RIGHT_CURLY_BRACKET) return TRUE; + +if (*p++ != CHAR_COMMA) return FALSE; +if (*p == CHAR_RIGHT_CURLY_BRACKET) return TRUE; + +if (!IS_DIGIT(*p)) return FALSE; +p++; +while (IS_DIGIT(*p)) p++; + +return (*p == CHAR_RIGHT_CURLY_BRACKET); +} + + + +/************************************************* +* Handle escapes * +*************************************************/ + +/* This function is called when a \ has been encountered. It either returns a +positive value for a simple escape such as \n, or 0 for a data character which +will be placed in chptr. A backreference to group n is returned as negative n. +When UTF-8 is enabled, a positive value greater than 255 may be returned in +chptr. On entry, ptr is pointing at the \. On exit, it is on the final +character of the escape sequence. + +Arguments: + ptrptr points to the pattern position pointer + chptr points to a returned data character + errorcodeptr points to the errorcode variable + bracount number of previous extracting brackets + options the options bits + isclass TRUE if inside a character class + +Returns: zero => a data character + positive => a special escape sequence + negative => a back reference + on error, errorcodeptr is set +*/ + +static int +check_escape(const pcre_uchar **ptrptr, pcre_uint32 *chptr, int *errorcodeptr, + int bracount, int options, BOOL isclass) +{ +/* PCRE_UTF16 has the same value as PCRE_UTF8. */ +BOOL utf = (options & PCRE_UTF8) != 0; +const pcre_uchar *ptr = *ptrptr + 1; +pcre_uint32 c; +int escape = 0; +int i; + +GETCHARINCTEST(c, ptr); /* Get character value, increment pointer */ +ptr--; /* Set pointer back to the last byte */ + +/* If backslash is at the end of the pattern, it's an error. */ + +if (c == CHAR_NULL) *errorcodeptr = ERR1; + +/* Non-alphanumerics are literals. For digits or letters, do an initial lookup +in a table. A non-zero result is something that can be returned immediately. +Otherwise further processing may be required. */ + +#ifndef EBCDIC /* ASCII/UTF-8 coding */ +/* Not alphanumeric */ +else if (c < CHAR_0 || c > CHAR_z) {} +else if ((i = escapes[c - CHAR_0]) != 0) + { if (i > 0) c = (pcre_uint32)i; else escape = -i; } + +#else /* EBCDIC coding */ +/* Not alphanumeric */ +else if (c < CHAR_a || (!MAX_255(c) || (ebcdic_chartab[c] & 0x0E) == 0)) {} +else if ((i = escapes[c - 0x48]) != 0) { if (i > 0) c = (pcre_uint32)i; else escape = -i; } +#endif + +/* Escapes that need further processing, or are illegal. */ + +else + { + const pcre_uchar *oldptr; + BOOL braced, negated, overflow; + int s; + + switch (c) + { + /* A number of Perl escapes are not handled by PCRE. We give an explicit + error. */ + + case CHAR_l: + case CHAR_L: + *errorcodeptr = ERR37; + break; + + case CHAR_u: + if ((options & PCRE_JAVASCRIPT_COMPAT) != 0) + { + /* In JavaScript, \u must be followed by four hexadecimal numbers. + Otherwise it is a lowercase u letter. */ + if (MAX_255(ptr[1]) && (digitab[ptr[1]] & ctype_xdigit) != 0 + && MAX_255(ptr[2]) && (digitab[ptr[2]] & ctype_xdigit) != 0 + && MAX_255(ptr[3]) && (digitab[ptr[3]] & ctype_xdigit) != 0 + && MAX_255(ptr[4]) && (digitab[ptr[4]] & ctype_xdigit) != 0) + { + c = 0; + for (i = 0; i < 4; ++i) + { + register pcre_uint32 cc = *(++ptr); +#ifndef EBCDIC /* ASCII/UTF-8 coding */ + if (cc >= CHAR_a) cc -= 32; /* Convert to upper case */ + c = (c << 4) + cc - ((cc < CHAR_A)? CHAR_0 : (CHAR_A - 10)); +#else /* EBCDIC coding */ + if (cc >= CHAR_a && cc <= CHAR_z) cc += 64; /* Convert to upper case */ + c = (c << 4) + cc - ((cc >= CHAR_0)? CHAR_0 : (CHAR_A - 10)); +#endif + } + +#if defined COMPILE_PCRE8 + if (c > (utf ? 0x10ffffU : 0xffU)) +#elif defined COMPILE_PCRE16 + if (c > (utf ? 0x10ffffU : 0xffffU)) +#elif defined COMPILE_PCRE32 + if (utf && c > 0x10ffffU) +#endif + { + *errorcodeptr = ERR76; + } + else if (utf && c >= 0xd800 && c <= 0xdfff) *errorcodeptr = ERR73; + } + } + else + *errorcodeptr = ERR37; + break; + + case CHAR_U: + /* In JavaScript, \U is an uppercase U letter. */ + if ((options & PCRE_JAVASCRIPT_COMPAT) == 0) *errorcodeptr = ERR37; + break; + + /* In a character class, \g is just a literal "g". Outside a character + class, \g must be followed by one of a number of specific things: + + (1) A number, either plain or braced. If positive, it is an absolute + backreference. If negative, it is a relative backreference. This is a Perl + 5.10 feature. + + (2) Perl 5.10 also supports \g{name} as a reference to a named group. This + is part of Perl's movement towards a unified syntax for back references. As + this is synonymous with \k{name}, we fudge it up by pretending it really + was \k. + + (3) For Oniguruma compatibility we also support \g followed by a name or a + number either in angle brackets or in single quotes. However, these are + (possibly recursive) subroutine calls, _not_ backreferences. Just return + the ESC_g code (cf \k). */ + + case CHAR_g: + if (isclass) break; + if (ptr[1] == CHAR_LESS_THAN_SIGN || ptr[1] == CHAR_APOSTROPHE) + { + escape = ESC_g; + break; + } + + /* Handle the Perl-compatible cases */ + + if (ptr[1] == CHAR_LEFT_CURLY_BRACKET) + { + const pcre_uchar *p; + for (p = ptr+2; *p != CHAR_NULL && *p != CHAR_RIGHT_CURLY_BRACKET; p++) + if (*p != CHAR_MINUS && !IS_DIGIT(*p)) break; + if (*p != CHAR_NULL && *p != CHAR_RIGHT_CURLY_BRACKET) + { + escape = ESC_k; + break; + } + braced = TRUE; + ptr++; + } + else braced = FALSE; + + if (ptr[1] == CHAR_MINUS) + { + negated = TRUE; + ptr++; + } + else negated = FALSE; + + /* The integer range is limited by the machine's int representation. */ + s = 0; + overflow = FALSE; + while (IS_DIGIT(ptr[1])) + { + if (s > INT_MAX / 10 - 1) /* Integer overflow */ + { + overflow = TRUE; + break; + } + s = s * 10 + (int)(*(++ptr) - CHAR_0); + } + if (overflow) /* Integer overflow */ + { + while (IS_DIGIT(ptr[1])) + ptr++; + *errorcodeptr = ERR61; + break; + } + + if (braced && *(++ptr) != CHAR_RIGHT_CURLY_BRACKET) + { + *errorcodeptr = ERR57; + break; + } + + if (s == 0) + { + *errorcodeptr = ERR58; + break; + } + + if (negated) + { + if (s > bracount) + { + *errorcodeptr = ERR15; + break; + } + s = bracount - (s - 1); + } + + escape = -s; + break; + + /* The handling of escape sequences consisting of a string of digits + starting with one that is not zero is not straightforward. Perl has changed + over the years. Nowadays \g{} for backreferences and \o{} for octal are + recommended to avoid the ambiguities in the old syntax. + + Outside a character class, the digits are read as a decimal number. If the + number is less than 8 (used to be 10), or if there are that many previous + extracting left brackets, then it is a back reference. Otherwise, up to + three octal digits are read to form an escaped byte. Thus \123 is likely to + be octal 123 (cf \0123, which is octal 012 followed by the literal 3). If + the octal value is greater than 377, the least significant 8 bits are + taken. \8 and \9 are treated as the literal characters 8 and 9. + + Inside a character class, \ followed by a digit is always either a literal + 8 or 9 or an octal number. */ + + case CHAR_1: case CHAR_2: case CHAR_3: case CHAR_4: case CHAR_5: + case CHAR_6: case CHAR_7: case CHAR_8: case CHAR_9: + + if (!isclass) + { + oldptr = ptr; + /* The integer range is limited by the machine's int representation. */ + s = (int)(c -CHAR_0); + overflow = FALSE; + while (IS_DIGIT(ptr[1])) + { + if (s > INT_MAX / 10 - 1) /* Integer overflow */ + { + overflow = TRUE; + break; + } + s = s * 10 + (int)(*(++ptr) - CHAR_0); + } + if (overflow) /* Integer overflow */ + { + while (IS_DIGIT(ptr[1])) + ptr++; + *errorcodeptr = ERR61; + break; + } + if (s < 8 || s <= bracount) /* Check for back reference */ + { + escape = -s; + break; + } + ptr = oldptr; /* Put the pointer back and fall through */ + } + + /* Handle a digit following \ when the number is not a back reference. If + the first digit is 8 or 9, Perl used to generate a binary zero byte and + then treat the digit as a following literal. At least by Perl 5.18 this + changed so as not to insert the binary zero. */ + + if ((c = *ptr) >= CHAR_8) break; + + /* Fall through with a digit less than 8 */ + + /* \0 always starts an octal number, but we may drop through to here with a + larger first octal digit. The original code used just to take the least + significant 8 bits of octal numbers (I think this is what early Perls used + to do). Nowadays we allow for larger numbers in UTF-8 mode and 16-bit mode, + but no more than 3 octal digits. */ + + case CHAR_0: + c -= CHAR_0; + while(i++ < 2 && ptr[1] >= CHAR_0 && ptr[1] <= CHAR_7) + c = c * 8 + *(++ptr) - CHAR_0; +#ifdef COMPILE_PCRE8 + if (!utf && c > 0xff) *errorcodeptr = ERR51; +#endif + break; + + /* \o is a relatively new Perl feature, supporting a more general way of + specifying character codes in octal. The only supported form is \o{ddd}. */ + + case CHAR_o: + if (ptr[1] != CHAR_LEFT_CURLY_BRACKET) *errorcodeptr = ERR81; else + if (ptr[2] == CHAR_RIGHT_CURLY_BRACKET) *errorcodeptr = ERR86; else + { + ptr += 2; + c = 0; + overflow = FALSE; + while (*ptr >= CHAR_0 && *ptr <= CHAR_7) + { + register pcre_uint32 cc = *ptr++; + if (c == 0 && cc == CHAR_0) continue; /* Leading zeroes */ +#ifdef COMPILE_PCRE32 + if (c >= 0x20000000l) { overflow = TRUE; break; } +#endif + c = (c << 3) + cc - CHAR_0 ; +#if defined COMPILE_PCRE8 + if (c > (utf ? 0x10ffffU : 0xffU)) { overflow = TRUE; break; } +#elif defined COMPILE_PCRE16 + if (c > (utf ? 0x10ffffU : 0xffffU)) { overflow = TRUE; break; } +#elif defined COMPILE_PCRE32 + if (utf && c > 0x10ffffU) { overflow = TRUE; break; } +#endif + } + if (overflow) + { + while (*ptr >= CHAR_0 && *ptr <= CHAR_7) ptr++; + *errorcodeptr = ERR34; + } + else if (*ptr == CHAR_RIGHT_CURLY_BRACKET) + { + if (utf && c >= 0xd800 && c <= 0xdfff) *errorcodeptr = ERR73; + } + else *errorcodeptr = ERR80; + } + break; + + /* \x is complicated. In JavaScript, \x must be followed by two hexadecimal + numbers. Otherwise it is a lowercase x letter. */ + + case CHAR_x: + if ((options & PCRE_JAVASCRIPT_COMPAT) != 0) + { + if (MAX_255(ptr[1]) && (digitab[ptr[1]] & ctype_xdigit) != 0 + && MAX_255(ptr[2]) && (digitab[ptr[2]] & ctype_xdigit) != 0) + { + c = 0; + for (i = 0; i < 2; ++i) + { + register pcre_uint32 cc = *(++ptr); +#ifndef EBCDIC /* ASCII/UTF-8 coding */ + if (cc >= CHAR_a) cc -= 32; /* Convert to upper case */ + c = (c << 4) + cc - ((cc < CHAR_A)? CHAR_0 : (CHAR_A - 10)); +#else /* EBCDIC coding */ + if (cc >= CHAR_a && cc <= CHAR_z) cc += 64; /* Convert to upper case */ + c = (c << 4) + cc - ((cc >= CHAR_0)? CHAR_0 : (CHAR_A - 10)); +#endif + } + } + } /* End JavaScript handling */ + + /* Handle \x in Perl's style. \x{ddd} is a character number which can be + greater than 0xff in utf or non-8bit mode, but only if the ddd are hex + digits. If not, { used to be treated as a data character. However, Perl + seems to read hex digits up to the first non-such, and ignore the rest, so + that, for example \x{zz} matches a binary zero. This seems crazy, so PCRE + now gives an error. */ + + else + { + if (ptr[1] == CHAR_LEFT_CURLY_BRACKET) + { + ptr += 2; + if (*ptr == CHAR_RIGHT_CURLY_BRACKET) + { + *errorcodeptr = ERR86; + break; + } + c = 0; + overflow = FALSE; + while (MAX_255(*ptr) && (digitab[*ptr] & ctype_xdigit) != 0) + { + register pcre_uint32 cc = *ptr++; + if (c == 0 && cc == CHAR_0) continue; /* Leading zeroes */ + +#ifdef COMPILE_PCRE32 + if (c >= 0x10000000l) { overflow = TRUE; break; } +#endif + +#ifndef EBCDIC /* ASCII/UTF-8 coding */ + if (cc >= CHAR_a) cc -= 32; /* Convert to upper case */ + c = (c << 4) + cc - ((cc < CHAR_A)? CHAR_0 : (CHAR_A - 10)); +#else /* EBCDIC coding */ + if (cc >= CHAR_a && cc <= CHAR_z) cc += 64; /* Convert to upper case */ + c = (c << 4) + cc - ((cc >= CHAR_0)? CHAR_0 : (CHAR_A - 10)); +#endif + +#if defined COMPILE_PCRE8 + if (c > (utf ? 0x10ffffU : 0xffU)) { overflow = TRUE; break; } +#elif defined COMPILE_PCRE16 + if (c > (utf ? 0x10ffffU : 0xffffU)) { overflow = TRUE; break; } +#elif defined COMPILE_PCRE32 + if (utf && c > 0x10ffffU) { overflow = TRUE; break; } +#endif + } + + if (overflow) + { + while (MAX_255(*ptr) && (digitab[*ptr] & ctype_xdigit) != 0) ptr++; + *errorcodeptr = ERR34; + } + + else if (*ptr == CHAR_RIGHT_CURLY_BRACKET) + { + if (utf && c >= 0xd800 && c <= 0xdfff) *errorcodeptr = ERR73; + } + + /* If the sequence of hex digits does not end with '}', give an error. + We used just to recognize this construct and fall through to the normal + \x handling, but nowadays Perl gives an error, which seems much more + sensible, so we do too. */ + + else *errorcodeptr = ERR79; + } /* End of \x{} processing */ + + /* Read a single-byte hex-defined char (up to two hex digits after \x) */ + + else + { + c = 0; + while (i++ < 2 && MAX_255(ptr[1]) && (digitab[ptr[1]] & ctype_xdigit) != 0) + { + pcre_uint32 cc; /* Some compilers don't like */ + cc = *(++ptr); /* ++ in initializers */ +#ifndef EBCDIC /* ASCII/UTF-8 coding */ + if (cc >= CHAR_a) cc -= 32; /* Convert to upper case */ + c = c * 16 + cc - ((cc < CHAR_A)? CHAR_0 : (CHAR_A - 10)); +#else /* EBCDIC coding */ + if (cc <= CHAR_z) cc += 64; /* Convert to upper case */ + c = c * 16 + cc - ((cc >= CHAR_0)? CHAR_0 : (CHAR_A - 10)); +#endif + } + } /* End of \xdd handling */ + } /* End of Perl-style \x handling */ + break; + + /* For \c, a following letter is upper-cased; then the 0x40 bit is flipped. + An error is given if the byte following \c is not an ASCII character. This + coding is ASCII-specific, but then the whole concept of \cx is + ASCII-specific. (However, an EBCDIC equivalent has now been added.) */ + + case CHAR_c: + c = *(++ptr); + if (c == CHAR_NULL) + { + *errorcodeptr = ERR2; + break; + } +#ifndef EBCDIC /* ASCII/UTF-8 coding */ + if (c > 127) /* Excludes all non-ASCII in either mode */ + { + *errorcodeptr = ERR68; + break; + } + if (c >= CHAR_a && c <= CHAR_z) c -= 32; + c ^= 0x40; +#else /* EBCDIC coding */ + if (c >= CHAR_a && c <= CHAR_z) c += 64; + if (c == CHAR_QUESTION_MARK) + c = ('\\' == 188 && '`' == 74)? 0x5f : 0xff; + else + { + for (i = 0; i < 32; i++) + { + if (c == ebcdic_escape_c[i]) break; + } + if (i < 32) c = i; else *errorcodeptr = ERR68; + } +#endif + break; + + /* PCRE_EXTRA enables extensions to Perl in the matter of escapes. Any + other alphanumeric following \ is an error if PCRE_EXTRA was set; + otherwise, for Perl compatibility, it is a literal. This code looks a bit + odd, but there used to be some cases other than the default, and there may + be again in future, so I haven't "optimized" it. */ + + default: + if ((options & PCRE_EXTRA) != 0) switch(c) + { + default: + *errorcodeptr = ERR3; + break; + } + break; + } + } + +/* Perl supports \N{name} for character names, as well as plain \N for "not +newline". PCRE does not support \N{name}. However, it does support +quantification such as \N{2,3}. */ + +if (escape == ESC_N && ptr[1] == CHAR_LEFT_CURLY_BRACKET && + !is_counted_repeat(ptr+2)) + *errorcodeptr = ERR37; + +/* If PCRE_UCP is set, we change the values for \d etc. */ + +if ((options & PCRE_UCP) != 0 && escape >= ESC_D && escape <= ESC_w) + escape += (ESC_DU - ESC_D); + +/* Set the pointer to the final character before returning. */ + +*ptrptr = ptr; +*chptr = c; +return escape; +} + + + +#ifdef SUPPORT_UCP +/************************************************* +* Handle \P and \p * +*************************************************/ + +/* This function is called after \P or \p has been encountered, provided that +PCRE is compiled with support for Unicode properties. On entry, ptrptr is +pointing at the P or p. On exit, it is pointing at the final character of the +escape sequence. + +Argument: + ptrptr points to the pattern position pointer + negptr points to a boolean that is set TRUE for negation else FALSE + ptypeptr points to an unsigned int that is set to the type value + pdataptr points to an unsigned int that is set to the detailed property value + errorcodeptr points to the error code variable + +Returns: TRUE if the type value was found, or FALSE for an invalid type +*/ + +static BOOL +get_ucp(const pcre_uchar **ptrptr, BOOL *negptr, unsigned int *ptypeptr, + unsigned int *pdataptr, int *errorcodeptr) +{ +pcre_uchar c; +int i, bot, top; +const pcre_uchar *ptr = *ptrptr; +pcre_uchar name[32]; + +c = *(++ptr); +if (c == CHAR_NULL) goto ERROR_RETURN; + +*negptr = FALSE; + +/* \P or \p can be followed by a name in {}, optionally preceded by ^ for +negation. */ + +if (c == CHAR_LEFT_CURLY_BRACKET) + { + if (ptr[1] == CHAR_CIRCUMFLEX_ACCENT) + { + *negptr = TRUE; + ptr++; + } + for (i = 0; i < (int)(sizeof(name) / sizeof(pcre_uchar)) - 1; i++) + { + c = *(++ptr); + if (c == CHAR_NULL) goto ERROR_RETURN; + if (c == CHAR_RIGHT_CURLY_BRACKET) break; + name[i] = c; + } + if (c != CHAR_RIGHT_CURLY_BRACKET) goto ERROR_RETURN; + name[i] = 0; + } + +/* Otherwise there is just one following character */ + +else + { + name[0] = c; + name[1] = 0; + } + +*ptrptr = ptr; + +/* Search for a recognized property name using binary chop */ + +bot = 0; +top = PRIV(utt_size); + +while (bot < top) + { + int r; + i = (bot + top) >> 1; + r = STRCMP_UC_C8(name, PRIV(utt_names) + PRIV(utt)[i].name_offset); + if (r == 0) + { + *ptypeptr = PRIV(utt)[i].type; + *pdataptr = PRIV(utt)[i].value; + return TRUE; + } + if (r > 0) bot = i + 1; else top = i; + } + +*errorcodeptr = ERR47; +*ptrptr = ptr; +return FALSE; + +ERROR_RETURN: +*errorcodeptr = ERR46; +*ptrptr = ptr; +return FALSE; +} +#endif + + + +/************************************************* +* Read repeat counts * +*************************************************/ + +/* Read an item of the form {n,m} and return the values. This is called only +after is_counted_repeat() has confirmed that a repeat-count quantifier exists, +so the syntax is guaranteed to be correct, but we need to check the values. + +Arguments: + p pointer to first char after '{' + minp pointer to int for min + maxp pointer to int for max + returned as -1 if no max + errorcodeptr points to error code variable + +Returns: pointer to '}' on success; + current ptr on error, with errorcodeptr set non-zero +*/ + +static const pcre_uchar * +read_repeat_counts(const pcre_uchar *p, int *minp, int *maxp, int *errorcodeptr) +{ +int min = 0; +int max = -1; + +while (IS_DIGIT(*p)) + { + min = min * 10 + (int)(*p++ - CHAR_0); + if (min > 65535) + { + *errorcodeptr = ERR5; + return p; + } + } + +if (*p == CHAR_RIGHT_CURLY_BRACKET) max = min; else + { + if (*(++p) != CHAR_RIGHT_CURLY_BRACKET) + { + max = 0; + while(IS_DIGIT(*p)) + { + max = max * 10 + (int)(*p++ - CHAR_0); + if (max > 65535) + { + *errorcodeptr = ERR5; + return p; + } + } + if (max < min) + { + *errorcodeptr = ERR4; + return p; + } + } + } + +*minp = min; +*maxp = max; +return p; +} + + + +/************************************************* +* Find first significant op code * +*************************************************/ + +/* This is called by several functions that scan a compiled expression looking +for a fixed first character, or an anchoring op code etc. It skips over things +that do not influence this. For some calls, it makes sense to skip negative +forward and all backward assertions, and also the \b assertion; for others it +does not. + +Arguments: + code pointer to the start of the group + skipassert TRUE if certain assertions are to be skipped + +Returns: pointer to the first significant opcode +*/ + +static const pcre_uchar* +first_significant_code(const pcre_uchar *code, BOOL skipassert) +{ +for (;;) + { + switch ((int)*code) + { + case OP_ASSERT_NOT: + case OP_ASSERTBACK: + case OP_ASSERTBACK_NOT: + if (!skipassert) return code; + do code += GET(code, 1); while (*code == OP_ALT); + code += PRIV(OP_lengths)[*code]; + break; + + case OP_WORD_BOUNDARY: + case OP_NOT_WORD_BOUNDARY: + if (!skipassert) return code; + /* Fall through */ + + case OP_CALLOUT: + case OP_CREF: + case OP_DNCREF: + case OP_RREF: + case OP_DNRREF: + case OP_DEF: + code += PRIV(OP_lengths)[*code]; + break; + + default: + return code; + } + } +/* Control never reaches here */ +} + + + +/************************************************* +* Find the fixed length of a branch * +*************************************************/ + +/* Scan a branch and compute the fixed length of subject that will match it, +if the length is fixed. This is needed for dealing with backward assertions. +In UTF8 mode, the result is in characters rather than bytes. The branch is +temporarily terminated with OP_END when this function is called. + +This function is called when a backward assertion is encountered, so that if it +fails, the error message can point to the correct place in the pattern. +However, we cannot do this when the assertion contains subroutine calls, +because they can be forward references. We solve this by remembering this case +and doing the check at the end; a flag specifies which mode we are running in. + +Arguments: + code points to the start of the pattern (the bracket) + utf TRUE in UTF-8 / UTF-16 / UTF-32 mode + atend TRUE if called when the pattern is complete + cd the "compile data" structure + recurses chain of recurse_check to catch mutual recursion + +Returns: the fixed length, + or -1 if there is no fixed length, + or -2 if \C was encountered (in UTF-8 mode only) + or -3 if an OP_RECURSE item was encountered and atend is FALSE + or -4 if an unknown opcode was encountered (internal error) +*/ + +static int +find_fixedlength(pcre_uchar *code, BOOL utf, BOOL atend, compile_data *cd, + recurse_check *recurses) +{ +int length = -1; +recurse_check this_recurse; +register int branchlength = 0; +register pcre_uchar *cc = code + 1 + LINK_SIZE; + +/* Scan along the opcodes for this branch. If we get to the end of the +branch, check the length against that of the other branches. */ + +for (;;) + { + int d; + pcre_uchar *ce, *cs; + register pcre_uchar op = *cc; + + switch (op) + { + /* We only need to continue for OP_CBRA (normal capturing bracket) and + OP_BRA (normal non-capturing bracket) because the other variants of these + opcodes are all concerned with unlimited repeated groups, which of course + are not of fixed length. */ + + case OP_CBRA: + case OP_BRA: + case OP_ONCE: + case OP_ONCE_NC: + case OP_COND: + d = find_fixedlength(cc + ((op == OP_CBRA)? IMM2_SIZE : 0), utf, atend, cd, + recurses); + if (d < 0) return d; + branchlength += d; + do cc += GET(cc, 1); while (*cc == OP_ALT); + cc += 1 + LINK_SIZE; + break; + + /* Reached end of a branch; if it's a ket it is the end of a nested call. + If it's ALT it is an alternation in a nested call. An ACCEPT is effectively + an ALT. If it is END it's the end of the outer call. All can be handled by + the same code. Note that we must not include the OP_KETRxxx opcodes here, + because they all imply an unlimited repeat. */ + + case OP_ALT: + case OP_KET: + case OP_END: + case OP_ACCEPT: + case OP_ASSERT_ACCEPT: + if (length < 0) length = branchlength; + else if (length != branchlength) return -1; + if (*cc != OP_ALT) return length; + cc += 1 + LINK_SIZE; + branchlength = 0; + break; + + /* A true recursion implies not fixed length, but a subroutine call may + be OK. If the subroutine is a forward reference, we can't deal with + it until the end of the pattern, so return -3. */ + + case OP_RECURSE: + if (!atend) return -3; + cs = ce = (pcre_uchar *)cd->start_code + GET(cc, 1); /* Start subpattern */ + do ce += GET(ce, 1); while (*ce == OP_ALT); /* End subpattern */ + if (cc > cs && cc < ce) return -1; /* Recursion */ + else /* Check for mutual recursion */ + { + recurse_check *r = recurses; + for (r = recurses; r != NULL; r = r->prev) if (r->group == cs) break; + if (r != NULL) return -1; /* Mutual recursion */ + } + this_recurse.prev = recurses; + this_recurse.group = cs; + d = find_fixedlength(cs + IMM2_SIZE, utf, atend, cd, &this_recurse); + if (d < 0) return d; + branchlength += d; + cc += 1 + LINK_SIZE; + break; + + /* Skip over assertive subpatterns */ + + case OP_ASSERT: + case OP_ASSERT_NOT: + case OP_ASSERTBACK: + case OP_ASSERTBACK_NOT: + do cc += GET(cc, 1); while (*cc == OP_ALT); + cc += 1 + LINK_SIZE; + break; + + /* Skip over things that don't match chars */ + + case OP_MARK: + case OP_PRUNE_ARG: + case OP_SKIP_ARG: + case OP_THEN_ARG: + cc += cc[1] + PRIV(OP_lengths)[*cc]; + break; + + case OP_CALLOUT: + case OP_CIRC: + case OP_CIRCM: + case OP_CLOSE: + case OP_COMMIT: + case OP_CREF: + case OP_DEF: + case OP_DNCREF: + case OP_DNRREF: + case OP_DOLL: + case OP_DOLLM: + case OP_EOD: + case OP_EODN: + case OP_FAIL: + case OP_NOT_WORD_BOUNDARY: + case OP_PRUNE: + case OP_REVERSE: + case OP_RREF: + case OP_SET_SOM: + case OP_SKIP: + case OP_SOD: + case OP_SOM: + case OP_THEN: + case OP_WORD_BOUNDARY: + cc += PRIV(OP_lengths)[*cc]; + break; + + /* Handle literal characters */ + + case OP_CHAR: + case OP_CHARI: + case OP_NOT: + case OP_NOTI: + branchlength++; + cc += 2; +#ifdef SUPPORT_UTF + if (utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]); +#endif + break; + + /* Handle exact repetitions. The count is already in characters, but we + need to skip over a multibyte character in UTF8 mode. */ + + case OP_EXACT: + case OP_EXACTI: + case OP_NOTEXACT: + case OP_NOTEXACTI: + branchlength += (int)GET2(cc,1); + cc += 2 + IMM2_SIZE; +#ifdef SUPPORT_UTF + if (utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]); +#endif + break; + + case OP_TYPEEXACT: + branchlength += GET2(cc,1); + if (cc[1 + IMM2_SIZE] == OP_PROP || cc[1 + IMM2_SIZE] == OP_NOTPROP) + cc += 2; + cc += 1 + IMM2_SIZE + 1; + break; + + /* Handle single-char matchers */ + + case OP_PROP: + case OP_NOTPROP: + cc += 2; + /* Fall through */ + + case OP_HSPACE: + case OP_VSPACE: + case OP_NOT_HSPACE: + case OP_NOT_VSPACE: + case OP_NOT_DIGIT: + case OP_DIGIT: + case OP_NOT_WHITESPACE: + case OP_WHITESPACE: + case OP_NOT_WORDCHAR: + case OP_WORDCHAR: + case OP_ANY: + case OP_ALLANY: + branchlength++; + cc++; + break; + + /* The single-byte matcher isn't allowed. This only happens in UTF-8 mode; + otherwise \C is coded as OP_ALLANY. */ + + case OP_ANYBYTE: + return -2; + + /* Check a class for variable quantification */ + + case OP_CLASS: + case OP_NCLASS: +#if defined SUPPORT_UTF || defined COMPILE_PCRE16 || defined COMPILE_PCRE32 + case OP_XCLASS: + /* The original code caused an unsigned overflow in 64 bit systems, + so now we use a conditional statement. */ + if (op == OP_XCLASS) + cc += GET(cc, 1); + else + cc += PRIV(OP_lengths)[OP_CLASS]; +#else + cc += PRIV(OP_lengths)[OP_CLASS]; +#endif + + switch (*cc) + { + case OP_CRSTAR: + case OP_CRMINSTAR: + case OP_CRPLUS: + case OP_CRMINPLUS: + case OP_CRQUERY: + case OP_CRMINQUERY: + case OP_CRPOSSTAR: + case OP_CRPOSPLUS: + case OP_CRPOSQUERY: + return -1; + + case OP_CRRANGE: + case OP_CRMINRANGE: + case OP_CRPOSRANGE: + if (GET2(cc,1) != GET2(cc,1+IMM2_SIZE)) return -1; + branchlength += (int)GET2(cc,1); + cc += 1 + 2 * IMM2_SIZE; + break; + + default: + branchlength++; + } + break; + + /* Anything else is variable length */ + + case OP_ANYNL: + case OP_BRAMINZERO: + case OP_BRAPOS: + case OP_BRAPOSZERO: + case OP_BRAZERO: + case OP_CBRAPOS: + case OP_EXTUNI: + case OP_KETRMAX: + case OP_KETRMIN: + case OP_KETRPOS: + case OP_MINPLUS: + case OP_MINPLUSI: + case OP_MINQUERY: + case OP_MINQUERYI: + case OP_MINSTAR: + case OP_MINSTARI: + case OP_MINUPTO: + case OP_MINUPTOI: + case OP_NOTMINPLUS: + case OP_NOTMINPLUSI: + case OP_NOTMINQUERY: + case OP_NOTMINQUERYI: + case OP_NOTMINSTAR: + case OP_NOTMINSTARI: + case OP_NOTMINUPTO: + case OP_NOTMINUPTOI: + case OP_NOTPLUS: + case OP_NOTPLUSI: + case OP_NOTPOSPLUS: + case OP_NOTPOSPLUSI: + case OP_NOTPOSQUERY: + case OP_NOTPOSQUERYI: + case OP_NOTPOSSTAR: + case OP_NOTPOSSTARI: + case OP_NOTPOSUPTO: + case OP_NOTPOSUPTOI: + case OP_NOTQUERY: + case OP_NOTQUERYI: + case OP_NOTSTAR: + case OP_NOTSTARI: + case OP_NOTUPTO: + case OP_NOTUPTOI: + case OP_PLUS: + case OP_PLUSI: + case OP_POSPLUS: + case OP_POSPLUSI: + case OP_POSQUERY: + case OP_POSQUERYI: + case OP_POSSTAR: + case OP_POSSTARI: + case OP_POSUPTO: + case OP_POSUPTOI: + case OP_QUERY: + case OP_QUERYI: + case OP_REF: + case OP_REFI: + case OP_DNREF: + case OP_DNREFI: + case OP_SBRA: + case OP_SBRAPOS: + case OP_SCBRA: + case OP_SCBRAPOS: + case OP_SCOND: + case OP_SKIPZERO: + case OP_STAR: + case OP_STARI: + case OP_TYPEMINPLUS: + case OP_TYPEMINQUERY: + case OP_TYPEMINSTAR: + case OP_TYPEMINUPTO: + case OP_TYPEPLUS: + case OP_TYPEPOSPLUS: + case OP_TYPEPOSQUERY: + case OP_TYPEPOSSTAR: + case OP_TYPEPOSUPTO: + case OP_TYPEQUERY: + case OP_TYPESTAR: + case OP_TYPEUPTO: + case OP_UPTO: + case OP_UPTOI: + return -1; + + /* Catch unrecognized opcodes so that when new ones are added they + are not forgotten, as has happened in the past. */ + + default: + return -4; + } + } +/* Control never gets here */ +} + + + +/************************************************* +* Scan compiled regex for specific bracket * +*************************************************/ + +/* This little function scans through a compiled pattern until it finds a +capturing bracket with the given number, or, if the number is negative, an +instance of OP_REVERSE for a lookbehind. The function is global in the C sense +so that it can be called from pcre_study() when finding the minimum matching +length. + +Arguments: + code points to start of expression + utf TRUE in UTF-8 / UTF-16 / UTF-32 mode + number the required bracket number or negative to find a lookbehind + +Returns: pointer to the opcode for the bracket, or NULL if not found +*/ + +const pcre_uchar * +PRIV(find_bracket)(const pcre_uchar *code, BOOL utf, int number) +{ +for (;;) + { + register pcre_uchar c = *code; + + if (c == OP_END) return NULL; + + /* XCLASS is used for classes that cannot be represented just by a bit + map. This includes negated single high-valued characters. The length in + the table is zero; the actual length is stored in the compiled code. */ + + if (c == OP_XCLASS) code += GET(code, 1); + + /* Handle recursion */ + + else if (c == OP_REVERSE) + { + if (number < 0) return (pcre_uchar *)code; + code += PRIV(OP_lengths)[c]; + } + + /* Handle capturing bracket */ + + else if (c == OP_CBRA || c == OP_SCBRA || + c == OP_CBRAPOS || c == OP_SCBRAPOS) + { + int n = (int)GET2(code, 1+LINK_SIZE); + if (n == number) return (pcre_uchar *)code; + code += PRIV(OP_lengths)[c]; + } + + /* Otherwise, we can get the item's length from the table, except that for + repeated character types, we have to test for \p and \P, which have an extra + two bytes of parameters, and for MARK/PRUNE/SKIP/THEN with an argument, we + must add in its length. */ + + else + { + switch(c) + { + case OP_TYPESTAR: + case OP_TYPEMINSTAR: + case OP_TYPEPLUS: + case OP_TYPEMINPLUS: + case OP_TYPEQUERY: + case OP_TYPEMINQUERY: + case OP_TYPEPOSSTAR: + case OP_TYPEPOSPLUS: + case OP_TYPEPOSQUERY: + if (code[1] == OP_PROP || code[1] == OP_NOTPROP) code += 2; + break; + + case OP_TYPEUPTO: + case OP_TYPEMINUPTO: + case OP_TYPEEXACT: + case OP_TYPEPOSUPTO: + if (code[1 + IMM2_SIZE] == OP_PROP || code[1 + IMM2_SIZE] == OP_NOTPROP) + code += 2; + break; + + case OP_MARK: + case OP_PRUNE_ARG: + case OP_SKIP_ARG: + case OP_THEN_ARG: + code += code[1]; + break; + } + + /* Add in the fixed length from the table */ + + code += PRIV(OP_lengths)[c]; + + /* In UTF-8 mode, opcodes that are followed by a character may be followed by + a multi-byte character. The length in the table is a minimum, so we have to + arrange to skip the extra bytes. */ + +#if defined SUPPORT_UTF && !defined COMPILE_PCRE32 + if (utf) switch(c) + { + case OP_CHAR: + case OP_CHARI: + case OP_NOT: + case OP_NOTI: + case OP_EXACT: + case OP_EXACTI: + case OP_NOTEXACT: + case OP_NOTEXACTI: + case OP_UPTO: + case OP_UPTOI: + case OP_NOTUPTO: + case OP_NOTUPTOI: + case OP_MINUPTO: + case OP_MINUPTOI: + case OP_NOTMINUPTO: + case OP_NOTMINUPTOI: + case OP_POSUPTO: + case OP_POSUPTOI: + case OP_NOTPOSUPTO: + case OP_NOTPOSUPTOI: + case OP_STAR: + case OP_STARI: + case OP_NOTSTAR: + case OP_NOTSTARI: + case OP_MINSTAR: + case OP_MINSTARI: + case OP_NOTMINSTAR: + case OP_NOTMINSTARI: + case OP_POSSTAR: + case OP_POSSTARI: + case OP_NOTPOSSTAR: + case OP_NOTPOSSTARI: + case OP_PLUS: + case OP_PLUSI: + case OP_NOTPLUS: + case OP_NOTPLUSI: + case OP_MINPLUS: + case OP_MINPLUSI: + case OP_NOTMINPLUS: + case OP_NOTMINPLUSI: + case OP_POSPLUS: + case OP_POSPLUSI: + case OP_NOTPOSPLUS: + case OP_NOTPOSPLUSI: + case OP_QUERY: + case OP_QUERYI: + case OP_NOTQUERY: + case OP_NOTQUERYI: + case OP_MINQUERY: + case OP_MINQUERYI: + case OP_NOTMINQUERY: + case OP_NOTMINQUERYI: + case OP_POSQUERY: + case OP_POSQUERYI: + case OP_NOTPOSQUERY: + case OP_NOTPOSQUERYI: + if (HAS_EXTRALEN(code[-1])) code += GET_EXTRALEN(code[-1]); + break; + } +#else + (void)(utf); /* Keep compiler happy by referencing function argument */ +#endif + } + } +} + + + +/************************************************* +* Scan compiled regex for recursion reference * +*************************************************/ + +/* This little function scans through a compiled pattern until it finds an +instance of OP_RECURSE. + +Arguments: + code points to start of expression + utf TRUE in UTF-8 / UTF-16 / UTF-32 mode + +Returns: pointer to the opcode for OP_RECURSE, or NULL if not found +*/ + +static const pcre_uchar * +find_recurse(const pcre_uchar *code, BOOL utf) +{ +for (;;) + { + register pcre_uchar c = *code; + if (c == OP_END) return NULL; + if (c == OP_RECURSE) return code; + + /* XCLASS is used for classes that cannot be represented just by a bit + map. This includes negated single high-valued characters. The length in + the table is zero; the actual length is stored in the compiled code. */ + + if (c == OP_XCLASS) code += GET(code, 1); + + /* Otherwise, we can get the item's length from the table, except that for + repeated character types, we have to test for \p and \P, which have an extra + two bytes of parameters, and for MARK/PRUNE/SKIP/THEN with an argument, we + must add in its length. */ + + else + { + switch(c) + { + case OP_TYPESTAR: + case OP_TYPEMINSTAR: + case OP_TYPEPLUS: + case OP_TYPEMINPLUS: + case OP_TYPEQUERY: + case OP_TYPEMINQUERY: + case OP_TYPEPOSSTAR: + case OP_TYPEPOSPLUS: + case OP_TYPEPOSQUERY: + if (code[1] == OP_PROP || code[1] == OP_NOTPROP) code += 2; + break; + + case OP_TYPEPOSUPTO: + case OP_TYPEUPTO: + case OP_TYPEMINUPTO: + case OP_TYPEEXACT: + if (code[1 + IMM2_SIZE] == OP_PROP || code[1 + IMM2_SIZE] == OP_NOTPROP) + code += 2; + break; + + case OP_MARK: + case OP_PRUNE_ARG: + case OP_SKIP_ARG: + case OP_THEN_ARG: + code += code[1]; + break; + } + + /* Add in the fixed length from the table */ + + code += PRIV(OP_lengths)[c]; + + /* In UTF-8 mode, opcodes that are followed by a character may be followed + by a multi-byte character. The length in the table is a minimum, so we have + to arrange to skip the extra bytes. */ + +#if defined SUPPORT_UTF && !defined COMPILE_PCRE32 + if (utf) switch(c) + { + case OP_CHAR: + case OP_CHARI: + case OP_NOT: + case OP_NOTI: + case OP_EXACT: + case OP_EXACTI: + case OP_NOTEXACT: + case OP_NOTEXACTI: + case OP_UPTO: + case OP_UPTOI: + case OP_NOTUPTO: + case OP_NOTUPTOI: + case OP_MINUPTO: + case OP_MINUPTOI: + case OP_NOTMINUPTO: + case OP_NOTMINUPTOI: + case OP_POSUPTO: + case OP_POSUPTOI: + case OP_NOTPOSUPTO: + case OP_NOTPOSUPTOI: + case OP_STAR: + case OP_STARI: + case OP_NOTSTAR: + case OP_NOTSTARI: + case OP_MINSTAR: + case OP_MINSTARI: + case OP_NOTMINSTAR: + case OP_NOTMINSTARI: + case OP_POSSTAR: + case OP_POSSTARI: + case OP_NOTPOSSTAR: + case OP_NOTPOSSTARI: + case OP_PLUS: + case OP_PLUSI: + case OP_NOTPLUS: + case OP_NOTPLUSI: + case OP_MINPLUS: + case OP_MINPLUSI: + case OP_NOTMINPLUS: + case OP_NOTMINPLUSI: + case OP_POSPLUS: + case OP_POSPLUSI: + case OP_NOTPOSPLUS: + case OP_NOTPOSPLUSI: + case OP_QUERY: + case OP_QUERYI: + case OP_NOTQUERY: + case OP_NOTQUERYI: + case OP_MINQUERY: + case OP_MINQUERYI: + case OP_NOTMINQUERY: + case OP_NOTMINQUERYI: + case OP_POSQUERY: + case OP_POSQUERYI: + case OP_NOTPOSQUERY: + case OP_NOTPOSQUERYI: + if (HAS_EXTRALEN(code[-1])) code += GET_EXTRALEN(code[-1]); + break; + } +#else + (void)(utf); /* Keep compiler happy by referencing function argument */ +#endif + } + } +} + + + +/************************************************* +* Scan compiled branch for non-emptiness * +*************************************************/ + +/* This function scans through a branch of a compiled pattern to see whether it +can match the empty string or not. It is called from could_be_empty() +below and from compile_branch() when checking for an unlimited repeat of a +group that can match nothing. Note that first_significant_code() skips over +backward and negative forward assertions when its final argument is TRUE. If we +hit an unclosed bracket, we return "empty" - this means we've struck an inner +bracket whose current branch will already have been scanned. + +Arguments: + code points to start of search + endcode points to where to stop + utf TRUE if in UTF-8 / UTF-16 / UTF-32 mode + cd contains pointers to tables etc. + recurses chain of recurse_check to catch mutual recursion + +Returns: TRUE if what is matched could be empty +*/ + +static BOOL +could_be_empty_branch(const pcre_uchar *code, const pcre_uchar *endcode, + BOOL utf, compile_data *cd, recurse_check *recurses) +{ +register pcre_uchar c; +recurse_check this_recurse; + +for (code = first_significant_code(code + PRIV(OP_lengths)[*code], TRUE); + code < endcode; + code = first_significant_code(code + PRIV(OP_lengths)[c], TRUE)) + { + const pcre_uchar *ccode; + + c = *code; + + /* Skip over forward assertions; the other assertions are skipped by + first_significant_code() with a TRUE final argument. */ + + if (c == OP_ASSERT) + { + do code += GET(code, 1); while (*code == OP_ALT); + c = *code; + continue; + } + + /* For a recursion/subroutine call, if its end has been reached, which + implies a backward reference subroutine call, we can scan it. If it's a + forward reference subroutine call, we can't. To detect forward reference + we have to scan up the list that is kept in the workspace. This function is + called only when doing the real compile, not during the pre-compile that + measures the size of the compiled pattern. */ + + if (c == OP_RECURSE) + { + const pcre_uchar *scode = cd->start_code + GET(code, 1); + const pcre_uchar *endgroup = scode; + BOOL empty_branch; + + /* Test for forward reference or uncompleted reference. This is disabled + when called to scan a completed pattern by setting cd->start_workspace to + NULL. */ + + if (cd->start_workspace != NULL) + { + const pcre_uchar *tcode; + for (tcode = cd->start_workspace; tcode < cd->hwm; tcode += LINK_SIZE) + if ((int)GET(tcode, 0) == (int)(code + 1 - cd->start_code)) return TRUE; + if (GET(scode, 1) == 0) return TRUE; /* Unclosed */ + } + + /* If the reference is to a completed group, we need to detect whether this + is a recursive call, as otherwise there will be an infinite loop. If it is + a recursion, just skip over it. Simple recursions are easily detected. For + mutual recursions we keep a chain on the stack. */ + + do endgroup += GET(endgroup, 1); while (*endgroup == OP_ALT); + if (code >= scode && code <= endgroup) continue; /* Simple recursion */ + else + { + recurse_check *r = recurses; + for (r = recurses; r != NULL; r = r->prev) + if (r->group == scode) break; + if (r != NULL) continue; /* Mutual recursion */ + } + + /* Completed reference; scan the referenced group, remembering it on the + stack chain to detect mutual recursions. */ + + empty_branch = FALSE; + this_recurse.prev = recurses; + this_recurse.group = scode; + + do + { + if (could_be_empty_branch(scode, endcode, utf, cd, &this_recurse)) + { + empty_branch = TRUE; + break; + } + scode += GET(scode, 1); + } + while (*scode == OP_ALT); + + if (!empty_branch) return FALSE; /* All branches are non-empty */ + continue; + } + + /* Groups with zero repeats can of course be empty; skip them. */ + + if (c == OP_BRAZERO || c == OP_BRAMINZERO || c == OP_SKIPZERO || + c == OP_BRAPOSZERO) + { + code += PRIV(OP_lengths)[c]; + do code += GET(code, 1); while (*code == OP_ALT); + c = *code; + continue; + } + + /* A nested group that is already marked as "could be empty" can just be + skipped. */ + + if (c == OP_SBRA || c == OP_SBRAPOS || + c == OP_SCBRA || c == OP_SCBRAPOS) + { + do code += GET(code, 1); while (*code == OP_ALT); + c = *code; + continue; + } + + /* For other groups, scan the branches. */ + + if (c == OP_BRA || c == OP_BRAPOS || + c == OP_CBRA || c == OP_CBRAPOS || + c == OP_ONCE || c == OP_ONCE_NC || + c == OP_COND || c == OP_SCOND) + { + BOOL empty_branch; + if (GET(code, 1) == 0) return TRUE; /* Hit unclosed bracket */ + + /* If a conditional group has only one branch, there is a second, implied, + empty branch, so just skip over the conditional, because it could be empty. + Otherwise, scan the individual branches of the group. */ + + if (c == OP_COND && code[GET(code, 1)] != OP_ALT) + code += GET(code, 1); + else + { + empty_branch = FALSE; + do + { + if (!empty_branch && could_be_empty_branch(code, endcode, utf, cd, + recurses)) empty_branch = TRUE; + code += GET(code, 1); + } + while (*code == OP_ALT); + if (!empty_branch) return FALSE; /* All branches are non-empty */ + } + + c = *code; + continue; + } + + /* Handle the other opcodes */ + + switch (c) + { + /* Check for quantifiers after a class. XCLASS is used for classes that + cannot be represented just by a bit map. This includes negated single + high-valued characters. The length in PRIV(OP_lengths)[] is zero; the + actual length is stored in the compiled code, so we must update "code" + here. */ + +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 + case OP_XCLASS: + ccode = code += GET(code, 1); + goto CHECK_CLASS_REPEAT; +#endif + + case OP_CLASS: + case OP_NCLASS: + ccode = code + PRIV(OP_lengths)[OP_CLASS]; + +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 + CHECK_CLASS_REPEAT: +#endif + + switch (*ccode) + { + case OP_CRSTAR: /* These could be empty; continue */ + case OP_CRMINSTAR: + case OP_CRQUERY: + case OP_CRMINQUERY: + case OP_CRPOSSTAR: + case OP_CRPOSQUERY: + break; + + default: /* Non-repeat => class must match */ + case OP_CRPLUS: /* These repeats aren't empty */ + case OP_CRMINPLUS: + case OP_CRPOSPLUS: + return FALSE; + + case OP_CRRANGE: + case OP_CRMINRANGE: + case OP_CRPOSRANGE: + if (GET2(ccode, 1) > 0) return FALSE; /* Minimum > 0 */ + break; + } + break; + + /* Opcodes that must match a character */ + + case OP_ANY: + case OP_ALLANY: + case OP_ANYBYTE: + + case OP_PROP: + case OP_NOTPROP: + case OP_ANYNL: + + case OP_NOT_HSPACE: + case OP_HSPACE: + case OP_NOT_VSPACE: + case OP_VSPACE: + case OP_EXTUNI: + + case OP_NOT_DIGIT: + case OP_DIGIT: + case OP_NOT_WHITESPACE: + case OP_WHITESPACE: + case OP_NOT_WORDCHAR: + case OP_WORDCHAR: + + case OP_CHAR: + case OP_CHARI: + case OP_NOT: + case OP_NOTI: + + case OP_PLUS: + case OP_PLUSI: + case OP_MINPLUS: + case OP_MINPLUSI: + + case OP_NOTPLUS: + case OP_NOTPLUSI: + case OP_NOTMINPLUS: + case OP_NOTMINPLUSI: + + case OP_POSPLUS: + case OP_POSPLUSI: + case OP_NOTPOSPLUS: + case OP_NOTPOSPLUSI: + + case OP_EXACT: + case OP_EXACTI: + case OP_NOTEXACT: + case OP_NOTEXACTI: + + case OP_TYPEPLUS: + case OP_TYPEMINPLUS: + case OP_TYPEPOSPLUS: + case OP_TYPEEXACT: + + return FALSE; + + /* These are going to continue, as they may be empty, but we have to + fudge the length for the \p and \P cases. */ + + case OP_TYPESTAR: + case OP_TYPEMINSTAR: + case OP_TYPEPOSSTAR: + case OP_TYPEQUERY: + case OP_TYPEMINQUERY: + case OP_TYPEPOSQUERY: + if (code[1] == OP_PROP || code[1] == OP_NOTPROP) code += 2; + break; + + /* Same for these */ + + case OP_TYPEUPTO: + case OP_TYPEMINUPTO: + case OP_TYPEPOSUPTO: + if (code[1 + IMM2_SIZE] == OP_PROP || code[1 + IMM2_SIZE] == OP_NOTPROP) + code += 2; + break; + + /* End of branch */ + + case OP_KET: + case OP_KETRMAX: + case OP_KETRMIN: + case OP_KETRPOS: + case OP_ALT: + return TRUE; + + /* In UTF-8 mode, STAR, MINSTAR, POSSTAR, QUERY, MINQUERY, POSQUERY, UPTO, + MINUPTO, and POSUPTO and their caseless and negative versions may be + followed by a multibyte character. */ + +#if defined SUPPORT_UTF && !defined COMPILE_PCRE32 + case OP_STAR: + case OP_STARI: + case OP_NOTSTAR: + case OP_NOTSTARI: + + case OP_MINSTAR: + case OP_MINSTARI: + case OP_NOTMINSTAR: + case OP_NOTMINSTARI: + + case OP_POSSTAR: + case OP_POSSTARI: + case OP_NOTPOSSTAR: + case OP_NOTPOSSTARI: + + case OP_QUERY: + case OP_QUERYI: + case OP_NOTQUERY: + case OP_NOTQUERYI: + + case OP_MINQUERY: + case OP_MINQUERYI: + case OP_NOTMINQUERY: + case OP_NOTMINQUERYI: + + case OP_POSQUERY: + case OP_POSQUERYI: + case OP_NOTPOSQUERY: + case OP_NOTPOSQUERYI: + + if (utf && HAS_EXTRALEN(code[1])) code += GET_EXTRALEN(code[1]); + break; + + case OP_UPTO: + case OP_UPTOI: + case OP_NOTUPTO: + case OP_NOTUPTOI: + + case OP_MINUPTO: + case OP_MINUPTOI: + case OP_NOTMINUPTO: + case OP_NOTMINUPTOI: + + case OP_POSUPTO: + case OP_POSUPTOI: + case OP_NOTPOSUPTO: + case OP_NOTPOSUPTOI: + + if (utf && HAS_EXTRALEN(code[1 + IMM2_SIZE])) code += GET_EXTRALEN(code[1 + IMM2_SIZE]); + break; +#endif + + /* MARK, and PRUNE/SKIP/THEN with an argument must skip over the argument + string. */ + + case OP_MARK: + case OP_PRUNE_ARG: + case OP_SKIP_ARG: + case OP_THEN_ARG: + code += code[1]; + break; + + /* None of the remaining opcodes are required to match a character. */ + + default: + break; + } + } + +return TRUE; +} + + + +/************************************************* +* Scan compiled regex for non-emptiness * +*************************************************/ + +/* This function is called to check for left recursive calls. We want to check +the current branch of the current pattern to see if it could match the empty +string. If it could, we must look outwards for branches at other levels, +stopping when we pass beyond the bracket which is the subject of the recursion. +This function is called only during the real compile, not during the +pre-compile. + +Arguments: + code points to start of the recursion + endcode points to where to stop (current RECURSE item) + bcptr points to the chain of current (unclosed) branch starts + utf TRUE if in UTF-8 / UTF-16 / UTF-32 mode + cd pointers to tables etc + +Returns: TRUE if what is matched could be empty +*/ + +static BOOL +could_be_empty(const pcre_uchar *code, const pcre_uchar *endcode, + branch_chain *bcptr, BOOL utf, compile_data *cd) +{ +while (bcptr != NULL && bcptr->current_branch >= code) + { + if (!could_be_empty_branch(bcptr->current_branch, endcode, utf, cd, NULL)) + return FALSE; + bcptr = bcptr->outer; + } +return TRUE; +} + + + +/************************************************* +* Base opcode of repeated opcodes * +*************************************************/ + +/* Returns the base opcode for repeated single character type opcodes. If the +opcode is not a repeated character type, it returns with the original value. + +Arguments: c opcode +Returns: base opcode for the type +*/ + +static pcre_uchar +get_repeat_base(pcre_uchar c) +{ +return (c > OP_TYPEPOSUPTO)? c : + (c >= OP_TYPESTAR)? OP_TYPESTAR : + (c >= OP_NOTSTARI)? OP_NOTSTARI : + (c >= OP_NOTSTAR)? OP_NOTSTAR : + (c >= OP_STARI)? OP_STARI : + OP_STAR; +} + + + +#ifdef SUPPORT_UCP +/************************************************* +* Check a character and a property * +*************************************************/ + +/* This function is called by check_auto_possessive() when a property item +is adjacent to a fixed character. + +Arguments: + c the character + ptype the property type + pdata the data for the type + negated TRUE if it's a negated property (\P or \p{^) + +Returns: TRUE if auto-possessifying is OK +*/ + +static BOOL +check_char_prop(pcre_uint32 c, unsigned int ptype, unsigned int pdata, + BOOL negated) +{ +const pcre_uint32 *p; +const ucd_record *prop = GET_UCD(c); + +switch(ptype) + { + case PT_LAMP: + return (prop->chartype == ucp_Lu || + prop->chartype == ucp_Ll || + prop->chartype == ucp_Lt) == negated; + + case PT_GC: + return (pdata == PRIV(ucp_gentype)[prop->chartype]) == negated; + + case PT_PC: + return (pdata == prop->chartype) == negated; + + case PT_SC: + return (pdata == prop->script) == negated; + + /* These are specials */ + + case PT_ALNUM: + return (PRIV(ucp_gentype)[prop->chartype] == ucp_L || + PRIV(ucp_gentype)[prop->chartype] == ucp_N) == negated; + + /* Perl space used to exclude VT, but from Perl 5.18 it is included, which + means that Perl space and POSIX space are now identical. PCRE was changed + at release 8.34. */ + + case PT_SPACE: /* Perl space */ + case PT_PXSPACE: /* POSIX space */ + switch(c) + { + HSPACE_CASES: + VSPACE_CASES: + return negated; + + default: + return (PRIV(ucp_gentype)[prop->chartype] == ucp_Z) == negated; + } + break; /* Control never reaches here */ + + case PT_WORD: + return (PRIV(ucp_gentype)[prop->chartype] == ucp_L || + PRIV(ucp_gentype)[prop->chartype] == ucp_N || + c == CHAR_UNDERSCORE) == negated; + + case PT_CLIST: + p = PRIV(ucd_caseless_sets) + prop->caseset; + for (;;) + { + if (c < *p) return !negated; + if (c == *p++) return negated; + } + break; /* Control never reaches here */ + } + +return FALSE; +} +#endif /* SUPPORT_UCP */ + + + +/************************************************* +* Fill the character property list * +*************************************************/ + +/* Checks whether the code points to an opcode that can take part in auto- +possessification, and if so, fills a list with its properties. + +Arguments: + code points to start of expression + utf TRUE if in UTF-8 / UTF-16 / UTF-32 mode + fcc points to case-flipping table + list points to output list + list[0] will be filled with the opcode + list[1] will be non-zero if this opcode + can match an empty character string + list[2..7] depends on the opcode + +Returns: points to the start of the next opcode if *code is accepted + NULL if *code is not accepted +*/ + +static const pcre_uchar * +get_chr_property_list(const pcre_uchar *code, BOOL utf, + const pcre_uint8 *fcc, pcre_uint32 *list) +{ +pcre_uchar c = *code; +pcre_uchar base; +const pcre_uchar *end; +pcre_uint32 chr; + +#ifdef SUPPORT_UCP +pcre_uint32 *clist_dest; +const pcre_uint32 *clist_src; +#else +utf = utf; /* Suppress "unused parameter" compiler warning */ +#endif + +list[0] = c; +list[1] = FALSE; +code++; + +if (c >= OP_STAR && c <= OP_TYPEPOSUPTO) + { + base = get_repeat_base(c); + c -= (base - OP_STAR); + + if (c == OP_UPTO || c == OP_MINUPTO || c == OP_EXACT || c == OP_POSUPTO) + code += IMM2_SIZE; + + list[1] = (c != OP_PLUS && c != OP_MINPLUS && c != OP_EXACT && c != OP_POSPLUS); + + switch(base) + { + case OP_STAR: + list[0] = OP_CHAR; + break; + + case OP_STARI: + list[0] = OP_CHARI; + break; + + case OP_NOTSTAR: + list[0] = OP_NOT; + break; + + case OP_NOTSTARI: + list[0] = OP_NOTI; + break; + + case OP_TYPESTAR: + list[0] = *code; + code++; + break; + } + c = list[0]; + } + +switch(c) + { + case OP_NOT_DIGIT: + case OP_DIGIT: + case OP_NOT_WHITESPACE: + case OP_WHITESPACE: + case OP_NOT_WORDCHAR: + case OP_WORDCHAR: + case OP_ANY: + case OP_ALLANY: + case OP_ANYNL: + case OP_NOT_HSPACE: + case OP_HSPACE: + case OP_NOT_VSPACE: + case OP_VSPACE: + case OP_EXTUNI: + case OP_EODN: + case OP_EOD: + case OP_DOLL: + case OP_DOLLM: + return code; + + case OP_CHAR: + case OP_NOT: + GETCHARINCTEST(chr, code); + list[2] = chr; + list[3] = NOTACHAR; + return code; + + case OP_CHARI: + case OP_NOTI: + list[0] = (c == OP_CHARI) ? OP_CHAR : OP_NOT; + GETCHARINCTEST(chr, code); + list[2] = chr; + +#ifdef SUPPORT_UCP + if (chr < 128 || (chr < 256 && !utf)) + list[3] = fcc[chr]; + else + list[3] = UCD_OTHERCASE(chr); +#elif defined SUPPORT_UTF || !defined COMPILE_PCRE8 + list[3] = (chr < 256) ? fcc[chr] : chr; +#else + list[3] = fcc[chr]; +#endif + + /* The othercase might be the same value. */ + + if (chr == list[3]) + list[3] = NOTACHAR; + else + list[4] = NOTACHAR; + return code; + +#ifdef SUPPORT_UCP + case OP_PROP: + case OP_NOTPROP: + if (code[0] != PT_CLIST) + { + list[2] = code[0]; + list[3] = code[1]; + return code + 2; + } + + /* Convert only if we have enough space. */ + + clist_src = PRIV(ucd_caseless_sets) + code[1]; + clist_dest = list + 2; + code += 2; + + do { + if (clist_dest >= list + 8) + { + /* Early return if there is not enough space. This should never + happen, since all clists are shorter than 5 character now. */ + list[2] = code[0]; + list[3] = code[1]; + return code; + } + *clist_dest++ = *clist_src; + } + while(*clist_src++ != NOTACHAR); + + /* All characters are stored. The terminating NOTACHAR + is copied form the clist itself. */ + + list[0] = (c == OP_PROP) ? OP_CHAR : OP_NOT; + return code; +#endif + + case OP_NCLASS: + case OP_CLASS: +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 + case OP_XCLASS: + if (c == OP_XCLASS) + end = code + GET(code, 0) - 1; + else +#endif + end = code + 32 / sizeof(pcre_uchar); + + switch(*end) + { + case OP_CRSTAR: + case OP_CRMINSTAR: + case OP_CRQUERY: + case OP_CRMINQUERY: + case OP_CRPOSSTAR: + case OP_CRPOSQUERY: + list[1] = TRUE; + end++; + break; + + case OP_CRPLUS: + case OP_CRMINPLUS: + case OP_CRPOSPLUS: + end++; + break; + + case OP_CRRANGE: + case OP_CRMINRANGE: + case OP_CRPOSRANGE: + list[1] = (GET2(end, 1) == 0); + end += 1 + 2 * IMM2_SIZE; + break; + } + list[2] = (pcre_uint32)(end - code); + return end; + } +return NULL; /* Opcode not accepted */ +} + + + +/************************************************* +* Scan further character sets for match * +*************************************************/ + +/* Checks whether the base and the current opcode have a common character, in +which case the base cannot be possessified. + +Arguments: + code points to the byte code + utf TRUE in UTF-8 / UTF-16 / UTF-32 mode + cd static compile data + base_list the data list of the base opcode + +Returns: TRUE if the auto-possessification is possible +*/ + +static BOOL +compare_opcodes(const pcre_uchar *code, BOOL utf, const compile_data *cd, + const pcre_uint32 *base_list, const pcre_uchar *base_end, int *rec_limit) +{ +pcre_uchar c; +pcre_uint32 list[8]; +const pcre_uint32 *chr_ptr; +const pcre_uint32 *ochr_ptr; +const pcre_uint32 *list_ptr; +const pcre_uchar *next_code; +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 +const pcre_uchar *xclass_flags; +#endif +const pcre_uint8 *class_bitset; +const pcre_uint8 *set1, *set2, *set_end; +pcre_uint32 chr; +BOOL accepted, invert_bits; +BOOL entered_a_group = FALSE; + +if (*rec_limit == 0) return FALSE; +--(*rec_limit); + +/* Note: the base_list[1] contains whether the current opcode has greedy +(represented by a non-zero value) quantifier. This is a different from +other character type lists, which stores here that the character iterator +matches to an empty string (also represented by a non-zero value). */ + +for(;;) + { + /* All operations move the code pointer forward. + Therefore infinite recursions are not possible. */ + + c = *code; + + /* Skip over callouts */ + + if (c == OP_CALLOUT) + { + code += PRIV(OP_lengths)[c]; + continue; + } + + if (c == OP_ALT) + { + do code += GET(code, 1); while (*code == OP_ALT); + c = *code; + } + + switch(c) + { + case OP_END: + case OP_KETRPOS: + /* TRUE only in greedy case. The non-greedy case could be replaced by + an OP_EXACT, but it is probably not worth it. (And note that OP_EXACT + uses more memory, which we cannot get at this stage.) */ + + return base_list[1] != 0; + + case OP_KET: + /* If the bracket is capturing, and referenced by an OP_RECURSE, or + it is an atomic sub-pattern (assert, once, etc.) the non-greedy case + cannot be converted to a possessive form. */ + + if (base_list[1] == 0) return FALSE; + + switch(*(code - GET(code, 1))) + { + case OP_ASSERT: + case OP_ASSERT_NOT: + case OP_ASSERTBACK: + case OP_ASSERTBACK_NOT: + case OP_ONCE: + case OP_ONCE_NC: + /* Atomic sub-patterns and assertions can always auto-possessify their + last iterator. However, if the group was entered as a result of checking + a previous iterator, this is not possible. */ + + return !entered_a_group; + } + + code += PRIV(OP_lengths)[c]; + continue; + + case OP_ONCE: + case OP_ONCE_NC: + case OP_BRA: + case OP_CBRA: + next_code = code + GET(code, 1); + code += PRIV(OP_lengths)[c]; + + while (*next_code == OP_ALT) + { + if (!compare_opcodes(code, utf, cd, base_list, base_end, rec_limit)) + return FALSE; + code = next_code + 1 + LINK_SIZE; + next_code += GET(next_code, 1); + } + + entered_a_group = TRUE; + continue; + + case OP_BRAZERO: + case OP_BRAMINZERO: + + next_code = code + 1; + if (*next_code != OP_BRA && *next_code != OP_CBRA + && *next_code != OP_ONCE && *next_code != OP_ONCE_NC) return FALSE; + + do next_code += GET(next_code, 1); while (*next_code == OP_ALT); + + /* The bracket content will be checked by the + OP_BRA/OP_CBRA case above. */ + next_code += 1 + LINK_SIZE; + if (!compare_opcodes(next_code, utf, cd, base_list, base_end, rec_limit)) + return FALSE; + + code += PRIV(OP_lengths)[c]; + continue; + + default: + break; + } + + /* Check for a supported opcode, and load its properties. */ + + code = get_chr_property_list(code, utf, cd->fcc, list); + if (code == NULL) return FALSE; /* Unsupported */ + + /* If either opcode is a small character list, set pointers for comparing + characters from that list with another list, or with a property. */ + + if (base_list[0] == OP_CHAR) + { + chr_ptr = base_list + 2; + list_ptr = list; + } + else if (list[0] == OP_CHAR) + { + chr_ptr = list + 2; + list_ptr = base_list; + } + + /* Character bitsets can also be compared to certain opcodes. */ + + else if (base_list[0] == OP_CLASS || list[0] == OP_CLASS +#ifdef COMPILE_PCRE8 + /* In 8 bit, non-UTF mode, OP_CLASS and OP_NCLASS are the same. */ + || (!utf && (base_list[0] == OP_NCLASS || list[0] == OP_NCLASS)) +#endif + ) + { +#ifdef COMPILE_PCRE8 + if (base_list[0] == OP_CLASS || (!utf && base_list[0] == OP_NCLASS)) +#else + if (base_list[0] == OP_CLASS) +#endif + { + set1 = (pcre_uint8 *)(base_end - base_list[2]); + list_ptr = list; + } + else + { + set1 = (pcre_uint8 *)(code - list[2]); + list_ptr = base_list; + } + + invert_bits = FALSE; + switch(list_ptr[0]) + { + case OP_CLASS: + case OP_NCLASS: + set2 = (pcre_uint8 *) + ((list_ptr == list ? code : base_end) - list_ptr[2]); + break; + +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 + case OP_XCLASS: + xclass_flags = (list_ptr == list ? code : base_end) - list_ptr[2] + LINK_SIZE; + if ((*xclass_flags & XCL_HASPROP) != 0) return FALSE; + if ((*xclass_flags & XCL_MAP) == 0) + { + /* No bits are set for characters < 256. */ + if (list[1] == 0) return (*xclass_flags & XCL_NOT) == 0; + /* Might be an empty repeat. */ + continue; + } + set2 = (pcre_uint8 *)(xclass_flags + 1); + break; +#endif + + case OP_NOT_DIGIT: + invert_bits = TRUE; + /* Fall through */ + case OP_DIGIT: + set2 = (pcre_uint8 *)(cd->cbits + cbit_digit); + break; + + case OP_NOT_WHITESPACE: + invert_bits = TRUE; + /* Fall through */ + case OP_WHITESPACE: + set2 = (pcre_uint8 *)(cd->cbits + cbit_space); + break; + + case OP_NOT_WORDCHAR: + invert_bits = TRUE; + /* Fall through */ + case OP_WORDCHAR: + set2 = (pcre_uint8 *)(cd->cbits + cbit_word); + break; + + default: + return FALSE; + } + + /* Because the sets are unaligned, we need + to perform byte comparison here. */ + set_end = set1 + 32; + if (invert_bits) + { + do + { + if ((*set1++ & ~(*set2++)) != 0) return FALSE; + } + while (set1 < set_end); + } + else + { + do + { + if ((*set1++ & *set2++) != 0) return FALSE; + } + while (set1 < set_end); + } + + if (list[1] == 0) return TRUE; + /* Might be an empty repeat. */ + continue; + } + + /* Some property combinations also acceptable. Unicode property opcodes are + processed specially; the rest can be handled with a lookup table. */ + + else + { + pcre_uint32 leftop, rightop; + + leftop = base_list[0]; + rightop = list[0]; + +#ifdef SUPPORT_UCP + accepted = FALSE; /* Always set in non-unicode case. */ + if (leftop == OP_PROP || leftop == OP_NOTPROP) + { + if (rightop == OP_EOD) + accepted = TRUE; + else if (rightop == OP_PROP || rightop == OP_NOTPROP) + { + int n; + const pcre_uint8 *p; + BOOL same = leftop == rightop; + BOOL lisprop = leftop == OP_PROP; + BOOL risprop = rightop == OP_PROP; + BOOL bothprop = lisprop && risprop; + + /* There's a table that specifies how each combination is to be + processed: + 0 Always return FALSE (never auto-possessify) + 1 Character groups are distinct (possessify if both are OP_PROP) + 2 Check character categories in the same group (general or particular) + 3 Return TRUE if the two opcodes are not the same + ... see comments below + */ + + n = propposstab[base_list[2]][list[2]]; + switch(n) + { + case 0: break; + case 1: accepted = bothprop; break; + case 2: accepted = (base_list[3] == list[3]) != same; break; + case 3: accepted = !same; break; + + case 4: /* Left general category, right particular category */ + accepted = risprop && catposstab[base_list[3]][list[3]] == same; + break; + + case 5: /* Right general category, left particular category */ + accepted = lisprop && catposstab[list[3]][base_list[3]] == same; + break; + + /* This code is logically tricky. Think hard before fiddling with it. + The posspropstab table has four entries per row. Each row relates to + one of PCRE's special properties such as ALNUM or SPACE or WORD. + Only WORD actually needs all four entries, but using repeats for the + others means they can all use the same code below. + + The first two entries in each row are Unicode general categories, and + apply always, because all the characters they include are part of the + PCRE character set. The third and fourth entries are a general and a + particular category, respectively, that include one or more relevant + characters. One or the other is used, depending on whether the check + is for a general or a particular category. However, in both cases the + category contains more characters than the specials that are defined + for the property being tested against. Therefore, it cannot be used + in a NOTPROP case. + + Example: the row for WORD contains ucp_L, ucp_N, ucp_P, ucp_Po. + Underscore is covered by ucp_P or ucp_Po. */ + + case 6: /* Left alphanum vs right general category */ + case 7: /* Left space vs right general category */ + case 8: /* Left word vs right general category */ + p = posspropstab[n-6]; + accepted = risprop && lisprop == + (list[3] != p[0] && + list[3] != p[1] && + (list[3] != p[2] || !lisprop)); + break; + + case 9: /* Right alphanum vs left general category */ + case 10: /* Right space vs left general category */ + case 11: /* Right word vs left general category */ + p = posspropstab[n-9]; + accepted = lisprop && risprop == + (base_list[3] != p[0] && + base_list[3] != p[1] && + (base_list[3] != p[2] || !risprop)); + break; + + case 12: /* Left alphanum vs right particular category */ + case 13: /* Left space vs right particular category */ + case 14: /* Left word vs right particular category */ + p = posspropstab[n-12]; + accepted = risprop && lisprop == + (catposstab[p[0]][list[3]] && + catposstab[p[1]][list[3]] && + (list[3] != p[3] || !lisprop)); + break; + + case 15: /* Right alphanum vs left particular category */ + case 16: /* Right space vs left particular category */ + case 17: /* Right word vs left particular category */ + p = posspropstab[n-15]; + accepted = lisprop && risprop == + (catposstab[p[0]][base_list[3]] && + catposstab[p[1]][base_list[3]] && + (base_list[3] != p[3] || !risprop)); + break; + } + } + } + + else +#endif /* SUPPORT_UCP */ + + accepted = leftop >= FIRST_AUTOTAB_OP && leftop <= LAST_AUTOTAB_LEFT_OP && + rightop >= FIRST_AUTOTAB_OP && rightop <= LAST_AUTOTAB_RIGHT_OP && + autoposstab[leftop - FIRST_AUTOTAB_OP][rightop - FIRST_AUTOTAB_OP]; + + if (!accepted) return FALSE; + + if (list[1] == 0) return TRUE; + /* Might be an empty repeat. */ + continue; + } + + /* Control reaches here only if one of the items is a small character list. + All characters are checked against the other side. */ + + do + { + chr = *chr_ptr; + + switch(list_ptr[0]) + { + case OP_CHAR: + ochr_ptr = list_ptr + 2; + do + { + if (chr == *ochr_ptr) return FALSE; + ochr_ptr++; + } + while(*ochr_ptr != NOTACHAR); + break; + + case OP_NOT: + ochr_ptr = list_ptr + 2; + do + { + if (chr == *ochr_ptr) + break; + ochr_ptr++; + } + while(*ochr_ptr != NOTACHAR); + if (*ochr_ptr == NOTACHAR) return FALSE; /* Not found */ + break; + + /* Note that OP_DIGIT etc. are generated only when PCRE_UCP is *not* + set. When it is set, \d etc. are converted into OP_(NOT_)PROP codes. */ + + case OP_DIGIT: + if (chr < 256 && (cd->ctypes[chr] & ctype_digit) != 0) return FALSE; + break; + + case OP_NOT_DIGIT: + if (chr > 255 || (cd->ctypes[chr] & ctype_digit) == 0) return FALSE; + break; + + case OP_WHITESPACE: + if (chr < 256 && (cd->ctypes[chr] & ctype_space) != 0) return FALSE; + break; + + case OP_NOT_WHITESPACE: + if (chr > 255 || (cd->ctypes[chr] & ctype_space) == 0) return FALSE; + break; + + case OP_WORDCHAR: + if (chr < 255 && (cd->ctypes[chr] & ctype_word) != 0) return FALSE; + break; + + case OP_NOT_WORDCHAR: + if (chr > 255 || (cd->ctypes[chr] & ctype_word) == 0) return FALSE; + break; + + case OP_HSPACE: + switch(chr) + { + HSPACE_CASES: return FALSE; + default: break; + } + break; + + case OP_NOT_HSPACE: + switch(chr) + { + HSPACE_CASES: break; + default: return FALSE; + } + break; + + case OP_ANYNL: + case OP_VSPACE: + switch(chr) + { + VSPACE_CASES: return FALSE; + default: break; + } + break; + + case OP_NOT_VSPACE: + switch(chr) + { + VSPACE_CASES: break; + default: return FALSE; + } + break; + + case OP_DOLL: + case OP_EODN: + switch (chr) + { + case CHAR_CR: + case CHAR_LF: + case CHAR_VT: + case CHAR_FF: + case CHAR_NEL: +#ifndef EBCDIC + case 0x2028: + case 0x2029: +#endif /* Not EBCDIC */ + return FALSE; + } + break; + + case OP_EOD: /* Can always possessify before \z */ + break; + +#ifdef SUPPORT_UCP + case OP_PROP: + case OP_NOTPROP: + if (!check_char_prop(chr, list_ptr[2], list_ptr[3], + list_ptr[0] == OP_NOTPROP)) + return FALSE; + break; +#endif + + case OP_NCLASS: + if (chr > 255) return FALSE; + /* Fall through */ + + case OP_CLASS: + if (chr > 255) break; + class_bitset = (pcre_uint8 *) + ((list_ptr == list ? code : base_end) - list_ptr[2]); + if ((class_bitset[chr >> 3] & (1U << (chr & 7))) != 0) return FALSE; + break; + +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 + case OP_XCLASS: + if (PRIV(xclass)(chr, (list_ptr == list ? code : base_end) - + list_ptr[2] + LINK_SIZE, utf)) return FALSE; + break; +#endif + + default: + return FALSE; + } + + chr_ptr++; + } + while(*chr_ptr != NOTACHAR); + + /* At least one character must be matched from this opcode. */ + + if (list[1] == 0) return TRUE; + } + +/* Control never reaches here. There used to be a fail-save return FALSE; here, +but some compilers complain about an unreachable statement. */ + +} + + + +/************************************************* +* Scan compiled regex for auto-possession * +*************************************************/ + +/* Replaces single character iterations with their possessive alternatives +if appropriate. This function modifies the compiled opcode! + +Arguments: + code points to start of the byte code + utf TRUE in UTF-8 / UTF-16 / UTF-32 mode + cd static compile data + +Returns: nothing +*/ + +static void +auto_possessify(pcre_uchar *code, BOOL utf, const compile_data *cd) +{ +register pcre_uchar c; +const pcre_uchar *end; +pcre_uchar *repeat_opcode; +pcre_uint32 list[8]; +int rec_limit; + +for (;;) + { + c = *code; + + /* When a pattern with bad UTF-8 encoding is compiled with NO_UTF_CHECK, + it may compile without complaining, but may get into a loop here if the code + pointer points to a bad value. This is, of course a documentated possibility, + when NO_UTF_CHECK is set, so it isn't a bug, but we can detect this case and + just give up on this optimization. */ + + if (c >= OP_TABLE_LENGTH) return; + + if (c >= OP_STAR && c <= OP_TYPEPOSUPTO) + { + c -= get_repeat_base(c) - OP_STAR; + end = (c <= OP_MINUPTO) ? + get_chr_property_list(code, utf, cd->fcc, list) : NULL; + list[1] = c == OP_STAR || c == OP_PLUS || c == OP_QUERY || c == OP_UPTO; + + rec_limit = 1000; + if (end != NULL && compare_opcodes(end, utf, cd, list, end, &rec_limit)) + { + switch(c) + { + case OP_STAR: + *code += OP_POSSTAR - OP_STAR; + break; + + case OP_MINSTAR: + *code += OP_POSSTAR - OP_MINSTAR; + break; + + case OP_PLUS: + *code += OP_POSPLUS - OP_PLUS; + break; + + case OP_MINPLUS: + *code += OP_POSPLUS - OP_MINPLUS; + break; + + case OP_QUERY: + *code += OP_POSQUERY - OP_QUERY; + break; + + case OP_MINQUERY: + *code += OP_POSQUERY - OP_MINQUERY; + break; + + case OP_UPTO: + *code += OP_POSUPTO - OP_UPTO; + break; + + case OP_MINUPTO: + *code += OP_POSUPTO - OP_MINUPTO; + break; + } + } + c = *code; + } + else if (c == OP_CLASS || c == OP_NCLASS || c == OP_XCLASS) + { +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 + if (c == OP_XCLASS) + repeat_opcode = code + GET(code, 1); + else +#endif + repeat_opcode = code + 1 + (32 / sizeof(pcre_uchar)); + + c = *repeat_opcode; + if (c >= OP_CRSTAR && c <= OP_CRMINRANGE) + { + /* end must not be NULL. */ + end = get_chr_property_list(code, utf, cd->fcc, list); + + list[1] = (c & 1) == 0; + + rec_limit = 1000; + if (compare_opcodes(end, utf, cd, list, end, &rec_limit)) + { + switch (c) + { + case OP_CRSTAR: + case OP_CRMINSTAR: + *repeat_opcode = OP_CRPOSSTAR; + break; + + case OP_CRPLUS: + case OP_CRMINPLUS: + *repeat_opcode = OP_CRPOSPLUS; + break; + + case OP_CRQUERY: + case OP_CRMINQUERY: + *repeat_opcode = OP_CRPOSQUERY; + break; + + case OP_CRRANGE: + case OP_CRMINRANGE: + *repeat_opcode = OP_CRPOSRANGE; + break; + } + } + } + c = *code; + } + + switch(c) + { + case OP_END: + return; + + case OP_TYPESTAR: + case OP_TYPEMINSTAR: + case OP_TYPEPLUS: + case OP_TYPEMINPLUS: + case OP_TYPEQUERY: + case OP_TYPEMINQUERY: + case OP_TYPEPOSSTAR: + case OP_TYPEPOSPLUS: + case OP_TYPEPOSQUERY: + if (code[1] == OP_PROP || code[1] == OP_NOTPROP) code += 2; + break; + + case OP_TYPEUPTO: + case OP_TYPEMINUPTO: + case OP_TYPEEXACT: + case OP_TYPEPOSUPTO: + if (code[1 + IMM2_SIZE] == OP_PROP || code[1 + IMM2_SIZE] == OP_NOTPROP) + code += 2; + break; + +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 + case OP_XCLASS: + code += GET(code, 1); + break; +#endif + + case OP_MARK: + case OP_PRUNE_ARG: + case OP_SKIP_ARG: + case OP_THEN_ARG: + code += code[1]; + break; + } + + /* Add in the fixed length from the table */ + + code += PRIV(OP_lengths)[c]; + + /* In UTF-8 mode, opcodes that are followed by a character may be followed by + a multi-byte character. The length in the table is a minimum, so we have to + arrange to skip the extra bytes. */ + +#if defined SUPPORT_UTF && !defined COMPILE_PCRE32 + if (utf) switch(c) + { + case OP_CHAR: + case OP_CHARI: + case OP_NOT: + case OP_NOTI: + case OP_STAR: + case OP_MINSTAR: + case OP_PLUS: + case OP_MINPLUS: + case OP_QUERY: + case OP_MINQUERY: + case OP_UPTO: + case OP_MINUPTO: + case OP_EXACT: + case OP_POSSTAR: + case OP_POSPLUS: + case OP_POSQUERY: + case OP_POSUPTO: + case OP_STARI: + case OP_MINSTARI: + case OP_PLUSI: + case OP_MINPLUSI: + case OP_QUERYI: + case OP_MINQUERYI: + case OP_UPTOI: + case OP_MINUPTOI: + case OP_EXACTI: + case OP_POSSTARI: + case OP_POSPLUSI: + case OP_POSQUERYI: + case OP_POSUPTOI: + case OP_NOTSTAR: + case OP_NOTMINSTAR: + case OP_NOTPLUS: + case OP_NOTMINPLUS: + case OP_NOTQUERY: + case OP_NOTMINQUERY: + case OP_NOTUPTO: + case OP_NOTMINUPTO: + case OP_NOTEXACT: + case OP_NOTPOSSTAR: + case OP_NOTPOSPLUS: + case OP_NOTPOSQUERY: + case OP_NOTPOSUPTO: + case OP_NOTSTARI: + case OP_NOTMINSTARI: + case OP_NOTPLUSI: + case OP_NOTMINPLUSI: + case OP_NOTQUERYI: + case OP_NOTMINQUERYI: + case OP_NOTUPTOI: + case OP_NOTMINUPTOI: + case OP_NOTEXACTI: + case OP_NOTPOSSTARI: + case OP_NOTPOSPLUSI: + case OP_NOTPOSQUERYI: + case OP_NOTPOSUPTOI: + if (HAS_EXTRALEN(code[-1])) code += GET_EXTRALEN(code[-1]); + break; + } +#else + (void)(utf); /* Keep compiler happy by referencing function argument */ +#endif + } +} + + + +/************************************************* +* Check for POSIX class syntax * +*************************************************/ + +/* This function is called when the sequence "[:" or "[." or "[=" is +encountered in a character class. It checks whether this is followed by a +sequence of characters terminated by a matching ":]" or ".]" or "=]". If we +reach an unescaped ']' without the special preceding character, return FALSE. + +Originally, this function only recognized a sequence of letters between the +terminators, but it seems that Perl recognizes any sequence of characters, +though of course unknown POSIX names are subsequently rejected. Perl gives an +"Unknown POSIX class" error for [:f\oo:] for example, where previously PCRE +didn't consider this to be a POSIX class. Likewise for [:1234:]. + +The problem in trying to be exactly like Perl is in the handling of escapes. We +have to be sure that [abc[:x\]pqr] is *not* treated as containing a POSIX +class, but [abc[:x\]pqr:]] is (so that an error can be generated). The code +below handles the special cases \\ and \], but does not try to do any other +escape processing. This makes it different from Perl for cases such as +[:l\ower:] where Perl recognizes it as the POSIX class "lower" but PCRE does +not recognize "l\ower". This is a lesser evil than not diagnosing bad classes +when Perl does, I think. + +A user pointed out that PCRE was rejecting [:a[:digit:]] whereas Perl was not. +It seems that the appearance of a nested POSIX class supersedes an apparent +external class. For example, [:a[:digit:]b:] matches "a", "b", ":", or +a digit. + +In Perl, unescaped square brackets may also appear as part of class names. For +example, [:a[:abc]b:] gives unknown POSIX class "[:abc]b:]". However, for +[:a[:abc]b][b:] it gives unknown POSIX class "[:abc]b][b:]", which does not +seem right at all. PCRE does not allow closing square brackets in POSIX class +names. + +Arguments: + ptr pointer to the initial [ + endptr where to return the end pointer + +Returns: TRUE or FALSE +*/ + +static BOOL +check_posix_syntax(const pcre_uchar *ptr, const pcre_uchar **endptr) +{ +pcre_uchar terminator; /* Don't combine these lines; the Solaris cc */ +terminator = *(++ptr); /* compiler warns about "non-constant" initializer. */ +for (++ptr; *ptr != CHAR_NULL; ptr++) + { + if (*ptr == CHAR_BACKSLASH && + (ptr[1] == CHAR_RIGHT_SQUARE_BRACKET || + ptr[1] == CHAR_BACKSLASH)) + ptr++; + else if ((*ptr == CHAR_LEFT_SQUARE_BRACKET && ptr[1] == terminator) || + *ptr == CHAR_RIGHT_SQUARE_BRACKET) return FALSE; + else if (*ptr == terminator && ptr[1] == CHAR_RIGHT_SQUARE_BRACKET) + { + *endptr = ptr; + return TRUE; + } + } +return FALSE; +} + + + + +/************************************************* +* Check POSIX class name * +*************************************************/ + +/* This function is called to check the name given in a POSIX-style class entry +such as [:alnum:]. + +Arguments: + ptr points to the first letter + len the length of the name + +Returns: a value representing the name, or -1 if unknown +*/ + +static int +check_posix_name(const pcre_uchar *ptr, int len) +{ +const char *pn = posix_names; +register int yield = 0; +while (posix_name_lengths[yield] != 0) + { + if (len == posix_name_lengths[yield] && + STRNCMP_UC_C8(ptr, pn, (unsigned int)len) == 0) return yield; + pn += posix_name_lengths[yield] + 1; + yield++; + } +return -1; +} + + +/************************************************* +* Adjust OP_RECURSE items in repeated group * +*************************************************/ + +/* OP_RECURSE items contain an offset from the start of the regex to the group +that is referenced. This means that groups can be replicated for fixed +repetition simply by copying (because the recursion is allowed to refer to +earlier groups that are outside the current group). However, when a group is +optional (i.e. the minimum quantifier is zero), OP_BRAZERO or OP_SKIPZERO is +inserted before it, after it has been compiled. This means that any OP_RECURSE +items within it that refer to the group itself or any contained groups have to +have their offsets adjusted. That one of the jobs of this function. Before it +is called, the partially compiled regex must be temporarily terminated with +OP_END. + +This function has been extended to cope with forward references for recursions +and subroutine calls. It must check the list of such references for the +group we are dealing with. If it finds that one of the recursions in the +current group is on this list, it does not adjust the value in the reference +(which is a group number). After the group has been scanned, all the offsets in +the forward reference list for the group are adjusted. + +Arguments: + group points to the start of the group + adjust the amount by which the group is to be moved + utf TRUE in UTF-8 / UTF-16 / UTF-32 mode + cd contains pointers to tables etc. + save_hwm_offset the hwm forward reference offset at the start of the group + +Returns: nothing +*/ + +static void +adjust_recurse(pcre_uchar *group, int adjust, BOOL utf, compile_data *cd, + size_t save_hwm_offset) +{ +int offset; +pcre_uchar *hc; +pcre_uchar *ptr = group; + +while ((ptr = (pcre_uchar *)find_recurse(ptr, utf)) != NULL) + { + for (hc = (pcre_uchar *)cd->start_workspace + save_hwm_offset; hc < cd->hwm; + hc += LINK_SIZE) + { + offset = (int)GET(hc, 0); + if (cd->start_code + offset == ptr + 1) break; + } + + /* If we have not found this recursion on the forward reference list, adjust + the recursion's offset if it's after the start of this group. */ + + if (hc >= cd->hwm) + { + offset = (int)GET(ptr, 1); + if (cd->start_code + offset >= group) PUT(ptr, 1, offset + adjust); + } + + ptr += 1 + LINK_SIZE; + } + +/* Now adjust all forward reference offsets for the group. */ + +for (hc = (pcre_uchar *)cd->start_workspace + save_hwm_offset; hc < cd->hwm; + hc += LINK_SIZE) + { + offset = (int)GET(hc, 0); + PUT(hc, 0, offset + adjust); + } +} + + + +/************************************************* +* Insert an automatic callout point * +*************************************************/ + +/* This function is called when the PCRE_AUTO_CALLOUT option is set, to insert +callout points before each pattern item. + +Arguments: + code current code pointer + ptr current pattern pointer + cd pointers to tables etc + +Returns: new code pointer +*/ + +static pcre_uchar * +auto_callout(pcre_uchar *code, const pcre_uchar *ptr, compile_data *cd) +{ +*code++ = OP_CALLOUT; +*code++ = 255; +PUT(code, 0, (int)(ptr - cd->start_pattern)); /* Pattern offset */ +PUT(code, LINK_SIZE, 0); /* Default length */ +return code + 2 * LINK_SIZE; +} + + + +/************************************************* +* Complete a callout item * +*************************************************/ + +/* A callout item contains the length of the next item in the pattern, which +we can't fill in till after we have reached the relevant point. This is used +for both automatic and manual callouts. + +Arguments: + previous_callout points to previous callout item + ptr current pattern pointer + cd pointers to tables etc + +Returns: nothing +*/ + +static void +complete_callout(pcre_uchar *previous_callout, const pcre_uchar *ptr, compile_data *cd) +{ +int length = (int)(ptr - cd->start_pattern - GET(previous_callout, 2)); +PUT(previous_callout, 2 + LINK_SIZE, length); +} + + + +#ifdef SUPPORT_UCP +/************************************************* +* Get othercase range * +*************************************************/ + +/* This function is passed the start and end of a class range, in UTF-8 mode +with UCP support. It searches up the characters, looking for ranges of +characters in the "other" case. Each call returns the next one, updating the +start address. A character with multiple other cases is returned on its own +with a special return value. + +Arguments: + cptr points to starting character value; updated + d end value + ocptr where to put start of othercase range + odptr where to put end of othercase range + +Yield: -1 when no more + 0 when a range is returned + >0 the CASESET offset for char with multiple other cases + in this case, ocptr contains the original +*/ + +static int +get_othercase_range(pcre_uint32 *cptr, pcre_uint32 d, pcre_uint32 *ocptr, + pcre_uint32 *odptr) +{ +pcre_uint32 c, othercase, next; +unsigned int co; + +/* Find the first character that has an other case. If it has multiple other +cases, return its case offset value. */ + +for (c = *cptr; c <= d; c++) + { + if ((co = UCD_CASESET(c)) != 0) + { + *ocptr = c++; /* Character that has the set */ + *cptr = c; /* Rest of input range */ + return (int)co; + } + if ((othercase = UCD_OTHERCASE(c)) != c) break; + } + +if (c > d) return -1; /* Reached end of range */ + +/* Found a character that has a single other case. Search for the end of the +range, which is either the end of the input range, or a character that has zero +or more than one other cases. */ + +*ocptr = othercase; +next = othercase + 1; + +for (++c; c <= d; c++) + { + if ((co = UCD_CASESET(c)) != 0 || UCD_OTHERCASE(c) != next) break; + next++; + } + +*odptr = next - 1; /* End of othercase range */ +*cptr = c; /* Rest of input range */ +return 0; +} +#endif /* SUPPORT_UCP */ + + + +/************************************************* +* Add a character or range to a class * +*************************************************/ + +/* This function packages up the logic of adding a character or range of +characters to a class. The character values in the arguments will be within the +valid values for the current mode (8-bit, 16-bit, UTF, etc). This function is +mutually recursive with the function immediately below. + +Arguments: + classbits the bit map for characters < 256 + uchardptr points to the pointer for extra data + options the options word + cd contains pointers to tables etc. + start start of range character + end end of range character + +Returns: the number of < 256 characters added + the pointer to extra data is updated +*/ + +static int +add_to_class(pcre_uint8 *classbits, pcre_uchar **uchardptr, int options, + compile_data *cd, pcre_uint32 start, pcre_uint32 end) +{ +pcre_uint32 c; +pcre_uint32 classbits_end = (end <= 0xff ? end : 0xff); +int n8 = 0; + +/* If caseless matching is required, scan the range and process alternate +cases. In Unicode, there are 8-bit characters that have alternate cases that +are greater than 255 and vice-versa. Sometimes we can just extend the original +range. */ + +if ((options & PCRE_CASELESS) != 0) + { +#ifdef SUPPORT_UCP + if ((options & PCRE_UTF8) != 0) + { + int rc; + pcre_uint32 oc, od; + + options &= ~PCRE_CASELESS; /* Remove for recursive calls */ + c = start; + + while ((rc = get_othercase_range(&c, end, &oc, &od)) >= 0) + { + /* Handle a single character that has more than one other case. */ + + if (rc > 0) n8 += add_list_to_class(classbits, uchardptr, options, cd, + PRIV(ucd_caseless_sets) + rc, oc); + + /* Do nothing if the other case range is within the original range. */ + + else if (oc >= start && od <= end) continue; + + /* Extend the original range if there is overlap, noting that if oc < c, we + can't have od > end because a subrange is always shorter than the basic + range. Otherwise, use a recursive call to add the additional range. */ + + else if (oc < start && od >= start - 1) start = oc; /* Extend downwards */ + else if (od > end && oc <= end + 1) + { + end = od; /* Extend upwards */ + if (end > classbits_end) classbits_end = (end <= 0xff ? end : 0xff); + } + else n8 += add_to_class(classbits, uchardptr, options, cd, oc, od); + } + } + else +#endif /* SUPPORT_UCP */ + + /* Not UTF-mode, or no UCP */ + + for (c = start; c <= classbits_end; c++) + { + SETBIT(classbits, cd->fcc[c]); + n8++; + } + } + +/* Now handle the original range. Adjust the final value according to the bit +length - this means that the same lists of (e.g.) horizontal spaces can be used +in all cases. */ + +#if defined COMPILE_PCRE8 +#ifdef SUPPORT_UTF + if ((options & PCRE_UTF8) == 0) +#endif + if (end > 0xff) end = 0xff; + +#elif defined COMPILE_PCRE16 +#ifdef SUPPORT_UTF + if ((options & PCRE_UTF16) == 0) +#endif + if (end > 0xffff) end = 0xffff; + +#endif /* COMPILE_PCRE[8|16] */ + +/* Use the bitmap for characters < 256. Otherwise use extra data.*/ + +for (c = start; c <= classbits_end; c++) + { + /* Regardless of start, c will always be <= 255. */ + SETBIT(classbits, c); + n8++; + } + +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 +if (start <= 0xff) start = 0xff + 1; + +if (end >= start) + { + pcre_uchar *uchardata = *uchardptr; +#ifdef SUPPORT_UTF + if ((options & PCRE_UTF8) != 0) /* All UTFs use the same flag bit */ + { + if (start < end) + { + *uchardata++ = XCL_RANGE; + uchardata += PRIV(ord2utf)(start, uchardata); + uchardata += PRIV(ord2utf)(end, uchardata); + } + else if (start == end) + { + *uchardata++ = XCL_SINGLE; + uchardata += PRIV(ord2utf)(start, uchardata); + } + } + else +#endif /* SUPPORT_UTF */ + + /* Without UTF support, character values are constrained by the bit length, + and can only be > 256 for 16-bit and 32-bit libraries. */ + +#ifdef COMPILE_PCRE8 + {} +#else + if (start < end) + { + *uchardata++ = XCL_RANGE; + *uchardata++ = start; + *uchardata++ = end; + } + else if (start == end) + { + *uchardata++ = XCL_SINGLE; + *uchardata++ = start; + } +#endif + + *uchardptr = uchardata; /* Updata extra data pointer */ + } +#endif /* SUPPORT_UTF || !COMPILE_PCRE8 */ + +return n8; /* Number of 8-bit characters */ +} + + + + +/************************************************* +* Add a list of characters to a class * +*************************************************/ + +/* This function is used for adding a list of case-equivalent characters to a +class, and also for adding a list of horizontal or vertical whitespace. If the +list is in order (which it should be), ranges of characters are detected and +handled appropriately. This function is mutually recursive with the function +above. + +Arguments: + classbits the bit map for characters < 256 + uchardptr points to the pointer for extra data + options the options word + cd contains pointers to tables etc. + p points to row of 32-bit values, terminated by NOTACHAR + except character to omit; this is used when adding lists of + case-equivalent characters to avoid including the one we + already know about + +Returns: the number of < 256 characters added + the pointer to extra data is updated +*/ + +static int +add_list_to_class(pcre_uint8 *classbits, pcre_uchar **uchardptr, int options, + compile_data *cd, const pcre_uint32 *p, unsigned int except) +{ +int n8 = 0; +while (p[0] < NOTACHAR) + { + int n = 0; + if (p[0] != except) + { + while(p[n+1] == p[0] + n + 1) n++; + n8 += add_to_class(classbits, uchardptr, options, cd, p[0], p[n]); + } + p += n + 1; + } +return n8; +} + + + +/************************************************* +* Add characters not in a list to a class * +*************************************************/ + +/* This function is used for adding the complement of a list of horizontal or +vertical whitespace to a class. The list must be in order. + +Arguments: + classbits the bit map for characters < 256 + uchardptr points to the pointer for extra data + options the options word + cd contains pointers to tables etc. + p points to row of 32-bit values, terminated by NOTACHAR + +Returns: the number of < 256 characters added + the pointer to extra data is updated +*/ + +static int +add_not_list_to_class(pcre_uint8 *classbits, pcre_uchar **uchardptr, + int options, compile_data *cd, const pcre_uint32 *p) +{ +BOOL utf = (options & PCRE_UTF8) != 0; +int n8 = 0; +if (p[0] > 0) + n8 += add_to_class(classbits, uchardptr, options, cd, 0, p[0] - 1); +while (p[0] < NOTACHAR) + { + while (p[1] == p[0] + 1) p++; + n8 += add_to_class(classbits, uchardptr, options, cd, p[0] + 1, + (p[1] == NOTACHAR) ? (utf ? 0x10ffffu : 0xffffffffu) : p[1] - 1); + p++; + } +return n8; +} + + + +/************************************************* +* Compile one branch * +*************************************************/ + +/* Scan the pattern, compiling it into the a vector. If the options are +changed during the branch, the pointer is used to change the external options +bits. This function is used during the pre-compile phase when we are trying +to find out the amount of memory needed, as well as during the real compile +phase. The value of lengthptr distinguishes the two phases. + +Arguments: + optionsptr pointer to the option bits + codeptr points to the pointer to the current code point + ptrptr points to the current pattern pointer + errorcodeptr points to error code variable + firstcharptr place to put the first required character + firstcharflagsptr place to put the first character flags, or a negative number + reqcharptr place to put the last required character + reqcharflagsptr place to put the last required character flags, or a negative number + bcptr points to current branch chain + cond_depth conditional nesting depth + cd contains pointers to tables etc. + lengthptr NULL during the real compile phase + points to length accumulator during pre-compile phase + +Returns: TRUE on success + FALSE, with *errorcodeptr set non-zero on error +*/ + +static BOOL +compile_branch(int *optionsptr, pcre_uchar **codeptr, + const pcre_uchar **ptrptr, int *errorcodeptr, + pcre_uint32 *firstcharptr, pcre_int32 *firstcharflagsptr, + pcre_uint32 *reqcharptr, pcre_int32 *reqcharflagsptr, + branch_chain *bcptr, int cond_depth, + compile_data *cd, int *lengthptr) +{ +int repeat_type, op_type; +int repeat_min = 0, repeat_max = 0; /* To please picky compilers */ +int bravalue = 0; +int greedy_default, greedy_non_default; +pcre_uint32 firstchar, reqchar; +pcre_int32 firstcharflags, reqcharflags; +pcre_uint32 zeroreqchar, zerofirstchar; +pcre_int32 zeroreqcharflags, zerofirstcharflags; +pcre_int32 req_caseopt, reqvary, tempreqvary; +int options = *optionsptr; /* May change dynamically */ +int after_manual_callout = 0; +int length_prevgroup = 0; +register pcre_uint32 c; +int escape; +register pcre_uchar *code = *codeptr; +pcre_uchar *last_code = code; +pcre_uchar *orig_code = code; +pcre_uchar *tempcode; +BOOL inescq = FALSE; +BOOL groupsetfirstchar = FALSE; +const pcre_uchar *ptr = *ptrptr; +const pcre_uchar *tempptr; +const pcre_uchar *nestptr = NULL; +pcre_uchar *previous = NULL; +pcre_uchar *previous_callout = NULL; +size_t item_hwm_offset = 0; +pcre_uint8 classbits[32]; + +/* We can fish out the UTF-8 setting once and for all into a BOOL, but we +must not do this for other options (e.g. PCRE_EXTENDED) because they may change +dynamically as we process the pattern. */ + +#ifdef SUPPORT_UTF +/* PCRE_UTF[16|32] have the same value as PCRE_UTF8. */ +BOOL utf = (options & PCRE_UTF8) != 0; +#ifndef COMPILE_PCRE32 +pcre_uchar utf_chars[6]; +#endif +#else +BOOL utf = FALSE; +#endif + +/* Helper variables for OP_XCLASS opcode (for characters > 255). We define +class_uchardata always so that it can be passed to add_to_class() always, +though it will not be used in non-UTF 8-bit cases. This avoids having to supply +alternative calls for the different cases. */ + +pcre_uchar *class_uchardata; +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 +BOOL xclass; +pcre_uchar *class_uchardata_base; +#endif + +#ifdef PCRE_DEBUG +if (lengthptr != NULL) DPRINTF((">> start branch\n")); +#endif + +/* Set up the default and non-default settings for greediness */ + +greedy_default = ((options & PCRE_UNGREEDY) != 0); +greedy_non_default = greedy_default ^ 1; + +/* Initialize no first byte, no required byte. REQ_UNSET means "no char +matching encountered yet". It gets changed to REQ_NONE if we hit something that +matches a non-fixed char first char; reqchar just remains unset if we never +find one. + +When we hit a repeat whose minimum is zero, we may have to adjust these values +to take the zero repeat into account. This is implemented by setting them to +zerofirstbyte and zeroreqchar when such a repeat is encountered. The individual +item types that can be repeated set these backoff variables appropriately. */ + +firstchar = reqchar = zerofirstchar = zeroreqchar = 0; +firstcharflags = reqcharflags = zerofirstcharflags = zeroreqcharflags = REQ_UNSET; + +/* The variable req_caseopt contains either the REQ_CASELESS value +or zero, according to the current setting of the caseless flag. The +REQ_CASELESS leaves the lower 28 bit empty. It is added into the +firstchar or reqchar variables to record the case status of the +value. This is used only for ASCII characters. */ + +req_caseopt = ((options & PCRE_CASELESS) != 0)? REQ_CASELESS:0; + +/* Switch on next character until the end of the branch */ + +for (;; ptr++) + { + BOOL negate_class; + BOOL should_flip_negation; + BOOL possessive_quantifier; + BOOL is_quantifier; + BOOL is_recurse; + BOOL reset_bracount; + int class_has_8bitchar; + int class_one_char; +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 + BOOL xclass_has_prop; +#endif + int newoptions; + int recno; + int refsign; + int skipbytes; + pcre_uint32 subreqchar, subfirstchar; + pcre_int32 subreqcharflags, subfirstcharflags; + int terminator; + unsigned int mclength; + unsigned int tempbracount; + pcre_uint32 ec; + pcre_uchar mcbuffer[8]; + + /* Come here to restart the loop without advancing the pointer. */ + + REDO_LOOP: + + /* Get next character in the pattern */ + + c = *ptr; + + /* If we are at the end of a nested substitution, revert to the outer level + string. Nesting only happens one level deep. */ + + if (c == CHAR_NULL && nestptr != NULL) + { + ptr = nestptr; + nestptr = NULL; + c = *ptr; + } + + /* If we are in the pre-compile phase, accumulate the length used for the + previous cycle of this loop. */ + + if (lengthptr != NULL) + { +#ifdef PCRE_DEBUG + if (code > cd->hwm) cd->hwm = code; /* High water info */ +#endif + if (code > cd->start_workspace + cd->workspace_size - + WORK_SIZE_SAFETY_MARGIN) /* Check for overrun */ + { + *errorcodeptr = (code >= cd->start_workspace + cd->workspace_size)? + ERR52 : ERR87; + goto FAILED; + } + + /* There is at least one situation where code goes backwards: this is the + case of a zero quantifier after a class (e.g. [ab]{0}). At compile time, + the class is simply eliminated. However, it is created first, so we have to + allow memory for it. Therefore, don't ever reduce the length at this point. + */ + + if (code < last_code) code = last_code; + + /* Paranoid check for integer overflow */ + + if (OFLOW_MAX - *lengthptr < code - last_code) + { + *errorcodeptr = ERR20; + goto FAILED; + } + + *lengthptr += (int)(code - last_code); + DPRINTF(("length=%d added %d c=%c (0x%x)\n", *lengthptr, + (int)(code - last_code), c, c)); + + /* If "previous" is set and it is not at the start of the work space, move + it back to there, in order to avoid filling up the work space. Otherwise, + if "previous" is NULL, reset the current code pointer to the start. */ + + if (previous != NULL) + { + if (previous > orig_code) + { + memmove(orig_code, previous, IN_UCHARS(code - previous)); + code -= previous - orig_code; + previous = orig_code; + } + } + else code = orig_code; + + /* Remember where this code item starts so we can pick up the length + next time round. */ + + last_code = code; + } + + /* In the real compile phase, just check the workspace used by the forward + reference list. */ + + else if (cd->hwm > cd->start_workspace + cd->workspace_size) + { + *errorcodeptr = ERR52; + goto FAILED; + } + + /* If in \Q...\E, check for the end; if not, we have a literal. Otherwise an + isolated \E is ignored. */ + + if (c != CHAR_NULL) + { + if (c == CHAR_BACKSLASH && ptr[1] == CHAR_E) + { + inescq = FALSE; + ptr++; + continue; + } + else if (inescq) + { + if (previous_callout != NULL) + { + if (lengthptr == NULL) /* Don't attempt in pre-compile phase */ + complete_callout(previous_callout, ptr, cd); + previous_callout = NULL; + } + if ((options & PCRE_AUTO_CALLOUT) != 0) + { + previous_callout = code; + code = auto_callout(code, ptr, cd); + } + goto NORMAL_CHAR; + } + + /* Check for the start of a \Q...\E sequence. We must do this here rather + than later in case it is immediately followed by \E, which turns it into a + "do nothing" sequence. */ + + if (c == CHAR_BACKSLASH && ptr[1] == CHAR_Q) + { + inescq = TRUE; + ptr++; + continue; + } + } + + /* In extended mode, skip white space and comments. */ + + if ((options & PCRE_EXTENDED) != 0) + { + const pcre_uchar *wscptr = ptr; + while (MAX_255(c) && (cd->ctypes[c] & ctype_space) != 0) c = *(++ptr); + if (c == CHAR_NUMBER_SIGN) + { + ptr++; + while (*ptr != CHAR_NULL) + { + if (IS_NEWLINE(ptr)) /* For non-fixed-length newline cases, */ + { /* IS_NEWLINE sets cd->nllen. */ + ptr += cd->nllen; + break; + } + ptr++; +#ifdef SUPPORT_UTF + if (utf) FORWARDCHAR(ptr); +#endif + } + } + + /* If we skipped any characters, restart the loop. Otherwise, we didn't see + a comment. */ + + if (ptr > wscptr) goto REDO_LOOP; + } + + /* Skip over (?# comments. We need to do this here because we want to know if + the next thing is a quantifier, and these comments may come between an item + and its quantifier. */ + + if (c == CHAR_LEFT_PARENTHESIS && ptr[1] == CHAR_QUESTION_MARK && + ptr[2] == CHAR_NUMBER_SIGN) + { + ptr += 3; + while (*ptr != CHAR_NULL && *ptr != CHAR_RIGHT_PARENTHESIS) ptr++; + if (*ptr == CHAR_NULL) + { + *errorcodeptr = ERR18; + goto FAILED; + } + continue; + } + + /* See if the next thing is a quantifier. */ + + is_quantifier = + c == CHAR_ASTERISK || c == CHAR_PLUS || c == CHAR_QUESTION_MARK || + (c == CHAR_LEFT_CURLY_BRACKET && is_counted_repeat(ptr+1)); + + /* Fill in length of a previous callout, except when the next thing is a + quantifier or when processing a property substitution string in UCP mode. */ + + if (!is_quantifier && previous_callout != NULL && nestptr == NULL && + after_manual_callout-- <= 0) + { + if (lengthptr == NULL) /* Don't attempt in pre-compile phase */ + complete_callout(previous_callout, ptr, cd); + previous_callout = NULL; + } + + /* Create auto callout, except for quantifiers, or while processing property + strings that are substituted for \w etc in UCP mode. */ + + if ((options & PCRE_AUTO_CALLOUT) != 0 && !is_quantifier && nestptr == NULL) + { + previous_callout = code; + code = auto_callout(code, ptr, cd); + } + + /* Process the next pattern item. */ + + switch(c) + { + /* ===================================================================*/ + case CHAR_NULL: /* The branch terminates at string end */ + case CHAR_VERTICAL_LINE: /* or | or ) */ + case CHAR_RIGHT_PARENTHESIS: + *firstcharptr = firstchar; + *firstcharflagsptr = firstcharflags; + *reqcharptr = reqchar; + *reqcharflagsptr = reqcharflags; + *codeptr = code; + *ptrptr = ptr; + if (lengthptr != NULL) + { + if (OFLOW_MAX - *lengthptr < code - last_code) + { + *errorcodeptr = ERR20; + goto FAILED; + } + *lengthptr += (int)(code - last_code); /* To include callout length */ + DPRINTF((">> end branch\n")); + } + return TRUE; + + + /* ===================================================================*/ + /* Handle single-character metacharacters. In multiline mode, ^ disables + the setting of any following char as a first character. */ + + case CHAR_CIRCUMFLEX_ACCENT: + previous = NULL; + if ((options & PCRE_MULTILINE) != 0) + { + if (firstcharflags == REQ_UNSET) + zerofirstcharflags = firstcharflags = REQ_NONE; + *code++ = OP_CIRCM; + } + else *code++ = OP_CIRC; + break; + + case CHAR_DOLLAR_SIGN: + previous = NULL; + *code++ = ((options & PCRE_MULTILINE) != 0)? OP_DOLLM : OP_DOLL; + break; + + /* There can never be a first char if '.' is first, whatever happens about + repeats. The value of reqchar doesn't change either. */ + + case CHAR_DOT: + if (firstcharflags == REQ_UNSET) firstcharflags = REQ_NONE; + zerofirstchar = firstchar; + zerofirstcharflags = firstcharflags; + zeroreqchar = reqchar; + zeroreqcharflags = reqcharflags; + previous = code; + item_hwm_offset = cd->hwm - cd->start_workspace; + *code++ = ((options & PCRE_DOTALL) != 0)? OP_ALLANY: OP_ANY; + break; + + + /* ===================================================================*/ + /* Character classes. If the included characters are all < 256, we build a + 32-byte bitmap of the permitted characters, except in the special case + where there is only one such character. For negated classes, we build the + map as usual, then invert it at the end. However, we use a different opcode + so that data characters > 255 can be handled correctly. + + If the class contains characters outside the 0-255 range, a different + opcode is compiled. It may optionally have a bit map for characters < 256, + but those above are are explicitly listed afterwards. A flag byte tells + whether the bitmap is present, and whether this is a negated class or not. + + In JavaScript compatibility mode, an isolated ']' causes an error. In + default (Perl) mode, it is treated as a data character. */ + + case CHAR_RIGHT_SQUARE_BRACKET: + if ((cd->external_options & PCRE_JAVASCRIPT_COMPAT) != 0) + { + *errorcodeptr = ERR64; + goto FAILED; + } + goto NORMAL_CHAR; + + /* In another (POSIX) regex library, the ugly syntax [[:<:]] and [[:>:]] is + used for "start of word" and "end of word". As these are otherwise illegal + sequences, we don't break anything by recognizing them. They are replaced + by \b(?=\w) and \b(?<=\w) respectively. Sequences like [a[:<:]] are + erroneous and are handled by the normal code below. */ + + case CHAR_LEFT_SQUARE_BRACKET: + if (STRNCMP_UC_C8(ptr+1, STRING_WEIRD_STARTWORD, 6) == 0) + { + nestptr = ptr + 7; + ptr = sub_start_of_word; + goto REDO_LOOP; + } + + if (STRNCMP_UC_C8(ptr+1, STRING_WEIRD_ENDWORD, 6) == 0) + { + nestptr = ptr + 7; + ptr = sub_end_of_word; + goto REDO_LOOP; + } + + /* Handle a real character class. */ + + previous = code; + item_hwm_offset = cd->hwm - cd->start_workspace; + + /* PCRE supports POSIX class stuff inside a class. Perl gives an error if + they are encountered at the top level, so we'll do that too. */ + + if ((ptr[1] == CHAR_COLON || ptr[1] == CHAR_DOT || + ptr[1] == CHAR_EQUALS_SIGN) && + check_posix_syntax(ptr, &tempptr)) + { + *errorcodeptr = (ptr[1] == CHAR_COLON)? ERR13 : ERR31; + goto FAILED; + } + + /* If the first character is '^', set the negation flag and skip it. Also, + if the first few characters (either before or after ^) are \Q\E or \E we + skip them too. This makes for compatibility with Perl. */ + + negate_class = FALSE; + for (;;) + { + c = *(++ptr); + if (c == CHAR_BACKSLASH) + { + if (ptr[1] == CHAR_E) + ptr++; + else if (STRNCMP_UC_C8(ptr + 1, STR_Q STR_BACKSLASH STR_E, 3) == 0) + ptr += 3; + else + break; + } + else if (!negate_class && c == CHAR_CIRCUMFLEX_ACCENT) + negate_class = TRUE; + else break; + } + + /* Empty classes are allowed in JavaScript compatibility mode. Otherwise, + an initial ']' is taken as a data character -- the code below handles + that. In JS mode, [] must always fail, so generate OP_FAIL, whereas + [^] must match any character, so generate OP_ALLANY. */ + + if (c == CHAR_RIGHT_SQUARE_BRACKET && + (cd->external_options & PCRE_JAVASCRIPT_COMPAT) != 0) + { + *code++ = negate_class? OP_ALLANY : OP_FAIL; + if (firstcharflags == REQ_UNSET) firstcharflags = REQ_NONE; + zerofirstchar = firstchar; + zerofirstcharflags = firstcharflags; + break; + } + + /* If a class contains a negative special such as \S, we need to flip the + negation flag at the end, so that support for characters > 255 works + correctly (they are all included in the class). */ + + should_flip_negation = FALSE; + + /* Extended class (xclass) will be used when characters > 255 + might match. */ + +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 + xclass = FALSE; + class_uchardata = code + LINK_SIZE + 2; /* For XCLASS items */ + class_uchardata_base = class_uchardata; /* Save the start */ +#endif + + /* For optimization purposes, we track some properties of the class: + class_has_8bitchar will be non-zero if the class contains at least one < + 256 character; class_one_char will be 1 if the class contains just one + character; xclass_has_prop will be TRUE if unicode property checks + are present in the class. */ + + class_has_8bitchar = 0; + class_one_char = 0; +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 + xclass_has_prop = FALSE; +#endif + + /* Initialize the 32-char bit map to all zeros. We build the map in a + temporary bit of memory, in case the class contains fewer than two + 8-bit characters because in that case the compiled code doesn't use the bit + map. */ + + memset(classbits, 0, 32 * sizeof(pcre_uint8)); + + /* Process characters until ] is reached. By writing this as a "do" it + means that an initial ] is taken as a data character. At the start of the + loop, c contains the first byte of the character. */ + + if (c != CHAR_NULL) do + { + const pcre_uchar *oldptr; + +#ifdef SUPPORT_UTF + if (utf && HAS_EXTRALEN(c)) + { /* Braces are required because the */ + GETCHARLEN(c, ptr, ptr); /* macro generates multiple statements */ + } +#endif + +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 + /* In the pre-compile phase, accumulate the length of any extra + data and reset the pointer. This is so that very large classes that + contain a zillion > 255 characters no longer overwrite the work space + (which is on the stack). We have to remember that there was XCLASS data, + however. */ + + if (class_uchardata > class_uchardata_base) xclass = TRUE; + + if (lengthptr != NULL && class_uchardata > class_uchardata_base) + { + *lengthptr += (int)(class_uchardata - class_uchardata_base); + class_uchardata = class_uchardata_base; + } +#endif + + /* Inside \Q...\E everything is literal except \E */ + + if (inescq) + { + if (c == CHAR_BACKSLASH && ptr[1] == CHAR_E) /* If we are at \E */ + { + inescq = FALSE; /* Reset literal state */ + ptr++; /* Skip the 'E' */ + continue; /* Carry on with next */ + } + goto CHECK_RANGE; /* Could be range if \E follows */ + } + + /* Handle POSIX class names. Perl allows a negation extension of the + form [:^name:]. A square bracket that doesn't match the syntax is + treated as a literal. We also recognize the POSIX constructions + [.ch.] and [=ch=] ("collating elements") and fault them, as Perl + 5.6 and 5.8 do. */ + + if (c == CHAR_LEFT_SQUARE_BRACKET && + (ptr[1] == CHAR_COLON || ptr[1] == CHAR_DOT || + ptr[1] == CHAR_EQUALS_SIGN) && check_posix_syntax(ptr, &tempptr)) + { + BOOL local_negate = FALSE; + int posix_class, taboffset, tabopt; + register const pcre_uint8 *cbits = cd->cbits; + pcre_uint8 pbits[32]; + + if (ptr[1] != CHAR_COLON) + { + *errorcodeptr = ERR31; + goto FAILED; + } + + ptr += 2; + if (*ptr == CHAR_CIRCUMFLEX_ACCENT) + { + local_negate = TRUE; + should_flip_negation = TRUE; /* Note negative special */ + ptr++; + } + + posix_class = check_posix_name(ptr, (int)(tempptr - ptr)); + if (posix_class < 0) + { + *errorcodeptr = ERR30; + goto FAILED; + } + + /* If matching is caseless, upper and lower are converted to + alpha. This relies on the fact that the class table starts with + alpha, lower, upper as the first 3 entries. */ + + if ((options & PCRE_CASELESS) != 0 && posix_class <= 2) + posix_class = 0; + + /* When PCRE_UCP is set, some of the POSIX classes are converted to + different escape sequences that use Unicode properties \p or \P. Others + that are not available via \p or \P generate XCL_PROP/XCL_NOTPROP + directly. */ + +#ifdef SUPPORT_UCP + if ((options & PCRE_UCP) != 0) + { + unsigned int ptype = 0; + int pc = posix_class + ((local_negate)? POSIX_SUBSIZE/2 : 0); + + /* The posix_substitutes table specifies which POSIX classes can be + converted to \p or \P items. */ + + if (posix_substitutes[pc] != NULL) + { + nestptr = tempptr + 1; + ptr = posix_substitutes[pc] - 1; + continue; + } + + /* There are three other classes that generate special property calls + that are recognized only in an XCLASS. */ + + else switch(posix_class) + { + case PC_GRAPH: + ptype = PT_PXGRAPH; + /* Fall through */ + case PC_PRINT: + if (ptype == 0) ptype = PT_PXPRINT; + /* Fall through */ + case PC_PUNCT: + if (ptype == 0) ptype = PT_PXPUNCT; + *class_uchardata++ = local_negate? XCL_NOTPROP : XCL_PROP; + *class_uchardata++ = ptype; + *class_uchardata++ = 0; + xclass_has_prop = TRUE; + ptr = tempptr + 1; + continue; + + /* For the other POSIX classes (ascii, cntrl, xdigit) we are going + to fall through to the non-UCP case and build a bit map for + characters with code points less than 256. If we are in a negated + POSIX class, characters with code points greater than 255 must + either all match or all not match. In the special case where we + have not yet generated any xclass data, and this is the final item + in the overall class, we need do nothing: later on, the opcode + OP_NCLASS will be used to indicate that characters greater than 255 + are acceptable. If we have already seen an xclass item or one may + follow (we have to assume that it might if this is not the end of + the class), explicitly list all wide codepoints, which will then + either not match or match, depending on whether the class is or is + not negated. */ + + default: + if (local_negate && + (xclass || tempptr[2] != CHAR_RIGHT_SQUARE_BRACKET)) + { + *class_uchardata++ = XCL_RANGE; + class_uchardata += PRIV(ord2utf)(0x100, class_uchardata); + class_uchardata += PRIV(ord2utf)(0x10ffff, class_uchardata); + } + break; + } + } +#endif + /* In the non-UCP case, or when UCP makes no difference, we build the + bit map for the POSIX class in a chunk of local store because we may be + adding and subtracting from it, and we don't want to subtract bits that + may be in the main map already. At the end we or the result into the + bit map that is being built. */ + + posix_class *= 3; + + /* Copy in the first table (always present) */ + + memcpy(pbits, cbits + posix_class_maps[posix_class], + 32 * sizeof(pcre_uint8)); + + /* If there is a second table, add or remove it as required. */ + + taboffset = posix_class_maps[posix_class + 1]; + tabopt = posix_class_maps[posix_class + 2]; + + if (taboffset >= 0) + { + if (tabopt >= 0) + for (c = 0; c < 32; c++) pbits[c] |= cbits[c + taboffset]; + else + for (c = 0; c < 32; c++) pbits[c] &= ~cbits[c + taboffset]; + } + + /* Now see if we need to remove any special characters. An option + value of 1 removes vertical space and 2 removes underscore. */ + + if (tabopt < 0) tabopt = -tabopt; + if (tabopt == 1) pbits[1] &= ~0x3c; + else if (tabopt == 2) pbits[11] &= 0x7f; + + /* Add the POSIX table or its complement into the main table that is + being built and we are done. */ + + if (local_negate) + for (c = 0; c < 32; c++) classbits[c] |= ~pbits[c]; + else + for (c = 0; c < 32; c++) classbits[c] |= pbits[c]; + + ptr = tempptr + 1; + /* Every class contains at least one < 256 character. */ + class_has_8bitchar = 1; + /* Every class contains at least two characters. */ + class_one_char = 2; + continue; /* End of POSIX syntax handling */ + } + + /* Backslash may introduce a single character, or it may introduce one + of the specials, which just set a flag. The sequence \b is a special + case. Inside a class (and only there) it is treated as backspace. We + assume that other escapes have more than one character in them, so + speculatively set both class_has_8bitchar and class_one_char bigger + than one. Unrecognized escapes fall through and are either treated + as literal characters (by default), or are faulted if + PCRE_EXTRA is set. */ + + if (c == CHAR_BACKSLASH) + { + escape = check_escape(&ptr, &ec, errorcodeptr, cd->bracount, options, + TRUE); + if (*errorcodeptr != 0) goto FAILED; + if (escape == 0) c = ec; + else if (escape == ESC_b) c = CHAR_BS; /* \b is backspace in a class */ + else if (escape == ESC_N) /* \N is not supported in a class */ + { + *errorcodeptr = ERR71; + goto FAILED; + } + else if (escape == ESC_Q) /* Handle start of quoted string */ + { + if (ptr[1] == CHAR_BACKSLASH && ptr[2] == CHAR_E) + { + ptr += 2; /* avoid empty string */ + } + else inescq = TRUE; + continue; + } + else if (escape == ESC_E) continue; /* Ignore orphan \E */ + + else + { + register const pcre_uint8 *cbits = cd->cbits; + /* Every class contains at least two < 256 characters. */ + class_has_8bitchar++; + /* Every class contains at least two characters. */ + class_one_char += 2; + + switch (escape) + { +#ifdef SUPPORT_UCP + case ESC_du: /* These are the values given for \d etc */ + case ESC_DU: /* when PCRE_UCP is set. We replace the */ + case ESC_wu: /* escape sequence with an appropriate \p */ + case ESC_WU: /* or \P to test Unicode properties instead */ + case ESC_su: /* of the default ASCII testing. */ + case ESC_SU: + nestptr = ptr; + ptr = substitutes[escape - ESC_DU] - 1; /* Just before substitute */ + class_has_8bitchar--; /* Undo! */ + continue; +#endif + case ESC_d: + for (c = 0; c < 32; c++) classbits[c] |= cbits[c+cbit_digit]; + continue; + + case ESC_D: + should_flip_negation = TRUE; + for (c = 0; c < 32; c++) classbits[c] |= ~cbits[c+cbit_digit]; + continue; + + case ESC_w: + for (c = 0; c < 32; c++) classbits[c] |= cbits[c+cbit_word]; + continue; + + case ESC_W: + should_flip_negation = TRUE; + for (c = 0; c < 32; c++) classbits[c] |= ~cbits[c+cbit_word]; + continue; + + /* Perl 5.004 onwards omitted VT from \s, but restored it at Perl + 5.18. Before PCRE 8.34, we had to preserve the VT bit if it was + previously set by something earlier in the character class. + Luckily, the value of CHAR_VT is 0x0b in both ASCII and EBCDIC, so + we could just adjust the appropriate bit. From PCRE 8.34 we no + longer treat \s and \S specially. */ + + case ESC_s: + for (c = 0; c < 32; c++) classbits[c] |= cbits[c+cbit_space]; + continue; + + case ESC_S: + should_flip_negation = TRUE; + for (c = 0; c < 32; c++) classbits[c] |= ~cbits[c+cbit_space]; + continue; + + /* The rest apply in both UCP and non-UCP cases. */ + + case ESC_h: + (void)add_list_to_class(classbits, &class_uchardata, options, cd, + PRIV(hspace_list), NOTACHAR); + continue; + + case ESC_H: + (void)add_not_list_to_class(classbits, &class_uchardata, options, + cd, PRIV(hspace_list)); + continue; + + case ESC_v: + (void)add_list_to_class(classbits, &class_uchardata, options, cd, + PRIV(vspace_list), NOTACHAR); + continue; + + case ESC_V: + (void)add_not_list_to_class(classbits, &class_uchardata, options, + cd, PRIV(vspace_list)); + continue; + + case ESC_p: + case ESC_P: +#ifdef SUPPORT_UCP + { + BOOL negated; + unsigned int ptype = 0, pdata = 0; + if (!get_ucp(&ptr, &negated, &ptype, &pdata, errorcodeptr)) + goto FAILED; + *class_uchardata++ = ((escape == ESC_p) != negated)? + XCL_PROP : XCL_NOTPROP; + *class_uchardata++ = ptype; + *class_uchardata++ = pdata; + xclass_has_prop = TRUE; + class_has_8bitchar--; /* Undo! */ + continue; + } +#else + *errorcodeptr = ERR45; + goto FAILED; +#endif + /* Unrecognized escapes are faulted if PCRE is running in its + strict mode. By default, for compatibility with Perl, they are + treated as literals. */ + + default: + if ((options & PCRE_EXTRA) != 0) + { + *errorcodeptr = ERR7; + goto FAILED; + } + class_has_8bitchar--; /* Undo the speculative increase. */ + class_one_char -= 2; /* Undo the speculative increase. */ + c = *ptr; /* Get the final character and fall through */ + break; + } + } + + /* Fall through if the escape just defined a single character (c >= 0). + This may be greater than 256. */ + + escape = 0; + + } /* End of backslash handling */ + + /* A character may be followed by '-' to form a range. However, Perl does + not permit ']' to be the end of the range. A '-' character at the end is + treated as a literal. Perl ignores orphaned \E sequences entirely. The + code for handling \Q and \E is messy. */ + + CHECK_RANGE: + while (ptr[1] == CHAR_BACKSLASH && ptr[2] == CHAR_E) + { + inescq = FALSE; + ptr += 2; + } + oldptr = ptr; + + /* Remember if \r or \n were explicitly used */ + + if (c == CHAR_CR || c == CHAR_NL) cd->external_flags |= PCRE_HASCRORLF; + + /* Check for range */ + + if (!inescq && ptr[1] == CHAR_MINUS) + { + pcre_uint32 d; + ptr += 2; + while (*ptr == CHAR_BACKSLASH && ptr[1] == CHAR_E) ptr += 2; + + /* If we hit \Q (not followed by \E) at this point, go into escaped + mode. */ + + while (*ptr == CHAR_BACKSLASH && ptr[1] == CHAR_Q) + { + ptr += 2; + if (*ptr == CHAR_BACKSLASH && ptr[1] == CHAR_E) + { ptr += 2; continue; } + inescq = TRUE; + break; + } + + /* Minus (hyphen) at the end of a class is treated as a literal, so put + back the pointer and jump to handle the character that preceded it. */ + + if (*ptr == CHAR_NULL || (!inescq && *ptr == CHAR_RIGHT_SQUARE_BRACKET)) + { + ptr = oldptr; + goto CLASS_SINGLE_CHARACTER; + } + + /* Otherwise, we have a potential range; pick up the next character */ + +#ifdef SUPPORT_UTF + if (utf) + { /* Braces are required because the */ + GETCHARLEN(d, ptr, ptr); /* macro generates multiple statements */ + } + else +#endif + d = *ptr; /* Not UTF-8 mode */ + + /* The second part of a range can be a single-character escape + sequence, but not any of the other escapes. Perl treats a hyphen as a + literal in such circumstances. However, in Perl's warning mode, a + warning is given, so PCRE now faults it as it is almost certainly a + mistake on the user's part. */ + + if (!inescq) + { + if (d == CHAR_BACKSLASH) + { + int descape; + descape = check_escape(&ptr, &d, errorcodeptr, cd->bracount, options, TRUE); + if (*errorcodeptr != 0) goto FAILED; + + /* 0 means a character was put into d; \b is backspace; any other + special causes an error. */ + + if (descape != 0) + { + if (descape == ESC_b) d = CHAR_BS; else + { + *errorcodeptr = ERR83; + goto FAILED; + } + } + } + + /* A hyphen followed by a POSIX class is treated in the same way. */ + + else if (d == CHAR_LEFT_SQUARE_BRACKET && + (ptr[1] == CHAR_COLON || ptr[1] == CHAR_DOT || + ptr[1] == CHAR_EQUALS_SIGN) && + check_posix_syntax(ptr, &tempptr)) + { + *errorcodeptr = ERR83; + goto FAILED; + } + } + + /* Check that the two values are in the correct order. Optimize + one-character ranges. */ + + if (d < c) + { + *errorcodeptr = ERR8; + goto FAILED; + } + if (d == c) goto CLASS_SINGLE_CHARACTER; /* A few lines below */ + + /* We have found a character range, so single character optimizations + cannot be done anymore. Any value greater than 1 indicates that there + is more than one character. */ + + class_one_char = 2; + + /* Remember an explicit \r or \n, and add the range to the class. */ + + if (d == CHAR_CR || d == CHAR_NL) cd->external_flags |= PCRE_HASCRORLF; + + class_has_8bitchar += + add_to_class(classbits, &class_uchardata, options, cd, c, d); + + continue; /* Go get the next char in the class */ + } + + /* Handle a single character - we can get here for a normal non-escape + char, or after \ that introduces a single character or for an apparent + range that isn't. Only the value 1 matters for class_one_char, so don't + increase it if it is already 2 or more ... just in case there's a class + with a zillion characters in it. */ + + CLASS_SINGLE_CHARACTER: + if (class_one_char < 2) class_one_char++; + + /* If xclass_has_prop is false and class_one_char is 1, we have the first + single character in the class, and there have been no prior ranges, or + XCLASS items generated by escapes. If this is the final character in the + class, we can optimize by turning the item into a 1-character OP_CHAR[I] + if it's positive, or OP_NOT[I] if it's negative. In the positive case, it + can cause firstchar to be set. Otherwise, there can be no first char if + this item is first, whatever repeat count may follow. In the case of + reqchar, save the previous value for reinstating. */ + + if (!inescq && +#ifdef SUPPORT_UCP + !xclass_has_prop && +#endif + class_one_char == 1 && ptr[1] == CHAR_RIGHT_SQUARE_BRACKET) + { + ptr++; + zeroreqchar = reqchar; + zeroreqcharflags = reqcharflags; + + if (negate_class) + { +#ifdef SUPPORT_UCP + int d; +#endif + if (firstcharflags == REQ_UNSET) firstcharflags = REQ_NONE; + zerofirstchar = firstchar; + zerofirstcharflags = firstcharflags; + + /* For caseless UTF-8 mode when UCP support is available, check + whether this character has more than one other case. If so, generate + a special OP_NOTPROP item instead of OP_NOTI. */ + +#ifdef SUPPORT_UCP + if (utf && (options & PCRE_CASELESS) != 0 && + (d = UCD_CASESET(c)) != 0) + { + *code++ = OP_NOTPROP; + *code++ = PT_CLIST; + *code++ = d; + } + else +#endif + /* Char has only one other case, or UCP not available */ + + { + *code++ = ((options & PCRE_CASELESS) != 0)? OP_NOTI: OP_NOT; +#if defined SUPPORT_UTF && !defined COMPILE_PCRE32 + if (utf && c > MAX_VALUE_FOR_SINGLE_CHAR) + code += PRIV(ord2utf)(c, code); + else +#endif + *code++ = c; + } + + /* We are finished with this character class */ + + goto END_CLASS; + } + + /* For a single, positive character, get the value into mcbuffer, and + then we can handle this with the normal one-character code. */ + +#if defined SUPPORT_UTF && !defined COMPILE_PCRE32 + if (utf && c > MAX_VALUE_FOR_SINGLE_CHAR) + mclength = PRIV(ord2utf)(c, mcbuffer); + else +#endif + { + mcbuffer[0] = c; + mclength = 1; + } + goto ONE_CHAR; + } /* End of 1-char optimization */ + + /* There is more than one character in the class, or an XCLASS item + has been generated. Add this character to the class. */ + + class_has_8bitchar += + add_to_class(classbits, &class_uchardata, options, cd, c, c); + } + + /* Loop until ']' reached. This "while" is the end of the "do" far above. + If we are at the end of an internal nested string, revert to the outer + string. */ + + while (((c = *(++ptr)) != CHAR_NULL || + (nestptr != NULL && + (ptr = nestptr, nestptr = NULL, c = *(++ptr)) != CHAR_NULL)) && + (c != CHAR_RIGHT_SQUARE_BRACKET || inescq)); + + /* Check for missing terminating ']' */ + + if (c == CHAR_NULL) + { + *errorcodeptr = ERR6; + goto FAILED; + } + + /* We will need an XCLASS if data has been placed in class_uchardata. In + the second phase this is a sufficient test. However, in the pre-compile + phase, class_uchardata gets emptied to prevent workspace overflow, so it + only if the very last character in the class needs XCLASS will it contain + anything at this point. For this reason, xclass gets set TRUE above when + uchar_classdata is emptied, and that's why this code is the way it is here + instead of just doing a test on class_uchardata below. */ + +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 + if (class_uchardata > class_uchardata_base) xclass = TRUE; +#endif + + /* If this is the first thing in the branch, there can be no first char + setting, whatever the repeat count. Any reqchar setting must remain + unchanged after any kind of repeat. */ + + if (firstcharflags == REQ_UNSET) firstcharflags = REQ_NONE; + zerofirstchar = firstchar; + zerofirstcharflags = firstcharflags; + zeroreqchar = reqchar; + zeroreqcharflags = reqcharflags; + + /* If there are characters with values > 255, we have to compile an + extended class, with its own opcode, unless there was a negated special + such as \S in the class, and PCRE_UCP is not set, because in that case all + characters > 255 are in the class, so any that were explicitly given as + well can be ignored. If (when there are explicit characters > 255 that must + be listed) there are no characters < 256, we can omit the bitmap in the + actual compiled code. */ + +#ifdef SUPPORT_UTF + if (xclass && (xclass_has_prop || !should_flip_negation || + (options & PCRE_UCP) != 0)) +#elif !defined COMPILE_PCRE8 + if (xclass && (xclass_has_prop || !should_flip_negation)) +#endif +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 + { + /* For non-UCP wide characters, in a non-negative class containing \S or + similar (should_flip_negation is set), all characters greater than 255 + must be in the class. */ + + if ( +#if defined COMPILE_PCRE8 + utf && +#endif + should_flip_negation && !negate_class && (options & PCRE_UCP) == 0) + { + *class_uchardata++ = XCL_RANGE; + if (utf) /* Will always be utf in the 8-bit library */ + { + class_uchardata += PRIV(ord2utf)(0x100, class_uchardata); + class_uchardata += PRIV(ord2utf)(0x10ffff, class_uchardata); + } + else /* Can only happen for the 16-bit & 32-bit libraries */ + { +#if defined COMPILE_PCRE16 + *class_uchardata++ = 0x100; + *class_uchardata++ = 0xffffu; +#elif defined COMPILE_PCRE32 + *class_uchardata++ = 0x100; + *class_uchardata++ = 0xffffffffu; +#endif + } + } + + *class_uchardata++ = XCL_END; /* Marks the end of extra data */ + *code++ = OP_XCLASS; + code += LINK_SIZE; + *code = negate_class? XCL_NOT:0; + if (xclass_has_prop) *code |= XCL_HASPROP; + + /* If the map is required, move up the extra data to make room for it; + otherwise just move the code pointer to the end of the extra data. */ + + if (class_has_8bitchar > 0) + { + *code++ |= XCL_MAP; + memmove(code + (32 / sizeof(pcre_uchar)), code, + IN_UCHARS(class_uchardata - code)); + if (negate_class && !xclass_has_prop) + for (c = 0; c < 32; c++) classbits[c] = ~classbits[c]; + memcpy(code, classbits, 32); + code = class_uchardata + (32 / sizeof(pcre_uchar)); + } + else code = class_uchardata; + + /* Now fill in the complete length of the item */ + + PUT(previous, 1, (int)(code - previous)); + break; /* End of class handling */ + } + + /* Even though any XCLASS list is now discarded, we must allow for + its memory. */ + + if (lengthptr != NULL) + *lengthptr += (int)(class_uchardata - class_uchardata_base); +#endif + + /* If there are no characters > 255, or they are all to be included or + excluded, set the opcode to OP_CLASS or OP_NCLASS, depending on whether the + whole class was negated and whether there were negative specials such as \S + (non-UCP) in the class. Then copy the 32-byte map into the code vector, + negating it if necessary. */ + + *code++ = (negate_class == should_flip_negation) ? OP_CLASS : OP_NCLASS; + if (lengthptr == NULL) /* Save time in the pre-compile phase */ + { + if (negate_class) + for (c = 0; c < 32; c++) classbits[c] = ~classbits[c]; + memcpy(code, classbits, 32); + } + code += 32 / sizeof(pcre_uchar); + + END_CLASS: + break; + + + /* ===================================================================*/ + /* Various kinds of repeat; '{' is not necessarily a quantifier, but this + has been tested above. */ + + case CHAR_LEFT_CURLY_BRACKET: + if (!is_quantifier) goto NORMAL_CHAR; + ptr = read_repeat_counts(ptr+1, &repeat_min, &repeat_max, errorcodeptr); + if (*errorcodeptr != 0) goto FAILED; + goto REPEAT; + + case CHAR_ASTERISK: + repeat_min = 0; + repeat_max = -1; + goto REPEAT; + + case CHAR_PLUS: + repeat_min = 1; + repeat_max = -1; + goto REPEAT; + + case CHAR_QUESTION_MARK: + repeat_min = 0; + repeat_max = 1; + + REPEAT: + if (previous == NULL) + { + *errorcodeptr = ERR9; + goto FAILED; + } + + if (repeat_min == 0) + { + firstchar = zerofirstchar; /* Adjust for zero repeat */ + firstcharflags = zerofirstcharflags; + reqchar = zeroreqchar; /* Ditto */ + reqcharflags = zeroreqcharflags; + } + + /* Remember whether this is a variable length repeat */ + + reqvary = (repeat_min == repeat_max)? 0 : REQ_VARY; + + op_type = 0; /* Default single-char op codes */ + possessive_quantifier = FALSE; /* Default not possessive quantifier */ + + /* Save start of previous item, in case we have to move it up in order to + insert something before it. */ + + tempcode = previous; + + /* Before checking for a possessive quantifier, we must skip over + whitespace and comments in extended mode because Perl allows white space at + this point. */ + + if ((options & PCRE_EXTENDED) != 0) + { + const pcre_uchar *p = ptr + 1; + for (;;) + { + while (MAX_255(*p) && (cd->ctypes[*p] & ctype_space) != 0) p++; + if (*p != CHAR_NUMBER_SIGN) break; + p++; + while (*p != CHAR_NULL) + { + if (IS_NEWLINE(p)) /* For non-fixed-length newline cases, */ + { /* IS_NEWLINE sets cd->nllen. */ + p += cd->nllen; + break; + } + p++; +#ifdef SUPPORT_UTF + if (utf) FORWARDCHAR(p); +#endif + } /* Loop for comment characters */ + } /* Loop for multiple comments */ + ptr = p - 1; /* Character before the next significant one. */ + } + + /* We also need to skip over (?# comments, which are not dependent on + extended mode. */ + + if (ptr[1] == CHAR_LEFT_PARENTHESIS && ptr[2] == CHAR_QUESTION_MARK && + ptr[3] == CHAR_NUMBER_SIGN) + { + ptr += 4; + while (*ptr != CHAR_NULL && *ptr != CHAR_RIGHT_PARENTHESIS) ptr++; + if (*ptr == CHAR_NULL) + { + *errorcodeptr = ERR18; + goto FAILED; + } + } + + /* If the next character is '+', we have a possessive quantifier. This + implies greediness, whatever the setting of the PCRE_UNGREEDY option. + If the next character is '?' this is a minimizing repeat, by default, + but if PCRE_UNGREEDY is set, it works the other way round. We change the + repeat type to the non-default. */ + + if (ptr[1] == CHAR_PLUS) + { + repeat_type = 0; /* Force greedy */ + possessive_quantifier = TRUE; + ptr++; + } + else if (ptr[1] == CHAR_QUESTION_MARK) + { + repeat_type = greedy_non_default; + ptr++; + } + else repeat_type = greedy_default; + + /* If previous was a recursion call, wrap it in atomic brackets so that + previous becomes the atomic group. All recursions were so wrapped in the + past, but it no longer happens for non-repeated recursions. In fact, the + repeated ones could be re-implemented independently so as not to need this, + but for the moment we rely on the code for repeating groups. */ + + if (*previous == OP_RECURSE) + { + memmove(previous + 1 + LINK_SIZE, previous, IN_UCHARS(1 + LINK_SIZE)); + *previous = OP_ONCE; + PUT(previous, 1, 2 + 2*LINK_SIZE); + previous[2 + 2*LINK_SIZE] = OP_KET; + PUT(previous, 3 + 2*LINK_SIZE, 2 + 2*LINK_SIZE); + code += 2 + 2 * LINK_SIZE; + length_prevgroup = 3 + 3*LINK_SIZE; + + /* When actually compiling, we need to check whether this was a forward + reference, and if so, adjust the offset. */ + + if (lengthptr == NULL && cd->hwm >= cd->start_workspace + LINK_SIZE) + { + int offset = GET(cd->hwm, -LINK_SIZE); + if (offset == previous + 1 - cd->start_code) + PUT(cd->hwm, -LINK_SIZE, offset + 1 + LINK_SIZE); + } + } + + /* Now handle repetition for the different types of item. */ + + /* If previous was a character or negated character match, abolish the item + and generate a repeat item instead. If a char item has a minimum of more + than one, ensure that it is set in reqchar - it might not be if a sequence + such as x{3} is the first thing in a branch because the x will have gone + into firstchar instead. */ + + if (*previous == OP_CHAR || *previous == OP_CHARI + || *previous == OP_NOT || *previous == OP_NOTI) + { + switch (*previous) + { + default: /* Make compiler happy. */ + case OP_CHAR: op_type = OP_STAR - OP_STAR; break; + case OP_CHARI: op_type = OP_STARI - OP_STAR; break; + case OP_NOT: op_type = OP_NOTSTAR - OP_STAR; break; + case OP_NOTI: op_type = OP_NOTSTARI - OP_STAR; break; + } + + /* Deal with UTF characters that take up more than one character. It's + easier to write this out separately than try to macrify it. Use c to + hold the length of the character in bytes, plus UTF_LENGTH to flag that + it's a length rather than a small character. */ + +#if defined SUPPORT_UTF && !defined COMPILE_PCRE32 + if (utf && NOT_FIRSTCHAR(code[-1])) + { + pcre_uchar *lastchar = code - 1; + BACKCHAR(lastchar); + c = (int)(code - lastchar); /* Length of UTF-8 character */ + memcpy(utf_chars, lastchar, IN_UCHARS(c)); /* Save the char */ + c |= UTF_LENGTH; /* Flag c as a length */ + } + else +#endif /* SUPPORT_UTF */ + + /* Handle the case of a single charater - either with no UTF support, or + with UTF disabled, or for a single character UTF character. */ + { + c = code[-1]; + if (*previous <= OP_CHARI && repeat_min > 1) + { + reqchar = c; + reqcharflags = req_caseopt | cd->req_varyopt; + } + } + + goto OUTPUT_SINGLE_REPEAT; /* Code shared with single character types */ + } + + /* If previous was a character type match (\d or similar), abolish it and + create a suitable repeat item. The code is shared with single-character + repeats by setting op_type to add a suitable offset into repeat_type. Note + the the Unicode property types will be present only when SUPPORT_UCP is + defined, but we don't wrap the little bits of code here because it just + makes it horribly messy. */ + + else if (*previous < OP_EODN) + { + pcre_uchar *oldcode; + int prop_type, prop_value; + op_type = OP_TYPESTAR - OP_STAR; /* Use type opcodes */ + c = *previous; + + OUTPUT_SINGLE_REPEAT: + if (*previous == OP_PROP || *previous == OP_NOTPROP) + { + prop_type = previous[1]; + prop_value = previous[2]; + } + else prop_type = prop_value = -1; + + oldcode = code; + code = previous; /* Usually overwrite previous item */ + + /* If the maximum is zero then the minimum must also be zero; Perl allows + this case, so we do too - by simply omitting the item altogether. */ + + if (repeat_max == 0) goto END_REPEAT; + + /* Combine the op_type with the repeat_type */ + + repeat_type += op_type; + + /* A minimum of zero is handled either as the special case * or ?, or as + an UPTO, with the maximum given. */ + + if (repeat_min == 0) + { + if (repeat_max == -1) *code++ = OP_STAR + repeat_type; + else if (repeat_max == 1) *code++ = OP_QUERY + repeat_type; + else + { + *code++ = OP_UPTO + repeat_type; + PUT2INC(code, 0, repeat_max); + } + } + + /* A repeat minimum of 1 is optimized into some special cases. If the + maximum is unlimited, we use OP_PLUS. Otherwise, the original item is + left in place and, if the maximum is greater than 1, we use OP_UPTO with + one less than the maximum. */ + + else if (repeat_min == 1) + { + if (repeat_max == -1) + *code++ = OP_PLUS + repeat_type; + else + { + code = oldcode; /* leave previous item in place */ + if (repeat_max == 1) goto END_REPEAT; + *code++ = OP_UPTO + repeat_type; + PUT2INC(code, 0, repeat_max - 1); + } + } + + /* The case {n,n} is just an EXACT, while the general case {n,m} is + handled as an EXACT followed by an UPTO. */ + + else + { + *code++ = OP_EXACT + op_type; /* NB EXACT doesn't have repeat_type */ + PUT2INC(code, 0, repeat_min); + + /* If the maximum is unlimited, insert an OP_STAR. Before doing so, + we have to insert the character for the previous code. For a repeated + Unicode property match, there are two extra bytes that define the + required property. In UTF-8 mode, long characters have their length in + c, with the UTF_LENGTH bit as a flag. */ + + if (repeat_max < 0) + { +#if defined SUPPORT_UTF && !defined COMPILE_PCRE32 + if (utf && (c & UTF_LENGTH) != 0) + { + memcpy(code, utf_chars, IN_UCHARS(c & 7)); + code += c & 7; + } + else +#endif + { + *code++ = c; + if (prop_type >= 0) + { + *code++ = prop_type; + *code++ = prop_value; + } + } + *code++ = OP_STAR + repeat_type; + } + + /* Else insert an UPTO if the max is greater than the min, again + preceded by the character, for the previously inserted code. If the + UPTO is just for 1 instance, we can use QUERY instead. */ + + else if (repeat_max != repeat_min) + { +#if defined SUPPORT_UTF && !defined COMPILE_PCRE32 + if (utf && (c & UTF_LENGTH) != 0) + { + memcpy(code, utf_chars, IN_UCHARS(c & 7)); + code += c & 7; + } + else +#endif + *code++ = c; + if (prop_type >= 0) + { + *code++ = prop_type; + *code++ = prop_value; + } + repeat_max -= repeat_min; + + if (repeat_max == 1) + { + *code++ = OP_QUERY + repeat_type; + } + else + { + *code++ = OP_UPTO + repeat_type; + PUT2INC(code, 0, repeat_max); + } + } + } + + /* The character or character type itself comes last in all cases. */ + +#if defined SUPPORT_UTF && !defined COMPILE_PCRE32 + if (utf && (c & UTF_LENGTH) != 0) + { + memcpy(code, utf_chars, IN_UCHARS(c & 7)); + code += c & 7; + } + else +#endif + *code++ = c; + + /* For a repeated Unicode property match, there are two extra bytes that + define the required property. */ + +#ifdef SUPPORT_UCP + if (prop_type >= 0) + { + *code++ = prop_type; + *code++ = prop_value; + } +#endif + } + + /* If previous was a character class or a back reference, we put the repeat + stuff after it, but just skip the item if the repeat was {0,0}. */ + + else if (*previous == OP_CLASS || *previous == OP_NCLASS || +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 + *previous == OP_XCLASS || +#endif + *previous == OP_REF || *previous == OP_REFI || + *previous == OP_DNREF || *previous == OP_DNREFI) + { + if (repeat_max == 0) + { + code = previous; + goto END_REPEAT; + } + + if (repeat_min == 0 && repeat_max == -1) + *code++ = OP_CRSTAR + repeat_type; + else if (repeat_min == 1 && repeat_max == -1) + *code++ = OP_CRPLUS + repeat_type; + else if (repeat_min == 0 && repeat_max == 1) + *code++ = OP_CRQUERY + repeat_type; + else + { + *code++ = OP_CRRANGE + repeat_type; + PUT2INC(code, 0, repeat_min); + if (repeat_max == -1) repeat_max = 0; /* 2-byte encoding for max */ + PUT2INC(code, 0, repeat_max); + } + } + + /* If previous was a bracket group, we may have to replicate it in certain + cases. Note that at this point we can encounter only the "basic" bracket + opcodes such as BRA and CBRA, as this is the place where they get converted + into the more special varieties such as BRAPOS and SBRA. A test for >= + OP_ASSERT and <= OP_COND includes ASSERT, ASSERT_NOT, ASSERTBACK, + ASSERTBACK_NOT, ONCE, ONCE_NC, BRA, BRAPOS, CBRA, CBRAPOS, and COND. + Originally, PCRE did not allow repetition of assertions, but now it does, + for Perl compatibility. */ + + else if (*previous >= OP_ASSERT && *previous <= OP_COND) + { + register int i; + int len = (int)(code - previous); + size_t base_hwm_offset = item_hwm_offset; + pcre_uchar *bralink = NULL; + pcre_uchar *brazeroptr = NULL; + + /* Repeating a DEFINE group is pointless, but Perl allows the syntax, so + we just ignore the repeat. */ + + if (*previous == OP_COND && previous[LINK_SIZE+1] == OP_DEF) + goto END_REPEAT; + + /* There is no sense in actually repeating assertions. The only potential + use of repetition is in cases when the assertion is optional. Therefore, + if the minimum is greater than zero, just ignore the repeat. If the + maximum is not zero or one, set it to 1. */ + + if (*previous < OP_ONCE) /* Assertion */ + { + if (repeat_min > 0) goto END_REPEAT; + if (repeat_max < 0 || repeat_max > 1) repeat_max = 1; + } + + /* The case of a zero minimum is special because of the need to stick + OP_BRAZERO in front of it, and because the group appears once in the + data, whereas in other cases it appears the minimum number of times. For + this reason, it is simplest to treat this case separately, as otherwise + the code gets far too messy. There are several special subcases when the + minimum is zero. */ + + if (repeat_min == 0) + { + /* If the maximum is also zero, we used to just omit the group from the + output altogether, like this: + + ** if (repeat_max == 0) + ** { + ** code = previous; + ** goto END_REPEAT; + ** } + + However, that fails when a group or a subgroup within it is referenced + as a subroutine from elsewhere in the pattern, so now we stick in + OP_SKIPZERO in front of it so that it is skipped on execution. As we + don't have a list of which groups are referenced, we cannot do this + selectively. + + If the maximum is 1 or unlimited, we just have to stick in the BRAZERO + and do no more at this point. However, we do need to adjust any + OP_RECURSE calls inside the group that refer to the group itself or any + internal or forward referenced group, because the offset is from the + start of the whole regex. Temporarily terminate the pattern while doing + this. */ + + if (repeat_max <= 1) /* Covers 0, 1, and unlimited */ + { + *code = OP_END; + adjust_recurse(previous, 1, utf, cd, item_hwm_offset); + memmove(previous + 1, previous, IN_UCHARS(len)); + code++; + if (repeat_max == 0) + { + *previous++ = OP_SKIPZERO; + goto END_REPEAT; + } + brazeroptr = previous; /* Save for possessive optimizing */ + *previous++ = OP_BRAZERO + repeat_type; + } + + /* If the maximum is greater than 1 and limited, we have to replicate + in a nested fashion, sticking OP_BRAZERO before each set of brackets. + The first one has to be handled carefully because it's the original + copy, which has to be moved up. The remainder can be handled by code + that is common with the non-zero minimum case below. We have to + adjust the value or repeat_max, since one less copy is required. Once + again, we may have to adjust any OP_RECURSE calls inside the group. */ + + else + { + int offset; + *code = OP_END; + adjust_recurse(previous, 2 + LINK_SIZE, utf, cd, item_hwm_offset); + memmove(previous + 2 + LINK_SIZE, previous, IN_UCHARS(len)); + code += 2 + LINK_SIZE; + *previous++ = OP_BRAZERO + repeat_type; + *previous++ = OP_BRA; + + /* We chain together the bracket offset fields that have to be + filled in later when the ends of the brackets are reached. */ + + offset = (bralink == NULL)? 0 : (int)(previous - bralink); + bralink = previous; + PUTINC(previous, 0, offset); + } + + repeat_max--; + } + + /* If the minimum is greater than zero, replicate the group as many + times as necessary, and adjust the maximum to the number of subsequent + copies that we need. If we set a first char from the group, and didn't + set a required char, copy the latter from the former. If there are any + forward reference subroutine calls in the group, there will be entries on + the workspace list; replicate these with an appropriate increment. */ + + else + { + if (repeat_min > 1) + { + /* In the pre-compile phase, we don't actually do the replication. We + just adjust the length as if we had. Do some paranoid checks for + potential integer overflow. The INT64_OR_DOUBLE type is a 64-bit + integer type when available, otherwise double. */ + + if (lengthptr != NULL) + { + int delta = (repeat_min - 1)*length_prevgroup; + if ((INT64_OR_DOUBLE)(repeat_min - 1)* + (INT64_OR_DOUBLE)length_prevgroup > + (INT64_OR_DOUBLE)INT_MAX || + OFLOW_MAX - *lengthptr < delta) + { + *errorcodeptr = ERR20; + goto FAILED; + } + *lengthptr += delta; + } + + /* This is compiling for real. If there is a set first byte for + the group, and we have not yet set a "required byte", set it. Make + sure there is enough workspace for copying forward references before + doing the copy. */ + + else + { + if (groupsetfirstchar && reqcharflags < 0) + { + reqchar = firstchar; + reqcharflags = firstcharflags; + } + + for (i = 1; i < repeat_min; i++) + { + pcre_uchar *hc; + size_t this_hwm_offset = cd->hwm - cd->start_workspace; + memcpy(code, previous, IN_UCHARS(len)); + + while (cd->hwm > cd->start_workspace + cd->workspace_size - + WORK_SIZE_SAFETY_MARGIN - + (this_hwm_offset - base_hwm_offset)) + { + *errorcodeptr = expand_workspace(cd); + if (*errorcodeptr != 0) goto FAILED; + } + + for (hc = (pcre_uchar *)cd->start_workspace + base_hwm_offset; + hc < (pcre_uchar *)cd->start_workspace + this_hwm_offset; + hc += LINK_SIZE) + { + PUT(cd->hwm, 0, GET(hc, 0) + len); + cd->hwm += LINK_SIZE; + } + base_hwm_offset = this_hwm_offset; + code += len; + } + } + } + + if (repeat_max > 0) repeat_max -= repeat_min; + } + + /* This code is common to both the zero and non-zero minimum cases. If + the maximum is limited, it replicates the group in a nested fashion, + remembering the bracket starts on a stack. In the case of a zero minimum, + the first one was set up above. In all cases the repeat_max now specifies + the number of additional copies needed. Again, we must remember to + replicate entries on the forward reference list. */ + + if (repeat_max >= 0) + { + /* In the pre-compile phase, we don't actually do the replication. We + just adjust the length as if we had. For each repetition we must add 1 + to the length for BRAZERO and for all but the last repetition we must + add 2 + 2*LINKSIZE to allow for the nesting that occurs. Do some + paranoid checks to avoid integer overflow. The INT64_OR_DOUBLE type is + a 64-bit integer type when available, otherwise double. */ + + if (lengthptr != NULL && repeat_max > 0) + { + int delta = repeat_max * (length_prevgroup + 1 + 2 + 2*LINK_SIZE) - + 2 - 2*LINK_SIZE; /* Last one doesn't nest */ + if ((INT64_OR_DOUBLE)repeat_max * + (INT64_OR_DOUBLE)(length_prevgroup + 1 + 2 + 2*LINK_SIZE) + > (INT64_OR_DOUBLE)INT_MAX || + OFLOW_MAX - *lengthptr < delta) + { + *errorcodeptr = ERR20; + goto FAILED; + } + *lengthptr += delta; + } + + /* This is compiling for real */ + + else for (i = repeat_max - 1; i >= 0; i--) + { + pcre_uchar *hc; + size_t this_hwm_offset = cd->hwm - cd->start_workspace; + + *code++ = OP_BRAZERO + repeat_type; + + /* All but the final copy start a new nesting, maintaining the + chain of brackets outstanding. */ + + if (i != 0) + { + int offset; + *code++ = OP_BRA; + offset = (bralink == NULL)? 0 : (int)(code - bralink); + bralink = code; + PUTINC(code, 0, offset); + } + + memcpy(code, previous, IN_UCHARS(len)); + + /* Ensure there is enough workspace for forward references before + copying them. */ + + while (cd->hwm > cd->start_workspace + cd->workspace_size - + WORK_SIZE_SAFETY_MARGIN - + (this_hwm_offset - base_hwm_offset)) + { + *errorcodeptr = expand_workspace(cd); + if (*errorcodeptr != 0) goto FAILED; + } + + for (hc = (pcre_uchar *)cd->start_workspace + base_hwm_offset; + hc < (pcre_uchar *)cd->start_workspace + this_hwm_offset; + hc += LINK_SIZE) + { + PUT(cd->hwm, 0, GET(hc, 0) + len + ((i != 0)? 2+LINK_SIZE : 1)); + cd->hwm += LINK_SIZE; + } + base_hwm_offset = this_hwm_offset; + code += len; + } + + /* Now chain through the pending brackets, and fill in their length + fields (which are holding the chain links pro tem). */ + + while (bralink != NULL) + { + int oldlinkoffset; + int offset = (int)(code - bralink + 1); + pcre_uchar *bra = code - offset; + oldlinkoffset = GET(bra, 1); + bralink = (oldlinkoffset == 0)? NULL : bralink - oldlinkoffset; + *code++ = OP_KET; + PUTINC(code, 0, offset); + PUT(bra, 1, offset); + } + } + + /* If the maximum is unlimited, set a repeater in the final copy. For + ONCE brackets, that's all we need to do. However, possessively repeated + ONCE brackets can be converted into non-capturing brackets, as the + behaviour of (?:xx)++ is the same as (?>xx)++ and this saves having to + deal with possessive ONCEs specially. + + Otherwise, when we are doing the actual compile phase, check to see + whether this group is one that could match an empty string. If so, + convert the initial operator to the S form (e.g. OP_BRA -> OP_SBRA) so + that runtime checking can be done. [This check is also applied to ONCE + groups at runtime, but in a different way.] + + Then, if the quantifier was possessive and the bracket is not a + conditional, we convert the BRA code to the POS form, and the KET code to + KETRPOS. (It turns out to be convenient at runtime to detect this kind of + subpattern at both the start and at the end.) The use of special opcodes + makes it possible to reduce greatly the stack usage in pcre_exec(). If + the group is preceded by OP_BRAZERO, convert this to OP_BRAPOSZERO. + + Then, if the minimum number of matches is 1 or 0, cancel the possessive + flag so that the default action below, of wrapping everything inside + atomic brackets, does not happen. When the minimum is greater than 1, + there will be earlier copies of the group, and so we still have to wrap + the whole thing. */ + + else + { + pcre_uchar *ketcode = code - 1 - LINK_SIZE; + pcre_uchar *bracode = ketcode - GET(ketcode, 1); + + /* Convert possessive ONCE brackets to non-capturing */ + + if ((*bracode == OP_ONCE || *bracode == OP_ONCE_NC) && + possessive_quantifier) *bracode = OP_BRA; + + /* For non-possessive ONCE brackets, all we need to do is to + set the KET. */ + + if (*bracode == OP_ONCE || *bracode == OP_ONCE_NC) + *ketcode = OP_KETRMAX + repeat_type; + + /* Handle non-ONCE brackets and possessive ONCEs (which have been + converted to non-capturing above). */ + + else + { + /* In the compile phase, check for empty string matching. */ + + if (lengthptr == NULL) + { + pcre_uchar *scode = bracode; + do + { + if (could_be_empty_branch(scode, ketcode, utf, cd, NULL)) + { + *bracode += OP_SBRA - OP_BRA; + break; + } + scode += GET(scode, 1); + } + while (*scode == OP_ALT); + } + + /* A conditional group with only one branch has an implicit empty + alternative branch. */ + + if (*bracode == OP_COND && bracode[GET(bracode,1)] != OP_ALT) + *bracode = OP_SCOND; + + /* Handle possessive quantifiers. */ + + if (possessive_quantifier) + { + /* For COND brackets, we wrap the whole thing in a possessively + repeated non-capturing bracket, because we have not invented POS + versions of the COND opcodes. Because we are moving code along, we + must ensure that any pending recursive references are updated. */ + + if (*bracode == OP_COND || *bracode == OP_SCOND) + { + int nlen = (int)(code - bracode); + *code = OP_END; + adjust_recurse(bracode, 1 + LINK_SIZE, utf, cd, item_hwm_offset); + memmove(bracode + 1 + LINK_SIZE, bracode, IN_UCHARS(nlen)); + code += 1 + LINK_SIZE; + nlen += 1 + LINK_SIZE; + *bracode = (*bracode == OP_COND)? OP_BRAPOS : OP_SBRAPOS; + *code++ = OP_KETRPOS; + PUTINC(code, 0, nlen); + PUT(bracode, 1, nlen); + } + + /* For non-COND brackets, we modify the BRA code and use KETRPOS. */ + + else + { + *bracode += 1; /* Switch to xxxPOS opcodes */ + *ketcode = OP_KETRPOS; + } + + /* If the minimum is zero, mark it as possessive, then unset the + possessive flag when the minimum is 0 or 1. */ + + if (brazeroptr != NULL) *brazeroptr = OP_BRAPOSZERO; + if (repeat_min < 2) possessive_quantifier = FALSE; + } + + /* Non-possessive quantifier */ + + else *ketcode = OP_KETRMAX + repeat_type; + } + } + } + + /* If previous is OP_FAIL, it was generated by an empty class [] in + JavaScript mode. The other ways in which OP_FAIL can be generated, that is + by (*FAIL) or (?!) set previous to NULL, which gives a "nothing to repeat" + error above. We can just ignore the repeat in JS case. */ + + else if (*previous == OP_FAIL) goto END_REPEAT; + + /* Else there's some kind of shambles */ + + else + { + *errorcodeptr = ERR11; + goto FAILED; + } + + /* If the character following a repeat is '+', possessive_quantifier is + TRUE. For some opcodes, there are special alternative opcodes for this + case. For anything else, we wrap the entire repeated item inside OP_ONCE + brackets. Logically, the '+' notation is just syntactic sugar, taken from + Sun's Java package, but the special opcodes can optimize it. + + Some (but not all) possessively repeated subpatterns have already been + completely handled in the code just above. For them, possessive_quantifier + is always FALSE at this stage. Note that the repeated item starts at + tempcode, not at previous, which might be the first part of a string whose + (former) last char we repeated. */ + + if (possessive_quantifier) + { + int len; + + /* Possessifying an EXACT quantifier has no effect, so we can ignore it. + However, QUERY, STAR, or UPTO may follow (for quantifiers such as {5,6}, + {5,}, or {5,10}). We skip over an EXACT item; if the length of what + remains is greater than zero, there's a further opcode that can be + handled. If not, do nothing, leaving the EXACT alone. */ + + switch(*tempcode) + { + case OP_TYPEEXACT: + tempcode += PRIV(OP_lengths)[*tempcode] + + ((tempcode[1 + IMM2_SIZE] == OP_PROP + || tempcode[1 + IMM2_SIZE] == OP_NOTPROP)? 2 : 0); + break; + + /* CHAR opcodes are used for exacts whose count is 1. */ + + case OP_CHAR: + case OP_CHARI: + case OP_NOT: + case OP_NOTI: + case OP_EXACT: + case OP_EXACTI: + case OP_NOTEXACT: + case OP_NOTEXACTI: + tempcode += PRIV(OP_lengths)[*tempcode]; +#ifdef SUPPORT_UTF + if (utf && HAS_EXTRALEN(tempcode[-1])) + tempcode += GET_EXTRALEN(tempcode[-1]); +#endif + break; + + /* For the class opcodes, the repeat operator appears at the end; + adjust tempcode to point to it. */ + + case OP_CLASS: + case OP_NCLASS: + tempcode += 1 + 32/sizeof(pcre_uchar); + break; + +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 + case OP_XCLASS: + tempcode += GET(tempcode, 1); + break; +#endif + } + + /* If tempcode is equal to code (which points to the end of the repeated + item), it means we have skipped an EXACT item but there is no following + QUERY, STAR, or UPTO; the value of len will be 0, and we do nothing. In + all other cases, tempcode will be pointing to the repeat opcode, and will + be less than code, so the value of len will be greater than 0. */ + + len = (int)(code - tempcode); + if (len > 0) + { + unsigned int repcode = *tempcode; + + /* There is a table for possessifying opcodes, all of which are less + than OP_CALLOUT. A zero entry means there is no possessified version. + */ + + if (repcode < OP_CALLOUT && opcode_possessify[repcode] > 0) + *tempcode = opcode_possessify[repcode]; + + /* For opcode without a special possessified version, wrap the item in + ONCE brackets. Because we are moving code along, we must ensure that any + pending recursive references are updated. */ + + else + { + *code = OP_END; + adjust_recurse(tempcode, 1 + LINK_SIZE, utf, cd, item_hwm_offset); + memmove(tempcode + 1 + LINK_SIZE, tempcode, IN_UCHARS(len)); + code += 1 + LINK_SIZE; + len += 1 + LINK_SIZE; + tempcode[0] = OP_ONCE; + *code++ = OP_KET; + PUTINC(code, 0, len); + PUT(tempcode, 1, len); + } + } + +#ifdef NEVER + if (len > 0) switch (*tempcode) + { + case OP_STAR: *tempcode = OP_POSSTAR; break; + case OP_PLUS: *tempcode = OP_POSPLUS; break; + case OP_QUERY: *tempcode = OP_POSQUERY; break; + case OP_UPTO: *tempcode = OP_POSUPTO; break; + + case OP_STARI: *tempcode = OP_POSSTARI; break; + case OP_PLUSI: *tempcode = OP_POSPLUSI; break; + case OP_QUERYI: *tempcode = OP_POSQUERYI; break; + case OP_UPTOI: *tempcode = OP_POSUPTOI; break; + + case OP_NOTSTAR: *tempcode = OP_NOTPOSSTAR; break; + case OP_NOTPLUS: *tempcode = OP_NOTPOSPLUS; break; + case OP_NOTQUERY: *tempcode = OP_NOTPOSQUERY; break; + case OP_NOTUPTO: *tempcode = OP_NOTPOSUPTO; break; + + case OP_NOTSTARI: *tempcode = OP_NOTPOSSTARI; break; + case OP_NOTPLUSI: *tempcode = OP_NOTPOSPLUSI; break; + case OP_NOTQUERYI: *tempcode = OP_NOTPOSQUERYI; break; + case OP_NOTUPTOI: *tempcode = OP_NOTPOSUPTOI; break; + + case OP_TYPESTAR: *tempcode = OP_TYPEPOSSTAR; break; + case OP_TYPEPLUS: *tempcode = OP_TYPEPOSPLUS; break; + case OP_TYPEQUERY: *tempcode = OP_TYPEPOSQUERY; break; + case OP_TYPEUPTO: *tempcode = OP_TYPEPOSUPTO; break; + + case OP_CRSTAR: *tempcode = OP_CRPOSSTAR; break; + case OP_CRPLUS: *tempcode = OP_CRPOSPLUS; break; + case OP_CRQUERY: *tempcode = OP_CRPOSQUERY; break; + case OP_CRRANGE: *tempcode = OP_CRPOSRANGE; break; + + /* Because we are moving code along, we must ensure that any + pending recursive references are updated. */ + + default: + *code = OP_END; + adjust_recurse(tempcode, 1 + LINK_SIZE, utf, cd, item_hwm_offset); + memmove(tempcode + 1 + LINK_SIZE, tempcode, IN_UCHARS(len)); + code += 1 + LINK_SIZE; + len += 1 + LINK_SIZE; + tempcode[0] = OP_ONCE; + *code++ = OP_KET; + PUTINC(code, 0, len); + PUT(tempcode, 1, len); + break; + } +#endif + } + + /* In all case we no longer have a previous item. We also set the + "follows varying string" flag for subsequently encountered reqchars if + it isn't already set and we have just passed a varying length item. */ + + END_REPEAT: + previous = NULL; + cd->req_varyopt |= reqvary; + break; + + + /* ===================================================================*/ + /* Start of nested parenthesized sub-expression, or comment or lookahead or + lookbehind or option setting or condition or all the other extended + parenthesis forms. */ + + case CHAR_LEFT_PARENTHESIS: + ptr++; + + /* Now deal with various "verbs" that can be introduced by '*'. */ + + if (ptr[0] == CHAR_ASTERISK && (ptr[1] == ':' + || (MAX_255(ptr[1]) && ((cd->ctypes[ptr[1]] & ctype_letter) != 0)))) + { + int i, namelen; + int arglen = 0; + const char *vn = verbnames; + const pcre_uchar *name = ptr + 1; + const pcre_uchar *arg = NULL; + previous = NULL; + ptr++; + while (MAX_255(*ptr) && (cd->ctypes[*ptr] & ctype_letter) != 0) ptr++; + namelen = (int)(ptr - name); + + /* It appears that Perl allows any characters whatsoever, other than + a closing parenthesis, to appear in arguments, so we no longer insist on + letters, digits, and underscores. */ + + if (*ptr == CHAR_COLON) + { + arg = ++ptr; + while (*ptr != CHAR_NULL && *ptr != CHAR_RIGHT_PARENTHESIS) ptr++; + arglen = (int)(ptr - arg); + if ((unsigned int)arglen > MAX_MARK) + { + *errorcodeptr = ERR75; + goto FAILED; + } + } + + if (*ptr != CHAR_RIGHT_PARENTHESIS) + { + *errorcodeptr = ERR60; + goto FAILED; + } + + /* Scan the table of verb names */ + + for (i = 0; i < verbcount; i++) + { + if (namelen == verbs[i].len && + STRNCMP_UC_C8(name, vn, namelen) == 0) + { + int setverb; + + /* Check for open captures before ACCEPT and convert it to + ASSERT_ACCEPT if in an assertion. */ + + if (verbs[i].op == OP_ACCEPT) + { + open_capitem *oc; + if (arglen != 0) + { + *errorcodeptr = ERR59; + goto FAILED; + } + cd->had_accept = TRUE; + for (oc = cd->open_caps; oc != NULL; oc = oc->next) + { + if (lengthptr != NULL) + { +#ifdef COMPILE_PCRE8 + *lengthptr += 1 + IMM2_SIZE; +#elif defined COMPILE_PCRE16 + *lengthptr += 2 + IMM2_SIZE; +#elif defined COMPILE_PCRE32 + *lengthptr += 4 + IMM2_SIZE; +#endif + } + else + { + *code++ = OP_CLOSE; + PUT2INC(code, 0, oc->number); + } + } + setverb = *code++ = + (cd->assert_depth > 0)? OP_ASSERT_ACCEPT : OP_ACCEPT; + + /* Do not set firstchar after *ACCEPT */ + if (firstcharflags == REQ_UNSET) firstcharflags = REQ_NONE; + } + + /* Handle other cases with/without an argument */ + + else if (arglen == 0) + { + if (verbs[i].op < 0) /* Argument is mandatory */ + { + *errorcodeptr = ERR66; + goto FAILED; + } + setverb = *code++ = verbs[i].op; + } + + else + { + if (verbs[i].op_arg < 0) /* Argument is forbidden */ + { + *errorcodeptr = ERR59; + goto FAILED; + } + setverb = *code++ = verbs[i].op_arg; + if (lengthptr != NULL) /* In pass 1 just add in the length */ + { /* to avoid potential workspace */ + *lengthptr += arglen; /* overflow. */ + *code++ = 0; + } + else + { + *code++ = arglen; + memcpy(code, arg, IN_UCHARS(arglen)); + code += arglen; + } + *code++ = 0; + } + + switch (setverb) + { + case OP_THEN: + case OP_THEN_ARG: + cd->external_flags |= PCRE_HASTHEN; + break; + + case OP_PRUNE: + case OP_PRUNE_ARG: + case OP_SKIP: + case OP_SKIP_ARG: + cd->had_pruneorskip = TRUE; + break; + } + + break; /* Found verb, exit loop */ + } + + vn += verbs[i].len + 1; + } + + if (i < verbcount) continue; /* Successfully handled a verb */ + *errorcodeptr = ERR60; /* Verb not recognized */ + goto FAILED; + } + + /* Initialize for "real" parentheses */ + + newoptions = options; + skipbytes = 0; + bravalue = OP_CBRA; + item_hwm_offset = cd->hwm - cd->start_workspace; + reset_bracount = FALSE; + + /* Deal with the extended parentheses; all are introduced by '?', and the + appearance of any of them means that this is not a capturing group. */ + + if (*ptr == CHAR_QUESTION_MARK) + { + int i, set, unset, namelen; + int *optset; + const pcre_uchar *name; + pcre_uchar *slot; + + switch (*(++ptr)) + { + /* ------------------------------------------------------------ */ + case CHAR_VERTICAL_LINE: /* Reset capture count for each branch */ + reset_bracount = TRUE; + cd->dupgroups = TRUE; /* Record (?| encountered */ + /* Fall through */ + + /* ------------------------------------------------------------ */ + case CHAR_COLON: /* Non-capturing bracket */ + bravalue = OP_BRA; + ptr++; + break; + + + /* ------------------------------------------------------------ */ + case CHAR_LEFT_PARENTHESIS: + bravalue = OP_COND; /* Conditional group */ + tempptr = ptr; + + /* A condition can be an assertion, a number (referring to a numbered + group's having been set), a name (referring to a named group), or 'R', + referring to recursion. R and R&name are also permitted for + recursion tests. + + There are ways of testing a named group: (?(name)) is used by Python; + Perl 5.10 onwards uses (?() or (?('name')). + + There is one unfortunate ambiguity, caused by history. 'R' can be the + recursive thing or the name 'R' (and similarly for 'R' followed by + digits). We look for a name first; if not found, we try the other case. + + For compatibility with auto-callouts, we allow a callout to be + specified before a condition that is an assertion. First, check for the + syntax of a callout; if found, adjust the temporary pointer that is + used to check for an assertion condition. That's all that is needed! */ + + if (ptr[1] == CHAR_QUESTION_MARK && ptr[2] == CHAR_C) + { + for (i = 3;; i++) if (!IS_DIGIT(ptr[i])) break; + if (ptr[i] == CHAR_RIGHT_PARENTHESIS) + tempptr += i + 1; + + /* tempptr should now be pointing to the opening parenthesis of the + assertion condition. */ + + if (*tempptr != CHAR_LEFT_PARENTHESIS) + { + *errorcodeptr = ERR28; + goto FAILED; + } + } + + /* For conditions that are assertions, check the syntax, and then exit + the switch. This will take control down to where bracketed groups, + including assertions, are processed. */ + + if (tempptr[1] == CHAR_QUESTION_MARK && + (tempptr[2] == CHAR_EQUALS_SIGN || + tempptr[2] == CHAR_EXCLAMATION_MARK || + (tempptr[2] == CHAR_LESS_THAN_SIGN && + (tempptr[3] == CHAR_EQUALS_SIGN || + tempptr[3] == CHAR_EXCLAMATION_MARK)))) + { + cd->iscondassert = TRUE; + break; + } + + /* Other conditions use OP_CREF/OP_DNCREF/OP_RREF/OP_DNRREF, and all + need to skip at least 1+IMM2_SIZE bytes at the start of the group. */ + + code[1+LINK_SIZE] = OP_CREF; + skipbytes = 1+IMM2_SIZE; + refsign = -1; /* => not a number */ + namelen = -1; /* => not a name; must set to avoid warning */ + name = NULL; /* Always set to avoid warning */ + recno = 0; /* Always set to avoid warning */ + + /* Check for a test for recursion in a named group. */ + + ptr++; + if (*ptr == CHAR_R && ptr[1] == CHAR_AMPERSAND) + { + terminator = -1; + ptr += 2; + code[1+LINK_SIZE] = OP_RREF; /* Change the type of test */ + } + + /* Check for a test for a named group's having been set, using the Perl + syntax (?() or (?('name'), and also allow for the original PCRE + syntax of (?(name) or for (?(+n), (?(-n), and just (?(n). */ + + else if (*ptr == CHAR_LESS_THAN_SIGN) + { + terminator = CHAR_GREATER_THAN_SIGN; + ptr++; + } + else if (*ptr == CHAR_APOSTROPHE) + { + terminator = CHAR_APOSTROPHE; + ptr++; + } + else + { + terminator = CHAR_NULL; + if (*ptr == CHAR_MINUS || *ptr == CHAR_PLUS) refsign = *ptr++; + else if (IS_DIGIT(*ptr)) refsign = 0; + } + + /* Handle a number */ + + if (refsign >= 0) + { + while (IS_DIGIT(*ptr)) + { + if (recno > INT_MAX / 10 - 1) /* Integer overflow */ + { + while (IS_DIGIT(*ptr)) ptr++; + *errorcodeptr = ERR61; + goto FAILED; + } + recno = recno * 10 + (int)(*ptr - CHAR_0); + ptr++; + } + } + + /* Otherwise we expect to read a name; anything else is an error. When + a name is one of a number of duplicates, a different opcode is used and + it needs more memory. Unfortunately we cannot tell whether a name is a + duplicate in the first pass, so we have to allow for more memory. */ + + else + { + if (IS_DIGIT(*ptr)) + { + *errorcodeptr = ERR84; + goto FAILED; + } + if (!MAX_255(*ptr) || (cd->ctypes[*ptr] & ctype_word) == 0) + { + *errorcodeptr = ERR28; /* Assertion expected */ + goto FAILED; + } + name = ptr++; + while (MAX_255(*ptr) && (cd->ctypes[*ptr] & ctype_word) != 0) + { + ptr++; + } + namelen = (int)(ptr - name); + if (lengthptr != NULL) skipbytes += IMM2_SIZE; + } + + /* Check the terminator */ + + if ((terminator > 0 && *ptr++ != (pcre_uchar)terminator) || + *ptr++ != CHAR_RIGHT_PARENTHESIS) + { + ptr--; /* Error offset */ + *errorcodeptr = ERR26; /* Malformed number or name */ + goto FAILED; + } + + /* Do no further checking in the pre-compile phase. */ + + if (lengthptr != NULL) break; + + /* In the real compile we do the work of looking for the actual + reference. If refsign is not negative, it means we have a number in + recno. */ + + if (refsign >= 0) + { + if (recno <= 0) + { + *errorcodeptr = ERR35; + goto FAILED; + } + if (refsign != 0) recno = (refsign == CHAR_MINUS)? + cd->bracount - recno + 1 : recno + cd->bracount; + if (recno <= 0 || recno > cd->final_bracount) + { + *errorcodeptr = ERR15; + goto FAILED; + } + PUT2(code, 2+LINK_SIZE, recno); + if (recno > cd->top_backref) cd->top_backref = recno; + break; + } + + /* Otherwise look for the name. */ + + slot = cd->name_table; + for (i = 0; i < cd->names_found; i++) + { + if (STRNCMP_UC_UC(name, slot+IMM2_SIZE, namelen) == 0 && + slot[IMM2_SIZE+namelen] == 0) break; + slot += cd->name_entry_size; + } + + /* Found the named subpattern. If the name is duplicated, add one to + the opcode to change CREF/RREF into DNCREF/DNRREF and insert + appropriate data values. Otherwise, just insert the unique subpattern + number. */ + + if (i < cd->names_found) + { + int offset = i++; + int count = 1; + recno = GET2(slot, 0); /* Number from first found */ + if (recno > cd->top_backref) cd->top_backref = recno; + for (; i < cd->names_found; i++) + { + slot += cd->name_entry_size; + if (STRNCMP_UC_UC(name, slot+IMM2_SIZE, namelen) != 0 || + (slot+IMM2_SIZE)[namelen] != 0) break; + count++; + } + + if (count > 1) + { + PUT2(code, 2+LINK_SIZE, offset); + PUT2(code, 2+LINK_SIZE+IMM2_SIZE, count); + skipbytes += IMM2_SIZE; + code[1+LINK_SIZE]++; + } + else /* Not a duplicated name */ + { + PUT2(code, 2+LINK_SIZE, recno); + } + } + + /* If terminator == CHAR_NULL it means that the name followed directly + after the opening parenthesis [e.g. (?(abc)...] and in this case there + are some further alternatives to try. For the cases where terminator != + CHAR_NULL [things like (?(... or (?('name')... or (?(R&name)... ] + we have now checked all the possibilities, so give an error. */ + + else if (terminator != CHAR_NULL) + { + *errorcodeptr = ERR15; + goto FAILED; + } + + /* Check for (?(R) for recursion. Allow digits after R to specify a + specific group number. */ + + else if (*name == CHAR_R) + { + recno = 0; + for (i = 1; i < namelen; i++) + { + if (!IS_DIGIT(name[i])) + { + *errorcodeptr = ERR15; + goto FAILED; + } + if (recno > INT_MAX / 10 - 1) /* Integer overflow */ + { + *errorcodeptr = ERR61; + goto FAILED; + } + recno = recno * 10 + name[i] - CHAR_0; + } + if (recno == 0) recno = RREF_ANY; + code[1+LINK_SIZE] = OP_RREF; /* Change test type */ + PUT2(code, 2+LINK_SIZE, recno); + } + + /* Similarly, check for the (?(DEFINE) "condition", which is always + false. */ + + else if (namelen == 6 && STRNCMP_UC_C8(name, STRING_DEFINE, 6) == 0) + { + code[1+LINK_SIZE] = OP_DEF; + skipbytes = 1; + } + + /* Reference to an unidentified subpattern. */ + + else + { + *errorcodeptr = ERR15; + goto FAILED; + } + break; + + + /* ------------------------------------------------------------ */ + case CHAR_EQUALS_SIGN: /* Positive lookahead */ + bravalue = OP_ASSERT; + cd->assert_depth += 1; + ptr++; + break; + + /* Optimize (?!) to (*FAIL) unless it is quantified - which is a weird + thing to do, but Perl allows all assertions to be quantified, and when + they contain capturing parentheses there may be a potential use for + this feature. Not that that applies to a quantified (?!) but we allow + it for uniformity. */ + + /* ------------------------------------------------------------ */ + case CHAR_EXCLAMATION_MARK: /* Negative lookahead */ + ptr++; + if (*ptr == CHAR_RIGHT_PARENTHESIS && ptr[1] != CHAR_ASTERISK && + ptr[1] != CHAR_PLUS && ptr[1] != CHAR_QUESTION_MARK && + (ptr[1] != CHAR_LEFT_CURLY_BRACKET || !is_counted_repeat(ptr+2))) + { + *code++ = OP_FAIL; + previous = NULL; + continue; + } + bravalue = OP_ASSERT_NOT; + cd->assert_depth += 1; + break; + + + /* ------------------------------------------------------------ */ + case CHAR_LESS_THAN_SIGN: /* Lookbehind or named define */ + switch (ptr[1]) + { + case CHAR_EQUALS_SIGN: /* Positive lookbehind */ + bravalue = OP_ASSERTBACK; + cd->assert_depth += 1; + ptr += 2; + break; + + case CHAR_EXCLAMATION_MARK: /* Negative lookbehind */ + bravalue = OP_ASSERTBACK_NOT; + cd->assert_depth += 1; + ptr += 2; + break; + + default: /* Could be name define, else bad */ + if (MAX_255(ptr[1]) && (cd->ctypes[ptr[1]] & ctype_word) != 0) + goto DEFINE_NAME; + ptr++; /* Correct offset for error */ + *errorcodeptr = ERR24; + goto FAILED; + } + break; + + + /* ------------------------------------------------------------ */ + case CHAR_GREATER_THAN_SIGN: /* One-time brackets */ + bravalue = OP_ONCE; + ptr++; + break; + + + /* ------------------------------------------------------------ */ + case CHAR_C: /* Callout - may be followed by digits; */ + previous_callout = code; /* Save for later completion */ + after_manual_callout = 1; /* Skip one item before completing */ + *code++ = OP_CALLOUT; + { + int n = 0; + ptr++; + while(IS_DIGIT(*ptr)) + { + n = n * 10 + *ptr++ - CHAR_0; + if (n > 255) + { + *errorcodeptr = ERR38; + goto FAILED; + } + } + if (*ptr != CHAR_RIGHT_PARENTHESIS) + { + *errorcodeptr = ERR39; + goto FAILED; + } + *code++ = n; + PUT(code, 0, (int)(ptr - cd->start_pattern + 1)); /* Pattern offset */ + PUT(code, LINK_SIZE, 0); /* Default length */ + code += 2 * LINK_SIZE; + } + previous = NULL; + continue; + + + /* ------------------------------------------------------------ */ + case CHAR_P: /* Python-style named subpattern handling */ + if (*(++ptr) == CHAR_EQUALS_SIGN || + *ptr == CHAR_GREATER_THAN_SIGN) /* Reference or recursion */ + { + is_recurse = *ptr == CHAR_GREATER_THAN_SIGN; + terminator = CHAR_RIGHT_PARENTHESIS; + goto NAMED_REF_OR_RECURSE; + } + else if (*ptr != CHAR_LESS_THAN_SIGN) /* Test for Python-style defn */ + { + *errorcodeptr = ERR41; + goto FAILED; + } + /* Fall through to handle (?P< as (?< is handled */ + + + /* ------------------------------------------------------------ */ + DEFINE_NAME: /* Come here from (?< handling */ + case CHAR_APOSTROPHE: + terminator = (*ptr == CHAR_LESS_THAN_SIGN)? + CHAR_GREATER_THAN_SIGN : CHAR_APOSTROPHE; + name = ++ptr; + if (IS_DIGIT(*ptr)) + { + *errorcodeptr = ERR84; /* Group name must start with non-digit */ + goto FAILED; + } + while (MAX_255(*ptr) && (cd->ctypes[*ptr] & ctype_word) != 0) ptr++; + namelen = (int)(ptr - name); + + /* In the pre-compile phase, do a syntax check, remember the longest + name, and then remember the group in a vector, expanding it if + necessary. Duplicates for the same number are skipped; other duplicates + are checked for validity. In the actual compile, there is nothing to + do. */ + + if (lengthptr != NULL) + { + named_group *ng; + pcre_uint32 number = cd->bracount + 1; + + if (*ptr != (pcre_uchar)terminator) + { + *errorcodeptr = ERR42; + goto FAILED; + } + + if (cd->names_found >= MAX_NAME_COUNT) + { + *errorcodeptr = ERR49; + goto FAILED; + } + + if (namelen + IMM2_SIZE + 1 > cd->name_entry_size) + { + cd->name_entry_size = namelen + IMM2_SIZE + 1; + if (namelen > MAX_NAME_SIZE) + { + *errorcodeptr = ERR48; + goto FAILED; + } + } + + /* Scan the list to check for duplicates. For duplicate names, if the + number is the same, break the loop, which causes the name to be + discarded; otherwise, if DUPNAMES is not set, give an error. + If it is set, allow the name with a different number, but continue + scanning in case this is a duplicate with the same number. For + non-duplicate names, give an error if the number is duplicated. */ + + ng = cd->named_groups; + for (i = 0; i < cd->names_found; i++, ng++) + { + if (namelen == ng->length && + STRNCMP_UC_UC(name, ng->name, namelen) == 0) + { + if (ng->number == number) break; + if ((options & PCRE_DUPNAMES) == 0) + { + *errorcodeptr = ERR43; + goto FAILED; + } + cd->dupnames = TRUE; /* Duplicate names exist */ + } + else if (ng->number == number) + { + *errorcodeptr = ERR65; + goto FAILED; + } + } + + if (i >= cd->names_found) /* Not a duplicate with same number */ + { + /* Increase the list size if necessary */ + + if (cd->names_found >= cd->named_group_list_size) + { + int newsize = cd->named_group_list_size * 2; + named_group *newspace = (PUBL(malloc)) + (newsize * sizeof(named_group)); + + if (newspace == NULL) + { + *errorcodeptr = ERR21; + goto FAILED; + } + + memcpy(newspace, cd->named_groups, + cd->named_group_list_size * sizeof(named_group)); + if (cd->named_group_list_size > NAMED_GROUP_LIST_SIZE) + (PUBL(free))((void *)cd->named_groups); + cd->named_groups = newspace; + cd->named_group_list_size = newsize; + } + + cd->named_groups[cd->names_found].name = name; + cd->named_groups[cd->names_found].length = namelen; + cd->named_groups[cd->names_found].number = number; + cd->names_found++; + } + } + + ptr++; /* Move past > or ' in both passes. */ + goto NUMBERED_GROUP; + + + /* ------------------------------------------------------------ */ + case CHAR_AMPERSAND: /* Perl recursion/subroutine syntax */ + terminator = CHAR_RIGHT_PARENTHESIS; + is_recurse = TRUE; + /* Fall through */ + + /* We come here from the Python syntax above that handles both + references (?P=name) and recursion (?P>name), as well as falling + through from the Perl recursion syntax (?&name). We also come here from + the Perl \k or \k'name' back reference syntax and the \k{name} + .NET syntax, and the Oniguruma \g<...> and \g'...' subroutine syntax. */ + + NAMED_REF_OR_RECURSE: + name = ++ptr; + if (IS_DIGIT(*ptr)) + { + *errorcodeptr = ERR84; /* Group name must start with non-digit */ + goto FAILED; + } + while (MAX_255(*ptr) && (cd->ctypes[*ptr] & ctype_word) != 0) ptr++; + namelen = (int)(ptr - name); + + /* In the pre-compile phase, do a syntax check. We used to just set + a dummy reference number, because it was not used in the first pass. + However, with the change of recursive back references to be atomic, + we have to look for the number so that this state can be identified, as + otherwise the incorrect length is computed. If it's not a backwards + reference, the dummy number will do. */ + + if (lengthptr != NULL) + { + named_group *ng; + recno = 0; + + if (namelen == 0) + { + *errorcodeptr = ERR62; + goto FAILED; + } + if (*ptr != (pcre_uchar)terminator) + { + *errorcodeptr = ERR42; + goto FAILED; + } + if (namelen > MAX_NAME_SIZE) + { + *errorcodeptr = ERR48; + goto FAILED; + } + + /* Count named back references. */ + + if (!is_recurse) cd->namedrefcount++; + + /* We have to allow for a named reference to a duplicated name (this + cannot be determined until the second pass). This needs an extra + 16-bit data item. */ + + *lengthptr += IMM2_SIZE; + + /* If this is a forward reference and we are within a (?|...) group, + the reference may end up as the number of a group which we are + currently inside, that is, it could be a recursive reference. In the + real compile this will be picked up and the reference wrapped with + OP_ONCE to make it atomic, so we must space in case this occurs. */ + + /* In fact, this can happen for a non-forward reference because + another group with the same number might be created later. This + issue is fixed "properly" in PCRE2. As PCRE1 is now in maintenance + only mode, we finesse the bug by allowing more memory always. */ + + *lengthptr += 4 + 4*LINK_SIZE; + + /* It is even worse than that. The current reference may be to an + existing named group with a different number (so apparently not + recursive) but which later on is also attached to a group with the + current number. This can only happen if $(| has been previous + encountered. In that case, we allow yet more memory, just in case. + (Again, this is fixed "properly" in PCRE2. */ + + if (cd->dupgroups) *lengthptr += 4 + 4*LINK_SIZE; + + /* Otherwise, check for recursion here. The name table does not exist + in the first pass; instead we must scan the list of names encountered + so far in order to get the number. If the name is not found, leave + the value of recno as 0 for a forward reference. */ + + /* This patch (removing "else") fixes a problem when a reference is + to multiple identically named nested groups from within the nest. + Once again, it is not the "proper" fix, and it results in an + over-allocation of memory. */ + + /* else */ + { + ng = cd->named_groups; + for (i = 0; i < cd->names_found; i++, ng++) + { + if (namelen == ng->length && + STRNCMP_UC_UC(name, ng->name, namelen) == 0) + { + open_capitem *oc; + recno = ng->number; + if (is_recurse) break; + for (oc = cd->open_caps; oc != NULL; oc = oc->next) + { + if (oc->number == recno) + { + oc->flag = TRUE; + break; + } + } + } + } + } + } + + /* In the real compile, search the name table. We check the name + first, and then check that we have reached the end of the name in the + table. That way, if the name is longer than any in the table, the + comparison will fail without reading beyond the table entry. */ + + else + { + slot = cd->name_table; + for (i = 0; i < cd->names_found; i++) + { + if (STRNCMP_UC_UC(name, slot+IMM2_SIZE, namelen) == 0 && + slot[IMM2_SIZE+namelen] == 0) + break; + slot += cd->name_entry_size; + } + + if (i < cd->names_found) + { + recno = GET2(slot, 0); + } + else + { + *errorcodeptr = ERR15; + goto FAILED; + } + } + + /* In both phases, for recursions, we can now go to the code than + handles numerical recursion. */ + + if (is_recurse) goto HANDLE_RECURSION; + + /* In the second pass we must see if the name is duplicated. If so, we + generate a different opcode. */ + + if (lengthptr == NULL && cd->dupnames) + { + int count = 1; + unsigned int index = i; + pcre_uchar *cslot = slot + cd->name_entry_size; + + for (i++; i < cd->names_found; i++) + { + if (STRCMP_UC_UC(slot + IMM2_SIZE, cslot + IMM2_SIZE) != 0) break; + count++; + cslot += cd->name_entry_size; + } + + if (count > 1) + { + if (firstcharflags == REQ_UNSET) firstcharflags = REQ_NONE; + previous = code; + item_hwm_offset = cd->hwm - cd->start_workspace; + *code++ = ((options & PCRE_CASELESS) != 0)? OP_DNREFI : OP_DNREF; + PUT2INC(code, 0, index); + PUT2INC(code, 0, count); + + /* Process each potentially referenced group. */ + + for (; slot < cslot; slot += cd->name_entry_size) + { + open_capitem *oc; + recno = GET2(slot, 0); + cd->backref_map |= (recno < 32)? (1U << recno) : 1; + if (recno > cd->top_backref) cd->top_backref = recno; + + /* Check to see if this back reference is recursive, that it, it + is inside the group that it references. A flag is set so that the + group can be made atomic. */ + + for (oc = cd->open_caps; oc != NULL; oc = oc->next) + { + if (oc->number == recno) + { + oc->flag = TRUE; + break; + } + } + } + + continue; /* End of back ref handling */ + } + } + + /* First pass, or a non-duplicated name. */ + + goto HANDLE_REFERENCE; + + + /* ------------------------------------------------------------ */ + case CHAR_R: /* Recursion, same as (?0) */ + recno = 0; + if (*(++ptr) != CHAR_RIGHT_PARENTHESIS) + { + *errorcodeptr = ERR29; + goto FAILED; + } + goto HANDLE_RECURSION; + + + /* ------------------------------------------------------------ */ + case CHAR_MINUS: case CHAR_PLUS: /* Recursion or subroutine */ + case CHAR_0: case CHAR_1: case CHAR_2: case CHAR_3: case CHAR_4: + case CHAR_5: case CHAR_6: case CHAR_7: case CHAR_8: case CHAR_9: + { + const pcre_uchar *called; + terminator = CHAR_RIGHT_PARENTHESIS; + + /* Come here from the \g<...> and \g'...' code (Oniguruma + compatibility). However, the syntax has been checked to ensure that + the ... are a (signed) number, so that neither ERR63 nor ERR29 will + be called on this path, nor with the jump to OTHER_CHAR_AFTER_QUERY + ever be taken. */ + + HANDLE_NUMERICAL_RECURSION: + + if ((refsign = *ptr) == CHAR_PLUS) + { + ptr++; + if (!IS_DIGIT(*ptr)) + { + *errorcodeptr = ERR63; + goto FAILED; + } + } + else if (refsign == CHAR_MINUS) + { + if (!IS_DIGIT(ptr[1])) + goto OTHER_CHAR_AFTER_QUERY; + ptr++; + } + + recno = 0; + while(IS_DIGIT(*ptr)) + { + if (recno > INT_MAX / 10 - 1) /* Integer overflow */ + { + while (IS_DIGIT(*ptr)) ptr++; + *errorcodeptr = ERR61; + goto FAILED; + } + recno = recno * 10 + *ptr++ - CHAR_0; + } + + if (*ptr != (pcre_uchar)terminator) + { + *errorcodeptr = ERR29; + goto FAILED; + } + + if (refsign == CHAR_MINUS) + { + if (recno == 0) + { + *errorcodeptr = ERR58; + goto FAILED; + } + recno = cd->bracount - recno + 1; + if (recno <= 0) + { + *errorcodeptr = ERR15; + goto FAILED; + } + } + else if (refsign == CHAR_PLUS) + { + if (recno == 0) + { + *errorcodeptr = ERR58; + goto FAILED; + } + recno += cd->bracount; + } + + /* Come here from code above that handles a named recursion */ + + HANDLE_RECURSION: + + previous = code; + item_hwm_offset = cd->hwm - cd->start_workspace; + called = cd->start_code; + + /* When we are actually compiling, find the bracket that is being + referenced. Temporarily end the regex in case it doesn't exist before + this point. If we end up with a forward reference, first check that + the bracket does occur later so we can give the error (and position) + now. Then remember this forward reference in the workspace so it can + be filled in at the end. */ + + if (lengthptr == NULL) + { + *code = OP_END; + if (recno != 0) + called = PRIV(find_bracket)(cd->start_code, utf, recno); + + /* Forward reference */ + + if (called == NULL) + { + if (recno > cd->final_bracount) + { + *errorcodeptr = ERR15; + goto FAILED; + } + + /* Fudge the value of "called" so that when it is inserted as an + offset below, what it actually inserted is the reference number + of the group. Then remember the forward reference. */ + + called = cd->start_code + recno; + if (cd->hwm >= cd->start_workspace + cd->workspace_size - + WORK_SIZE_SAFETY_MARGIN) + { + *errorcodeptr = expand_workspace(cd); + if (*errorcodeptr != 0) goto FAILED; + } + PUTINC(cd->hwm, 0, (int)(code + 1 - cd->start_code)); + } + + /* If not a forward reference, and the subpattern is still open, + this is a recursive call. We check to see if this is a left + recursion that could loop for ever, and diagnose that case. We + must not, however, do this check if we are in a conditional + subpattern because the condition might be testing for recursion in + a pattern such as /(?(R)a+|(?R)b)/, which is perfectly valid. + Forever loops are also detected at runtime, so those that occur in + conditional subpatterns will be picked up then. */ + + else if (GET(called, 1) == 0 && cond_depth <= 0 && + could_be_empty(called, code, bcptr, utf, cd)) + { + *errorcodeptr = ERR40; + goto FAILED; + } + } + + /* Insert the recursion/subroutine item. It does not have a set first + character (relevant if it is repeated, because it will then be + wrapped with ONCE brackets). */ + + *code = OP_RECURSE; + PUT(code, 1, (int)(called - cd->start_code)); + code += 1 + LINK_SIZE; + groupsetfirstchar = FALSE; + } + + /* Can't determine a first byte now */ + + if (firstcharflags == REQ_UNSET) firstcharflags = REQ_NONE; + zerofirstchar = firstchar; + zerofirstcharflags = firstcharflags; + continue; + + + /* ------------------------------------------------------------ */ + default: /* Other characters: check option setting */ + OTHER_CHAR_AFTER_QUERY: + set = unset = 0; + optset = &set; + + while (*ptr != CHAR_RIGHT_PARENTHESIS && *ptr != CHAR_COLON) + { + switch (*ptr++) + { + case CHAR_MINUS: optset = &unset; break; + + case CHAR_J: /* Record that it changed in the external options */ + *optset |= PCRE_DUPNAMES; + cd->external_flags |= PCRE_JCHANGED; + break; + + case CHAR_i: *optset |= PCRE_CASELESS; break; + case CHAR_m: *optset |= PCRE_MULTILINE; break; + case CHAR_s: *optset |= PCRE_DOTALL; break; + case CHAR_x: *optset |= PCRE_EXTENDED; break; + case CHAR_U: *optset |= PCRE_UNGREEDY; break; + case CHAR_X: *optset |= PCRE_EXTRA; break; + + default: *errorcodeptr = ERR12; + ptr--; /* Correct the offset */ + goto FAILED; + } + } + + /* Set up the changed option bits, but don't change anything yet. */ + + newoptions = (options | set) & (~unset); + + /* If the options ended with ')' this is not the start of a nested + group with option changes, so the options change at this level. + If we are not at the pattern start, reset the greedy defaults and the + case value for firstchar and reqchar. */ + + if (*ptr == CHAR_RIGHT_PARENTHESIS) + { + greedy_default = ((newoptions & PCRE_UNGREEDY) != 0); + greedy_non_default = greedy_default ^ 1; + req_caseopt = ((newoptions & PCRE_CASELESS) != 0)? REQ_CASELESS:0; + + /* Change options at this level, and pass them back for use + in subsequent branches. */ + + *optionsptr = options = newoptions; + previous = NULL; /* This item can't be repeated */ + continue; /* It is complete */ + } + + /* If the options ended with ':' we are heading into a nested group + with possible change of options. Such groups are non-capturing and are + not assertions of any kind. All we need to do is skip over the ':'; + the newoptions value is handled below. */ + + bravalue = OP_BRA; + ptr++; + } /* End of switch for character following (? */ + } /* End of (? handling */ + + /* Opening parenthesis not followed by '*' or '?'. If PCRE_NO_AUTO_CAPTURE + is set, all unadorned brackets become non-capturing and behave like (?:...) + brackets. */ + + else if ((options & PCRE_NO_AUTO_CAPTURE) != 0) + { + bravalue = OP_BRA; + } + + /* Else we have a capturing group. */ + + else + { + NUMBERED_GROUP: + cd->bracount += 1; + PUT2(code, 1+LINK_SIZE, cd->bracount); + skipbytes = IMM2_SIZE; + } + + /* Process nested bracketed regex. First check for parentheses nested too + deeply. */ + + if ((cd->parens_depth += 1) > PARENS_NEST_LIMIT) + { + *errorcodeptr = ERR82; + goto FAILED; + } + + /* All assertions used not to be repeatable, but this was changed for Perl + compatibility. All kinds can now be repeated except for assertions that are + conditions (Perl also forbids these to be repeated). We copy code into a + non-register variable (tempcode) in order to be able to pass its address + because some compilers complain otherwise. At the start of a conditional + group whose condition is an assertion, cd->iscondassert is set. We unset it + here so as to allow assertions later in the group to be quantified. */ + + if (bravalue >= OP_ASSERT && bravalue <= OP_ASSERTBACK_NOT && + cd->iscondassert) + { + previous = NULL; + cd->iscondassert = FALSE; + } + else + { + previous = code; + item_hwm_offset = cd->hwm - cd->start_workspace; + } + + *code = bravalue; + tempcode = code; + tempreqvary = cd->req_varyopt; /* Save value before bracket */ + tempbracount = cd->bracount; /* Save value before bracket */ + length_prevgroup = 0; /* Initialize for pre-compile phase */ + + if (!compile_regex( + newoptions, /* The complete new option state */ + &tempcode, /* Where to put code (updated) */ + &ptr, /* Input pointer (updated) */ + errorcodeptr, /* Where to put an error message */ + (bravalue == OP_ASSERTBACK || + bravalue == OP_ASSERTBACK_NOT), /* TRUE if back assert */ + reset_bracount, /* True if (?| group */ + skipbytes, /* Skip over bracket number */ + cond_depth + + ((bravalue == OP_COND)?1:0), /* Depth of condition subpatterns */ + &subfirstchar, /* For possible first char */ + &subfirstcharflags, + &subreqchar, /* For possible last char */ + &subreqcharflags, + bcptr, /* Current branch chain */ + cd, /* Tables block */ + (lengthptr == NULL)? NULL : /* Actual compile phase */ + &length_prevgroup /* Pre-compile phase */ + )) + goto FAILED; + + cd->parens_depth -= 1; + + /* If this was an atomic group and there are no capturing groups within it, + generate OP_ONCE_NC instead of OP_ONCE. */ + + if (bravalue == OP_ONCE && cd->bracount <= tempbracount) + *code = OP_ONCE_NC; + + if (bravalue >= OP_ASSERT && bravalue <= OP_ASSERTBACK_NOT) + cd->assert_depth -= 1; + + /* At the end of compiling, code is still pointing to the start of the + group, while tempcode has been updated to point past the end of the group. + The pattern pointer (ptr) is on the bracket. + + If this is a conditional bracket, check that there are no more than + two branches in the group, or just one if it's a DEFINE group. We do this + in the real compile phase, not in the pre-pass, where the whole group may + not be available. */ + + if (bravalue == OP_COND && lengthptr == NULL) + { + pcre_uchar *tc = code; + int condcount = 0; + + do { + condcount++; + tc += GET(tc,1); + } + while (*tc != OP_KET); + + /* A DEFINE group is never obeyed inline (the "condition" is always + false). It must have only one branch. */ + + if (code[LINK_SIZE+1] == OP_DEF) + { + if (condcount > 1) + { + *errorcodeptr = ERR54; + goto FAILED; + } + bravalue = OP_DEF; /* Just a flag to suppress char handling below */ + } + + /* A "normal" conditional group. If there is just one branch, we must not + make use of its firstchar or reqchar, because this is equivalent to an + empty second branch. */ + + else + { + if (condcount > 2) + { + *errorcodeptr = ERR27; + goto FAILED; + } + if (condcount == 1) subfirstcharflags = subreqcharflags = REQ_NONE; + } + } + + /* Error if hit end of pattern */ + + if (*ptr != CHAR_RIGHT_PARENTHESIS) + { + *errorcodeptr = ERR14; + goto FAILED; + } + + /* In the pre-compile phase, update the length by the length of the group, + less the brackets at either end. Then reduce the compiled code to just a + set of non-capturing brackets so that it doesn't use much memory if it is + duplicated by a quantifier.*/ + + if (lengthptr != NULL) + { + if (OFLOW_MAX - *lengthptr < length_prevgroup - 2 - 2*LINK_SIZE) + { + *errorcodeptr = ERR20; + goto FAILED; + } + *lengthptr += length_prevgroup - 2 - 2*LINK_SIZE; + code++; /* This already contains bravalue */ + PUTINC(code, 0, 1 + LINK_SIZE); + *code++ = OP_KET; + PUTINC(code, 0, 1 + LINK_SIZE); + break; /* No need to waste time with special character handling */ + } + + /* Otherwise update the main code pointer to the end of the group. */ + + code = tempcode; + + /* For a DEFINE group, required and first character settings are not + relevant. */ + + if (bravalue == OP_DEF) break; + + /* Handle updating of the required and first characters for other types of + group. Update for normal brackets of all kinds, and conditions with two + branches (see code above). If the bracket is followed by a quantifier with + zero repeat, we have to back off. Hence the definition of zeroreqchar and + zerofirstchar outside the main loop so that they can be accessed for the + back off. */ + + zeroreqchar = reqchar; + zeroreqcharflags = reqcharflags; + zerofirstchar = firstchar; + zerofirstcharflags = firstcharflags; + groupsetfirstchar = FALSE; + + if (bravalue >= OP_ONCE) + { + /* If we have not yet set a firstchar in this branch, take it from the + subpattern, remembering that it was set here so that a repeat of more + than one can replicate it as reqchar if necessary. If the subpattern has + no firstchar, set "none" for the whole branch. In both cases, a zero + repeat forces firstchar to "none". */ + + if (firstcharflags == REQ_UNSET) + { + if (subfirstcharflags >= 0) + { + firstchar = subfirstchar; + firstcharflags = subfirstcharflags; + groupsetfirstchar = TRUE; + } + else firstcharflags = REQ_NONE; + zerofirstcharflags = REQ_NONE; + } + + /* If firstchar was previously set, convert the subpattern's firstchar + into reqchar if there wasn't one, using the vary flag that was in + existence beforehand. */ + + else if (subfirstcharflags >= 0 && subreqcharflags < 0) + { + subreqchar = subfirstchar; + subreqcharflags = subfirstcharflags | tempreqvary; + } + + /* If the subpattern set a required byte (or set a first byte that isn't + really the first byte - see above), set it. */ + + if (subreqcharflags >= 0) + { + reqchar = subreqchar; + reqcharflags = subreqcharflags; + } + } + + /* For a forward assertion, we take the reqchar, if set, provided that the + group has also set a first char. This can be helpful if the pattern that + follows the assertion doesn't set a different char. For example, it's + useful for /(?=abcde).+/. We can't set firstchar for an assertion, however + because it leads to incorrect effect for patterns such as /(?=a)a.+/ when + the "real" "a" would then become a reqchar instead of a firstchar. This is + overcome by a scan at the end if there's no firstchar, looking for an + asserted first char. */ + + else if (bravalue == OP_ASSERT && subreqcharflags >= 0 && + subfirstcharflags >= 0) + { + reqchar = subreqchar; + reqcharflags = subreqcharflags; + } + break; /* End of processing '(' */ + + + /* ===================================================================*/ + /* Handle metasequences introduced by \. For ones like \d, the ESC_ values + are arranged to be the negation of the corresponding OP_values in the + default case when PCRE_UCP is not set. For the back references, the values + are negative the reference number. Only back references and those types + that consume a character may be repeated. We can test for values between + ESC_b and ESC_Z for the latter; this may have to change if any new ones are + ever created. */ + + case CHAR_BACKSLASH: + tempptr = ptr; + escape = check_escape(&ptr, &ec, errorcodeptr, cd->bracount, options, FALSE); + if (*errorcodeptr != 0) goto FAILED; + + if (escape == 0) /* The escape coded a single character */ + c = ec; + else + { + /* For metasequences that actually match a character, we disable the + setting of a first character if it hasn't already been set. */ + + if (firstcharflags == REQ_UNSET && escape > ESC_b && escape < ESC_Z) + firstcharflags = REQ_NONE; + + /* Set values to reset to if this is followed by a zero repeat. */ + + zerofirstchar = firstchar; + zerofirstcharflags = firstcharflags; + zeroreqchar = reqchar; + zeroreqcharflags = reqcharflags; + + /* \g or \g'name' is a subroutine call by name and \g or \g'n' + is a subroutine call by number (Oniguruma syntax). In fact, the value + ESC_g is returned only for these cases. So we don't need to check for < + or ' if the value is ESC_g. For the Perl syntax \g{n} the value is + -n, and for the Perl syntax \g{name} the result is ESC_k (as + that is a synonym for a named back reference). */ + + if (escape == ESC_g) + { + const pcre_uchar *p; + pcre_uint32 cf; + + item_hwm_offset = cd->hwm - cd->start_workspace; /* Normally this is set when '(' is read */ + terminator = (*(++ptr) == CHAR_LESS_THAN_SIGN)? + CHAR_GREATER_THAN_SIGN : CHAR_APOSTROPHE; + + /* These two statements stop the compiler for warning about possibly + unset variables caused by the jump to HANDLE_NUMERICAL_RECURSION. In + fact, because we do the check for a number below, the paths that + would actually be in error are never taken. */ + + skipbytes = 0; + reset_bracount = FALSE; + + /* If it's not a signed or unsigned number, treat it as a name. */ + + cf = ptr[1]; + if (cf != CHAR_PLUS && cf != CHAR_MINUS && !IS_DIGIT(cf)) + { + is_recurse = TRUE; + goto NAMED_REF_OR_RECURSE; + } + + /* Signed or unsigned number (cf = ptr[1]) is known to be plus or minus + or a digit. */ + + p = ptr + 2; + while (IS_DIGIT(*p)) p++; + if (*p != (pcre_uchar)terminator) + { + *errorcodeptr = ERR57; + goto FAILED; + } + ptr++; + goto HANDLE_NUMERICAL_RECURSION; + } + + /* \k or \k'name' is a back reference by name (Perl syntax). + We also support \k{name} (.NET syntax). */ + + if (escape == ESC_k) + { + if ((ptr[1] != CHAR_LESS_THAN_SIGN && + ptr[1] != CHAR_APOSTROPHE && ptr[1] != CHAR_LEFT_CURLY_BRACKET)) + { + *errorcodeptr = ERR69; + goto FAILED; + } + is_recurse = FALSE; + terminator = (*(++ptr) == CHAR_LESS_THAN_SIGN)? + CHAR_GREATER_THAN_SIGN : (*ptr == CHAR_APOSTROPHE)? + CHAR_APOSTROPHE : CHAR_RIGHT_CURLY_BRACKET; + goto NAMED_REF_OR_RECURSE; + } + + /* Back references are handled specially; must disable firstchar if + not set to cope with cases like (?=(\w+))\1: which would otherwise set + ':' later. */ + + if (escape < 0) + { + open_capitem *oc; + recno = -escape; + + /* Come here from named backref handling when the reference is to a + single group (i.e. not to a duplicated name. */ + + HANDLE_REFERENCE: + if (firstcharflags == REQ_UNSET) zerofirstcharflags = firstcharflags = REQ_NONE; + previous = code; + item_hwm_offset = cd->hwm - cd->start_workspace; + *code++ = ((options & PCRE_CASELESS) != 0)? OP_REFI : OP_REF; + PUT2INC(code, 0, recno); + cd->backref_map |= (recno < 32)? (1U << recno) : 1; + if (recno > cd->top_backref) cd->top_backref = recno; + + /* Check to see if this back reference is recursive, that it, it + is inside the group that it references. A flag is set so that the + group can be made atomic. */ + + for (oc = cd->open_caps; oc != NULL; oc = oc->next) + { + if (oc->number == recno) + { + oc->flag = TRUE; + break; + } + } + } + + /* So are Unicode property matches, if supported. */ + +#ifdef SUPPORT_UCP + else if (escape == ESC_P || escape == ESC_p) + { + BOOL negated; + unsigned int ptype = 0, pdata = 0; + if (!get_ucp(&ptr, &negated, &ptype, &pdata, errorcodeptr)) + goto FAILED; + previous = code; + item_hwm_offset = cd->hwm - cd->start_workspace; + *code++ = ((escape == ESC_p) != negated)? OP_PROP : OP_NOTPROP; + *code++ = ptype; + *code++ = pdata; + } +#else + + /* If Unicode properties are not supported, \X, \P, and \p are not + allowed. */ + + else if (escape == ESC_X || escape == ESC_P || escape == ESC_p) + { + *errorcodeptr = ERR45; + goto FAILED; + } +#endif + + /* For the rest (including \X when Unicode properties are supported), we + can obtain the OP value by negating the escape value in the default + situation when PCRE_UCP is not set. When it *is* set, we substitute + Unicode property tests. Note that \b and \B do a one-character + lookbehind, and \A also behaves as if it does. */ + + else + { + if ((escape == ESC_b || escape == ESC_B || escape == ESC_A) && + cd->max_lookbehind == 0) + cd->max_lookbehind = 1; +#ifdef SUPPORT_UCP + if (escape >= ESC_DU && escape <= ESC_wu) + { + nestptr = ptr + 1; /* Where to resume */ + ptr = substitutes[escape - ESC_DU] - 1; /* Just before substitute */ + } + else +#endif + /* In non-UTF-8 mode, we turn \C into OP_ALLANY instead of OP_ANYBYTE + so that it works in DFA mode and in lookbehinds. */ + + { + previous = (escape > ESC_b && escape < ESC_Z)? code : NULL; + item_hwm_offset = cd->hwm - cd->start_workspace; + *code++ = (!utf && escape == ESC_C)? OP_ALLANY : escape; + } + } + continue; + } + + /* We have a data character whose value is in c. In UTF-8 mode it may have + a value > 127. We set its representation in the length/buffer, and then + handle it as a data character. */ + +#if defined SUPPORT_UTF && !defined COMPILE_PCRE32 + if (utf && c > MAX_VALUE_FOR_SINGLE_CHAR) + mclength = PRIV(ord2utf)(c, mcbuffer); + else +#endif + + { + mcbuffer[0] = c; + mclength = 1; + } + goto ONE_CHAR; + + + /* ===================================================================*/ + /* Handle a literal character. It is guaranteed not to be whitespace or # + when the extended flag is set. If we are in a UTF mode, it may be a + multi-unit literal character. */ + + default: + NORMAL_CHAR: + mclength = 1; + mcbuffer[0] = c; + +#ifdef SUPPORT_UTF + if (utf && HAS_EXTRALEN(c)) + ACROSSCHAR(TRUE, ptr[1], mcbuffer[mclength++] = *(++ptr)); +#endif + + /* At this point we have the character's bytes in mcbuffer, and the length + in mclength. When not in UTF-8 mode, the length is always 1. */ + + ONE_CHAR: + previous = code; + item_hwm_offset = cd->hwm - cd->start_workspace; + + /* For caseless UTF-8 mode when UCP support is available, check whether + this character has more than one other case. If so, generate a special + OP_PROP item instead of OP_CHARI. */ + +#ifdef SUPPORT_UCP + if (utf && (options & PCRE_CASELESS) != 0) + { + GETCHAR(c, mcbuffer); + if ((c = UCD_CASESET(c)) != 0) + { + *code++ = OP_PROP; + *code++ = PT_CLIST; + *code++ = c; + if (firstcharflags == REQ_UNSET) + firstcharflags = zerofirstcharflags = REQ_NONE; + break; + } + } +#endif + + /* Caseful matches, or not one of the multicase characters. */ + + *code++ = ((options & PCRE_CASELESS) != 0)? OP_CHARI : OP_CHAR; + for (c = 0; c < mclength; c++) *code++ = mcbuffer[c]; + + /* Remember if \r or \n were seen */ + + if (mcbuffer[0] == CHAR_CR || mcbuffer[0] == CHAR_NL) + cd->external_flags |= PCRE_HASCRORLF; + + /* Set the first and required bytes appropriately. If no previous first + byte, set it from this character, but revert to none on a zero repeat. + Otherwise, leave the firstchar value alone, and don't change it on a zero + repeat. */ + + if (firstcharflags == REQ_UNSET) + { + zerofirstcharflags = REQ_NONE; + zeroreqchar = reqchar; + zeroreqcharflags = reqcharflags; + + /* If the character is more than one byte long, we can set firstchar + only if it is not to be matched caselessly. */ + + if (mclength == 1 || req_caseopt == 0) + { + firstchar = mcbuffer[0]; + firstcharflags = req_caseopt; + + if (mclength != 1) + { + reqchar = code[-1]; + reqcharflags = cd->req_varyopt; + } + } + else firstcharflags = reqcharflags = REQ_NONE; + } + + /* firstchar was previously set; we can set reqchar only if the length is + 1 or the matching is caseful. */ + + else + { + zerofirstchar = firstchar; + zerofirstcharflags = firstcharflags; + zeroreqchar = reqchar; + zeroreqcharflags = reqcharflags; + if (mclength == 1 || req_caseopt == 0) + { + reqchar = code[-1]; + reqcharflags = req_caseopt | cd->req_varyopt; + } + } + + break; /* End of literal character handling */ + } + } /* end of big loop */ + + +/* Control never reaches here by falling through, only by a goto for all the +error states. Pass back the position in the pattern so that it can be displayed +to the user for diagnosing the error. */ + +FAILED: +*ptrptr = ptr; +return FALSE; +} + + + +/************************************************* +* Compile sequence of alternatives * +*************************************************/ + +/* On entry, ptr is pointing past the bracket character, but on return it +points to the closing bracket, or vertical bar, or end of string. The code +variable is pointing at the byte into which the BRA operator has been stored. +This function is used during the pre-compile phase when we are trying to find +out the amount of memory needed, as well as during the real compile phase. The +value of lengthptr distinguishes the two phases. + +Arguments: + options option bits, including any changes for this subpattern + codeptr -> the address of the current code pointer + ptrptr -> the address of the current pattern pointer + errorcodeptr -> pointer to error code variable + lookbehind TRUE if this is a lookbehind assertion + reset_bracount TRUE to reset the count for each branch + skipbytes skip this many bytes at start (for brackets and OP_COND) + cond_depth depth of nesting for conditional subpatterns + firstcharptr place to put the first required character + firstcharflagsptr place to put the first character flags, or a negative number + reqcharptr place to put the last required character + reqcharflagsptr place to put the last required character flags, or a negative number + bcptr pointer to the chain of currently open branches + cd points to the data block with tables pointers etc. + lengthptr NULL during the real compile phase + points to length accumulator during pre-compile phase + +Returns: TRUE on success +*/ + +static BOOL +compile_regex(int options, pcre_uchar **codeptr, const pcre_uchar **ptrptr, + int *errorcodeptr, BOOL lookbehind, BOOL reset_bracount, int skipbytes, + int cond_depth, + pcre_uint32 *firstcharptr, pcre_int32 *firstcharflagsptr, + pcre_uint32 *reqcharptr, pcre_int32 *reqcharflagsptr, + branch_chain *bcptr, compile_data *cd, int *lengthptr) +{ +const pcre_uchar *ptr = *ptrptr; +pcre_uchar *code = *codeptr; +pcre_uchar *last_branch = code; +pcre_uchar *start_bracket = code; +pcre_uchar *reverse_count = NULL; +open_capitem capitem; +int capnumber = 0; +pcre_uint32 firstchar, reqchar; +pcre_int32 firstcharflags, reqcharflags; +pcre_uint32 branchfirstchar, branchreqchar; +pcre_int32 branchfirstcharflags, branchreqcharflags; +int length; +unsigned int orig_bracount; +unsigned int max_bracount; +branch_chain bc; +size_t save_hwm_offset; + +/* If set, call the external function that checks for stack availability. */ + +if (PUBL(stack_guard) != NULL && PUBL(stack_guard)()) + { + *errorcodeptr= ERR85; + return FALSE; + } + +/* Miscellaneous initialization */ + +bc.outer = bcptr; +bc.current_branch = code; + +firstchar = reqchar = 0; +firstcharflags = reqcharflags = REQ_UNSET; + +save_hwm_offset = cd->hwm - cd->start_workspace; + +/* Accumulate the length for use in the pre-compile phase. Start with the +length of the BRA and KET and any extra bytes that are required at the +beginning. We accumulate in a local variable to save frequent testing of +lenthptr for NULL. We cannot do this by looking at the value of code at the +start and end of each alternative, because compiled items are discarded during +the pre-compile phase so that the work space is not exceeded. */ + +length = 2 + 2*LINK_SIZE + skipbytes; + +/* WARNING: If the above line is changed for any reason, you must also change +the code that abstracts option settings at the start of the pattern and makes +them global. It tests the value of length for (2 + 2*LINK_SIZE) in the +pre-compile phase to find out whether anything has yet been compiled or not. */ + +/* If this is a capturing subpattern, add to the chain of open capturing items +so that we can detect them if (*ACCEPT) is encountered. This is also used to +detect groups that contain recursive back references to themselves. Note that +only OP_CBRA need be tested here; changing this opcode to one of its variants, +e.g. OP_SCBRAPOS, happens later, after the group has been compiled. */ + +if (*code == OP_CBRA) + { + capnumber = GET2(code, 1 + LINK_SIZE); + capitem.number = capnumber; + capitem.next = cd->open_caps; + capitem.flag = FALSE; + cd->open_caps = &capitem; + } + +/* Offset is set zero to mark that this bracket is still open */ + +PUT(code, 1, 0); +code += 1 + LINK_SIZE + skipbytes; + +/* Loop for each alternative branch */ + +orig_bracount = max_bracount = cd->bracount; +for (;;) + { + /* For a (?| group, reset the capturing bracket count so that each branch + uses the same numbers. */ + + if (reset_bracount) cd->bracount = orig_bracount; + + /* Set up dummy OP_REVERSE if lookbehind assertion */ + + if (lookbehind) + { + *code++ = OP_REVERSE; + reverse_count = code; + PUTINC(code, 0, 0); + length += 1 + LINK_SIZE; + } + + /* Now compile the branch; in the pre-compile phase its length gets added + into the length. */ + + if (!compile_branch(&options, &code, &ptr, errorcodeptr, &branchfirstchar, + &branchfirstcharflags, &branchreqchar, &branchreqcharflags, &bc, + cond_depth, cd, (lengthptr == NULL)? NULL : &length)) + { + *ptrptr = ptr; + return FALSE; + } + + /* Keep the highest bracket count in case (?| was used and some branch + has fewer than the rest. */ + + if (cd->bracount > max_bracount) max_bracount = cd->bracount; + + /* In the real compile phase, there is some post-processing to be done. */ + + if (lengthptr == NULL) + { + /* If this is the first branch, the firstchar and reqchar values for the + branch become the values for the regex. */ + + if (*last_branch != OP_ALT) + { + firstchar = branchfirstchar; + firstcharflags = branchfirstcharflags; + reqchar = branchreqchar; + reqcharflags = branchreqcharflags; + } + + /* If this is not the first branch, the first char and reqchar have to + match the values from all the previous branches, except that if the + previous value for reqchar didn't have REQ_VARY set, it can still match, + and we set REQ_VARY for the regex. */ + + else + { + /* If we previously had a firstchar, but it doesn't match the new branch, + we have to abandon the firstchar for the regex, but if there was + previously no reqchar, it takes on the value of the old firstchar. */ + + if (firstcharflags >= 0 && + (firstcharflags != branchfirstcharflags || firstchar != branchfirstchar)) + { + if (reqcharflags < 0) + { + reqchar = firstchar; + reqcharflags = firstcharflags; + } + firstcharflags = REQ_NONE; + } + + /* If we (now or from before) have no firstchar, a firstchar from the + branch becomes a reqchar if there isn't a branch reqchar. */ + + if (firstcharflags < 0 && branchfirstcharflags >= 0 && branchreqcharflags < 0) + { + branchreqchar = branchfirstchar; + branchreqcharflags = branchfirstcharflags; + } + + /* Now ensure that the reqchars match */ + + if (((reqcharflags & ~REQ_VARY) != (branchreqcharflags & ~REQ_VARY)) || + reqchar != branchreqchar) + reqcharflags = REQ_NONE; + else + { + reqchar = branchreqchar; + reqcharflags |= branchreqcharflags; /* To "or" REQ_VARY */ + } + } + + /* If lookbehind, check that this branch matches a fixed-length string, and + put the length into the OP_REVERSE item. Temporarily mark the end of the + branch with OP_END. If the branch contains OP_RECURSE, the result is -3 + because there may be forward references that we can't check here. Set a + flag to cause another lookbehind check at the end. Why not do it all at the + end? Because common, erroneous checks are picked up here and the offset of + the problem can be shown. */ + + if (lookbehind) + { + int fixed_length; + *code = OP_END; + fixed_length = find_fixedlength(last_branch, (options & PCRE_UTF8) != 0, + FALSE, cd, NULL); + DPRINTF(("fixed length = %d\n", fixed_length)); + if (fixed_length == -3) + { + cd->check_lookbehind = TRUE; + } + else if (fixed_length < 0) + { + *errorcodeptr = (fixed_length == -2)? ERR36 : + (fixed_length == -4)? ERR70: ERR25; + *ptrptr = ptr; + return FALSE; + } + else + { + if (fixed_length > cd->max_lookbehind) + cd->max_lookbehind = fixed_length; + PUT(reverse_count, 0, fixed_length); + } + } + } + + /* Reached end of expression, either ')' or end of pattern. In the real + compile phase, go back through the alternative branches and reverse the chain + of offsets, with the field in the BRA item now becoming an offset to the + first alternative. If there are no alternatives, it points to the end of the + group. The length in the terminating ket is always the length of the whole + bracketed item. Return leaving the pointer at the terminating char. */ + + if (*ptr != CHAR_VERTICAL_LINE) + { + if (lengthptr == NULL) + { + int branch_length = (int)(code - last_branch); + do + { + int prev_length = GET(last_branch, 1); + PUT(last_branch, 1, branch_length); + branch_length = prev_length; + last_branch -= branch_length; + } + while (branch_length > 0); + } + + /* Fill in the ket */ + + *code = OP_KET; + PUT(code, 1, (int)(code - start_bracket)); + code += 1 + LINK_SIZE; + + /* If it was a capturing subpattern, check to see if it contained any + recursive back references. If so, we must wrap it in atomic brackets. + Because we are moving code along, we must ensure that any pending recursive + references are updated. In any event, remove the block from the chain. */ + + if (capnumber > 0) + { + if (cd->open_caps->flag) + { + *code = OP_END; + adjust_recurse(start_bracket, 1 + LINK_SIZE, + (options & PCRE_UTF8) != 0, cd, save_hwm_offset); + memmove(start_bracket + 1 + LINK_SIZE, start_bracket, + IN_UCHARS(code - start_bracket)); + *start_bracket = OP_ONCE; + code += 1 + LINK_SIZE; + PUT(start_bracket, 1, (int)(code - start_bracket)); + *code = OP_KET; + PUT(code, 1, (int)(code - start_bracket)); + code += 1 + LINK_SIZE; + length += 2 + 2*LINK_SIZE; + } + cd->open_caps = cd->open_caps->next; + } + + /* Retain the highest bracket number, in case resetting was used. */ + + cd->bracount = max_bracount; + + /* Set values to pass back */ + + *codeptr = code; + *ptrptr = ptr; + *firstcharptr = firstchar; + *firstcharflagsptr = firstcharflags; + *reqcharptr = reqchar; + *reqcharflagsptr = reqcharflags; + if (lengthptr != NULL) + { + if (OFLOW_MAX - *lengthptr < length) + { + *errorcodeptr = ERR20; + return FALSE; + } + *lengthptr += length; + } + return TRUE; + } + + /* Another branch follows. In the pre-compile phase, we can move the code + pointer back to where it was for the start of the first branch. (That is, + pretend that each branch is the only one.) + + In the real compile phase, insert an ALT node. Its length field points back + to the previous branch while the bracket remains open. At the end the chain + is reversed. It's done like this so that the start of the bracket has a + zero offset until it is closed, making it possible to detect recursion. */ + + if (lengthptr != NULL) + { + code = *codeptr + 1 + LINK_SIZE + skipbytes; + length += 1 + LINK_SIZE; + } + else + { + *code = OP_ALT; + PUT(code, 1, (int)(code - last_branch)); + bc.current_branch = last_branch = code; + code += 1 + LINK_SIZE; + } + + ptr++; + } +/* Control never reaches here */ +} + + + + +/************************************************* +* Check for anchored expression * +*************************************************/ + +/* Try to find out if this is an anchored regular expression. Consider each +alternative branch. If they all start with OP_SOD or OP_CIRC, or with a bracket +all of whose alternatives start with OP_SOD or OP_CIRC (recurse ad lib), then +it's anchored. However, if this is a multiline pattern, then only OP_SOD will +be found, because ^ generates OP_CIRCM in that mode. + +We can also consider a regex to be anchored if OP_SOM starts all its branches. +This is the code for \G, which means "match at start of match position, taking +into account the match offset". + +A branch is also implicitly anchored if it starts with .* and DOTALL is set, +because that will try the rest of the pattern at all possible matching points, +so there is no point trying again.... er .... + +.... except when the .* appears inside capturing parentheses, and there is a +subsequent back reference to those parentheses. We haven't enough information +to catch that case precisely. + +At first, the best we could do was to detect when .* was in capturing brackets +and the highest back reference was greater than or equal to that level. +However, by keeping a bitmap of the first 31 back references, we can catch some +of the more common cases more precisely. + +... A second exception is when the .* appears inside an atomic group, because +this prevents the number of characters it matches from being adjusted. + +Arguments: + code points to start of expression (the bracket) + bracket_map a bitmap of which brackets we are inside while testing; this + handles up to substring 31; after that we just have to take + the less precise approach + cd points to the compile data block + atomcount atomic group level + +Returns: TRUE or FALSE +*/ + +static BOOL +is_anchored(register const pcre_uchar *code, unsigned int bracket_map, + compile_data *cd, int atomcount) +{ +do { + const pcre_uchar *scode = first_significant_code( + code + PRIV(OP_lengths)[*code], FALSE); + register int op = *scode; + + /* Non-capturing brackets */ + + if (op == OP_BRA || op == OP_BRAPOS || + op == OP_SBRA || op == OP_SBRAPOS) + { + if (!is_anchored(scode, bracket_map, cd, atomcount)) return FALSE; + } + + /* Capturing brackets */ + + else if (op == OP_CBRA || op == OP_CBRAPOS || + op == OP_SCBRA || op == OP_SCBRAPOS) + { + int n = GET2(scode, 1+LINK_SIZE); + int new_map = bracket_map | ((n < 32)? (1U << n) : 1); + if (!is_anchored(scode, new_map, cd, atomcount)) return FALSE; + } + + /* Positive forward assertion */ + + else if (op == OP_ASSERT) + { + if (!is_anchored(scode, bracket_map, cd, atomcount)) return FALSE; + } + + /* Condition; not anchored if no second branch */ + + else if (op == OP_COND) + { + if (scode[GET(scode,1)] != OP_ALT) return FALSE; + if (!is_anchored(scode, bracket_map, cd, atomcount)) return FALSE; + } + + /* Atomic groups */ + + else if (op == OP_ONCE || op == OP_ONCE_NC) + { + if (!is_anchored(scode, bracket_map, cd, atomcount + 1)) + return FALSE; + } + + /* .* is not anchored unless DOTALL is set (which generates OP_ALLANY) and + it isn't in brackets that are or may be referenced or inside an atomic + group. */ + + else if ((op == OP_TYPESTAR || op == OP_TYPEMINSTAR || + op == OP_TYPEPOSSTAR)) + { + if (scode[1] != OP_ALLANY || (bracket_map & cd->backref_map) != 0 || + atomcount > 0 || cd->had_pruneorskip) + return FALSE; + } + + /* Check for explicit anchoring */ + + else if (op != OP_SOD && op != OP_SOM && op != OP_CIRC) return FALSE; + + code += GET(code, 1); + } +while (*code == OP_ALT); /* Loop for each alternative */ +return TRUE; +} + + + +/************************************************* +* Check for starting with ^ or .* * +*************************************************/ + +/* This is called to find out if every branch starts with ^ or .* so that +"first char" processing can be done to speed things up in multiline +matching and for non-DOTALL patterns that start with .* (which must start at +the beginning or after \n). As in the case of is_anchored() (see above), we +have to take account of back references to capturing brackets that contain .* +because in that case we can't make the assumption. Also, the appearance of .* +inside atomic brackets or in an assertion, or in a pattern that contains *PRUNE +or *SKIP does not count, because once again the assumption no longer holds. + +Arguments: + code points to start of expression (the bracket) + bracket_map a bitmap of which brackets we are inside while testing; this + handles up to substring 31; after that we just have to take + the less precise approach + cd points to the compile data + atomcount atomic group level + inassert TRUE if in an assertion + +Returns: TRUE or FALSE +*/ + +static BOOL +is_startline(const pcre_uchar *code, unsigned int bracket_map, + compile_data *cd, int atomcount, BOOL inassert) +{ +do { + const pcre_uchar *scode = first_significant_code( + code + PRIV(OP_lengths)[*code], FALSE); + register int op = *scode; + + /* If we are at the start of a conditional assertion group, *both* the + conditional assertion *and* what follows the condition must satisfy the test + for start of line. Other kinds of condition fail. Note that there may be an + auto-callout at the start of a condition. */ + + if (op == OP_COND) + { + scode += 1 + LINK_SIZE; + if (*scode == OP_CALLOUT) scode += PRIV(OP_lengths)[OP_CALLOUT]; + switch (*scode) + { + case OP_CREF: + case OP_DNCREF: + case OP_RREF: + case OP_DNRREF: + case OP_DEF: + case OP_FAIL: + return FALSE; + + default: /* Assertion */ + if (!is_startline(scode, bracket_map, cd, atomcount, TRUE)) return FALSE; + do scode += GET(scode, 1); while (*scode == OP_ALT); + scode += 1 + LINK_SIZE; + break; + } + scode = first_significant_code(scode, FALSE); + op = *scode; + } + + /* Non-capturing brackets */ + + if (op == OP_BRA || op == OP_BRAPOS || + op == OP_SBRA || op == OP_SBRAPOS) + { + if (!is_startline(scode, bracket_map, cd, atomcount, inassert)) return FALSE; + } + + /* Capturing brackets */ + + else if (op == OP_CBRA || op == OP_CBRAPOS || + op == OP_SCBRA || op == OP_SCBRAPOS) + { + int n = GET2(scode, 1+LINK_SIZE); + int new_map = bracket_map | ((n < 32)? (1U << n) : 1); + if (!is_startline(scode, new_map, cd, atomcount, inassert)) return FALSE; + } + + /* Positive forward assertions */ + + else if (op == OP_ASSERT) + { + if (!is_startline(scode, bracket_map, cd, atomcount, TRUE)) return FALSE; + } + + /* Atomic brackets */ + + else if (op == OP_ONCE || op == OP_ONCE_NC) + { + if (!is_startline(scode, bracket_map, cd, atomcount + 1, inassert)) return FALSE; + } + + /* .* means "start at start or after \n" if it isn't in atomic brackets or + brackets that may be referenced or an assertion, as long as the pattern does + not contain *PRUNE or *SKIP, because these break the feature. Consider, for + example, /.*?a(*PRUNE)b/ with the subject "aab", which matches "ab", i.e. + not at the start of a line. */ + + else if (op == OP_TYPESTAR || op == OP_TYPEMINSTAR || op == OP_TYPEPOSSTAR) + { + if (scode[1] != OP_ANY || (bracket_map & cd->backref_map) != 0 || + atomcount > 0 || cd->had_pruneorskip || inassert) + return FALSE; + } + + /* Check for explicit circumflex; anything else gives a FALSE result. Note + in particular that this includes atomic brackets OP_ONCE and OP_ONCE_NC + because the number of characters matched by .* cannot be adjusted inside + them. */ + + else if (op != OP_CIRC && op != OP_CIRCM) return FALSE; + + /* Move on to the next alternative */ + + code += GET(code, 1); + } +while (*code == OP_ALT); /* Loop for each alternative */ +return TRUE; +} + + + +/************************************************* +* Check for asserted fixed first char * +*************************************************/ + +/* During compilation, the "first char" settings from forward assertions are +discarded, because they can cause conflicts with actual literals that follow. +However, if we end up without a first char setting for an unanchored pattern, +it is worth scanning the regex to see if there is an initial asserted first +char. If all branches start with the same asserted char, or with a +non-conditional bracket all of whose alternatives start with the same asserted +char (recurse ad lib), then we return that char, with the flags set to zero or +REQ_CASELESS; otherwise return zero with REQ_NONE in the flags. + +Arguments: + code points to start of expression (the bracket) + flags points to the first char flags, or to REQ_NONE + inassert TRUE if in an assertion + +Returns: the fixed first char, or 0 with REQ_NONE in flags +*/ + +static pcre_uint32 +find_firstassertedchar(const pcre_uchar *code, pcre_int32 *flags, + BOOL inassert) +{ +register pcre_uint32 c = 0; +int cflags = REQ_NONE; + +*flags = REQ_NONE; +do { + pcre_uint32 d; + int dflags; + int xl = (*code == OP_CBRA || *code == OP_SCBRA || + *code == OP_CBRAPOS || *code == OP_SCBRAPOS)? IMM2_SIZE:0; + const pcre_uchar *scode = first_significant_code(code + 1+LINK_SIZE + xl, + TRUE); + register pcre_uchar op = *scode; + + switch(op) + { + default: + return 0; + + case OP_BRA: + case OP_BRAPOS: + case OP_CBRA: + case OP_SCBRA: + case OP_CBRAPOS: + case OP_SCBRAPOS: + case OP_ASSERT: + case OP_ONCE: + case OP_ONCE_NC: + d = find_firstassertedchar(scode, &dflags, op == OP_ASSERT); + if (dflags < 0) + return 0; + if (cflags < 0) { c = d; cflags = dflags; } else if (c != d || cflags != dflags) return 0; + break; + + case OP_EXACT: + scode += IMM2_SIZE; + /* Fall through */ + + case OP_CHAR: + case OP_PLUS: + case OP_MINPLUS: + case OP_POSPLUS: + if (!inassert) return 0; + if (cflags < 0) { c = scode[1]; cflags = 0; } + else if (c != scode[1]) return 0; + break; + + case OP_EXACTI: + scode += IMM2_SIZE; + /* Fall through */ + + case OP_CHARI: + case OP_PLUSI: + case OP_MINPLUSI: + case OP_POSPLUSI: + if (!inassert) return 0; + if (cflags < 0) { c = scode[1]; cflags = REQ_CASELESS; } + else if (c != scode[1]) return 0; + break; + } + + code += GET(code, 1); + } +while (*code == OP_ALT); + +*flags = cflags; +return c; +} + + + +/************************************************* +* Add an entry to the name/number table * +*************************************************/ + +/* This function is called between compiling passes to add an entry to the +name/number table, maintaining alphabetical order. Checking for permitted +and forbidden duplicates has already been done. + +Arguments: + cd the compile data block + name the name to add + length the length of the name + groupno the group number + +Returns: nothing +*/ + +static void +add_name(compile_data *cd, const pcre_uchar *name, int length, + unsigned int groupno) +{ +int i; +pcre_uchar *slot = cd->name_table; + +for (i = 0; i < cd->names_found; i++) + { + int crc = memcmp(name, slot+IMM2_SIZE, IN_UCHARS(length)); + if (crc == 0 && slot[IMM2_SIZE+length] != 0) + crc = -1; /* Current name is a substring */ + + /* Make space in the table and break the loop for an earlier name. For a + duplicate or later name, carry on. We do this for duplicates so that in the + simple case (when ?(| is not used) they are in order of their numbers. In all + cases they are in the order in which they appear in the pattern. */ + + if (crc < 0) + { + memmove(slot + cd->name_entry_size, slot, + IN_UCHARS((cd->names_found - i) * cd->name_entry_size)); + break; + } + + /* Continue the loop for a later or duplicate name */ + + slot += cd->name_entry_size; + } + +PUT2(slot, 0, groupno); +memcpy(slot + IMM2_SIZE, name, IN_UCHARS(length)); +slot[IMM2_SIZE + length] = 0; +cd->names_found++; +} + + + +/************************************************* +* Compile a Regular Expression * +*************************************************/ + +/* This function takes a string and returns a pointer to a block of store +holding a compiled version of the expression. The original API for this +function had no error code return variable; it is retained for backwards +compatibility. The new function is given a new name. + +Arguments: + pattern the regular expression + options various option bits + errorcodeptr pointer to error code variable (pcre_compile2() only) + can be NULL if you don't want a code value + errorptr pointer to pointer to error text + erroroffset ptr offset in pattern where error was detected + tables pointer to character tables or NULL + +Returns: pointer to compiled data block, or NULL on error, + with errorptr and erroroffset set +*/ + +#if defined COMPILE_PCRE8 +PCRE_EXP_DEFN pcre * PCRE_CALL_CONVENTION +pcre_compile(const char *pattern, int options, const char **errorptr, + int *erroroffset, const unsigned char *tables) +#elif defined COMPILE_PCRE16 +PCRE_EXP_DEFN pcre16 * PCRE_CALL_CONVENTION +pcre16_compile(PCRE_SPTR16 pattern, int options, const char **errorptr, + int *erroroffset, const unsigned char *tables) +#elif defined COMPILE_PCRE32 +PCRE_EXP_DEFN pcre32 * PCRE_CALL_CONVENTION +pcre32_compile(PCRE_SPTR32 pattern, int options, const char **errorptr, + int *erroroffset, const unsigned char *tables) +#endif +{ +#if defined COMPILE_PCRE8 +return pcre_compile2(pattern, options, NULL, errorptr, erroroffset, tables); +#elif defined COMPILE_PCRE16 +return pcre16_compile2(pattern, options, NULL, errorptr, erroroffset, tables); +#elif defined COMPILE_PCRE32 +return pcre32_compile2(pattern, options, NULL, errorptr, erroroffset, tables); +#endif +} + + +#if defined COMPILE_PCRE8 +PCRE_EXP_DEFN pcre * PCRE_CALL_CONVENTION +pcre_compile2(const char *pattern, int options, int *errorcodeptr, + const char **errorptr, int *erroroffset, const unsigned char *tables) +#elif defined COMPILE_PCRE16 +PCRE_EXP_DEFN pcre16 * PCRE_CALL_CONVENTION +pcre16_compile2(PCRE_SPTR16 pattern, int options, int *errorcodeptr, + const char **errorptr, int *erroroffset, const unsigned char *tables) +#elif defined COMPILE_PCRE32 +PCRE_EXP_DEFN pcre32 * PCRE_CALL_CONVENTION +pcre32_compile2(PCRE_SPTR32 pattern, int options, int *errorcodeptr, + const char **errorptr, int *erroroffset, const unsigned char *tables) +#endif +{ +REAL_PCRE *re; +int length = 1; /* For final END opcode */ +pcre_int32 firstcharflags, reqcharflags; +pcre_uint32 firstchar, reqchar; +pcre_uint32 limit_match = PCRE_UINT32_MAX; +pcre_uint32 limit_recursion = PCRE_UINT32_MAX; +int newline; +int errorcode = 0; +int skipatstart = 0; +BOOL utf; +BOOL never_utf = FALSE; +size_t size; +pcre_uchar *code; +const pcre_uchar *codestart; +const pcre_uchar *ptr; +compile_data compile_block; +compile_data *cd = &compile_block; + +/* This space is used for "compiling" into during the first phase, when we are +computing the amount of memory that is needed. Compiled items are thrown away +as soon as possible, so that a fairly large buffer should be sufficient for +this purpose. The same space is used in the second phase for remembering where +to fill in forward references to subpatterns. That may overflow, in which case +new memory is obtained from malloc(). */ + +pcre_uchar cworkspace[COMPILE_WORK_SIZE]; + +/* This vector is used for remembering name groups during the pre-compile. In a +similar way to cworkspace, it can be expanded using malloc() if necessary. */ + +named_group named_groups[NAMED_GROUP_LIST_SIZE]; + +/* Set this early so that early errors get offset 0. */ + +ptr = (const pcre_uchar *)pattern; + +/* We can't pass back an error message if errorptr is NULL; I guess the best we +can do is just return NULL, but we can set a code value if there is a code +pointer. */ + +if (errorptr == NULL) + { + if (errorcodeptr != NULL) *errorcodeptr = 99; + return NULL; + } + +*errorptr = NULL; +if (errorcodeptr != NULL) *errorcodeptr = ERR0; + +/* However, we can give a message for this error */ + +if (erroroffset == NULL) + { + errorcode = ERR16; + goto PCRE_EARLY_ERROR_RETURN2; + } + +*erroroffset = 0; + +/* Set up pointers to the individual character tables */ + +if (tables == NULL) tables = PRIV(default_tables); +cd->lcc = tables + lcc_offset; +cd->fcc = tables + fcc_offset; +cd->cbits = tables + cbits_offset; +cd->ctypes = tables + ctypes_offset; + +/* Check that all undefined public option bits are zero */ + +if ((options & ~PUBLIC_COMPILE_OPTIONS) != 0) + { + errorcode = ERR17; + goto PCRE_EARLY_ERROR_RETURN; + } + +/* If PCRE_NEVER_UTF is set, remember it. */ + +if ((options & PCRE_NEVER_UTF) != 0) never_utf = TRUE; + +/* Check for global one-time settings at the start of the pattern, and remember +the offset for later. */ + +cd->external_flags = 0; /* Initialize here for LIMIT_MATCH/RECURSION */ + +while (ptr[skipatstart] == CHAR_LEFT_PARENTHESIS && + ptr[skipatstart+1] == CHAR_ASTERISK) + { + int newnl = 0; + int newbsr = 0; + +/* For completeness and backward compatibility, (*UTFn) is supported in the +relevant libraries, but (*UTF) is generic and always supported. Note that +PCRE_UTF8 == PCRE_UTF16 == PCRE_UTF32. */ + +#ifdef COMPILE_PCRE8 + if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_UTF8_RIGHTPAR, 5) == 0) + { skipatstart += 7; options |= PCRE_UTF8; continue; } +#endif +#ifdef COMPILE_PCRE16 + if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_UTF16_RIGHTPAR, 6) == 0) + { skipatstart += 8; options |= PCRE_UTF16; continue; } +#endif +#ifdef COMPILE_PCRE32 + if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_UTF32_RIGHTPAR, 6) == 0) + { skipatstart += 8; options |= PCRE_UTF32; continue; } +#endif + + else if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_UTF_RIGHTPAR, 4) == 0) + { skipatstart += 6; options |= PCRE_UTF8; continue; } + else if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_UCP_RIGHTPAR, 4) == 0) + { skipatstart += 6; options |= PCRE_UCP; continue; } + else if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_NO_AUTO_POSSESS_RIGHTPAR, 16) == 0) + { skipatstart += 18; options |= PCRE_NO_AUTO_POSSESS; continue; } + else if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_NO_START_OPT_RIGHTPAR, 13) == 0) + { skipatstart += 15; options |= PCRE_NO_START_OPTIMIZE; continue; } + + else if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_LIMIT_MATCH_EQ, 12) == 0) + { + pcre_uint32 c = 0; + int p = skipatstart + 14; + while (isdigit(ptr[p])) + { + if (c > PCRE_UINT32_MAX / 10 - 1) break; /* Integer overflow */ + c = c*10 + ptr[p++] - CHAR_0; + } + if (ptr[p++] != CHAR_RIGHT_PARENTHESIS) break; + if (c < limit_match) + { + limit_match = c; + cd->external_flags |= PCRE_MLSET; + } + skipatstart = p; + continue; + } + + else if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_LIMIT_RECURSION_EQ, 16) == 0) + { + pcre_uint32 c = 0; + int p = skipatstart + 18; + while (isdigit(ptr[p])) + { + if (c > PCRE_UINT32_MAX / 10 - 1) break; /* Integer overflow check */ + c = c*10 + ptr[p++] - CHAR_0; + } + if (ptr[p++] != CHAR_RIGHT_PARENTHESIS) break; + if (c < limit_recursion) + { + limit_recursion = c; + cd->external_flags |= PCRE_RLSET; + } + skipatstart = p; + continue; + } + + if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_CR_RIGHTPAR, 3) == 0) + { skipatstart += 5; newnl = PCRE_NEWLINE_CR; } + else if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_LF_RIGHTPAR, 3) == 0) + { skipatstart += 5; newnl = PCRE_NEWLINE_LF; } + else if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_CRLF_RIGHTPAR, 5) == 0) + { skipatstart += 7; newnl = PCRE_NEWLINE_CR + PCRE_NEWLINE_LF; } + else if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_ANY_RIGHTPAR, 4) == 0) + { skipatstart += 6; newnl = PCRE_NEWLINE_ANY; } + else if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_ANYCRLF_RIGHTPAR, 8) == 0) + { skipatstart += 10; newnl = PCRE_NEWLINE_ANYCRLF; } + + else if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_BSR_ANYCRLF_RIGHTPAR, 12) == 0) + { skipatstart += 14; newbsr = PCRE_BSR_ANYCRLF; } + else if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_BSR_UNICODE_RIGHTPAR, 12) == 0) + { skipatstart += 14; newbsr = PCRE_BSR_UNICODE; } + + if (newnl != 0) + options = (options & ~PCRE_NEWLINE_BITS) | newnl; + else if (newbsr != 0) + options = (options & ~(PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE)) | newbsr; + else break; + } + +/* PCRE_UTF(16|32) have the same value as PCRE_UTF8. */ +utf = (options & PCRE_UTF8) != 0; +if (utf && never_utf) + { + errorcode = ERR78; + goto PCRE_EARLY_ERROR_RETURN2; + } + +/* Can't support UTF unless PCRE has been compiled to include the code. The +return of an error code from PRIV(valid_utf)() is a new feature, introduced in +release 8.13. It is passed back from pcre_[dfa_]exec(), but at the moment is +not used here. */ + +#ifdef SUPPORT_UTF +if (utf && (options & PCRE_NO_UTF8_CHECK) == 0 && + (errorcode = PRIV(valid_utf)((PCRE_PUCHAR)pattern, -1, erroroffset)) != 0) + { +#if defined COMPILE_PCRE8 + errorcode = ERR44; +#elif defined COMPILE_PCRE16 + errorcode = ERR74; +#elif defined COMPILE_PCRE32 + errorcode = ERR77; +#endif + goto PCRE_EARLY_ERROR_RETURN2; + } +#else +if (utf) + { + errorcode = ERR32; + goto PCRE_EARLY_ERROR_RETURN; + } +#endif + +/* Can't support UCP unless PCRE has been compiled to include the code. */ + +#ifndef SUPPORT_UCP +if ((options & PCRE_UCP) != 0) + { + errorcode = ERR67; + goto PCRE_EARLY_ERROR_RETURN; + } +#endif + +/* Check validity of \R options. */ + +if ((options & (PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE)) == + (PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE)) + { + errorcode = ERR56; + goto PCRE_EARLY_ERROR_RETURN; + } + +/* Handle different types of newline. The three bits give seven cases. The +current code allows for fixed one- or two-byte sequences, plus "any" and +"anycrlf". */ + +switch (options & PCRE_NEWLINE_BITS) + { + case 0: newline = NEWLINE; break; /* Build-time default */ + case PCRE_NEWLINE_CR: newline = CHAR_CR; break; + case PCRE_NEWLINE_LF: newline = CHAR_NL; break; + case PCRE_NEWLINE_CR+ + PCRE_NEWLINE_LF: newline = (CHAR_CR << 8) | CHAR_NL; break; + case PCRE_NEWLINE_ANY: newline = -1; break; + case PCRE_NEWLINE_ANYCRLF: newline = -2; break; + default: errorcode = ERR56; goto PCRE_EARLY_ERROR_RETURN; + } + +if (newline == -2) + { + cd->nltype = NLTYPE_ANYCRLF; + } +else if (newline < 0) + { + cd->nltype = NLTYPE_ANY; + } +else + { + cd->nltype = NLTYPE_FIXED; + if (newline > 255) + { + cd->nllen = 2; + cd->nl[0] = (newline >> 8) & 255; + cd->nl[1] = newline & 255; + } + else + { + cd->nllen = 1; + cd->nl[0] = newline; + } + } + +/* Maximum back reference and backref bitmap. The bitmap records up to 31 back +references to help in deciding whether (.*) can be treated as anchored or not. +*/ + +cd->top_backref = 0; +cd->backref_map = 0; + +/* Reflect pattern for debugging output */ + +DPRINTF(("------------------------------------------------------------------\n")); +#ifdef PCRE_DEBUG +print_puchar(stdout, (PCRE_PUCHAR)pattern); +#endif +DPRINTF(("\n")); + +/* Pretend to compile the pattern while actually just accumulating the length +of memory required. This behaviour is triggered by passing a non-NULL final +argument to compile_regex(). We pass a block of workspace (cworkspace) for it +to compile parts of the pattern into; the compiled code is discarded when it is +no longer needed, so hopefully this workspace will never overflow, though there +is a test for its doing so. */ + +cd->bracount = cd->final_bracount = 0; +cd->names_found = 0; +cd->name_entry_size = 0; +cd->name_table = NULL; +cd->dupnames = FALSE; +cd->dupgroups = FALSE; +cd->namedrefcount = 0; +cd->start_code = cworkspace; +cd->hwm = cworkspace; +cd->iscondassert = FALSE; +cd->start_workspace = cworkspace; +cd->workspace_size = COMPILE_WORK_SIZE; +cd->named_groups = named_groups; +cd->named_group_list_size = NAMED_GROUP_LIST_SIZE; +cd->start_pattern = (const pcre_uchar *)pattern; +cd->end_pattern = (const pcre_uchar *)(pattern + STRLEN_UC((const pcre_uchar *)pattern)); +cd->req_varyopt = 0; +cd->parens_depth = 0; +cd->assert_depth = 0; +cd->max_lookbehind = 0; +cd->external_options = options; +cd->open_caps = NULL; + +/* Now do the pre-compile. On error, errorcode will be set non-zero, so we +don't need to look at the result of the function here. The initial options have +been put into the cd block so that they can be changed if an option setting is +found within the regex right at the beginning. Bringing initial option settings +outside can help speed up starting point checks. */ + +ptr += skipatstart; +code = cworkspace; +*code = OP_BRA; + +(void)compile_regex(cd->external_options, &code, &ptr, &errorcode, FALSE, + FALSE, 0, 0, &firstchar, &firstcharflags, &reqchar, &reqcharflags, NULL, + cd, &length); +if (errorcode != 0) goto PCRE_EARLY_ERROR_RETURN; + +DPRINTF(("end pre-compile: length=%d workspace=%d\n", length, + (int)(cd->hwm - cworkspace))); + +if (length > MAX_PATTERN_SIZE) + { + errorcode = ERR20; + goto PCRE_EARLY_ERROR_RETURN; + } + +/* Compute the size of the data block for storing the compiled pattern. Integer +overflow should no longer be possible because nowadays we limit the maximum +value of cd->names_found and cd->name_entry_size. */ + +size = sizeof(REAL_PCRE) + + (length + cd->names_found * cd->name_entry_size) * sizeof(pcre_uchar); + +/* Get the memory. */ + +re = (REAL_PCRE *)(PUBL(malloc))(size); +if (re == NULL) + { + errorcode = ERR21; + goto PCRE_EARLY_ERROR_RETURN; + } + +/* Put in the magic number, and save the sizes, initial options, internal +flags, and character table pointer. NULL is used for the default character +tables. The nullpad field is at the end; it's there to help in the case when a +regex compiled on a system with 4-byte pointers is run on another with 8-byte +pointers. */ + +re->magic_number = MAGIC_NUMBER; +re->size = (int)size; +re->options = cd->external_options; +re->flags = cd->external_flags; +re->limit_match = limit_match; +re->limit_recursion = limit_recursion; +re->first_char = 0; +re->req_char = 0; +re->name_table_offset = sizeof(REAL_PCRE) / sizeof(pcre_uchar); +re->name_entry_size = cd->name_entry_size; +re->name_count = cd->names_found; +re->ref_count = 0; +re->tables = (tables == PRIV(default_tables))? NULL : tables; +re->nullpad = NULL; +#ifdef COMPILE_PCRE32 +re->dummy = 0; +#else +re->dummy1 = re->dummy2 = re->dummy3 = 0; +#endif + +/* The starting points of the name/number translation table and of the code are +passed around in the compile data block. The start/end pattern and initial +options are already set from the pre-compile phase, as is the name_entry_size +field. Reset the bracket count and the names_found field. Also reset the hwm +field; this time it's used for remembering forward references to subpatterns. +*/ + +cd->final_bracount = cd->bracount; /* Save for checking forward references */ +cd->parens_depth = 0; +cd->assert_depth = 0; +cd->bracount = 0; +cd->max_lookbehind = 0; +cd->name_table = (pcre_uchar *)re + re->name_table_offset; +codestart = cd->name_table + re->name_entry_size * re->name_count; +cd->start_code = codestart; +cd->hwm = (pcre_uchar *)(cd->start_workspace); +cd->iscondassert = FALSE; +cd->req_varyopt = 0; +cd->had_accept = FALSE; +cd->had_pruneorskip = FALSE; +cd->check_lookbehind = FALSE; +cd->open_caps = NULL; + +/* If any named groups were found, create the name/number table from the list +created in the first pass. */ + +if (cd->names_found > 0) + { + int i = cd->names_found; + named_group *ng = cd->named_groups; + cd->names_found = 0; + for (; i > 0; i--, ng++) + add_name(cd, ng->name, ng->length, ng->number); + if (cd->named_group_list_size > NAMED_GROUP_LIST_SIZE) + (PUBL(free))((void *)cd->named_groups); + } + +/* Set up a starting, non-extracting bracket, then compile the expression. On +error, errorcode will be set non-zero, so we don't need to look at the result +of the function here. */ + +ptr = (const pcre_uchar *)pattern + skipatstart; +code = (pcre_uchar *)codestart; +*code = OP_BRA; +(void)compile_regex(re->options, &code, &ptr, &errorcode, FALSE, FALSE, 0, 0, + &firstchar, &firstcharflags, &reqchar, &reqcharflags, NULL, cd, NULL); +re->top_bracket = cd->bracount; +re->top_backref = cd->top_backref; +re->max_lookbehind = cd->max_lookbehind; +re->flags = cd->external_flags | PCRE_MODE; + +if (cd->had_accept) + { + reqchar = 0; /* Must disable after (*ACCEPT) */ + reqcharflags = REQ_NONE; + } + +/* If not reached end of pattern on success, there's an excess bracket. */ + +if (errorcode == 0 && *ptr != CHAR_NULL) errorcode = ERR22; + +/* Fill in the terminating state and check for disastrous overflow, but +if debugging, leave the test till after things are printed out. */ + +*code++ = OP_END; + +#ifndef PCRE_DEBUG +if (code - codestart > length) errorcode = ERR23; +#endif + +#ifdef SUPPORT_VALGRIND +/* If the estimated length exceeds the really used length, mark the extra +allocated memory as unaddressable, so that any out-of-bound reads can be +detected. */ +VALGRIND_MAKE_MEM_NOACCESS(code, (length - (code - codestart)) * sizeof(pcre_uchar)); +#endif + +/* Fill in any forward references that are required. There may be repeated +references; optimize for them, as searching a large regex takes time. */ + +if (cd->hwm > cd->start_workspace) + { + int prev_recno = -1; + const pcre_uchar *groupptr = NULL; + while (errorcode == 0 && cd->hwm > cd->start_workspace) + { + int offset, recno; + cd->hwm -= LINK_SIZE; + offset = GET(cd->hwm, 0); + + /* Check that the hwm handling hasn't gone wrong. This whole area is + rewritten in PCRE2 because there are some obscure cases. */ + + if (offset == 0 || codestart[offset-1] != OP_RECURSE) + { + errorcode = ERR10; + break; + } + + recno = GET(codestart, offset); + if (recno != prev_recno) + { + groupptr = PRIV(find_bracket)(codestart, utf, recno); + prev_recno = recno; + } + if (groupptr == NULL) errorcode = ERR53; + else PUT(((pcre_uchar *)codestart), offset, (int)(groupptr - codestart)); + } + } + +/* If the workspace had to be expanded, free the new memory. Set the pointer to +NULL to indicate that forward references have been filled in. */ + +if (cd->workspace_size > COMPILE_WORK_SIZE) + (PUBL(free))((void *)cd->start_workspace); +cd->start_workspace = NULL; + +/* Give an error if there's back reference to a non-existent capturing +subpattern. */ + +if (errorcode == 0 && re->top_backref > re->top_bracket) errorcode = ERR15; + +/* Unless disabled, check whether any single character iterators can be +auto-possessified. The function overwrites the appropriate opcode values, so +the type of the pointer must be cast. NOTE: the intermediate variable "temp" is +used in this code because at least one compiler gives a warning about loss of +"const" attribute if the cast (pcre_uchar *)codestart is used directly in the +function call. */ + +if (errorcode == 0 && (options & PCRE_NO_AUTO_POSSESS) == 0) + { + pcre_uchar *temp = (pcre_uchar *)codestart; + auto_possessify(temp, utf, cd); + } + +/* If there were any lookbehind assertions that contained OP_RECURSE +(recursions or subroutine calls), a flag is set for them to be checked here, +because they may contain forward references. Actual recursions cannot be fixed +length, but subroutine calls can. It is done like this so that those without +OP_RECURSE that are not fixed length get a diagnosic with a useful offset. The +exceptional ones forgo this. We scan the pattern to check that they are fixed +length, and set their lengths. */ + +if (errorcode == 0 && cd->check_lookbehind) + { + pcre_uchar *cc = (pcre_uchar *)codestart; + + /* Loop, searching for OP_REVERSE items, and process those that do not have + their length set. (Actually, it will also re-process any that have a length + of zero, but that is a pathological case, and it does no harm.) When we find + one, we temporarily terminate the branch it is in while we scan it. */ + + for (cc = (pcre_uchar *)PRIV(find_bracket)(codestart, utf, -1); + cc != NULL; + cc = (pcre_uchar *)PRIV(find_bracket)(cc, utf, -1)) + { + if (GET(cc, 1) == 0) + { + int fixed_length; + pcre_uchar *be = cc - 1 - LINK_SIZE + GET(cc, -LINK_SIZE); + int end_op = *be; + *be = OP_END; + fixed_length = find_fixedlength(cc, (re->options & PCRE_UTF8) != 0, TRUE, + cd, NULL); + *be = end_op; + DPRINTF(("fixed length = %d\n", fixed_length)); + if (fixed_length < 0) + { + errorcode = (fixed_length == -2)? ERR36 : + (fixed_length == -4)? ERR70 : ERR25; + break; + } + if (fixed_length > cd->max_lookbehind) cd->max_lookbehind = fixed_length; + PUT(cc, 1, fixed_length); + } + cc += 1 + LINK_SIZE; + } + } + +/* Failed to compile, or error while post-processing */ + +if (errorcode != 0) + { + (PUBL(free))(re); + PCRE_EARLY_ERROR_RETURN: + *erroroffset = (int)(ptr - (const pcre_uchar *)pattern); + PCRE_EARLY_ERROR_RETURN2: + *errorptr = find_error_text(errorcode); + if (errorcodeptr != NULL) *errorcodeptr = errorcode; + return NULL; + } + +/* If the anchored option was not passed, set the flag if we can determine that +the pattern is anchored by virtue of ^ characters or \A or anything else, such +as starting with non-atomic .* when DOTALL is set and there are no occurrences +of *PRUNE or *SKIP. + +Otherwise, if we know what the first byte has to be, save it, because that +speeds up unanchored matches no end. If not, see if we can set the +PCRE_STARTLINE flag. This is helpful for multiline matches when all branches +start with ^. and also when all branches start with non-atomic .* for +non-DOTALL matches when *PRUNE and SKIP are not present. */ + +if ((re->options & PCRE_ANCHORED) == 0) + { + if (is_anchored(codestart, 0, cd, 0)) re->options |= PCRE_ANCHORED; + else + { + if (firstcharflags < 0) + firstchar = find_firstassertedchar(codestart, &firstcharflags, FALSE); + if (firstcharflags >= 0) /* Remove caseless flag for non-caseable chars */ + { +#if defined COMPILE_PCRE8 + re->first_char = firstchar & 0xff; +#elif defined COMPILE_PCRE16 + re->first_char = firstchar & 0xffff; +#elif defined COMPILE_PCRE32 + re->first_char = firstchar; +#endif + if ((firstcharflags & REQ_CASELESS) != 0) + { +#if defined SUPPORT_UCP && !(defined COMPILE_PCRE8) + /* We ignore non-ASCII first chars in 8 bit mode. */ + if (utf) + { + if (re->first_char < 128) + { + if (cd->fcc[re->first_char] != re->first_char) + re->flags |= PCRE_FCH_CASELESS; + } + else if (UCD_OTHERCASE(re->first_char) != re->first_char) + re->flags |= PCRE_FCH_CASELESS; + } + else +#endif + if (MAX_255(re->first_char) + && cd->fcc[re->first_char] != re->first_char) + re->flags |= PCRE_FCH_CASELESS; + } + + re->flags |= PCRE_FIRSTSET; + } + + else if (is_startline(codestart, 0, cd, 0, FALSE)) re->flags |= PCRE_STARTLINE; + } + } + +/* For an anchored pattern, we use the "required byte" only if it follows a +variable length item in the regex. Remove the caseless flag for non-caseable +bytes. */ + +if (reqcharflags >= 0 && + ((re->options & PCRE_ANCHORED) == 0 || (reqcharflags & REQ_VARY) != 0)) + { +#if defined COMPILE_PCRE8 + re->req_char = reqchar & 0xff; +#elif defined COMPILE_PCRE16 + re->req_char = reqchar & 0xffff; +#elif defined COMPILE_PCRE32 + re->req_char = reqchar; +#endif + if ((reqcharflags & REQ_CASELESS) != 0) + { +#if defined SUPPORT_UCP && !(defined COMPILE_PCRE8) + /* We ignore non-ASCII first chars in 8 bit mode. */ + if (utf) + { + if (re->req_char < 128) + { + if (cd->fcc[re->req_char] != re->req_char) + re->flags |= PCRE_RCH_CASELESS; + } + else if (UCD_OTHERCASE(re->req_char) != re->req_char) + re->flags |= PCRE_RCH_CASELESS; + } + else +#endif + if (MAX_255(re->req_char) && cd->fcc[re->req_char] != re->req_char) + re->flags |= PCRE_RCH_CASELESS; + } + + re->flags |= PCRE_REQCHSET; + } + +/* Print out the compiled data if debugging is enabled. This is never the +case when building a production library. */ + +#ifdef PCRE_DEBUG +printf("Length = %d top_bracket = %d top_backref = %d\n", + length, re->top_bracket, re->top_backref); + +printf("Options=%08x\n", re->options); + +if ((re->flags & PCRE_FIRSTSET) != 0) + { + pcre_uchar ch = re->first_char; + const char *caseless = + ((re->flags & PCRE_FCH_CASELESS) == 0)? "" : " (caseless)"; + if (PRINTABLE(ch)) printf("First char = %c%s\n", ch, caseless); + else printf("First char = \\x%02x%s\n", ch, caseless); + } + +if ((re->flags & PCRE_REQCHSET) != 0) + { + pcre_uchar ch = re->req_char; + const char *caseless = + ((re->flags & PCRE_RCH_CASELESS) == 0)? "" : " (caseless)"; + if (PRINTABLE(ch)) printf("Req char = %c%s\n", ch, caseless); + else printf("Req char = \\x%02x%s\n", ch, caseless); + } + +#if defined COMPILE_PCRE8 +pcre_printint((pcre *)re, stdout, TRUE); +#elif defined COMPILE_PCRE16 +pcre16_printint((pcre *)re, stdout, TRUE); +#elif defined COMPILE_PCRE32 +pcre32_printint((pcre *)re, stdout, TRUE); +#endif + +/* This check is done here in the debugging case so that the code that +was compiled can be seen. */ + +if (code - codestart > length) + { + (PUBL(free))(re); + *errorptr = find_error_text(ERR23); + *erroroffset = ptr - (pcre_uchar *)pattern; + if (errorcodeptr != NULL) *errorcodeptr = ERR23; + return NULL; + } +#endif /* PCRE_DEBUG */ + +/* Check for a pattern than can match an empty string, so that this information +can be provided to applications. */ + +do + { + if (could_be_empty_branch(codestart, code, utf, cd, NULL)) + { + re->flags |= PCRE_MATCH_EMPTY; + break; + } + codestart += GET(codestart, 1); + } +while (*codestart == OP_ALT); + +#if defined COMPILE_PCRE8 +return (pcre *)re; +#elif defined COMPILE_PCRE16 +return (pcre16 *)re; +#elif defined COMPILE_PCRE32 +return (pcre32 *)re; +#endif +} + +/* End of pcre_compile.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_config.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_config.c new file mode 100755 index 000000000..1cbdd9c96 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_config.c @@ -0,0 +1,190 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + + +/* This module contains the external function pcre_config(). */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +/* Keep the original link size. */ +static int real_link_size = LINK_SIZE; + +#include "pcre_internal.h" + + +/************************************************* +* Return info about what features are configured * +*************************************************/ + +/* This function has an extensible interface so that additional items can be +added compatibly. + +Arguments: + what what information is required + where where to put the information + +Returns: 0 if data returned, negative on error +*/ + +#if defined COMPILE_PCRE8 +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre_config(int what, void *where) +#elif defined COMPILE_PCRE16 +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre16_config(int what, void *where) +#elif defined COMPILE_PCRE32 +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre32_config(int what, void *where) +#endif +{ +switch (what) + { + case PCRE_CONFIG_UTF8: +#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32 + *((int *)where) = 0; + return PCRE_ERROR_BADOPTION; +#else +#if defined SUPPORT_UTF + *((int *)where) = 1; +#else + *((int *)where) = 0; +#endif + break; +#endif + + case PCRE_CONFIG_UTF16: +#if defined COMPILE_PCRE8 || defined COMPILE_PCRE32 + *((int *)where) = 0; + return PCRE_ERROR_BADOPTION; +#else +#if defined SUPPORT_UTF + *((int *)where) = 1; +#else + *((int *)where) = 0; +#endif + break; +#endif + + case PCRE_CONFIG_UTF32: +#if defined COMPILE_PCRE8 || defined COMPILE_PCRE16 + *((int *)where) = 0; + return PCRE_ERROR_BADOPTION; +#else +#if defined SUPPORT_UTF + *((int *)where) = 1; +#else + *((int *)where) = 0; +#endif + break; +#endif + + case PCRE_CONFIG_UNICODE_PROPERTIES: +#ifdef SUPPORT_UCP + *((int *)where) = 1; +#else + *((int *)where) = 0; +#endif + break; + + case PCRE_CONFIG_JIT: +#ifdef SUPPORT_JIT + *((int *)where) = 1; +#else + *((int *)where) = 0; +#endif + break; + + case PCRE_CONFIG_JITTARGET: +#ifdef SUPPORT_JIT + *((const char **)where) = PRIV(jit_get_target)(); +#else + *((const char **)where) = NULL; +#endif + break; + + case PCRE_CONFIG_NEWLINE: + *((int *)where) = NEWLINE; + break; + + case PCRE_CONFIG_BSR: +#ifdef BSR_ANYCRLF + *((int *)where) = 1; +#else + *((int *)where) = 0; +#endif + break; + + case PCRE_CONFIG_LINK_SIZE: + *((int *)where) = real_link_size; + break; + + case PCRE_CONFIG_POSIX_MALLOC_THRESHOLD: + *((int *)where) = POSIX_MALLOC_THRESHOLD; + break; + + case PCRE_CONFIG_PARENS_LIMIT: + *((unsigned long int *)where) = PARENS_NEST_LIMIT; + break; + + case PCRE_CONFIG_MATCH_LIMIT: + *((unsigned long int *)where) = MATCH_LIMIT; + break; + + case PCRE_CONFIG_MATCH_LIMIT_RECURSION: + *((unsigned long int *)where) = MATCH_LIMIT_RECURSION; + break; + + case PCRE_CONFIG_STACKRECURSE: +#ifdef NO_RECURSE + *((int *)where) = 0; +#else + *((int *)where) = 1; +#endif + break; + + default: return PCRE_ERROR_BADOPTION; + } + +return 0; +} + +/* End of pcre_config.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_dfa_exec.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_dfa_exec.c new file mode 100755 index 000000000..f333381d0 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_dfa_exec.c @@ -0,0 +1,3676 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language (but see +below for why this module is different). + + Written by Philip Hazel + Copyright (c) 1997-2017 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +/* This module contains the external function pcre_dfa_exec(), which is an +alternative matching function that uses a sort of DFA algorithm (not a true +FSM). This is NOT Perl-compatible, but it has advantages in certain +applications. */ + + +/* NOTE ABOUT PERFORMANCE: A user of this function sent some code that improved +the performance of his patterns greatly. I could not use it as it stood, as it +was not thread safe, and made assumptions about pattern sizes. Also, it caused +test 7 to loop, and test 9 to crash with a segfault. + +The issue is the check for duplicate states, which is done by a simple linear +search up the state list. (Grep for "duplicate" below to find the code.) For +many patterns, there will never be many states active at one time, so a simple +linear search is fine. In patterns that have many active states, it might be a +bottleneck. The suggested code used an indexing scheme to remember which states +had previously been used for each character, and avoided the linear search when +it knew there was no chance of a duplicate. This was implemented when adding +states to the state lists. + +I wrote some thread-safe, not-limited code to try something similar at the time +of checking for duplicates (instead of when adding states), using index vectors +on the stack. It did give a 13% improvement with one specially constructed +pattern for certain subject strings, but on other strings and on many of the +simpler patterns in the test suite it did worse. The major problem, I think, +was the extra time to initialize the index. This had to be done for each call +of internal_dfa_exec(). (The supplied patch used a static vector, initialized +only once - I suspect this was the cause of the problems with the tests.) + +Overall, I concluded that the gains in some cases did not outweigh the losses +in others, so I abandoned this code. */ + + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#define NLBLOCK md /* Block containing newline information */ +#define PSSTART start_subject /* Field containing processed string start */ +#define PSEND end_subject /* Field containing processed string end */ + +#include "pcre_internal.h" + + +/* For use to indent debugging output */ + +#define SP " " + + +/************************************************* +* Code parameters and static tables * +*************************************************/ + +/* These are offsets that are used to turn the OP_TYPESTAR and friends opcodes +into others, under special conditions. A gap of 20 between the blocks should be +enough. The resulting opcodes don't have to be less than 256 because they are +never stored, so we push them well clear of the normal opcodes. */ + +#define OP_PROP_EXTRA 300 +#define OP_EXTUNI_EXTRA 320 +#define OP_ANYNL_EXTRA 340 +#define OP_HSPACE_EXTRA 360 +#define OP_VSPACE_EXTRA 380 + + +/* This table identifies those opcodes that are followed immediately by a +character that is to be tested in some way. This makes it possible to +centralize the loading of these characters. In the case of Type * etc, the +"character" is the opcode for \D, \d, \S, \s, \W, or \w, which will always be a +small value. Non-zero values in the table are the offsets from the opcode where +the character is to be found. ***NOTE*** If the start of this table is +modified, the three tables that follow must also be modified. */ + +static const pcre_uint8 coptable[] = { + 0, /* End */ + 0, 0, 0, 0, 0, /* \A, \G, \K, \B, \b */ + 0, 0, 0, 0, 0, 0, /* \D, \d, \S, \s, \W, \w */ + 0, 0, 0, /* Any, AllAny, Anybyte */ + 0, 0, /* \P, \p */ + 0, 0, 0, 0, 0, /* \R, \H, \h, \V, \v */ + 0, /* \X */ + 0, 0, 0, 0, 0, 0, /* \Z, \z, $, $M, ^, ^M */ + 1, /* Char */ + 1, /* Chari */ + 1, /* not */ + 1, /* noti */ + /* Positive single-char repeats */ + 1, 1, 1, 1, 1, 1, /* *, *?, +, +?, ?, ?? */ + 1+IMM2_SIZE, 1+IMM2_SIZE, /* upto, minupto */ + 1+IMM2_SIZE, /* exact */ + 1, 1, 1, 1+IMM2_SIZE, /* *+, ++, ?+, upto+ */ + 1, 1, 1, 1, 1, 1, /* *I, *?I, +I, +?I, ?I, ??I */ + 1+IMM2_SIZE, 1+IMM2_SIZE, /* upto I, minupto I */ + 1+IMM2_SIZE, /* exact I */ + 1, 1, 1, 1+IMM2_SIZE, /* *+I, ++I, ?+I, upto+I */ + /* Negative single-char repeats - only for chars < 256 */ + 1, 1, 1, 1, 1, 1, /* NOT *, *?, +, +?, ?, ?? */ + 1+IMM2_SIZE, 1+IMM2_SIZE, /* NOT upto, minupto */ + 1+IMM2_SIZE, /* NOT exact */ + 1, 1, 1, 1+IMM2_SIZE, /* NOT *+, ++, ?+, upto+ */ + 1, 1, 1, 1, 1, 1, /* NOT *I, *?I, +I, +?I, ?I, ??I */ + 1+IMM2_SIZE, 1+IMM2_SIZE, /* NOT upto I, minupto I */ + 1+IMM2_SIZE, /* NOT exact I */ + 1, 1, 1, 1+IMM2_SIZE, /* NOT *+I, ++I, ?+I, upto+I */ + /* Positive type repeats */ + 1, 1, 1, 1, 1, 1, /* Type *, *?, +, +?, ?, ?? */ + 1+IMM2_SIZE, 1+IMM2_SIZE, /* Type upto, minupto */ + 1+IMM2_SIZE, /* Type exact */ + 1, 1, 1, 1+IMM2_SIZE, /* Type *+, ++, ?+, upto+ */ + /* Character class & ref repeats */ + 0, 0, 0, 0, 0, 0, /* *, *?, +, +?, ?, ?? */ + 0, 0, /* CRRANGE, CRMINRANGE */ + 0, 0, 0, 0, /* Possessive *+, ++, ?+, CRPOSRANGE */ + 0, /* CLASS */ + 0, /* NCLASS */ + 0, /* XCLASS - variable length */ + 0, /* REF */ + 0, /* REFI */ + 0, /* DNREF */ + 0, /* DNREFI */ + 0, /* RECURSE */ + 0, /* CALLOUT */ + 0, /* Alt */ + 0, /* Ket */ + 0, /* KetRmax */ + 0, /* KetRmin */ + 0, /* KetRpos */ + 0, /* Reverse */ + 0, /* Assert */ + 0, /* Assert not */ + 0, /* Assert behind */ + 0, /* Assert behind not */ + 0, 0, /* ONCE, ONCE_NC */ + 0, 0, 0, 0, 0, /* BRA, BRAPOS, CBRA, CBRAPOS, COND */ + 0, 0, 0, 0, 0, /* SBRA, SBRAPOS, SCBRA, SCBRAPOS, SCOND */ + 0, 0, /* CREF, DNCREF */ + 0, 0, /* RREF, DNRREF */ + 0, /* DEF */ + 0, 0, 0, /* BRAZERO, BRAMINZERO, BRAPOSZERO */ + 0, 0, 0, /* MARK, PRUNE, PRUNE_ARG */ + 0, 0, 0, 0, /* SKIP, SKIP_ARG, THEN, THEN_ARG */ + 0, 0, 0, 0, /* COMMIT, FAIL, ACCEPT, ASSERT_ACCEPT */ + 0, 0 /* CLOSE, SKIPZERO */ +}; + +/* This table identifies those opcodes that inspect a character. It is used to +remember the fact that a character could have been inspected when the end of +the subject is reached. ***NOTE*** If the start of this table is modified, the +two tables that follow must also be modified. */ + +static const pcre_uint8 poptable[] = { + 0, /* End */ + 0, 0, 0, 1, 1, /* \A, \G, \K, \B, \b */ + 1, 1, 1, 1, 1, 1, /* \D, \d, \S, \s, \W, \w */ + 1, 1, 1, /* Any, AllAny, Anybyte */ + 1, 1, /* \P, \p */ + 1, 1, 1, 1, 1, /* \R, \H, \h, \V, \v */ + 1, /* \X */ + 0, 0, 0, 0, 0, 0, /* \Z, \z, $, $M, ^, ^M */ + 1, /* Char */ + 1, /* Chari */ + 1, /* not */ + 1, /* noti */ + /* Positive single-char repeats */ + 1, 1, 1, 1, 1, 1, /* *, *?, +, +?, ?, ?? */ + 1, 1, 1, /* upto, minupto, exact */ + 1, 1, 1, 1, /* *+, ++, ?+, upto+ */ + 1, 1, 1, 1, 1, 1, /* *I, *?I, +I, +?I, ?I, ??I */ + 1, 1, 1, /* upto I, minupto I, exact I */ + 1, 1, 1, 1, /* *+I, ++I, ?+I, upto+I */ + /* Negative single-char repeats - only for chars < 256 */ + 1, 1, 1, 1, 1, 1, /* NOT *, *?, +, +?, ?, ?? */ + 1, 1, 1, /* NOT upto, minupto, exact */ + 1, 1, 1, 1, /* NOT *+, ++, ?+, upto+ */ + 1, 1, 1, 1, 1, 1, /* NOT *I, *?I, +I, +?I, ?I, ??I */ + 1, 1, 1, /* NOT upto I, minupto I, exact I */ + 1, 1, 1, 1, /* NOT *+I, ++I, ?+I, upto+I */ + /* Positive type repeats */ + 1, 1, 1, 1, 1, 1, /* Type *, *?, +, +?, ?, ?? */ + 1, 1, 1, /* Type upto, minupto, exact */ + 1, 1, 1, 1, /* Type *+, ++, ?+, upto+ */ + /* Character class & ref repeats */ + 1, 1, 1, 1, 1, 1, /* *, *?, +, +?, ?, ?? */ + 1, 1, /* CRRANGE, CRMINRANGE */ + 1, 1, 1, 1, /* Possessive *+, ++, ?+, CRPOSRANGE */ + 1, /* CLASS */ + 1, /* NCLASS */ + 1, /* XCLASS - variable length */ + 0, /* REF */ + 0, /* REFI */ + 0, /* DNREF */ + 0, /* DNREFI */ + 0, /* RECURSE */ + 0, /* CALLOUT */ + 0, /* Alt */ + 0, /* Ket */ + 0, /* KetRmax */ + 0, /* KetRmin */ + 0, /* KetRpos */ + 0, /* Reverse */ + 0, /* Assert */ + 0, /* Assert not */ + 0, /* Assert behind */ + 0, /* Assert behind not */ + 0, 0, /* ONCE, ONCE_NC */ + 0, 0, 0, 0, 0, /* BRA, BRAPOS, CBRA, CBRAPOS, COND */ + 0, 0, 0, 0, 0, /* SBRA, SBRAPOS, SCBRA, SCBRAPOS, SCOND */ + 0, 0, /* CREF, DNCREF */ + 0, 0, /* RREF, DNRREF */ + 0, /* DEF */ + 0, 0, 0, /* BRAZERO, BRAMINZERO, BRAPOSZERO */ + 0, 0, 0, /* MARK, PRUNE, PRUNE_ARG */ + 0, 0, 0, 0, /* SKIP, SKIP_ARG, THEN, THEN_ARG */ + 0, 0, 0, 0, /* COMMIT, FAIL, ACCEPT, ASSERT_ACCEPT */ + 0, 0 /* CLOSE, SKIPZERO */ +}; + +/* These 2 tables allow for compact code for testing for \D, \d, \S, \s, \W, +and \w */ + +static const pcre_uint8 toptable1[] = { + 0, 0, 0, 0, 0, 0, + ctype_digit, ctype_digit, + ctype_space, ctype_space, + ctype_word, ctype_word, + 0, 0 /* OP_ANY, OP_ALLANY */ +}; + +static const pcre_uint8 toptable2[] = { + 0, 0, 0, 0, 0, 0, + ctype_digit, 0, + ctype_space, 0, + ctype_word, 0, + 1, 1 /* OP_ANY, OP_ALLANY */ +}; + + +/* Structure for holding data about a particular state, which is in effect the +current data for an active path through the match tree. It must consist +entirely of ints because the working vector we are passed, and which we put +these structures in, is a vector of ints. */ + +typedef struct stateblock { + int offset; /* Offset to opcode */ + int count; /* Count for repeats */ + int data; /* Some use extra data */ +} stateblock; + +#define INTS_PER_STATEBLOCK (int)(sizeof(stateblock)/sizeof(int)) + + +#ifdef PCRE_DEBUG +/************************************************* +* Print character string * +*************************************************/ + +/* Character string printing function for debugging. + +Arguments: + p points to string + length number of bytes + f where to print + +Returns: nothing +*/ + +static void +pchars(const pcre_uchar *p, int length, FILE *f) +{ +pcre_uint32 c; +while (length-- > 0) + { + if (isprint(c = *(p++))) + fprintf(f, "%c", c); + else + fprintf(f, "\\x{%02x}", c); + } +} +#endif + + + +/************************************************* +* Execute a Regular Expression - DFA engine * +*************************************************/ + +/* This internal function applies a compiled pattern to a subject string, +starting at a given point, using a DFA engine. This function is called from the +external one, possibly multiple times if the pattern is not anchored. The +function calls itself recursively for some kinds of subpattern. + +Arguments: + md the match_data block with fixed information + this_start_code the opening bracket of this subexpression's code + current_subject where we currently are in the subject string + start_offset start offset in the subject string + offsets vector to contain the matching string offsets + offsetcount size of same + workspace vector of workspace + wscount size of same + rlevel function call recursion level + +Returns: > 0 => number of match offset pairs placed in offsets + = 0 => offsets overflowed; longest matches are present + -1 => failed to match + < -1 => some kind of unexpected problem + +The following macros are used for adding states to the two state vectors (one +for the current character, one for the following character). */ + +#define ADD_ACTIVE(x,y) \ + if (active_count++ < wscount) \ + { \ + next_active_state->offset = (x); \ + next_active_state->count = (y); \ + next_active_state++; \ + DPRINTF(("%.*sADD_ACTIVE(%d,%d)\n", rlevel*2-2, SP, (x), (y))); \ + } \ + else return PCRE_ERROR_DFA_WSSIZE + +#define ADD_ACTIVE_DATA(x,y,z) \ + if (active_count++ < wscount) \ + { \ + next_active_state->offset = (x); \ + next_active_state->count = (y); \ + next_active_state->data = (z); \ + next_active_state++; \ + DPRINTF(("%.*sADD_ACTIVE_DATA(%d,%d,%d)\n", rlevel*2-2, SP, (x), (y), (z))); \ + } \ + else return PCRE_ERROR_DFA_WSSIZE + +#define ADD_NEW(x,y) \ + if (new_count++ < wscount) \ + { \ + next_new_state->offset = (x); \ + next_new_state->count = (y); \ + next_new_state++; \ + DPRINTF(("%.*sADD_NEW(%d,%d)\n", rlevel*2-2, SP, (x), (y))); \ + } \ + else return PCRE_ERROR_DFA_WSSIZE + +#define ADD_NEW_DATA(x,y,z) \ + if (new_count++ < wscount) \ + { \ + next_new_state->offset = (x); \ + next_new_state->count = (y); \ + next_new_state->data = (z); \ + next_new_state++; \ + DPRINTF(("%.*sADD_NEW_DATA(%d,%d,%d) line %d\n", rlevel*2-2, SP, \ + (x), (y), (z), __LINE__)); \ + } \ + else return PCRE_ERROR_DFA_WSSIZE + +/* And now, here is the code */ + +static int +internal_dfa_exec( + dfa_match_data *md, + const pcre_uchar *this_start_code, + const pcre_uchar *current_subject, + int start_offset, + int *offsets, + int offsetcount, + int *workspace, + int wscount, + int rlevel) +{ +stateblock *active_states, *new_states, *temp_states; +stateblock *next_active_state, *next_new_state; + +const pcre_uint8 *ctypes, *lcc, *fcc; +const pcre_uchar *ptr; +const pcre_uchar *end_code, *first_op; + +dfa_recursion_info new_recursive; + +int active_count, new_count, match_count; + +/* Some fields in the md block are frequently referenced, so we load them into +independent variables in the hope that this will perform better. */ + +const pcre_uchar *start_subject = md->start_subject; +const pcre_uchar *end_subject = md->end_subject; +const pcre_uchar *start_code = md->start_code; + +#ifdef SUPPORT_UTF +BOOL utf = (md->poptions & PCRE_UTF8) != 0; +#else +BOOL utf = FALSE; +#endif + +BOOL reset_could_continue = FALSE; + +rlevel++; +offsetcount &= (-2); + +wscount -= 2; +wscount = (wscount - (wscount % (INTS_PER_STATEBLOCK * 2))) / + (2 * INTS_PER_STATEBLOCK); + +DPRINTF(("\n%.*s---------------------\n" + "%.*sCall to internal_dfa_exec f=%d\n", + rlevel*2-2, SP, rlevel*2-2, SP, rlevel)); + +ctypes = md->tables + ctypes_offset; +lcc = md->tables + lcc_offset; +fcc = md->tables + fcc_offset; + +match_count = PCRE_ERROR_NOMATCH; /* A negative number */ + +active_states = (stateblock *)(workspace + 2); +next_new_state = new_states = active_states + wscount; +new_count = 0; + +first_op = this_start_code + 1 + LINK_SIZE + + ((*this_start_code == OP_CBRA || *this_start_code == OP_SCBRA || + *this_start_code == OP_CBRAPOS || *this_start_code == OP_SCBRAPOS) + ? IMM2_SIZE:0); + +/* The first thing in any (sub) pattern is a bracket of some sort. Push all +the alternative states onto the list, and find out where the end is. This +makes is possible to use this function recursively, when we want to stop at a +matching internal ket rather than at the end. + +If the first opcode in the first alternative is OP_REVERSE, we are dealing with +a backward assertion. In that case, we have to find out the maximum amount to +move back, and set up each alternative appropriately. */ + +if (*first_op == OP_REVERSE) + { + int max_back = 0; + int gone_back; + + end_code = this_start_code; + do + { + int back = GET(end_code, 2+LINK_SIZE); + if (back > max_back) max_back = back; + end_code += GET(end_code, 1); + } + while (*end_code == OP_ALT); + + /* If we can't go back the amount required for the longest lookbehind + pattern, go back as far as we can; some alternatives may still be viable. */ + +#ifdef SUPPORT_UTF + /* In character mode we have to step back character by character */ + + if (utf) + { + for (gone_back = 0; gone_back < max_back; gone_back++) + { + if (current_subject <= start_subject) break; + current_subject--; + ACROSSCHAR(current_subject > start_subject, *current_subject, current_subject--); + } + } + else +#endif + + /* In byte-mode we can do this quickly. */ + + { + gone_back = (current_subject - max_back < start_subject)? + (int)(current_subject - start_subject) : max_back; + current_subject -= gone_back; + } + + /* Save the earliest consulted character */ + + if (current_subject < md->start_used_ptr) + md->start_used_ptr = current_subject; + + /* Now we can process the individual branches. */ + + end_code = this_start_code; + do + { + int back = GET(end_code, 2+LINK_SIZE); + if (back <= gone_back) + { + int bstate = (int)(end_code - start_code + 2 + 2*LINK_SIZE); + ADD_NEW_DATA(-bstate, 0, gone_back - back); + } + end_code += GET(end_code, 1); + } + while (*end_code == OP_ALT); + } + +/* This is the code for a "normal" subpattern (not a backward assertion). The +start of a whole pattern is always one of these. If we are at the top level, +we may be asked to restart matching from the same point that we reached for a +previous partial match. We still have to scan through the top-level branches to +find the end state. */ + +else + { + end_code = this_start_code; + + /* Restarting */ + + if (rlevel == 1 && (md->moptions & PCRE_DFA_RESTART) != 0) + { + do { end_code += GET(end_code, 1); } while (*end_code == OP_ALT); + new_count = workspace[1]; + if (!workspace[0]) + memcpy(new_states, active_states, new_count * sizeof(stateblock)); + } + + /* Not restarting */ + + else + { + int length = 1 + LINK_SIZE + + ((*this_start_code == OP_CBRA || *this_start_code == OP_SCBRA || + *this_start_code == OP_CBRAPOS || *this_start_code == OP_SCBRAPOS) + ? IMM2_SIZE:0); + do + { + ADD_NEW((int)(end_code - start_code + length), 0); + end_code += GET(end_code, 1); + length = 1 + LINK_SIZE; + } + while (*end_code == OP_ALT); + } + } + +workspace[0] = 0; /* Bit indicating which vector is current */ + +DPRINTF(("%.*sEnd state = %d\n", rlevel*2-2, SP, (int)(end_code - start_code))); + +/* Loop for scanning the subject */ + +ptr = current_subject; +for (;;) + { + int i, j; + int clen, dlen; + pcre_uint32 c, d; + int forced_fail = 0; + BOOL partial_newline = FALSE; + BOOL could_continue = reset_could_continue; + reset_could_continue = FALSE; + + /* Make the new state list into the active state list and empty the + new state list. */ + + temp_states = active_states; + active_states = new_states; + new_states = temp_states; + active_count = new_count; + new_count = 0; + + workspace[0] ^= 1; /* Remember for the restarting feature */ + workspace[1] = active_count; + +#ifdef PCRE_DEBUG + printf("%.*sNext character: rest of subject = \"", rlevel*2-2, SP); + pchars(ptr, STRLEN_UC(ptr), stdout); + printf("\"\n"); + + printf("%.*sActive states: ", rlevel*2-2, SP); + for (i = 0; i < active_count; i++) + printf("%d/%d ", active_states[i].offset, active_states[i].count); + printf("\n"); +#endif + + /* Set the pointers for adding new states */ + + next_active_state = active_states + active_count; + next_new_state = new_states; + + /* Load the current character from the subject outside the loop, as many + different states may want to look at it, and we assume that at least one + will. */ + + if (ptr < end_subject) + { + clen = 1; /* Number of data items in the character */ +#ifdef SUPPORT_UTF + GETCHARLENTEST(c, ptr, clen); +#else + c = *ptr; +#endif /* SUPPORT_UTF */ + } + else + { + clen = 0; /* This indicates the end of the subject */ + c = NOTACHAR; /* This value should never actually be used */ + } + + /* Scan up the active states and act on each one. The result of an action + may be to add more states to the currently active list (e.g. on hitting a + parenthesis) or it may be to put states on the new list, for considering + when we move the character pointer on. */ + + for (i = 0; i < active_count; i++) + { + stateblock *current_state = active_states + i; + BOOL caseless = FALSE; + const pcre_uchar *code; + int state_offset = current_state->offset; + int codevalue, rrc; + int count; + +#ifdef PCRE_DEBUG + printf ("%.*sProcessing state %d c=", rlevel*2-2, SP, state_offset); + if (clen == 0) printf("EOL\n"); + else if (c > 32 && c < 127) printf("'%c'\n", c); + else printf("0x%02x\n", c); +#endif + + /* A negative offset is a special case meaning "hold off going to this + (negated) state until the number of characters in the data field have + been skipped". If the could_continue flag was passed over from a previous + state, arrange for it to passed on. */ + + if (state_offset < 0) + { + if (current_state->data > 0) + { + DPRINTF(("%.*sSkipping this character\n", rlevel*2-2, SP)); + ADD_NEW_DATA(state_offset, current_state->count, + current_state->data - 1); + if (could_continue) reset_could_continue = TRUE; + continue; + } + else + { + current_state->offset = state_offset = -state_offset; + } + } + + /* Check for a duplicate state with the same count, and skip if found. + See the note at the head of this module about the possibility of improving + performance here. */ + + for (j = 0; j < i; j++) + { + if (active_states[j].offset == state_offset && + active_states[j].count == current_state->count) + { + DPRINTF(("%.*sDuplicate state: skipped\n", rlevel*2-2, SP)); + goto NEXT_ACTIVE_STATE; + } + } + + /* The state offset is the offset to the opcode */ + + code = start_code + state_offset; + codevalue = *code; + + /* If this opcode inspects a character, but we are at the end of the + subject, remember the fact for use when testing for a partial match. */ + + if (clen == 0 && poptable[codevalue] != 0) + could_continue = TRUE; + + /* If this opcode is followed by an inline character, load it. It is + tempting to test for the presence of a subject character here, but that + is wrong, because sometimes zero repetitions of the subject are + permitted. + + We also use this mechanism for opcodes such as OP_TYPEPLUS that take an + argument that is not a data character - but is always one byte long because + the values are small. We have to take special action to deal with \P, \p, + \H, \h, \V, \v and \X in this case. To keep the other cases fast, convert + these ones to new opcodes. */ + + if (coptable[codevalue] > 0) + { + dlen = 1; +#ifdef SUPPORT_UTF + if (utf) { GETCHARLEN(d, (code + coptable[codevalue]), dlen); } else +#endif /* SUPPORT_UTF */ + d = code[coptable[codevalue]]; + if (codevalue >= OP_TYPESTAR) + { + switch(d) + { + case OP_ANYBYTE: return PCRE_ERROR_DFA_UITEM; + case OP_NOTPROP: + case OP_PROP: codevalue += OP_PROP_EXTRA; break; + case OP_ANYNL: codevalue += OP_ANYNL_EXTRA; break; + case OP_EXTUNI: codevalue += OP_EXTUNI_EXTRA; break; + case OP_NOT_HSPACE: + case OP_HSPACE: codevalue += OP_HSPACE_EXTRA; break; + case OP_NOT_VSPACE: + case OP_VSPACE: codevalue += OP_VSPACE_EXTRA; break; + default: break; + } + } + } + else + { + dlen = 0; /* Not strictly necessary, but compilers moan */ + d = NOTACHAR; /* if these variables are not set. */ + } + + + /* Now process the individual opcodes */ + + switch (codevalue) + { +/* ========================================================================== */ + /* These cases are never obeyed. This is a fudge that causes a compile- + time error if the vectors coptable or poptable, which are indexed by + opcode, are not the correct length. It seems to be the only way to do + such a check at compile time, as the sizeof() operator does not work + in the C preprocessor. */ + + case OP_TABLE_LENGTH: + case OP_TABLE_LENGTH + + ((sizeof(coptable) == OP_TABLE_LENGTH) && + (sizeof(poptable) == OP_TABLE_LENGTH)): + break; + +/* ========================================================================== */ + /* Reached a closing bracket. If not at the end of the pattern, carry + on with the next opcode. For repeating opcodes, also add the repeat + state. Note that KETRPOS will always be encountered at the end of the + subpattern, because the possessive subpattern repeats are always handled + using recursive calls. Thus, it never adds any new states. + + At the end of the (sub)pattern, unless we have an empty string and + PCRE_NOTEMPTY is set, or PCRE_NOTEMPTY_ATSTART is set and we are at the + start of the subject, save the match data, shifting up all previous + matches so we always have the longest first. */ + + case OP_KET: + case OP_KETRMIN: + case OP_KETRMAX: + case OP_KETRPOS: + if (code != end_code) + { + ADD_ACTIVE(state_offset + 1 + LINK_SIZE, 0); + if (codevalue != OP_KET) + { + ADD_ACTIVE(state_offset - GET(code, 1), 0); + } + } + else + { + if (ptr > current_subject || + ((md->moptions & PCRE_NOTEMPTY) == 0 && + ((md->moptions & PCRE_NOTEMPTY_ATSTART) == 0 || + current_subject > start_subject + md->start_offset))) + { + if (match_count < 0) match_count = (offsetcount >= 2)? 1 : 0; + else if (match_count > 0 && ++match_count * 2 > offsetcount) + match_count = 0; + count = ((match_count == 0)? offsetcount : match_count * 2) - 2; + if (count > 0) memmove(offsets + 2, offsets, count * sizeof(int)); + if (offsetcount >= 2) + { + offsets[0] = (int)(current_subject - start_subject); + offsets[1] = (int)(ptr - start_subject); + DPRINTF(("%.*sSet matched string = \"%.*s\"\n", rlevel*2-2, SP, + offsets[1] - offsets[0], (char *)current_subject)); + } + if ((md->moptions & PCRE_DFA_SHORTEST) != 0) + { + DPRINTF(("%.*sEnd of internal_dfa_exec %d: returning %d\n" + "%.*s---------------------\n\n", rlevel*2-2, SP, rlevel, + match_count, rlevel*2-2, SP)); + return match_count; + } + } + } + break; + +/* ========================================================================== */ + /* These opcodes add to the current list of states without looking + at the current character. */ + + /*-----------------------------------------------------------------*/ + case OP_ALT: + do { code += GET(code, 1); } while (*code == OP_ALT); + ADD_ACTIVE((int)(code - start_code), 0); + break; + + /*-----------------------------------------------------------------*/ + case OP_BRA: + case OP_SBRA: + do + { + ADD_ACTIVE((int)(code - start_code + 1 + LINK_SIZE), 0); + code += GET(code, 1); + } + while (*code == OP_ALT); + break; + + /*-----------------------------------------------------------------*/ + case OP_CBRA: + case OP_SCBRA: + ADD_ACTIVE((int)(code - start_code + 1 + LINK_SIZE + IMM2_SIZE), 0); + code += GET(code, 1); + while (*code == OP_ALT) + { + ADD_ACTIVE((int)(code - start_code + 1 + LINK_SIZE), 0); + code += GET(code, 1); + } + break; + + /*-----------------------------------------------------------------*/ + case OP_BRAZERO: + case OP_BRAMINZERO: + ADD_ACTIVE(state_offset + 1, 0); + code += 1 + GET(code, 2); + while (*code == OP_ALT) code += GET(code, 1); + ADD_ACTIVE((int)(code - start_code + 1 + LINK_SIZE), 0); + break; + + /*-----------------------------------------------------------------*/ + case OP_SKIPZERO: + code += 1 + GET(code, 2); + while (*code == OP_ALT) code += GET(code, 1); + ADD_ACTIVE((int)(code - start_code + 1 + LINK_SIZE), 0); + break; + + /*-----------------------------------------------------------------*/ + case OP_CIRC: + if (ptr == start_subject && (md->moptions & PCRE_NOTBOL) == 0) + { ADD_ACTIVE(state_offset + 1, 0); } + break; + + /*-----------------------------------------------------------------*/ + case OP_CIRCM: + if ((ptr == start_subject && (md->moptions & PCRE_NOTBOL) == 0) || + (ptr != end_subject && WAS_NEWLINE(ptr))) + { ADD_ACTIVE(state_offset + 1, 0); } + break; + + /*-----------------------------------------------------------------*/ + case OP_EOD: + if (ptr >= end_subject) + { + if ((md->moptions & PCRE_PARTIAL_HARD) != 0) + could_continue = TRUE; + else { ADD_ACTIVE(state_offset + 1, 0); } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_SOD: + if (ptr == start_subject) { ADD_ACTIVE(state_offset + 1, 0); } + break; + + /*-----------------------------------------------------------------*/ + case OP_SOM: + if (ptr == start_subject + start_offset) { ADD_ACTIVE(state_offset + 1, 0); } + break; + + +/* ========================================================================== */ + /* These opcodes inspect the next subject character, and sometimes + the previous one as well, but do not have an argument. The variable + clen contains the length of the current character and is zero if we are + at the end of the subject. */ + + /*-----------------------------------------------------------------*/ + case OP_ANY: + if (clen > 0 && !IS_NEWLINE(ptr)) + { + if (ptr + 1 >= md->end_subject && + (md->moptions & (PCRE_PARTIAL_HARD)) != 0 && + NLBLOCK->nltype == NLTYPE_FIXED && + NLBLOCK->nllen == 2 && + c == NLBLOCK->nl[0]) + { + could_continue = partial_newline = TRUE; + } + else + { + ADD_NEW(state_offset + 1, 0); + } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_ALLANY: + if (clen > 0) + { ADD_NEW(state_offset + 1, 0); } + break; + + /*-----------------------------------------------------------------*/ + case OP_EODN: + if (clen == 0 && (md->moptions & PCRE_PARTIAL_HARD) != 0) + could_continue = TRUE; + else if (clen == 0 || (IS_NEWLINE(ptr) && ptr == end_subject - md->nllen)) + { ADD_ACTIVE(state_offset + 1, 0); } + break; + + /*-----------------------------------------------------------------*/ + case OP_DOLL: + if ((md->moptions & PCRE_NOTEOL) == 0) + { + if (clen == 0 && (md->moptions & PCRE_PARTIAL_HARD) != 0) + could_continue = TRUE; + else if (clen == 0 || + ((md->poptions & PCRE_DOLLAR_ENDONLY) == 0 && IS_NEWLINE(ptr) && + (ptr == end_subject - md->nllen) + )) + { ADD_ACTIVE(state_offset + 1, 0); } + else if (ptr + 1 >= md->end_subject && + (md->moptions & (PCRE_PARTIAL_HARD|PCRE_PARTIAL_SOFT)) != 0 && + NLBLOCK->nltype == NLTYPE_FIXED && + NLBLOCK->nllen == 2 && + c == NLBLOCK->nl[0]) + { + if ((md->moptions & PCRE_PARTIAL_HARD) != 0) + { + reset_could_continue = TRUE; + ADD_NEW_DATA(-(state_offset + 1), 0, 1); + } + else could_continue = partial_newline = TRUE; + } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_DOLLM: + if ((md->moptions & PCRE_NOTEOL) == 0) + { + if (clen == 0 && (md->moptions & PCRE_PARTIAL_HARD) != 0) + could_continue = TRUE; + else if (clen == 0 || + ((md->poptions & PCRE_DOLLAR_ENDONLY) == 0 && IS_NEWLINE(ptr))) + { ADD_ACTIVE(state_offset + 1, 0); } + else if (ptr + 1 >= md->end_subject && + (md->moptions & (PCRE_PARTIAL_HARD|PCRE_PARTIAL_SOFT)) != 0 && + NLBLOCK->nltype == NLTYPE_FIXED && + NLBLOCK->nllen == 2 && + c == NLBLOCK->nl[0]) + { + if ((md->moptions & PCRE_PARTIAL_HARD) != 0) + { + reset_could_continue = TRUE; + ADD_NEW_DATA(-(state_offset + 1), 0, 1); + } + else could_continue = partial_newline = TRUE; + } + } + else if (IS_NEWLINE(ptr)) + { ADD_ACTIVE(state_offset + 1, 0); } + break; + + /*-----------------------------------------------------------------*/ + + case OP_DIGIT: + case OP_WHITESPACE: + case OP_WORDCHAR: + if (clen > 0 && c < 256 && + ((ctypes[c] & toptable1[codevalue]) ^ toptable2[codevalue]) != 0) + { ADD_NEW(state_offset + 1, 0); } + break; + + /*-----------------------------------------------------------------*/ + case OP_NOT_DIGIT: + case OP_NOT_WHITESPACE: + case OP_NOT_WORDCHAR: + if (clen > 0 && (c >= 256 || + ((ctypes[c] & toptable1[codevalue]) ^ toptable2[codevalue]) != 0)) + { ADD_NEW(state_offset + 1, 0); } + break; + + /*-----------------------------------------------------------------*/ + case OP_WORD_BOUNDARY: + case OP_NOT_WORD_BOUNDARY: + { + int left_word, right_word; + + if (ptr > start_subject) + { + const pcre_uchar *temp = ptr - 1; + if (temp < md->start_used_ptr) md->start_used_ptr = temp; +#if defined SUPPORT_UTF && !defined COMPILE_PCRE32 + if (utf) { BACKCHAR(temp); } +#endif + GETCHARTEST(d, temp); +#ifdef SUPPORT_UCP + if ((md->poptions & PCRE_UCP) != 0) + { + if (d == '_') left_word = TRUE; else + { + int cat = UCD_CATEGORY(d); + left_word = (cat == ucp_L || cat == ucp_N); + } + } + else +#endif + left_word = d < 256 && (ctypes[d] & ctype_word) != 0; + } + else left_word = FALSE; + + if (clen > 0) + { +#ifdef SUPPORT_UCP + if ((md->poptions & PCRE_UCP) != 0) + { + if (c == '_') right_word = TRUE; else + { + int cat = UCD_CATEGORY(c); + right_word = (cat == ucp_L || cat == ucp_N); + } + } + else +#endif + right_word = c < 256 && (ctypes[c] & ctype_word) != 0; + } + else right_word = FALSE; + + if ((left_word == right_word) == (codevalue == OP_NOT_WORD_BOUNDARY)) + { ADD_ACTIVE(state_offset + 1, 0); } + } + break; + + + /*-----------------------------------------------------------------*/ + /* Check the next character by Unicode property. We will get here only + if the support is in the binary; otherwise a compile-time error occurs. + */ + +#ifdef SUPPORT_UCP + case OP_PROP: + case OP_NOTPROP: + if (clen > 0) + { + BOOL OK; + const pcre_uint32 *cp; + const ucd_record * prop = GET_UCD(c); + switch(code[1]) + { + case PT_ANY: + OK = TRUE; + break; + + case PT_LAMP: + OK = prop->chartype == ucp_Lu || prop->chartype == ucp_Ll || + prop->chartype == ucp_Lt; + break; + + case PT_GC: + OK = PRIV(ucp_gentype)[prop->chartype] == code[2]; + break; + + case PT_PC: + OK = prop->chartype == code[2]; + break; + + case PT_SC: + OK = prop->script == code[2]; + break; + + /* These are specials for combination cases. */ + + case PT_ALNUM: + OK = PRIV(ucp_gentype)[prop->chartype] == ucp_L || + PRIV(ucp_gentype)[prop->chartype] == ucp_N; + break; + + /* Perl space used to exclude VT, but from Perl 5.18 it is included, + which means that Perl space and POSIX space are now identical. PCRE + was changed at release 8.34. */ + + case PT_SPACE: /* Perl space */ + case PT_PXSPACE: /* POSIX space */ + switch(c) + { + HSPACE_CASES: + VSPACE_CASES: + OK = TRUE; + break; + + default: + OK = PRIV(ucp_gentype)[prop->chartype] == ucp_Z; + break; + } + break; + + case PT_WORD: + OK = PRIV(ucp_gentype)[prop->chartype] == ucp_L || + PRIV(ucp_gentype)[prop->chartype] == ucp_N || + c == CHAR_UNDERSCORE; + break; + + case PT_CLIST: + cp = PRIV(ucd_caseless_sets) + code[2]; + for (;;) + { + if (c < *cp) { OK = FALSE; break; } + if (c == *cp++) { OK = TRUE; break; } + } + break; + + case PT_UCNC: + OK = c == CHAR_DOLLAR_SIGN || c == CHAR_COMMERCIAL_AT || + c == CHAR_GRAVE_ACCENT || (c >= 0xa0 && c <= 0xd7ff) || + c >= 0xe000; + break; + + /* Should never occur, but keep compilers from grumbling. */ + + default: + OK = codevalue != OP_PROP; + break; + } + + if (OK == (codevalue == OP_PROP)) { ADD_NEW(state_offset + 3, 0); } + } + break; +#endif + + + +/* ========================================================================== */ + /* These opcodes likewise inspect the subject character, but have an + argument that is not a data character. It is one of these opcodes: + OP_ANY, OP_ALLANY, OP_DIGIT, OP_NOT_DIGIT, OP_WHITESPACE, OP_NOT_SPACE, + OP_WORDCHAR, OP_NOT_WORDCHAR. The value is loaded into d. */ + + case OP_TYPEPLUS: + case OP_TYPEMINPLUS: + case OP_TYPEPOSPLUS: + count = current_state->count; /* Already matched */ + if (count > 0) { ADD_ACTIVE(state_offset + 2, 0); } + if (clen > 0) + { + if (d == OP_ANY && ptr + 1 >= md->end_subject && + (md->moptions & (PCRE_PARTIAL_HARD)) != 0 && + NLBLOCK->nltype == NLTYPE_FIXED && + NLBLOCK->nllen == 2 && + c == NLBLOCK->nl[0]) + { + could_continue = partial_newline = TRUE; + } + else if ((c >= 256 && d != OP_DIGIT && d != OP_WHITESPACE && d != OP_WORDCHAR) || + (c < 256 && + (d != OP_ANY || !IS_NEWLINE(ptr)) && + ((ctypes[c] & toptable1[d]) ^ toptable2[d]) != 0)) + { + if (count > 0 && codevalue == OP_TYPEPOSPLUS) + { + active_count--; /* Remove non-match possibility */ + next_active_state--; + } + count++; + ADD_NEW(state_offset, count); + } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_TYPEQUERY: + case OP_TYPEMINQUERY: + case OP_TYPEPOSQUERY: + ADD_ACTIVE(state_offset + 2, 0); + if (clen > 0) + { + if (d == OP_ANY && ptr + 1 >= md->end_subject && + (md->moptions & (PCRE_PARTIAL_HARD)) != 0 && + NLBLOCK->nltype == NLTYPE_FIXED && + NLBLOCK->nllen == 2 && + c == NLBLOCK->nl[0]) + { + could_continue = partial_newline = TRUE; + } + else if ((c >= 256 && d != OP_DIGIT && d != OP_WHITESPACE && d != OP_WORDCHAR) || + (c < 256 && + (d != OP_ANY || !IS_NEWLINE(ptr)) && + ((ctypes[c] & toptable1[d]) ^ toptable2[d]) != 0)) + { + if (codevalue == OP_TYPEPOSQUERY) + { + active_count--; /* Remove non-match possibility */ + next_active_state--; + } + ADD_NEW(state_offset + 2, 0); + } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_TYPESTAR: + case OP_TYPEMINSTAR: + case OP_TYPEPOSSTAR: + ADD_ACTIVE(state_offset + 2, 0); + if (clen > 0) + { + if (d == OP_ANY && ptr + 1 >= md->end_subject && + (md->moptions & (PCRE_PARTIAL_HARD)) != 0 && + NLBLOCK->nltype == NLTYPE_FIXED && + NLBLOCK->nllen == 2 && + c == NLBLOCK->nl[0]) + { + could_continue = partial_newline = TRUE; + } + else if ((c >= 256 && d != OP_DIGIT && d != OP_WHITESPACE && d != OP_WORDCHAR) || + (c < 256 && + (d != OP_ANY || !IS_NEWLINE(ptr)) && + ((ctypes[c] & toptable1[d]) ^ toptable2[d]) != 0)) + { + if (codevalue == OP_TYPEPOSSTAR) + { + active_count--; /* Remove non-match possibility */ + next_active_state--; + } + ADD_NEW(state_offset, 0); + } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_TYPEEXACT: + count = current_state->count; /* Number already matched */ + if (clen > 0) + { + if (d == OP_ANY && ptr + 1 >= md->end_subject && + (md->moptions & (PCRE_PARTIAL_HARD)) != 0 && + NLBLOCK->nltype == NLTYPE_FIXED && + NLBLOCK->nllen == 2 && + c == NLBLOCK->nl[0]) + { + could_continue = partial_newline = TRUE; + } + else if ((c >= 256 && d != OP_DIGIT && d != OP_WHITESPACE && d != OP_WORDCHAR) || + (c < 256 && + (d != OP_ANY || !IS_NEWLINE(ptr)) && + ((ctypes[c] & toptable1[d]) ^ toptable2[d]) != 0)) + { + if (++count >= (int)GET2(code, 1)) + { ADD_NEW(state_offset + 1 + IMM2_SIZE + 1, 0); } + else + { ADD_NEW(state_offset, count); } + } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_TYPEUPTO: + case OP_TYPEMINUPTO: + case OP_TYPEPOSUPTO: + ADD_ACTIVE(state_offset + 2 + IMM2_SIZE, 0); + count = current_state->count; /* Number already matched */ + if (clen > 0) + { + if (d == OP_ANY && ptr + 1 >= md->end_subject && + (md->moptions & (PCRE_PARTIAL_HARD)) != 0 && + NLBLOCK->nltype == NLTYPE_FIXED && + NLBLOCK->nllen == 2 && + c == NLBLOCK->nl[0]) + { + could_continue = partial_newline = TRUE; + } + else if ((c >= 256 && d != OP_DIGIT && d != OP_WHITESPACE && d != OP_WORDCHAR) || + (c < 256 && + (d != OP_ANY || !IS_NEWLINE(ptr)) && + ((ctypes[c] & toptable1[d]) ^ toptable2[d]) != 0)) + { + if (codevalue == OP_TYPEPOSUPTO) + { + active_count--; /* Remove non-match possibility */ + next_active_state--; + } + if (++count >= (int)GET2(code, 1)) + { ADD_NEW(state_offset + 2 + IMM2_SIZE, 0); } + else + { ADD_NEW(state_offset, count); } + } + } + break; + +/* ========================================================================== */ + /* These are virtual opcodes that are used when something like + OP_TYPEPLUS has OP_PROP, OP_NOTPROP, OP_ANYNL, or OP_EXTUNI as its + argument. It keeps the code above fast for the other cases. The argument + is in the d variable. */ + +#ifdef SUPPORT_UCP + case OP_PROP_EXTRA + OP_TYPEPLUS: + case OP_PROP_EXTRA + OP_TYPEMINPLUS: + case OP_PROP_EXTRA + OP_TYPEPOSPLUS: + count = current_state->count; /* Already matched */ + if (count > 0) { ADD_ACTIVE(state_offset + 4, 0); } + if (clen > 0) + { + BOOL OK; + const pcre_uint32 *cp; + const ucd_record * prop = GET_UCD(c); + switch(code[2]) + { + case PT_ANY: + OK = TRUE; + break; + + case PT_LAMP: + OK = prop->chartype == ucp_Lu || prop->chartype == ucp_Ll || + prop->chartype == ucp_Lt; + break; + + case PT_GC: + OK = PRIV(ucp_gentype)[prop->chartype] == code[3]; + break; + + case PT_PC: + OK = prop->chartype == code[3]; + break; + + case PT_SC: + OK = prop->script == code[3]; + break; + + /* These are specials for combination cases. */ + + case PT_ALNUM: + OK = PRIV(ucp_gentype)[prop->chartype] == ucp_L || + PRIV(ucp_gentype)[prop->chartype] == ucp_N; + break; + + /* Perl space used to exclude VT, but from Perl 5.18 it is included, + which means that Perl space and POSIX space are now identical. PCRE + was changed at release 8.34. */ + + case PT_SPACE: /* Perl space */ + case PT_PXSPACE: /* POSIX space */ + switch(c) + { + HSPACE_CASES: + VSPACE_CASES: + OK = TRUE; + break; + + default: + OK = PRIV(ucp_gentype)[prop->chartype] == ucp_Z; + break; + } + break; + + case PT_WORD: + OK = PRIV(ucp_gentype)[prop->chartype] == ucp_L || + PRIV(ucp_gentype)[prop->chartype] == ucp_N || + c == CHAR_UNDERSCORE; + break; + + case PT_CLIST: + cp = PRIV(ucd_caseless_sets) + code[3]; + for (;;) + { + if (c < *cp) { OK = FALSE; break; } + if (c == *cp++) { OK = TRUE; break; } + } + break; + + case PT_UCNC: + OK = c == CHAR_DOLLAR_SIGN || c == CHAR_COMMERCIAL_AT || + c == CHAR_GRAVE_ACCENT || (c >= 0xa0 && c <= 0xd7ff) || + c >= 0xe000; + break; + + /* Should never occur, but keep compilers from grumbling. */ + + default: + OK = codevalue != OP_PROP; + break; + } + + if (OK == (d == OP_PROP)) + { + if (count > 0 && codevalue == OP_PROP_EXTRA + OP_TYPEPOSPLUS) + { + active_count--; /* Remove non-match possibility */ + next_active_state--; + } + count++; + ADD_NEW(state_offset, count); + } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_EXTUNI_EXTRA + OP_TYPEPLUS: + case OP_EXTUNI_EXTRA + OP_TYPEMINPLUS: + case OP_EXTUNI_EXTRA + OP_TYPEPOSPLUS: + count = current_state->count; /* Already matched */ + if (count > 0) { ADD_ACTIVE(state_offset + 2, 0); } + if (clen > 0) + { + int lgb, rgb; + const pcre_uchar *nptr = ptr + clen; + int ncount = 0; + if (count > 0 && codevalue == OP_EXTUNI_EXTRA + OP_TYPEPOSPLUS) + { + active_count--; /* Remove non-match possibility */ + next_active_state--; + } + lgb = UCD_GRAPHBREAK(c); + while (nptr < end_subject) + { + dlen = 1; + if (!utf) d = *nptr; else { GETCHARLEN(d, nptr, dlen); } + rgb = UCD_GRAPHBREAK(d); + if ((PRIV(ucp_gbtable)[lgb] & (1 << rgb)) == 0) break; + ncount++; + lgb = rgb; + nptr += dlen; + } + count++; + ADD_NEW_DATA(-state_offset, count, ncount); + } + break; +#endif + + /*-----------------------------------------------------------------*/ + case OP_ANYNL_EXTRA + OP_TYPEPLUS: + case OP_ANYNL_EXTRA + OP_TYPEMINPLUS: + case OP_ANYNL_EXTRA + OP_TYPEPOSPLUS: + count = current_state->count; /* Already matched */ + if (count > 0) { ADD_ACTIVE(state_offset + 2, 0); } + if (clen > 0) + { + int ncount = 0; + switch (c) + { + case CHAR_VT: + case CHAR_FF: + case CHAR_NEL: +#ifndef EBCDIC + case 0x2028: + case 0x2029: +#endif /* Not EBCDIC */ + if ((md->moptions & PCRE_BSR_ANYCRLF) != 0) break; + goto ANYNL01; + + case CHAR_CR: + if (ptr + 1 < end_subject && UCHAR21TEST(ptr + 1) == CHAR_LF) ncount = 1; + /* Fall through */ + + ANYNL01: + case CHAR_LF: + if (count > 0 && codevalue == OP_ANYNL_EXTRA + OP_TYPEPOSPLUS) + { + active_count--; /* Remove non-match possibility */ + next_active_state--; + } + count++; + ADD_NEW_DATA(-state_offset, count, ncount); + break; + + default: + break; + } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_VSPACE_EXTRA + OP_TYPEPLUS: + case OP_VSPACE_EXTRA + OP_TYPEMINPLUS: + case OP_VSPACE_EXTRA + OP_TYPEPOSPLUS: + count = current_state->count; /* Already matched */ + if (count > 0) { ADD_ACTIVE(state_offset + 2, 0); } + if (clen > 0) + { + BOOL OK; + switch (c) + { + VSPACE_CASES: + OK = TRUE; + break; + + default: + OK = FALSE; + break; + } + + if (OK == (d == OP_VSPACE)) + { + if (count > 0 && codevalue == OP_VSPACE_EXTRA + OP_TYPEPOSPLUS) + { + active_count--; /* Remove non-match possibility */ + next_active_state--; + } + count++; + ADD_NEW_DATA(-state_offset, count, 0); + } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_HSPACE_EXTRA + OP_TYPEPLUS: + case OP_HSPACE_EXTRA + OP_TYPEMINPLUS: + case OP_HSPACE_EXTRA + OP_TYPEPOSPLUS: + count = current_state->count; /* Already matched */ + if (count > 0) { ADD_ACTIVE(state_offset + 2, 0); } + if (clen > 0) + { + BOOL OK; + switch (c) + { + HSPACE_CASES: + OK = TRUE; + break; + + default: + OK = FALSE; + break; + } + + if (OK == (d == OP_HSPACE)) + { + if (count > 0 && codevalue == OP_HSPACE_EXTRA + OP_TYPEPOSPLUS) + { + active_count--; /* Remove non-match possibility */ + next_active_state--; + } + count++; + ADD_NEW_DATA(-state_offset, count, 0); + } + } + break; + + /*-----------------------------------------------------------------*/ +#ifdef SUPPORT_UCP + case OP_PROP_EXTRA + OP_TYPEQUERY: + case OP_PROP_EXTRA + OP_TYPEMINQUERY: + case OP_PROP_EXTRA + OP_TYPEPOSQUERY: + count = 4; + goto QS1; + + case OP_PROP_EXTRA + OP_TYPESTAR: + case OP_PROP_EXTRA + OP_TYPEMINSTAR: + case OP_PROP_EXTRA + OP_TYPEPOSSTAR: + count = 0; + + QS1: + + ADD_ACTIVE(state_offset + 4, 0); + if (clen > 0) + { + BOOL OK; + const pcre_uint32 *cp; + const ucd_record * prop = GET_UCD(c); + switch(code[2]) + { + case PT_ANY: + OK = TRUE; + break; + + case PT_LAMP: + OK = prop->chartype == ucp_Lu || prop->chartype == ucp_Ll || + prop->chartype == ucp_Lt; + break; + + case PT_GC: + OK = PRIV(ucp_gentype)[prop->chartype] == code[3]; + break; + + case PT_PC: + OK = prop->chartype == code[3]; + break; + + case PT_SC: + OK = prop->script == code[3]; + break; + + /* These are specials for combination cases. */ + + case PT_ALNUM: + OK = PRIV(ucp_gentype)[prop->chartype] == ucp_L || + PRIV(ucp_gentype)[prop->chartype] == ucp_N; + break; + + /* Perl space used to exclude VT, but from Perl 5.18 it is included, + which means that Perl space and POSIX space are now identical. PCRE + was changed at release 8.34. */ + + case PT_SPACE: /* Perl space */ + case PT_PXSPACE: /* POSIX space */ + switch(c) + { + HSPACE_CASES: + VSPACE_CASES: + OK = TRUE; + break; + + default: + OK = PRIV(ucp_gentype)[prop->chartype] == ucp_Z; + break; + } + break; + + case PT_WORD: + OK = PRIV(ucp_gentype)[prop->chartype] == ucp_L || + PRIV(ucp_gentype)[prop->chartype] == ucp_N || + c == CHAR_UNDERSCORE; + break; + + case PT_CLIST: + cp = PRIV(ucd_caseless_sets) + code[3]; + for (;;) + { + if (c < *cp) { OK = FALSE; break; } + if (c == *cp++) { OK = TRUE; break; } + } + break; + + case PT_UCNC: + OK = c == CHAR_DOLLAR_SIGN || c == CHAR_COMMERCIAL_AT || + c == CHAR_GRAVE_ACCENT || (c >= 0xa0 && c <= 0xd7ff) || + c >= 0xe000; + break; + + /* Should never occur, but keep compilers from grumbling. */ + + default: + OK = codevalue != OP_PROP; + break; + } + + if (OK == (d == OP_PROP)) + { + if (codevalue == OP_PROP_EXTRA + OP_TYPEPOSSTAR || + codevalue == OP_PROP_EXTRA + OP_TYPEPOSQUERY) + { + active_count--; /* Remove non-match possibility */ + next_active_state--; + } + ADD_NEW(state_offset + count, 0); + } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_EXTUNI_EXTRA + OP_TYPEQUERY: + case OP_EXTUNI_EXTRA + OP_TYPEMINQUERY: + case OP_EXTUNI_EXTRA + OP_TYPEPOSQUERY: + count = 2; + goto QS2; + + case OP_EXTUNI_EXTRA + OP_TYPESTAR: + case OP_EXTUNI_EXTRA + OP_TYPEMINSTAR: + case OP_EXTUNI_EXTRA + OP_TYPEPOSSTAR: + count = 0; + + QS2: + + ADD_ACTIVE(state_offset + 2, 0); + if (clen > 0) + { + int lgb, rgb; + const pcre_uchar *nptr = ptr + clen; + int ncount = 0; + if (codevalue == OP_EXTUNI_EXTRA + OP_TYPEPOSSTAR || + codevalue == OP_EXTUNI_EXTRA + OP_TYPEPOSQUERY) + { + active_count--; /* Remove non-match possibility */ + next_active_state--; + } + lgb = UCD_GRAPHBREAK(c); + while (nptr < end_subject) + { + dlen = 1; + if (!utf) d = *nptr; else { GETCHARLEN(d, nptr, dlen); } + rgb = UCD_GRAPHBREAK(d); + if ((PRIV(ucp_gbtable)[lgb] & (1 << rgb)) == 0) break; + ncount++; + lgb = rgb; + nptr += dlen; + } + ADD_NEW_DATA(-(state_offset + count), 0, ncount); + } + break; +#endif + + /*-----------------------------------------------------------------*/ + case OP_ANYNL_EXTRA + OP_TYPEQUERY: + case OP_ANYNL_EXTRA + OP_TYPEMINQUERY: + case OP_ANYNL_EXTRA + OP_TYPEPOSQUERY: + count = 2; + goto QS3; + + case OP_ANYNL_EXTRA + OP_TYPESTAR: + case OP_ANYNL_EXTRA + OP_TYPEMINSTAR: + case OP_ANYNL_EXTRA + OP_TYPEPOSSTAR: + count = 0; + + QS3: + ADD_ACTIVE(state_offset + 2, 0); + if (clen > 0) + { + int ncount = 0; + switch (c) + { + case CHAR_VT: + case CHAR_FF: + case CHAR_NEL: +#ifndef EBCDIC + case 0x2028: + case 0x2029: +#endif /* Not EBCDIC */ + if ((md->moptions & PCRE_BSR_ANYCRLF) != 0) break; + goto ANYNL02; + + case CHAR_CR: + if (ptr + 1 < end_subject && UCHAR21TEST(ptr + 1) == CHAR_LF) ncount = 1; + /* Fall through */ + + ANYNL02: + case CHAR_LF: + if (codevalue == OP_ANYNL_EXTRA + OP_TYPEPOSSTAR || + codevalue == OP_ANYNL_EXTRA + OP_TYPEPOSQUERY) + { + active_count--; /* Remove non-match possibility */ + next_active_state--; + } + ADD_NEW_DATA(-(state_offset + (int)count), 0, ncount); + break; + + default: + break; + } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_VSPACE_EXTRA + OP_TYPEQUERY: + case OP_VSPACE_EXTRA + OP_TYPEMINQUERY: + case OP_VSPACE_EXTRA + OP_TYPEPOSQUERY: + count = 2; + goto QS4; + + case OP_VSPACE_EXTRA + OP_TYPESTAR: + case OP_VSPACE_EXTRA + OP_TYPEMINSTAR: + case OP_VSPACE_EXTRA + OP_TYPEPOSSTAR: + count = 0; + + QS4: + ADD_ACTIVE(state_offset + 2, 0); + if (clen > 0) + { + BOOL OK; + switch (c) + { + VSPACE_CASES: + OK = TRUE; + break; + + default: + OK = FALSE; + break; + } + if (OK == (d == OP_VSPACE)) + { + if (codevalue == OP_VSPACE_EXTRA + OP_TYPEPOSSTAR || + codevalue == OP_VSPACE_EXTRA + OP_TYPEPOSQUERY) + { + active_count--; /* Remove non-match possibility */ + next_active_state--; + } + ADD_NEW_DATA(-(state_offset + (int)count), 0, 0); + } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_HSPACE_EXTRA + OP_TYPEQUERY: + case OP_HSPACE_EXTRA + OP_TYPEMINQUERY: + case OP_HSPACE_EXTRA + OP_TYPEPOSQUERY: + count = 2; + goto QS5; + + case OP_HSPACE_EXTRA + OP_TYPESTAR: + case OP_HSPACE_EXTRA + OP_TYPEMINSTAR: + case OP_HSPACE_EXTRA + OP_TYPEPOSSTAR: + count = 0; + + QS5: + ADD_ACTIVE(state_offset + 2, 0); + if (clen > 0) + { + BOOL OK; + switch (c) + { + HSPACE_CASES: + OK = TRUE; + break; + + default: + OK = FALSE; + break; + } + + if (OK == (d == OP_HSPACE)) + { + if (codevalue == OP_HSPACE_EXTRA + OP_TYPEPOSSTAR || + codevalue == OP_HSPACE_EXTRA + OP_TYPEPOSQUERY) + { + active_count--; /* Remove non-match possibility */ + next_active_state--; + } + ADD_NEW_DATA(-(state_offset + (int)count), 0, 0); + } + } + break; + + /*-----------------------------------------------------------------*/ +#ifdef SUPPORT_UCP + case OP_PROP_EXTRA + OP_TYPEEXACT: + case OP_PROP_EXTRA + OP_TYPEUPTO: + case OP_PROP_EXTRA + OP_TYPEMINUPTO: + case OP_PROP_EXTRA + OP_TYPEPOSUPTO: + if (codevalue != OP_PROP_EXTRA + OP_TYPEEXACT) + { ADD_ACTIVE(state_offset + 1 + IMM2_SIZE + 3, 0); } + count = current_state->count; /* Number already matched */ + if (clen > 0) + { + BOOL OK; + const pcre_uint32 *cp; + const ucd_record * prop = GET_UCD(c); + switch(code[1 + IMM2_SIZE + 1]) + { + case PT_ANY: + OK = TRUE; + break; + + case PT_LAMP: + OK = prop->chartype == ucp_Lu || prop->chartype == ucp_Ll || + prop->chartype == ucp_Lt; + break; + + case PT_GC: + OK = PRIV(ucp_gentype)[prop->chartype] == code[1 + IMM2_SIZE + 2]; + break; + + case PT_PC: + OK = prop->chartype == code[1 + IMM2_SIZE + 2]; + break; + + case PT_SC: + OK = prop->script == code[1 + IMM2_SIZE + 2]; + break; + + /* These are specials for combination cases. */ + + case PT_ALNUM: + OK = PRIV(ucp_gentype)[prop->chartype] == ucp_L || + PRIV(ucp_gentype)[prop->chartype] == ucp_N; + break; + + /* Perl space used to exclude VT, but from Perl 5.18 it is included, + which means that Perl space and POSIX space are now identical. PCRE + was changed at release 8.34. */ + + case PT_SPACE: /* Perl space */ + case PT_PXSPACE: /* POSIX space */ + switch(c) + { + HSPACE_CASES: + VSPACE_CASES: + OK = TRUE; + break; + + default: + OK = PRIV(ucp_gentype)[prop->chartype] == ucp_Z; + break; + } + break; + + case PT_WORD: + OK = PRIV(ucp_gentype)[prop->chartype] == ucp_L || + PRIV(ucp_gentype)[prop->chartype] == ucp_N || + c == CHAR_UNDERSCORE; + break; + + case PT_CLIST: + cp = PRIV(ucd_caseless_sets) + code[1 + IMM2_SIZE + 2]; + for (;;) + { + if (c < *cp) { OK = FALSE; break; } + if (c == *cp++) { OK = TRUE; break; } + } + break; + + case PT_UCNC: + OK = c == CHAR_DOLLAR_SIGN || c == CHAR_COMMERCIAL_AT || + c == CHAR_GRAVE_ACCENT || (c >= 0xa0 && c <= 0xd7ff) || + c >= 0xe000; + break; + + /* Should never occur, but keep compilers from grumbling. */ + + default: + OK = codevalue != OP_PROP; + break; + } + + if (OK == (d == OP_PROP)) + { + if (codevalue == OP_PROP_EXTRA + OP_TYPEPOSUPTO) + { + active_count--; /* Remove non-match possibility */ + next_active_state--; + } + if (++count >= (int)GET2(code, 1)) + { ADD_NEW(state_offset + 1 + IMM2_SIZE + 3, 0); } + else + { ADD_NEW(state_offset, count); } + } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_EXTUNI_EXTRA + OP_TYPEEXACT: + case OP_EXTUNI_EXTRA + OP_TYPEUPTO: + case OP_EXTUNI_EXTRA + OP_TYPEMINUPTO: + case OP_EXTUNI_EXTRA + OP_TYPEPOSUPTO: + if (codevalue != OP_EXTUNI_EXTRA + OP_TYPEEXACT) + { ADD_ACTIVE(state_offset + 2 + IMM2_SIZE, 0); } + count = current_state->count; /* Number already matched */ + if (clen > 0) + { + int lgb, rgb; + const pcre_uchar *nptr = ptr + clen; + int ncount = 0; + if (codevalue == OP_EXTUNI_EXTRA + OP_TYPEPOSUPTO) + { + active_count--; /* Remove non-match possibility */ + next_active_state--; + } + lgb = UCD_GRAPHBREAK(c); + while (nptr < end_subject) + { + dlen = 1; + if (!utf) d = *nptr; else { GETCHARLEN(d, nptr, dlen); } + rgb = UCD_GRAPHBREAK(d); + if ((PRIV(ucp_gbtable)[lgb] & (1 << rgb)) == 0) break; + ncount++; + lgb = rgb; + nptr += dlen; + } + if (nptr >= end_subject && (md->moptions & PCRE_PARTIAL_HARD) != 0) + reset_could_continue = TRUE; + if (++count >= (int)GET2(code, 1)) + { ADD_NEW_DATA(-(state_offset + 2 + IMM2_SIZE), 0, ncount); } + else + { ADD_NEW_DATA(-state_offset, count, ncount); } + } + break; +#endif + + /*-----------------------------------------------------------------*/ + case OP_ANYNL_EXTRA + OP_TYPEEXACT: + case OP_ANYNL_EXTRA + OP_TYPEUPTO: + case OP_ANYNL_EXTRA + OP_TYPEMINUPTO: + case OP_ANYNL_EXTRA + OP_TYPEPOSUPTO: + if (codevalue != OP_ANYNL_EXTRA + OP_TYPEEXACT) + { ADD_ACTIVE(state_offset + 2 + IMM2_SIZE, 0); } + count = current_state->count; /* Number already matched */ + if (clen > 0) + { + int ncount = 0; + switch (c) + { + case CHAR_VT: + case CHAR_FF: + case CHAR_NEL: +#ifndef EBCDIC + case 0x2028: + case 0x2029: +#endif /* Not EBCDIC */ + if ((md->moptions & PCRE_BSR_ANYCRLF) != 0) break; + goto ANYNL03; + + case CHAR_CR: + if (ptr + 1 < end_subject && UCHAR21TEST(ptr + 1) == CHAR_LF) ncount = 1; + /* Fall through */ + + ANYNL03: + case CHAR_LF: + if (codevalue == OP_ANYNL_EXTRA + OP_TYPEPOSUPTO) + { + active_count--; /* Remove non-match possibility */ + next_active_state--; + } + if (++count >= (int)GET2(code, 1)) + { ADD_NEW_DATA(-(state_offset + 2 + IMM2_SIZE), 0, ncount); } + else + { ADD_NEW_DATA(-state_offset, count, ncount); } + break; + + default: + break; + } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_VSPACE_EXTRA + OP_TYPEEXACT: + case OP_VSPACE_EXTRA + OP_TYPEUPTO: + case OP_VSPACE_EXTRA + OP_TYPEMINUPTO: + case OP_VSPACE_EXTRA + OP_TYPEPOSUPTO: + if (codevalue != OP_VSPACE_EXTRA + OP_TYPEEXACT) + { ADD_ACTIVE(state_offset + 2 + IMM2_SIZE, 0); } + count = current_state->count; /* Number already matched */ + if (clen > 0) + { + BOOL OK; + switch (c) + { + VSPACE_CASES: + OK = TRUE; + break; + + default: + OK = FALSE; + } + + if (OK == (d == OP_VSPACE)) + { + if (codevalue == OP_VSPACE_EXTRA + OP_TYPEPOSUPTO) + { + active_count--; /* Remove non-match possibility */ + next_active_state--; + } + if (++count >= (int)GET2(code, 1)) + { ADD_NEW_DATA(-(state_offset + 2 + IMM2_SIZE), 0, 0); } + else + { ADD_NEW_DATA(-state_offset, count, 0); } + } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_HSPACE_EXTRA + OP_TYPEEXACT: + case OP_HSPACE_EXTRA + OP_TYPEUPTO: + case OP_HSPACE_EXTRA + OP_TYPEMINUPTO: + case OP_HSPACE_EXTRA + OP_TYPEPOSUPTO: + if (codevalue != OP_HSPACE_EXTRA + OP_TYPEEXACT) + { ADD_ACTIVE(state_offset + 2 + IMM2_SIZE, 0); } + count = current_state->count; /* Number already matched */ + if (clen > 0) + { + BOOL OK; + switch (c) + { + HSPACE_CASES: + OK = TRUE; + break; + + default: + OK = FALSE; + break; + } + + if (OK == (d == OP_HSPACE)) + { + if (codevalue == OP_HSPACE_EXTRA + OP_TYPEPOSUPTO) + { + active_count--; /* Remove non-match possibility */ + next_active_state--; + } + if (++count >= (int)GET2(code, 1)) + { ADD_NEW_DATA(-(state_offset + 2 + IMM2_SIZE), 0, 0); } + else + { ADD_NEW_DATA(-state_offset, count, 0); } + } + } + break; + +/* ========================================================================== */ + /* These opcodes are followed by a character that is usually compared + to the current subject character; it is loaded into d. We still get + here even if there is no subject character, because in some cases zero + repetitions are permitted. */ + + /*-----------------------------------------------------------------*/ + case OP_CHAR: + if (clen > 0 && c == d) { ADD_NEW(state_offset + dlen + 1, 0); } + break; + + /*-----------------------------------------------------------------*/ + case OP_CHARI: + if (clen == 0) break; + +#ifdef SUPPORT_UTF + if (utf) + { + if (c == d) { ADD_NEW(state_offset + dlen + 1, 0); } else + { + unsigned int othercase; + if (c < 128) + othercase = fcc[c]; + else + /* If we have Unicode property support, we can use it to test the + other case of the character. */ +#ifdef SUPPORT_UCP + othercase = UCD_OTHERCASE(c); +#else + othercase = NOTACHAR; +#endif + + if (d == othercase) { ADD_NEW(state_offset + dlen + 1, 0); } + } + } + else +#endif /* SUPPORT_UTF */ + /* Not UTF mode */ + { + if (TABLE_GET(c, lcc, c) == TABLE_GET(d, lcc, d)) + { ADD_NEW(state_offset + 2, 0); } + } + break; + + +#ifdef SUPPORT_UCP + /*-----------------------------------------------------------------*/ + /* This is a tricky one because it can match more than one character. + Find out how many characters to skip, and then set up a negative state + to wait for them to pass before continuing. */ + + case OP_EXTUNI: + if (clen > 0) + { + int lgb, rgb; + const pcre_uchar *nptr = ptr + clen; + int ncount = 0; + lgb = UCD_GRAPHBREAK(c); + while (nptr < end_subject) + { + dlen = 1; + if (!utf) d = *nptr; else { GETCHARLEN(d, nptr, dlen); } + rgb = UCD_GRAPHBREAK(d); + if ((PRIV(ucp_gbtable)[lgb] & (1 << rgb)) == 0) break; + ncount++; + lgb = rgb; + nptr += dlen; + } + if (nptr >= end_subject && (md->moptions & PCRE_PARTIAL_HARD) != 0) + reset_could_continue = TRUE; + ADD_NEW_DATA(-(state_offset + 1), 0, ncount); + } + break; +#endif + + /*-----------------------------------------------------------------*/ + /* This is a tricky like EXTUNI because it too can match more than one + character (when CR is followed by LF). In this case, set up a negative + state to wait for one character to pass before continuing. */ + + case OP_ANYNL: + if (clen > 0) switch(c) + { + case CHAR_VT: + case CHAR_FF: + case CHAR_NEL: +#ifndef EBCDIC + case 0x2028: + case 0x2029: +#endif /* Not EBCDIC */ + if ((md->moptions & PCRE_BSR_ANYCRLF) != 0) break; + + case CHAR_LF: + ADD_NEW(state_offset + 1, 0); + break; + + case CHAR_CR: + if (ptr + 1 >= end_subject) + { + ADD_NEW(state_offset + 1, 0); + if ((md->moptions & PCRE_PARTIAL_HARD) != 0) + reset_could_continue = TRUE; + } + else if (UCHAR21TEST(ptr + 1) == CHAR_LF) + { + ADD_NEW_DATA(-(state_offset + 1), 0, 1); + } + else + { + ADD_NEW(state_offset + 1, 0); + } + break; + } + break; + + /*-----------------------------------------------------------------*/ + case OP_NOT_VSPACE: + if (clen > 0) switch(c) + { + VSPACE_CASES: + break; + + default: + ADD_NEW(state_offset + 1, 0); + break; + } + break; + + /*-----------------------------------------------------------------*/ + case OP_VSPACE: + if (clen > 0) switch(c) + { + VSPACE_CASES: + ADD_NEW(state_offset + 1, 0); + break; + + default: + break; + } + break; + + /*-----------------------------------------------------------------*/ + case OP_NOT_HSPACE: + if (clen > 0) switch(c) + { + HSPACE_CASES: + break; + + default: + ADD_NEW(state_offset + 1, 0); + break; + } + break; + + /*-----------------------------------------------------------------*/ + case OP_HSPACE: + if (clen > 0) switch(c) + { + HSPACE_CASES: + ADD_NEW(state_offset + 1, 0); + break; + + default: + break; + } + break; + + /*-----------------------------------------------------------------*/ + /* Match a negated single character casefully. */ + + case OP_NOT: + if (clen > 0 && c != d) { ADD_NEW(state_offset + dlen + 1, 0); } + break; + + /*-----------------------------------------------------------------*/ + /* Match a negated single character caselessly. */ + + case OP_NOTI: + if (clen > 0) + { + pcre_uint32 otherd; +#ifdef SUPPORT_UTF + if (utf && d >= 128) + { +#ifdef SUPPORT_UCP + otherd = UCD_OTHERCASE(d); +#else + otherd = d; +#endif /* SUPPORT_UCP */ + } + else +#endif /* SUPPORT_UTF */ + otherd = TABLE_GET(d, fcc, d); + if (c != d && c != otherd) + { ADD_NEW(state_offset + dlen + 1, 0); } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_PLUSI: + case OP_MINPLUSI: + case OP_POSPLUSI: + case OP_NOTPLUSI: + case OP_NOTMINPLUSI: + case OP_NOTPOSPLUSI: + caseless = TRUE; + codevalue -= OP_STARI - OP_STAR; + + /* Fall through */ + case OP_PLUS: + case OP_MINPLUS: + case OP_POSPLUS: + case OP_NOTPLUS: + case OP_NOTMINPLUS: + case OP_NOTPOSPLUS: + count = current_state->count; /* Already matched */ + if (count > 0) { ADD_ACTIVE(state_offset + dlen + 1, 0); } + if (clen > 0) + { + pcre_uint32 otherd = NOTACHAR; + if (caseless) + { +#ifdef SUPPORT_UTF + if (utf && d >= 128) + { +#ifdef SUPPORT_UCP + otherd = UCD_OTHERCASE(d); +#endif /* SUPPORT_UCP */ + } + else +#endif /* SUPPORT_UTF */ + otherd = TABLE_GET(d, fcc, d); + } + if ((c == d || c == otherd) == (codevalue < OP_NOTSTAR)) + { + if (count > 0 && + (codevalue == OP_POSPLUS || codevalue == OP_NOTPOSPLUS)) + { + active_count--; /* Remove non-match possibility */ + next_active_state--; + } + count++; + ADD_NEW(state_offset, count); + } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_QUERYI: + case OP_MINQUERYI: + case OP_POSQUERYI: + case OP_NOTQUERYI: + case OP_NOTMINQUERYI: + case OP_NOTPOSQUERYI: + caseless = TRUE; + codevalue -= OP_STARI - OP_STAR; + /* Fall through */ + case OP_QUERY: + case OP_MINQUERY: + case OP_POSQUERY: + case OP_NOTQUERY: + case OP_NOTMINQUERY: + case OP_NOTPOSQUERY: + ADD_ACTIVE(state_offset + dlen + 1, 0); + if (clen > 0) + { + pcre_uint32 otherd = NOTACHAR; + if (caseless) + { +#ifdef SUPPORT_UTF + if (utf && d >= 128) + { +#ifdef SUPPORT_UCP + otherd = UCD_OTHERCASE(d); +#endif /* SUPPORT_UCP */ + } + else +#endif /* SUPPORT_UTF */ + otherd = TABLE_GET(d, fcc, d); + } + if ((c == d || c == otherd) == (codevalue < OP_NOTSTAR)) + { + if (codevalue == OP_POSQUERY || codevalue == OP_NOTPOSQUERY) + { + active_count--; /* Remove non-match possibility */ + next_active_state--; + } + ADD_NEW(state_offset + dlen + 1, 0); + } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_STARI: + case OP_MINSTARI: + case OP_POSSTARI: + case OP_NOTSTARI: + case OP_NOTMINSTARI: + case OP_NOTPOSSTARI: + caseless = TRUE; + codevalue -= OP_STARI - OP_STAR; + /* Fall through */ + case OP_STAR: + case OP_MINSTAR: + case OP_POSSTAR: + case OP_NOTSTAR: + case OP_NOTMINSTAR: + case OP_NOTPOSSTAR: + ADD_ACTIVE(state_offset + dlen + 1, 0); + if (clen > 0) + { + pcre_uint32 otherd = NOTACHAR; + if (caseless) + { +#ifdef SUPPORT_UTF + if (utf && d >= 128) + { +#ifdef SUPPORT_UCP + otherd = UCD_OTHERCASE(d); +#endif /* SUPPORT_UCP */ + } + else +#endif /* SUPPORT_UTF */ + otherd = TABLE_GET(d, fcc, d); + } + if ((c == d || c == otherd) == (codevalue < OP_NOTSTAR)) + { + if (codevalue == OP_POSSTAR || codevalue == OP_NOTPOSSTAR) + { + active_count--; /* Remove non-match possibility */ + next_active_state--; + } + ADD_NEW(state_offset, 0); + } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_EXACTI: + case OP_NOTEXACTI: + caseless = TRUE; + codevalue -= OP_STARI - OP_STAR; + /* Fall through */ + case OP_EXACT: + case OP_NOTEXACT: + count = current_state->count; /* Number already matched */ + if (clen > 0) + { + pcre_uint32 otherd = NOTACHAR; + if (caseless) + { +#ifdef SUPPORT_UTF + if (utf && d >= 128) + { +#ifdef SUPPORT_UCP + otherd = UCD_OTHERCASE(d); +#endif /* SUPPORT_UCP */ + } + else +#endif /* SUPPORT_UTF */ + otherd = TABLE_GET(d, fcc, d); + } + if ((c == d || c == otherd) == (codevalue < OP_NOTSTAR)) + { + if (++count >= (int)GET2(code, 1)) + { ADD_NEW(state_offset + dlen + 1 + IMM2_SIZE, 0); } + else + { ADD_NEW(state_offset, count); } + } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_UPTOI: + case OP_MINUPTOI: + case OP_POSUPTOI: + case OP_NOTUPTOI: + case OP_NOTMINUPTOI: + case OP_NOTPOSUPTOI: + caseless = TRUE; + codevalue -= OP_STARI - OP_STAR; + /* Fall through */ + case OP_UPTO: + case OP_MINUPTO: + case OP_POSUPTO: + case OP_NOTUPTO: + case OP_NOTMINUPTO: + case OP_NOTPOSUPTO: + ADD_ACTIVE(state_offset + dlen + 1 + IMM2_SIZE, 0); + count = current_state->count; /* Number already matched */ + if (clen > 0) + { + pcre_uint32 otherd = NOTACHAR; + if (caseless) + { +#ifdef SUPPORT_UTF + if (utf && d >= 128) + { +#ifdef SUPPORT_UCP + otherd = UCD_OTHERCASE(d); +#endif /* SUPPORT_UCP */ + } + else +#endif /* SUPPORT_UTF */ + otherd = TABLE_GET(d, fcc, d); + } + if ((c == d || c == otherd) == (codevalue < OP_NOTSTAR)) + { + if (codevalue == OP_POSUPTO || codevalue == OP_NOTPOSUPTO) + { + active_count--; /* Remove non-match possibility */ + next_active_state--; + } + if (++count >= (int)GET2(code, 1)) + { ADD_NEW(state_offset + dlen + 1 + IMM2_SIZE, 0); } + else + { ADD_NEW(state_offset, count); } + } + } + break; + + +/* ========================================================================== */ + /* These are the class-handling opcodes */ + + case OP_CLASS: + case OP_NCLASS: + case OP_XCLASS: + { + BOOL isinclass = FALSE; + int next_state_offset; + const pcre_uchar *ecode; + + /* For a simple class, there is always just a 32-byte table, and we + can set isinclass from it. */ + + if (codevalue != OP_XCLASS) + { + ecode = code + 1 + (32 / sizeof(pcre_uchar)); + if (clen > 0) + { + isinclass = (c > 255)? (codevalue == OP_NCLASS) : + ((((pcre_uint8 *)(code + 1))[c/8] & (1 << (c&7))) != 0); + } + } + + /* An extended class may have a table or a list of single characters, + ranges, or both, and it may be positive or negative. There's a + function that sorts all this out. */ + + else + { + ecode = code + GET(code, 1); + if (clen > 0) isinclass = PRIV(xclass)(c, code + 1 + LINK_SIZE, utf); + } + + /* At this point, isinclass is set for all kinds of class, and ecode + points to the byte after the end of the class. If there is a + quantifier, this is where it will be. */ + + next_state_offset = (int)(ecode - start_code); + + switch (*ecode) + { + case OP_CRSTAR: + case OP_CRMINSTAR: + case OP_CRPOSSTAR: + ADD_ACTIVE(next_state_offset + 1, 0); + if (isinclass) + { + if (*ecode == OP_CRPOSSTAR) + { + active_count--; /* Remove non-match possibility */ + next_active_state--; + } + ADD_NEW(state_offset, 0); + } + break; + + case OP_CRPLUS: + case OP_CRMINPLUS: + case OP_CRPOSPLUS: + count = current_state->count; /* Already matched */ + if (count > 0) { ADD_ACTIVE(next_state_offset + 1, 0); } + if (isinclass) + { + if (count > 0 && *ecode == OP_CRPOSPLUS) + { + active_count--; /* Remove non-match possibility */ + next_active_state--; + } + count++; + ADD_NEW(state_offset, count); + } + break; + + case OP_CRQUERY: + case OP_CRMINQUERY: + case OP_CRPOSQUERY: + ADD_ACTIVE(next_state_offset + 1, 0); + if (isinclass) + { + if (*ecode == OP_CRPOSQUERY) + { + active_count--; /* Remove non-match possibility */ + next_active_state--; + } + ADD_NEW(next_state_offset + 1, 0); + } + break; + + case OP_CRRANGE: + case OP_CRMINRANGE: + case OP_CRPOSRANGE: + count = current_state->count; /* Already matched */ + if (count >= (int)GET2(ecode, 1)) + { ADD_ACTIVE(next_state_offset + 1 + 2 * IMM2_SIZE, 0); } + if (isinclass) + { + int max = (int)GET2(ecode, 1 + IMM2_SIZE); + if (*ecode == OP_CRPOSRANGE && count >= (int)GET2(ecode, 1)) + { + active_count--; /* Remove non-match possibility */ + next_active_state--; + } + if (++count >= max && max != 0) /* Max 0 => no limit */ + { ADD_NEW(next_state_offset + 1 + 2 * IMM2_SIZE, 0); } + else + { ADD_NEW(state_offset, count); } + } + break; + + default: + if (isinclass) { ADD_NEW(next_state_offset, 0); } + break; + } + } + break; + +/* ========================================================================== */ + /* These are the opcodes for fancy brackets of various kinds. We have + to use recursion in order to handle them. The "always failing" assertion + (?!) is optimised to OP_FAIL when compiling, so we have to support that, + though the other "backtracking verbs" are not supported. */ + + case OP_FAIL: + forced_fail++; /* Count FAILs for multiple states */ + break; + + case OP_ASSERT: + case OP_ASSERT_NOT: + case OP_ASSERTBACK: + case OP_ASSERTBACK_NOT: + { + int rc; + int local_offsets[2]; + int local_workspace[1000]; + const pcre_uchar *endasscode = code + GET(code, 1); + + while (*endasscode == OP_ALT) endasscode += GET(endasscode, 1); + + rc = internal_dfa_exec( + md, /* static match data */ + code, /* this subexpression's code */ + ptr, /* where we currently are */ + (int)(ptr - start_subject), /* start offset */ + local_offsets, /* offset vector */ + sizeof(local_offsets)/sizeof(int), /* size of same */ + local_workspace, /* workspace vector */ + sizeof(local_workspace)/sizeof(int), /* size of same */ + rlevel); /* function recursion level */ + + if (rc == PCRE_ERROR_DFA_UITEM) return rc; + if ((rc >= 0) == (codevalue == OP_ASSERT || codevalue == OP_ASSERTBACK)) + { ADD_ACTIVE((int)(endasscode + LINK_SIZE + 1 - start_code), 0); } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_COND: + case OP_SCOND: + { + int local_offsets[1000]; + int local_workspace[1000]; + int codelink = GET(code, 1); + int condcode; + + /* Because of the way auto-callout works during compile, a callout item + is inserted between OP_COND and an assertion condition. This does not + happen for the other conditions. */ + + if (code[LINK_SIZE+1] == OP_CALLOUT) + { + rrc = 0; + if (PUBL(callout) != NULL) + { + PUBL(callout_block) cb; + cb.version = 1; /* Version 1 of the callout block */ + cb.callout_number = code[LINK_SIZE+2]; + cb.offset_vector = offsets; +#if defined COMPILE_PCRE8 + cb.subject = (PCRE_SPTR)start_subject; +#elif defined COMPILE_PCRE16 + cb.subject = (PCRE_SPTR16)start_subject; +#elif defined COMPILE_PCRE32 + cb.subject = (PCRE_SPTR32)start_subject; +#endif + cb.subject_length = (int)(end_subject - start_subject); + cb.start_match = (int)(current_subject - start_subject); + cb.current_position = (int)(ptr - start_subject); + cb.pattern_position = GET(code, LINK_SIZE + 3); + cb.next_item_length = GET(code, 3 + 2*LINK_SIZE); + cb.capture_top = 1; + cb.capture_last = -1; + cb.callout_data = md->callout_data; + cb.mark = NULL; /* No (*MARK) support */ + if ((rrc = (*PUBL(callout))(&cb)) < 0) return rrc; /* Abandon */ + } + if (rrc > 0) break; /* Fail this thread */ + code += PRIV(OP_lengths)[OP_CALLOUT]; /* Skip callout data */ + } + + condcode = code[LINK_SIZE+1]; + + /* Back reference conditions and duplicate named recursion conditions + are not supported */ + + if (condcode == OP_CREF || condcode == OP_DNCREF || + condcode == OP_DNRREF) + return PCRE_ERROR_DFA_UCOND; + + /* The DEFINE condition is always false, and the assertion (?!) is + converted to OP_FAIL. */ + + if (condcode == OP_DEF || condcode == OP_FAIL) + { ADD_ACTIVE(state_offset + codelink + LINK_SIZE + 1, 0); } + + /* The only supported version of OP_RREF is for the value RREF_ANY, + which means "test if in any recursion". We can't test for specifically + recursed groups. */ + + else if (condcode == OP_RREF) + { + int value = GET2(code, LINK_SIZE + 2); + if (value != RREF_ANY) return PCRE_ERROR_DFA_UCOND; + if (md->recursive != NULL) + { ADD_ACTIVE(state_offset + LINK_SIZE + 2 + IMM2_SIZE, 0); } + else { ADD_ACTIVE(state_offset + codelink + LINK_SIZE + 1, 0); } + } + + /* Otherwise, the condition is an assertion */ + + else + { + int rc; + const pcre_uchar *asscode = code + LINK_SIZE + 1; + const pcre_uchar *endasscode = asscode + GET(asscode, 1); + + while (*endasscode == OP_ALT) endasscode += GET(endasscode, 1); + + rc = internal_dfa_exec( + md, /* fixed match data */ + asscode, /* this subexpression's code */ + ptr, /* where we currently are */ + (int)(ptr - start_subject), /* start offset */ + local_offsets, /* offset vector */ + sizeof(local_offsets)/sizeof(int), /* size of same */ + local_workspace, /* workspace vector */ + sizeof(local_workspace)/sizeof(int), /* size of same */ + rlevel); /* function recursion level */ + + if (rc == PCRE_ERROR_DFA_UITEM) return rc; + if ((rc >= 0) == + (condcode == OP_ASSERT || condcode == OP_ASSERTBACK)) + { ADD_ACTIVE((int)(endasscode + LINK_SIZE + 1 - start_code), 0); } + else + { ADD_ACTIVE(state_offset + codelink + LINK_SIZE + 1, 0); } + } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_RECURSE: + { + dfa_recursion_info *ri; + int local_offsets[1000]; + int local_workspace[1000]; + const pcre_uchar *callpat = start_code + GET(code, 1); + int recno = (callpat == md->start_code)? 0 : + GET2(callpat, 1 + LINK_SIZE); + int rc; + + DPRINTF(("%.*sStarting regex recursion\n", rlevel*2-2, SP)); + + /* Check for repeating a recursion without advancing the subject + pointer. This should catch convoluted mutual recursions. (Some simple + cases are caught at compile time.) */ + + for (ri = md->recursive; ri != NULL; ri = ri->prevrec) + if (recno == ri->group_num && ptr == ri->subject_position) + return PCRE_ERROR_RECURSELOOP; + + /* Remember this recursion and where we started it so as to + catch infinite loops. */ + + new_recursive.group_num = recno; + new_recursive.subject_position = ptr; + new_recursive.prevrec = md->recursive; + md->recursive = &new_recursive; + + rc = internal_dfa_exec( + md, /* fixed match data */ + callpat, /* this subexpression's code */ + ptr, /* where we currently are */ + (int)(ptr - start_subject), /* start offset */ + local_offsets, /* offset vector */ + sizeof(local_offsets)/sizeof(int), /* size of same */ + local_workspace, /* workspace vector */ + sizeof(local_workspace)/sizeof(int), /* size of same */ + rlevel); /* function recursion level */ + + md->recursive = new_recursive.prevrec; /* Done this recursion */ + + DPRINTF(("%.*sReturn from regex recursion: rc=%d\n", rlevel*2-2, SP, + rc)); + + /* Ran out of internal offsets */ + + if (rc == 0) return PCRE_ERROR_DFA_RECURSE; + + /* For each successful matched substring, set up the next state with a + count of characters to skip before trying it. Note that the count is in + characters, not bytes. */ + + if (rc > 0) + { + for (rc = rc*2 - 2; rc >= 0; rc -= 2) + { + int charcount = local_offsets[rc+1] - local_offsets[rc]; +#if defined SUPPORT_UTF && !defined COMPILE_PCRE32 + if (utf) + { + const pcre_uchar *p = start_subject + local_offsets[rc]; + const pcre_uchar *pp = start_subject + local_offsets[rc+1]; + while (p < pp) if (NOT_FIRSTCHAR(*p++)) charcount--; + } +#endif + if (charcount > 0) + { + ADD_NEW_DATA(-(state_offset + LINK_SIZE + 1), 0, (charcount - 1)); + } + else + { + ADD_ACTIVE(state_offset + LINK_SIZE + 1, 0); + } + } + } + else if (rc != PCRE_ERROR_NOMATCH) return rc; + } + break; + + /*-----------------------------------------------------------------*/ + case OP_BRAPOS: + case OP_SBRAPOS: + case OP_CBRAPOS: + case OP_SCBRAPOS: + case OP_BRAPOSZERO: + { + int charcount, matched_count; + const pcre_uchar *local_ptr = ptr; + BOOL allow_zero; + + if (codevalue == OP_BRAPOSZERO) + { + allow_zero = TRUE; + codevalue = *(++code); /* Codevalue will be one of above BRAs */ + } + else allow_zero = FALSE; + + /* Loop to match the subpattern as many times as possible as if it were + a complete pattern. */ + + for (matched_count = 0;; matched_count++) + { + int local_offsets[2]; + int local_workspace[1000]; + + int rc = internal_dfa_exec( + md, /* fixed match data */ + code, /* this subexpression's code */ + local_ptr, /* where we currently are */ + (int)(ptr - start_subject), /* start offset */ + local_offsets, /* offset vector */ + sizeof(local_offsets)/sizeof(int), /* size of same */ + local_workspace, /* workspace vector */ + sizeof(local_workspace)/sizeof(int), /* size of same */ + rlevel); /* function recursion level */ + + /* Failed to match */ + + if (rc < 0) + { + if (rc != PCRE_ERROR_NOMATCH) return rc; + break; + } + + /* Matched: break the loop if zero characters matched. */ + + charcount = local_offsets[1] - local_offsets[0]; + if (charcount == 0) break; + local_ptr += charcount; /* Advance temporary position ptr */ + } + + /* At this point we have matched the subpattern matched_count + times, and local_ptr is pointing to the character after the end of the + last match. */ + + if (matched_count > 0 || allow_zero) + { + const pcre_uchar *end_subpattern = code; + int next_state_offset; + + do { end_subpattern += GET(end_subpattern, 1); } + while (*end_subpattern == OP_ALT); + next_state_offset = + (int)(end_subpattern - start_code + LINK_SIZE + 1); + + /* Optimization: if there are no more active states, and there + are no new states yet set up, then skip over the subject string + right here, to save looping. Otherwise, set up the new state to swing + into action when the end of the matched substring is reached. */ + + if (i + 1 >= active_count && new_count == 0) + { + ptr = local_ptr; + clen = 0; + ADD_NEW(next_state_offset, 0); + } + else + { + const pcre_uchar *p = ptr; + const pcre_uchar *pp = local_ptr; + charcount = (int)(pp - p); +#if defined SUPPORT_UTF && !defined COMPILE_PCRE32 + if (utf) while (p < pp) if (NOT_FIRSTCHAR(*p++)) charcount--; +#endif + ADD_NEW_DATA(-next_state_offset, 0, (charcount - 1)); + } + } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_ONCE: + case OP_ONCE_NC: + { + int local_offsets[2]; + int local_workspace[1000]; + + int rc = internal_dfa_exec( + md, /* fixed match data */ + code, /* this subexpression's code */ + ptr, /* where we currently are */ + (int)(ptr - start_subject), /* start offset */ + local_offsets, /* offset vector */ + sizeof(local_offsets)/sizeof(int), /* size of same */ + local_workspace, /* workspace vector */ + sizeof(local_workspace)/sizeof(int), /* size of same */ + rlevel); /* function recursion level */ + + if (rc >= 0) + { + const pcre_uchar *end_subpattern = code; + int charcount = local_offsets[1] - local_offsets[0]; + int next_state_offset, repeat_state_offset; + + do { end_subpattern += GET(end_subpattern, 1); } + while (*end_subpattern == OP_ALT); + next_state_offset = + (int)(end_subpattern - start_code + LINK_SIZE + 1); + + /* If the end of this subpattern is KETRMAX or KETRMIN, we must + arrange for the repeat state also to be added to the relevant list. + Calculate the offset, or set -1 for no repeat. */ + + repeat_state_offset = (*end_subpattern == OP_KETRMAX || + *end_subpattern == OP_KETRMIN)? + (int)(end_subpattern - start_code - GET(end_subpattern, 1)) : -1; + + /* If we have matched an empty string, add the next state at the + current character pointer. This is important so that the duplicate + checking kicks in, which is what breaks infinite loops that match an + empty string. */ + + if (charcount == 0) + { + ADD_ACTIVE(next_state_offset, 0); + } + + /* Optimization: if there are no more active states, and there + are no new states yet set up, then skip over the subject string + right here, to save looping. Otherwise, set up the new state to swing + into action when the end of the matched substring is reached. */ + + else if (i + 1 >= active_count && new_count == 0) + { + ptr += charcount; + clen = 0; + ADD_NEW(next_state_offset, 0); + + /* If we are adding a repeat state at the new character position, + we must fudge things so that it is the only current state. + Otherwise, it might be a duplicate of one we processed before, and + that would cause it to be skipped. */ + + if (repeat_state_offset >= 0) + { + next_active_state = active_states; + active_count = 0; + i = -1; + ADD_ACTIVE(repeat_state_offset, 0); + } + } + else + { +#if defined SUPPORT_UTF && !defined COMPILE_PCRE32 + if (utf) + { + const pcre_uchar *p = start_subject + local_offsets[0]; + const pcre_uchar *pp = start_subject + local_offsets[1]; + while (p < pp) if (NOT_FIRSTCHAR(*p++)) charcount--; + } +#endif + ADD_NEW_DATA(-next_state_offset, 0, (charcount - 1)); + if (repeat_state_offset >= 0) + { ADD_NEW_DATA(-repeat_state_offset, 0, (charcount - 1)); } + } + } + else if (rc != PCRE_ERROR_NOMATCH) return rc; + } + break; + + +/* ========================================================================== */ + /* Handle callouts */ + + case OP_CALLOUT: + rrc = 0; + if (PUBL(callout) != NULL) + { + PUBL(callout_block) cb; + cb.version = 1; /* Version 1 of the callout block */ + cb.callout_number = code[1]; + cb.offset_vector = offsets; +#if defined COMPILE_PCRE8 + cb.subject = (PCRE_SPTR)start_subject; +#elif defined COMPILE_PCRE16 + cb.subject = (PCRE_SPTR16)start_subject; +#elif defined COMPILE_PCRE32 + cb.subject = (PCRE_SPTR32)start_subject; +#endif + cb.subject_length = (int)(end_subject - start_subject); + cb.start_match = (int)(current_subject - start_subject); + cb.current_position = (int)(ptr - start_subject); + cb.pattern_position = GET(code, 2); + cb.next_item_length = GET(code, 2 + LINK_SIZE); + cb.capture_top = 1; + cb.capture_last = -1; + cb.callout_data = md->callout_data; + cb.mark = NULL; /* No (*MARK) support */ + if ((rrc = (*PUBL(callout))(&cb)) < 0) return rrc; /* Abandon */ + } + if (rrc == 0) + { ADD_ACTIVE(state_offset + PRIV(OP_lengths)[OP_CALLOUT], 0); } + break; + + +/* ========================================================================== */ + default: /* Unsupported opcode */ + return PCRE_ERROR_DFA_UITEM; + } + + NEXT_ACTIVE_STATE: continue; + + } /* End of loop scanning active states */ + + /* We have finished the processing at the current subject character. If no + new states have been set for the next character, we have found all the + matches that we are going to find. If we are at the top level and partial + matching has been requested, check for appropriate conditions. + + The "forced_ fail" variable counts the number of (*F) encountered for the + character. If it is equal to the original active_count (saved in + workspace[1]) it means that (*F) was found on every active state. In this + case we don't want to give a partial match. + + The "could_continue" variable is true if a state could have continued but + for the fact that the end of the subject was reached. */ + + if (new_count <= 0) + { + if (rlevel == 1 && /* Top level, and */ + could_continue && /* Some could go on, and */ + forced_fail != workspace[1] && /* Not all forced fail & */ + ( /* either... */ + (md->moptions & PCRE_PARTIAL_HARD) != 0 /* Hard partial */ + || /* or... */ + ((md->moptions & PCRE_PARTIAL_SOFT) != 0 && /* Soft partial and */ + match_count < 0) /* no matches */ + ) && /* And... */ + ( + partial_newline || /* Either partial NL */ + ( /* or ... */ + ptr >= end_subject && /* End of subject and */ + ptr > md->start_used_ptr) /* Inspected non-empty string */ + ) + ) + match_count = PCRE_ERROR_PARTIAL; + DPRINTF(("%.*sEnd of internal_dfa_exec %d: returning %d\n" + "%.*s---------------------\n\n", rlevel*2-2, SP, rlevel, match_count, + rlevel*2-2, SP)); + break; /* In effect, "return", but see the comment below */ + } + + /* One or more states are active for the next character. */ + + ptr += clen; /* Advance to next subject character */ + } /* Loop to move along the subject string */ + +/* Control gets here from "break" a few lines above. We do it this way because +if we use "return" above, we have compiler trouble. Some compilers warn if +there's nothing here because they think the function doesn't return a value. On +the other hand, if we put a dummy statement here, some more clever compilers +complain that it can't be reached. Sigh. */ + +return match_count; +} + + + + +/************************************************* +* Execute a Regular Expression - DFA engine * +*************************************************/ + +/* This external function applies a compiled re to a subject string using a DFA +engine. This function calls the internal function multiple times if the pattern +is not anchored. + +Arguments: + argument_re points to the compiled expression + extra_data points to extra data or is NULL + subject points to the subject string + length length of subject string (may contain binary zeros) + start_offset where to start in the subject string + options option bits + offsets vector of match offsets + offsetcount size of same + workspace workspace vector + wscount size of same + +Returns: > 0 => number of match offset pairs placed in offsets + = 0 => offsets overflowed; longest matches are present + -1 => failed to match + < -1 => some kind of unexpected problem +*/ + +#if defined COMPILE_PCRE8 +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre_dfa_exec(const pcre *argument_re, const pcre_extra *extra_data, + const char *subject, int length, int start_offset, int options, int *offsets, + int offsetcount, int *workspace, int wscount) +#elif defined COMPILE_PCRE16 +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre16_dfa_exec(const pcre16 *argument_re, const pcre16_extra *extra_data, + PCRE_SPTR16 subject, int length, int start_offset, int options, int *offsets, + int offsetcount, int *workspace, int wscount) +#elif defined COMPILE_PCRE32 +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre32_dfa_exec(const pcre32 *argument_re, const pcre32_extra *extra_data, + PCRE_SPTR32 subject, int length, int start_offset, int options, int *offsets, + int offsetcount, int *workspace, int wscount) +#endif +{ +REAL_PCRE *re = (REAL_PCRE *)argument_re; +dfa_match_data match_block; +dfa_match_data *md = &match_block; +BOOL utf, anchored, startline, firstline; +const pcre_uchar *current_subject, *end_subject; +const pcre_study_data *study = NULL; + +const pcre_uchar *req_char_ptr; +const pcre_uint8 *start_bits = NULL; +BOOL has_first_char = FALSE; +BOOL has_req_char = FALSE; +pcre_uchar first_char = 0; +pcre_uchar first_char2 = 0; +pcre_uchar req_char = 0; +pcre_uchar req_char2 = 0; +int newline; + +/* Plausibility checks */ + +if ((options & ~PUBLIC_DFA_EXEC_OPTIONS) != 0) return PCRE_ERROR_BADOPTION; +if (re == NULL || subject == NULL || workspace == NULL || + (offsets == NULL && offsetcount > 0)) return PCRE_ERROR_NULL; +if (offsetcount < 0) return PCRE_ERROR_BADCOUNT; +if (wscount < 20) return PCRE_ERROR_DFA_WSSIZE; +if (length < 0) return PCRE_ERROR_BADLENGTH; +if (start_offset < 0 || start_offset > length) return PCRE_ERROR_BADOFFSET; + +/* Check that the first field in the block is the magic number. If it is not, +return with PCRE_ERROR_BADMAGIC. However, if the magic number is equal to +REVERSED_MAGIC_NUMBER we return with PCRE_ERROR_BADENDIANNESS, which +means that the pattern is likely compiled with different endianness. */ + +if (re->magic_number != MAGIC_NUMBER) + return re->magic_number == REVERSED_MAGIC_NUMBER? + PCRE_ERROR_BADENDIANNESS:PCRE_ERROR_BADMAGIC; +if ((re->flags & PCRE_MODE) == 0) return PCRE_ERROR_BADMODE; + +/* If restarting after a partial match, do some sanity checks on the contents +of the workspace. */ + +if ((options & PCRE_DFA_RESTART) != 0) + { + if ((workspace[0] & (-2)) != 0 || workspace[1] < 1 || + workspace[1] > (wscount - 2)/INTS_PER_STATEBLOCK) + return PCRE_ERROR_DFA_BADRESTART; + } + +/* Set up study, callout, and table data */ + +md->tables = re->tables; +md->callout_data = NULL; + +if (extra_data != NULL) + { + unsigned long int flags = extra_data->flags; + if ((flags & PCRE_EXTRA_STUDY_DATA) != 0) + study = (const pcre_study_data *)extra_data->study_data; + if ((flags & PCRE_EXTRA_MATCH_LIMIT) != 0) return PCRE_ERROR_DFA_UMLIMIT; + if ((flags & PCRE_EXTRA_MATCH_LIMIT_RECURSION) != 0) + return PCRE_ERROR_DFA_UMLIMIT; + if ((flags & PCRE_EXTRA_CALLOUT_DATA) != 0) + md->callout_data = extra_data->callout_data; + if ((flags & PCRE_EXTRA_TABLES) != 0) + md->tables = extra_data->tables; + } + +/* Set some local values */ + +current_subject = (const pcre_uchar *)subject + start_offset; +end_subject = (const pcre_uchar *)subject + length; +req_char_ptr = current_subject - 1; + +#ifdef SUPPORT_UTF +/* PCRE_UTF(16|32) have the same value as PCRE_UTF8. */ +utf = (re->options & PCRE_UTF8) != 0; +#else +utf = FALSE; +#endif + +anchored = (options & (PCRE_ANCHORED|PCRE_DFA_RESTART)) != 0 || + (re->options & PCRE_ANCHORED) != 0; + +/* The remaining fixed data for passing around. */ + +md->start_code = (const pcre_uchar *)argument_re + + re->name_table_offset + re->name_count * re->name_entry_size; +md->start_subject = (const pcre_uchar *)subject; +md->end_subject = end_subject; +md->start_offset = start_offset; +md->moptions = options; +md->poptions = re->options; + +/* If the BSR option is not set at match time, copy what was set +at compile time. */ + +if ((md->moptions & (PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE)) == 0) + { + if ((re->options & (PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE)) != 0) + md->moptions |= re->options & (PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE); +#ifdef BSR_ANYCRLF + else md->moptions |= PCRE_BSR_ANYCRLF; +#endif + } + +/* Handle different types of newline. The three bits give eight cases. If +nothing is set at run time, whatever was used at compile time applies. */ + +switch ((((options & PCRE_NEWLINE_BITS) == 0)? re->options : (pcre_uint32)options) & + PCRE_NEWLINE_BITS) + { + case 0: newline = NEWLINE; break; /* Compile-time default */ + case PCRE_NEWLINE_CR: newline = CHAR_CR; break; + case PCRE_NEWLINE_LF: newline = CHAR_NL; break; + case PCRE_NEWLINE_CR+ + PCRE_NEWLINE_LF: newline = (CHAR_CR << 8) | CHAR_NL; break; + case PCRE_NEWLINE_ANY: newline = -1; break; + case PCRE_NEWLINE_ANYCRLF: newline = -2; break; + default: return PCRE_ERROR_BADNEWLINE; + } + +if (newline == -2) + { + md->nltype = NLTYPE_ANYCRLF; + } +else if (newline < 0) + { + md->nltype = NLTYPE_ANY; + } +else + { + md->nltype = NLTYPE_FIXED; + if (newline > 255) + { + md->nllen = 2; + md->nl[0] = (newline >> 8) & 255; + md->nl[1] = newline & 255; + } + else + { + md->nllen = 1; + md->nl[0] = newline; + } + } + +/* Check a UTF-8 string if required. Unfortunately there's no way of passing +back the character offset. */ + +#ifdef SUPPORT_UTF +if (utf && (options & PCRE_NO_UTF8_CHECK) == 0) + { + int erroroffset; + int errorcode = PRIV(valid_utf)((pcre_uchar *)subject, length, &erroroffset); + if (errorcode != 0) + { + if (offsetcount >= 2) + { + offsets[0] = erroroffset; + offsets[1] = errorcode; + } +#if defined COMPILE_PCRE8 + return (errorcode <= PCRE_UTF8_ERR5 && (options & PCRE_PARTIAL_HARD) != 0) ? + PCRE_ERROR_SHORTUTF8 : PCRE_ERROR_BADUTF8; +#elif defined COMPILE_PCRE16 + return (errorcode <= PCRE_UTF16_ERR1 && (options & PCRE_PARTIAL_HARD) != 0) ? + PCRE_ERROR_SHORTUTF16 : PCRE_ERROR_BADUTF16; +#elif defined COMPILE_PCRE32 + return PCRE_ERROR_BADUTF32; +#endif + } +#if defined COMPILE_PCRE8 || defined COMPILE_PCRE16 + if (start_offset > 0 && start_offset < length && + NOT_FIRSTCHAR(((PCRE_PUCHAR)subject)[start_offset])) + return PCRE_ERROR_BADUTF8_OFFSET; +#endif + } +#endif + +/* If the exec call supplied NULL for tables, use the inbuilt ones. This +is a feature that makes it possible to save compiled regex and re-use them +in other programs later. */ + +if (md->tables == NULL) md->tables = PRIV(default_tables); + +/* The "must be at the start of a line" flags are used in a loop when finding +where to start. */ + +startline = (re->flags & PCRE_STARTLINE) != 0; +firstline = (re->options & PCRE_FIRSTLINE) != 0; + +/* Set up the first character to match, if available. The first_byte value is +never set for an anchored regular expression, but the anchoring may be forced +at run time, so we have to test for anchoring. The first char may be unset for +an unanchored pattern, of course. If there's no first char and the pattern was +studied, there may be a bitmap of possible first characters. */ + +if (!anchored) + { + if ((re->flags & PCRE_FIRSTSET) != 0) + { + has_first_char = TRUE; + first_char = first_char2 = (pcre_uchar)(re->first_char); + if ((re->flags & PCRE_FCH_CASELESS) != 0) + { + first_char2 = TABLE_GET(first_char, md->tables + fcc_offset, first_char); +#if defined SUPPORT_UCP && !(defined COMPILE_PCRE8) + if (utf && first_char > 127) + first_char2 = UCD_OTHERCASE(first_char); +#endif + } + } + else + { + if (!startline && study != NULL && + (study->flags & PCRE_STUDY_MAPPED) != 0) + start_bits = study->start_bits; + } + } + +/* For anchored or unanchored matches, there may be a "last known required +character" set. */ + +if ((re->flags & PCRE_REQCHSET) != 0) + { + has_req_char = TRUE; + req_char = req_char2 = (pcre_uchar)(re->req_char); + if ((re->flags & PCRE_RCH_CASELESS) != 0) + { + req_char2 = TABLE_GET(req_char, md->tables + fcc_offset, req_char); +#if defined SUPPORT_UCP && !(defined COMPILE_PCRE8) + if (utf && req_char > 127) + req_char2 = UCD_OTHERCASE(req_char); +#endif + } + } + +/* Call the main matching function, looping for a non-anchored regex after a +failed match. If not restarting, perform certain optimizations at the start of +a match. */ + +for (;;) + { + int rc; + + if ((options & PCRE_DFA_RESTART) == 0) + { + const pcre_uchar *save_end_subject = end_subject; + + /* If firstline is TRUE, the start of the match is constrained to the first + line of a multiline string. Implement this by temporarily adjusting + end_subject so that we stop scanning at a newline. If the match fails at + the newline, later code breaks this loop. */ + + if (firstline) + { + PCRE_PUCHAR t = current_subject; +#ifdef SUPPORT_UTF + if (utf) + { + while (t < md->end_subject && !IS_NEWLINE(t)) + { + t++; + ACROSSCHAR(t < end_subject, *t, t++); + } + } + else +#endif + while (t < md->end_subject && !IS_NEWLINE(t)) t++; + end_subject = t; + } + + /* There are some optimizations that avoid running the match if a known + starting point is not found. However, there is an option that disables + these, for testing and for ensuring that all callouts do actually occur. + The option can be set in the regex by (*NO_START_OPT) or passed in + match-time options. */ + + if (((options | re->options) & PCRE_NO_START_OPTIMIZE) == 0) + { + /* Advance to a known first pcre_uchar (i.e. data item) */ + + if (has_first_char) + { + if (first_char != first_char2) + { + pcre_uchar csc; + while (current_subject < end_subject && + (csc = UCHAR21TEST(current_subject)) != first_char && csc != first_char2) + current_subject++; + } + else + while (current_subject < end_subject && + UCHAR21TEST(current_subject) != first_char) + current_subject++; + } + + /* Or to just after a linebreak for a multiline match if possible */ + + else if (startline) + { + if (current_subject > md->start_subject + start_offset) + { +#ifdef SUPPORT_UTF + if (utf) + { + while (current_subject < end_subject && + !WAS_NEWLINE(current_subject)) + { + current_subject++; + ACROSSCHAR(current_subject < end_subject, *current_subject, + current_subject++); + } + } + else +#endif + while (current_subject < end_subject && !WAS_NEWLINE(current_subject)) + current_subject++; + + /* If we have just passed a CR and the newline option is ANY or + ANYCRLF, and we are now at a LF, advance the match position by one + more character. */ + + if (UCHAR21TEST(current_subject - 1) == CHAR_CR && + (md->nltype == NLTYPE_ANY || md->nltype == NLTYPE_ANYCRLF) && + current_subject < end_subject && + UCHAR21TEST(current_subject) == CHAR_NL) + current_subject++; + } + } + + /* Advance to a non-unique first pcre_uchar after study */ + + else if (start_bits != NULL) + { + while (current_subject < end_subject) + { + register pcre_uint32 c = UCHAR21TEST(current_subject); +#ifndef COMPILE_PCRE8 + if (c > 255) c = 255; +#endif + if ((start_bits[c/8] & (1 << (c&7))) != 0) break; + current_subject++; + } + } + } + + /* Restore fudged end_subject */ + + end_subject = save_end_subject; + + /* The following two optimizations are disabled for partial matching or if + disabling is explicitly requested (and of course, by the test above, this + code is not obeyed when restarting after a partial match). */ + + if (((options | re->options) & PCRE_NO_START_OPTIMIZE) == 0 && + (options & (PCRE_PARTIAL_HARD|PCRE_PARTIAL_SOFT)) == 0) + { + /* If the pattern was studied, a minimum subject length may be set. This + is a lower bound; no actual string of that length may actually match the + pattern. Although the value is, strictly, in characters, we treat it as + in pcre_uchar units to avoid spending too much time in this optimization. + */ + + if (study != NULL && (study->flags & PCRE_STUDY_MINLEN) != 0 && + (pcre_uint32)(end_subject - current_subject) < study->minlength) + return PCRE_ERROR_NOMATCH; + + /* If req_char is set, we know that that pcre_uchar must appear in the + subject for the match to succeed. If the first pcre_uchar is set, + req_char must be later in the subject; otherwise the test starts at the + match point. This optimization can save a huge amount of work in patterns + with nested unlimited repeats that aren't going to match. Writing + separate code for cased/caseless versions makes it go faster, as does + using an autoincrement and backing off on a match. + + HOWEVER: when the subject string is very, very long, searching to its end + can take a long time, and give bad performance on quite ordinary + patterns. This showed up when somebody was matching /^C/ on a 32-megabyte + string... so we don't do this when the string is sufficiently long. */ + + if (has_req_char && end_subject - current_subject < REQ_BYTE_MAX) + { + register PCRE_PUCHAR p = current_subject + (has_first_char? 1:0); + + /* We don't need to repeat the search if we haven't yet reached the + place we found it at last time. */ + + if (p > req_char_ptr) + { + if (req_char != req_char2) + { + while (p < end_subject) + { + register pcre_uint32 pp = UCHAR21INCTEST(p); + if (pp == req_char || pp == req_char2) { p--; break; } + } + } + else + { + while (p < end_subject) + { + if (UCHAR21INCTEST(p) == req_char) { p--; break; } + } + } + + /* If we can't find the required pcre_uchar, break the matching loop, + which will cause a return or PCRE_ERROR_NOMATCH. */ + + if (p >= end_subject) break; + + /* If we have found the required pcre_uchar, save the point where we + found it, so that we don't search again next time round the loop if + the start hasn't passed this point yet. */ + + req_char_ptr = p; + } + } + } + } /* End of optimizations that are done when not restarting */ + + /* OK, now we can do the business */ + + md->start_used_ptr = current_subject; + md->recursive = NULL; + + rc = internal_dfa_exec( + md, /* fixed match data */ + md->start_code, /* this subexpression's code */ + current_subject, /* where we currently are */ + start_offset, /* start offset in subject */ + offsets, /* offset vector */ + offsetcount, /* size of same */ + workspace, /* workspace vector */ + wscount, /* size of same */ + 0); /* function recurse level */ + + /* Anything other than "no match" means we are done, always; otherwise, carry + on only if not anchored. */ + + if (rc != PCRE_ERROR_NOMATCH || anchored) + { + if (rc == PCRE_ERROR_PARTIAL && offsetcount >= 2) + { + offsets[0] = (int)(md->start_used_ptr - (PCRE_PUCHAR)subject); + offsets[1] = (int)(end_subject - (PCRE_PUCHAR)subject); + if (offsetcount > 2) + offsets[2] = (int)(current_subject - (PCRE_PUCHAR)subject); + } + return rc; + } + + /* Advance to the next subject character unless we are at the end of a line + and firstline is set. */ + + if (firstline && IS_NEWLINE(current_subject)) break; + current_subject++; +#ifdef SUPPORT_UTF + if (utf) + { + ACROSSCHAR(current_subject < end_subject, *current_subject, + current_subject++); + } +#endif + if (current_subject > end_subject) break; + + /* If we have just passed a CR and we are now at a LF, and the pattern does + not contain any explicit matches for \r or \n, and the newline option is CRLF + or ANY or ANYCRLF, advance the match position by one more character. */ + + if (UCHAR21TEST(current_subject - 1) == CHAR_CR && + current_subject < end_subject && + UCHAR21TEST(current_subject) == CHAR_NL && + (re->flags & PCRE_HASCRORLF) == 0 && + (md->nltype == NLTYPE_ANY || + md->nltype == NLTYPE_ANYCRLF || + md->nllen == 2)) + current_subject++; + + } /* "Bumpalong" loop */ + +return PCRE_ERROR_NOMATCH; +} + +/* End of pcre_dfa_exec.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_exec.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_exec.c new file mode 100755 index 000000000..3fd58cbe3 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_exec.c @@ -0,0 +1,7173 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2018 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +/* This module contains pcre_exec(), the externally visible function that does +pattern matching using an NFA algorithm, trying to mimic Perl as closely as +possible. There are also some static supporting functions. */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#define NLBLOCK md /* Block containing newline information */ +#define PSSTART start_subject /* Field containing processed string start */ +#define PSEND end_subject /* Field containing processed string end */ + +#include "pcre_internal.h" + +/* Undefine some potentially clashing cpp symbols */ + +#undef min +#undef max + +/* The md->capture_last field uses the lower 16 bits for the last captured +substring (which can never be greater than 65535) and a bit in the top half +to mean "capture vector overflowed". This odd way of doing things was +implemented when it was realized that preserving and restoring the overflow bit +whenever the last capture number was saved/restored made for a neater +interface, and doing it this way saved on (a) another variable, which would +have increased the stack frame size (a big NO-NO in PCRE) and (b) another +separate set of save/restore instructions. The following defines are used in +implementing this. */ + +#define CAPLMASK 0x0000ffff /* The bits used for last_capture */ +#define OVFLMASK 0xffff0000 /* The bits used for the overflow flag */ +#define OVFLBIT 0x00010000 /* The bit that is set for overflow */ + +/* Values for setting in md->match_function_type to indicate two special types +of call to match(). We do it this way to save on using another stack variable, +as stack usage is to be discouraged. */ + +#define MATCH_CONDASSERT 1 /* Called to check a condition assertion */ +#define MATCH_CBEGROUP 2 /* Could-be-empty unlimited repeat group */ + +/* Non-error returns from the match() function. Error returns are externally +defined PCRE_ERROR_xxx codes, which are all negative. */ + +#define MATCH_MATCH 1 +#define MATCH_NOMATCH 0 + +/* Special internal returns from the match() function. Make them sufficiently +negative to avoid the external error codes. */ + +#define MATCH_ACCEPT (-999) +#define MATCH_KETRPOS (-998) +#define MATCH_ONCE (-997) +/* The next 5 must be kept together and in sequence so that a test that checks +for any one of them can use a range. */ +#define MATCH_COMMIT (-996) +#define MATCH_PRUNE (-995) +#define MATCH_SKIP (-994) +#define MATCH_SKIP_ARG (-993) +#define MATCH_THEN (-992) +#define MATCH_BACKTRACK_MAX MATCH_THEN +#define MATCH_BACKTRACK_MIN MATCH_COMMIT + +/* Maximum number of ints of offset to save on the stack for recursive calls. +If the offset vector is bigger, malloc is used. This should be a multiple of 3, +because the offset vector is always a multiple of 3 long. */ + +#define REC_STACK_SAVE_MAX 30 + +/* Min and max values for the common repeats; for the maxima, 0 => infinity */ + +static const char rep_min[] = { 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, }; +static const char rep_max[] = { 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, }; + +#ifdef PCRE_DEBUG +/************************************************* +* Debugging function to print chars * +*************************************************/ + +/* Print a sequence of chars in printable format, stopping at the end of the +subject if the requested. + +Arguments: + p points to characters + length number to print + is_subject TRUE if printing from within md->start_subject + md pointer to matching data block, if is_subject is TRUE + +Returns: nothing +*/ + +static void +pchars(const pcre_uchar *p, int length, BOOL is_subject, match_data *md) +{ +pcre_uint32 c; +BOOL utf = md->utf; +if (is_subject && length > md->end_subject - p) length = md->end_subject - p; +while (length-- > 0) + if (isprint(c = UCHAR21INCTEST(p))) printf("%c", (char)c); else printf("\\x{%02x}", c); +} +#endif + + + +/************************************************* +* Match a back-reference * +*************************************************/ + +/* Normally, if a back reference hasn't been set, the length that is passed is +negative, so the match always fails. However, in JavaScript compatibility mode, +the length passed is zero. Note that in caseless UTF-8 mode, the number of +subject bytes matched may be different to the number of reference bytes. + +Arguments: + offset index into the offset vector + eptr pointer into the subject + length length of reference to be matched (number of bytes) + md points to match data block + caseless TRUE if caseless + +Returns: >= 0 the number of subject bytes matched + -1 no match + -2 partial match; always given if at end subject +*/ + +static int +match_ref(int offset, register PCRE_PUCHAR eptr, int length, match_data *md, + BOOL caseless) +{ +PCRE_PUCHAR eptr_start = eptr; +register PCRE_PUCHAR p = md->start_subject + md->offset_vector[offset]; +#if defined SUPPORT_UTF && defined SUPPORT_UCP +BOOL utf = md->utf; +#endif + +#ifdef PCRE_DEBUG +if (eptr >= md->end_subject) + printf("matching subject "); +else + { + printf("matching subject "); + pchars(eptr, length, TRUE, md); + } +printf(" against backref "); +pchars(p, length, FALSE, md); +printf("\n"); +#endif + +/* Always fail if reference not set (and not JavaScript compatible - in that +case the length is passed as zero). */ + +if (length < 0) return -1; + +/* Separate the caseless case for speed. In UTF-8 mode we can only do this +properly if Unicode properties are supported. Otherwise, we can check only +ASCII characters. */ + +if (caseless) + { +#if defined SUPPORT_UTF && defined SUPPORT_UCP + if (utf) + { + /* Match characters up to the end of the reference. NOTE: the number of + data units matched may differ, because in UTF-8 there are some characters + whose upper and lower case versions code have different numbers of bytes. + For example, U+023A (2 bytes in UTF-8) is the upper case version of U+2C65 + (3 bytes in UTF-8); a sequence of 3 of the former uses 6 bytes, as does a + sequence of two of the latter. It is important, therefore, to check the + length along the reference, not along the subject (earlier code did this + wrong). */ + + PCRE_PUCHAR endptr = p + length; + while (p < endptr) + { + pcre_uint32 c, d; + const ucd_record *ur; + if (eptr >= md->end_subject) return -2; /* Partial match */ + GETCHARINC(c, eptr); + GETCHARINC(d, p); + ur = GET_UCD(d); + if (c != d && c != d + ur->other_case) + { + const pcre_uint32 *pp = PRIV(ucd_caseless_sets) + ur->caseset; + for (;;) + { + if (c < *pp) return -1; + if (c == *pp++) break; + } + } + } + } + else +#endif + + /* The same code works when not in UTF-8 mode and in UTF-8 mode when there + is no UCP support. */ + { + while (length-- > 0) + { + pcre_uint32 cc, cp; + if (eptr >= md->end_subject) return -2; /* Partial match */ + cc = UCHAR21TEST(eptr); + cp = UCHAR21TEST(p); + if (TABLE_GET(cp, md->lcc, cp) != TABLE_GET(cc, md->lcc, cc)) return -1; + p++; + eptr++; + } + } + } + +/* In the caseful case, we can just compare the bytes, whether or not we +are in UTF-8 mode. */ + +else + { + while (length-- > 0) + { + if (eptr >= md->end_subject) return -2; /* Partial match */ + if (UCHAR21INCTEST(p) != UCHAR21INCTEST(eptr)) return -1; + } + } + +return (int)(eptr - eptr_start); +} + + + +/*************************************************************************** +**************************************************************************** + RECURSION IN THE match() FUNCTION + +The match() function is highly recursive, though not every recursive call +increases the recursive depth. Nevertheless, some regular expressions can cause +it to recurse to a great depth. I was writing for Unix, so I just let it call +itself recursively. This uses the stack for saving everything that has to be +saved for a recursive call. On Unix, the stack can be large, and this works +fine. + +It turns out that on some non-Unix-like systems there are problems with +programs that use a lot of stack. (This despite the fact that every last chip +has oodles of memory these days, and techniques for extending the stack have +been known for decades.) So.... + +There is a fudge, triggered by defining NO_RECURSE, which avoids recursive +calls by keeping local variables that need to be preserved in blocks of memory +obtained from malloc() instead instead of on the stack. Macros are used to +achieve this so that the actual code doesn't look very different to what it +always used to. + +The original heap-recursive code used longjmp(). However, it seems that this +can be very slow on some operating systems. Following a suggestion from Stan +Switzer, the use of longjmp() has been abolished, at the cost of having to +provide a unique number for each call to RMATCH. There is no way of generating +a sequence of numbers at compile time in C. I have given them names, to make +them stand out more clearly. + +Crude tests on x86 Linux show a small speedup of around 5-8%. However, on +FreeBSD, avoiding longjmp() more than halves the time taken to run the standard +tests. Furthermore, not using longjmp() means that local dynamic variables +don't have indeterminate values; this has meant that the frame size can be +reduced because the result can be "passed back" by straight setting of the +variable instead of being passed in the frame. +**************************************************************************** +***************************************************************************/ + +/* Numbers for RMATCH calls. When this list is changed, the code at HEAP_RETURN +below must be updated in sync. */ + +enum { RM1=1, RM2, RM3, RM4, RM5, RM6, RM7, RM8, RM9, RM10, + RM11, RM12, RM13, RM14, RM15, RM16, RM17, RM18, RM19, RM20, + RM21, RM22, RM23, RM24, RM25, RM26, RM27, RM28, RM29, RM30, + RM31, RM32, RM33, RM34, RM35, RM36, RM37, RM38, RM39, RM40, + RM41, RM42, RM43, RM44, RM45, RM46, RM47, RM48, RM49, RM50, + RM51, RM52, RM53, RM54, RM55, RM56, RM57, RM58, RM59, RM60, + RM61, RM62, RM63, RM64, RM65, RM66, RM67 }; + +/* These versions of the macros use the stack, as normal. There are debugging +versions and production versions. Note that the "rw" argument of RMATCH isn't +actually used in this definition. */ + +#ifndef NO_RECURSE +#define REGISTER register + +#ifdef PCRE_DEBUG +#define RMATCH(ra,rb,rc,rd,re,rw) \ + { \ + printf("match() called in line %d\n", __LINE__); \ + rrc = match(ra,rb,mstart,rc,rd,re,rdepth+1); \ + printf("to line %d\n", __LINE__); \ + } +#define RRETURN(ra) \ + { \ + printf("match() returned %d from line %d\n", ra, __LINE__); \ + return ra; \ + } +#else +#define RMATCH(ra,rb,rc,rd,re,rw) \ + rrc = match(ra,rb,mstart,rc,rd,re,rdepth+1) +#define RRETURN(ra) return ra +#endif + +#else + + +/* These versions of the macros manage a private stack on the heap. Note that +the "rd" argument of RMATCH isn't actually used in this definition. It's the md +argument of match(), which never changes. */ + +#define REGISTER + +#define RMATCH(ra,rb,rc,rd,re,rw)\ + {\ + heapframe *newframe = frame->Xnextframe;\ + if (newframe == NULL)\ + {\ + newframe = (heapframe *)(PUBL(stack_malloc))(sizeof(heapframe));\ + if (newframe == NULL) RRETURN(PCRE_ERROR_NOMEMORY);\ + newframe->Xnextframe = NULL;\ + frame->Xnextframe = newframe;\ + }\ + frame->Xwhere = rw;\ + newframe->Xeptr = ra;\ + newframe->Xecode = rb;\ + newframe->Xmstart = mstart;\ + newframe->Xoffset_top = rc;\ + newframe->Xeptrb = re;\ + newframe->Xrdepth = frame->Xrdepth + 1;\ + newframe->Xprevframe = frame;\ + frame = newframe;\ + DPRINTF(("restarting from line %d\n", __LINE__));\ + goto HEAP_RECURSE;\ + L_##rw:\ + DPRINTF(("jumped back to line %d\n", __LINE__));\ + } + +#define RRETURN(ra)\ + {\ + heapframe *oldframe = frame;\ + frame = oldframe->Xprevframe;\ + if (frame != NULL)\ + {\ + rrc = ra;\ + goto HEAP_RETURN;\ + }\ + return ra;\ + } + + +/* Structure for remembering the local variables in a private frame */ + +typedef struct heapframe { + struct heapframe *Xprevframe; + struct heapframe *Xnextframe; + + /* Function arguments that may change */ + + PCRE_PUCHAR Xeptr; + const pcre_uchar *Xecode; + PCRE_PUCHAR Xmstart; + int Xoffset_top; + eptrblock *Xeptrb; + unsigned int Xrdepth; + + /* Function local variables */ + + PCRE_PUCHAR Xcallpat; +#ifdef SUPPORT_UTF + PCRE_PUCHAR Xcharptr; +#endif + PCRE_PUCHAR Xdata; + PCRE_PUCHAR Xnext; + PCRE_PUCHAR Xpp; + PCRE_PUCHAR Xprev; + PCRE_PUCHAR Xsaved_eptr; + + recursion_info Xnew_recursive; + + BOOL Xcur_is_word; + BOOL Xcondition; + BOOL Xprev_is_word; + +#ifdef SUPPORT_UCP + int Xprop_type; + unsigned int Xprop_value; + int Xprop_fail_result; + int Xoclength; + pcre_uchar Xocchars[6]; +#endif + + int Xcodelink; + int Xctype; + unsigned int Xfc; + int Xfi; + int Xlength; + int Xmax; + int Xmin; + unsigned int Xnumber; + int Xoffset; + unsigned int Xop; + pcre_int32 Xsave_capture_last; + int Xsave_offset1, Xsave_offset2, Xsave_offset3; + int Xstacksave[REC_STACK_SAVE_MAX]; + + eptrblock Xnewptrb; + + /* Where to jump back to */ + + int Xwhere; + +} heapframe; + +#endif + + +/*************************************************************************** +***************************************************************************/ + + + +/************************************************* +* Match from current position * +*************************************************/ + +/* This function is called recursively in many circumstances. Whenever it +returns a negative (error) response, the outer incarnation must also return the +same response. */ + +/* These macros pack up tests that are used for partial matching, and which +appear several times in the code. We set the "hit end" flag if the pointer is +at the end of the subject and also past the start of the subject (i.e. +something has been matched). For hard partial matching, we then return +immediately. The second one is used when we already know we are past the end of +the subject. */ + +#define CHECK_PARTIAL()\ + if (md->partial != 0 && eptr >= md->end_subject && \ + eptr > md->start_used_ptr) \ + { \ + md->hitend = TRUE; \ + if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL); \ + } + +#define SCHECK_PARTIAL()\ + if (md->partial != 0 && eptr > md->start_used_ptr) \ + { \ + md->hitend = TRUE; \ + if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL); \ + } + + +/* Performance note: It might be tempting to extract commonly used fields from +the md structure (e.g. utf, end_subject) into individual variables to improve +performance. Tests using gcc on a SPARC disproved this; in the first case, it +made performance worse. + +Arguments: + eptr pointer to current character in subject + ecode pointer to current position in compiled code + mstart pointer to the current match start position (can be modified + by encountering \K) + offset_top current top pointer + md pointer to "static" info for the match + eptrb pointer to chain of blocks containing eptr at start of + brackets - for testing for empty matches + rdepth the recursion depth + +Returns: MATCH_MATCH if matched ) these values are >= 0 + MATCH_NOMATCH if failed to match ) + a negative MATCH_xxx value for PRUNE, SKIP, etc + a negative PCRE_ERROR_xxx value if aborted by an error condition + (e.g. stopped by repeated call or recursion limit) +*/ + +static int +match(REGISTER PCRE_PUCHAR eptr, REGISTER const pcre_uchar *ecode, + PCRE_PUCHAR mstart, int offset_top, match_data *md, eptrblock *eptrb, + unsigned int rdepth) +{ +/* These variables do not need to be preserved over recursion in this function, +so they can be ordinary variables in all cases. Mark some of them with +"register" because they are used a lot in loops. */ + +register int rrc; /* Returns from recursive calls */ +register int i; /* Used for loops not involving calls to RMATCH() */ +register pcre_uint32 c; /* Character values not kept over RMATCH() calls */ +register BOOL utf; /* Local copy of UTF flag for speed */ + +BOOL minimize, possessive; /* Quantifier options */ +BOOL caseless; +int condcode; + +/* When recursion is not being used, all "local" variables that have to be +preserved over calls to RMATCH() are part of a "frame". We set up the top-level +frame on the stack here; subsequent instantiations are obtained from the heap +whenever RMATCH() does a "recursion". See the macro definitions above. Putting +the top-level on the stack rather than malloc-ing them all gives a performance +boost in many cases where there is not much "recursion". */ + +#ifdef NO_RECURSE +heapframe *frame = (heapframe *)md->match_frames_base; + +/* Copy in the original argument variables */ + +frame->Xeptr = eptr; +frame->Xecode = ecode; +frame->Xmstart = mstart; +frame->Xoffset_top = offset_top; +frame->Xeptrb = eptrb; +frame->Xrdepth = rdepth; + +/* This is where control jumps back to to effect "recursion" */ + +HEAP_RECURSE: + +/* Macros make the argument variables come from the current frame */ + +#define eptr frame->Xeptr +#define ecode frame->Xecode +#define mstart frame->Xmstart +#define offset_top frame->Xoffset_top +#define eptrb frame->Xeptrb +#define rdepth frame->Xrdepth + +/* Ditto for the local variables */ + +#ifdef SUPPORT_UTF +#define charptr frame->Xcharptr +#endif +#define callpat frame->Xcallpat +#define codelink frame->Xcodelink +#define data frame->Xdata +#define next frame->Xnext +#define pp frame->Xpp +#define prev frame->Xprev +#define saved_eptr frame->Xsaved_eptr + +#define new_recursive frame->Xnew_recursive + +#define cur_is_word frame->Xcur_is_word +#define condition frame->Xcondition +#define prev_is_word frame->Xprev_is_word + +#ifdef SUPPORT_UCP +#define prop_type frame->Xprop_type +#define prop_value frame->Xprop_value +#define prop_fail_result frame->Xprop_fail_result +#define oclength frame->Xoclength +#define occhars frame->Xocchars +#endif + +#define ctype frame->Xctype +#define fc frame->Xfc +#define fi frame->Xfi +#define length frame->Xlength +#define max frame->Xmax +#define min frame->Xmin +#define number frame->Xnumber +#define offset frame->Xoffset +#define op frame->Xop +#define save_capture_last frame->Xsave_capture_last +#define save_offset1 frame->Xsave_offset1 +#define save_offset2 frame->Xsave_offset2 +#define save_offset3 frame->Xsave_offset3 +#define stacksave frame->Xstacksave + +#define newptrb frame->Xnewptrb + +/* When recursion is being used, local variables are allocated on the stack and +get preserved during recursion in the normal way. In this environment, fi and +i, and fc and c, can be the same variables. */ + +#else /* NO_RECURSE not defined */ +#define fi i +#define fc c + +/* Many of the following variables are used only in small blocks of the code. +My normal style of coding would have declared them within each of those blocks. +However, in order to accommodate the version of this code that uses an external +"stack" implemented on the heap, it is easier to declare them all here, so the +declarations can be cut out in a block. The only declarations within blocks +below are for variables that do not have to be preserved over a recursive call +to RMATCH(). */ + +#ifdef SUPPORT_UTF +const pcre_uchar *charptr; +#endif +const pcre_uchar *callpat; +const pcre_uchar *data; +const pcre_uchar *next; +PCRE_PUCHAR pp; +const pcre_uchar *prev; +PCRE_PUCHAR saved_eptr; + +recursion_info new_recursive; + +BOOL cur_is_word; +BOOL condition; +BOOL prev_is_word; + +#ifdef SUPPORT_UCP +int prop_type; +unsigned int prop_value; +int prop_fail_result; +int oclength; +pcre_uchar occhars[6]; +#endif + +int codelink; +int ctype; +int length; +int max; +int min; +unsigned int number; +int offset; +unsigned int op; +pcre_int32 save_capture_last; +int save_offset1, save_offset2, save_offset3; +int stacksave[REC_STACK_SAVE_MAX]; + +eptrblock newptrb; + +/* There is a special fudge for calling match() in a way that causes it to +measure the size of its basic stack frame when the stack is being used for +recursion. The second argument (ecode) being NULL triggers this behaviour. It +cannot normally ever be NULL. The return is the negated value of the frame +size. */ + +if (ecode == NULL) + { + if (rdepth == 0) + return match((PCRE_PUCHAR)&rdepth, NULL, NULL, 0, NULL, NULL, 1); + else + { + int len = (int)((char *)&rdepth - (char *)eptr); + return (len > 0)? -len : len; + } + } +#endif /* NO_RECURSE */ + +/* To save space on the stack and in the heap frame, I have doubled up on some +of the local variables that are used only in localised parts of the code, but +still need to be preserved over recursive calls of match(). These macros define +the alternative names that are used. */ + +#define allow_zero cur_is_word +#define cbegroup condition +#define code_offset codelink +#define condassert condition +#define matched_once prev_is_word +#define foc number +#define save_mark data + +/* These statements are here to stop the compiler complaining about unitialized +variables. */ + +#ifdef SUPPORT_UCP +prop_value = 0; +prop_fail_result = 0; +#endif + + +/* This label is used for tail recursion, which is used in a few cases even +when NO_RECURSE is not defined, in order to reduce the amount of stack that is +used. Thanks to Ian Taylor for noticing this possibility and sending the +original patch. */ + +TAIL_RECURSE: + +/* OK, now we can get on with the real code of the function. Recursive calls +are specified by the macro RMATCH and RRETURN is used to return. When +NO_RECURSE is *not* defined, these just turn into a recursive call to match() +and a "return", respectively (possibly with some debugging if PCRE_DEBUG is +defined). However, RMATCH isn't like a function call because it's quite a +complicated macro. It has to be used in one particular way. This shouldn't, +however, impact performance when true recursion is being used. */ + +#ifdef SUPPORT_UTF +utf = md->utf; /* Local copy of the flag */ +#else +utf = FALSE; +#endif + +/* First check that we haven't called match() too many times, or that we +haven't exceeded the recursive call limit. */ + +if (md->match_call_count++ >= md->match_limit) RRETURN(PCRE_ERROR_MATCHLIMIT); +if (rdepth >= md->match_limit_recursion) RRETURN(PCRE_ERROR_RECURSIONLIMIT); + +/* At the start of a group with an unlimited repeat that may match an empty +string, the variable md->match_function_type is set to MATCH_CBEGROUP. It is +done this way to save having to use another function argument, which would take +up space on the stack. See also MATCH_CONDASSERT below. + +When MATCH_CBEGROUP is set, add the current subject pointer to the chain of +such remembered pointers, to be checked when we hit the closing ket, in order +to break infinite loops that match no characters. When match() is called in +other circumstances, don't add to the chain. The MATCH_CBEGROUP feature must +NOT be used with tail recursion, because the memory block that is used is on +the stack, so a new one may be required for each match(). */ + +if (md->match_function_type == MATCH_CBEGROUP) + { + newptrb.epb_saved_eptr = eptr; + newptrb.epb_prev = eptrb; + eptrb = &newptrb; + md->match_function_type = 0; + } + +/* Now start processing the opcodes. */ + +for (;;) + { + minimize = possessive = FALSE; + op = *ecode; + + switch(op) + { + case OP_MARK: + md->nomatch_mark = ecode + 2; + md->mark = NULL; /* In case previously set by assertion */ + RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode] + ecode[1], offset_top, md, + eptrb, RM55); + if ((rrc == MATCH_MATCH || rrc == MATCH_ACCEPT) && + md->mark == NULL) md->mark = ecode + 2; + + /* A return of MATCH_SKIP_ARG means that matching failed at SKIP with an + argument, and we must check whether that argument matches this MARK's + argument. It is passed back in md->start_match_ptr (an overloading of that + variable). If it does match, we reset that variable to the current subject + position and return MATCH_SKIP. Otherwise, pass back the return code + unaltered. */ + + else if (rrc == MATCH_SKIP_ARG && + STRCMP_UC_UC_TEST(ecode + 2, md->start_match_ptr) == 0) + { + md->start_match_ptr = eptr; + RRETURN(MATCH_SKIP); + } + RRETURN(rrc); + + case OP_FAIL: + RRETURN(MATCH_NOMATCH); + + case OP_COMMIT: + RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, md, + eptrb, RM52); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + RRETURN(MATCH_COMMIT); + + case OP_PRUNE: + RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, md, + eptrb, RM51); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + RRETURN(MATCH_PRUNE); + + case OP_PRUNE_ARG: + md->nomatch_mark = ecode + 2; + md->mark = NULL; /* In case previously set by assertion */ + RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode] + ecode[1], offset_top, md, + eptrb, RM56); + if ((rrc == MATCH_MATCH || rrc == MATCH_ACCEPT) && + md->mark == NULL) md->mark = ecode + 2; + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + RRETURN(MATCH_PRUNE); + + case OP_SKIP: + RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, md, + eptrb, RM53); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + md->start_match_ptr = eptr; /* Pass back current position */ + RRETURN(MATCH_SKIP); + + /* Note that, for Perl compatibility, SKIP with an argument does NOT set + nomatch_mark. When a pattern match ends with a SKIP_ARG for which there was + not a matching mark, we have to re-run the match, ignoring the SKIP_ARG + that failed and any that precede it (either they also failed, or were not + triggered). To do this, we maintain a count of executed SKIP_ARGs. If a + SKIP_ARG gets to top level, the match is re-run with md->ignore_skip_arg + set to the count of the one that failed. */ + + case OP_SKIP_ARG: + md->skip_arg_count++; + if (md->skip_arg_count <= md->ignore_skip_arg) + { + ecode += PRIV(OP_lengths)[*ecode] + ecode[1]; + break; + } + RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode] + ecode[1], offset_top, md, + eptrb, RM57); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + + /* Pass back the current skip name by overloading md->start_match_ptr and + returning the special MATCH_SKIP_ARG return code. This will either be + caught by a matching MARK, or get to the top, where it causes a rematch + with md->ignore_skip_arg set to the value of md->skip_arg_count. */ + + md->start_match_ptr = ecode + 2; + RRETURN(MATCH_SKIP_ARG); + + /* For THEN (and THEN_ARG) we pass back the address of the opcode, so that + the branch in which it occurs can be determined. Overload the start of + match pointer to do this. */ + + case OP_THEN: + RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, md, + eptrb, RM54); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + md->start_match_ptr = ecode; + RRETURN(MATCH_THEN); + + case OP_THEN_ARG: + md->nomatch_mark = ecode + 2; + md->mark = NULL; /* In case previously set by assertion */ + RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode] + ecode[1], offset_top, + md, eptrb, RM58); + if ((rrc == MATCH_MATCH || rrc == MATCH_ACCEPT) && + md->mark == NULL) md->mark = ecode + 2; + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + md->start_match_ptr = ecode; + RRETURN(MATCH_THEN); + + /* Handle an atomic group that does not contain any capturing parentheses. + This can be handled like an assertion. Prior to 8.13, all atomic groups + were handled this way. In 8.13, the code was changed as below for ONCE, so + that backups pass through the group and thereby reset captured values. + However, this uses a lot more stack, so in 8.20, atomic groups that do not + contain any captures generate OP_ONCE_NC, which can be handled in the old, + less stack intensive way. + + Check the alternative branches in turn - the matching won't pass the KET + for this kind of subpattern. If any one branch matches, we carry on as at + the end of a normal bracket, leaving the subject pointer, but resetting + the start-of-match value in case it was changed by \K. */ + + case OP_ONCE_NC: + prev = ecode; + saved_eptr = eptr; + save_mark = md->mark; + do + { + RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, eptrb, RM64); + if (rrc == MATCH_MATCH) /* Note: _not_ MATCH_ACCEPT */ + { + mstart = md->start_match_ptr; + break; + } + if (rrc == MATCH_THEN) + { + next = ecode + GET(ecode,1); + if (md->start_match_ptr < next && + (*ecode == OP_ALT || *next == OP_ALT)) + rrc = MATCH_NOMATCH; + } + + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + ecode += GET(ecode,1); + md->mark = save_mark; + } + while (*ecode == OP_ALT); + + /* If hit the end of the group (which could be repeated), fail */ + + if (*ecode != OP_ONCE_NC && *ecode != OP_ALT) RRETURN(MATCH_NOMATCH); + + /* Continue as from after the group, updating the offsets high water + mark, since extracts may have been taken. */ + + do ecode += GET(ecode, 1); while (*ecode == OP_ALT); + + offset_top = md->end_offset_top; + eptr = md->end_match_ptr; + + /* For a non-repeating ket, just continue at this level. This also + happens for a repeating ket if no characters were matched in the group. + This is the forcible breaking of infinite loops as implemented in Perl + 5.005. */ + + if (*ecode == OP_KET || eptr == saved_eptr) + { + ecode += 1+LINK_SIZE; + break; + } + + /* The repeating kets try the rest of the pattern or restart from the + preceding bracket, in the appropriate order. The second "call" of match() + uses tail recursion, to avoid using another stack frame. */ + + if (*ecode == OP_KETRMIN) + { + RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, eptrb, RM65); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + ecode = prev; + goto TAIL_RECURSE; + } + else /* OP_KETRMAX */ + { + RMATCH(eptr, prev, offset_top, md, eptrb, RM66); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + ecode += 1 + LINK_SIZE; + goto TAIL_RECURSE; + } + /* Control never gets here */ + + /* Handle a capturing bracket, other than those that are possessive with an + unlimited repeat. If there is space in the offset vector, save the current + subject position in the working slot at the top of the vector. We mustn't + change the current values of the data slot, because they may be set from a + previous iteration of this group, and be referred to by a reference inside + the group. A failure to match might occur after the group has succeeded, + if something later on doesn't match. For this reason, we need to restore + the working value and also the values of the final offsets, in case they + were set by a previous iteration of the same bracket. + + If there isn't enough space in the offset vector, treat this as if it were + a non-capturing bracket. Don't worry about setting the flag for the error + case here; that is handled in the code for KET. */ + + case OP_CBRA: + case OP_SCBRA: + number = GET2(ecode, 1+LINK_SIZE); + offset = number << 1; + +#ifdef PCRE_DEBUG + printf("start bracket %d\n", number); + printf("subject="); + pchars(eptr, 16, TRUE, md); + printf("\n"); +#endif + + if (offset < md->offset_max) + { + save_offset1 = md->offset_vector[offset]; + save_offset2 = md->offset_vector[offset+1]; + save_offset3 = md->offset_vector[md->offset_end - number]; + save_capture_last = md->capture_last; + save_mark = md->mark; + + DPRINTF(("saving %d %d %d\n", save_offset1, save_offset2, save_offset3)); + md->offset_vector[md->offset_end - number] = + (int)(eptr - md->start_subject); + + for (;;) + { + if (op >= OP_SBRA) md->match_function_type = MATCH_CBEGROUP; + RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, md, + eptrb, RM1); + if (rrc == MATCH_ONCE) break; /* Backing up through an atomic group */ + + /* If we backed up to a THEN, check whether it is within the current + branch by comparing the address of the THEN that is passed back with + the end of the branch. If it is within the current branch, and the + branch is one of two or more alternatives (it either starts or ends + with OP_ALT), we have reached the limit of THEN's action, so convert + the return code to NOMATCH, which will cause normal backtracking to + happen from now on. Otherwise, THEN is passed back to an outer + alternative. This implements Perl's treatment of parenthesized groups, + where a group not containing | does not affect the current alternative, + that is, (X) is NOT the same as (X|(*F)). */ + + if (rrc == MATCH_THEN) + { + next = ecode + GET(ecode,1); + if (md->start_match_ptr < next && + (*ecode == OP_ALT || *next == OP_ALT)) + rrc = MATCH_NOMATCH; + } + + /* Anything other than NOMATCH is passed back. */ + + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + md->capture_last = save_capture_last; + ecode += GET(ecode, 1); + md->mark = save_mark; + if (*ecode != OP_ALT) break; + } + + DPRINTF(("bracket %d failed\n", number)); + md->offset_vector[offset] = save_offset1; + md->offset_vector[offset+1] = save_offset2; + md->offset_vector[md->offset_end - number] = save_offset3; + + /* At this point, rrc will be one of MATCH_ONCE or MATCH_NOMATCH. */ + + RRETURN(rrc); + } + + /* FALL THROUGH ... Insufficient room for saving captured contents. Treat + as a non-capturing bracket. */ + + /* VVVVVVVVVVVVVVVVVVVVVVVVV */ + /* VVVVVVVVVVVVVVVVVVVVVVVVV */ + + DPRINTF(("insufficient capture room: treat as non-capturing\n")); + + /* VVVVVVVVVVVVVVVVVVVVVVVVV */ + /* VVVVVVVVVVVVVVVVVVVVVVVVV */ + + /* Non-capturing or atomic group, except for possessive with unlimited + repeat and ONCE group with no captures. Loop for all the alternatives. + + When we get to the final alternative within the brackets, we used to return + the result of a recursive call to match() whatever happened so it was + possible to reduce stack usage by turning this into a tail recursion, + except in the case of a possibly empty group. However, now that there is + the possiblity of (*THEN) occurring in the final alternative, this + optimization is no longer always possible. + + We can optimize if we know there are no (*THEN)s in the pattern; at present + this is the best that can be done. + + MATCH_ONCE is returned when the end of an atomic group is successfully + reached, but subsequent matching fails. It passes back up the tree (causing + captured values to be reset) until the original atomic group level is + reached. This is tested by comparing md->once_target with the start of the + group. At this point, the return is converted into MATCH_NOMATCH so that + previous backup points can be taken. */ + + case OP_ONCE: + case OP_BRA: + case OP_SBRA: + DPRINTF(("start non-capturing bracket\n")); + + for (;;) + { + if (op >= OP_SBRA || op == OP_ONCE) + md->match_function_type = MATCH_CBEGROUP; + + /* If this is not a possibly empty group, and there are no (*THEN)s in + the pattern, and this is the final alternative, optimize as described + above. */ + + else if (!md->hasthen && ecode[GET(ecode, 1)] != OP_ALT) + { + ecode += PRIV(OP_lengths)[*ecode]; + goto TAIL_RECURSE; + } + + /* In all other cases, we have to make another call to match(). */ + + save_mark = md->mark; + save_capture_last = md->capture_last; + RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, md, eptrb, + RM2); + + /* See comment in the code for capturing groups above about handling + THEN. */ + + if (rrc == MATCH_THEN) + { + next = ecode + GET(ecode,1); + if (md->start_match_ptr < next && + (*ecode == OP_ALT || *next == OP_ALT)) + rrc = MATCH_NOMATCH; + } + + if (rrc != MATCH_NOMATCH) + { + if (rrc == MATCH_ONCE) + { + const pcre_uchar *scode = ecode; + if (*scode != OP_ONCE) /* If not at start, find it */ + { + while (*scode == OP_ALT) scode += GET(scode, 1); + scode -= GET(scode, 1); + } + if (md->once_target == scode) rrc = MATCH_NOMATCH; + } + RRETURN(rrc); + } + ecode += GET(ecode, 1); + md->mark = save_mark; + if (*ecode != OP_ALT) break; + md->capture_last = save_capture_last; + } + + RRETURN(MATCH_NOMATCH); + + /* Handle possessive capturing brackets with an unlimited repeat. We come + here from BRAZERO with allow_zero set TRUE. The offset_vector values are + handled similarly to the normal case above. However, the matching is + different. The end of these brackets will always be OP_KETRPOS, which + returns MATCH_KETRPOS without going further in the pattern. By this means + we can handle the group by iteration rather than recursion, thereby + reducing the amount of stack needed. */ + + case OP_CBRAPOS: + case OP_SCBRAPOS: + allow_zero = FALSE; + + POSSESSIVE_CAPTURE: + number = GET2(ecode, 1+LINK_SIZE); + offset = number << 1; + +#ifdef PCRE_DEBUG + printf("start possessive bracket %d\n", number); + printf("subject="); + pchars(eptr, 16, TRUE, md); + printf("\n"); +#endif + + if (offset >= md->offset_max) goto POSSESSIVE_NON_CAPTURE; + + matched_once = FALSE; + code_offset = (int)(ecode - md->start_code); + + save_offset1 = md->offset_vector[offset]; + save_offset2 = md->offset_vector[offset+1]; + save_offset3 = md->offset_vector[md->offset_end - number]; + save_capture_last = md->capture_last; + + DPRINTF(("saving %d %d %d\n", save_offset1, save_offset2, save_offset3)); + + /* Each time round the loop, save the current subject position for use + when the group matches. For MATCH_MATCH, the group has matched, so we + restart it with a new subject starting position, remembering that we had + at least one match. For MATCH_NOMATCH, carry on with the alternatives, as + usual. If we haven't matched any alternatives in any iteration, check to + see if a previous iteration matched. If so, the group has matched; + continue from afterwards. Otherwise it has failed; restore the previous + capture values before returning NOMATCH. */ + + for (;;) + { + md->offset_vector[md->offset_end - number] = + (int)(eptr - md->start_subject); + if (op >= OP_SBRA) md->match_function_type = MATCH_CBEGROUP; + RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, md, + eptrb, RM63); + if (rrc == MATCH_KETRPOS) + { + offset_top = md->end_offset_top; + ecode = md->start_code + code_offset; + save_capture_last = md->capture_last; + matched_once = TRUE; + mstart = md->start_match_ptr; /* In case \K changed it */ + if (eptr == md->end_match_ptr) /* Matched an empty string */ + { + do ecode += GET(ecode, 1); while (*ecode == OP_ALT); + break; + } + eptr = md->end_match_ptr; + continue; + } + + /* See comment in the code for capturing groups above about handling + THEN. */ + + if (rrc == MATCH_THEN) + { + next = ecode + GET(ecode,1); + if (md->start_match_ptr < next && + (*ecode == OP_ALT || *next == OP_ALT)) + rrc = MATCH_NOMATCH; + } + + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + md->capture_last = save_capture_last; + ecode += GET(ecode, 1); + if (*ecode != OP_ALT) break; + } + + if (!matched_once) + { + md->offset_vector[offset] = save_offset1; + md->offset_vector[offset+1] = save_offset2; + md->offset_vector[md->offset_end - number] = save_offset3; + } + + if (allow_zero || matched_once) + { + ecode += 1 + LINK_SIZE; + break; + } + + RRETURN(MATCH_NOMATCH); + + /* Non-capturing possessive bracket with unlimited repeat. We come here + from BRAZERO with allow_zero = TRUE. The code is similar to the above, + without the capturing complication. It is written out separately for speed + and cleanliness. */ + + case OP_BRAPOS: + case OP_SBRAPOS: + allow_zero = FALSE; + + POSSESSIVE_NON_CAPTURE: + matched_once = FALSE; + code_offset = (int)(ecode - md->start_code); + save_capture_last = md->capture_last; + + for (;;) + { + if (op >= OP_SBRA) md->match_function_type = MATCH_CBEGROUP; + RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, md, + eptrb, RM48); + if (rrc == MATCH_KETRPOS) + { + offset_top = md->end_offset_top; + ecode = md->start_code + code_offset; + matched_once = TRUE; + mstart = md->start_match_ptr; /* In case \K reset it */ + if (eptr == md->end_match_ptr) /* Matched an empty string */ + { + do ecode += GET(ecode, 1); while (*ecode == OP_ALT); + break; + } + eptr = md->end_match_ptr; + continue; + } + + /* See comment in the code for capturing groups above about handling + THEN. */ + + if (rrc == MATCH_THEN) + { + next = ecode + GET(ecode,1); + if (md->start_match_ptr < next && + (*ecode == OP_ALT || *next == OP_ALT)) + rrc = MATCH_NOMATCH; + } + + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + ecode += GET(ecode, 1); + if (*ecode != OP_ALT) break; + md->capture_last = save_capture_last; + } + + if (matched_once || allow_zero) + { + ecode += 1 + LINK_SIZE; + break; + } + RRETURN(MATCH_NOMATCH); + + /* Control never reaches here. */ + + /* Conditional group: compilation checked that there are no more than two + branches. If the condition is false, skipping the first branch takes us + past the end of the item if there is only one branch, but that's exactly + what we want. */ + + case OP_COND: + case OP_SCOND: + + /* The variable codelink will be added to ecode when the condition is + false, to get to the second branch. Setting it to the offset to the ALT + or KET, then incrementing ecode achieves this effect. We now have ecode + pointing to the condition or callout. */ + + codelink = GET(ecode, 1); /* Offset to the second branch */ + ecode += 1 + LINK_SIZE; /* From this opcode */ + + /* Because of the way auto-callout works during compile, a callout item is + inserted between OP_COND and an assertion condition. */ + + if (*ecode == OP_CALLOUT) + { + if (PUBL(callout) != NULL) + { + PUBL(callout_block) cb; + cb.version = 2; /* Version 1 of the callout block */ + cb.callout_number = ecode[1]; + cb.offset_vector = md->offset_vector; +#if defined COMPILE_PCRE8 + cb.subject = (PCRE_SPTR)md->start_subject; +#elif defined COMPILE_PCRE16 + cb.subject = (PCRE_SPTR16)md->start_subject; +#elif defined COMPILE_PCRE32 + cb.subject = (PCRE_SPTR32)md->start_subject; +#endif + cb.subject_length = (int)(md->end_subject - md->start_subject); + cb.start_match = (int)(mstart - md->start_subject); + cb.current_position = (int)(eptr - md->start_subject); + cb.pattern_position = GET(ecode, 2); + cb.next_item_length = GET(ecode, 2 + LINK_SIZE); + cb.capture_top = offset_top/2; + cb.capture_last = md->capture_last & CAPLMASK; + /* Internal change requires this for API compatibility. */ + if (cb.capture_last == 0) cb.capture_last = -1; + cb.callout_data = md->callout_data; + cb.mark = md->nomatch_mark; + if ((rrc = (*PUBL(callout))(&cb)) > 0) RRETURN(MATCH_NOMATCH); + if (rrc < 0) RRETURN(rrc); + } + + /* Advance ecode past the callout, so it now points to the condition. We + must adjust codelink so that the value of ecode+codelink is unchanged. */ + + ecode += PRIV(OP_lengths)[OP_CALLOUT]; + codelink -= PRIV(OP_lengths)[OP_CALLOUT]; + } + + /* Test the various possible conditions */ + + condition = FALSE; + switch(condcode = *ecode) + { + case OP_RREF: /* Numbered group recursion test */ + if (md->recursive != NULL) /* Not recursing => FALSE */ + { + unsigned int recno = GET2(ecode, 1); /* Recursion group number*/ + condition = (recno == RREF_ANY || recno == md->recursive->group_num); + } + break; + + case OP_DNRREF: /* Duplicate named group recursion test */ + if (md->recursive != NULL) + { + int count = GET2(ecode, 1 + IMM2_SIZE); + pcre_uchar *slot = md->name_table + GET2(ecode, 1) * md->name_entry_size; + while (count-- > 0) + { + unsigned int recno = GET2(slot, 0); + condition = recno == md->recursive->group_num; + if (condition) break; + slot += md->name_entry_size; + } + } + break; + + case OP_CREF: /* Numbered group used test */ + offset = GET2(ecode, 1) << 1; /* Doubled ref number */ + condition = offset < offset_top && md->offset_vector[offset] >= 0; + break; + + case OP_DNCREF: /* Duplicate named group used test */ + { + int count = GET2(ecode, 1 + IMM2_SIZE); + pcre_uchar *slot = md->name_table + GET2(ecode, 1) * md->name_entry_size; + while (count-- > 0) + { + offset = GET2(slot, 0) << 1; + condition = offset < offset_top && md->offset_vector[offset] >= 0; + if (condition) break; + slot += md->name_entry_size; + } + } + break; + + case OP_DEF: /* DEFINE - always false */ + case OP_FAIL: /* From optimized (?!) condition */ + break; + + /* The condition is an assertion. Call match() to evaluate it - setting + md->match_function_type to MATCH_CONDASSERT causes it to stop at the end + of an assertion. */ + + default: + md->match_function_type = MATCH_CONDASSERT; + RMATCH(eptr, ecode, offset_top, md, NULL, RM3); + if (rrc == MATCH_MATCH) + { + if (md->end_offset_top > offset_top) + offset_top = md->end_offset_top; /* Captures may have happened */ + condition = TRUE; + + /* Advance ecode past the assertion to the start of the first branch, + but adjust it so that the general choosing code below works. If the + assertion has a quantifier that allows zero repeats we must skip over + the BRAZERO. This is a lunatic thing to do, but somebody did! */ + + if (*ecode == OP_BRAZERO) ecode++; + ecode += GET(ecode, 1); + while (*ecode == OP_ALT) ecode += GET(ecode, 1); + ecode += 1 + LINK_SIZE - PRIV(OP_lengths)[condcode]; + } + + /* PCRE doesn't allow the effect of (*THEN) to escape beyond an + assertion; it is therefore treated as NOMATCH. Any other return is an + error. */ + + else if (rrc != MATCH_NOMATCH && rrc != MATCH_THEN) + { + RRETURN(rrc); /* Need braces because of following else */ + } + break; + } + + /* Choose branch according to the condition */ + + ecode += condition? PRIV(OP_lengths)[condcode] : codelink; + + /* We are now at the branch that is to be obeyed. As there is only one, we + can use tail recursion to avoid using another stack frame, except when + there is unlimited repeat of a possibly empty group. In the latter case, a + recursive call to match() is always required, unless the second alternative + doesn't exist, in which case we can just plough on. Note that, for + compatibility with Perl, the | in a conditional group is NOT treated as + creating two alternatives. If a THEN is encountered in the branch, it + propagates out to the enclosing alternative (unless nested in a deeper set + of alternatives, of course). */ + + if (condition || ecode[-(1+LINK_SIZE)] == OP_ALT) + { + if (op != OP_SCOND) + { + goto TAIL_RECURSE; + } + + md->match_function_type = MATCH_CBEGROUP; + RMATCH(eptr, ecode, offset_top, md, eptrb, RM49); + RRETURN(rrc); + } + + /* Condition false & no alternative; continue after the group. */ + + else + { + } + break; + + + /* Before OP_ACCEPT there may be any number of OP_CLOSE opcodes, + to close any currently open capturing brackets. */ + + case OP_CLOSE: + number = GET2(ecode, 1); /* Must be less than 65536 */ + offset = number << 1; + +#ifdef PCRE_DEBUG + printf("end bracket %d at *ACCEPT", number); + printf("\n"); +#endif + + md->capture_last = (md->capture_last & OVFLMASK) | number; + if (offset >= md->offset_max) md->capture_last |= OVFLBIT; else + { + md->offset_vector[offset] = + md->offset_vector[md->offset_end - number]; + md->offset_vector[offset+1] = (int)(eptr - md->start_subject); + + /* If this group is at or above the current highwater mark, ensure that + any groups between the current high water mark and this group are marked + unset and then update the high water mark. */ + + if (offset >= offset_top) + { + register int *iptr = md->offset_vector + offset_top; + register int *iend = md->offset_vector + offset; + while (iptr < iend) *iptr++ = -1; + offset_top = offset + 2; + } + } + ecode += 1 + IMM2_SIZE; + break; + + + /* End of the pattern, either real or forced. */ + + case OP_END: + case OP_ACCEPT: + case OP_ASSERT_ACCEPT: + + /* If we have matched an empty string, fail if not in an assertion and not + in a recursion if either PCRE_NOTEMPTY is set, or if PCRE_NOTEMPTY_ATSTART + is set and we have matched at the start of the subject. In both cases, + backtracking will then try other alternatives, if any. */ + + if (eptr == mstart && op != OP_ASSERT_ACCEPT && + md->recursive == NULL && + (md->notempty || + (md->notempty_atstart && + mstart == md->start_subject + md->start_offset))) + RRETURN(MATCH_NOMATCH); + + /* Otherwise, we have a match. */ + + md->end_match_ptr = eptr; /* Record where we ended */ + md->end_offset_top = offset_top; /* and how many extracts were taken */ + md->start_match_ptr = mstart; /* and the start (\K can modify) */ + + /* For some reason, the macros don't work properly if an expression is + given as the argument to RRETURN when the heap is in use. */ + + rrc = (op == OP_END)? MATCH_MATCH : MATCH_ACCEPT; + RRETURN(rrc); + + /* Assertion brackets. Check the alternative branches in turn - the + matching won't pass the KET for an assertion. If any one branch matches, + the assertion is true. Lookbehind assertions have an OP_REVERSE item at the + start of each branch to move the current point backwards, so the code at + this level is identical to the lookahead case. When the assertion is part + of a condition, we want to return immediately afterwards. The caller of + this incarnation of the match() function will have set MATCH_CONDASSERT in + md->match_function type, and one of these opcodes will be the first opcode + that is processed. We use a local variable that is preserved over calls to + match() to remember this case. */ + + case OP_ASSERT: + case OP_ASSERTBACK: + save_mark = md->mark; + if (md->match_function_type == MATCH_CONDASSERT) + { + condassert = TRUE; + md->match_function_type = 0; + } + else condassert = FALSE; + + /* Loop for each branch */ + + do + { + RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, NULL, RM4); + + /* A match means that the assertion is true; break out of the loop + that matches its alternatives. */ + + if (rrc == MATCH_MATCH || rrc == MATCH_ACCEPT) + { + mstart = md->start_match_ptr; /* In case \K reset it */ + break; + } + + /* If not matched, restore the previous mark setting. */ + + md->mark = save_mark; + + /* See comment in the code for capturing groups above about handling + THEN. */ + + if (rrc == MATCH_THEN) + { + next = ecode + GET(ecode,1); + if (md->start_match_ptr < next && + (*ecode == OP_ALT || *next == OP_ALT)) + rrc = MATCH_NOMATCH; + } + + /* Anything other than NOMATCH causes the entire assertion to fail, + passing back the return code. This includes COMMIT, SKIP, PRUNE and an + uncaptured THEN, which means they take their normal effect. This + consistent approach does not always have exactly the same effect as in + Perl. */ + + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + ecode += GET(ecode, 1); + } + while (*ecode == OP_ALT); /* Continue for next alternative */ + + /* If we have tried all the alternative branches, the assertion has + failed. If not, we broke out after a match. */ + + if (*ecode == OP_KET) RRETURN(MATCH_NOMATCH); + + /* If checking an assertion for a condition, return MATCH_MATCH. */ + + if (condassert) RRETURN(MATCH_MATCH); + + /* Continue from after a successful assertion, updating the offsets high + water mark, since extracts may have been taken during the assertion. */ + + do ecode += GET(ecode,1); while (*ecode == OP_ALT); + ecode += 1 + LINK_SIZE; + offset_top = md->end_offset_top; + continue; + + /* Negative assertion: all branches must fail to match for the assertion to + succeed. */ + + case OP_ASSERT_NOT: + case OP_ASSERTBACK_NOT: + save_mark = md->mark; + if (md->match_function_type == MATCH_CONDASSERT) + { + condassert = TRUE; + md->match_function_type = 0; + } + else condassert = FALSE; + + /* Loop for each alternative branch. */ + + do + { + RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, NULL, RM5); + md->mark = save_mark; /* Always restore the mark setting */ + + switch(rrc) + { + case MATCH_MATCH: /* A successful match means */ + case MATCH_ACCEPT: /* the assertion has failed. */ + RRETURN(MATCH_NOMATCH); + + case MATCH_NOMATCH: /* Carry on with next branch */ + break; + + /* See comment in the code for capturing groups above about handling + THEN. */ + + case MATCH_THEN: + next = ecode + GET(ecode,1); + if (md->start_match_ptr < next && + (*ecode == OP_ALT || *next == OP_ALT)) + { + rrc = MATCH_NOMATCH; + break; + } + /* Otherwise fall through. */ + + /* COMMIT, SKIP, PRUNE, and an uncaptured THEN cause the whole + assertion to fail to match, without considering any more alternatives. + Failing to match means the assertion is true. This is a consistent + approach, but does not always have the same effect as in Perl. */ + + case MATCH_COMMIT: + case MATCH_SKIP: + case MATCH_SKIP_ARG: + case MATCH_PRUNE: + do ecode += GET(ecode,1); while (*ecode == OP_ALT); + goto NEG_ASSERT_TRUE; /* Break out of alternation loop */ + + /* Anything else is an error */ + + default: + RRETURN(rrc); + } + + /* Continue with next branch */ + + ecode += GET(ecode,1); + } + while (*ecode == OP_ALT); + + /* All branches in the assertion failed to match. */ + + NEG_ASSERT_TRUE: + if (condassert) RRETURN(MATCH_MATCH); /* Condition assertion */ + ecode += 1 + LINK_SIZE; /* Continue with current branch */ + continue; + + /* Move the subject pointer back. This occurs only at the start of + each branch of a lookbehind assertion. If we are too close to the start to + move back, this match function fails. When working with UTF-8 we move + back a number of characters, not bytes. */ + + case OP_REVERSE: +#ifdef SUPPORT_UTF + if (utf) + { + i = GET(ecode, 1); + while (i-- > 0) + { + eptr--; + if (eptr < md->start_subject) RRETURN(MATCH_NOMATCH); + BACKCHAR(eptr); + } + } + else +#endif + + /* No UTF-8 support, or not in UTF-8 mode: count is byte count */ + + { + eptr -= GET(ecode, 1); + if (eptr < md->start_subject) RRETURN(MATCH_NOMATCH); + } + + /* Save the earliest consulted character, then skip to next op code */ + + if (eptr < md->start_used_ptr) md->start_used_ptr = eptr; + ecode += 1 + LINK_SIZE; + break; + + /* The callout item calls an external function, if one is provided, passing + details of the match so far. This is mainly for debugging, though the + function is able to force a failure. */ + + case OP_CALLOUT: + if (PUBL(callout) != NULL) + { + PUBL(callout_block) cb; + cb.version = 2; /* Version 1 of the callout block */ + cb.callout_number = ecode[1]; + cb.offset_vector = md->offset_vector; +#if defined COMPILE_PCRE8 + cb.subject = (PCRE_SPTR)md->start_subject; +#elif defined COMPILE_PCRE16 + cb.subject = (PCRE_SPTR16)md->start_subject; +#elif defined COMPILE_PCRE32 + cb.subject = (PCRE_SPTR32)md->start_subject; +#endif + cb.subject_length = (int)(md->end_subject - md->start_subject); + cb.start_match = (int)(mstart - md->start_subject); + cb.current_position = (int)(eptr - md->start_subject); + cb.pattern_position = GET(ecode, 2); + cb.next_item_length = GET(ecode, 2 + LINK_SIZE); + cb.capture_top = offset_top/2; + cb.capture_last = md->capture_last & CAPLMASK; + /* Internal change requires this for API compatibility. */ + if (cb.capture_last == 0) cb.capture_last = -1; + cb.callout_data = md->callout_data; + cb.mark = md->nomatch_mark; + if ((rrc = (*PUBL(callout))(&cb)) > 0) RRETURN(MATCH_NOMATCH); + if (rrc < 0) RRETURN(rrc); + } + ecode += 2 + 2*LINK_SIZE; + break; + + /* Recursion either matches the current regex, or some subexpression. The + offset data is the offset to the starting bracket from the start of the + whole pattern. (This is so that it works from duplicated subpatterns.) + + The state of the capturing groups is preserved over recursion, and + re-instated afterwards. We don't know how many are started and not yet + finished (offset_top records the completed total) so we just have to save + all the potential data. There may be up to 65535 such values, which is too + large to put on the stack, but using malloc for small numbers seems + expensive. As a compromise, the stack is used when there are no more than + REC_STACK_SAVE_MAX values to store; otherwise malloc is used. + + There are also other values that have to be saved. We use a chained + sequence of blocks that actually live on the stack. Thanks to Robin Houston + for the original version of this logic. It has, however, been hacked around + a lot, so he is not to blame for the current way it works. */ + + case OP_RECURSE: + { + recursion_info *ri; + unsigned int recno; + + callpat = md->start_code + GET(ecode, 1); + recno = (callpat == md->start_code)? 0 : + GET2(callpat, 1 + LINK_SIZE); + + /* Check for repeating a recursion without advancing the subject pointer. + This should catch convoluted mutual recursions. (Some simple cases are + caught at compile time.) */ + + for (ri = md->recursive; ri != NULL; ri = ri->prevrec) + if (recno == ri->group_num && eptr == ri->subject_position) + RRETURN(PCRE_ERROR_RECURSELOOP); + + /* Add to "recursing stack" */ + + new_recursive.group_num = recno; + new_recursive.saved_capture_last = md->capture_last; + new_recursive.subject_position = eptr; + new_recursive.prevrec = md->recursive; + md->recursive = &new_recursive; + + /* Where to continue from afterwards */ + + ecode += 1 + LINK_SIZE; + + /* Now save the offset data */ + + new_recursive.saved_max = md->offset_end; + if (new_recursive.saved_max <= REC_STACK_SAVE_MAX) + new_recursive.offset_save = stacksave; + else + { + new_recursive.offset_save = + (int *)(PUBL(malloc))(new_recursive.saved_max * sizeof(int)); + if (new_recursive.offset_save == NULL) RRETURN(PCRE_ERROR_NOMEMORY); + } + memcpy(new_recursive.offset_save, md->offset_vector, + new_recursive.saved_max * sizeof(int)); + + /* OK, now we can do the recursion. After processing each alternative, + restore the offset data and the last captured value. If there were nested + recursions, md->recursive might be changed, so reset it before looping. + */ + + DPRINTF(("Recursing into group %d\n", new_recursive.group_num)); + cbegroup = (*callpat >= OP_SBRA); + do + { + if (cbegroup) md->match_function_type = MATCH_CBEGROUP; + RMATCH(eptr, callpat + PRIV(OP_lengths)[*callpat], offset_top, + md, eptrb, RM6); + memcpy(md->offset_vector, new_recursive.offset_save, + new_recursive.saved_max * sizeof(int)); + md->capture_last = new_recursive.saved_capture_last; + md->recursive = new_recursive.prevrec; + if (rrc == MATCH_MATCH || rrc == MATCH_ACCEPT) + { + DPRINTF(("Recursion matched\n")); + if (new_recursive.offset_save != stacksave) + (PUBL(free))(new_recursive.offset_save); + + /* Set where we got to in the subject, and reset the start in case + it was changed by \K. This *is* propagated back out of a recursion, + for Perl compatibility. */ + + eptr = md->end_match_ptr; + mstart = md->start_match_ptr; + goto RECURSION_MATCHED; /* Exit loop; end processing */ + } + + /* PCRE does not allow THEN, SKIP, PRUNE or COMMIT to escape beyond a + recursion; they cause a NOMATCH for the entire recursion. These codes + are defined in a range that can be tested for. */ + + if (rrc >= MATCH_BACKTRACK_MIN && rrc <= MATCH_BACKTRACK_MAX) + { + if (new_recursive.offset_save != stacksave) + (PUBL(free))(new_recursive.offset_save); + RRETURN(MATCH_NOMATCH); + } + + /* Any return code other than NOMATCH is an error. */ + + if (rrc != MATCH_NOMATCH) + { + DPRINTF(("Recursion gave error %d\n", rrc)); + if (new_recursive.offset_save != stacksave) + (PUBL(free))(new_recursive.offset_save); + RRETURN(rrc); + } + + md->recursive = &new_recursive; + callpat += GET(callpat, 1); + } + while (*callpat == OP_ALT); + + DPRINTF(("Recursion didn't match\n")); + md->recursive = new_recursive.prevrec; + if (new_recursive.offset_save != stacksave) + (PUBL(free))(new_recursive.offset_save); + RRETURN(MATCH_NOMATCH); + } + + RECURSION_MATCHED: + break; + + /* An alternation is the end of a branch; scan along to find the end of the + bracketed group and go to there. */ + + case OP_ALT: + do ecode += GET(ecode,1); while (*ecode == OP_ALT); + break; + + /* BRAZERO, BRAMINZERO and SKIPZERO occur just before a bracket group, + indicating that it may occur zero times. It may repeat infinitely, or not + at all - i.e. it could be ()* or ()? or even (){0} in the pattern. Brackets + with fixed upper repeat limits are compiled as a number of copies, with the + optional ones preceded by BRAZERO or BRAMINZERO. */ + + case OP_BRAZERO: + next = ecode + 1; + RMATCH(eptr, next, offset_top, md, eptrb, RM10); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + do next += GET(next, 1); while (*next == OP_ALT); + ecode = next + 1 + LINK_SIZE; + break; + + case OP_BRAMINZERO: + next = ecode + 1; + do next += GET(next, 1); while (*next == OP_ALT); + RMATCH(eptr, next + 1+LINK_SIZE, offset_top, md, eptrb, RM11); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + ecode++; + break; + + case OP_SKIPZERO: + next = ecode+1; + do next += GET(next,1); while (*next == OP_ALT); + ecode = next + 1 + LINK_SIZE; + break; + + /* BRAPOSZERO occurs before a possessive bracket group. Don't do anything + here; just jump to the group, with allow_zero set TRUE. */ + + case OP_BRAPOSZERO: + op = *(++ecode); + allow_zero = TRUE; + if (op == OP_CBRAPOS || op == OP_SCBRAPOS) goto POSSESSIVE_CAPTURE; + goto POSSESSIVE_NON_CAPTURE; + + /* End of a group, repeated or non-repeating. */ + + case OP_KET: + case OP_KETRMIN: + case OP_KETRMAX: + case OP_KETRPOS: + prev = ecode - GET(ecode, 1); + + /* If this was a group that remembered the subject start, in order to break + infinite repeats of empty string matches, retrieve the subject start from + the chain. Otherwise, set it NULL. */ + + if (*prev >= OP_SBRA || *prev == OP_ONCE) + { + saved_eptr = eptrb->epb_saved_eptr; /* Value at start of group */ + eptrb = eptrb->epb_prev; /* Backup to previous group */ + } + else saved_eptr = NULL; + + /* If we are at the end of an assertion group or a non-capturing atomic + group, stop matching and return MATCH_MATCH, but record the current high + water mark for use by positive assertions. We also need to record the match + start in case it was changed by \K. */ + + if ((*prev >= OP_ASSERT && *prev <= OP_ASSERTBACK_NOT) || + *prev == OP_ONCE_NC) + { + md->end_match_ptr = eptr; /* For ONCE_NC */ + md->end_offset_top = offset_top; + md->start_match_ptr = mstart; + RRETURN(MATCH_MATCH); /* Sets md->mark */ + } + + /* For capturing groups we have to check the group number back at the start + and if necessary complete handling an extraction by setting the offsets and + bumping the high water mark. Whole-pattern recursion is coded as a recurse + into group 0, so it won't be picked up here. Instead, we catch it when the + OP_END is reached. Other recursion is handled here. We just have to record + the current subject position and start match pointer and give a MATCH + return. */ + + if (*prev == OP_CBRA || *prev == OP_SCBRA || + *prev == OP_CBRAPOS || *prev == OP_SCBRAPOS) + { + number = GET2(prev, 1+LINK_SIZE); + offset = number << 1; + +#ifdef PCRE_DEBUG + printf("end bracket %d", number); + printf("\n"); +#endif + + /* Handle a recursively called group. */ + + if (md->recursive != NULL && md->recursive->group_num == number) + { + md->end_match_ptr = eptr; + md->start_match_ptr = mstart; + RRETURN(MATCH_MATCH); + } + + /* Deal with capturing */ + + md->capture_last = (md->capture_last & OVFLMASK) | number; + if (offset >= md->offset_max) md->capture_last |= OVFLBIT; else + { + /* If offset is greater than offset_top, it means that we are + "skipping" a capturing group, and that group's offsets must be marked + unset. In earlier versions of PCRE, all the offsets were unset at the + start of matching, but this doesn't work because atomic groups and + assertions can cause a value to be set that should later be unset. + Example: matching /(?>(a))b|(a)c/ against "ac". This sets group 1 as + part of the atomic group, but this is not on the final matching path, + so must be unset when 2 is set. (If there is no group 2, there is no + problem, because offset_top will then be 2, indicating no capture.) */ + + if (offset > offset_top) + { + register int *iptr = md->offset_vector + offset_top; + register int *iend = md->offset_vector + offset; + while (iptr < iend) *iptr++ = -1; + } + + /* Now make the extraction */ + + md->offset_vector[offset] = + md->offset_vector[md->offset_end - number]; + md->offset_vector[offset+1] = (int)(eptr - md->start_subject); + if (offset_top <= offset) offset_top = offset + 2; + } + } + + /* OP_KETRPOS is a possessive repeating ket. Remember the current position, + and return the MATCH_KETRPOS. This makes it possible to do the repeats one + at a time from the outer level, thus saving stack. This must precede the + empty string test - in this case that test is done at the outer level. */ + + if (*ecode == OP_KETRPOS) + { + md->start_match_ptr = mstart; /* In case \K reset it */ + md->end_match_ptr = eptr; + md->end_offset_top = offset_top; + RRETURN(MATCH_KETRPOS); + } + + /* For an ordinary non-repeating ket, just continue at this level. This + also happens for a repeating ket if no characters were matched in the + group. This is the forcible breaking of infinite loops as implemented in + Perl 5.005. For a non-repeating atomic group that includes captures, + establish a backup point by processing the rest of the pattern at a lower + level. If this results in a NOMATCH return, pass MATCH_ONCE back to the + original OP_ONCE level, thereby bypassing intermediate backup points, but + resetting any captures that happened along the way. */ + + if (*ecode == OP_KET || eptr == saved_eptr) + { + if (*prev == OP_ONCE) + { + RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, eptrb, RM12); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + md->once_target = prev; /* Level at which to change to MATCH_NOMATCH */ + RRETURN(MATCH_ONCE); + } + ecode += 1 + LINK_SIZE; /* Carry on at this level */ + break; + } + + /* The normal repeating kets try the rest of the pattern or restart from + the preceding bracket, in the appropriate order. In the second case, we can + use tail recursion to avoid using another stack frame, unless we have an + an atomic group or an unlimited repeat of a group that can match an empty + string. */ + + if (*ecode == OP_KETRMIN) + { + RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, eptrb, RM7); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (*prev == OP_ONCE) + { + RMATCH(eptr, prev, offset_top, md, eptrb, RM8); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + md->once_target = prev; /* Level at which to change to MATCH_NOMATCH */ + RRETURN(MATCH_ONCE); + } + if (*prev >= OP_SBRA) /* Could match an empty string */ + { + RMATCH(eptr, prev, offset_top, md, eptrb, RM50); + RRETURN(rrc); + } + ecode = prev; + goto TAIL_RECURSE; + } + else /* OP_KETRMAX */ + { + RMATCH(eptr, prev, offset_top, md, eptrb, RM13); + if (rrc == MATCH_ONCE && md->once_target == prev) rrc = MATCH_NOMATCH; + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (*prev == OP_ONCE) + { + RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, eptrb, RM9); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + md->once_target = prev; + RRETURN(MATCH_ONCE); + } + ecode += 1 + LINK_SIZE; + goto TAIL_RECURSE; + } + /* Control never gets here */ + + /* Not multiline mode: start of subject assertion, unless notbol. */ + + case OP_CIRC: + if (md->notbol && eptr == md->start_subject) RRETURN(MATCH_NOMATCH); + + /* Start of subject assertion */ + + case OP_SOD: + if (eptr != md->start_subject) RRETURN(MATCH_NOMATCH); + ecode++; + break; + + /* Multiline mode: start of subject unless notbol, or after any newline. */ + + case OP_CIRCM: + if (md->notbol && eptr == md->start_subject) RRETURN(MATCH_NOMATCH); + if (eptr != md->start_subject && + (eptr == md->end_subject || !WAS_NEWLINE(eptr))) + RRETURN(MATCH_NOMATCH); + ecode++; + break; + + /* Start of match assertion */ + + case OP_SOM: + if (eptr != md->start_subject + md->start_offset) RRETURN(MATCH_NOMATCH); + ecode++; + break; + + /* Reset the start of match point */ + + case OP_SET_SOM: + mstart = eptr; + ecode++; + break; + + /* Multiline mode: assert before any newline, or before end of subject + unless noteol is set. */ + + case OP_DOLLM: + if (eptr < md->end_subject) + { + if (!IS_NEWLINE(eptr)) + { + if (md->partial != 0 && + eptr + 1 >= md->end_subject && + NLBLOCK->nltype == NLTYPE_FIXED && + NLBLOCK->nllen == 2 && + UCHAR21TEST(eptr) == NLBLOCK->nl[0]) + { + md->hitend = TRUE; + if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL); + } + RRETURN(MATCH_NOMATCH); + } + } + else + { + if (md->noteol) RRETURN(MATCH_NOMATCH); + SCHECK_PARTIAL(); + } + ecode++; + break; + + /* Not multiline mode: assert before a terminating newline or before end of + subject unless noteol is set. */ + + case OP_DOLL: + if (md->noteol) RRETURN(MATCH_NOMATCH); + if (!md->endonly) goto ASSERT_NL_OR_EOS; + + /* ... else fall through for endonly */ + + /* End of subject assertion (\z) */ + + case OP_EOD: + if (eptr < md->end_subject) RRETURN(MATCH_NOMATCH); + SCHECK_PARTIAL(); + ecode++; + break; + + /* End of subject or ending \n assertion (\Z) */ + + case OP_EODN: + ASSERT_NL_OR_EOS: + if (eptr < md->end_subject && + (!IS_NEWLINE(eptr) || eptr != md->end_subject - md->nllen)) + { + if (md->partial != 0 && + eptr + 1 >= md->end_subject && + NLBLOCK->nltype == NLTYPE_FIXED && + NLBLOCK->nllen == 2 && + UCHAR21TEST(eptr) == NLBLOCK->nl[0]) + { + md->hitend = TRUE; + if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL); + } + RRETURN(MATCH_NOMATCH); + } + + /* Either at end of string or \n before end. */ + + SCHECK_PARTIAL(); + ecode++; + break; + + /* Word boundary assertions */ + + case OP_NOT_WORD_BOUNDARY: + case OP_WORD_BOUNDARY: + { + + /* Find out if the previous and current characters are "word" characters. + It takes a bit more work in UTF-8 mode. Characters > 255 are assumed to + be "non-word" characters. Remember the earliest consulted character for + partial matching. */ + +#ifdef SUPPORT_UTF + if (utf) + { + /* Get status of previous character */ + + if (eptr == md->start_subject) prev_is_word = FALSE; else + { + PCRE_PUCHAR lastptr = eptr - 1; + BACKCHAR(lastptr); + if (lastptr < md->start_used_ptr) md->start_used_ptr = lastptr; + GETCHAR(c, lastptr); +#ifdef SUPPORT_UCP + if (md->use_ucp) + { + if (c == '_') prev_is_word = TRUE; else + { + int cat = UCD_CATEGORY(c); + prev_is_word = (cat == ucp_L || cat == ucp_N); + } + } + else +#endif + prev_is_word = c < 256 && (md->ctypes[c] & ctype_word) != 0; + } + + /* Get status of next character */ + + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + cur_is_word = FALSE; + } + else + { + GETCHAR(c, eptr); +#ifdef SUPPORT_UCP + if (md->use_ucp) + { + if (c == '_') cur_is_word = TRUE; else + { + int cat = UCD_CATEGORY(c); + cur_is_word = (cat == ucp_L || cat == ucp_N); + } + } + else +#endif + cur_is_word = c < 256 && (md->ctypes[c] & ctype_word) != 0; + } + } + else +#endif + + /* Not in UTF-8 mode, but we may still have PCRE_UCP set, and for + consistency with the behaviour of \w we do use it in this case. */ + + { + /* Get status of previous character */ + + if (eptr == md->start_subject) prev_is_word = FALSE; else + { + if (eptr <= md->start_used_ptr) md->start_used_ptr = eptr - 1; +#ifdef SUPPORT_UCP + if (md->use_ucp) + { + c = eptr[-1]; + if (c == '_') prev_is_word = TRUE; else + { + int cat = UCD_CATEGORY(c); + prev_is_word = (cat == ucp_L || cat == ucp_N); + } + } + else +#endif + prev_is_word = MAX_255(eptr[-1]) + && ((md->ctypes[eptr[-1]] & ctype_word) != 0); + } + + /* Get status of next character */ + + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + cur_is_word = FALSE; + } + else +#ifdef SUPPORT_UCP + if (md->use_ucp) + { + c = *eptr; + if (c == '_') cur_is_word = TRUE; else + { + int cat = UCD_CATEGORY(c); + cur_is_word = (cat == ucp_L || cat == ucp_N); + } + } + else +#endif + cur_is_word = MAX_255(*eptr) + && ((md->ctypes[*eptr] & ctype_word) != 0); + } + + /* Now see if the situation is what we want */ + + if ((*ecode++ == OP_WORD_BOUNDARY)? + cur_is_word == prev_is_word : cur_is_word != prev_is_word) + RRETURN(MATCH_NOMATCH); + } + break; + + /* Match any single character type except newline; have to take care with + CRLF newlines and partial matching. */ + + case OP_ANY: + if (IS_NEWLINE(eptr)) RRETURN(MATCH_NOMATCH); + if (md->partial != 0 && + eptr == md->end_subject - 1 && + NLBLOCK->nltype == NLTYPE_FIXED && + NLBLOCK->nllen == 2 && + UCHAR21TEST(eptr) == NLBLOCK->nl[0]) + { + md->hitend = TRUE; + if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL); + } + + /* Fall through */ + + /* Match any single character whatsoever. */ + + case OP_ALLANY: + if (eptr >= md->end_subject) /* DO NOT merge the eptr++ here; it must */ + { /* not be updated before SCHECK_PARTIAL. */ + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + eptr++; +#ifdef SUPPORT_UTF + if (utf) ACROSSCHAR(eptr < md->end_subject, *eptr, eptr++); +#endif + ecode++; + break; + + /* Match a single byte, even in UTF-8 mode. This opcode really does match + any byte, even newline, independent of the setting of PCRE_DOTALL. */ + + case OP_ANYBYTE: + if (eptr >= md->end_subject) /* DO NOT merge the eptr++ here; it must */ + { /* not be updated before SCHECK_PARTIAL. */ + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + eptr++; + ecode++; + break; + + case OP_NOT_DIGIT: + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + if ( +#if defined SUPPORT_UTF || !(defined COMPILE_PCRE8) + c < 256 && +#endif + (md->ctypes[c] & ctype_digit) != 0 + ) + RRETURN(MATCH_NOMATCH); + ecode++; + break; + + case OP_DIGIT: + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + if ( +#if defined SUPPORT_UTF || !(defined COMPILE_PCRE8) + c > 255 || +#endif + (md->ctypes[c] & ctype_digit) == 0 + ) + RRETURN(MATCH_NOMATCH); + ecode++; + break; + + case OP_NOT_WHITESPACE: + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + if ( +#if defined SUPPORT_UTF || !(defined COMPILE_PCRE8) + c < 256 && +#endif + (md->ctypes[c] & ctype_space) != 0 + ) + RRETURN(MATCH_NOMATCH); + ecode++; + break; + + case OP_WHITESPACE: + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + if ( +#if defined SUPPORT_UTF || !(defined COMPILE_PCRE8) + c > 255 || +#endif + (md->ctypes[c] & ctype_space) == 0 + ) + RRETURN(MATCH_NOMATCH); + ecode++; + break; + + case OP_NOT_WORDCHAR: + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + if ( +#if defined SUPPORT_UTF || !(defined COMPILE_PCRE8) + c < 256 && +#endif + (md->ctypes[c] & ctype_word) != 0 + ) + RRETURN(MATCH_NOMATCH); + ecode++; + break; + + case OP_WORDCHAR: + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + if ( +#if defined SUPPORT_UTF || !(defined COMPILE_PCRE8) + c > 255 || +#endif + (md->ctypes[c] & ctype_word) == 0 + ) + RRETURN(MATCH_NOMATCH); + ecode++; + break; + + case OP_ANYNL: + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + switch(c) + { + default: RRETURN(MATCH_NOMATCH); + + case CHAR_CR: + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + } + else if (UCHAR21TEST(eptr) == CHAR_LF) eptr++; + break; + + case CHAR_LF: + break; + + case CHAR_VT: + case CHAR_FF: + case CHAR_NEL: +#ifndef EBCDIC + case 0x2028: + case 0x2029: +#endif /* Not EBCDIC */ + if (md->bsr_anycrlf) RRETURN(MATCH_NOMATCH); + break; + } + ecode++; + break; + + case OP_NOT_HSPACE: + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + switch(c) + { + HSPACE_CASES: RRETURN(MATCH_NOMATCH); /* Byte and multibyte cases */ + default: break; + } + ecode++; + break; + + case OP_HSPACE: + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + switch(c) + { + HSPACE_CASES: break; /* Byte and multibyte cases */ + default: RRETURN(MATCH_NOMATCH); + } + ecode++; + break; + + case OP_NOT_VSPACE: + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + switch(c) + { + VSPACE_CASES: RRETURN(MATCH_NOMATCH); + default: break; + } + ecode++; + break; + + case OP_VSPACE: + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + switch(c) + { + VSPACE_CASES: break; + default: RRETURN(MATCH_NOMATCH); + } + ecode++; + break; + +#ifdef SUPPORT_UCP + /* Check the next character by Unicode property. We will get here only + if the support is in the binary; otherwise a compile-time error occurs. */ + + case OP_PROP: + case OP_NOTPROP: + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + { + const pcre_uint32 *cp; + const ucd_record *prop = GET_UCD(c); + + switch(ecode[1]) + { + case PT_ANY: + if (op == OP_NOTPROP) RRETURN(MATCH_NOMATCH); + break; + + case PT_LAMP: + if ((prop->chartype == ucp_Lu || + prop->chartype == ucp_Ll || + prop->chartype == ucp_Lt) == (op == OP_NOTPROP)) + RRETURN(MATCH_NOMATCH); + break; + + case PT_GC: + if ((ecode[2] != PRIV(ucp_gentype)[prop->chartype]) == (op == OP_PROP)) + RRETURN(MATCH_NOMATCH); + break; + + case PT_PC: + if ((ecode[2] != prop->chartype) == (op == OP_PROP)) + RRETURN(MATCH_NOMATCH); + break; + + case PT_SC: + if ((ecode[2] != prop->script) == (op == OP_PROP)) + RRETURN(MATCH_NOMATCH); + break; + + /* These are specials */ + + case PT_ALNUM: + if ((PRIV(ucp_gentype)[prop->chartype] == ucp_L || + PRIV(ucp_gentype)[prop->chartype] == ucp_N) == (op == OP_NOTPROP)) + RRETURN(MATCH_NOMATCH); + break; + + /* Perl space used to exclude VT, but from Perl 5.18 it is included, + which means that Perl space and POSIX space are now identical. PCRE + was changed at release 8.34. */ + + case PT_SPACE: /* Perl space */ + case PT_PXSPACE: /* POSIX space */ + switch(c) + { + HSPACE_CASES: + VSPACE_CASES: + if (op == OP_NOTPROP) RRETURN(MATCH_NOMATCH); + break; + + default: + if ((PRIV(ucp_gentype)[prop->chartype] == ucp_Z) == + (op == OP_NOTPROP)) RRETURN(MATCH_NOMATCH); + break; + } + break; + + case PT_WORD: + if ((PRIV(ucp_gentype)[prop->chartype] == ucp_L || + PRIV(ucp_gentype)[prop->chartype] == ucp_N || + c == CHAR_UNDERSCORE) == (op == OP_NOTPROP)) + RRETURN(MATCH_NOMATCH); + break; + + case PT_CLIST: + cp = PRIV(ucd_caseless_sets) + ecode[2]; + for (;;) + { + if (c < *cp) + { if (op == OP_PROP) { RRETURN(MATCH_NOMATCH); } else break; } + if (c == *cp++) + { if (op == OP_PROP) break; else { RRETURN(MATCH_NOMATCH); } } + } + break; + + case PT_UCNC: + if ((c == CHAR_DOLLAR_SIGN || c == CHAR_COMMERCIAL_AT || + c == CHAR_GRAVE_ACCENT || (c >= 0xa0 && c <= 0xd7ff) || + c >= 0xe000) == (op == OP_NOTPROP)) + RRETURN(MATCH_NOMATCH); + break; + + /* This should never occur */ + + default: + RRETURN(PCRE_ERROR_INTERNAL); + } + + ecode += 3; + } + break; + + /* Match an extended Unicode sequence. We will get here only if the support + is in the binary; otherwise a compile-time error occurs. */ + + case OP_EXTUNI: + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + else + { + int lgb, rgb; + GETCHARINCTEST(c, eptr); + lgb = UCD_GRAPHBREAK(c); + while (eptr < md->end_subject) + { + int len = 1; + if (!utf) c = *eptr; else { GETCHARLEN(c, eptr, len); } + rgb = UCD_GRAPHBREAK(c); + if ((PRIV(ucp_gbtable)[lgb] & (1 << rgb)) == 0) break; + lgb = rgb; + eptr += len; + } + } + CHECK_PARTIAL(); + ecode++; + break; +#endif /* SUPPORT_UCP */ + + + /* Match a back reference, possibly repeatedly. Look past the end of the + item to see if there is repeat information following. The code is similar + to that for character classes, but repeated for efficiency. Then obey + similar code to character type repeats - written out again for speed. + However, if the referenced string is the empty string, always treat + it as matched, any number of times (otherwise there could be infinite + loops). If the reference is unset, there are two possibilities: + + (a) In the default, Perl-compatible state, set the length negative; + this ensures that every attempt at a match fails. We can't just fail + here, because of the possibility of quantifiers with zero minima. + + (b) If the JavaScript compatibility flag is set, set the length to zero + so that the back reference matches an empty string. + + Otherwise, set the length to the length of what was matched by the + referenced subpattern. + + The OP_REF and OP_REFI opcodes are used for a reference to a numbered group + or to a non-duplicated named group. For a duplicated named group, OP_DNREF + and OP_DNREFI are used. In this case we must scan the list of groups to + which the name refers, and use the first one that is set. */ + + case OP_DNREF: + case OP_DNREFI: + caseless = op == OP_DNREFI; + { + int count = GET2(ecode, 1+IMM2_SIZE); + pcre_uchar *slot = md->name_table + GET2(ecode, 1) * md->name_entry_size; + ecode += 1 + 2*IMM2_SIZE; + + /* Setting the default length first and initializing 'offset' avoids + compiler warnings in the REF_REPEAT code. */ + + length = (md->jscript_compat)? 0 : -1; + offset = 0; + + while (count-- > 0) + { + offset = GET2(slot, 0) << 1; + if (offset < offset_top && md->offset_vector[offset] >= 0) + { + length = md->offset_vector[offset+1] - md->offset_vector[offset]; + break; + } + slot += md->name_entry_size; + } + } + goto REF_REPEAT; + + case OP_REF: + case OP_REFI: + caseless = op == OP_REFI; + offset = GET2(ecode, 1) << 1; /* Doubled ref number */ + ecode += 1 + IMM2_SIZE; + if (offset >= offset_top || md->offset_vector[offset] < 0) + length = (md->jscript_compat)? 0 : -1; + else + length = md->offset_vector[offset+1] - md->offset_vector[offset]; + + /* Set up for repetition, or handle the non-repeated case */ + + REF_REPEAT: + switch (*ecode) + { + case OP_CRSTAR: + case OP_CRMINSTAR: + case OP_CRPLUS: + case OP_CRMINPLUS: + case OP_CRQUERY: + case OP_CRMINQUERY: + c = *ecode++ - OP_CRSTAR; + minimize = (c & 1) != 0; + min = rep_min[c]; /* Pick up values from tables; */ + max = rep_max[c]; /* zero for max => infinity */ + if (max == 0) max = INT_MAX; + break; + + case OP_CRRANGE: + case OP_CRMINRANGE: + minimize = (*ecode == OP_CRMINRANGE); + min = GET2(ecode, 1); + max = GET2(ecode, 1 + IMM2_SIZE); + if (max == 0) max = INT_MAX; + ecode += 1 + 2 * IMM2_SIZE; + break; + + default: /* No repeat follows */ + if ((length = match_ref(offset, eptr, length, md, caseless)) < 0) + { + if (length == -2) eptr = md->end_subject; /* Partial match */ + CHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + eptr += length; + continue; /* With the main loop */ + } + + /* Handle repeated back references. If the length of the reference is + zero, just continue with the main loop. If the length is negative, it + means the reference is unset in non-Java-compatible mode. If the minimum is + zero, we can continue at the same level without recursion. For any other + minimum, carrying on will result in NOMATCH. */ + + if (length == 0) continue; + if (length < 0 && min == 0) continue; + + /* First, ensure the minimum number of matches are present. We get back + the length of the reference string explicitly rather than passing the + address of eptr, so that eptr can be a register variable. */ + + for (i = 1; i <= min; i++) + { + int slength; + if ((slength = match_ref(offset, eptr, length, md, caseless)) < 0) + { + if (slength == -2) eptr = md->end_subject; /* Partial match */ + CHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + eptr += slength; + } + + /* If min = max, continue at the same level without recursion. + They are not both allowed to be zero. */ + + if (min == max) continue; + + /* If minimizing, keep trying and advancing the pointer */ + + if (minimize) + { + for (fi = min;; fi++) + { + int slength; + RMATCH(eptr, ecode, offset_top, md, eptrb, RM14); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if ((slength = match_ref(offset, eptr, length, md, caseless)) < 0) + { + if (slength == -2) eptr = md->end_subject; /* Partial match */ + CHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + eptr += slength; + } + /* Control never gets here */ + } + + /* If maximizing, find the longest string and work backwards */ + + else + { + pp = eptr; + for (i = min; i < max; i++) + { + int slength; + if ((slength = match_ref(offset, eptr, length, md, caseless)) < 0) + { + /* Can't use CHECK_PARTIAL because we don't want to update eptr in + the soft partial matching case. */ + + if (slength == -2 && md->partial != 0 && + md->end_subject > md->start_used_ptr) + { + md->hitend = TRUE; + if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL); + } + break; + } + eptr += slength; + } + + while (eptr >= pp) + { + RMATCH(eptr, ecode, offset_top, md, eptrb, RM15); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + eptr -= length; + } + RRETURN(MATCH_NOMATCH); + } + /* Control never gets here */ + + /* Match a bit-mapped character class, possibly repeatedly. This op code is + used when all the characters in the class have values in the range 0-255, + and either the matching is caseful, or the characters are in the range + 0-127 when UTF-8 processing is enabled. The only difference between + OP_CLASS and OP_NCLASS occurs when a data character outside the range is + encountered. + + First, look past the end of the item to see if there is repeat information + following. Then obey similar code to character type repeats - written out + again for speed. */ + + case OP_NCLASS: + case OP_CLASS: + { + /* The data variable is saved across frames, so the byte map needs to + be stored there. */ +#define BYTE_MAP ((pcre_uint8 *)data) + data = ecode + 1; /* Save for matching */ + ecode += 1 + (32 / sizeof(pcre_uchar)); /* Advance past the item */ + + switch (*ecode) + { + case OP_CRSTAR: + case OP_CRMINSTAR: + case OP_CRPLUS: + case OP_CRMINPLUS: + case OP_CRQUERY: + case OP_CRMINQUERY: + case OP_CRPOSSTAR: + case OP_CRPOSPLUS: + case OP_CRPOSQUERY: + c = *ecode++ - OP_CRSTAR; + if (c < OP_CRPOSSTAR - OP_CRSTAR) minimize = (c & 1) != 0; + else possessive = TRUE; + min = rep_min[c]; /* Pick up values from tables; */ + max = rep_max[c]; /* zero for max => infinity */ + if (max == 0) max = INT_MAX; + break; + + case OP_CRRANGE: + case OP_CRMINRANGE: + case OP_CRPOSRANGE: + minimize = (*ecode == OP_CRMINRANGE); + possessive = (*ecode == OP_CRPOSRANGE); + min = GET2(ecode, 1); + max = GET2(ecode, 1 + IMM2_SIZE); + if (max == 0) max = INT_MAX; + ecode += 1 + 2 * IMM2_SIZE; + break; + + default: /* No repeat follows */ + min = max = 1; + break; + } + + /* First, ensure the minimum number of matches are present. */ + +#ifdef SUPPORT_UTF + if (utf) + { + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINC(c, eptr); + if (c > 255) + { + if (op == OP_CLASS) RRETURN(MATCH_NOMATCH); + } + else + if ((BYTE_MAP[c/8] & (1 << (c&7))) == 0) RRETURN(MATCH_NOMATCH); + } + } + else +#endif + /* Not UTF mode */ + { + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + c = *eptr++; +#ifndef COMPILE_PCRE8 + if (c > 255) + { + if (op == OP_CLASS) RRETURN(MATCH_NOMATCH); + } + else +#endif + if ((BYTE_MAP[c/8] & (1 << (c&7))) == 0) RRETURN(MATCH_NOMATCH); + } + } + + /* If max == min we can continue with the main loop without the + need to recurse. */ + + if (min == max) continue; + + /* If minimizing, keep testing the rest of the expression and advancing + the pointer while it matches the class. */ + + if (minimize) + { +#ifdef SUPPORT_UTF + if (utf) + { + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, eptrb, RM16); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINC(c, eptr); + if (c > 255) + { + if (op == OP_CLASS) RRETURN(MATCH_NOMATCH); + } + else + if ((BYTE_MAP[c/8] & (1 << (c&7))) == 0) RRETURN(MATCH_NOMATCH); + } + } + else +#endif + /* Not UTF mode */ + { + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, eptrb, RM17); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + c = *eptr++; +#ifndef COMPILE_PCRE8 + if (c > 255) + { + if (op == OP_CLASS) RRETURN(MATCH_NOMATCH); + } + else +#endif + if ((BYTE_MAP[c/8] & (1 << (c&7))) == 0) RRETURN(MATCH_NOMATCH); + } + } + /* Control never gets here */ + } + + /* If maximizing, find the longest possible run, then work backwards. */ + + else + { + pp = eptr; + +#ifdef SUPPORT_UTF + if (utf) + { + for (i = min; i < max; i++) + { + int len = 1; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + GETCHARLEN(c, eptr, len); + if (c > 255) + { + if (op == OP_CLASS) break; + } + else + if ((BYTE_MAP[c/8] & (1 << (c&7))) == 0) break; + eptr += len; + } + + if (possessive) continue; /* No backtracking */ + + for (;;) + { + RMATCH(eptr, ecode, offset_top, md, eptrb, RM18); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (eptr-- <= pp) break; /* Stop if tried at original pos */ + BACKCHAR(eptr); + } + } + else +#endif + /* Not UTF mode */ + { + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + c = *eptr; +#ifndef COMPILE_PCRE8 + if (c > 255) + { + if (op == OP_CLASS) break; + } + else +#endif + if ((BYTE_MAP[c/8] & (1 << (c&7))) == 0) break; + eptr++; + } + + if (possessive) continue; /* No backtracking */ + + while (eptr >= pp) + { + RMATCH(eptr, ecode, offset_top, md, eptrb, RM19); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + eptr--; + } + } + + RRETURN(MATCH_NOMATCH); + } +#undef BYTE_MAP + } + /* Control never gets here */ + + + /* Match an extended character class. In the 8-bit library, this opcode is + encountered only when UTF-8 mode mode is supported. In the 16-bit and + 32-bit libraries, codepoints greater than 255 may be encountered even when + UTF is not supported. */ + +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 + case OP_XCLASS: + { + data = ecode + 1 + LINK_SIZE; /* Save for matching */ + ecode += GET(ecode, 1); /* Advance past the item */ + + switch (*ecode) + { + case OP_CRSTAR: + case OP_CRMINSTAR: + case OP_CRPLUS: + case OP_CRMINPLUS: + case OP_CRQUERY: + case OP_CRMINQUERY: + case OP_CRPOSSTAR: + case OP_CRPOSPLUS: + case OP_CRPOSQUERY: + c = *ecode++ - OP_CRSTAR; + if (c < OP_CRPOSSTAR - OP_CRSTAR) minimize = (c & 1) != 0; + else possessive = TRUE; + min = rep_min[c]; /* Pick up values from tables; */ + max = rep_max[c]; /* zero for max => infinity */ + if (max == 0) max = INT_MAX; + break; + + case OP_CRRANGE: + case OP_CRMINRANGE: + case OP_CRPOSRANGE: + minimize = (*ecode == OP_CRMINRANGE); + possessive = (*ecode == OP_CRPOSRANGE); + min = GET2(ecode, 1); + max = GET2(ecode, 1 + IMM2_SIZE); + if (max == 0) max = INT_MAX; + ecode += 1 + 2 * IMM2_SIZE; + break; + + default: /* No repeat follows */ + min = max = 1; + break; + } + + /* First, ensure the minimum number of matches are present. */ + + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + if (!PRIV(xclass)(c, data, utf)) RRETURN(MATCH_NOMATCH); + } + + /* If max == min we can continue with the main loop without the + need to recurse. */ + + if (min == max) continue; + + /* If minimizing, keep testing the rest of the expression and advancing + the pointer while it matches the class. */ + + if (minimize) + { + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, eptrb, RM20); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + if (!PRIV(xclass)(c, data, utf)) RRETURN(MATCH_NOMATCH); + } + /* Control never gets here */ + } + + /* If maximizing, find the longest possible run, then work backwards. */ + + else + { + pp = eptr; + for (i = min; i < max; i++) + { + int len = 1; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } +#ifdef SUPPORT_UTF + GETCHARLENTEST(c, eptr, len); +#else + c = *eptr; +#endif + if (!PRIV(xclass)(c, data, utf)) break; + eptr += len; + } + + if (possessive) continue; /* No backtracking */ + + for(;;) + { + RMATCH(eptr, ecode, offset_top, md, eptrb, RM21); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (eptr-- <= pp) break; /* Stop if tried at original pos */ +#ifdef SUPPORT_UTF + if (utf) BACKCHAR(eptr); +#endif + } + RRETURN(MATCH_NOMATCH); + } + + /* Control never gets here */ + } +#endif /* End of XCLASS */ + + /* Match a single character, casefully */ + + case OP_CHAR: +#ifdef SUPPORT_UTF + if (utf) + { + length = 1; + ecode++; + GETCHARLEN(fc, ecode, length); + if (length > md->end_subject - eptr) + { + CHECK_PARTIAL(); /* Not SCHECK_PARTIAL() */ + RRETURN(MATCH_NOMATCH); + } + while (length-- > 0) if (*ecode++ != UCHAR21INC(eptr)) RRETURN(MATCH_NOMATCH); + } + else +#endif + /* Not UTF mode */ + { + if (md->end_subject - eptr < 1) + { + SCHECK_PARTIAL(); /* This one can use SCHECK_PARTIAL() */ + RRETURN(MATCH_NOMATCH); + } + if (ecode[1] != *eptr++) RRETURN(MATCH_NOMATCH); + ecode += 2; + } + break; + + /* Match a single character, caselessly. If we are at the end of the + subject, give up immediately. */ + + case OP_CHARI: + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + +#ifdef SUPPORT_UTF + if (utf) + { + length = 1; + ecode++; + GETCHARLEN(fc, ecode, length); + + /* If the pattern character's value is < 128, we have only one byte, and + we know that its other case must also be one byte long, so we can use the + fast lookup table. We know that there is at least one byte left in the + subject. */ + + if (fc < 128) + { + pcre_uint32 cc = UCHAR21(eptr); + if (md->lcc[fc] != TABLE_GET(cc, md->lcc, cc)) RRETURN(MATCH_NOMATCH); + ecode++; + eptr++; + } + + /* Otherwise we must pick up the subject character. Note that we cannot + use the value of "length" to check for sufficient bytes left, because the + other case of the character may have more or fewer bytes. */ + + else + { + pcre_uint32 dc; + GETCHARINC(dc, eptr); + ecode += length; + + /* If we have Unicode property support, we can use it to test the other + case of the character, if there is one. */ + + if (fc != dc) + { +#ifdef SUPPORT_UCP + if (dc != UCD_OTHERCASE(fc)) +#endif + RRETURN(MATCH_NOMATCH); + } + } + } + else +#endif /* SUPPORT_UTF */ + + /* Not UTF mode */ + { + if (TABLE_GET(ecode[1], md->lcc, ecode[1]) + != TABLE_GET(*eptr, md->lcc, *eptr)) RRETURN(MATCH_NOMATCH); + eptr++; + ecode += 2; + } + break; + + /* Match a single character repeatedly. */ + + case OP_EXACT: + case OP_EXACTI: + min = max = GET2(ecode, 1); + ecode += 1 + IMM2_SIZE; + goto REPEATCHAR; + + case OP_POSUPTO: + case OP_POSUPTOI: + possessive = TRUE; + /* Fall through */ + + case OP_UPTO: + case OP_UPTOI: + case OP_MINUPTO: + case OP_MINUPTOI: + min = 0; + max = GET2(ecode, 1); + minimize = *ecode == OP_MINUPTO || *ecode == OP_MINUPTOI; + ecode += 1 + IMM2_SIZE; + goto REPEATCHAR; + + case OP_POSSTAR: + case OP_POSSTARI: + possessive = TRUE; + min = 0; + max = INT_MAX; + ecode++; + goto REPEATCHAR; + + case OP_POSPLUS: + case OP_POSPLUSI: + possessive = TRUE; + min = 1; + max = INT_MAX; + ecode++; + goto REPEATCHAR; + + case OP_POSQUERY: + case OP_POSQUERYI: + possessive = TRUE; + min = 0; + max = 1; + ecode++; + goto REPEATCHAR; + + case OP_STAR: + case OP_STARI: + case OP_MINSTAR: + case OP_MINSTARI: + case OP_PLUS: + case OP_PLUSI: + case OP_MINPLUS: + case OP_MINPLUSI: + case OP_QUERY: + case OP_QUERYI: + case OP_MINQUERY: + case OP_MINQUERYI: + c = *ecode++ - ((op < OP_STARI)? OP_STAR : OP_STARI); + minimize = (c & 1) != 0; + min = rep_min[c]; /* Pick up values from tables; */ + max = rep_max[c]; /* zero for max => infinity */ + if (max == 0) max = INT_MAX; + + /* Common code for all repeated single-character matches. We first check + for the minimum number of characters. If the minimum equals the maximum, we + are done. Otherwise, if minimizing, check the rest of the pattern for a + match; if there isn't one, advance up to the maximum, one character at a + time. + + If maximizing, advance up to the maximum number of matching characters, + until eptr is past the end of the maximum run. If possessive, we are + then done (no backing up). Otherwise, match at this position; anything + other than no match is immediately returned. For nomatch, back up one + character, unless we are matching \R and the last thing matched was + \r\n, in which case, back up two bytes. When we reach the first optional + character position, we can save stack by doing a tail recurse. + + The various UTF/non-UTF and caseful/caseless cases are handled separately, + for speed. */ + + REPEATCHAR: +#ifdef SUPPORT_UTF + if (utf) + { + length = 1; + charptr = ecode; + GETCHARLEN(fc, ecode, length); + ecode += length; + + /* Handle multibyte character matching specially here. There is + support for caseless matching if UCP support is present. */ + + if (length > 1) + { +#ifdef SUPPORT_UCP + pcre_uint32 othercase; + if (op >= OP_STARI && /* Caseless */ + (othercase = UCD_OTHERCASE(fc)) != fc) + oclength = PRIV(ord2utf)(othercase, occhars); + else oclength = 0; +#endif /* SUPPORT_UCP */ + + for (i = 1; i <= min; i++) + { + if (eptr <= md->end_subject - length && + memcmp(eptr, charptr, IN_UCHARS(length)) == 0) eptr += length; +#ifdef SUPPORT_UCP + else if (oclength > 0 && + eptr <= md->end_subject - oclength && + memcmp(eptr, occhars, IN_UCHARS(oclength)) == 0) eptr += oclength; +#endif /* SUPPORT_UCP */ + else + { + CHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + } + + if (min == max) continue; + + if (minimize) + { + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, eptrb, RM22); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr <= md->end_subject - length && + memcmp(eptr, charptr, IN_UCHARS(length)) == 0) eptr += length; +#ifdef SUPPORT_UCP + else if (oclength > 0 && + eptr <= md->end_subject - oclength && + memcmp(eptr, occhars, IN_UCHARS(oclength)) == 0) eptr += oclength; +#endif /* SUPPORT_UCP */ + else + { + CHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + } + /* Control never gets here */ + } + + else /* Maximize */ + { + pp = eptr; + for (i = min; i < max; i++) + { + if (eptr <= md->end_subject - length && + memcmp(eptr, charptr, IN_UCHARS(length)) == 0) eptr += length; +#ifdef SUPPORT_UCP + else if (oclength > 0 && + eptr <= md->end_subject - oclength && + memcmp(eptr, occhars, IN_UCHARS(oclength)) == 0) eptr += oclength; +#endif /* SUPPORT_UCP */ + else + { + CHECK_PARTIAL(); + break; + } + } + + if (possessive) continue; /* No backtracking */ + for(;;) + { + if (eptr <= pp) goto TAIL_RECURSE; + RMATCH(eptr, ecode, offset_top, md, eptrb, RM23); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); +#ifdef SUPPORT_UCP + eptr--; + BACKCHAR(eptr); +#else /* without SUPPORT_UCP */ + eptr -= length; +#endif /* SUPPORT_UCP */ + } + } + /* Control never gets here */ + } + + /* If the length of a UTF-8 character is 1, we fall through here, and + obey the code as for non-UTF-8 characters below, though in this case the + value of fc will always be < 128. */ + } + else +#endif /* SUPPORT_UTF */ + /* When not in UTF-8 mode, load a single-byte character. */ + fc = *ecode++; + + /* The value of fc at this point is always one character, though we may + or may not be in UTF mode. The code is duplicated for the caseless and + caseful cases, for speed, since matching characters is likely to be quite + common. First, ensure the minimum number of matches are present. If min = + max, continue at the same level without recursing. Otherwise, if + minimizing, keep trying the rest of the expression and advancing one + matching character if failing, up to the maximum. Alternatively, if + maximizing, find the maximum number of characters and work backwards. */ + + DPRINTF(("matching %c{%d,%d} against subject %.*s\n", fc, min, max, + max, (char *)eptr)); + + if (op >= OP_STARI) /* Caseless */ + { +#ifdef COMPILE_PCRE8 + /* fc must be < 128 if UTF is enabled. */ + foc = md->fcc[fc]; +#else +#ifdef SUPPORT_UTF +#ifdef SUPPORT_UCP + if (utf && fc > 127) + foc = UCD_OTHERCASE(fc); +#else + if (utf && fc > 127) + foc = fc; +#endif /* SUPPORT_UCP */ + else +#endif /* SUPPORT_UTF */ + foc = TABLE_GET(fc, md->fcc, fc); +#endif /* COMPILE_PCRE8 */ + + for (i = 1; i <= min; i++) + { + pcre_uint32 cc; /* Faster than pcre_uchar */ + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + cc = UCHAR21TEST(eptr); + if (fc != cc && foc != cc) RRETURN(MATCH_NOMATCH); + eptr++; + } + if (min == max) continue; + if (minimize) + { + for (fi = min;; fi++) + { + pcre_uint32 cc; /* Faster than pcre_uchar */ + RMATCH(eptr, ecode, offset_top, md, eptrb, RM24); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + cc = UCHAR21TEST(eptr); + if (fc != cc && foc != cc) RRETURN(MATCH_NOMATCH); + eptr++; + } + /* Control never gets here */ + } + else /* Maximize */ + { + pp = eptr; + for (i = min; i < max; i++) + { + pcre_uint32 cc; /* Faster than pcre_uchar */ + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + cc = UCHAR21TEST(eptr); + if (fc != cc && foc != cc) break; + eptr++; + } + if (possessive) continue; /* No backtracking */ + for (;;) + { + if (eptr == pp) goto TAIL_RECURSE; + RMATCH(eptr, ecode, offset_top, md, eptrb, RM25); + eptr--; + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + } + /* Control never gets here */ + } + } + + /* Caseful comparisons (includes all multi-byte characters) */ + + else + { + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + if (fc != UCHAR21INCTEST(eptr)) RRETURN(MATCH_NOMATCH); + } + + if (min == max) continue; + + if (minimize) + { + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, eptrb, RM26); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + if (fc != UCHAR21INCTEST(eptr)) RRETURN(MATCH_NOMATCH); + } + /* Control never gets here */ + } + else /* Maximize */ + { + pp = eptr; + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + if (fc != UCHAR21TEST(eptr)) break; + eptr++; + } + if (possessive) continue; /* No backtracking */ + for (;;) + { + if (eptr == pp) goto TAIL_RECURSE; + RMATCH(eptr, ecode, offset_top, md, eptrb, RM27); + eptr--; + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + } + /* Control never gets here */ + } + } + /* Control never gets here */ + + /* Match a negated single one-byte character. The character we are + checking can be multibyte. */ + + case OP_NOT: + case OP_NOTI: + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } +#ifdef SUPPORT_UTF + if (utf) + { + register pcre_uint32 ch, och; + + ecode++; + GETCHARINC(ch, ecode); + GETCHARINC(c, eptr); + + if (op == OP_NOT) + { + if (ch == c) RRETURN(MATCH_NOMATCH); + } + else + { +#ifdef SUPPORT_UCP + if (ch > 127) + och = UCD_OTHERCASE(ch); +#else + if (ch > 127) + och = ch; +#endif /* SUPPORT_UCP */ + else + och = TABLE_GET(ch, md->fcc, ch); + if (ch == c || och == c) RRETURN(MATCH_NOMATCH); + } + } + else +#endif + { + register pcre_uint32 ch = ecode[1]; + c = *eptr++; + if (ch == c || (op == OP_NOTI && TABLE_GET(ch, md->fcc, ch) == c)) + RRETURN(MATCH_NOMATCH); + ecode += 2; + } + break; + + /* Match a negated single one-byte character repeatedly. This is almost a + repeat of the code for a repeated single character, but I haven't found a + nice way of commoning these up that doesn't require a test of the + positive/negative option for each character match. Maybe that wouldn't add + very much to the time taken, but character matching *is* what this is all + about... */ + + case OP_NOTEXACT: + case OP_NOTEXACTI: + min = max = GET2(ecode, 1); + ecode += 1 + IMM2_SIZE; + goto REPEATNOTCHAR; + + case OP_NOTUPTO: + case OP_NOTUPTOI: + case OP_NOTMINUPTO: + case OP_NOTMINUPTOI: + min = 0; + max = GET2(ecode, 1); + minimize = *ecode == OP_NOTMINUPTO || *ecode == OP_NOTMINUPTOI; + ecode += 1 + IMM2_SIZE; + goto REPEATNOTCHAR; + + case OP_NOTPOSSTAR: + case OP_NOTPOSSTARI: + possessive = TRUE; + min = 0; + max = INT_MAX; + ecode++; + goto REPEATNOTCHAR; + + case OP_NOTPOSPLUS: + case OP_NOTPOSPLUSI: + possessive = TRUE; + min = 1; + max = INT_MAX; + ecode++; + goto REPEATNOTCHAR; + + case OP_NOTPOSQUERY: + case OP_NOTPOSQUERYI: + possessive = TRUE; + min = 0; + max = 1; + ecode++; + goto REPEATNOTCHAR; + + case OP_NOTPOSUPTO: + case OP_NOTPOSUPTOI: + possessive = TRUE; + min = 0; + max = GET2(ecode, 1); + ecode += 1 + IMM2_SIZE; + goto REPEATNOTCHAR; + + case OP_NOTSTAR: + case OP_NOTSTARI: + case OP_NOTMINSTAR: + case OP_NOTMINSTARI: + case OP_NOTPLUS: + case OP_NOTPLUSI: + case OP_NOTMINPLUS: + case OP_NOTMINPLUSI: + case OP_NOTQUERY: + case OP_NOTQUERYI: + case OP_NOTMINQUERY: + case OP_NOTMINQUERYI: + c = *ecode++ - ((op >= OP_NOTSTARI)? OP_NOTSTARI: OP_NOTSTAR); + minimize = (c & 1) != 0; + min = rep_min[c]; /* Pick up values from tables; */ + max = rep_max[c]; /* zero for max => infinity */ + if (max == 0) max = INT_MAX; + + /* Common code for all repeated single-byte matches. */ + + REPEATNOTCHAR: + GETCHARINCTEST(fc, ecode); + + /* The code is duplicated for the caseless and caseful cases, for speed, + since matching characters is likely to be quite common. First, ensure the + minimum number of matches are present. If min = max, continue at the same + level without recursing. Otherwise, if minimizing, keep trying the rest of + the expression and advancing one matching character if failing, up to the + maximum. Alternatively, if maximizing, find the maximum number of + characters and work backwards. */ + + DPRINTF(("negative matching %c{%d,%d} against subject %.*s\n", fc, min, max, + max, (char *)eptr)); + + if (op >= OP_NOTSTARI) /* Caseless */ + { +#ifdef SUPPORT_UTF +#ifdef SUPPORT_UCP + if (utf && fc > 127) + foc = UCD_OTHERCASE(fc); +#else + if (utf && fc > 127) + foc = fc; +#endif /* SUPPORT_UCP */ + else +#endif /* SUPPORT_UTF */ + foc = TABLE_GET(fc, md->fcc, fc); + +#ifdef SUPPORT_UTF + if (utf) + { + register pcre_uint32 d; + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINC(d, eptr); + if (fc == d || (unsigned int)foc == d) RRETURN(MATCH_NOMATCH); + } + } + else +#endif /* SUPPORT_UTF */ + /* Not UTF mode */ + { + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + if (fc == *eptr || foc == *eptr) RRETURN(MATCH_NOMATCH); + eptr++; + } + } + + if (min == max) continue; + + if (minimize) + { +#ifdef SUPPORT_UTF + if (utf) + { + register pcre_uint32 d; + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, eptrb, RM28); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINC(d, eptr); + if (fc == d || (unsigned int)foc == d) RRETURN(MATCH_NOMATCH); + } + } + else +#endif /*SUPPORT_UTF */ + /* Not UTF mode */ + { + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, eptrb, RM29); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + if (fc == *eptr || foc == *eptr) RRETURN(MATCH_NOMATCH); + eptr++; + } + } + /* Control never gets here */ + } + + /* Maximize case */ + + else + { + pp = eptr; + +#ifdef SUPPORT_UTF + if (utf) + { + register pcre_uint32 d; + for (i = min; i < max; i++) + { + int len = 1; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + GETCHARLEN(d, eptr, len); + if (fc == d || (unsigned int)foc == d) break; + eptr += len; + } + if (possessive) continue; /* No backtracking */ + for(;;) + { + if (eptr <= pp) goto TAIL_RECURSE; + RMATCH(eptr, ecode, offset_top, md, eptrb, RM30); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + eptr--; + BACKCHAR(eptr); + } + } + else +#endif /* SUPPORT_UTF */ + /* Not UTF mode */ + { + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + if (fc == *eptr || foc == *eptr) break; + eptr++; + } + if (possessive) continue; /* No backtracking */ + for (;;) + { + if (eptr == pp) goto TAIL_RECURSE; + RMATCH(eptr, ecode, offset_top, md, eptrb, RM31); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + eptr--; + } + } + /* Control never gets here */ + } + } + + /* Caseful comparisons */ + + else + { +#ifdef SUPPORT_UTF + if (utf) + { + register pcre_uint32 d; + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINC(d, eptr); + if (fc == d) RRETURN(MATCH_NOMATCH); + } + } + else +#endif + /* Not UTF mode */ + { + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + if (fc == *eptr++) RRETURN(MATCH_NOMATCH); + } + } + + if (min == max) continue; + + if (minimize) + { +#ifdef SUPPORT_UTF + if (utf) + { + register pcre_uint32 d; + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, eptrb, RM32); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINC(d, eptr); + if (fc == d) RRETURN(MATCH_NOMATCH); + } + } + else +#endif + /* Not UTF mode */ + { + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, eptrb, RM33); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + if (fc == *eptr++) RRETURN(MATCH_NOMATCH); + } + } + /* Control never gets here */ + } + + /* Maximize case */ + + else + { + pp = eptr; + +#ifdef SUPPORT_UTF + if (utf) + { + register pcre_uint32 d; + for (i = min; i < max; i++) + { + int len = 1; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + GETCHARLEN(d, eptr, len); + if (fc == d) break; + eptr += len; + } + if (possessive) continue; /* No backtracking */ + for(;;) + { + if (eptr <= pp) goto TAIL_RECURSE; + RMATCH(eptr, ecode, offset_top, md, eptrb, RM34); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + eptr--; + BACKCHAR(eptr); + } + } + else +#endif + /* Not UTF mode */ + { + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + if (fc == *eptr) break; + eptr++; + } + if (possessive) continue; /* No backtracking */ + for (;;) + { + if (eptr == pp) goto TAIL_RECURSE; + RMATCH(eptr, ecode, offset_top, md, eptrb, RM35); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + eptr--; + } + } + /* Control never gets here */ + } + } + /* Control never gets here */ + + /* Match a single character type repeatedly; several different opcodes + share code. This is very similar to the code for single characters, but we + repeat it in the interests of efficiency. */ + + case OP_TYPEEXACT: + min = max = GET2(ecode, 1); + minimize = TRUE; + ecode += 1 + IMM2_SIZE; + goto REPEATTYPE; + + case OP_TYPEUPTO: + case OP_TYPEMINUPTO: + min = 0; + max = GET2(ecode, 1); + minimize = *ecode == OP_TYPEMINUPTO; + ecode += 1 + IMM2_SIZE; + goto REPEATTYPE; + + case OP_TYPEPOSSTAR: + possessive = TRUE; + min = 0; + max = INT_MAX; + ecode++; + goto REPEATTYPE; + + case OP_TYPEPOSPLUS: + possessive = TRUE; + min = 1; + max = INT_MAX; + ecode++; + goto REPEATTYPE; + + case OP_TYPEPOSQUERY: + possessive = TRUE; + min = 0; + max = 1; + ecode++; + goto REPEATTYPE; + + case OP_TYPEPOSUPTO: + possessive = TRUE; + min = 0; + max = GET2(ecode, 1); + ecode += 1 + IMM2_SIZE; + goto REPEATTYPE; + + case OP_TYPESTAR: + case OP_TYPEMINSTAR: + case OP_TYPEPLUS: + case OP_TYPEMINPLUS: + case OP_TYPEQUERY: + case OP_TYPEMINQUERY: + c = *ecode++ - OP_TYPESTAR; + minimize = (c & 1) != 0; + min = rep_min[c]; /* Pick up values from tables; */ + max = rep_max[c]; /* zero for max => infinity */ + if (max == 0) max = INT_MAX; + + /* Common code for all repeated single character type matches. Note that + in UTF-8 mode, '.' matches a character of any length, but for the other + character types, the valid characters are all one-byte long. */ + + REPEATTYPE: + ctype = *ecode++; /* Code for the character type */ + +#ifdef SUPPORT_UCP + if (ctype == OP_PROP || ctype == OP_NOTPROP) + { + prop_fail_result = ctype == OP_NOTPROP; + prop_type = *ecode++; + prop_value = *ecode++; + } + else prop_type = -1; +#endif + + /* First, ensure the minimum number of matches are present. Use inline + code for maximizing the speed, and do the type test once at the start + (i.e. keep it out of the loop). Separate the UTF-8 code completely as that + is tidier. Also separate the UCP code, which can be the same for both UTF-8 + and single-bytes. */ + + if (min > 0) + { +#ifdef SUPPORT_UCP + if (prop_type >= 0) + { + switch(prop_type) + { + case PT_ANY: + if (prop_fail_result) RRETURN(MATCH_NOMATCH); + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + } + break; + + case PT_LAMP: + for (i = 1; i <= min; i++) + { + int chartype; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + chartype = UCD_CHARTYPE(c); + if ((chartype == ucp_Lu || + chartype == ucp_Ll || + chartype == ucp_Lt) == prop_fail_result) + RRETURN(MATCH_NOMATCH); + } + break; + + case PT_GC: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + if ((UCD_CATEGORY(c) == prop_value) == prop_fail_result) + RRETURN(MATCH_NOMATCH); + } + break; + + case PT_PC: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + if ((UCD_CHARTYPE(c) == prop_value) == prop_fail_result) + RRETURN(MATCH_NOMATCH); + } + break; + + case PT_SC: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + if ((UCD_SCRIPT(c) == prop_value) == prop_fail_result) + RRETURN(MATCH_NOMATCH); + } + break; + + case PT_ALNUM: + for (i = 1; i <= min; i++) + { + int category; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + category = UCD_CATEGORY(c); + if ((category == ucp_L || category == ucp_N) == prop_fail_result) + RRETURN(MATCH_NOMATCH); + } + break; + + /* Perl space used to exclude VT, but from Perl 5.18 it is included, + which means that Perl space and POSIX space are now identical. PCRE + was changed at release 8.34. */ + + case PT_SPACE: /* Perl space */ + case PT_PXSPACE: /* POSIX space */ + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + switch(c) + { + HSPACE_CASES: + VSPACE_CASES: + if (prop_fail_result) RRETURN(MATCH_NOMATCH); + break; + + default: + if ((UCD_CATEGORY(c) == ucp_Z) == prop_fail_result) + RRETURN(MATCH_NOMATCH); + break; + } + } + break; + + case PT_WORD: + for (i = 1; i <= min; i++) + { + int category; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + category = UCD_CATEGORY(c); + if ((category == ucp_L || category == ucp_N || c == CHAR_UNDERSCORE) + == prop_fail_result) + RRETURN(MATCH_NOMATCH); + } + break; + + case PT_CLIST: + for (i = 1; i <= min; i++) + { + const pcre_uint32 *cp; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + cp = PRIV(ucd_caseless_sets) + prop_value; + for (;;) + { + if (c < *cp) + { if (prop_fail_result) break; else { RRETURN(MATCH_NOMATCH); } } + if (c == *cp++) + { if (prop_fail_result) { RRETURN(MATCH_NOMATCH); } else break; } + } + } + break; + + case PT_UCNC: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + if ((c == CHAR_DOLLAR_SIGN || c == CHAR_COMMERCIAL_AT || + c == CHAR_GRAVE_ACCENT || (c >= 0xa0 && c <= 0xd7ff) || + c >= 0xe000) == prop_fail_result) + RRETURN(MATCH_NOMATCH); + } + break; + + /* This should not occur */ + + default: + RRETURN(PCRE_ERROR_INTERNAL); + } + } + + /* Match extended Unicode sequences. We will get here only if the + support is in the binary; otherwise a compile-time error occurs. */ + + else if (ctype == OP_EXTUNI) + { + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + else + { + int lgb, rgb; + GETCHARINCTEST(c, eptr); + lgb = UCD_GRAPHBREAK(c); + while (eptr < md->end_subject) + { + int len = 1; + if (!utf) c = *eptr; else { GETCHARLEN(c, eptr, len); } + rgb = UCD_GRAPHBREAK(c); + if ((PRIV(ucp_gbtable)[lgb] & (1 << rgb)) == 0) break; + lgb = rgb; + eptr += len; + } + } + CHECK_PARTIAL(); + } + } + + else +#endif /* SUPPORT_UCP */ + +/* Handle all other cases when the coding is UTF-8 */ + +#ifdef SUPPORT_UTF + if (utf) switch(ctype) + { + case OP_ANY: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + if (IS_NEWLINE(eptr)) RRETURN(MATCH_NOMATCH); + if (md->partial != 0 && + eptr + 1 >= md->end_subject && + NLBLOCK->nltype == NLTYPE_FIXED && + NLBLOCK->nllen == 2 && + UCHAR21(eptr) == NLBLOCK->nl[0]) + { + md->hitend = TRUE; + if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL); + } + eptr++; + ACROSSCHAR(eptr < md->end_subject, *eptr, eptr++); + } + break; + + case OP_ALLANY: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + eptr++; + ACROSSCHAR(eptr < md->end_subject, *eptr, eptr++); + } + break; + + case OP_ANYBYTE: + if (eptr > md->end_subject - min) RRETURN(MATCH_NOMATCH); + eptr += min; + break; + + case OP_ANYNL: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINC(c, eptr); + switch(c) + { + default: RRETURN(MATCH_NOMATCH); + + case CHAR_CR: + if (eptr < md->end_subject && UCHAR21(eptr) == CHAR_LF) eptr++; + break; + + case CHAR_LF: + break; + + case CHAR_VT: + case CHAR_FF: + case CHAR_NEL: +#ifndef EBCDIC + case 0x2028: + case 0x2029: +#endif /* Not EBCDIC */ + if (md->bsr_anycrlf) RRETURN(MATCH_NOMATCH); + break; + } + } + break; + + case OP_NOT_HSPACE: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINC(c, eptr); + switch(c) + { + HSPACE_CASES: RRETURN(MATCH_NOMATCH); /* Byte and multibyte cases */ + default: break; + } + } + break; + + case OP_HSPACE: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINC(c, eptr); + switch(c) + { + HSPACE_CASES: break; /* Byte and multibyte cases */ + default: RRETURN(MATCH_NOMATCH); + } + } + break; + + case OP_NOT_VSPACE: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINC(c, eptr); + switch(c) + { + VSPACE_CASES: RRETURN(MATCH_NOMATCH); + default: break; + } + } + break; + + case OP_VSPACE: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINC(c, eptr); + switch(c) + { + VSPACE_CASES: break; + default: RRETURN(MATCH_NOMATCH); + } + } + break; + + case OP_NOT_DIGIT: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINC(c, eptr); + if (c < 128 && (md->ctypes[c] & ctype_digit) != 0) + RRETURN(MATCH_NOMATCH); + } + break; + + case OP_DIGIT: + for (i = 1; i <= min; i++) + { + pcre_uint32 cc; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + cc = UCHAR21(eptr); + if (cc >= 128 || (md->ctypes[cc] & ctype_digit) == 0) + RRETURN(MATCH_NOMATCH); + eptr++; + /* No need to skip more bytes - we know it's a 1-byte character */ + } + break; + + case OP_NOT_WHITESPACE: + for (i = 1; i <= min; i++) + { + pcre_uint32 cc; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + cc = UCHAR21(eptr); + if (cc < 128 && (md->ctypes[cc] & ctype_space) != 0) + RRETURN(MATCH_NOMATCH); + eptr++; + ACROSSCHAR(eptr < md->end_subject, *eptr, eptr++); + } + break; + + case OP_WHITESPACE: + for (i = 1; i <= min; i++) + { + pcre_uint32 cc; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + cc = UCHAR21(eptr); + if (cc >= 128 || (md->ctypes[cc] & ctype_space) == 0) + RRETURN(MATCH_NOMATCH); + eptr++; + /* No need to skip more bytes - we know it's a 1-byte character */ + } + break; + + case OP_NOT_WORDCHAR: + for (i = 1; i <= min; i++) + { + pcre_uint32 cc; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + cc = UCHAR21(eptr); + if (cc < 128 && (md->ctypes[cc] & ctype_word) != 0) + RRETURN(MATCH_NOMATCH); + eptr++; + ACROSSCHAR(eptr < md->end_subject, *eptr, eptr++); + } + break; + + case OP_WORDCHAR: + for (i = 1; i <= min; i++) + { + pcre_uint32 cc; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + cc = UCHAR21(eptr); + if (cc >= 128 || (md->ctypes[cc] & ctype_word) == 0) + RRETURN(MATCH_NOMATCH); + eptr++; + /* No need to skip more bytes - we know it's a 1-byte character */ + } + break; + + default: + RRETURN(PCRE_ERROR_INTERNAL); + } /* End switch(ctype) */ + + else +#endif /* SUPPORT_UTF */ + + /* Code for the non-UTF-8 case for minimum matching of operators other + than OP_PROP and OP_NOTPROP. */ + + switch(ctype) + { + case OP_ANY: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + if (IS_NEWLINE(eptr)) RRETURN(MATCH_NOMATCH); + if (md->partial != 0 && + eptr + 1 >= md->end_subject && + NLBLOCK->nltype == NLTYPE_FIXED && + NLBLOCK->nllen == 2 && + *eptr == NLBLOCK->nl[0]) + { + md->hitend = TRUE; + if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL); + } + eptr++; + } + break; + + case OP_ALLANY: + if (eptr > md->end_subject - min) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + eptr += min; + break; + + case OP_ANYBYTE: + if (eptr > md->end_subject - min) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + eptr += min; + break; + + case OP_ANYNL: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + switch(*eptr++) + { + default: RRETURN(MATCH_NOMATCH); + + case CHAR_CR: + if (eptr < md->end_subject && *eptr == CHAR_LF) eptr++; + break; + + case CHAR_LF: + break; + + case CHAR_VT: + case CHAR_FF: + case CHAR_NEL: +#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32 + case 0x2028: + case 0x2029: +#endif + if (md->bsr_anycrlf) RRETURN(MATCH_NOMATCH); + break; + } + } + break; + + case OP_NOT_HSPACE: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + switch(*eptr++) + { + default: break; + HSPACE_BYTE_CASES: +#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32 + HSPACE_MULTIBYTE_CASES: +#endif + RRETURN(MATCH_NOMATCH); + } + } + break; + + case OP_HSPACE: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + switch(*eptr++) + { + default: RRETURN(MATCH_NOMATCH); + HSPACE_BYTE_CASES: +#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32 + HSPACE_MULTIBYTE_CASES: +#endif + break; + } + } + break; + + case OP_NOT_VSPACE: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + switch(*eptr++) + { + VSPACE_BYTE_CASES: +#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32 + VSPACE_MULTIBYTE_CASES: +#endif + RRETURN(MATCH_NOMATCH); + default: break; + } + } + break; + + case OP_VSPACE: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + switch(*eptr++) + { + default: RRETURN(MATCH_NOMATCH); + VSPACE_BYTE_CASES: +#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32 + VSPACE_MULTIBYTE_CASES: +#endif + break; + } + } + break; + + case OP_NOT_DIGIT: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + if (MAX_255(*eptr) && (md->ctypes[*eptr] & ctype_digit) != 0) + RRETURN(MATCH_NOMATCH); + eptr++; + } + break; + + case OP_DIGIT: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + if (!MAX_255(*eptr) || (md->ctypes[*eptr] & ctype_digit) == 0) + RRETURN(MATCH_NOMATCH); + eptr++; + } + break; + + case OP_NOT_WHITESPACE: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + if (MAX_255(*eptr) && (md->ctypes[*eptr] & ctype_space) != 0) + RRETURN(MATCH_NOMATCH); + eptr++; + } + break; + + case OP_WHITESPACE: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + if (!MAX_255(*eptr) || (md->ctypes[*eptr] & ctype_space) == 0) + RRETURN(MATCH_NOMATCH); + eptr++; + } + break; + + case OP_NOT_WORDCHAR: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + if (MAX_255(*eptr) && (md->ctypes[*eptr] & ctype_word) != 0) + RRETURN(MATCH_NOMATCH); + eptr++; + } + break; + + case OP_WORDCHAR: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + if (!MAX_255(*eptr) || (md->ctypes[*eptr] & ctype_word) == 0) + RRETURN(MATCH_NOMATCH); + eptr++; + } + break; + + default: + RRETURN(PCRE_ERROR_INTERNAL); + } + } + + /* If min = max, continue at the same level without recursing */ + + if (min == max) continue; + + /* If minimizing, we have to test the rest of the pattern before each + subsequent match. Again, separate the UTF-8 case for speed, and also + separate the UCP cases. */ + + if (minimize) + { +#ifdef SUPPORT_UCP + if (prop_type >= 0) + { + switch(prop_type) + { + case PT_ANY: + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, eptrb, RM36); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + if (prop_fail_result) RRETURN(MATCH_NOMATCH); + } + /* Control never gets here */ + + case PT_LAMP: + for (fi = min;; fi++) + { + int chartype; + RMATCH(eptr, ecode, offset_top, md, eptrb, RM37); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + chartype = UCD_CHARTYPE(c); + if ((chartype == ucp_Lu || + chartype == ucp_Ll || + chartype == ucp_Lt) == prop_fail_result) + RRETURN(MATCH_NOMATCH); + } + /* Control never gets here */ + + case PT_GC: + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, eptrb, RM38); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + if ((UCD_CATEGORY(c) == prop_value) == prop_fail_result) + RRETURN(MATCH_NOMATCH); + } + /* Control never gets here */ + + case PT_PC: + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, eptrb, RM39); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + if ((UCD_CHARTYPE(c) == prop_value) == prop_fail_result) + RRETURN(MATCH_NOMATCH); + } + /* Control never gets here */ + + case PT_SC: + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, eptrb, RM40); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + if ((UCD_SCRIPT(c) == prop_value) == prop_fail_result) + RRETURN(MATCH_NOMATCH); + } + /* Control never gets here */ + + case PT_ALNUM: + for (fi = min;; fi++) + { + int category; + RMATCH(eptr, ecode, offset_top, md, eptrb, RM59); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + category = UCD_CATEGORY(c); + if ((category == ucp_L || category == ucp_N) == prop_fail_result) + RRETURN(MATCH_NOMATCH); + } + /* Control never gets here */ + + /* Perl space used to exclude VT, but from Perl 5.18 it is included, + which means that Perl space and POSIX space are now identical. PCRE + was changed at release 8.34. */ + + case PT_SPACE: /* Perl space */ + case PT_PXSPACE: /* POSIX space */ + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, eptrb, RM61); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + switch(c) + { + HSPACE_CASES: + VSPACE_CASES: + if (prop_fail_result) RRETURN(MATCH_NOMATCH); + break; + + default: + if ((UCD_CATEGORY(c) == ucp_Z) == prop_fail_result) + RRETURN(MATCH_NOMATCH); + break; + } + } + /* Control never gets here */ + + case PT_WORD: + for (fi = min;; fi++) + { + int category; + RMATCH(eptr, ecode, offset_top, md, eptrb, RM62); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + category = UCD_CATEGORY(c); + if ((category == ucp_L || + category == ucp_N || + c == CHAR_UNDERSCORE) + == prop_fail_result) + RRETURN(MATCH_NOMATCH); + } + /* Control never gets here */ + + case PT_CLIST: + for (fi = min;; fi++) + { + const pcre_uint32 *cp; + RMATCH(eptr, ecode, offset_top, md, eptrb, RM67); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + cp = PRIV(ucd_caseless_sets) + prop_value; + for (;;) + { + if (c < *cp) + { if (prop_fail_result) break; else { RRETURN(MATCH_NOMATCH); } } + if (c == *cp++) + { if (prop_fail_result) { RRETURN(MATCH_NOMATCH); } else break; } + } + } + /* Control never gets here */ + + case PT_UCNC: + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, eptrb, RM60); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + if ((c == CHAR_DOLLAR_SIGN || c == CHAR_COMMERCIAL_AT || + c == CHAR_GRAVE_ACCENT || (c >= 0xa0 && c <= 0xd7ff) || + c >= 0xe000) == prop_fail_result) + RRETURN(MATCH_NOMATCH); + } + /* Control never gets here */ + + /* This should never occur */ + default: + RRETURN(PCRE_ERROR_INTERNAL); + } + } + + /* Match extended Unicode sequences. We will get here only if the + support is in the binary; otherwise a compile-time error occurs. */ + + else if (ctype == OP_EXTUNI) + { + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, eptrb, RM41); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + else + { + int lgb, rgb; + GETCHARINCTEST(c, eptr); + lgb = UCD_GRAPHBREAK(c); + while (eptr < md->end_subject) + { + int len = 1; + if (!utf) c = *eptr; else { GETCHARLEN(c, eptr, len); } + rgb = UCD_GRAPHBREAK(c); + if ((PRIV(ucp_gbtable)[lgb] & (1 << rgb)) == 0) break; + lgb = rgb; + eptr += len; + } + } + CHECK_PARTIAL(); + } + } + else +#endif /* SUPPORT_UCP */ + +#ifdef SUPPORT_UTF + if (utf) + { + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, eptrb, RM42); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + if (ctype == OP_ANY && IS_NEWLINE(eptr)) + RRETURN(MATCH_NOMATCH); + GETCHARINC(c, eptr); + switch(ctype) + { + case OP_ANY: /* This is the non-NL case */ + if (md->partial != 0 && /* Take care with CRLF partial */ + eptr >= md->end_subject && + NLBLOCK->nltype == NLTYPE_FIXED && + NLBLOCK->nllen == 2 && + c == NLBLOCK->nl[0]) + { + md->hitend = TRUE; + if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL); + } + break; + + case OP_ALLANY: + case OP_ANYBYTE: + break; + + case OP_ANYNL: + switch(c) + { + default: RRETURN(MATCH_NOMATCH); + case CHAR_CR: + if (eptr < md->end_subject && UCHAR21(eptr) == CHAR_LF) eptr++; + break; + + case CHAR_LF: + break; + + case CHAR_VT: + case CHAR_FF: + case CHAR_NEL: +#ifndef EBCDIC + case 0x2028: + case 0x2029: +#endif /* Not EBCDIC */ + if (md->bsr_anycrlf) RRETURN(MATCH_NOMATCH); + break; + } + break; + + case OP_NOT_HSPACE: + switch(c) + { + HSPACE_CASES: RRETURN(MATCH_NOMATCH); + default: break; + } + break; + + case OP_HSPACE: + switch(c) + { + HSPACE_CASES: break; + default: RRETURN(MATCH_NOMATCH); + } + break; + + case OP_NOT_VSPACE: + switch(c) + { + VSPACE_CASES: RRETURN(MATCH_NOMATCH); + default: break; + } + break; + + case OP_VSPACE: + switch(c) + { + VSPACE_CASES: break; + default: RRETURN(MATCH_NOMATCH); + } + break; + + case OP_NOT_DIGIT: + if (c < 256 && (md->ctypes[c] & ctype_digit) != 0) + RRETURN(MATCH_NOMATCH); + break; + + case OP_DIGIT: + if (c >= 256 || (md->ctypes[c] & ctype_digit) == 0) + RRETURN(MATCH_NOMATCH); + break; + + case OP_NOT_WHITESPACE: + if (c < 256 && (md->ctypes[c] & ctype_space) != 0) + RRETURN(MATCH_NOMATCH); + break; + + case OP_WHITESPACE: + if (c >= 256 || (md->ctypes[c] & ctype_space) == 0) + RRETURN(MATCH_NOMATCH); + break; + + case OP_NOT_WORDCHAR: + if (c < 256 && (md->ctypes[c] & ctype_word) != 0) + RRETURN(MATCH_NOMATCH); + break; + + case OP_WORDCHAR: + if (c >= 256 || (md->ctypes[c] & ctype_word) == 0) + RRETURN(MATCH_NOMATCH); + break; + + default: + RRETURN(PCRE_ERROR_INTERNAL); + } + } + } + else +#endif + /* Not UTF mode */ + { + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, eptrb, RM43); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + if (ctype == OP_ANY && IS_NEWLINE(eptr)) + RRETURN(MATCH_NOMATCH); + c = *eptr++; + switch(ctype) + { + case OP_ANY: /* This is the non-NL case */ + if (md->partial != 0 && /* Take care with CRLF partial */ + eptr >= md->end_subject && + NLBLOCK->nltype == NLTYPE_FIXED && + NLBLOCK->nllen == 2 && + c == NLBLOCK->nl[0]) + { + md->hitend = TRUE; + if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL); + } + break; + + case OP_ALLANY: + case OP_ANYBYTE: + break; + + case OP_ANYNL: + switch(c) + { + default: RRETURN(MATCH_NOMATCH); + case CHAR_CR: + if (eptr < md->end_subject && *eptr == CHAR_LF) eptr++; + break; + + case CHAR_LF: + break; + + case CHAR_VT: + case CHAR_FF: + case CHAR_NEL: +#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32 + case 0x2028: + case 0x2029: +#endif + if (md->bsr_anycrlf) RRETURN(MATCH_NOMATCH); + break; + } + break; + + case OP_NOT_HSPACE: + switch(c) + { + default: break; + HSPACE_BYTE_CASES: +#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32 + HSPACE_MULTIBYTE_CASES: +#endif + RRETURN(MATCH_NOMATCH); + } + break; + + case OP_HSPACE: + switch(c) + { + default: RRETURN(MATCH_NOMATCH); + HSPACE_BYTE_CASES: +#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32 + HSPACE_MULTIBYTE_CASES: +#endif + break; + } + break; + + case OP_NOT_VSPACE: + switch(c) + { + default: break; + VSPACE_BYTE_CASES: +#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32 + VSPACE_MULTIBYTE_CASES: +#endif + RRETURN(MATCH_NOMATCH); + } + break; + + case OP_VSPACE: + switch(c) + { + default: RRETURN(MATCH_NOMATCH); + VSPACE_BYTE_CASES: +#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32 + VSPACE_MULTIBYTE_CASES: +#endif + break; + } + break; + + case OP_NOT_DIGIT: + if (MAX_255(c) && (md->ctypes[c] & ctype_digit) != 0) RRETURN(MATCH_NOMATCH); + break; + + case OP_DIGIT: + if (!MAX_255(c) || (md->ctypes[c] & ctype_digit) == 0) RRETURN(MATCH_NOMATCH); + break; + + case OP_NOT_WHITESPACE: + if (MAX_255(c) && (md->ctypes[c] & ctype_space) != 0) RRETURN(MATCH_NOMATCH); + break; + + case OP_WHITESPACE: + if (!MAX_255(c) || (md->ctypes[c] & ctype_space) == 0) RRETURN(MATCH_NOMATCH); + break; + + case OP_NOT_WORDCHAR: + if (MAX_255(c) && (md->ctypes[c] & ctype_word) != 0) RRETURN(MATCH_NOMATCH); + break; + + case OP_WORDCHAR: + if (!MAX_255(c) || (md->ctypes[c] & ctype_word) == 0) RRETURN(MATCH_NOMATCH); + break; + + default: + RRETURN(PCRE_ERROR_INTERNAL); + } + } + } + /* Control never gets here */ + } + + /* If maximizing, it is worth using inline code for speed, doing the type + test once at the start (i.e. keep it out of the loop). Again, keep the + UTF-8 and UCP stuff separate. */ + + else + { + pp = eptr; /* Remember where we started */ + +#ifdef SUPPORT_UCP + if (prop_type >= 0) + { + switch(prop_type) + { + case PT_ANY: + for (i = min; i < max; i++) + { + int len = 1; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + GETCHARLENTEST(c, eptr, len); + if (prop_fail_result) break; + eptr+= len; + } + break; + + case PT_LAMP: + for (i = min; i < max; i++) + { + int chartype; + int len = 1; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + GETCHARLENTEST(c, eptr, len); + chartype = UCD_CHARTYPE(c); + if ((chartype == ucp_Lu || + chartype == ucp_Ll || + chartype == ucp_Lt) == prop_fail_result) + break; + eptr+= len; + } + break; + + case PT_GC: + for (i = min; i < max; i++) + { + int len = 1; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + GETCHARLENTEST(c, eptr, len); + if ((UCD_CATEGORY(c) == prop_value) == prop_fail_result) break; + eptr+= len; + } + break; + + case PT_PC: + for (i = min; i < max; i++) + { + int len = 1; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + GETCHARLENTEST(c, eptr, len); + if ((UCD_CHARTYPE(c) == prop_value) == prop_fail_result) break; + eptr+= len; + } + break; + + case PT_SC: + for (i = min; i < max; i++) + { + int len = 1; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + GETCHARLENTEST(c, eptr, len); + if ((UCD_SCRIPT(c) == prop_value) == prop_fail_result) break; + eptr+= len; + } + break; + + case PT_ALNUM: + for (i = min; i < max; i++) + { + int category; + int len = 1; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + GETCHARLENTEST(c, eptr, len); + category = UCD_CATEGORY(c); + if ((category == ucp_L || category == ucp_N) == prop_fail_result) + break; + eptr+= len; + } + break; + + /* Perl space used to exclude VT, but from Perl 5.18 it is included, + which means that Perl space and POSIX space are now identical. PCRE + was changed at release 8.34. */ + + case PT_SPACE: /* Perl space */ + case PT_PXSPACE: /* POSIX space */ + for (i = min; i < max; i++) + { + int len = 1; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + GETCHARLENTEST(c, eptr, len); + switch(c) + { + HSPACE_CASES: + VSPACE_CASES: + if (prop_fail_result) goto ENDLOOP99; /* Break the loop */ + break; + + default: + if ((UCD_CATEGORY(c) == ucp_Z) == prop_fail_result) + goto ENDLOOP99; /* Break the loop */ + break; + } + eptr+= len; + } + ENDLOOP99: + break; + + case PT_WORD: + for (i = min; i < max; i++) + { + int category; + int len = 1; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + GETCHARLENTEST(c, eptr, len); + category = UCD_CATEGORY(c); + if ((category == ucp_L || category == ucp_N || + c == CHAR_UNDERSCORE) == prop_fail_result) + break; + eptr+= len; + } + break; + + case PT_CLIST: + for (i = min; i < max; i++) + { + const pcre_uint32 *cp; + int len = 1; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + GETCHARLENTEST(c, eptr, len); + cp = PRIV(ucd_caseless_sets) + prop_value; + for (;;) + { + if (c < *cp) + { if (prop_fail_result) break; else goto GOT_MAX; } + if (c == *cp++) + { if (prop_fail_result) goto GOT_MAX; else break; } + } + eptr += len; + } + GOT_MAX: + break; + + case PT_UCNC: + for (i = min; i < max; i++) + { + int len = 1; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + GETCHARLENTEST(c, eptr, len); + if ((c == CHAR_DOLLAR_SIGN || c == CHAR_COMMERCIAL_AT || + c == CHAR_GRAVE_ACCENT || (c >= 0xa0 && c <= 0xd7ff) || + c >= 0xe000) == prop_fail_result) + break; + eptr += len; + } + break; + + default: + RRETURN(PCRE_ERROR_INTERNAL); + } + + /* eptr is now past the end of the maximum run */ + + if (possessive) continue; /* No backtracking */ + for(;;) + { + if (eptr <= pp) goto TAIL_RECURSE; + RMATCH(eptr, ecode, offset_top, md, eptrb, RM44); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + eptr--; + if (utf) BACKCHAR(eptr); + } + } + + /* Match extended Unicode grapheme clusters. We will get here only if the + support is in the binary; otherwise a compile-time error occurs. */ + + else if (ctype == OP_EXTUNI) + { + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + else + { + int lgb, rgb; + GETCHARINCTEST(c, eptr); + lgb = UCD_GRAPHBREAK(c); + while (eptr < md->end_subject) + { + int len = 1; + if (!utf) c = *eptr; else { GETCHARLEN(c, eptr, len); } + rgb = UCD_GRAPHBREAK(c); + if ((PRIV(ucp_gbtable)[lgb] & (1 << rgb)) == 0) break; + lgb = rgb; + eptr += len; + } + } + CHECK_PARTIAL(); + } + + /* eptr is now past the end of the maximum run */ + + if (possessive) continue; /* No backtracking */ + + /* We use <= pp rather than == pp to detect the start of the run while + backtracking because the use of \C in UTF mode can cause BACKCHAR to + move back past pp. This is just palliative; the use of \C in UTF mode + is fraught with danger. */ + + for(;;) + { + int lgb, rgb; + PCRE_PUCHAR fptr; + + if (eptr <= pp) goto TAIL_RECURSE; /* At start of char run */ + RMATCH(eptr, ecode, offset_top, md, eptrb, RM45); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + + /* Backtracking over an extended grapheme cluster involves inspecting + the previous two characters (if present) to see if a break is + permitted between them. */ + + eptr--; + if (!utf) c = *eptr; else + { + BACKCHAR(eptr); + GETCHAR(c, eptr); + } + rgb = UCD_GRAPHBREAK(c); + + for (;;) + { + if (eptr <= pp) goto TAIL_RECURSE; /* At start of char run */ + fptr = eptr - 1; + if (!utf) c = *fptr; else + { + BACKCHAR(fptr); + GETCHAR(c, fptr); + } + lgb = UCD_GRAPHBREAK(c); + if ((PRIV(ucp_gbtable)[lgb] & (1 << rgb)) == 0) break; + eptr = fptr; + rgb = lgb; + } + } + } + + else +#endif /* SUPPORT_UCP */ + +#ifdef SUPPORT_UTF + if (utf) + { + switch(ctype) + { + case OP_ANY: + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + if (IS_NEWLINE(eptr)) break; + if (md->partial != 0 && /* Take care with CRLF partial */ + eptr + 1 >= md->end_subject && + NLBLOCK->nltype == NLTYPE_FIXED && + NLBLOCK->nllen == 2 && + UCHAR21(eptr) == NLBLOCK->nl[0]) + { + md->hitend = TRUE; + if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL); + } + eptr++; + ACROSSCHAR(eptr < md->end_subject, *eptr, eptr++); + } + break; + + case OP_ALLANY: + if (max < INT_MAX) + { + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + eptr++; + ACROSSCHAR(eptr < md->end_subject, *eptr, eptr++); + } + } + else + { + eptr = md->end_subject; /* Unlimited UTF-8 repeat */ + SCHECK_PARTIAL(); + } + break; + + /* The byte case is the same as non-UTF8 */ + + case OP_ANYBYTE: + c = max - min; + if (c > (unsigned int)(md->end_subject - eptr)) + { + eptr = md->end_subject; + SCHECK_PARTIAL(); + } + else eptr += c; + break; + + case OP_ANYNL: + for (i = min; i < max; i++) + { + int len = 1; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + GETCHARLEN(c, eptr, len); + if (c == CHAR_CR) + { + if (++eptr >= md->end_subject) break; + if (UCHAR21(eptr) == CHAR_LF) eptr++; + } + else + { + if (c != CHAR_LF && + (md->bsr_anycrlf || + (c != CHAR_VT && c != CHAR_FF && c != CHAR_NEL +#ifndef EBCDIC + && c != 0x2028 && c != 0x2029 +#endif /* Not EBCDIC */ + ))) + break; + eptr += len; + } + } + break; + + case OP_NOT_HSPACE: + case OP_HSPACE: + for (i = min; i < max; i++) + { + BOOL gotspace; + int len = 1; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + GETCHARLEN(c, eptr, len); + switch(c) + { + HSPACE_CASES: gotspace = TRUE; break; + default: gotspace = FALSE; break; + } + if (gotspace == (ctype == OP_NOT_HSPACE)) break; + eptr += len; + } + break; + + case OP_NOT_VSPACE: + case OP_VSPACE: + for (i = min; i < max; i++) + { + BOOL gotspace; + int len = 1; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + GETCHARLEN(c, eptr, len); + switch(c) + { + VSPACE_CASES: gotspace = TRUE; break; + default: gotspace = FALSE; break; + } + if (gotspace == (ctype == OP_NOT_VSPACE)) break; + eptr += len; + } + break; + + case OP_NOT_DIGIT: + for (i = min; i < max; i++) + { + int len = 1; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + GETCHARLEN(c, eptr, len); + if (c < 256 && (md->ctypes[c] & ctype_digit) != 0) break; + eptr+= len; + } + break; + + case OP_DIGIT: + for (i = min; i < max; i++) + { + int len = 1; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + GETCHARLEN(c, eptr, len); + if (c >= 256 ||(md->ctypes[c] & ctype_digit) == 0) break; + eptr+= len; + } + break; + + case OP_NOT_WHITESPACE: + for (i = min; i < max; i++) + { + int len = 1; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + GETCHARLEN(c, eptr, len); + if (c < 256 && (md->ctypes[c] & ctype_space) != 0) break; + eptr+= len; + } + break; + + case OP_WHITESPACE: + for (i = min; i < max; i++) + { + int len = 1; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + GETCHARLEN(c, eptr, len); + if (c >= 256 ||(md->ctypes[c] & ctype_space) == 0) break; + eptr+= len; + } + break; + + case OP_NOT_WORDCHAR: + for (i = min; i < max; i++) + { + int len = 1; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + GETCHARLEN(c, eptr, len); + if (c < 256 && (md->ctypes[c] & ctype_word) != 0) break; + eptr+= len; + } + break; + + case OP_WORDCHAR: + for (i = min; i < max; i++) + { + int len = 1; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + GETCHARLEN(c, eptr, len); + if (c >= 256 || (md->ctypes[c] & ctype_word) == 0) break; + eptr+= len; + } + break; + + default: + RRETURN(PCRE_ERROR_INTERNAL); + } + + if (possessive) continue; /* No backtracking */ + for(;;) + { + if (eptr <= pp) goto TAIL_RECURSE; + RMATCH(eptr, ecode, offset_top, md, eptrb, RM46); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + eptr--; + BACKCHAR(eptr); + if (ctype == OP_ANYNL && eptr > pp && UCHAR21(eptr) == CHAR_NL && + UCHAR21(eptr - 1) == CHAR_CR) eptr--; + } + } + else +#endif /* SUPPORT_UTF */ + /* Not UTF mode */ + { + switch(ctype) + { + case OP_ANY: + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + if (IS_NEWLINE(eptr)) break; + if (md->partial != 0 && /* Take care with CRLF partial */ + eptr + 1 >= md->end_subject && + NLBLOCK->nltype == NLTYPE_FIXED && + NLBLOCK->nllen == 2 && + *eptr == NLBLOCK->nl[0]) + { + md->hitend = TRUE; + if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL); + } + eptr++; + } + break; + + case OP_ALLANY: + case OP_ANYBYTE: + c = max - min; + if (c > (unsigned int)(md->end_subject - eptr)) + { + eptr = md->end_subject; + SCHECK_PARTIAL(); + } + else eptr += c; + break; + + case OP_ANYNL: + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + c = *eptr; + if (c == CHAR_CR) + { + if (++eptr >= md->end_subject) break; + if (*eptr == CHAR_LF) eptr++; + } + else + { + if (c != CHAR_LF && (md->bsr_anycrlf || + (c != CHAR_VT && c != CHAR_FF && c != CHAR_NEL +#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32 + && c != 0x2028 && c != 0x2029 +#endif + ))) break; + eptr++; + } + } + break; + + case OP_NOT_HSPACE: + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + switch(*eptr) + { + default: eptr++; break; + HSPACE_BYTE_CASES: +#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32 + HSPACE_MULTIBYTE_CASES: +#endif + goto ENDLOOP00; + } + } + ENDLOOP00: + break; + + case OP_HSPACE: + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + switch(*eptr) + { + default: goto ENDLOOP01; + HSPACE_BYTE_CASES: +#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32 + HSPACE_MULTIBYTE_CASES: +#endif + eptr++; break; + } + } + ENDLOOP01: + break; + + case OP_NOT_VSPACE: + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + switch(*eptr) + { + default: eptr++; break; + VSPACE_BYTE_CASES: +#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32 + VSPACE_MULTIBYTE_CASES: +#endif + goto ENDLOOP02; + } + } + ENDLOOP02: + break; + + case OP_VSPACE: + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + switch(*eptr) + { + default: goto ENDLOOP03; + VSPACE_BYTE_CASES: +#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32 + VSPACE_MULTIBYTE_CASES: +#endif + eptr++; break; + } + } + ENDLOOP03: + break; + + case OP_NOT_DIGIT: + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + if (MAX_255(*eptr) && (md->ctypes[*eptr] & ctype_digit) != 0) break; + eptr++; + } + break; + + case OP_DIGIT: + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + if (!MAX_255(*eptr) || (md->ctypes[*eptr] & ctype_digit) == 0) break; + eptr++; + } + break; + + case OP_NOT_WHITESPACE: + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + if (MAX_255(*eptr) && (md->ctypes[*eptr] & ctype_space) != 0) break; + eptr++; + } + break; + + case OP_WHITESPACE: + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + if (!MAX_255(*eptr) || (md->ctypes[*eptr] & ctype_space) == 0) break; + eptr++; + } + break; + + case OP_NOT_WORDCHAR: + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + if (MAX_255(*eptr) && (md->ctypes[*eptr] & ctype_word) != 0) break; + eptr++; + } + break; + + case OP_WORDCHAR: + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + if (!MAX_255(*eptr) || (md->ctypes[*eptr] & ctype_word) == 0) break; + eptr++; + } + break; + + default: + RRETURN(PCRE_ERROR_INTERNAL); + } + + if (possessive) continue; /* No backtracking */ + for (;;) + { + if (eptr == pp) goto TAIL_RECURSE; + RMATCH(eptr, ecode, offset_top, md, eptrb, RM47); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + eptr--; + if (ctype == OP_ANYNL && eptr > pp && *eptr == CHAR_LF && + eptr[-1] == CHAR_CR) eptr--; + } + } + + /* Control never gets here */ + } + + /* There's been some horrible disaster. Arrival here can only mean there is + something seriously wrong in the code above or the OP_xxx definitions. */ + + default: + DPRINTF(("Unknown opcode %d\n", *ecode)); + RRETURN(PCRE_ERROR_UNKNOWN_OPCODE); + } + + /* Do not stick any code in here without much thought; it is assumed + that "continue" in the code above comes out to here to repeat the main + loop. */ + + } /* End of main loop */ +/* Control never reaches here */ + + +/* When compiling to use the heap rather than the stack for recursive calls to +match(), the RRETURN() macro jumps here. The number that is saved in +frame->Xwhere indicates which label we actually want to return to. */ + +#ifdef NO_RECURSE +#define LBL(val) case val: goto L_RM##val; +HEAP_RETURN: +switch (frame->Xwhere) + { + LBL( 1) LBL( 2) LBL( 3) LBL( 4) LBL( 5) LBL( 6) LBL( 7) LBL( 8) + LBL( 9) LBL(10) LBL(11) LBL(12) LBL(13) LBL(14) LBL(15) LBL(17) + LBL(19) LBL(24) LBL(25) LBL(26) LBL(27) LBL(29) LBL(31) LBL(33) + LBL(35) LBL(43) LBL(47) LBL(48) LBL(49) LBL(50) LBL(51) LBL(52) + LBL(53) LBL(54) LBL(55) LBL(56) LBL(57) LBL(58) LBL(63) LBL(64) + LBL(65) LBL(66) +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 + LBL(20) LBL(21) +#endif +#ifdef SUPPORT_UTF + LBL(16) LBL(18) + LBL(22) LBL(23) LBL(28) LBL(30) + LBL(32) LBL(34) LBL(42) LBL(46) +#ifdef SUPPORT_UCP + LBL(36) LBL(37) LBL(38) LBL(39) LBL(40) LBL(41) LBL(44) LBL(45) + LBL(59) LBL(60) LBL(61) LBL(62) LBL(67) +#endif /* SUPPORT_UCP */ +#endif /* SUPPORT_UTF */ + default: + DPRINTF(("jump error in pcre match: label %d non-existent\n", frame->Xwhere)); + return PCRE_ERROR_INTERNAL; + } +#undef LBL +#endif /* NO_RECURSE */ +} + + +/*************************************************************************** +**************************************************************************** + RECURSION IN THE match() FUNCTION + +Undefine all the macros that were defined above to handle this. */ + +#ifdef NO_RECURSE +#undef eptr +#undef ecode +#undef mstart +#undef offset_top +#undef eptrb +#undef flags + +#undef callpat +#undef charptr +#undef data +#undef next +#undef pp +#undef prev +#undef saved_eptr + +#undef new_recursive + +#undef cur_is_word +#undef condition +#undef prev_is_word + +#undef ctype +#undef length +#undef max +#undef min +#undef number +#undef offset +#undef op +#undef save_capture_last +#undef save_offset1 +#undef save_offset2 +#undef save_offset3 +#undef stacksave + +#undef newptrb + +#endif + +/* These two are defined as macros in both cases */ + +#undef fc +#undef fi + +/*************************************************************************** +***************************************************************************/ + + +#ifdef NO_RECURSE +/************************************************* +* Release allocated heap frames * +*************************************************/ + +/* This function releases all the allocated frames. The base frame is on the +machine stack, and so must not be freed. + +Argument: the address of the base frame +Returns: nothing +*/ + +static void +release_match_heapframes (heapframe *frame_base) +{ +heapframe *nextframe = frame_base->Xnextframe; +while (nextframe != NULL) + { + heapframe *oldframe = nextframe; + nextframe = nextframe->Xnextframe; + (PUBL(stack_free))(oldframe); + } +} +#endif + + +/************************************************* +* Execute a Regular Expression * +*************************************************/ + +/* This function applies a compiled re to a subject string and picks out +portions of the string if it matches. Two elements in the vector are set for +each substring: the offsets to the start and end of the substring. + +Arguments: + argument_re points to the compiled expression + extra_data points to extra data or is NULL + subject points to the subject string + length length of subject string (may contain binary zeros) + start_offset where to start in the subject string + options option bits + offsets points to a vector of ints to be filled in with offsets + offsetcount the number of elements in the vector + +Returns: > 0 => success; value is the number of elements filled in + = 0 => success, but offsets is not big enough + -1 => failed to match + < -1 => some kind of unexpected problem +*/ + +#if defined COMPILE_PCRE8 +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre_exec(const pcre *argument_re, const pcre_extra *extra_data, + PCRE_SPTR subject, int length, int start_offset, int options, int *offsets, + int offsetcount) +#elif defined COMPILE_PCRE16 +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre16_exec(const pcre16 *argument_re, const pcre16_extra *extra_data, + PCRE_SPTR16 subject, int length, int start_offset, int options, int *offsets, + int offsetcount) +#elif defined COMPILE_PCRE32 +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre32_exec(const pcre32 *argument_re, const pcre32_extra *extra_data, + PCRE_SPTR32 subject, int length, int start_offset, int options, int *offsets, + int offsetcount) +#endif +{ +int rc, ocount, arg_offset_max; +int newline; +BOOL using_temporary_offsets = FALSE; +BOOL anchored; +BOOL startline; +BOOL firstline; +BOOL utf; +BOOL has_first_char = FALSE; +BOOL has_req_char = FALSE; +pcre_uchar first_char = 0; +pcre_uchar first_char2 = 0; +pcre_uchar req_char = 0; +pcre_uchar req_char2 = 0; +match_data match_block; +match_data *md = &match_block; +const pcre_uint8 *tables; +const pcre_uint8 *start_bits = NULL; +PCRE_PUCHAR start_match = (PCRE_PUCHAR)subject + start_offset; +PCRE_PUCHAR end_subject; +PCRE_PUCHAR start_partial = NULL; +PCRE_PUCHAR match_partial = NULL; +PCRE_PUCHAR req_char_ptr = start_match - 1; + +const pcre_study_data *study; +const REAL_PCRE *re = (const REAL_PCRE *)argument_re; + +#ifdef NO_RECURSE +heapframe frame_zero; +frame_zero.Xprevframe = NULL; /* Marks the top level */ +frame_zero.Xnextframe = NULL; /* None are allocated yet */ +md->match_frames_base = &frame_zero; +#endif + +/* Check for the special magic call that measures the size of the stack used +per recursive call of match(). Without the funny casting for sizeof, a Windows +compiler gave this error: "unary minus operator applied to unsigned type, +result still unsigned". Hopefully the cast fixes that. */ + +if (re == NULL && extra_data == NULL && subject == NULL && length == -999 && + start_offset == -999) +#ifdef NO_RECURSE + return -((int)sizeof(heapframe)); +#else + return match(NULL, NULL, NULL, 0, NULL, NULL, 0); +#endif + +/* Plausibility checks */ + +if ((options & ~PUBLIC_EXEC_OPTIONS) != 0) return PCRE_ERROR_BADOPTION; +if (re == NULL || subject == NULL || (offsets == NULL && offsetcount > 0)) + return PCRE_ERROR_NULL; +if (offsetcount < 0) return PCRE_ERROR_BADCOUNT; +if (length < 0) return PCRE_ERROR_BADLENGTH; +if (start_offset < 0 || start_offset > length) return PCRE_ERROR_BADOFFSET; + +/* Check that the first field in the block is the magic number. If it is not, +return with PCRE_ERROR_BADMAGIC. However, if the magic number is equal to +REVERSED_MAGIC_NUMBER we return with PCRE_ERROR_BADENDIANNESS, which +means that the pattern is likely compiled with different endianness. */ + +if (re->magic_number != MAGIC_NUMBER) + return re->magic_number == REVERSED_MAGIC_NUMBER? + PCRE_ERROR_BADENDIANNESS:PCRE_ERROR_BADMAGIC; +if ((re->flags & PCRE_MODE) == 0) return PCRE_ERROR_BADMODE; + +/* These two settings are used in the code for checking a UTF-8 string that +follows immediately afterwards. Other values in the md block are used only +during "normal" pcre_exec() processing, not when the JIT support is in use, +so they are set up later. */ + +/* PCRE_UTF16 has the same value as PCRE_UTF8. */ +utf = md->utf = (re->options & PCRE_UTF8) != 0; +md->partial = ((options & PCRE_PARTIAL_HARD) != 0)? 2 : + ((options & PCRE_PARTIAL_SOFT) != 0)? 1 : 0; + +/* Check a UTF-8 string if required. Pass back the character offset and error +code for an invalid string if a results vector is available. */ + +#ifdef SUPPORT_UTF +if (utf && (options & PCRE_NO_UTF8_CHECK) == 0) + { + int erroroffset; + int errorcode = PRIV(valid_utf)((PCRE_PUCHAR)subject, length, &erroroffset); + if (errorcode != 0) + { + if (offsetcount >= 2) + { + offsets[0] = erroroffset; + offsets[1] = errorcode; + } +#if defined COMPILE_PCRE8 + return (errorcode <= PCRE_UTF8_ERR5 && md->partial > 1)? + PCRE_ERROR_SHORTUTF8 : PCRE_ERROR_BADUTF8; +#elif defined COMPILE_PCRE16 + return (errorcode <= PCRE_UTF16_ERR1 && md->partial > 1)? + PCRE_ERROR_SHORTUTF16 : PCRE_ERROR_BADUTF16; +#elif defined COMPILE_PCRE32 + return PCRE_ERROR_BADUTF32; +#endif + } +#if defined COMPILE_PCRE8 || defined COMPILE_PCRE16 + /* Check that a start_offset points to the start of a UTF character. */ + if (start_offset > 0 && start_offset < length && + NOT_FIRSTCHAR(((PCRE_PUCHAR)subject)[start_offset])) + return PCRE_ERROR_BADUTF8_OFFSET; +#endif + } +#endif + +/* If the pattern was successfully studied with JIT support, run the JIT +executable instead of the rest of this function. Most options must be set at +compile time for the JIT code to be usable. Fallback to the normal code path if +an unsupported flag is set. */ + +#ifdef SUPPORT_JIT +if (extra_data != NULL + && (extra_data->flags & (PCRE_EXTRA_EXECUTABLE_JIT | + PCRE_EXTRA_TABLES)) == PCRE_EXTRA_EXECUTABLE_JIT + && extra_data->executable_jit != NULL + && (options & ~PUBLIC_JIT_EXEC_OPTIONS) == 0) + { + rc = PRIV(jit_exec)(extra_data, (const pcre_uchar *)subject, length, + start_offset, options, offsets, offsetcount); + + /* PCRE_ERROR_NULL means that the selected normal or partial matching + mode is not compiled. In this case we simply fallback to interpreter. */ + + if (rc != PCRE_ERROR_JIT_BADOPTION) return rc; + } +#endif + +/* Carry on with non-JIT matching. This information is for finding all the +numbers associated with a given name, for condition testing. */ + +md->name_table = (pcre_uchar *)re + re->name_table_offset; +md->name_count = re->name_count; +md->name_entry_size = re->name_entry_size; + +/* Fish out the optional data from the extra_data structure, first setting +the default values. */ + +study = NULL; +md->match_limit = MATCH_LIMIT; +md->match_limit_recursion = MATCH_LIMIT_RECURSION; +md->callout_data = NULL; + +/* The table pointer is always in native byte order. */ + +tables = re->tables; + +/* The two limit values override the defaults, whatever their value. */ + +if (extra_data != NULL) + { + unsigned long int flags = extra_data->flags; + if ((flags & PCRE_EXTRA_STUDY_DATA) != 0) + study = (const pcre_study_data *)extra_data->study_data; + if ((flags & PCRE_EXTRA_MATCH_LIMIT) != 0) + md->match_limit = extra_data->match_limit; + if ((flags & PCRE_EXTRA_MATCH_LIMIT_RECURSION) != 0) + md->match_limit_recursion = extra_data->match_limit_recursion; + if ((flags & PCRE_EXTRA_CALLOUT_DATA) != 0) + md->callout_data = extra_data->callout_data; + if ((flags & PCRE_EXTRA_TABLES) != 0) tables = extra_data->tables; + } + +/* Limits in the regex override only if they are smaller. */ + +if ((re->flags & PCRE_MLSET) != 0 && re->limit_match < md->match_limit) + md->match_limit = re->limit_match; + +if ((re->flags & PCRE_RLSET) != 0 && + re->limit_recursion < md->match_limit_recursion) + md->match_limit_recursion = re->limit_recursion; + +/* If the exec call supplied NULL for tables, use the inbuilt ones. This +is a feature that makes it possible to save compiled regex and re-use them +in other programs later. */ + +if (tables == NULL) tables = PRIV(default_tables); + +/* Set up other data */ + +anchored = ((re->options | options) & PCRE_ANCHORED) != 0; +startline = (re->flags & PCRE_STARTLINE) != 0; +firstline = (re->options & PCRE_FIRSTLINE) != 0; + +/* The code starts after the real_pcre block and the capture name table. */ + +md->start_code = (const pcre_uchar *)re + re->name_table_offset + + re->name_count * re->name_entry_size; + +md->start_subject = (PCRE_PUCHAR)subject; +md->start_offset = start_offset; +md->end_subject = md->start_subject + length; +end_subject = md->end_subject; + +md->endonly = (re->options & PCRE_DOLLAR_ENDONLY) != 0; +md->use_ucp = (re->options & PCRE_UCP) != 0; +md->jscript_compat = (re->options & PCRE_JAVASCRIPT_COMPAT) != 0; +md->ignore_skip_arg = 0; + +/* Some options are unpacked into BOOL variables in the hope that testing +them will be faster than individual option bits. */ + +md->notbol = (options & PCRE_NOTBOL) != 0; +md->noteol = (options & PCRE_NOTEOL) != 0; +md->notempty = (options & PCRE_NOTEMPTY) != 0; +md->notempty_atstart = (options & PCRE_NOTEMPTY_ATSTART) != 0; + +md->hitend = FALSE; +md->mark = md->nomatch_mark = NULL; /* In case never set */ + +md->recursive = NULL; /* No recursion at top level */ +md->hasthen = (re->flags & PCRE_HASTHEN) != 0; + +md->lcc = tables + lcc_offset; +md->fcc = tables + fcc_offset; +md->ctypes = tables + ctypes_offset; + +/* Handle different \R options. */ + +switch (options & (PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE)) + { + case 0: + if ((re->options & (PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE)) != 0) + md->bsr_anycrlf = (re->options & PCRE_BSR_ANYCRLF) != 0; + else +#ifdef BSR_ANYCRLF + md->bsr_anycrlf = TRUE; +#else + md->bsr_anycrlf = FALSE; +#endif + break; + + case PCRE_BSR_ANYCRLF: + md->bsr_anycrlf = TRUE; + break; + + case PCRE_BSR_UNICODE: + md->bsr_anycrlf = FALSE; + break; + + default: return PCRE_ERROR_BADNEWLINE; + } + +/* Handle different types of newline. The three bits give eight cases. If +nothing is set at run time, whatever was used at compile time applies. */ + +switch ((((options & PCRE_NEWLINE_BITS) == 0)? re->options : + (pcre_uint32)options) & PCRE_NEWLINE_BITS) + { + case 0: newline = NEWLINE; break; /* Compile-time default */ + case PCRE_NEWLINE_CR: newline = CHAR_CR; break; + case PCRE_NEWLINE_LF: newline = CHAR_NL; break; + case PCRE_NEWLINE_CR+ + PCRE_NEWLINE_LF: newline = (CHAR_CR << 8) | CHAR_NL; break; + case PCRE_NEWLINE_ANY: newline = -1; break; + case PCRE_NEWLINE_ANYCRLF: newline = -2; break; + default: return PCRE_ERROR_BADNEWLINE; + } + +if (newline == -2) + { + md->nltype = NLTYPE_ANYCRLF; + } +else if (newline < 0) + { + md->nltype = NLTYPE_ANY; + } +else + { + md->nltype = NLTYPE_FIXED; + if (newline > 255) + { + md->nllen = 2; + md->nl[0] = (newline >> 8) & 255; + md->nl[1] = newline & 255; + } + else + { + md->nllen = 1; + md->nl[0] = newline; + } + } + +/* Partial matching was originally supported only for a restricted set of +regexes; from release 8.00 there are no restrictions, but the bits are still +defined (though never set). So there's no harm in leaving this code. */ + +if (md->partial && (re->flags & PCRE_NOPARTIAL) != 0) + return PCRE_ERROR_BADPARTIAL; + +/* If the expression has got more back references than the offsets supplied can +hold, we get a temporary chunk of working store to use during the matching. +Otherwise, we can use the vector supplied, rounding down its size to a multiple +of 3. */ + +ocount = offsetcount - (offsetcount % 3); +arg_offset_max = (2*ocount)/3; + +if (re->top_backref > 0 && re->top_backref >= ocount/3) + { + ocount = re->top_backref * 3 + 3; + md->offset_vector = (int *)(PUBL(malloc))(ocount * sizeof(int)); + if (md->offset_vector == NULL) return PCRE_ERROR_NOMEMORY; + using_temporary_offsets = TRUE; + DPRINTF(("Got memory to hold back references\n")); + } +else md->offset_vector = offsets; +md->offset_end = ocount; +md->offset_max = (2*ocount)/3; +md->capture_last = 0; + +/* Reset the working variable associated with each extraction. These should +never be used unless previously set, but they get saved and restored, and so we +initialize them to avoid reading uninitialized locations. Also, unset the +offsets for the matched string. This is really just for tidiness with callouts, +in case they inspect these fields. */ + +if (md->offset_vector != NULL) + { + register int *iptr = md->offset_vector + ocount; + register int *iend = iptr - re->top_bracket; + if (iend < md->offset_vector + 2) iend = md->offset_vector + 2; + while (--iptr >= iend) *iptr = -1; + if (offsetcount > 0) md->offset_vector[0] = -1; + if (offsetcount > 1) md->offset_vector[1] = -1; + } + +/* Set up the first character to match, if available. The first_char value is +never set for an anchored regular expression, but the anchoring may be forced +at run time, so we have to test for anchoring. The first char may be unset for +an unanchored pattern, of course. If there's no first char and the pattern was +studied, there may be a bitmap of possible first characters. */ + +if (!anchored) + { + if ((re->flags & PCRE_FIRSTSET) != 0) + { + has_first_char = TRUE; + first_char = first_char2 = (pcre_uchar)(re->first_char); + if ((re->flags & PCRE_FCH_CASELESS) != 0) + { + first_char2 = TABLE_GET(first_char, md->fcc, first_char); +#if defined SUPPORT_UCP && !(defined COMPILE_PCRE8) + if (utf && first_char > 127) + first_char2 = UCD_OTHERCASE(first_char); +#endif + } + } + else + if (!startline && study != NULL && + (study->flags & PCRE_STUDY_MAPPED) != 0) + start_bits = study->start_bits; + } + +/* For anchored or unanchored matches, there may be a "last known required +character" set. */ + +if ((re->flags & PCRE_REQCHSET) != 0) + { + has_req_char = TRUE; + req_char = req_char2 = (pcre_uchar)(re->req_char); + if ((re->flags & PCRE_RCH_CASELESS) != 0) + { + req_char2 = TABLE_GET(req_char, md->fcc, req_char); +#if defined SUPPORT_UCP && !(defined COMPILE_PCRE8) + if (utf && req_char > 127) + req_char2 = UCD_OTHERCASE(req_char); +#endif + } + } + + +/* ==========================================================================*/ + +/* Loop for handling unanchored repeated matching attempts; for anchored regexs +the loop runs just once. */ + +for(;;) + { + PCRE_PUCHAR save_end_subject = end_subject; + PCRE_PUCHAR new_start_match; + + /* If firstline is TRUE, the start of the match is constrained to the first + line of a multiline string. That is, the match must be before or at the first + newline. Implement this by temporarily adjusting end_subject so that we stop + scanning at a newline. If the match fails at the newline, later code breaks + this loop. */ + + if (firstline) + { + PCRE_PUCHAR t = start_match; +#ifdef SUPPORT_UTF + if (utf) + { + while (t < md->end_subject && !IS_NEWLINE(t)) + { + t++; + ACROSSCHAR(t < end_subject, *t, t++); + } + } + else +#endif + while (t < md->end_subject && !IS_NEWLINE(t)) t++; + end_subject = t; + } + + /* There are some optimizations that avoid running the match if a known + starting point is not found, or if a known later character is not present. + However, there is an option that disables these, for testing and for ensuring + that all callouts do actually occur. The option can be set in the regex by + (*NO_START_OPT) or passed in match-time options. */ + + if (((options | re->options) & PCRE_NO_START_OPTIMIZE) == 0) + { + /* Advance to a unique first char if there is one. */ + + if (has_first_char) + { + pcre_uchar smc; + + if (first_char != first_char2) + while (start_match < end_subject && + (smc = UCHAR21TEST(start_match)) != first_char && smc != first_char2) + start_match++; + else + while (start_match < end_subject && UCHAR21TEST(start_match) != first_char) + start_match++; + } + + /* Or to just after a linebreak for a multiline match */ + + else if (startline) + { + if (start_match > md->start_subject + start_offset) + { +#ifdef SUPPORT_UTF + if (utf) + { + while (start_match < end_subject && !WAS_NEWLINE(start_match)) + { + start_match++; + ACROSSCHAR(start_match < end_subject, *start_match, + start_match++); + } + } + else +#endif + while (start_match < end_subject && !WAS_NEWLINE(start_match)) + start_match++; + + /* If we have just passed a CR and the newline option is ANY or ANYCRLF, + and we are now at a LF, advance the match position by one more character. + */ + + if (start_match[-1] == CHAR_CR && + (md->nltype == NLTYPE_ANY || md->nltype == NLTYPE_ANYCRLF) && + start_match < end_subject && + UCHAR21TEST(start_match) == CHAR_NL) + start_match++; + } + } + + /* Or to a non-unique first byte after study */ + + else if (start_bits != NULL) + { + while (start_match < end_subject) + { + register pcre_uint32 c = UCHAR21TEST(start_match); +#ifndef COMPILE_PCRE8 + if (c > 255) c = 255; +#endif + if ((start_bits[c/8] & (1 << (c&7))) != 0) break; + start_match++; + } + } + } /* Starting optimizations */ + + /* Restore fudged end_subject */ + + end_subject = save_end_subject; + + /* The following two optimizations are disabled for partial matching or if + disabling is explicitly requested. */ + + if (((options | re->options) & PCRE_NO_START_OPTIMIZE) == 0 && !md->partial) + { + /* If the pattern was studied, a minimum subject length may be set. This is + a lower bound; no actual string of that length may actually match the + pattern. Although the value is, strictly, in characters, we treat it as + bytes to avoid spending too much time in this optimization. */ + + if (study != NULL && (study->flags & PCRE_STUDY_MINLEN) != 0 && + (pcre_uint32)(end_subject - start_match) < study->minlength) + { + rc = MATCH_NOMATCH; + break; + } + + /* If req_char is set, we know that that character must appear in the + subject for the match to succeed. If the first character is set, req_char + must be later in the subject; otherwise the test starts at the match point. + This optimization can save a huge amount of backtracking in patterns with + nested unlimited repeats that aren't going to match. Writing separate code + for cased/caseless versions makes it go faster, as does using an + autoincrement and backing off on a match. + + HOWEVER: when the subject string is very, very long, searching to its end + can take a long time, and give bad performance on quite ordinary patterns. + This showed up when somebody was matching something like /^\d+C/ on a + 32-megabyte string... so we don't do this when the string is sufficiently + long. */ + + if (has_req_char && end_subject - start_match < REQ_BYTE_MAX) + { + register PCRE_PUCHAR p = start_match + (has_first_char? 1:0); + + /* We don't need to repeat the search if we haven't yet reached the + place we found it at last time. */ + + if (p > req_char_ptr) + { + if (req_char != req_char2) + { + while (p < end_subject) + { + register pcre_uint32 pp = UCHAR21INCTEST(p); + if (pp == req_char || pp == req_char2) { p--; break; } + } + } + else + { + while (p < end_subject) + { + if (UCHAR21INCTEST(p) == req_char) { p--; break; } + } + } + + /* If we can't find the required character, break the matching loop, + forcing a match failure. */ + + if (p >= end_subject) + { + rc = MATCH_NOMATCH; + break; + } + + /* If we have found the required character, save the point where we + found it, so that we don't search again next time round the loop if + the start hasn't passed this character yet. */ + + req_char_ptr = p; + } + } + } + +#ifdef PCRE_DEBUG /* Sigh. Some compilers never learn. */ + printf(">>>> Match against: "); + pchars(start_match, end_subject - start_match, TRUE, md); + printf("\n"); +#endif + + /* OK, we can now run the match. If "hitend" is set afterwards, remember the + first starting point for which a partial match was found. */ + + md->start_match_ptr = start_match; + md->start_used_ptr = start_match; + md->match_call_count = 0; + md->match_function_type = 0; + md->end_offset_top = 0; + md->skip_arg_count = 0; + rc = match(start_match, md->start_code, start_match, 2, md, NULL, 0); + if (md->hitend && start_partial == NULL) + { + start_partial = md->start_used_ptr; + match_partial = start_match; + } + + switch(rc) + { + /* If MATCH_SKIP_ARG reaches this level it means that a MARK that matched + the SKIP's arg was not found. In this circumstance, Perl ignores the SKIP + entirely. The only way we can do that is to re-do the match at the same + point, with a flag to force SKIP with an argument to be ignored. Just + treating this case as NOMATCH does not work because it does not check other + alternatives in patterns such as A(*SKIP:A)B|AC when the subject is AC. */ + + case MATCH_SKIP_ARG: + new_start_match = start_match; + md->ignore_skip_arg = md->skip_arg_count; + break; + + /* SKIP passes back the next starting point explicitly, but if it is no + greater than the match we have just done, treat it as NOMATCH. */ + + case MATCH_SKIP: + if (md->start_match_ptr > start_match) + { + new_start_match = md->start_match_ptr; + break; + } + /* Fall through */ + + /* NOMATCH and PRUNE advance by one character. THEN at this level acts + exactly like PRUNE. Unset ignore SKIP-with-argument. */ + + case MATCH_NOMATCH: + case MATCH_PRUNE: + case MATCH_THEN: + md->ignore_skip_arg = 0; + new_start_match = start_match + 1; +#ifdef SUPPORT_UTF + if (utf) + ACROSSCHAR(new_start_match < end_subject, *new_start_match, + new_start_match++); +#endif + break; + + /* COMMIT disables the bumpalong, but otherwise behaves as NOMATCH. */ + + case MATCH_COMMIT: + rc = MATCH_NOMATCH; + goto ENDLOOP; + + /* Any other return is either a match, or some kind of error. */ + + default: + goto ENDLOOP; + } + + /* Control reaches here for the various types of "no match at this point" + result. Reset the code to MATCH_NOMATCH for subsequent checking. */ + + rc = MATCH_NOMATCH; + + /* If PCRE_FIRSTLINE is set, the match must happen before or at the first + newline in the subject (though it may continue over the newline). Therefore, + if we have just failed to match, starting at a newline, do not continue. */ + + if (firstline && IS_NEWLINE(start_match)) break; + + /* Advance to new matching position */ + + start_match = new_start_match; + + /* Break the loop if the pattern is anchored or if we have passed the end of + the subject. */ + + if (anchored || start_match > end_subject) break; + + /* If we have just passed a CR and we are now at a LF, and the pattern does + not contain any explicit matches for \r or \n, and the newline option is CRLF + or ANY or ANYCRLF, advance the match position by one more character. In + normal matching start_match will aways be greater than the first position at + this stage, but a failed *SKIP can cause a return at the same point, which is + why the first test exists. */ + + if (start_match > (PCRE_PUCHAR)subject + start_offset && + start_match[-1] == CHAR_CR && + start_match < end_subject && + *start_match == CHAR_NL && + (re->flags & PCRE_HASCRORLF) == 0 && + (md->nltype == NLTYPE_ANY || + md->nltype == NLTYPE_ANYCRLF || + md->nllen == 2)) + start_match++; + + md->mark = NULL; /* Reset for start of next match attempt */ + } /* End of for(;;) "bumpalong" loop */ + +/* ==========================================================================*/ + +/* We reach here when rc is not MATCH_NOMATCH, or if one of the stopping +conditions is true: + +(1) The pattern is anchored or the match was failed by (*COMMIT); + +(2) We are past the end of the subject; + +(3) PCRE_FIRSTLINE is set and we have failed to match at a newline, because + this option requests that a match occur at or before the first newline in + the subject. + +When we have a match and the offset vector is big enough to deal with any +backreferences, captured substring offsets will already be set up. In the case +where we had to get some local store to hold offsets for backreference +processing, copy those that we can. In this case there need not be overflow if +certain parts of the pattern were not used, even though there are more +capturing parentheses than vector slots. */ + +ENDLOOP: + +if (rc == MATCH_MATCH || rc == MATCH_ACCEPT) + { + if (using_temporary_offsets) + { + if (arg_offset_max >= 4) + { + memcpy(offsets + 2, md->offset_vector + 2, + (arg_offset_max - 2) * sizeof(int)); + DPRINTF(("Copied offsets from temporary memory\n")); + } + if (md->end_offset_top > arg_offset_max) md->capture_last |= OVFLBIT; + DPRINTF(("Freeing temporary memory\n")); + (PUBL(free))(md->offset_vector); + } + + /* Set the return code to the number of captured strings, or 0 if there were + too many to fit into the vector. */ + + rc = ((md->capture_last & OVFLBIT) != 0 && + md->end_offset_top >= arg_offset_max)? + 0 : md->end_offset_top/2; + + /* If there is space in the offset vector, set any unused pairs at the end of + the pattern to -1 for backwards compatibility. It is documented that this + happens. In earlier versions, the whole set of potential capturing offsets + was set to -1 each time round the loop, but this is handled differently now. + "Gaps" are set to -1 dynamically instead (this fixes a bug). Thus, it is only + those at the end that need unsetting here. We can't just unset them all at + the start of the whole thing because they may get set in one branch that is + not the final matching branch. */ + + if (md->end_offset_top/2 <= re->top_bracket && offsets != NULL) + { + register int *iptr, *iend; + int resetcount = 2 + re->top_bracket * 2; + if (resetcount > offsetcount) resetcount = offsetcount; + iptr = offsets + md->end_offset_top; + iend = offsets + resetcount; + while (iptr < iend) *iptr++ = -1; + } + + /* If there is space, set up the whole thing as substring 0. The value of + md->start_match_ptr might be modified if \K was encountered on the success + matching path. */ + + if (offsetcount < 2) rc = 0; else + { + offsets[0] = (int)(md->start_match_ptr - md->start_subject); + offsets[1] = (int)(md->end_match_ptr - md->start_subject); + } + + /* Return MARK data if requested */ + + if (extra_data != NULL && (extra_data->flags & PCRE_EXTRA_MARK) != 0) + *(extra_data->mark) = (pcre_uchar *)md->mark; + DPRINTF((">>>> returning %d\n", rc)); +#ifdef NO_RECURSE + release_match_heapframes(&frame_zero); +#endif + return rc; + } + +/* Control gets here if there has been an error, or if the overall match +attempt has failed at all permitted starting positions. */ + +if (using_temporary_offsets) + { + DPRINTF(("Freeing temporary memory\n")); + (PUBL(free))(md->offset_vector); + } + +/* For anything other than nomatch or partial match, just return the code. */ + +if (rc != MATCH_NOMATCH && rc != PCRE_ERROR_PARTIAL) + { + DPRINTF((">>>> error: returning %d\n", rc)); +#ifdef NO_RECURSE + release_match_heapframes(&frame_zero); +#endif + return rc; + } + +/* Handle partial matches - disable any mark data */ + +if (match_partial != NULL) + { + DPRINTF((">>>> returning PCRE_ERROR_PARTIAL\n")); + md->mark = NULL; + if (offsetcount > 1) + { + offsets[0] = (int)(start_partial - (PCRE_PUCHAR)subject); + offsets[1] = (int)(end_subject - (PCRE_PUCHAR)subject); + if (offsetcount > 2) + offsets[2] = (int)(match_partial - (PCRE_PUCHAR)subject); + } + rc = PCRE_ERROR_PARTIAL; + } + +/* This is the classic nomatch case */ + +else + { + DPRINTF((">>>> returning PCRE_ERROR_NOMATCH\n")); + rc = PCRE_ERROR_NOMATCH; + } + +/* Return the MARK data if it has been requested. */ + +if (extra_data != NULL && (extra_data->flags & PCRE_EXTRA_MARK) != 0) + *(extra_data->mark) = (pcre_uchar *)md->nomatch_mark; +#ifdef NO_RECURSE + release_match_heapframes(&frame_zero); +#endif +return rc; +} + +/* End of pcre_exec.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_fullinfo.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_fullinfo.c new file mode 100755 index 000000000..a6c2ece6c --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_fullinfo.c @@ -0,0 +1,245 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2013 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + + +/* This module contains the external function pcre_fullinfo(), which returns +information about a compiled pattern. */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "pcre_internal.h" + + +/************************************************* +* Return info about compiled pattern * +*************************************************/ + +/* This is a newer "info" function which has an extensible interface so +that additional items can be added compatibly. + +Arguments: + argument_re points to compiled code + extra_data points extra data, or NULL + what what information is required + where where to put the information + +Returns: 0 if data returned, negative on error +*/ + +#if defined COMPILE_PCRE8 +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre_fullinfo(const pcre *argument_re, const pcre_extra *extra_data, + int what, void *where) +#elif defined COMPILE_PCRE16 +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre16_fullinfo(const pcre16 *argument_re, const pcre16_extra *extra_data, + int what, void *where) +#elif defined COMPILE_PCRE32 +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre32_fullinfo(const pcre32 *argument_re, const pcre32_extra *extra_data, + int what, void *where) +#endif +{ +const REAL_PCRE *re = (const REAL_PCRE *)argument_re; +const pcre_study_data *study = NULL; + +if (re == NULL || where == NULL) return PCRE_ERROR_NULL; + +if (extra_data != NULL && (extra_data->flags & PCRE_EXTRA_STUDY_DATA) != 0) + study = (const pcre_study_data *)extra_data->study_data; + +/* Check that the first field in the block is the magic number. If it is not, +return with PCRE_ERROR_BADMAGIC. However, if the magic number is equal to +REVERSED_MAGIC_NUMBER we return with PCRE_ERROR_BADENDIANNESS, which +means that the pattern is likely compiled with different endianness. */ + +if (re->magic_number != MAGIC_NUMBER) + return re->magic_number == REVERSED_MAGIC_NUMBER? + PCRE_ERROR_BADENDIANNESS:PCRE_ERROR_BADMAGIC; + +/* Check that this pattern was compiled in the correct bit mode */ + +if ((re->flags & PCRE_MODE) == 0) return PCRE_ERROR_BADMODE; + +switch (what) + { + case PCRE_INFO_OPTIONS: + *((unsigned long int *)where) = re->options & PUBLIC_COMPILE_OPTIONS; + break; + + case PCRE_INFO_SIZE: + *((size_t *)where) = re->size; + break; + + case PCRE_INFO_STUDYSIZE: + *((size_t *)where) = (study == NULL)? 0 : study->size; + break; + + case PCRE_INFO_JITSIZE: +#ifdef SUPPORT_JIT + *((size_t *)where) = + (extra_data != NULL && + (extra_data->flags & PCRE_EXTRA_EXECUTABLE_JIT) != 0 && + extra_data->executable_jit != NULL)? + PRIV(jit_get_size)(extra_data->executable_jit) : 0; +#else + *((size_t *)where) = 0; +#endif + break; + + case PCRE_INFO_CAPTURECOUNT: + *((int *)where) = re->top_bracket; + break; + + case PCRE_INFO_BACKREFMAX: + *((int *)where) = re->top_backref; + break; + + case PCRE_INFO_FIRSTBYTE: + *((int *)where) = + ((re->flags & PCRE_FIRSTSET) != 0)? (int)re->first_char : + ((re->flags & PCRE_STARTLINE) != 0)? -1 : -2; + break; + + case PCRE_INFO_FIRSTCHARACTER: + *((pcre_uint32 *)where) = + (re->flags & PCRE_FIRSTSET) != 0 ? re->first_char : 0; + break; + + case PCRE_INFO_FIRSTCHARACTERFLAGS: + *((int *)where) = + ((re->flags & PCRE_FIRSTSET) != 0) ? 1 : + ((re->flags & PCRE_STARTLINE) != 0) ? 2 : 0; + break; + + /* Make sure we pass back the pointer to the bit vector in the external + block, not the internal copy (with flipped integer fields). */ + + case PCRE_INFO_FIRSTTABLE: + *((const pcre_uint8 **)where) = + (study != NULL && (study->flags & PCRE_STUDY_MAPPED) != 0)? + ((const pcre_study_data *)extra_data->study_data)->start_bits : NULL; + break; + + case PCRE_INFO_MINLENGTH: + *((int *)where) = + (study != NULL && (study->flags & PCRE_STUDY_MINLEN) != 0)? + (int)(study->minlength) : -1; + break; + + case PCRE_INFO_JIT: + *((int *)where) = extra_data != NULL && + (extra_data->flags & PCRE_EXTRA_EXECUTABLE_JIT) != 0 && + extra_data->executable_jit != NULL; + break; + + case PCRE_INFO_LASTLITERAL: + *((int *)where) = + ((re->flags & PCRE_REQCHSET) != 0)? (int)re->req_char : -1; + break; + + case PCRE_INFO_REQUIREDCHAR: + *((pcre_uint32 *)where) = + ((re->flags & PCRE_REQCHSET) != 0) ? re->req_char : 0; + break; + + case PCRE_INFO_REQUIREDCHARFLAGS: + *((int *)where) = + ((re->flags & PCRE_REQCHSET) != 0); + break; + + case PCRE_INFO_NAMEENTRYSIZE: + *((int *)where) = re->name_entry_size; + break; + + case PCRE_INFO_NAMECOUNT: + *((int *)where) = re->name_count; + break; + + case PCRE_INFO_NAMETABLE: + *((const pcre_uchar **)where) = (const pcre_uchar *)re + re->name_table_offset; + break; + + case PCRE_INFO_DEFAULT_TABLES: + *((const pcre_uint8 **)where) = (const pcre_uint8 *)(PRIV(default_tables)); + break; + + /* From release 8.00 this will always return TRUE because NOPARTIAL is + no longer ever set (the restrictions have been removed). */ + + case PCRE_INFO_OKPARTIAL: + *((int *)where) = (re->flags & PCRE_NOPARTIAL) == 0; + break; + + case PCRE_INFO_JCHANGED: + *((int *)where) = (re->flags & PCRE_JCHANGED) != 0; + break; + + case PCRE_INFO_HASCRORLF: + *((int *)where) = (re->flags & PCRE_HASCRORLF) != 0; + break; + + case PCRE_INFO_MAXLOOKBEHIND: + *((int *)where) = re->max_lookbehind; + break; + + case PCRE_INFO_MATCHLIMIT: + if ((re->flags & PCRE_MLSET) == 0) return PCRE_ERROR_UNSET; + *((pcre_uint32 *)where) = re->limit_match; + break; + + case PCRE_INFO_RECURSIONLIMIT: + if ((re->flags & PCRE_RLSET) == 0) return PCRE_ERROR_UNSET; + *((pcre_uint32 *)where) = re->limit_recursion; + break; + + case PCRE_INFO_MATCH_EMPTY: + *((int *)where) = (re->flags & PCRE_MATCH_EMPTY) != 0; + break; + + default: return PCRE_ERROR_BADOPTION; + } + +return 0; +} + +/* End of pcre_fullinfo.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_get.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_get.c new file mode 100755 index 000000000..9475d5e88 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_get.c @@ -0,0 +1,669 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + + +/* This module contains some convenience functions for extracting substrings +from the subject string after a regex match has succeeded. The original idea +for these functions came from Scott Wimer. */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "pcre_internal.h" + + +/************************************************* +* Find number for named string * +*************************************************/ + +/* This function is used by the get_first_set() function below, as well +as being generally available. It assumes that names are unique. + +Arguments: + code the compiled regex + stringname the name whose number is required + +Returns: the number of the named parentheses, or a negative number + (PCRE_ERROR_NOSUBSTRING) if not found +*/ + +#if defined COMPILE_PCRE8 +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre_get_stringnumber(const pcre *code, const char *stringname) +#elif defined COMPILE_PCRE16 +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre16_get_stringnumber(const pcre16 *code, PCRE_SPTR16 stringname) +#elif defined COMPILE_PCRE32 +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre32_get_stringnumber(const pcre32 *code, PCRE_SPTR32 stringname) +#endif +{ +int rc; +int entrysize; +int top, bot; +pcre_uchar *nametable; + +#ifdef COMPILE_PCRE8 +if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0) + return rc; +if (top <= 0) return PCRE_ERROR_NOSUBSTRING; + +if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0) + return rc; +if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0) + return rc; +#endif +#ifdef COMPILE_PCRE16 +if ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0) + return rc; +if (top <= 0) return PCRE_ERROR_NOSUBSTRING; + +if ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0) + return rc; +if ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0) + return rc; +#endif +#ifdef COMPILE_PCRE32 +if ((rc = pcre32_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0) + return rc; +if (top <= 0) return PCRE_ERROR_NOSUBSTRING; + +if ((rc = pcre32_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0) + return rc; +if ((rc = pcre32_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0) + return rc; +#endif + +bot = 0; +while (top > bot) + { + int mid = (top + bot) / 2; + pcre_uchar *entry = nametable + entrysize*mid; + int c = STRCMP_UC_UC((pcre_uchar *)stringname, + (pcre_uchar *)(entry + IMM2_SIZE)); + if (c == 0) return GET2(entry, 0); + if (c > 0) bot = mid + 1; else top = mid; + } + +return PCRE_ERROR_NOSUBSTRING; +} + + + +/************************************************* +* Find (multiple) entries for named string * +*************************************************/ + +/* This is used by the get_first_set() function below, as well as being +generally available. It is used when duplicated names are permitted. + +Arguments: + code the compiled regex + stringname the name whose entries required + firstptr where to put the pointer to the first entry + lastptr where to put the pointer to the last entry + +Returns: the length of each entry, or a negative number + (PCRE_ERROR_NOSUBSTRING) if not found +*/ + +#if defined COMPILE_PCRE8 +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre_get_stringtable_entries(const pcre *code, const char *stringname, + char **firstptr, char **lastptr) +#elif defined COMPILE_PCRE16 +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre16_get_stringtable_entries(const pcre16 *code, PCRE_SPTR16 stringname, + PCRE_UCHAR16 **firstptr, PCRE_UCHAR16 **lastptr) +#elif defined COMPILE_PCRE32 +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre32_get_stringtable_entries(const pcre32 *code, PCRE_SPTR32 stringname, + PCRE_UCHAR32 **firstptr, PCRE_UCHAR32 **lastptr) +#endif +{ +int rc; +int entrysize; +int top, bot; +pcre_uchar *nametable, *lastentry; + +#ifdef COMPILE_PCRE8 +if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0) + return rc; +if (top <= 0) return PCRE_ERROR_NOSUBSTRING; + +if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0) + return rc; +if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0) + return rc; +#endif +#ifdef COMPILE_PCRE16 +if ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0) + return rc; +if (top <= 0) return PCRE_ERROR_NOSUBSTRING; + +if ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0) + return rc; +if ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0) + return rc; +#endif +#ifdef COMPILE_PCRE32 +if ((rc = pcre32_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0) + return rc; +if (top <= 0) return PCRE_ERROR_NOSUBSTRING; + +if ((rc = pcre32_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0) + return rc; +if ((rc = pcre32_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0) + return rc; +#endif + +lastentry = nametable + entrysize * (top - 1); +bot = 0; +while (top > bot) + { + int mid = (top + bot) / 2; + pcre_uchar *entry = nametable + entrysize*mid; + int c = STRCMP_UC_UC((pcre_uchar *)stringname, + (pcre_uchar *)(entry + IMM2_SIZE)); + if (c == 0) + { + pcre_uchar *first = entry; + pcre_uchar *last = entry; + while (first > nametable) + { + if (STRCMP_UC_UC((pcre_uchar *)stringname, + (pcre_uchar *)(first - entrysize + IMM2_SIZE)) != 0) break; + first -= entrysize; + } + while (last < lastentry) + { + if (STRCMP_UC_UC((pcre_uchar *)stringname, + (pcre_uchar *)(last + entrysize + IMM2_SIZE)) != 0) break; + last += entrysize; + } +#if defined COMPILE_PCRE8 + *firstptr = (char *)first; + *lastptr = (char *)last; +#elif defined COMPILE_PCRE16 + *firstptr = (PCRE_UCHAR16 *)first; + *lastptr = (PCRE_UCHAR16 *)last; +#elif defined COMPILE_PCRE32 + *firstptr = (PCRE_UCHAR32 *)first; + *lastptr = (PCRE_UCHAR32 *)last; +#endif + return entrysize; + } + if (c > 0) bot = mid + 1; else top = mid; + } + +return PCRE_ERROR_NOSUBSTRING; +} + + + +/************************************************* +* Find first set of multiple named strings * +*************************************************/ + +/* This function allows for duplicate names in the table of named substrings. +It returns the number of the first one that was set in a pattern match. + +Arguments: + code the compiled regex + stringname the name of the capturing substring + ovector the vector of matched substrings + stringcount number of captured substrings + +Returns: the number of the first that is set, + or the number of the last one if none are set, + or a negative number on error +*/ + +#if defined COMPILE_PCRE8 +static int +get_first_set(const pcre *code, const char *stringname, int *ovector, + int stringcount) +#elif defined COMPILE_PCRE16 +static int +get_first_set(const pcre16 *code, PCRE_SPTR16 stringname, int *ovector, + int stringcount) +#elif defined COMPILE_PCRE32 +static int +get_first_set(const pcre32 *code, PCRE_SPTR32 stringname, int *ovector, + int stringcount) +#endif +{ +const REAL_PCRE *re = (const REAL_PCRE *)code; +int entrysize; +pcre_uchar *entry; +#if defined COMPILE_PCRE8 +char *first, *last; +#elif defined COMPILE_PCRE16 +PCRE_UCHAR16 *first, *last; +#elif defined COMPILE_PCRE32 +PCRE_UCHAR32 *first, *last; +#endif + +#if defined COMPILE_PCRE8 +if ((re->options & PCRE_DUPNAMES) == 0 && (re->flags & PCRE_JCHANGED) == 0) + return pcre_get_stringnumber(code, stringname); +entrysize = pcre_get_stringtable_entries(code, stringname, &first, &last); +#elif defined COMPILE_PCRE16 +if ((re->options & PCRE_DUPNAMES) == 0 && (re->flags & PCRE_JCHANGED) == 0) + return pcre16_get_stringnumber(code, stringname); +entrysize = pcre16_get_stringtable_entries(code, stringname, &first, &last); +#elif defined COMPILE_PCRE32 +if ((re->options & PCRE_DUPNAMES) == 0 && (re->flags & PCRE_JCHANGED) == 0) + return pcre32_get_stringnumber(code, stringname); +entrysize = pcre32_get_stringtable_entries(code, stringname, &first, &last); +#endif +if (entrysize <= 0) return entrysize; +for (entry = (pcre_uchar *)first; entry <= (pcre_uchar *)last; entry += entrysize) + { + int n = GET2(entry, 0); + if (n < stringcount && ovector[n*2] >= 0) return n; + } +return GET2(entry, 0); +} + + + + +/************************************************* +* Copy captured string to given buffer * +*************************************************/ + +/* This function copies a single captured substring into a given buffer. +Note that we use memcpy() rather than strncpy() in case there are binary zeros +in the string. + +Arguments: + subject the subject string that was matched + ovector pointer to the offsets table + stringcount the number of substrings that were captured + (i.e. the yield of the pcre_exec call, unless + that was zero, in which case it should be 1/3 + of the offset table size) + stringnumber the number of the required substring + buffer where to put the substring + size the size of the buffer + +Returns: if successful: + the length of the copied string, not including the zero + that is put on the end; can be zero + if not successful: + PCRE_ERROR_NOMEMORY (-6) buffer too small + PCRE_ERROR_NOSUBSTRING (-7) no such captured substring +*/ + +#if defined COMPILE_PCRE8 +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre_copy_substring(const char *subject, int *ovector, int stringcount, + int stringnumber, char *buffer, int size) +#elif defined COMPILE_PCRE16 +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre16_copy_substring(PCRE_SPTR16 subject, int *ovector, int stringcount, + int stringnumber, PCRE_UCHAR16 *buffer, int size) +#elif defined COMPILE_PCRE32 +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre32_copy_substring(PCRE_SPTR32 subject, int *ovector, int stringcount, + int stringnumber, PCRE_UCHAR32 *buffer, int size) +#endif +{ +int yield; +if (stringnumber < 0 || stringnumber >= stringcount) + return PCRE_ERROR_NOSUBSTRING; +stringnumber *= 2; +yield = ovector[stringnumber+1] - ovector[stringnumber]; +if (size < yield + 1) return PCRE_ERROR_NOMEMORY; +memcpy(buffer, subject + ovector[stringnumber], IN_UCHARS(yield)); +buffer[yield] = 0; +return yield; +} + + + +/************************************************* +* Copy named captured string to given buffer * +*************************************************/ + +/* This function copies a single captured substring into a given buffer, +identifying it by name. If the regex permits duplicate names, the first +substring that is set is chosen. + +Arguments: + code the compiled regex + subject the subject string that was matched + ovector pointer to the offsets table + stringcount the number of substrings that were captured + (i.e. the yield of the pcre_exec call, unless + that was zero, in which case it should be 1/3 + of the offset table size) + stringname the name of the required substring + buffer where to put the substring + size the size of the buffer + +Returns: if successful: + the length of the copied string, not including the zero + that is put on the end; can be zero + if not successful: + PCRE_ERROR_NOMEMORY (-6) buffer too small + PCRE_ERROR_NOSUBSTRING (-7) no such captured substring +*/ + +#if defined COMPILE_PCRE8 +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre_copy_named_substring(const pcre *code, const char *subject, + int *ovector, int stringcount, const char *stringname, + char *buffer, int size) +#elif defined COMPILE_PCRE16 +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre16_copy_named_substring(const pcre16 *code, PCRE_SPTR16 subject, + int *ovector, int stringcount, PCRE_SPTR16 stringname, + PCRE_UCHAR16 *buffer, int size) +#elif defined COMPILE_PCRE32 +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre32_copy_named_substring(const pcre32 *code, PCRE_SPTR32 subject, + int *ovector, int stringcount, PCRE_SPTR32 stringname, + PCRE_UCHAR32 *buffer, int size) +#endif +{ +int n = get_first_set(code, stringname, ovector, stringcount); +if (n <= 0) return n; +#if defined COMPILE_PCRE8 +return pcre_copy_substring(subject, ovector, stringcount, n, buffer, size); +#elif defined COMPILE_PCRE16 +return pcre16_copy_substring(subject, ovector, stringcount, n, buffer, size); +#elif defined COMPILE_PCRE32 +return pcre32_copy_substring(subject, ovector, stringcount, n, buffer, size); +#endif +} + + + +/************************************************* +* Copy all captured strings to new store * +*************************************************/ + +/* This function gets one chunk of store and builds a list of pointers and all +of the captured substrings in it. A NULL pointer is put on the end of the list. + +Arguments: + subject the subject string that was matched + ovector pointer to the offsets table + stringcount the number of substrings that were captured + (i.e. the yield of the pcre_exec call, unless + that was zero, in which case it should be 1/3 + of the offset table size) + listptr set to point to the list of pointers + +Returns: if successful: 0 + if not successful: + PCRE_ERROR_NOMEMORY (-6) failed to get store +*/ + +#if defined COMPILE_PCRE8 +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre_get_substring_list(const char *subject, int *ovector, int stringcount, + const char ***listptr) +#elif defined COMPILE_PCRE16 +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre16_get_substring_list(PCRE_SPTR16 subject, int *ovector, int stringcount, + PCRE_SPTR16 **listptr) +#elif defined COMPILE_PCRE32 +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre32_get_substring_list(PCRE_SPTR32 subject, int *ovector, int stringcount, + PCRE_SPTR32 **listptr) +#endif +{ +int i; +int size = sizeof(pcre_uchar *); +int double_count = stringcount * 2; +pcre_uchar **stringlist; +pcre_uchar *p; + +for (i = 0; i < double_count; i += 2) + { + size += sizeof(pcre_uchar *) + IN_UCHARS(1); + if (ovector[i+1] > ovector[i]) size += IN_UCHARS(ovector[i+1] - ovector[i]); + } + +stringlist = (pcre_uchar **)(PUBL(malloc))(size); +if (stringlist == NULL) return PCRE_ERROR_NOMEMORY; + +#if defined COMPILE_PCRE8 +*listptr = (const char **)stringlist; +#elif defined COMPILE_PCRE16 +*listptr = (PCRE_SPTR16 *)stringlist; +#elif defined COMPILE_PCRE32 +*listptr = (PCRE_SPTR32 *)stringlist; +#endif +p = (pcre_uchar *)(stringlist + stringcount + 1); + +for (i = 0; i < double_count; i += 2) + { + int len = (ovector[i+1] > ovector[i])? (ovector[i+1] - ovector[i]) : 0; + memcpy(p, subject + ovector[i], IN_UCHARS(len)); + *stringlist++ = p; + p += len; + *p++ = 0; + } + +*stringlist = NULL; +return 0; +} + + + +/************************************************* +* Free store obtained by get_substring_list * +*************************************************/ + +/* This function exists for the benefit of people calling PCRE from non-C +programs that can call its functions, but not free() or (PUBL(free))() +directly. + +Argument: the result of a previous pcre_get_substring_list() +Returns: nothing +*/ + +#if defined COMPILE_PCRE8 +PCRE_EXP_DEFN void PCRE_CALL_CONVENTION +pcre_free_substring_list(const char **pointer) +#elif defined COMPILE_PCRE16 +PCRE_EXP_DEFN void PCRE_CALL_CONVENTION +pcre16_free_substring_list(PCRE_SPTR16 *pointer) +#elif defined COMPILE_PCRE32 +PCRE_EXP_DEFN void PCRE_CALL_CONVENTION +pcre32_free_substring_list(PCRE_SPTR32 *pointer) +#endif +{ +(PUBL(free))((void *)pointer); +} + + + +/************************************************* +* Copy captured string to new store * +*************************************************/ + +/* This function copies a single captured substring into a piece of new +store + +Arguments: + subject the subject string that was matched + ovector pointer to the offsets table + stringcount the number of substrings that were captured + (i.e. the yield of the pcre_exec call, unless + that was zero, in which case it should be 1/3 + of the offset table size) + stringnumber the number of the required substring + stringptr where to put a pointer to the substring + +Returns: if successful: + the length of the string, not including the zero that + is put on the end; can be zero + if not successful: + PCRE_ERROR_NOMEMORY (-6) failed to get store + PCRE_ERROR_NOSUBSTRING (-7) substring not present +*/ + +#if defined COMPILE_PCRE8 +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre_get_substring(const char *subject, int *ovector, int stringcount, + int stringnumber, const char **stringptr) +#elif defined COMPILE_PCRE16 +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre16_get_substring(PCRE_SPTR16 subject, int *ovector, int stringcount, + int stringnumber, PCRE_SPTR16 *stringptr) +#elif defined COMPILE_PCRE32 +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre32_get_substring(PCRE_SPTR32 subject, int *ovector, int stringcount, + int stringnumber, PCRE_SPTR32 *stringptr) +#endif +{ +int yield; +pcre_uchar *substring; +if (stringnumber < 0 || stringnumber >= stringcount) + return PCRE_ERROR_NOSUBSTRING; +stringnumber *= 2; +yield = ovector[stringnumber+1] - ovector[stringnumber]; +substring = (pcre_uchar *)(PUBL(malloc))(IN_UCHARS(yield + 1)); +if (substring == NULL) return PCRE_ERROR_NOMEMORY; +memcpy(substring, subject + ovector[stringnumber], IN_UCHARS(yield)); +substring[yield] = 0; +#if defined COMPILE_PCRE8 +*stringptr = (const char *)substring; +#elif defined COMPILE_PCRE16 +*stringptr = (PCRE_SPTR16)substring; +#elif defined COMPILE_PCRE32 +*stringptr = (PCRE_SPTR32)substring; +#endif +return yield; +} + + + +/************************************************* +* Copy named captured string to new store * +*************************************************/ + +/* This function copies a single captured substring, identified by name, into +new store. If the regex permits duplicate names, the first substring that is +set is chosen. + +Arguments: + code the compiled regex + subject the subject string that was matched + ovector pointer to the offsets table + stringcount the number of substrings that were captured + (i.e. the yield of the pcre_exec call, unless + that was zero, in which case it should be 1/3 + of the offset table size) + stringname the name of the required substring + stringptr where to put the pointer + +Returns: if successful: + the length of the copied string, not including the zero + that is put on the end; can be zero + if not successful: + PCRE_ERROR_NOMEMORY (-6) couldn't get memory + PCRE_ERROR_NOSUBSTRING (-7) no such captured substring +*/ + +#if defined COMPILE_PCRE8 +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre_get_named_substring(const pcre *code, const char *subject, + int *ovector, int stringcount, const char *stringname, + const char **stringptr) +#elif defined COMPILE_PCRE16 +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre16_get_named_substring(const pcre16 *code, PCRE_SPTR16 subject, + int *ovector, int stringcount, PCRE_SPTR16 stringname, + PCRE_SPTR16 *stringptr) +#elif defined COMPILE_PCRE32 +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre32_get_named_substring(const pcre32 *code, PCRE_SPTR32 subject, + int *ovector, int stringcount, PCRE_SPTR32 stringname, + PCRE_SPTR32 *stringptr) +#endif +{ +int n = get_first_set(code, stringname, ovector, stringcount); +if (n <= 0) return n; +#if defined COMPILE_PCRE8 +return pcre_get_substring(subject, ovector, stringcount, n, stringptr); +#elif defined COMPILE_PCRE16 +return pcre16_get_substring(subject, ovector, stringcount, n, stringptr); +#elif defined COMPILE_PCRE32 +return pcre32_get_substring(subject, ovector, stringcount, n, stringptr); +#endif +} + + + + +/************************************************* +* Free store obtained by get_substring * +*************************************************/ + +/* This function exists for the benefit of people calling PCRE from non-C +programs that can call its functions, but not free() or (PUBL(free))() +directly. + +Argument: the result of a previous pcre_get_substring() +Returns: nothing +*/ + +#if defined COMPILE_PCRE8 +PCRE_EXP_DEFN void PCRE_CALL_CONVENTION +pcre_free_substring(const char *pointer) +#elif defined COMPILE_PCRE16 +PCRE_EXP_DEFN void PCRE_CALL_CONVENTION +pcre16_free_substring(PCRE_SPTR16 pointer) +#elif defined COMPILE_PCRE32 +PCRE_EXP_DEFN void PCRE_CALL_CONVENTION +pcre32_free_substring(PCRE_SPTR32 pointer) +#endif +{ +(PUBL(free))((void *)pointer); +} + +/* End of pcre_get.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_globals.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_globals.c new file mode 100755 index 000000000..0f106aa90 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_globals.c @@ -0,0 +1,86 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2014 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + + +/* This module contains global variables that are exported by the PCRE library. +PCRE is thread-clean and doesn't use any global variables in the normal sense. +However, it calls memory allocation and freeing functions via the four +indirections below, and it can optionally do callouts, using the fifth +indirection. These values can be changed by the caller, but are shared between +all threads. + +For MS Visual Studio and Symbian OS, there are problems in initializing these +variables to non-local functions. In these cases, therefore, an indirection via +a local function is used. + +Also, when compiling for Virtual Pascal, things are done differently, and +global variables are not used. */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "pcre_internal.h" + +#if defined _MSC_VER || defined __SYMBIAN32__ +static void* LocalPcreMalloc(size_t aSize) + { + return malloc(aSize); + } +static void LocalPcreFree(void* aPtr) + { + free(aPtr); + } +PCRE_EXP_DATA_DEFN void *(*PUBL(malloc))(size_t) = LocalPcreMalloc; +PCRE_EXP_DATA_DEFN void (*PUBL(free))(void *) = LocalPcreFree; +PCRE_EXP_DATA_DEFN void *(*PUBL(stack_malloc))(size_t) = LocalPcreMalloc; +PCRE_EXP_DATA_DEFN void (*PUBL(stack_free))(void *) = LocalPcreFree; +PCRE_EXP_DATA_DEFN int (*PUBL(callout))(PUBL(callout_block) *) = NULL; +PCRE_EXP_DATA_DEFN int (*PUBL(stack_guard))(void) = NULL; + +#elif !defined VPCOMPAT +PCRE_EXP_DATA_DEFN void *(*PUBL(malloc))(size_t) = malloc; +PCRE_EXP_DATA_DEFN void (*PUBL(free))(void *) = free; +PCRE_EXP_DATA_DEFN void *(*PUBL(stack_malloc))(size_t) = malloc; +PCRE_EXP_DATA_DEFN void (*PUBL(stack_free))(void *) = free; +PCRE_EXP_DATA_DEFN int (*PUBL(callout))(PUBL(callout_block) *) = NULL; +PCRE_EXP_DATA_DEFN int (*PUBL(stack_guard))(void) = NULL; +#endif + +/* End of pcre_globals.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_internal.h b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_internal.h new file mode 100755 index 000000000..97ff55d03 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_internal.h @@ -0,0 +1,2807 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2016 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +/* This header contains definitions that are shared between the different +modules, but which are not relevant to the exported API. This includes some +functions whose names all begin with "_pcre_", "_pcre16_" or "_pcre32_" +depending on the PRIV macro. */ + +#ifndef PCRE_INTERNAL_H +#define PCRE_INTERNAL_H + +/* Define PCRE_DEBUG to get debugging output on stdout. */ + +#if 0 +#define PCRE_DEBUG +#endif + +/* PCRE is compiled as an 8 bit library if it is not requested otherwise. */ + +#if !defined COMPILE_PCRE16 && !defined COMPILE_PCRE32 +#define COMPILE_PCRE8 +#endif + +/* If SUPPORT_UCP is defined, SUPPORT_UTF must also be defined. The +"configure" script ensures this, but not everybody uses "configure". */ + +#if defined SUPPORT_UCP && !(defined SUPPORT_UTF) +#define SUPPORT_UTF 1 +#endif + +/* We define SUPPORT_UTF if SUPPORT_UTF8 is enabled for compatibility +reasons with existing code. */ + +#if defined SUPPORT_UTF8 && !(defined SUPPORT_UTF) +#define SUPPORT_UTF 1 +#endif + +/* Fixme: SUPPORT_UTF8 should be eventually disappear from the code. +Until then we define it if SUPPORT_UTF is defined. */ + +#if defined SUPPORT_UTF && !(defined SUPPORT_UTF8) +#define SUPPORT_UTF8 1 +#endif + +/* We do not support both EBCDIC and UTF-8/16/32 at the same time. The "configure" +script prevents both being selected, but not everybody uses "configure". */ + +#if defined EBCDIC && defined SUPPORT_UTF +#error The use of both EBCDIC and SUPPORT_UTF is not supported. +#endif + +/* Use a macro for debugging printing, 'cause that eliminates the use of #ifdef +inline, and there are *still* stupid compilers about that don't like indented +pre-processor statements, or at least there were when I first wrote this. After +all, it had only been about 10 years then... + +It turns out that the Mac Debugging.h header also defines the macro DPRINTF, so +be absolutely sure we get our version. */ + +#undef DPRINTF +#ifdef PCRE_DEBUG +#define DPRINTF(p) printf p +#else +#define DPRINTF(p) /* Nothing */ +#endif + + +/* Standard C headers plus the external interface definition. The only time +setjmp and stdarg are used is when NO_RECURSE is set. */ + +#include +#include +#include +#include +#include +#include + +/* Valgrind (memcheck) support */ + +#ifdef SUPPORT_VALGRIND +#include +#endif + +/* When compiling a DLL for Windows, the exported symbols have to be declared +using some MS magic. I found some useful information on this web page: +http://msdn2.microsoft.com/en-us/library/y4h7bcy6(VS.80).aspx. According to the +information there, using __declspec(dllexport) without "extern" we have a +definition; with "extern" we have a declaration. The settings here override the +setting in pcre.h (which is included below); it defines only PCRE_EXP_DECL, +which is all that is needed for applications (they just import the symbols). We +use: + + PCRE_EXP_DECL for declarations + PCRE_EXP_DEFN for definitions of exported functions + PCRE_EXP_DATA_DEFN for definitions of exported variables + +The reason for the two DEFN macros is that in non-Windows environments, one +does not want to have "extern" before variable definitions because it leads to +compiler warnings. So we distinguish between functions and variables. In +Windows, the two should always be the same. + +The reason for wrapping this in #ifndef PCRE_EXP_DECL is so that pcretest, +which is an application, but needs to import this file in order to "peek" at +internals, can #include pcre.h first to get an application's-eye view. + +In principle, people compiling for non-Windows, non-Unix-like (i.e. uncommon, +special-purpose environments) might want to stick other stuff in front of +exported symbols. That's why, in the non-Windows case, we set PCRE_EXP_DEFN and +PCRE_EXP_DATA_DEFN only if they are not already set. */ + +#ifndef PCRE_EXP_DECL +# ifdef _WIN32 +# ifndef PCRE_STATIC +# define PCRE_EXP_DECL extern __declspec(dllexport) +# define PCRE_EXP_DEFN __declspec(dllexport) +# define PCRE_EXP_DATA_DEFN __declspec(dllexport) +# else +# define PCRE_EXP_DECL extern +# define PCRE_EXP_DEFN +# define PCRE_EXP_DATA_DEFN +# endif +# else +# ifdef __cplusplus +# define PCRE_EXP_DECL extern "C" +# else +# define PCRE_EXP_DECL extern +# endif +# ifndef PCRE_EXP_DEFN +# define PCRE_EXP_DEFN PCRE_EXP_DECL +# endif +# ifndef PCRE_EXP_DATA_DEFN +# define PCRE_EXP_DATA_DEFN +# endif +# endif +#endif + +/* When compiling with the MSVC compiler, it is sometimes necessary to include +a "calling convention" before exported function names. (This is secondhand +information; I know nothing about MSVC myself). For example, something like + + void __cdecl function(....) + +might be needed. In order so make this easy, all the exported functions have +PCRE_CALL_CONVENTION just before their names. It is rarely needed; if not +set, we ensure here that it has no effect. */ + +#ifndef PCRE_CALL_CONVENTION +#define PCRE_CALL_CONVENTION +#endif + +/* We need to have types that specify unsigned 8, 16 and 32-bit integers. We +cannot determine these outside the compilation (e.g. by running a program as +part of "configure") because PCRE is often cross-compiled for use on other +systems. Instead we make use of the maximum sizes that are available at +preprocessor time in standard C environments. */ + +typedef unsigned char pcre_uint8; + +#if USHRT_MAX == 65535 +typedef unsigned short pcre_uint16; +typedef short pcre_int16; +#define PCRE_UINT16_MAX USHRT_MAX +#define PCRE_INT16_MAX SHRT_MAX +#elif UINT_MAX == 65535 +typedef unsigned int pcre_uint16; +typedef int pcre_int16; +#define PCRE_UINT16_MAX UINT_MAX +#define PCRE_INT16_MAX INT_MAX +#else +#error Cannot determine a type for 16-bit integers +#endif + +#if UINT_MAX == 4294967295U +typedef unsigned int pcre_uint32; +typedef int pcre_int32; +#define PCRE_UINT32_MAX UINT_MAX +#define PCRE_INT32_MAX INT_MAX +#elif ULONG_MAX == 4294967295UL +typedef unsigned long int pcre_uint32; +typedef long int pcre_int32; +#define PCRE_UINT32_MAX ULONG_MAX +#define PCRE_INT32_MAX LONG_MAX +#else +#error Cannot determine a type for 32-bit integers +#endif + +/* When checking for integer overflow in pcre_compile(), we need to handle +large integers. If a 64-bit integer type is available, we can use that. +Otherwise we have to cast to double, which of course requires floating point +arithmetic. Handle this by defining a macro for the appropriate type. If +stdint.h is available, include it; it may define INT64_MAX. Systems that do not +have stdint.h (e.g. Solaris) may have inttypes.h. The macro int64_t may be set +by "configure". */ + +#if defined HAVE_STDINT_H +#include +#elif defined HAVE_INTTYPES_H +#include +#endif + +#if defined INT64_MAX || defined int64_t +#define INT64_OR_DOUBLE int64_t +#else +#define INT64_OR_DOUBLE double +#endif + +/* All character handling must be done as unsigned characters. Otherwise there +are problems with top-bit-set characters and functions such as isspace(). +However, we leave the interface to the outside world as char * or short *, +because that should make things easier for callers. This character type is +called pcre_uchar. + +The IN_UCHARS macro multiply its argument with the byte size of the current +pcre_uchar type. Useful for memcpy and such operations, whose require the +byte size of their input/output buffers. + +The MAX_255 macro checks whether its pcre_uchar input is less than 256. + +The TABLE_GET macro is designed for accessing elements of tables whose contain +exactly 256 items. When the character is able to contain more than 256 +items, some check is needed before accessing these tables. +*/ + +#if defined COMPILE_PCRE8 + +typedef unsigned char pcre_uchar; +#define IN_UCHARS(x) (x) +#define MAX_255(c) 1 +#define TABLE_GET(c, table, default) ((table)[c]) + +#elif defined COMPILE_PCRE16 + +#if USHRT_MAX != 65535 +/* This is a warning message. Change PCRE_UCHAR16 to a 16 bit data type in +pcre.h(.in) and disable (comment out) this message. */ +#error Warning: PCRE_UCHAR16 is not a 16 bit data type. +#endif + +typedef pcre_uint16 pcre_uchar; +#define UCHAR_SHIFT (1) +#define IN_UCHARS(x) ((x) * 2) +#define MAX_255(c) ((c) <= 255u) +#define TABLE_GET(c, table, default) (MAX_255(c)? ((table)[c]):(default)) + +#elif defined COMPILE_PCRE32 + +typedef pcre_uint32 pcre_uchar; +#define UCHAR_SHIFT (2) +#define IN_UCHARS(x) ((x) * 4) +#define MAX_255(c) ((c) <= 255u) +#define TABLE_GET(c, table, default) (MAX_255(c)? ((table)[c]):(default)) + +#else +#error Unsupported compiling mode +#endif /* COMPILE_PCRE[8|16|32] */ + +/* This is an unsigned int value that no character can ever have. UTF-8 +characters only go up to 0x7fffffff (though Unicode doesn't go beyond +0x0010ffff). */ + +#define NOTACHAR 0xffffffff + +/* PCRE is able to support several different kinds of newline (CR, LF, CRLF, +"any" and "anycrlf" at present). The following macros are used to package up +testing for newlines. NLBLOCK, PSSTART, and PSEND are defined in the various +modules to indicate in which datablock the parameters exist, and what the +start/end of string field names are. */ + +#define NLTYPE_FIXED 0 /* Newline is a fixed length string */ +#define NLTYPE_ANY 1 /* Newline is any Unicode line ending */ +#define NLTYPE_ANYCRLF 2 /* Newline is CR, LF, or CRLF */ + +/* This macro checks for a newline at the given position */ + +#define IS_NEWLINE(p) \ + ((NLBLOCK->nltype != NLTYPE_FIXED)? \ + ((p) < NLBLOCK->PSEND && \ + PRIV(is_newline)((p), NLBLOCK->nltype, NLBLOCK->PSEND, \ + &(NLBLOCK->nllen), utf)) \ + : \ + ((p) <= NLBLOCK->PSEND - NLBLOCK->nllen && \ + UCHAR21TEST(p) == NLBLOCK->nl[0] && \ + (NLBLOCK->nllen == 1 || UCHAR21TEST(p+1) == NLBLOCK->nl[1]) \ + ) \ + ) + +/* This macro checks for a newline immediately preceding the given position */ + +#define WAS_NEWLINE(p) \ + ((NLBLOCK->nltype != NLTYPE_FIXED)? \ + ((p) > NLBLOCK->PSSTART && \ + PRIV(was_newline)((p), NLBLOCK->nltype, NLBLOCK->PSSTART, \ + &(NLBLOCK->nllen), utf)) \ + : \ + ((p) >= NLBLOCK->PSSTART + NLBLOCK->nllen && \ + UCHAR21TEST(p - NLBLOCK->nllen) == NLBLOCK->nl[0] && \ + (NLBLOCK->nllen == 1 || UCHAR21TEST(p - NLBLOCK->nllen + 1) == NLBLOCK->nl[1]) \ + ) \ + ) + +/* When PCRE is compiled as a C++ library, the subject pointer can be replaced +with a custom type. This makes it possible, for example, to allow pcre_exec() +to process subject strings that are discontinuous by using a smart pointer +class. It must always be possible to inspect all of the subject string in +pcre_exec() because of the way it backtracks. Two macros are required in the +normal case, for sign-unspecified and unsigned char pointers. The former is +used for the external interface and appears in pcre.h, which is why its name +must begin with PCRE_. */ + +#ifdef CUSTOM_SUBJECT_PTR +#define PCRE_PUCHAR CUSTOM_SUBJECT_PTR +#else +#define PCRE_PUCHAR const pcre_uchar * +#endif + +/* Include the public PCRE header and the definitions of UCP character property +values. */ + +#include "pcre.h" +#include "ucp.h" + +#ifdef COMPILE_PCRE32 +/* Assert that the public PCRE_UCHAR32 is a 32-bit type */ +typedef int __assert_pcre_uchar32_size[sizeof(PCRE_UCHAR32) == 4 ? 1 : -1]; +#endif + +/* When compiling for use with the Virtual Pascal compiler, these functions +need to have their names changed. PCRE must be compiled with the -DVPCOMPAT +option on the command line. */ + +#ifdef VPCOMPAT +#define strlen(s) _strlen(s) +#define strncmp(s1,s2,m) _strncmp(s1,s2,m) +#define memcmp(s,c,n) _memcmp(s,c,n) +#define memcpy(d,s,n) _memcpy(d,s,n) +#define memmove(d,s,n) _memmove(d,s,n) +#define memset(s,c,n) _memset(s,c,n) +#else /* VPCOMPAT */ + +/* To cope with SunOS4 and other systems that lack memmove() but have bcopy(), +define a macro for memmove() if HAVE_MEMMOVE is false, provided that HAVE_BCOPY +is set. Otherwise, include an emulating function for those systems that have +neither (there some non-Unix environments where this is the case). */ + +#ifndef HAVE_MEMMOVE +#undef memmove /* some systems may have a macro */ +#ifdef HAVE_BCOPY +#define memmove(a, b, c) bcopy(b, a, c) +#else /* HAVE_BCOPY */ +static void * +pcre_memmove(void *d, const void *s, size_t n) +{ +size_t i; +unsigned char *dest = (unsigned char *)d; +const unsigned char *src = (const unsigned char *)s; +if (dest > src) + { + dest += n; + src += n; + for (i = 0; i < n; ++i) *(--dest) = *(--src); + return (void *)dest; + } +else + { + for (i = 0; i < n; ++i) *dest++ = *src++; + return (void *)(dest - n); + } +} +#define memmove(a, b, c) pcre_memmove(a, b, c) +#endif /* not HAVE_BCOPY */ +#endif /* not HAVE_MEMMOVE */ +#endif /* not VPCOMPAT */ + + +/* PCRE keeps offsets in its compiled code as 2-byte quantities (always stored +in big-endian order) by default. These are used, for example, to link from the +start of a subpattern to its alternatives and its end. The use of 2 bytes per +offset limits the size of the compiled regex to around 64K, which is big enough +for almost everybody. However, I received a request for an even bigger limit. +For this reason, and also to make the code easier to maintain, the storing and +loading of offsets from the byte string is now handled by the macros that are +defined here. + +The macros are controlled by the value of LINK_SIZE. This defaults to 2 in +the config.h file, but can be overridden by using -D on the command line. This +is automated on Unix systems via the "configure" command. */ + +#if defined COMPILE_PCRE8 + +#if LINK_SIZE == 2 + +#define PUT(a,n,d) \ + (a[n] = (d) >> 8), \ + (a[(n)+1] = (d) & 255) + +#define GET(a,n) \ + (((a)[n] << 8) | (a)[(n)+1]) + +#define MAX_PATTERN_SIZE (1 << 16) + + +#elif LINK_SIZE == 3 + +#define PUT(a,n,d) \ + (a[n] = (d) >> 16), \ + (a[(n)+1] = (d) >> 8), \ + (a[(n)+2] = (d) & 255) + +#define GET(a,n) \ + (((a)[n] << 16) | ((a)[(n)+1] << 8) | (a)[(n)+2]) + +#define MAX_PATTERN_SIZE (1 << 24) + + +#elif LINK_SIZE == 4 + +#define PUT(a,n,d) \ + (a[n] = (d) >> 24), \ + (a[(n)+1] = (d) >> 16), \ + (a[(n)+2] = (d) >> 8), \ + (a[(n)+3] = (d) & 255) + +#define GET(a,n) \ + (((a)[n] << 24) | ((a)[(n)+1] << 16) | ((a)[(n)+2] << 8) | (a)[(n)+3]) + +/* Keep it positive */ +#define MAX_PATTERN_SIZE (1 << 30) + +#else +#error LINK_SIZE must be either 2, 3, or 4 +#endif + +#elif defined COMPILE_PCRE16 + +#if LINK_SIZE == 2 + +/* Redefine LINK_SIZE as a multiple of sizeof(pcre_uchar) */ +#undef LINK_SIZE +#define LINK_SIZE 1 + +#define PUT(a,n,d) \ + (a[n] = (d)) + +#define GET(a,n) \ + (a[n]) + +#define MAX_PATTERN_SIZE (1 << 16) + +#elif LINK_SIZE == 3 || LINK_SIZE == 4 + +/* Redefine LINK_SIZE as a multiple of sizeof(pcre_uchar) */ +#undef LINK_SIZE +#define LINK_SIZE 2 + +#define PUT(a,n,d) \ + (a[n] = (d) >> 16), \ + (a[(n)+1] = (d) & 65535) + +#define GET(a,n) \ + (((a)[n] << 16) | (a)[(n)+1]) + +/* Keep it positive */ +#define MAX_PATTERN_SIZE (1 << 30) + +#else +#error LINK_SIZE must be either 2, 3, or 4 +#endif + +#elif defined COMPILE_PCRE32 + +/* Only supported LINK_SIZE is 4 */ +/* Redefine LINK_SIZE as a multiple of sizeof(pcre_uchar) */ +#undef LINK_SIZE +#define LINK_SIZE 1 + +#define PUT(a,n,d) \ + (a[n] = (d)) + +#define GET(a,n) \ + (a[n]) + +/* Keep it positive */ +#define MAX_PATTERN_SIZE (1 << 30) + +#else +#error Unsupported compiling mode +#endif /* COMPILE_PCRE[8|16|32] */ + +/* Convenience macro defined in terms of the others */ + +#define PUTINC(a,n,d) PUT(a,n,d), a += LINK_SIZE + + +/* PCRE uses some other 2-byte quantities that do not change when the size of +offsets changes. There are used for repeat counts and for other things such as +capturing parenthesis numbers in back references. */ + +#if defined COMPILE_PCRE8 + +#define IMM2_SIZE 2 + +#define PUT2(a,n,d) \ + a[n] = (d) >> 8; \ + a[(n)+1] = (d) & 255 + +/* For reasons that I do not understand, the expression in this GET2 macro is +treated by gcc as a signed expression, even when a is declared as unsigned. It +seems that any kind of arithmetic results in a signed value. */ + +#define GET2(a,n) \ + (unsigned int)(((a)[n] << 8) | (a)[(n)+1]) + +#elif defined COMPILE_PCRE16 + +#define IMM2_SIZE 1 + +#define PUT2(a,n,d) \ + a[n] = d + +#define GET2(a,n) \ + a[n] + +#elif defined COMPILE_PCRE32 + +#define IMM2_SIZE 1 + +#define PUT2(a,n,d) \ + a[n] = d + +#define GET2(a,n) \ + a[n] + +#else +#error Unsupported compiling mode +#endif /* COMPILE_PCRE[8|16|32] */ + +#define PUT2INC(a,n,d) PUT2(a,n,d), a += IMM2_SIZE + +/* The maximum length of a MARK name is currently one data unit; it may be +changed in future to be a fixed number of bytes or to depend on LINK_SIZE. */ + +#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32 +#define MAX_MARK ((1u << 16) - 1) +#else +#define MAX_MARK ((1u << 8) - 1) +#endif + +/* There is a proposed future special "UTF-21" mode, in which only the lowest +21 bits of a 32-bit character are interpreted as UTF, with the remaining 11 +high-order bits available to the application for other uses. In preparation for +the future implementation of this mode, there are macros that load a data item +and, if in this special mode, mask it to 21 bits. These macros all have names +starting with UCHAR21. In all other modes, including the normal 32-bit +library, the macros all have the same simple definitions. When the new mode is +implemented, it is expected that these definitions will be varied appropriately +using #ifdef when compiling the library that supports the special mode. */ + +#define UCHAR21(eptr) (*(eptr)) +#define UCHAR21TEST(eptr) (*(eptr)) +#define UCHAR21INC(eptr) (*(eptr)++) +#define UCHAR21INCTEST(eptr) (*(eptr)++) + +/* When UTF encoding is being used, a character is no longer just a single +byte in 8-bit mode or a single short in 16-bit mode. The macros for character +handling generate simple sequences when used in the basic mode, and more +complicated ones for UTF characters. GETCHARLENTEST and other macros are not +used when UTF is not supported. To make sure they can never even appear when +UTF support is omitted, we don't even define them. */ + +#ifndef SUPPORT_UTF + +/* #define MAX_VALUE_FOR_SINGLE_CHAR */ +/* #define HAS_EXTRALEN(c) */ +/* #define GET_EXTRALEN(c) */ +/* #define NOT_FIRSTCHAR(c) */ +#define GETCHAR(c, eptr) c = *eptr; +#define GETCHARTEST(c, eptr) c = *eptr; +#define GETCHARINC(c, eptr) c = *eptr++; +#define GETCHARINCTEST(c, eptr) c = *eptr++; +#define GETCHARLEN(c, eptr, len) c = *eptr; +/* #define GETCHARLENTEST(c, eptr, len) */ +/* #define BACKCHAR(eptr) */ +/* #define FORWARDCHAR(eptr) */ +/* #define ACROSSCHAR(condition, eptr, action) */ + +#else /* SUPPORT_UTF */ + +/* Tests whether the code point needs extra characters to decode. */ + +#define HASUTF8EXTRALEN(c) ((c) >= 0xc0) + +/* Base macro to pick up the remaining bytes of a UTF-8 character, not +advancing the pointer. */ + +#define GETUTF8(c, eptr) \ + { \ + if ((c & 0x20) == 0) \ + c = ((c & 0x1f) << 6) | (eptr[1] & 0x3f); \ + else if ((c & 0x10) == 0) \ + c = ((c & 0x0f) << 12) | ((eptr[1] & 0x3f) << 6) | (eptr[2] & 0x3f); \ + else if ((c & 0x08) == 0) \ + c = ((c & 0x07) << 18) | ((eptr[1] & 0x3f) << 12) | \ + ((eptr[2] & 0x3f) << 6) | (eptr[3] & 0x3f); \ + else if ((c & 0x04) == 0) \ + c = ((c & 0x03) << 24) | ((eptr[1] & 0x3f) << 18) | \ + ((eptr[2] & 0x3f) << 12) | ((eptr[3] & 0x3f) << 6) | \ + (eptr[4] & 0x3f); \ + else \ + c = ((c & 0x01) << 30) | ((eptr[1] & 0x3f) << 24) | \ + ((eptr[2] & 0x3f) << 18) | ((eptr[3] & 0x3f) << 12) | \ + ((eptr[4] & 0x3f) << 6) | (eptr[5] & 0x3f); \ + } + +/* Base macro to pick up the remaining bytes of a UTF-8 character, advancing +the pointer. */ + +#define GETUTF8INC(c, eptr) \ + { \ + if ((c & 0x20) == 0) \ + c = ((c & 0x1f) << 6) | (*eptr++ & 0x3f); \ + else if ((c & 0x10) == 0) \ + { \ + c = ((c & 0x0f) << 12) | ((*eptr & 0x3f) << 6) | (eptr[1] & 0x3f); \ + eptr += 2; \ + } \ + else if ((c & 0x08) == 0) \ + { \ + c = ((c & 0x07) << 18) | ((*eptr & 0x3f) << 12) | \ + ((eptr[1] & 0x3f) << 6) | (eptr[2] & 0x3f); \ + eptr += 3; \ + } \ + else if ((c & 0x04) == 0) \ + { \ + c = ((c & 0x03) << 24) | ((*eptr & 0x3f) << 18) | \ + ((eptr[1] & 0x3f) << 12) | ((eptr[2] & 0x3f) << 6) | \ + (eptr[3] & 0x3f); \ + eptr += 4; \ + } \ + else \ + { \ + c = ((c & 0x01) << 30) | ((*eptr & 0x3f) << 24) | \ + ((eptr[1] & 0x3f) << 18) | ((eptr[2] & 0x3f) << 12) | \ + ((eptr[3] & 0x3f) << 6) | (eptr[4] & 0x3f); \ + eptr += 5; \ + } \ + } + +#if defined COMPILE_PCRE8 + +/* These macros were originally written in the form of loops that used data +from the tables whose names start with PRIV(utf8_table). They were rewritten by +a user so as not to use loops, because in some environments this gives a +significant performance advantage, and it seems never to do any harm. */ + +/* Tells the biggest code point which can be encoded as a single character. */ + +#define MAX_VALUE_FOR_SINGLE_CHAR 127 + +/* Tests whether the code point needs extra characters to decode. */ + +#define HAS_EXTRALEN(c) ((c) >= 0xc0) + +/* Returns with the additional number of characters if IS_MULTICHAR(c) is TRUE. +Otherwise it has an undefined behaviour. */ + +#define GET_EXTRALEN(c) (PRIV(utf8_table4)[(c) & 0x3f]) + +/* Returns TRUE, if the given character is not the first character +of a UTF sequence. */ + +#define NOT_FIRSTCHAR(c) (((c) & 0xc0) == 0x80) + +/* Get the next UTF-8 character, not advancing the pointer. This is called when +we know we are in UTF-8 mode. */ + +#define GETCHAR(c, eptr) \ + c = *eptr; \ + if (c >= 0xc0) GETUTF8(c, eptr); + +/* Get the next UTF-8 character, testing for UTF-8 mode, and not advancing the +pointer. */ + +#define GETCHARTEST(c, eptr) \ + c = *eptr; \ + if (utf && c >= 0xc0) GETUTF8(c, eptr); + +/* Get the next UTF-8 character, advancing the pointer. This is called when we +know we are in UTF-8 mode. */ + +#define GETCHARINC(c, eptr) \ + c = *eptr++; \ + if (c >= 0xc0) GETUTF8INC(c, eptr); + +/* Get the next character, testing for UTF-8 mode, and advancing the pointer. +This is called when we don't know if we are in UTF-8 mode. */ + +#define GETCHARINCTEST(c, eptr) \ + c = *eptr++; \ + if (utf && c >= 0xc0) GETUTF8INC(c, eptr); + +/* Base macro to pick up the remaining bytes of a UTF-8 character, not +advancing the pointer, incrementing the length. */ + +#define GETUTF8LEN(c, eptr, len) \ + { \ + if ((c & 0x20) == 0) \ + { \ + c = ((c & 0x1f) << 6) | (eptr[1] & 0x3f); \ + len++; \ + } \ + else if ((c & 0x10) == 0) \ + { \ + c = ((c & 0x0f) << 12) | ((eptr[1] & 0x3f) << 6) | (eptr[2] & 0x3f); \ + len += 2; \ + } \ + else if ((c & 0x08) == 0) \ + {\ + c = ((c & 0x07) << 18) | ((eptr[1] & 0x3f) << 12) | \ + ((eptr[2] & 0x3f) << 6) | (eptr[3] & 0x3f); \ + len += 3; \ + } \ + else if ((c & 0x04) == 0) \ + { \ + c = ((c & 0x03) << 24) | ((eptr[1] & 0x3f) << 18) | \ + ((eptr[2] & 0x3f) << 12) | ((eptr[3] & 0x3f) << 6) | \ + (eptr[4] & 0x3f); \ + len += 4; \ + } \ + else \ + {\ + c = ((c & 0x01) << 30) | ((eptr[1] & 0x3f) << 24) | \ + ((eptr[2] & 0x3f) << 18) | ((eptr[3] & 0x3f) << 12) | \ + ((eptr[4] & 0x3f) << 6) | (eptr[5] & 0x3f); \ + len += 5; \ + } \ + } + +/* Get the next UTF-8 character, not advancing the pointer, incrementing length +if there are extra bytes. This is called when we know we are in UTF-8 mode. */ + +#define GETCHARLEN(c, eptr, len) \ + c = *eptr; \ + if (c >= 0xc0) GETUTF8LEN(c, eptr, len); + +/* Get the next UTF-8 character, testing for UTF-8 mode, not advancing the +pointer, incrementing length if there are extra bytes. This is called when we +do not know if we are in UTF-8 mode. */ + +#define GETCHARLENTEST(c, eptr, len) \ + c = *eptr; \ + if (utf && c >= 0xc0) GETUTF8LEN(c, eptr, len); + +/* If the pointer is not at the start of a character, move it back until +it is. This is called only in UTF-8 mode - we don't put a test within the macro +because almost all calls are already within a block of UTF-8 only code. */ + +#define BACKCHAR(eptr) while((*eptr & 0xc0) == 0x80) eptr-- + +/* Same as above, just in the other direction. */ +#define FORWARDCHAR(eptr) while((*eptr & 0xc0) == 0x80) eptr++ + +/* Same as above, but it allows a fully customizable form. */ +#define ACROSSCHAR(condition, eptr, action) \ + while((condition) && ((eptr) & 0xc0) == 0x80) action + +#elif defined COMPILE_PCRE16 + +/* Tells the biggest code point which can be encoded as a single character. */ + +#define MAX_VALUE_FOR_SINGLE_CHAR 65535 + +/* Tests whether the code point needs extra characters to decode. */ + +#define HAS_EXTRALEN(c) (((c) & 0xfc00) == 0xd800) + +/* Returns with the additional number of characters if IS_MULTICHAR(c) is TRUE. +Otherwise it has an undefined behaviour. */ + +#define GET_EXTRALEN(c) 1 + +/* Returns TRUE, if the given character is not the first character +of a UTF sequence. */ + +#define NOT_FIRSTCHAR(c) (((c) & 0xfc00) == 0xdc00) + +/* Base macro to pick up the low surrogate of a UTF-16 character, not +advancing the pointer. */ + +#define GETUTF16(c, eptr) \ + { c = (((c & 0x3ff) << 10) | (eptr[1] & 0x3ff)) + 0x10000; } + +/* Get the next UTF-16 character, not advancing the pointer. This is called when +we know we are in UTF-16 mode. */ + +#define GETCHAR(c, eptr) \ + c = *eptr; \ + if ((c & 0xfc00) == 0xd800) GETUTF16(c, eptr); + +/* Get the next UTF-16 character, testing for UTF-16 mode, and not advancing the +pointer. */ + +#define GETCHARTEST(c, eptr) \ + c = *eptr; \ + if (utf && (c & 0xfc00) == 0xd800) GETUTF16(c, eptr); + +/* Base macro to pick up the low surrogate of a UTF-16 character, advancing +the pointer. */ + +#define GETUTF16INC(c, eptr) \ + { c = (((c & 0x3ff) << 10) | (*eptr++ & 0x3ff)) + 0x10000; } + +/* Get the next UTF-16 character, advancing the pointer. This is called when we +know we are in UTF-16 mode. */ + +#define GETCHARINC(c, eptr) \ + c = *eptr++; \ + if ((c & 0xfc00) == 0xd800) GETUTF16INC(c, eptr); + +/* Get the next character, testing for UTF-16 mode, and advancing the pointer. +This is called when we don't know if we are in UTF-16 mode. */ + +#define GETCHARINCTEST(c, eptr) \ + c = *eptr++; \ + if (utf && (c & 0xfc00) == 0xd800) GETUTF16INC(c, eptr); + +/* Base macro to pick up the low surrogate of a UTF-16 character, not +advancing the pointer, incrementing the length. */ + +#define GETUTF16LEN(c, eptr, len) \ + { c = (((c & 0x3ff) << 10) | (eptr[1] & 0x3ff)) + 0x10000; len++; } + +/* Get the next UTF-16 character, not advancing the pointer, incrementing +length if there is a low surrogate. This is called when we know we are in +UTF-16 mode. */ + +#define GETCHARLEN(c, eptr, len) \ + c = *eptr; \ + if ((c & 0xfc00) == 0xd800) GETUTF16LEN(c, eptr, len); + +/* Get the next UTF-816character, testing for UTF-16 mode, not advancing the +pointer, incrementing length if there is a low surrogate. This is called when +we do not know if we are in UTF-16 mode. */ + +#define GETCHARLENTEST(c, eptr, len) \ + c = *eptr; \ + if (utf && (c & 0xfc00) == 0xd800) GETUTF16LEN(c, eptr, len); + +/* If the pointer is not at the start of a character, move it back until +it is. This is called only in UTF-16 mode - we don't put a test within the +macro because almost all calls are already within a block of UTF-16 only +code. */ + +#define BACKCHAR(eptr) if ((*eptr & 0xfc00) == 0xdc00) eptr-- + +/* Same as above, just in the other direction. */ +#define FORWARDCHAR(eptr) if ((*eptr & 0xfc00) == 0xdc00) eptr++ + +/* Same as above, but it allows a fully customizable form. */ +#define ACROSSCHAR(condition, eptr, action) \ + if ((condition) && ((eptr) & 0xfc00) == 0xdc00) action + +#elif defined COMPILE_PCRE32 + +/* These are trivial for the 32-bit library, since all UTF-32 characters fit +into one pcre_uchar unit. */ +#define MAX_VALUE_FOR_SINGLE_CHAR (0x10ffffu) +#define HAS_EXTRALEN(c) (0) +#define GET_EXTRALEN(c) (0) +#define NOT_FIRSTCHAR(c) (0) + +/* Get the next UTF-32 character, not advancing the pointer. This is called when +we know we are in UTF-32 mode. */ + +#define GETCHAR(c, eptr) \ + c = *(eptr); + +/* Get the next UTF-32 character, testing for UTF-32 mode, and not advancing the +pointer. */ + +#define GETCHARTEST(c, eptr) \ + c = *(eptr); + +/* Get the next UTF-32 character, advancing the pointer. This is called when we +know we are in UTF-32 mode. */ + +#define GETCHARINC(c, eptr) \ + c = *((eptr)++); + +/* Get the next character, testing for UTF-32 mode, and advancing the pointer. +This is called when we don't know if we are in UTF-32 mode. */ + +#define GETCHARINCTEST(c, eptr) \ + c = *((eptr)++); + +/* Get the next UTF-32 character, not advancing the pointer, not incrementing +length (since all UTF-32 is of length 1). This is called when we know we are in +UTF-32 mode. */ + +#define GETCHARLEN(c, eptr, len) \ + GETCHAR(c, eptr) + +/* Get the next UTF-32character, testing for UTF-32 mode, not advancing the +pointer, not incrementing the length (since all UTF-32 is of length 1). +This is called when we do not know if we are in UTF-32 mode. */ + +#define GETCHARLENTEST(c, eptr, len) \ + GETCHARTEST(c, eptr) + +/* If the pointer is not at the start of a character, move it back until +it is. This is called only in UTF-32 mode - we don't put a test within the +macro because almost all calls are already within a block of UTF-32 only +code. +These are all no-ops since all UTF-32 characters fit into one pcre_uchar. */ + +#define BACKCHAR(eptr) do { } while (0) + +/* Same as above, just in the other direction. */ +#define FORWARDCHAR(eptr) do { } while (0) + +/* Same as above, but it allows a fully customizable form. */ +#define ACROSSCHAR(condition, eptr, action) do { } while (0) + +#else +#error Unsupported compiling mode +#endif /* COMPILE_PCRE[8|16|32] */ + +#endif /* SUPPORT_UTF */ + +/* Tests for Unicode horizontal and vertical whitespace characters must check a +number of different values. Using a switch statement for this generates the +fastest code (no loop, no memory access), and there are several places in the +interpreter code where this happens. In order to ensure that all the case lists +remain in step, we use macros so that there is only one place where the lists +are defined. + +These values are also required as lists in pcre_compile.c when processing \h, +\H, \v and \V in a character class. The lists are defined in pcre_tables.c, but +macros that define the values are here so that all the definitions are +together. The lists must be in ascending character order, terminated by +NOTACHAR (which is 0xffffffff). + +Any changes should ensure that the various macros are kept in step with each +other. NOTE: The values also appear in pcre_jit_compile.c. */ + +/* ------ ASCII/Unicode environments ------ */ + +#ifndef EBCDIC + +#define HSPACE_LIST \ + CHAR_HT, CHAR_SPACE, CHAR_NBSP, \ + 0x1680, 0x180e, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, \ + 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x202f, 0x205f, 0x3000, \ + NOTACHAR + +#define HSPACE_MULTIBYTE_CASES \ + case 0x1680: /* OGHAM SPACE MARK */ \ + case 0x180e: /* MONGOLIAN VOWEL SEPARATOR */ \ + case 0x2000: /* EN QUAD */ \ + case 0x2001: /* EM QUAD */ \ + case 0x2002: /* EN SPACE */ \ + case 0x2003: /* EM SPACE */ \ + case 0x2004: /* THREE-PER-EM SPACE */ \ + case 0x2005: /* FOUR-PER-EM SPACE */ \ + case 0x2006: /* SIX-PER-EM SPACE */ \ + case 0x2007: /* FIGURE SPACE */ \ + case 0x2008: /* PUNCTUATION SPACE */ \ + case 0x2009: /* THIN SPACE */ \ + case 0x200A: /* HAIR SPACE */ \ + case 0x202f: /* NARROW NO-BREAK SPACE */ \ + case 0x205f: /* MEDIUM MATHEMATICAL SPACE */ \ + case 0x3000 /* IDEOGRAPHIC SPACE */ + +#define HSPACE_BYTE_CASES \ + case CHAR_HT: \ + case CHAR_SPACE: \ + case CHAR_NBSP + +#define HSPACE_CASES \ + HSPACE_BYTE_CASES: \ + HSPACE_MULTIBYTE_CASES + +#define VSPACE_LIST \ + CHAR_LF, CHAR_VT, CHAR_FF, CHAR_CR, CHAR_NEL, 0x2028, 0x2029, NOTACHAR + +#define VSPACE_MULTIBYTE_CASES \ + case 0x2028: /* LINE SEPARATOR */ \ + case 0x2029 /* PARAGRAPH SEPARATOR */ + +#define VSPACE_BYTE_CASES \ + case CHAR_LF: \ + case CHAR_VT: \ + case CHAR_FF: \ + case CHAR_CR: \ + case CHAR_NEL + +#define VSPACE_CASES \ + VSPACE_BYTE_CASES: \ + VSPACE_MULTIBYTE_CASES + +/* ------ EBCDIC environments ------ */ + +#else +#define HSPACE_LIST CHAR_HT, CHAR_SPACE, CHAR_NBSP, NOTACHAR + +#define HSPACE_BYTE_CASES \ + case CHAR_HT: \ + case CHAR_SPACE: \ + case CHAR_NBSP + +#define HSPACE_CASES HSPACE_BYTE_CASES + +#ifdef EBCDIC_NL25 +#define VSPACE_LIST \ + CHAR_VT, CHAR_FF, CHAR_CR, CHAR_NEL, CHAR_LF, NOTACHAR +#else +#define VSPACE_LIST \ + CHAR_VT, CHAR_FF, CHAR_CR, CHAR_LF, CHAR_NEL, NOTACHAR +#endif + +#define VSPACE_BYTE_CASES \ + case CHAR_LF: \ + case CHAR_VT: \ + case CHAR_FF: \ + case CHAR_CR: \ + case CHAR_NEL + +#define VSPACE_CASES VSPACE_BYTE_CASES +#endif /* EBCDIC */ + +/* ------ End of whitespace macros ------ */ + + + +/* Private flags containing information about the compiled regex. They used to +live at the top end of the options word, but that got almost full, so they were +moved to a 16-bit flags word - which got almost full, so now they are in a +32-bit flags word. From release 8.00, PCRE_NOPARTIAL is unused, as the +restrictions on partial matching have been lifted. It remains for backwards +compatibility. */ + +#define PCRE_MODE8 0x00000001 /* compiled in 8 bit mode */ +#define PCRE_MODE16 0x00000002 /* compiled in 16 bit mode */ +#define PCRE_MODE32 0x00000004 /* compiled in 32 bit mode */ +#define PCRE_FIRSTSET 0x00000010 /* first_char is set */ +#define PCRE_FCH_CASELESS 0x00000020 /* caseless first char */ +#define PCRE_REQCHSET 0x00000040 /* req_byte is set */ +#define PCRE_RCH_CASELESS 0x00000080 /* caseless requested char */ +#define PCRE_STARTLINE 0x00000100 /* start after \n for multiline */ +#define PCRE_NOPARTIAL 0x00000200 /* can't use partial with this regex */ +#define PCRE_JCHANGED 0x00000400 /* j option used in regex */ +#define PCRE_HASCRORLF 0x00000800 /* explicit \r or \n in pattern */ +#define PCRE_HASTHEN 0x00001000 /* pattern contains (*THEN) */ +#define PCRE_MLSET 0x00002000 /* match limit set by regex */ +#define PCRE_RLSET 0x00004000 /* recursion limit set by regex */ +#define PCRE_MATCH_EMPTY 0x00008000 /* pattern can match empty string */ + +#if defined COMPILE_PCRE8 +#define PCRE_MODE PCRE_MODE8 +#elif defined COMPILE_PCRE16 +#define PCRE_MODE PCRE_MODE16 +#elif defined COMPILE_PCRE32 +#define PCRE_MODE PCRE_MODE32 +#endif +#define PCRE_MODE_MASK (PCRE_MODE8 | PCRE_MODE16 | PCRE_MODE32) + +/* Flags for the "extra" block produced by pcre_study(). */ + +#define PCRE_STUDY_MAPPED 0x0001 /* a map of starting chars exists */ +#define PCRE_STUDY_MINLEN 0x0002 /* a minimum length field exists */ + +/* Masks for identifying the public options that are permitted at compile +time, run time, or study time, respectively. */ + +#define PCRE_NEWLINE_BITS (PCRE_NEWLINE_CR|PCRE_NEWLINE_LF|PCRE_NEWLINE_ANY| \ + PCRE_NEWLINE_ANYCRLF) + +#define PUBLIC_COMPILE_OPTIONS \ + (PCRE_CASELESS|PCRE_EXTENDED|PCRE_ANCHORED|PCRE_MULTILINE| \ + PCRE_DOTALL|PCRE_DOLLAR_ENDONLY|PCRE_EXTRA|PCRE_UNGREEDY|PCRE_UTF8| \ + PCRE_NO_AUTO_CAPTURE|PCRE_NO_AUTO_POSSESS| \ + PCRE_NO_UTF8_CHECK|PCRE_AUTO_CALLOUT|PCRE_FIRSTLINE| \ + PCRE_DUPNAMES|PCRE_NEWLINE_BITS|PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE| \ + PCRE_JAVASCRIPT_COMPAT|PCRE_UCP|PCRE_NO_START_OPTIMIZE|PCRE_NEVER_UTF) + +#define PUBLIC_EXEC_OPTIONS \ + (PCRE_ANCHORED|PCRE_NOTBOL|PCRE_NOTEOL|PCRE_NOTEMPTY|PCRE_NOTEMPTY_ATSTART| \ + PCRE_NO_UTF8_CHECK|PCRE_PARTIAL_HARD|PCRE_PARTIAL_SOFT|PCRE_NEWLINE_BITS| \ + PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE|PCRE_NO_START_OPTIMIZE) + +#define PUBLIC_DFA_EXEC_OPTIONS \ + (PCRE_ANCHORED|PCRE_NOTBOL|PCRE_NOTEOL|PCRE_NOTEMPTY|PCRE_NOTEMPTY_ATSTART| \ + PCRE_NO_UTF8_CHECK|PCRE_PARTIAL_HARD|PCRE_PARTIAL_SOFT|PCRE_DFA_SHORTEST| \ + PCRE_DFA_RESTART|PCRE_NEWLINE_BITS|PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE| \ + PCRE_NO_START_OPTIMIZE) + +#define PUBLIC_STUDY_OPTIONS \ + (PCRE_STUDY_JIT_COMPILE|PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE| \ + PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE|PCRE_STUDY_EXTRA_NEEDED) + +#define PUBLIC_JIT_EXEC_OPTIONS \ + (PCRE_NO_UTF8_CHECK|PCRE_NOTBOL|PCRE_NOTEOL|PCRE_NOTEMPTY|\ + PCRE_NOTEMPTY_ATSTART|PCRE_PARTIAL_SOFT|PCRE_PARTIAL_HARD) + +/* Magic number to provide a small check against being handed junk. */ + +#define MAGIC_NUMBER 0x50435245UL /* 'PCRE' */ + +/* This variable is used to detect a loaded regular expression +in different endianness. */ + +#define REVERSED_MAGIC_NUMBER 0x45524350UL /* 'ERCP' */ + +/* The maximum remaining length of subject we are prepared to search for a +req_byte match. */ + +#define REQ_BYTE_MAX 1000 + +/* Miscellaneous definitions. The #ifndef is to pacify compiler warnings in +environments where these macros are defined elsewhere. Unfortunately, there +is no way to do the same for the typedef. */ + +typedef int BOOL; + +#ifndef FALSE +#define FALSE 0 +#define TRUE 1 +#endif + +/* If PCRE is to support UTF-8 on EBCDIC platforms, we cannot use normal +character constants like '*' because the compiler would emit their EBCDIC code, +which is different from their ASCII/UTF-8 code. Instead we define macros for +the characters so that they always use the ASCII/UTF-8 code when UTF-8 support +is enabled. When UTF-8 support is not enabled, the definitions use character +literals. Both character and string versions of each character are needed, and +there are some longer strings as well. + +This means that, on EBCDIC platforms, the PCRE library can handle either +EBCDIC, or UTF-8, but not both. To support both in the same compiled library +would need different lookups depending on whether PCRE_UTF8 was set or not. +This would make it impossible to use characters in switch/case statements, +which would reduce performance. For a theoretical use (which nobody has asked +for) in a minority area (EBCDIC platforms), this is not sensible. Any +application that did need both could compile two versions of the library, using +macros to give the functions distinct names. */ + +#ifndef SUPPORT_UTF + +/* UTF-8 support is not enabled; use the platform-dependent character literals +so that PCRE works in both ASCII and EBCDIC environments, but only in non-UTF +mode. Newline characters are problematic in EBCDIC. Though it has CR and LF +characters, a common practice has been to use its NL (0x15) character as the +line terminator in C-like processing environments. However, sometimes the LF +(0x25) character is used instead, according to this Unicode document: + +http://unicode.org/standard/reports/tr13/tr13-5.html + +PCRE defaults EBCDIC NL to 0x15, but has a build-time option to select 0x25 +instead. Whichever is *not* chosen is defined as NEL. + +In both ASCII and EBCDIC environments, CHAR_NL and CHAR_LF are synonyms for the +same code point. */ + +#ifdef EBCDIC + +#ifndef EBCDIC_NL25 +#define CHAR_NL '\x15' +#define CHAR_NEL '\x25' +#define STR_NL "\x15" +#define STR_NEL "\x25" +#else +#define CHAR_NL '\x25' +#define CHAR_NEL '\x15' +#define STR_NL "\x25" +#define STR_NEL "\x15" +#endif + +#define CHAR_LF CHAR_NL +#define STR_LF STR_NL + +#define CHAR_ESC '\047' +#define CHAR_DEL '\007' +#define CHAR_NBSP '\x41' +#define STR_ESC "\047" +#define STR_DEL "\007" + +#else /* Not EBCDIC */ + +/* In ASCII/Unicode, linefeed is '\n' and we equate this to NL for +compatibility. NEL is the Unicode newline character; make sure it is +a positive value. */ + +#define CHAR_LF '\n' +#define CHAR_NL CHAR_LF +#define CHAR_NEL ((unsigned char)'\x85') +#define CHAR_ESC '\033' +#define CHAR_DEL '\177' +#define CHAR_NBSP ((unsigned char)'\xa0') + +#define STR_LF "\n" +#define STR_NL STR_LF +#define STR_NEL "\x85" +#define STR_ESC "\033" +#define STR_DEL "\177" + +#endif /* EBCDIC */ + +/* The remaining definitions work in both environments. */ + +#define CHAR_NULL '\0' +#define CHAR_HT '\t' +#define CHAR_VT '\v' +#define CHAR_FF '\f' +#define CHAR_CR '\r' +#define CHAR_BS '\b' +#define CHAR_BEL '\a' + +#define CHAR_SPACE ' ' +#define CHAR_EXCLAMATION_MARK '!' +#define CHAR_QUOTATION_MARK '"' +#define CHAR_NUMBER_SIGN '#' +#define CHAR_DOLLAR_SIGN '$' +#define CHAR_PERCENT_SIGN '%' +#define CHAR_AMPERSAND '&' +#define CHAR_APOSTROPHE '\'' +#define CHAR_LEFT_PARENTHESIS '(' +#define CHAR_RIGHT_PARENTHESIS ')' +#define CHAR_ASTERISK '*' +#define CHAR_PLUS '+' +#define CHAR_COMMA ',' +#define CHAR_MINUS '-' +#define CHAR_DOT '.' +#define CHAR_SLASH '/' +#define CHAR_0 '0' +#define CHAR_1 '1' +#define CHAR_2 '2' +#define CHAR_3 '3' +#define CHAR_4 '4' +#define CHAR_5 '5' +#define CHAR_6 '6' +#define CHAR_7 '7' +#define CHAR_8 '8' +#define CHAR_9 '9' +#define CHAR_COLON ':' +#define CHAR_SEMICOLON ';' +#define CHAR_LESS_THAN_SIGN '<' +#define CHAR_EQUALS_SIGN '=' +#define CHAR_GREATER_THAN_SIGN '>' +#define CHAR_QUESTION_MARK '?' +#define CHAR_COMMERCIAL_AT '@' +#define CHAR_A 'A' +#define CHAR_B 'B' +#define CHAR_C 'C' +#define CHAR_D 'D' +#define CHAR_E 'E' +#define CHAR_F 'F' +#define CHAR_G 'G' +#define CHAR_H 'H' +#define CHAR_I 'I' +#define CHAR_J 'J' +#define CHAR_K 'K' +#define CHAR_L 'L' +#define CHAR_M 'M' +#define CHAR_N 'N' +#define CHAR_O 'O' +#define CHAR_P 'P' +#define CHAR_Q 'Q' +#define CHAR_R 'R' +#define CHAR_S 'S' +#define CHAR_T 'T' +#define CHAR_U 'U' +#define CHAR_V 'V' +#define CHAR_W 'W' +#define CHAR_X 'X' +#define CHAR_Y 'Y' +#define CHAR_Z 'Z' +#define CHAR_LEFT_SQUARE_BRACKET '[' +#define CHAR_BACKSLASH '\\' +#define CHAR_RIGHT_SQUARE_BRACKET ']' +#define CHAR_CIRCUMFLEX_ACCENT '^' +#define CHAR_UNDERSCORE '_' +#define CHAR_GRAVE_ACCENT '`' +#define CHAR_a 'a' +#define CHAR_b 'b' +#define CHAR_c 'c' +#define CHAR_d 'd' +#define CHAR_e 'e' +#define CHAR_f 'f' +#define CHAR_g 'g' +#define CHAR_h 'h' +#define CHAR_i 'i' +#define CHAR_j 'j' +#define CHAR_k 'k' +#define CHAR_l 'l' +#define CHAR_m 'm' +#define CHAR_n 'n' +#define CHAR_o 'o' +#define CHAR_p 'p' +#define CHAR_q 'q' +#define CHAR_r 'r' +#define CHAR_s 's' +#define CHAR_t 't' +#define CHAR_u 'u' +#define CHAR_v 'v' +#define CHAR_w 'w' +#define CHAR_x 'x' +#define CHAR_y 'y' +#define CHAR_z 'z' +#define CHAR_LEFT_CURLY_BRACKET '{' +#define CHAR_VERTICAL_LINE '|' +#define CHAR_RIGHT_CURLY_BRACKET '}' +#define CHAR_TILDE '~' + +#define STR_HT "\t" +#define STR_VT "\v" +#define STR_FF "\f" +#define STR_CR "\r" +#define STR_BS "\b" +#define STR_BEL "\a" + +#define STR_SPACE " " +#define STR_EXCLAMATION_MARK "!" +#define STR_QUOTATION_MARK "\"" +#define STR_NUMBER_SIGN "#" +#define STR_DOLLAR_SIGN "$" +#define STR_PERCENT_SIGN "%" +#define STR_AMPERSAND "&" +#define STR_APOSTROPHE "'" +#define STR_LEFT_PARENTHESIS "(" +#define STR_RIGHT_PARENTHESIS ")" +#define STR_ASTERISK "*" +#define STR_PLUS "+" +#define STR_COMMA "," +#define STR_MINUS "-" +#define STR_DOT "." +#define STR_SLASH "/" +#define STR_0 "0" +#define STR_1 "1" +#define STR_2 "2" +#define STR_3 "3" +#define STR_4 "4" +#define STR_5 "5" +#define STR_6 "6" +#define STR_7 "7" +#define STR_8 "8" +#define STR_9 "9" +#define STR_COLON ":" +#define STR_SEMICOLON ";" +#define STR_LESS_THAN_SIGN "<" +#define STR_EQUALS_SIGN "=" +#define STR_GREATER_THAN_SIGN ">" +#define STR_QUESTION_MARK "?" +#define STR_COMMERCIAL_AT "@" +#define STR_A "A" +#define STR_B "B" +#define STR_C "C" +#define STR_D "D" +#define STR_E "E" +#define STR_F "F" +#define STR_G "G" +#define STR_H "H" +#define STR_I "I" +#define STR_J "J" +#define STR_K "K" +#define STR_L "L" +#define STR_M "M" +#define STR_N "N" +#define STR_O "O" +#define STR_P "P" +#define STR_Q "Q" +#define STR_R "R" +#define STR_S "S" +#define STR_T "T" +#define STR_U "U" +#define STR_V "V" +#define STR_W "W" +#define STR_X "X" +#define STR_Y "Y" +#define STR_Z "Z" +#define STR_LEFT_SQUARE_BRACKET "[" +#define STR_BACKSLASH "\\" +#define STR_RIGHT_SQUARE_BRACKET "]" +#define STR_CIRCUMFLEX_ACCENT "^" +#define STR_UNDERSCORE "_" +#define STR_GRAVE_ACCENT "`" +#define STR_a "a" +#define STR_b "b" +#define STR_c "c" +#define STR_d "d" +#define STR_e "e" +#define STR_f "f" +#define STR_g "g" +#define STR_h "h" +#define STR_i "i" +#define STR_j "j" +#define STR_k "k" +#define STR_l "l" +#define STR_m "m" +#define STR_n "n" +#define STR_o "o" +#define STR_p "p" +#define STR_q "q" +#define STR_r "r" +#define STR_s "s" +#define STR_t "t" +#define STR_u "u" +#define STR_v "v" +#define STR_w "w" +#define STR_x "x" +#define STR_y "y" +#define STR_z "z" +#define STR_LEFT_CURLY_BRACKET "{" +#define STR_VERTICAL_LINE "|" +#define STR_RIGHT_CURLY_BRACKET "}" +#define STR_TILDE "~" + +#define STRING_ACCEPT0 "ACCEPT\0" +#define STRING_COMMIT0 "COMMIT\0" +#define STRING_F0 "F\0" +#define STRING_FAIL0 "FAIL\0" +#define STRING_MARK0 "MARK\0" +#define STRING_PRUNE0 "PRUNE\0" +#define STRING_SKIP0 "SKIP\0" +#define STRING_THEN "THEN" + +#define STRING_alpha0 "alpha\0" +#define STRING_lower0 "lower\0" +#define STRING_upper0 "upper\0" +#define STRING_alnum0 "alnum\0" +#define STRING_ascii0 "ascii\0" +#define STRING_blank0 "blank\0" +#define STRING_cntrl0 "cntrl\0" +#define STRING_digit0 "digit\0" +#define STRING_graph0 "graph\0" +#define STRING_print0 "print\0" +#define STRING_punct0 "punct\0" +#define STRING_space0 "space\0" +#define STRING_word0 "word\0" +#define STRING_xdigit "xdigit" + +#define STRING_DEFINE "DEFINE" +#define STRING_WEIRD_STARTWORD "[:<:]]" +#define STRING_WEIRD_ENDWORD "[:>:]]" + +#define STRING_CR_RIGHTPAR "CR)" +#define STRING_LF_RIGHTPAR "LF)" +#define STRING_CRLF_RIGHTPAR "CRLF)" +#define STRING_ANY_RIGHTPAR "ANY)" +#define STRING_ANYCRLF_RIGHTPAR "ANYCRLF)" +#define STRING_BSR_ANYCRLF_RIGHTPAR "BSR_ANYCRLF)" +#define STRING_BSR_UNICODE_RIGHTPAR "BSR_UNICODE)" +#define STRING_UTF8_RIGHTPAR "UTF8)" +#define STRING_UTF16_RIGHTPAR "UTF16)" +#define STRING_UTF32_RIGHTPAR "UTF32)" +#define STRING_UTF_RIGHTPAR "UTF)" +#define STRING_UCP_RIGHTPAR "UCP)" +#define STRING_NO_AUTO_POSSESS_RIGHTPAR "NO_AUTO_POSSESS)" +#define STRING_NO_START_OPT_RIGHTPAR "NO_START_OPT)" +#define STRING_LIMIT_MATCH_EQ "LIMIT_MATCH=" +#define STRING_LIMIT_RECURSION_EQ "LIMIT_RECURSION=" + +#else /* SUPPORT_UTF */ + +/* UTF-8 support is enabled; always use UTF-8 (=ASCII) character codes. This +works in both modes non-EBCDIC platforms, and on EBCDIC platforms in UTF-8 mode +only. */ + +#define CHAR_HT '\011' +#define CHAR_VT '\013' +#define CHAR_FF '\014' +#define CHAR_CR '\015' +#define CHAR_LF '\012' +#define CHAR_NL CHAR_LF +#define CHAR_NEL ((unsigned char)'\x85') +#define CHAR_BS '\010' +#define CHAR_BEL '\007' +#define CHAR_ESC '\033' +#define CHAR_DEL '\177' + +#define CHAR_NULL '\0' +#define CHAR_SPACE '\040' +#define CHAR_EXCLAMATION_MARK '\041' +#define CHAR_QUOTATION_MARK '\042' +#define CHAR_NUMBER_SIGN '\043' +#define CHAR_DOLLAR_SIGN '\044' +#define CHAR_PERCENT_SIGN '\045' +#define CHAR_AMPERSAND '\046' +#define CHAR_APOSTROPHE '\047' +#define CHAR_LEFT_PARENTHESIS '\050' +#define CHAR_RIGHT_PARENTHESIS '\051' +#define CHAR_ASTERISK '\052' +#define CHAR_PLUS '\053' +#define CHAR_COMMA '\054' +#define CHAR_MINUS '\055' +#define CHAR_DOT '\056' +#define CHAR_SLASH '\057' +#define CHAR_0 '\060' +#define CHAR_1 '\061' +#define CHAR_2 '\062' +#define CHAR_3 '\063' +#define CHAR_4 '\064' +#define CHAR_5 '\065' +#define CHAR_6 '\066' +#define CHAR_7 '\067' +#define CHAR_8 '\070' +#define CHAR_9 '\071' +#define CHAR_COLON '\072' +#define CHAR_SEMICOLON '\073' +#define CHAR_LESS_THAN_SIGN '\074' +#define CHAR_EQUALS_SIGN '\075' +#define CHAR_GREATER_THAN_SIGN '\076' +#define CHAR_QUESTION_MARK '\077' +#define CHAR_COMMERCIAL_AT '\100' +#define CHAR_A '\101' +#define CHAR_B '\102' +#define CHAR_C '\103' +#define CHAR_D '\104' +#define CHAR_E '\105' +#define CHAR_F '\106' +#define CHAR_G '\107' +#define CHAR_H '\110' +#define CHAR_I '\111' +#define CHAR_J '\112' +#define CHAR_K '\113' +#define CHAR_L '\114' +#define CHAR_M '\115' +#define CHAR_N '\116' +#define CHAR_O '\117' +#define CHAR_P '\120' +#define CHAR_Q '\121' +#define CHAR_R '\122' +#define CHAR_S '\123' +#define CHAR_T '\124' +#define CHAR_U '\125' +#define CHAR_V '\126' +#define CHAR_W '\127' +#define CHAR_X '\130' +#define CHAR_Y '\131' +#define CHAR_Z '\132' +#define CHAR_LEFT_SQUARE_BRACKET '\133' +#define CHAR_BACKSLASH '\134' +#define CHAR_RIGHT_SQUARE_BRACKET '\135' +#define CHAR_CIRCUMFLEX_ACCENT '\136' +#define CHAR_UNDERSCORE '\137' +#define CHAR_GRAVE_ACCENT '\140' +#define CHAR_a '\141' +#define CHAR_b '\142' +#define CHAR_c '\143' +#define CHAR_d '\144' +#define CHAR_e '\145' +#define CHAR_f '\146' +#define CHAR_g '\147' +#define CHAR_h '\150' +#define CHAR_i '\151' +#define CHAR_j '\152' +#define CHAR_k '\153' +#define CHAR_l '\154' +#define CHAR_m '\155' +#define CHAR_n '\156' +#define CHAR_o '\157' +#define CHAR_p '\160' +#define CHAR_q '\161' +#define CHAR_r '\162' +#define CHAR_s '\163' +#define CHAR_t '\164' +#define CHAR_u '\165' +#define CHAR_v '\166' +#define CHAR_w '\167' +#define CHAR_x '\170' +#define CHAR_y '\171' +#define CHAR_z '\172' +#define CHAR_LEFT_CURLY_BRACKET '\173' +#define CHAR_VERTICAL_LINE '\174' +#define CHAR_RIGHT_CURLY_BRACKET '\175' +#define CHAR_TILDE '\176' +#define CHAR_NBSP ((unsigned char)'\xa0') + +#define STR_HT "\011" +#define STR_VT "\013" +#define STR_FF "\014" +#define STR_CR "\015" +#define STR_NL "\012" +#define STR_BS "\010" +#define STR_BEL "\007" +#define STR_ESC "\033" +#define STR_DEL "\177" + +#define STR_SPACE "\040" +#define STR_EXCLAMATION_MARK "\041" +#define STR_QUOTATION_MARK "\042" +#define STR_NUMBER_SIGN "\043" +#define STR_DOLLAR_SIGN "\044" +#define STR_PERCENT_SIGN "\045" +#define STR_AMPERSAND "\046" +#define STR_APOSTROPHE "\047" +#define STR_LEFT_PARENTHESIS "\050" +#define STR_RIGHT_PARENTHESIS "\051" +#define STR_ASTERISK "\052" +#define STR_PLUS "\053" +#define STR_COMMA "\054" +#define STR_MINUS "\055" +#define STR_DOT "\056" +#define STR_SLASH "\057" +#define STR_0 "\060" +#define STR_1 "\061" +#define STR_2 "\062" +#define STR_3 "\063" +#define STR_4 "\064" +#define STR_5 "\065" +#define STR_6 "\066" +#define STR_7 "\067" +#define STR_8 "\070" +#define STR_9 "\071" +#define STR_COLON "\072" +#define STR_SEMICOLON "\073" +#define STR_LESS_THAN_SIGN "\074" +#define STR_EQUALS_SIGN "\075" +#define STR_GREATER_THAN_SIGN "\076" +#define STR_QUESTION_MARK "\077" +#define STR_COMMERCIAL_AT "\100" +#define STR_A "\101" +#define STR_B "\102" +#define STR_C "\103" +#define STR_D "\104" +#define STR_E "\105" +#define STR_F "\106" +#define STR_G "\107" +#define STR_H "\110" +#define STR_I "\111" +#define STR_J "\112" +#define STR_K "\113" +#define STR_L "\114" +#define STR_M "\115" +#define STR_N "\116" +#define STR_O "\117" +#define STR_P "\120" +#define STR_Q "\121" +#define STR_R "\122" +#define STR_S "\123" +#define STR_T "\124" +#define STR_U "\125" +#define STR_V "\126" +#define STR_W "\127" +#define STR_X "\130" +#define STR_Y "\131" +#define STR_Z "\132" +#define STR_LEFT_SQUARE_BRACKET "\133" +#define STR_BACKSLASH "\134" +#define STR_RIGHT_SQUARE_BRACKET "\135" +#define STR_CIRCUMFLEX_ACCENT "\136" +#define STR_UNDERSCORE "\137" +#define STR_GRAVE_ACCENT "\140" +#define STR_a "\141" +#define STR_b "\142" +#define STR_c "\143" +#define STR_d "\144" +#define STR_e "\145" +#define STR_f "\146" +#define STR_g "\147" +#define STR_h "\150" +#define STR_i "\151" +#define STR_j "\152" +#define STR_k "\153" +#define STR_l "\154" +#define STR_m "\155" +#define STR_n "\156" +#define STR_o "\157" +#define STR_p "\160" +#define STR_q "\161" +#define STR_r "\162" +#define STR_s "\163" +#define STR_t "\164" +#define STR_u "\165" +#define STR_v "\166" +#define STR_w "\167" +#define STR_x "\170" +#define STR_y "\171" +#define STR_z "\172" +#define STR_LEFT_CURLY_BRACKET "\173" +#define STR_VERTICAL_LINE "\174" +#define STR_RIGHT_CURLY_BRACKET "\175" +#define STR_TILDE "\176" + +#define STRING_ACCEPT0 STR_A STR_C STR_C STR_E STR_P STR_T "\0" +#define STRING_COMMIT0 STR_C STR_O STR_M STR_M STR_I STR_T "\0" +#define STRING_F0 STR_F "\0" +#define STRING_FAIL0 STR_F STR_A STR_I STR_L "\0" +#define STRING_MARK0 STR_M STR_A STR_R STR_K "\0" +#define STRING_PRUNE0 STR_P STR_R STR_U STR_N STR_E "\0" +#define STRING_SKIP0 STR_S STR_K STR_I STR_P "\0" +#define STRING_THEN STR_T STR_H STR_E STR_N + +#define STRING_alpha0 STR_a STR_l STR_p STR_h STR_a "\0" +#define STRING_lower0 STR_l STR_o STR_w STR_e STR_r "\0" +#define STRING_upper0 STR_u STR_p STR_p STR_e STR_r "\0" +#define STRING_alnum0 STR_a STR_l STR_n STR_u STR_m "\0" +#define STRING_ascii0 STR_a STR_s STR_c STR_i STR_i "\0" +#define STRING_blank0 STR_b STR_l STR_a STR_n STR_k "\0" +#define STRING_cntrl0 STR_c STR_n STR_t STR_r STR_l "\0" +#define STRING_digit0 STR_d STR_i STR_g STR_i STR_t "\0" +#define STRING_graph0 STR_g STR_r STR_a STR_p STR_h "\0" +#define STRING_print0 STR_p STR_r STR_i STR_n STR_t "\0" +#define STRING_punct0 STR_p STR_u STR_n STR_c STR_t "\0" +#define STRING_space0 STR_s STR_p STR_a STR_c STR_e "\0" +#define STRING_word0 STR_w STR_o STR_r STR_d "\0" +#define STRING_xdigit STR_x STR_d STR_i STR_g STR_i STR_t + +#define STRING_DEFINE STR_D STR_E STR_F STR_I STR_N STR_E +#define STRING_WEIRD_STARTWORD STR_LEFT_SQUARE_BRACKET STR_COLON STR_LESS_THAN_SIGN STR_COLON STR_RIGHT_SQUARE_BRACKET STR_RIGHT_SQUARE_BRACKET +#define STRING_WEIRD_ENDWORD STR_LEFT_SQUARE_BRACKET STR_COLON STR_GREATER_THAN_SIGN STR_COLON STR_RIGHT_SQUARE_BRACKET STR_RIGHT_SQUARE_BRACKET + +#define STRING_CR_RIGHTPAR STR_C STR_R STR_RIGHT_PARENTHESIS +#define STRING_LF_RIGHTPAR STR_L STR_F STR_RIGHT_PARENTHESIS +#define STRING_CRLF_RIGHTPAR STR_C STR_R STR_L STR_F STR_RIGHT_PARENTHESIS +#define STRING_ANY_RIGHTPAR STR_A STR_N STR_Y STR_RIGHT_PARENTHESIS +#define STRING_ANYCRLF_RIGHTPAR STR_A STR_N STR_Y STR_C STR_R STR_L STR_F STR_RIGHT_PARENTHESIS +#define STRING_BSR_ANYCRLF_RIGHTPAR STR_B STR_S STR_R STR_UNDERSCORE STR_A STR_N STR_Y STR_C STR_R STR_L STR_F STR_RIGHT_PARENTHESIS +#define STRING_BSR_UNICODE_RIGHTPAR STR_B STR_S STR_R STR_UNDERSCORE STR_U STR_N STR_I STR_C STR_O STR_D STR_E STR_RIGHT_PARENTHESIS +#define STRING_UTF8_RIGHTPAR STR_U STR_T STR_F STR_8 STR_RIGHT_PARENTHESIS +#define STRING_UTF16_RIGHTPAR STR_U STR_T STR_F STR_1 STR_6 STR_RIGHT_PARENTHESIS +#define STRING_UTF32_RIGHTPAR STR_U STR_T STR_F STR_3 STR_2 STR_RIGHT_PARENTHESIS +#define STRING_UTF_RIGHTPAR STR_U STR_T STR_F STR_RIGHT_PARENTHESIS +#define STRING_UCP_RIGHTPAR STR_U STR_C STR_P STR_RIGHT_PARENTHESIS +#define STRING_NO_AUTO_POSSESS_RIGHTPAR STR_N STR_O STR_UNDERSCORE STR_A STR_U STR_T STR_O STR_UNDERSCORE STR_P STR_O STR_S STR_S STR_E STR_S STR_S STR_RIGHT_PARENTHESIS +#define STRING_NO_START_OPT_RIGHTPAR STR_N STR_O STR_UNDERSCORE STR_S STR_T STR_A STR_R STR_T STR_UNDERSCORE STR_O STR_P STR_T STR_RIGHT_PARENTHESIS +#define STRING_LIMIT_MATCH_EQ STR_L STR_I STR_M STR_I STR_T STR_UNDERSCORE STR_M STR_A STR_T STR_C STR_H STR_EQUALS_SIGN +#define STRING_LIMIT_RECURSION_EQ STR_L STR_I STR_M STR_I STR_T STR_UNDERSCORE STR_R STR_E STR_C STR_U STR_R STR_S STR_I STR_O STR_N STR_EQUALS_SIGN + +#endif /* SUPPORT_UTF */ + +/* Escape items that are just an encoding of a particular data value. */ + +#ifndef ESC_a +#define ESC_a CHAR_BEL +#endif + +#ifndef ESC_e +#define ESC_e CHAR_ESC +#endif + +#ifndef ESC_f +#define ESC_f CHAR_FF +#endif + +#ifndef ESC_n +#define ESC_n CHAR_LF +#endif + +#ifndef ESC_r +#define ESC_r CHAR_CR +#endif + +/* We can't officially use ESC_t because it is a POSIX reserved identifier +(presumably because of all the others like size_t). */ + +#ifndef ESC_tee +#define ESC_tee CHAR_HT +#endif + +/* Codes for different types of Unicode property */ + +#define PT_ANY 0 /* Any property - matches all chars */ +#define PT_LAMP 1 /* L& - the union of Lu, Ll, Lt */ +#define PT_GC 2 /* Specified general characteristic (e.g. L) */ +#define PT_PC 3 /* Specified particular characteristic (e.g. Lu) */ +#define PT_SC 4 /* Script (e.g. Han) */ +#define PT_ALNUM 5 /* Alphanumeric - the union of L and N */ +#define PT_SPACE 6 /* Perl space - Z plus 9,10,12,13 */ +#define PT_PXSPACE 7 /* POSIX space - Z plus 9,10,11,12,13 */ +#define PT_WORD 8 /* Word - L plus N plus underscore */ +#define PT_CLIST 9 /* Pseudo-property: match character list */ +#define PT_UCNC 10 /* Universal Character nameable character */ +#define PT_TABSIZE 11 /* Size of square table for autopossessify tests */ + +/* The following special properties are used only in XCLASS items, when POSIX +classes are specified and PCRE_UCP is set - in other words, for Unicode +handling of these classes. They are not available via the \p or \P escapes like +those in the above list, and so they do not take part in the autopossessifying +table. */ + +#define PT_PXGRAPH 11 /* [:graph:] - characters that mark the paper */ +#define PT_PXPRINT 12 /* [:print:] - [:graph:] plus non-control spaces */ +#define PT_PXPUNCT 13 /* [:punct:] - punctuation characters */ + +/* Flag bits and data types for the extended class (OP_XCLASS) for classes that +contain characters with values greater than 255. */ + +#define XCL_NOT 0x01 /* Flag: this is a negative class */ +#define XCL_MAP 0x02 /* Flag: a 32-byte map is present */ +#define XCL_HASPROP 0x04 /* Flag: property checks are present. */ + +#define XCL_END 0 /* Marks end of individual items */ +#define XCL_SINGLE 1 /* Single item (one multibyte char) follows */ +#define XCL_RANGE 2 /* A range (two multibyte chars) follows */ +#define XCL_PROP 3 /* Unicode property (2-byte property code follows) */ +#define XCL_NOTPROP 4 /* Unicode inverted property (ditto) */ + +/* These are escaped items that aren't just an encoding of a particular data +value such as \n. They must have non-zero values, as check_escape() returns 0 +for a data character. Also, they must appear in the same order as in the +opcode definitions below, up to ESC_z. There's a dummy for OP_ALLANY because it +corresponds to "." in DOTALL mode rather than an escape sequence. It is also +used for [^] in JavaScript compatibility mode, and for \C in non-utf mode. In +non-DOTALL mode, "." behaves like \N. + +The special values ESC_DU, ESC_du, etc. are used instead of ESC_D, ESC_d, etc. +when PCRE_UCP is set and replacement of \d etc by \p sequences is required. +They must be contiguous, and remain in order so that the replacements can be +looked up from a table. + +Negative numbers are used to encode a backreference (\1, \2, \3, etc.) in +check_escape(). There are two tests in the code for an escape +greater than ESC_b and less than ESC_Z to detect the types that may be +repeated. These are the types that consume characters. If any new escapes are +put in between that don't consume a character, that code will have to change. +*/ + +enum { ESC_A = 1, ESC_G, ESC_K, ESC_B, ESC_b, ESC_D, ESC_d, ESC_S, ESC_s, + ESC_W, ESC_w, ESC_N, ESC_dum, ESC_C, ESC_P, ESC_p, ESC_R, ESC_H, + ESC_h, ESC_V, ESC_v, ESC_X, ESC_Z, ESC_z, + ESC_E, ESC_Q, ESC_g, ESC_k, + ESC_DU, ESC_du, ESC_SU, ESC_su, ESC_WU, ESC_wu }; + + +/********************** Opcode definitions ******************/ + +/****** NOTE NOTE NOTE ****** + +Starting from 1 (i.e. after OP_END), the values up to OP_EOD must correspond in +order to the list of escapes immediately above. Furthermore, values up to +OP_DOLLM must not be changed without adjusting the table called autoposstab in +pcre_compile.c + +Whenever this list is updated, the two macro definitions that follow must be +updated to match. The possessification table called "opcode_possessify" in +pcre_compile.c must also be updated, and also the tables called "coptable" +and "poptable" in pcre_dfa_exec.c. + +****** NOTE NOTE NOTE ******/ + + +/* The values between FIRST_AUTOTAB_OP and LAST_AUTOTAB_RIGHT_OP, inclusive, +are used in a table for deciding whether a repeated character type can be +auto-possessified. */ + +#define FIRST_AUTOTAB_OP OP_NOT_DIGIT +#define LAST_AUTOTAB_LEFT_OP OP_EXTUNI +#define LAST_AUTOTAB_RIGHT_OP OP_DOLLM + +enum { + OP_END, /* 0 End of pattern */ + + /* Values corresponding to backslashed metacharacters */ + + OP_SOD, /* 1 Start of data: \A */ + OP_SOM, /* 2 Start of match (subject + offset): \G */ + OP_SET_SOM, /* 3 Set start of match (\K) */ + OP_NOT_WORD_BOUNDARY, /* 4 \B */ + OP_WORD_BOUNDARY, /* 5 \b */ + OP_NOT_DIGIT, /* 6 \D */ + OP_DIGIT, /* 7 \d */ + OP_NOT_WHITESPACE, /* 8 \S */ + OP_WHITESPACE, /* 9 \s */ + OP_NOT_WORDCHAR, /* 10 \W */ + OP_WORDCHAR, /* 11 \w */ + + OP_ANY, /* 12 Match any character except newline (\N) */ + OP_ALLANY, /* 13 Match any character */ + OP_ANYBYTE, /* 14 Match any byte (\C); different to OP_ANY for UTF-8 */ + OP_NOTPROP, /* 15 \P (not Unicode property) */ + OP_PROP, /* 16 \p (Unicode property) */ + OP_ANYNL, /* 17 \R (any newline sequence) */ + OP_NOT_HSPACE, /* 18 \H (not horizontal whitespace) */ + OP_HSPACE, /* 19 \h (horizontal whitespace) */ + OP_NOT_VSPACE, /* 20 \V (not vertical whitespace) */ + OP_VSPACE, /* 21 \v (vertical whitespace) */ + OP_EXTUNI, /* 22 \X (extended Unicode sequence */ + OP_EODN, /* 23 End of data or \n at end of data (\Z) */ + OP_EOD, /* 24 End of data (\z) */ + + /* Line end assertions */ + + OP_DOLL, /* 25 End of line - not multiline */ + OP_DOLLM, /* 26 End of line - multiline */ + OP_CIRC, /* 27 Start of line - not multiline */ + OP_CIRCM, /* 28 Start of line - multiline */ + + /* Single characters; caseful must precede the caseless ones */ + + OP_CHAR, /* 29 Match one character, casefully */ + OP_CHARI, /* 30 Match one character, caselessly */ + OP_NOT, /* 31 Match one character, not the given one, casefully */ + OP_NOTI, /* 32 Match one character, not the given one, caselessly */ + + /* The following sets of 13 opcodes must always be kept in step because + the offset from the first one is used to generate the others. */ + + /* Repeated characters; caseful must precede the caseless ones */ + + OP_STAR, /* 33 The maximizing and minimizing versions of */ + OP_MINSTAR, /* 34 these six opcodes must come in pairs, with */ + OP_PLUS, /* 35 the minimizing one second. */ + OP_MINPLUS, /* 36 */ + OP_QUERY, /* 37 */ + OP_MINQUERY, /* 38 */ + + OP_UPTO, /* 39 From 0 to n matches of one character, caseful*/ + OP_MINUPTO, /* 40 */ + OP_EXACT, /* 41 Exactly n matches */ + + OP_POSSTAR, /* 42 Possessified star, caseful */ + OP_POSPLUS, /* 43 Possessified plus, caseful */ + OP_POSQUERY, /* 44 Posesssified query, caseful */ + OP_POSUPTO, /* 45 Possessified upto, caseful */ + + /* Repeated characters; caseless must follow the caseful ones */ + + OP_STARI, /* 46 */ + OP_MINSTARI, /* 47 */ + OP_PLUSI, /* 48 */ + OP_MINPLUSI, /* 49 */ + OP_QUERYI, /* 50 */ + OP_MINQUERYI, /* 51 */ + + OP_UPTOI, /* 52 From 0 to n matches of one character, caseless */ + OP_MINUPTOI, /* 53 */ + OP_EXACTI, /* 54 */ + + OP_POSSTARI, /* 55 Possessified star, caseless */ + OP_POSPLUSI, /* 56 Possessified plus, caseless */ + OP_POSQUERYI, /* 57 Posesssified query, caseless */ + OP_POSUPTOI, /* 58 Possessified upto, caseless */ + + /* The negated ones must follow the non-negated ones, and match them */ + /* Negated repeated character, caseful; must precede the caseless ones */ + + OP_NOTSTAR, /* 59 The maximizing and minimizing versions of */ + OP_NOTMINSTAR, /* 60 these six opcodes must come in pairs, with */ + OP_NOTPLUS, /* 61 the minimizing one second. They must be in */ + OP_NOTMINPLUS, /* 62 exactly the same order as those above. */ + OP_NOTQUERY, /* 63 */ + OP_NOTMINQUERY, /* 64 */ + + OP_NOTUPTO, /* 65 From 0 to n matches, caseful */ + OP_NOTMINUPTO, /* 66 */ + OP_NOTEXACT, /* 67 Exactly n matches */ + + OP_NOTPOSSTAR, /* 68 Possessified versions, caseful */ + OP_NOTPOSPLUS, /* 69 */ + OP_NOTPOSQUERY, /* 70 */ + OP_NOTPOSUPTO, /* 71 */ + + /* Negated repeated character, caseless; must follow the caseful ones */ + + OP_NOTSTARI, /* 72 */ + OP_NOTMINSTARI, /* 73 */ + OP_NOTPLUSI, /* 74 */ + OP_NOTMINPLUSI, /* 75 */ + OP_NOTQUERYI, /* 76 */ + OP_NOTMINQUERYI, /* 77 */ + + OP_NOTUPTOI, /* 78 From 0 to n matches, caseless */ + OP_NOTMINUPTOI, /* 79 */ + OP_NOTEXACTI, /* 80 Exactly n matches */ + + OP_NOTPOSSTARI, /* 81 Possessified versions, caseless */ + OP_NOTPOSPLUSI, /* 82 */ + OP_NOTPOSQUERYI, /* 83 */ + OP_NOTPOSUPTOI, /* 84 */ + + /* Character types */ + + OP_TYPESTAR, /* 85 The maximizing and minimizing versions of */ + OP_TYPEMINSTAR, /* 86 these six opcodes must come in pairs, with */ + OP_TYPEPLUS, /* 87 the minimizing one second. These codes must */ + OP_TYPEMINPLUS, /* 88 be in exactly the same order as those above. */ + OP_TYPEQUERY, /* 89 */ + OP_TYPEMINQUERY, /* 90 */ + + OP_TYPEUPTO, /* 91 From 0 to n matches */ + OP_TYPEMINUPTO, /* 92 */ + OP_TYPEEXACT, /* 93 Exactly n matches */ + + OP_TYPEPOSSTAR, /* 94 Possessified versions */ + OP_TYPEPOSPLUS, /* 95 */ + OP_TYPEPOSQUERY, /* 96 */ + OP_TYPEPOSUPTO, /* 97 */ + + /* These are used for character classes and back references; only the + first six are the same as the sets above. */ + + OP_CRSTAR, /* 98 The maximizing and minimizing versions of */ + OP_CRMINSTAR, /* 99 all these opcodes must come in pairs, with */ + OP_CRPLUS, /* 100 the minimizing one second. These codes must */ + OP_CRMINPLUS, /* 101 be in exactly the same order as those above. */ + OP_CRQUERY, /* 102 */ + OP_CRMINQUERY, /* 103 */ + + OP_CRRANGE, /* 104 These are different to the three sets above. */ + OP_CRMINRANGE, /* 105 */ + + OP_CRPOSSTAR, /* 106 Possessified versions */ + OP_CRPOSPLUS, /* 107 */ + OP_CRPOSQUERY, /* 108 */ + OP_CRPOSRANGE, /* 109 */ + + /* End of quantifier opcodes */ + + OP_CLASS, /* 110 Match a character class, chars < 256 only */ + OP_NCLASS, /* 111 Same, but the bitmap was created from a negative + class - the difference is relevant only when a + character > 255 is encountered. */ + OP_XCLASS, /* 112 Extended class for handling > 255 chars within the + class. This does both positive and negative. */ + OP_REF, /* 113 Match a back reference, casefully */ + OP_REFI, /* 114 Match a back reference, caselessly */ + OP_DNREF, /* 115 Match a duplicate name backref, casefully */ + OP_DNREFI, /* 116 Match a duplicate name backref, caselessly */ + OP_RECURSE, /* 117 Match a numbered subpattern (possibly recursive) */ + OP_CALLOUT, /* 118 Call out to external function if provided */ + + OP_ALT, /* 119 Start of alternation */ + OP_KET, /* 120 End of group that doesn't have an unbounded repeat */ + OP_KETRMAX, /* 121 These two must remain together and in this */ + OP_KETRMIN, /* 122 order. They are for groups the repeat for ever. */ + OP_KETRPOS, /* 123 Possessive unlimited repeat. */ + + /* The assertions must come before BRA, CBRA, ONCE, and COND, and the four + asserts must remain in order. */ + + OP_REVERSE, /* 124 Move pointer back - used in lookbehind assertions */ + OP_ASSERT, /* 125 Positive lookahead */ + OP_ASSERT_NOT, /* 126 Negative lookahead */ + OP_ASSERTBACK, /* 127 Positive lookbehind */ + OP_ASSERTBACK_NOT, /* 128 Negative lookbehind */ + + /* ONCE, ONCE_NC, BRA, BRAPOS, CBRA, CBRAPOS, and COND must come immediately + after the assertions, with ONCE first, as there's a test for >= ONCE for a + subpattern that isn't an assertion. The POS versions must immediately follow + the non-POS versions in each case. */ + + OP_ONCE, /* 129 Atomic group, contains captures */ + OP_ONCE_NC, /* 130 Atomic group containing no captures */ + OP_BRA, /* 131 Start of non-capturing bracket */ + OP_BRAPOS, /* 132 Ditto, with unlimited, possessive repeat */ + OP_CBRA, /* 133 Start of capturing bracket */ + OP_CBRAPOS, /* 134 Ditto, with unlimited, possessive repeat */ + OP_COND, /* 135 Conditional group */ + + /* These five must follow the previous five, in the same order. There's a + check for >= SBRA to distinguish the two sets. */ + + OP_SBRA, /* 136 Start of non-capturing bracket, check empty */ + OP_SBRAPOS, /* 137 Ditto, with unlimited, possessive repeat */ + OP_SCBRA, /* 138 Start of capturing bracket, check empty */ + OP_SCBRAPOS, /* 139 Ditto, with unlimited, possessive repeat */ + OP_SCOND, /* 140 Conditional group, check empty */ + + /* The next two pairs must (respectively) be kept together. */ + + OP_CREF, /* 141 Used to hold a capture number as condition */ + OP_DNCREF, /* 142 Used to point to duplicate names as a condition */ + OP_RREF, /* 143 Used to hold a recursion number as condition */ + OP_DNRREF, /* 144 Used to point to duplicate names as a condition */ + OP_DEF, /* 145 The DEFINE condition */ + + OP_BRAZERO, /* 146 These two must remain together and in this */ + OP_BRAMINZERO, /* 147 order. */ + OP_BRAPOSZERO, /* 148 */ + + /* These are backtracking control verbs */ + + OP_MARK, /* 149 always has an argument */ + OP_PRUNE, /* 150 */ + OP_PRUNE_ARG, /* 151 same, but with argument */ + OP_SKIP, /* 152 */ + OP_SKIP_ARG, /* 153 same, but with argument */ + OP_THEN, /* 154 */ + OP_THEN_ARG, /* 155 same, but with argument */ + OP_COMMIT, /* 156 */ + + /* These are forced failure and success verbs */ + + OP_FAIL, /* 157 */ + OP_ACCEPT, /* 158 */ + OP_ASSERT_ACCEPT, /* 159 Used inside assertions */ + OP_CLOSE, /* 160 Used before OP_ACCEPT to close open captures */ + + /* This is used to skip a subpattern with a {0} quantifier */ + + OP_SKIPZERO, /* 161 */ + + /* This is not an opcode, but is used to check that tables indexed by opcode + are the correct length, in order to catch updating errors - there have been + some in the past. */ + + OP_TABLE_LENGTH +}; + +/* *** NOTE NOTE NOTE *** Whenever the list above is updated, the two macro +definitions that follow must also be updated to match. There are also tables +called "opcode_possessify" in pcre_compile.c and "coptable" and "poptable" in +pcre_dfa_exec.c that must be updated. */ + + +/* This macro defines textual names for all the opcodes. These are used only +for debugging, and some of them are only partial names. The macro is referenced +only in pcre_printint.c, which fills out the full names in many cases (and in +some cases doesn't actually use these names at all). */ + +#define OP_NAME_LIST \ + "End", "\\A", "\\G", "\\K", "\\B", "\\b", "\\D", "\\d", \ + "\\S", "\\s", "\\W", "\\w", "Any", "AllAny", "Anybyte", \ + "notprop", "prop", "\\R", "\\H", "\\h", "\\V", "\\v", \ + "extuni", "\\Z", "\\z", \ + "$", "$", "^", "^", "char", "chari", "not", "noti", \ + "*", "*?", "+", "+?", "?", "??", \ + "{", "{", "{", \ + "*+","++", "?+", "{", \ + "*", "*?", "+", "+?", "?", "??", \ + "{", "{", "{", \ + "*+","++", "?+", "{", \ + "*", "*?", "+", "+?", "?", "??", \ + "{", "{", "{", \ + "*+","++", "?+", "{", \ + "*", "*?", "+", "+?", "?", "??", \ + "{", "{", "{", \ + "*+","++", "?+", "{", \ + "*", "*?", "+", "+?", "?", "??", "{", "{", "{", \ + "*+","++", "?+", "{", \ + "*", "*?", "+", "+?", "?", "??", "{", "{", \ + "*+","++", "?+", "{", \ + "class", "nclass", "xclass", "Ref", "Refi", "DnRef", "DnRefi", \ + "Recurse", "Callout", \ + "Alt", "Ket", "KetRmax", "KetRmin", "KetRpos", \ + "Reverse", "Assert", "Assert not", "AssertB", "AssertB not", \ + "Once", "Once_NC", \ + "Bra", "BraPos", "CBra", "CBraPos", \ + "Cond", \ + "SBra", "SBraPos", "SCBra", "SCBraPos", \ + "SCond", \ + "Cond ref", "Cond dnref", "Cond rec", "Cond dnrec", "Cond def", \ + "Brazero", "Braminzero", "Braposzero", \ + "*MARK", "*PRUNE", "*PRUNE", "*SKIP", "*SKIP", \ + "*THEN", "*THEN", "*COMMIT", "*FAIL", \ + "*ACCEPT", "*ASSERT_ACCEPT", \ + "Close", "Skip zero" + + +/* This macro defines the length of fixed length operations in the compiled +regex. The lengths are used when searching for specific things, and also in the +debugging printing of a compiled regex. We use a macro so that it can be +defined close to the definitions of the opcodes themselves. + +As things have been extended, some of these are no longer fixed lenths, but are +minima instead. For example, the length of a single-character repeat may vary +in UTF-8 mode. The code that uses this table must know about such things. */ + +#define OP_LENGTHS \ + 1, /* End */ \ + 1, 1, 1, 1, 1, /* \A, \G, \K, \B, \b */ \ + 1, 1, 1, 1, 1, 1, /* \D, \d, \S, \s, \W, \w */ \ + 1, 1, 1, /* Any, AllAny, Anybyte */ \ + 3, 3, /* \P, \p */ \ + 1, 1, 1, 1, 1, /* \R, \H, \h, \V, \v */ \ + 1, /* \X */ \ + 1, 1, 1, 1, 1, 1, /* \Z, \z, $, $M ^, ^M */ \ + 2, /* Char - the minimum length */ \ + 2, /* Chari - the minimum length */ \ + 2, /* not */ \ + 2, /* noti */ \ + /* Positive single-char repeats ** These are */ \ + 2, 2, 2, 2, 2, 2, /* *, *?, +, +?, ?, ?? ** minima in */ \ + 2+IMM2_SIZE, 2+IMM2_SIZE, /* upto, minupto ** mode */ \ + 2+IMM2_SIZE, /* exact */ \ + 2, 2, 2, 2+IMM2_SIZE, /* *+, ++, ?+, upto+ */ \ + 2, 2, 2, 2, 2, 2, /* *I, *?I, +I, +?I, ?I, ??I ** UTF-8 */ \ + 2+IMM2_SIZE, 2+IMM2_SIZE, /* upto I, minupto I */ \ + 2+IMM2_SIZE, /* exact I */ \ + 2, 2, 2, 2+IMM2_SIZE, /* *+I, ++I, ?+I, upto+I */ \ + /* Negative single-char repeats - only for chars < 256 */ \ + 2, 2, 2, 2, 2, 2, /* NOT *, *?, +, +?, ?, ?? */ \ + 2+IMM2_SIZE, 2+IMM2_SIZE, /* NOT upto, minupto */ \ + 2+IMM2_SIZE, /* NOT exact */ \ + 2, 2, 2, 2+IMM2_SIZE, /* Possessive NOT *, +, ?, upto */ \ + 2, 2, 2, 2, 2, 2, /* NOT *I, *?I, +I, +?I, ?I, ??I */ \ + 2+IMM2_SIZE, 2+IMM2_SIZE, /* NOT upto I, minupto I */ \ + 2+IMM2_SIZE, /* NOT exact I */ \ + 2, 2, 2, 2+IMM2_SIZE, /* Possessive NOT *I, +I, ?I, upto I */ \ + /* Positive type repeats */ \ + 2, 2, 2, 2, 2, 2, /* Type *, *?, +, +?, ?, ?? */ \ + 2+IMM2_SIZE, 2+IMM2_SIZE, /* Type upto, minupto */ \ + 2+IMM2_SIZE, /* Type exact */ \ + 2, 2, 2, 2+IMM2_SIZE, /* Possessive *+, ++, ?+, upto+ */ \ + /* Character class & ref repeats */ \ + 1, 1, 1, 1, 1, 1, /* *, *?, +, +?, ?, ?? */ \ + 1+2*IMM2_SIZE, 1+2*IMM2_SIZE, /* CRRANGE, CRMINRANGE */ \ + 1, 1, 1, 1+2*IMM2_SIZE, /* Possessive *+, ++, ?+, CRPOSRANGE */ \ + 1+(32/sizeof(pcre_uchar)), /* CLASS */ \ + 1+(32/sizeof(pcre_uchar)), /* NCLASS */ \ + 0, /* XCLASS - variable length */ \ + 1+IMM2_SIZE, /* REF */ \ + 1+IMM2_SIZE, /* REFI */ \ + 1+2*IMM2_SIZE, /* DNREF */ \ + 1+2*IMM2_SIZE, /* DNREFI */ \ + 1+LINK_SIZE, /* RECURSE */ \ + 2+2*LINK_SIZE, /* CALLOUT */ \ + 1+LINK_SIZE, /* Alt */ \ + 1+LINK_SIZE, /* Ket */ \ + 1+LINK_SIZE, /* KetRmax */ \ + 1+LINK_SIZE, /* KetRmin */ \ + 1+LINK_SIZE, /* KetRpos */ \ + 1+LINK_SIZE, /* Reverse */ \ + 1+LINK_SIZE, /* Assert */ \ + 1+LINK_SIZE, /* Assert not */ \ + 1+LINK_SIZE, /* Assert behind */ \ + 1+LINK_SIZE, /* Assert behind not */ \ + 1+LINK_SIZE, /* ONCE */ \ + 1+LINK_SIZE, /* ONCE_NC */ \ + 1+LINK_SIZE, /* BRA */ \ + 1+LINK_SIZE, /* BRAPOS */ \ + 1+LINK_SIZE+IMM2_SIZE, /* CBRA */ \ + 1+LINK_SIZE+IMM2_SIZE, /* CBRAPOS */ \ + 1+LINK_SIZE, /* COND */ \ + 1+LINK_SIZE, /* SBRA */ \ + 1+LINK_SIZE, /* SBRAPOS */ \ + 1+LINK_SIZE+IMM2_SIZE, /* SCBRA */ \ + 1+LINK_SIZE+IMM2_SIZE, /* SCBRAPOS */ \ + 1+LINK_SIZE, /* SCOND */ \ + 1+IMM2_SIZE, 1+2*IMM2_SIZE, /* CREF, DNCREF */ \ + 1+IMM2_SIZE, 1+2*IMM2_SIZE, /* RREF, DNRREF */ \ + 1, /* DEF */ \ + 1, 1, 1, /* BRAZERO, BRAMINZERO, BRAPOSZERO */ \ + 3, 1, 3, /* MARK, PRUNE, PRUNE_ARG */ \ + 1, 3, /* SKIP, SKIP_ARG */ \ + 1, 3, /* THEN, THEN_ARG */ \ + 1, 1, 1, 1, /* COMMIT, FAIL, ACCEPT, ASSERT_ACCEPT */ \ + 1+IMM2_SIZE, 1 /* CLOSE, SKIPZERO */ + +/* A magic value for OP_RREF to indicate the "any recursion" condition. */ + +#define RREF_ANY 0xffff + +/* Compile time error code numbers. They are given names so that they can more +easily be tracked. When a new number is added, the table called eint in +pcreposix.c must be updated. */ + +enum { ERR0, ERR1, ERR2, ERR3, ERR4, ERR5, ERR6, ERR7, ERR8, ERR9, + ERR10, ERR11, ERR12, ERR13, ERR14, ERR15, ERR16, ERR17, ERR18, ERR19, + ERR20, ERR21, ERR22, ERR23, ERR24, ERR25, ERR26, ERR27, ERR28, ERR29, + ERR30, ERR31, ERR32, ERR33, ERR34, ERR35, ERR36, ERR37, ERR38, ERR39, + ERR40, ERR41, ERR42, ERR43, ERR44, ERR45, ERR46, ERR47, ERR48, ERR49, + ERR50, ERR51, ERR52, ERR53, ERR54, ERR55, ERR56, ERR57, ERR58, ERR59, + ERR60, ERR61, ERR62, ERR63, ERR64, ERR65, ERR66, ERR67, ERR68, ERR69, + ERR70, ERR71, ERR72, ERR73, ERR74, ERR75, ERR76, ERR77, ERR78, ERR79, + ERR80, ERR81, ERR82, ERR83, ERR84, ERR85, ERR86, ERR87, ERRCOUNT }; + +/* JIT compiling modes. The function list is indexed by them. */ + +enum { JIT_COMPILE, JIT_PARTIAL_SOFT_COMPILE, JIT_PARTIAL_HARD_COMPILE, + JIT_NUMBER_OF_COMPILE_MODES }; + +/* The real format of the start of the pcre block; the index of names and the +code vector run on as long as necessary after the end. We store an explicit +offset to the name table so that if a regex is compiled on one host, saved, and +then run on another where the size of pointers is different, all might still +be well. + +The size of the structure must be a multiple of 8 bytes. For the case of +compiled-on-4 and run-on-8, we include an extra pointer that is always NULL so +that there are an even number of pointers which therefore are a multiple of 8 +bytes. + +It is necessary to fork the struct for the 32 bit library, since it needs to +use pcre_uint32 for first_char and req_char. We can't put an ifdef inside the +typedef because pcretest needs access to the struct of the 8-, 16- and 32-bit +variants. + +*** WARNING *** +When new fields are added to these structures, remember to adjust the code in +pcre_byte_order.c that is concerned with swapping the byte order of the fields +when a compiled regex is reloaded on a host with different endianness. +*** WARNING *** +There is also similar byte-flipping code in pcretest.c, which is used for +testing the byte-flipping features. It must also be kept in step. +*** WARNING *** +*/ + +typedef struct real_pcre8_or_16 { + pcre_uint32 magic_number; + pcre_uint32 size; /* Total that was malloced */ + pcre_uint32 options; /* Public options */ + pcre_uint32 flags; /* Private flags */ + pcre_uint32 limit_match; /* Limit set from regex */ + pcre_uint32 limit_recursion; /* Limit set from regex */ + pcre_uint16 first_char; /* Starting character */ + pcre_uint16 req_char; /* This character must be seen */ + pcre_uint16 max_lookbehind; /* Longest lookbehind (characters) */ + pcre_uint16 top_bracket; /* Highest numbered group */ + pcre_uint16 top_backref; /* Highest numbered back reference */ + pcre_uint16 name_table_offset; /* Offset to name table that follows */ + pcre_uint16 name_entry_size; /* Size of any name items */ + pcre_uint16 name_count; /* Number of name items */ + pcre_uint16 ref_count; /* Reference count */ + pcre_uint16 dummy1; /* To ensure size is a multiple of 8 */ + pcre_uint16 dummy2; /* To ensure size is a multiple of 8 */ + pcre_uint16 dummy3; /* To ensure size is a multiple of 8 */ + const pcre_uint8 *tables; /* Pointer to tables or NULL for std */ + void *nullpad; /* NULL padding */ +} real_pcre8_or_16; + +typedef struct real_pcre8_or_16 real_pcre; +typedef struct real_pcre8_or_16 real_pcre16; + +typedef struct real_pcre32 { + pcre_uint32 magic_number; + pcre_uint32 size; /* Total that was malloced */ + pcre_uint32 options; /* Public options */ + pcre_uint32 flags; /* Private flags */ + pcre_uint32 limit_match; /* Limit set from regex */ + pcre_uint32 limit_recursion; /* Limit set from regex */ + pcre_uint32 first_char; /* Starting character */ + pcre_uint32 req_char; /* This character must be seen */ + pcre_uint16 max_lookbehind; /* Longest lookbehind (characters) */ + pcre_uint16 top_bracket; /* Highest numbered group */ + pcre_uint16 top_backref; /* Highest numbered back reference */ + pcre_uint16 name_table_offset; /* Offset to name table that follows */ + pcre_uint16 name_entry_size; /* Size of any name items */ + pcre_uint16 name_count; /* Number of name items */ + pcre_uint16 ref_count; /* Reference count */ + pcre_uint16 dummy; /* To ensure size is a multiple of 8 */ + const pcre_uint8 *tables; /* Pointer to tables or NULL for std */ + void *nullpad; /* NULL padding */ +} real_pcre32; + +#if defined COMPILE_PCRE8 +#define REAL_PCRE real_pcre +#elif defined COMPILE_PCRE16 +#define REAL_PCRE real_pcre16 +#elif defined COMPILE_PCRE32 +#define REAL_PCRE real_pcre32 +#endif + +/* Assert that the size of REAL_PCRE is divisible by 8 */ +typedef int __assert_real_pcre_size_divisible_8[(sizeof(REAL_PCRE) % 8) == 0 ? 1 : -1]; + +/* Needed in pcretest to access some fields in the real_pcre* structures + * directly. They're unified for 8/16/32 bits since the structs only differ + * after these fields; if that ever changes, need to fork those defines into + * 8/16 and 32 bit versions. */ +#define REAL_PCRE_MAGIC(re) (((REAL_PCRE*)re)->magic_number) +#define REAL_PCRE_SIZE(re) (((REAL_PCRE*)re)->size) +#define REAL_PCRE_OPTIONS(re) (((REAL_PCRE*)re)->options) +#define REAL_PCRE_FLAGS(re) (((REAL_PCRE*)re)->flags) + +/* The format of the block used to store data from pcre_study(). The same +remark (see NOTE above) about extending this structure applies. */ + +typedef struct pcre_study_data { + pcre_uint32 size; /* Total that was malloced */ + pcre_uint32 flags; /* Private flags */ + pcre_uint8 start_bits[32]; /* Starting char bits */ + pcre_uint32 minlength; /* Minimum subject length */ +} pcre_study_data; + +/* Structure for building a chain of open capturing subpatterns during +compiling, so that instructions to close them can be compiled when (*ACCEPT) is +encountered. This is also used to identify subpatterns that contain recursive +back references to themselves, so that they can be made atomic. */ + +typedef struct open_capitem { + struct open_capitem *next; /* Chain link */ + pcre_uint16 number; /* Capture number */ + pcre_uint16 flag; /* Set TRUE if recursive back ref */ +} open_capitem; + +/* Structure for building a list of named groups during the first pass of +compiling. */ + +typedef struct named_group { + const pcre_uchar *name; /* Points to the name in the pattern */ + int length; /* Length of the name */ + pcre_uint32 number; /* Group number */ +} named_group; + +/* Structure for passing "static" information around between the functions +doing the compiling, so that they are thread-safe. */ + +typedef struct compile_data { + const pcre_uint8 *lcc; /* Points to lower casing table */ + const pcre_uint8 *fcc; /* Points to case-flipping table */ + const pcre_uint8 *cbits; /* Points to character type table */ + const pcre_uint8 *ctypes; /* Points to table of type maps */ + const pcre_uchar *start_workspace;/* The start of working space */ + const pcre_uchar *start_code; /* The start of the compiled code */ + const pcre_uchar *start_pattern; /* The start of the pattern */ + const pcre_uchar *end_pattern; /* The end of the pattern */ + pcre_uchar *hwm; /* High watermark of workspace */ + open_capitem *open_caps; /* Chain of open capture items */ + named_group *named_groups; /* Points to vector in pre-compile */ + pcre_uchar *name_table; /* The name/number table */ + int names_found; /* Number of entries so far */ + int name_entry_size; /* Size of each entry */ + int named_group_list_size; /* Number of entries in the list */ + int workspace_size; /* Size of workspace */ + unsigned int bracount; /* Count of capturing parens as we compile */ + int final_bracount; /* Saved value after first pass */ + int max_lookbehind; /* Maximum lookbehind (characters) */ + int top_backref; /* Maximum back reference */ + unsigned int backref_map; /* Bitmap of low back refs */ + unsigned int namedrefcount; /* Number of backreferences by name */ + int parens_depth; /* Depth of nested parentheses */ + int assert_depth; /* Depth of nested assertions */ + pcre_uint32 external_options; /* External (initial) options */ + pcre_uint32 external_flags; /* External flag bits to be set */ + int req_varyopt; /* "After variable item" flag for reqbyte */ + BOOL had_accept; /* (*ACCEPT) encountered */ + BOOL had_pruneorskip; /* (*PRUNE) or (*SKIP) encountered */ + BOOL check_lookbehind; /* Lookbehinds need later checking */ + BOOL dupnames; /* Duplicate names exist */ + BOOL dupgroups; /* Duplicate groups exist: (?| found */ + BOOL iscondassert; /* Next assert is a condition */ + int nltype; /* Newline type */ + int nllen; /* Newline string length */ + pcre_uchar nl[4]; /* Newline string when fixed length */ +} compile_data; + +/* Structure for maintaining a chain of pointers to the currently incomplete +branches, for testing for left recursion while compiling. */ + +typedef struct branch_chain { + struct branch_chain *outer; + pcre_uchar *current_branch; +} branch_chain; + +/* Structure for mutual recursion detection. */ + +typedef struct recurse_check { + struct recurse_check *prev; + const pcre_uchar *group; +} recurse_check; + +/* Structure for items in a linked list that represents an explicit recursive +call within the pattern; used by pcre_exec(). */ + +typedef struct recursion_info { + struct recursion_info *prevrec; /* Previous recursion record (or NULL) */ + unsigned int group_num; /* Number of group that was called */ + int *offset_save; /* Pointer to start of saved offsets */ + int saved_max; /* Number of saved offsets */ + int saved_capture_last; /* Last capture number */ + PCRE_PUCHAR subject_position; /* Position at start of recursion */ +} recursion_info; + +/* A similar structure for pcre_dfa_exec(). */ + +typedef struct dfa_recursion_info { + struct dfa_recursion_info *prevrec; + int group_num; + PCRE_PUCHAR subject_position; +} dfa_recursion_info; + +/* Structure for building a chain of data for holding the values of the subject +pointer at the start of each subpattern, so as to detect when an empty string +has been matched by a subpattern - to break infinite loops; used by +pcre_exec(). */ + +typedef struct eptrblock { + struct eptrblock *epb_prev; + PCRE_PUCHAR epb_saved_eptr; +} eptrblock; + + +/* Structure for passing "static" information around between the functions +doing traditional NFA matching, so that they are thread-safe. */ + +typedef struct match_data { + unsigned long int match_call_count; /* As it says */ + unsigned long int match_limit; /* As it says */ + unsigned long int match_limit_recursion; /* As it says */ + int *offset_vector; /* Offset vector */ + int offset_end; /* One past the end */ + int offset_max; /* The maximum usable for return data */ + int nltype; /* Newline type */ + int nllen; /* Newline string length */ + int name_count; /* Number of names in name table */ + int name_entry_size; /* Size of entry in names table */ + unsigned int skip_arg_count; /* For counting SKIP_ARGs */ + unsigned int ignore_skip_arg; /* For re-run when SKIP arg name not found */ + pcre_uchar *name_table; /* Table of names */ + pcre_uchar nl[4]; /* Newline string when fixed */ + const pcre_uint8 *lcc; /* Points to lower casing table */ + const pcre_uint8 *fcc; /* Points to case-flipping table */ + const pcre_uint8 *ctypes; /* Points to table of type maps */ + BOOL notbol; /* NOTBOL flag */ + BOOL noteol; /* NOTEOL flag */ + BOOL utf; /* UTF-8 / UTF-16 flag */ + BOOL jscript_compat; /* JAVASCRIPT_COMPAT flag */ + BOOL use_ucp; /* PCRE_UCP flag */ + BOOL endonly; /* Dollar not before final \n */ + BOOL notempty; /* Empty string match not wanted */ + BOOL notempty_atstart; /* Empty string match at start not wanted */ + BOOL hitend; /* Hit the end of the subject at some point */ + BOOL bsr_anycrlf; /* \R is just any CRLF, not full Unicode */ + BOOL hasthen; /* Pattern contains (*THEN) */ + const pcre_uchar *start_code; /* For use when recursing */ + PCRE_PUCHAR start_subject; /* Start of the subject string */ + PCRE_PUCHAR end_subject; /* End of the subject string */ + PCRE_PUCHAR start_match_ptr; /* Start of matched string */ + PCRE_PUCHAR end_match_ptr; /* Subject position at end match */ + PCRE_PUCHAR start_used_ptr; /* Earliest consulted character */ + int partial; /* PARTIAL options */ + int end_offset_top; /* Highwater mark at end of match */ + pcre_int32 capture_last; /* Most recent capture number + overflow flag */ + int start_offset; /* The start offset value */ + int match_function_type; /* Set for certain special calls of MATCH() */ + eptrblock *eptrchain; /* Chain of eptrblocks for tail recursions */ + int eptrn; /* Next free eptrblock */ + recursion_info *recursive; /* Linked list of recursion data */ + void *callout_data; /* To pass back to callouts */ + const pcre_uchar *mark; /* Mark pointer to pass back on success */ + const pcre_uchar *nomatch_mark;/* Mark pointer to pass back on failure */ + const pcre_uchar *once_target; /* Where to back up to for atomic groups */ +#ifdef NO_RECURSE + void *match_frames_base; /* For remembering malloc'd frames */ +#endif +} match_data; + +/* A similar structure is used for the same purpose by the DFA matching +functions. */ + +typedef struct dfa_match_data { + const pcre_uchar *start_code; /* Start of the compiled pattern */ + const pcre_uchar *start_subject ; /* Start of the subject string */ + const pcre_uchar *end_subject; /* End of subject string */ + const pcre_uchar *start_used_ptr; /* Earliest consulted character */ + const pcre_uint8 *tables; /* Character tables */ + int start_offset; /* The start offset value */ + int moptions; /* Match options */ + int poptions; /* Pattern options */ + int nltype; /* Newline type */ + int nllen; /* Newline string length */ + pcre_uchar nl[4]; /* Newline string when fixed */ + void *callout_data; /* To pass back to callouts */ + dfa_recursion_info *recursive; /* Linked list of recursion data */ +} dfa_match_data; + +/* Bit definitions for entries in the pcre_ctypes table. */ + +#define ctype_space 0x01 +#define ctype_letter 0x02 +#define ctype_digit 0x04 +#define ctype_xdigit 0x08 +#define ctype_word 0x10 /* alphanumeric or '_' */ +#define ctype_meta 0x80 /* regexp meta char or zero (end pattern) */ + +/* Offsets for the bitmap tables in pcre_cbits. Each table contains a set +of bits for a class map. Some classes are built by combining these tables. */ + +#define cbit_space 0 /* [:space:] or \s */ +#define cbit_xdigit 32 /* [:xdigit:] */ +#define cbit_digit 64 /* [:digit:] or \d */ +#define cbit_upper 96 /* [:upper:] */ +#define cbit_lower 128 /* [:lower:] */ +#define cbit_word 160 /* [:word:] or \w */ +#define cbit_graph 192 /* [:graph:] */ +#define cbit_print 224 /* [:print:] */ +#define cbit_punct 256 /* [:punct:] */ +#define cbit_cntrl 288 /* [:cntrl:] */ +#define cbit_length 320 /* Length of the cbits table */ + +/* Offsets of the various tables from the base tables pointer, and +total length. */ + +#define lcc_offset 0 +#define fcc_offset 256 +#define cbits_offset 512 +#define ctypes_offset (cbits_offset + cbit_length) +#define tables_length (ctypes_offset + 256) + +/* Internal function and data prefixes. */ + +#if defined COMPILE_PCRE8 +#ifndef PUBL +#define PUBL(name) pcre_##name +#endif +#ifndef PRIV +#define PRIV(name) _pcre_##name +#endif +#elif defined COMPILE_PCRE16 +#ifndef PUBL +#define PUBL(name) pcre16_##name +#endif +#ifndef PRIV +#define PRIV(name) _pcre16_##name +#endif +#elif defined COMPILE_PCRE32 +#ifndef PUBL +#define PUBL(name) pcre32_##name +#endif +#ifndef PRIV +#define PRIV(name) _pcre32_##name +#endif +#else +#error Unsupported compiling mode +#endif /* COMPILE_PCRE[8|16|32] */ + +/* Layout of the UCP type table that translates property names into types and +codes. Each entry used to point directly to a name, but to reduce the number of +relocations in shared libraries, it now has an offset into a single string +instead. */ + +typedef struct { + pcre_uint16 name_offset; + pcre_uint16 type; + pcre_uint16 value; +} ucp_type_table; + + +/* Internal shared data tables. These are tables that are used by more than one +of the exported public functions. They have to be "external" in the C sense, +but are not part of the PCRE public API. The data for these tables is in the +pcre_tables.c module. */ + +#ifdef COMPILE_PCRE8 +extern const int PRIV(utf8_table1)[]; +extern const int PRIV(utf8_table1_size); +extern const int PRIV(utf8_table2)[]; +extern const int PRIV(utf8_table3)[]; +extern const pcre_uint8 PRIV(utf8_table4)[]; +#endif /* COMPILE_PCRE8 */ + +extern const char PRIV(utt_names)[]; +extern const ucp_type_table PRIV(utt)[]; +extern const int PRIV(utt_size); + +extern const pcre_uint8 PRIV(OP_lengths)[]; +extern const pcre_uint8 PRIV(default_tables)[]; + +extern const pcre_uint32 PRIV(hspace_list)[]; +extern const pcre_uint32 PRIV(vspace_list)[]; + + +/* Internal shared functions. These are functions that are used by more than +one of the exported public functions. They have to be "external" in the C +sense, but are not part of the PCRE public API. */ + +/* String comparison functions. */ +#if defined COMPILE_PCRE8 + +#define STRCMP_UC_UC(str1, str2) \ + strcmp((char *)(str1), (char *)(str2)) +#define STRCMP_UC_C8(str1, str2) \ + strcmp((char *)(str1), (str2)) +#define STRNCMP_UC_UC(str1, str2, num) \ + strncmp((char *)(str1), (char *)(str2), (num)) +#define STRNCMP_UC_C8(str1, str2, num) \ + strncmp((char *)(str1), (str2), (num)) +#define STRLEN_UC(str) strlen((const char *)str) + +#elif defined COMPILE_PCRE16 || defined COMPILE_PCRE32 + +extern int PRIV(strcmp_uc_uc)(const pcre_uchar *, + const pcre_uchar *); +extern int PRIV(strcmp_uc_c8)(const pcre_uchar *, + const char *); +extern int PRIV(strncmp_uc_uc)(const pcre_uchar *, + const pcre_uchar *, unsigned int num); +extern int PRIV(strncmp_uc_c8)(const pcre_uchar *, + const char *, unsigned int num); +extern unsigned int PRIV(strlen_uc)(const pcre_uchar *str); + +#define STRCMP_UC_UC(str1, str2) \ + PRIV(strcmp_uc_uc)((str1), (str2)) +#define STRCMP_UC_C8(str1, str2) \ + PRIV(strcmp_uc_c8)((str1), (str2)) +#define STRNCMP_UC_UC(str1, str2, num) \ + PRIV(strncmp_uc_uc)((str1), (str2), (num)) +#define STRNCMP_UC_C8(str1, str2, num) \ + PRIV(strncmp_uc_c8)((str1), (str2), (num)) +#define STRLEN_UC(str) PRIV(strlen_uc)(str) + +#endif /* COMPILE_PCRE[8|16|32] */ + +#if defined COMPILE_PCRE8 || defined COMPILE_PCRE16 + +#define STRCMP_UC_UC_TEST(str1, str2) STRCMP_UC_UC(str1, str2) +#define STRCMP_UC_C8_TEST(str1, str2) STRCMP_UC_C8(str1, str2) + +#elif defined COMPILE_PCRE32 + +extern int PRIV(strcmp_uc_uc_utf)(const pcre_uchar *, + const pcre_uchar *); +extern int PRIV(strcmp_uc_c8_utf)(const pcre_uchar *, + const char *); + +#define STRCMP_UC_UC_TEST(str1, str2) \ + (utf ? PRIV(strcmp_uc_uc_utf)((str1), (str2)) : PRIV(strcmp_uc_uc)((str1), (str2))) +#define STRCMP_UC_C8_TEST(str1, str2) \ + (utf ? PRIV(strcmp_uc_c8_utf)((str1), (str2)) : PRIV(strcmp_uc_c8)((str1), (str2))) + +#endif /* COMPILE_PCRE[8|16|32] */ + +extern const pcre_uchar *PRIV(find_bracket)(const pcre_uchar *, BOOL, int); +extern BOOL PRIV(is_newline)(PCRE_PUCHAR, int, PCRE_PUCHAR, + int *, BOOL); +extern unsigned int PRIV(ord2utf)(pcre_uint32, pcre_uchar *); +extern int PRIV(valid_utf)(PCRE_PUCHAR, int, int *); +extern BOOL PRIV(was_newline)(PCRE_PUCHAR, int, PCRE_PUCHAR, + int *, BOOL); +extern BOOL PRIV(xclass)(pcre_uint32, const pcre_uchar *, BOOL); + +#ifdef SUPPORT_JIT +extern void PRIV(jit_compile)(const REAL_PCRE *, + PUBL(extra) *, int); +extern int PRIV(jit_exec)(const PUBL(extra) *, + const pcre_uchar *, int, int, int, int *, int); +extern void PRIV(jit_free)(void *); +extern int PRIV(jit_get_size)(void *); +extern const char* PRIV(jit_get_target)(void); +#endif + +/* Unicode character database (UCD) */ + +typedef struct { + pcre_uint8 script; /* ucp_Arabic, etc. */ + pcre_uint8 chartype; /* ucp_Cc, etc. (general categories) */ + pcre_uint8 gbprop; /* ucp_gbControl, etc. (grapheme break property) */ + pcre_uint8 caseset; /* offset to multichar other cases or zero */ + pcre_int32 other_case; /* offset to other case, or zero if none */ +} ucd_record; + +extern const pcre_uint32 PRIV(ucd_caseless_sets)[]; +extern const ucd_record PRIV(ucd_records)[]; +extern const pcre_uint8 PRIV(ucd_stage1)[]; +extern const pcre_uint16 PRIV(ucd_stage2)[]; +extern const pcre_uint32 PRIV(ucp_gentype)[]; +extern const pcre_uint32 PRIV(ucp_gbtable)[]; +#ifdef COMPILE_PCRE32 +extern const ucd_record PRIV(dummy_ucd_record)[]; +#endif +#ifdef SUPPORT_JIT +extern const int PRIV(ucp_typerange)[]; +#endif + +#ifdef SUPPORT_UCP +/* UCD access macros */ + +#define UCD_BLOCK_SIZE 128 +#define REAL_GET_UCD(ch) (PRIV(ucd_records) + \ + PRIV(ucd_stage2)[PRIV(ucd_stage1)[(int)(ch) / UCD_BLOCK_SIZE] * \ + UCD_BLOCK_SIZE + (int)(ch) % UCD_BLOCK_SIZE]) + +#ifdef COMPILE_PCRE32 +#define GET_UCD(ch) ((ch > 0x10ffff)? PRIV(dummy_ucd_record) : REAL_GET_UCD(ch)) +#else +#define GET_UCD(ch) REAL_GET_UCD(ch) +#endif + +#define UCD_CHARTYPE(ch) GET_UCD(ch)->chartype +#define UCD_SCRIPT(ch) GET_UCD(ch)->script +#define UCD_CATEGORY(ch) PRIV(ucp_gentype)[UCD_CHARTYPE(ch)] +#define UCD_GRAPHBREAK(ch) GET_UCD(ch)->gbprop +#define UCD_CASESET(ch) GET_UCD(ch)->caseset +#define UCD_OTHERCASE(ch) ((pcre_uint32)((int)ch + (int)(GET_UCD(ch)->other_case))) + +#endif /* SUPPORT_UCP */ + +#endif + +/* End of pcre_internal.h */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_jit_compile.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_jit_compile.c new file mode 100755 index 000000000..4dcf8fc21 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_jit_compile.c @@ -0,0 +1,11913 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2013 University of Cambridge + + The machine code generator part (this module) was written by Zoltan Herczeg + Copyright (c) 2010-2013 + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "pcre_internal.h" + +#if defined SUPPORT_JIT + +/* All-in-one: Since we use the JIT compiler only from here, +we just include it. This way we don't need to touch the build +system files. */ + +#define SLJIT_MALLOC(size, allocator_data) (PUBL(malloc))(size) +#define SLJIT_FREE(ptr, allocator_data) (PUBL(free))(ptr) +#define SLJIT_CONFIG_AUTO 1 +#define SLJIT_CONFIG_STATIC 1 +#define SLJIT_VERBOSE 0 +#define SLJIT_DEBUG 0 + +#include "sljit/sljitLir.c" + +#if defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED +#error Unsupported architecture +#endif + +/* Defines for debugging purposes. */ + +/* 1 - Use unoptimized capturing brackets. + 2 - Enable capture_last_ptr (includes option 1). */ +/* #define DEBUG_FORCE_UNOPTIMIZED_CBRAS 2 */ + +/* 1 - Always have a control head. */ +/* #define DEBUG_FORCE_CONTROL_HEAD 1 */ + +/* Allocate memory for the regex stack on the real machine stack. +Fast, but limited size. */ +#define MACHINE_STACK_SIZE 32768 + +/* Growth rate for stack allocated by the OS. Should be the multiply +of page size. */ +#define STACK_GROWTH_RATE 8192 + +/* Enable to check that the allocation could destroy temporaries. */ +#if defined SLJIT_DEBUG && SLJIT_DEBUG +#define DESTROY_REGISTERS 1 +#endif + +/* +Short summary about the backtracking mechanism empolyed by the jit code generator: + +The code generator follows the recursive nature of the PERL compatible regular +expressions. The basic blocks of regular expressions are condition checkers +whose execute different commands depending on the result of the condition check. +The relationship between the operators can be horizontal (concatenation) and +vertical (sub-expression) (See struct backtrack_common for more details). + + 'ab' - 'a' and 'b' regexps are concatenated + 'a+' - 'a' is the sub-expression of the '+' operator + +The condition checkers are boolean (true/false) checkers. Machine code is generated +for the checker itself and for the actions depending on the result of the checker. +The 'true' case is called as the matching path (expected path), and the other is called as +the 'backtrack' path. Branch instructions are expesive for all CPUs, so we avoid taken +branches on the matching path. + + Greedy star operator (*) : + Matching path: match happens. + Backtrack path: match failed. + Non-greedy star operator (*?) : + Matching path: no need to perform a match. + Backtrack path: match is required. + +The following example shows how the code generated for a capturing bracket +with two alternatives. Let A, B, C, D are arbirary regular expressions, and +we have the following regular expression: + + A(B|C)D + +The generated code will be the following: + + A matching path + '(' matching path (pushing arguments to the stack) + B matching path + ')' matching path (pushing arguments to the stack) + D matching path + return with successful match + + D backtrack path + ')' backtrack path (If we arrived from "C" jump to the backtrack of "C") + B backtrack path + C expected path + jump to D matching path + C backtrack path + A backtrack path + + Notice, that the order of backtrack code paths are the opposite of the fast + code paths. In this way the topmost value on the stack is always belong + to the current backtrack code path. The backtrack path must check + whether there is a next alternative. If so, it needs to jump back to + the matching path eventually. Otherwise it needs to clear out its own stack + frame and continue the execution on the backtrack code paths. +*/ + +/* +Saved stack frames: + +Atomic blocks and asserts require reloading the values of private data +when the backtrack mechanism performed. Because of OP_RECURSE, the data +are not necessarly known in compile time, thus we need a dynamic restore +mechanism. + +The stack frames are stored in a chain list, and have the following format: +([ capturing bracket offset ][ start value ][ end value ])+ ... [ 0 ] [ previous head ] + +Thus we can restore the private data to a particular point in the stack. +*/ + +typedef struct jit_arguments { + /* Pointers first. */ + struct sljit_stack *stack; + const pcre_uchar *str; + const pcre_uchar *begin; + const pcre_uchar *end; + int *offsets; + pcre_uchar *mark_ptr; + void *callout_data; + /* Everything else after. */ + sljit_u32 limit_match; + int real_offset_count; + int offset_count; + sljit_u8 notbol; + sljit_u8 noteol; + sljit_u8 notempty; + sljit_u8 notempty_atstart; +} jit_arguments; + +typedef struct executable_functions { + void *executable_funcs[JIT_NUMBER_OF_COMPILE_MODES]; + void *read_only_data_heads[JIT_NUMBER_OF_COMPILE_MODES]; + sljit_uw executable_sizes[JIT_NUMBER_OF_COMPILE_MODES]; + PUBL(jit_callback) callback; + void *userdata; + sljit_u32 top_bracket; + sljit_u32 limit_match; +} executable_functions; + +typedef struct jump_list { + struct sljit_jump *jump; + struct jump_list *next; +} jump_list; + +typedef struct stub_list { + struct sljit_jump *start; + struct sljit_label *quit; + struct stub_list *next; +} stub_list; + +typedef struct label_addr_list { + struct sljit_label *label; + sljit_uw *update_addr; + struct label_addr_list *next; +} label_addr_list; + +enum frame_types { + no_frame = -1, + no_stack = -2 +}; + +enum control_types { + type_mark = 0, + type_then_trap = 1 +}; + +typedef int (SLJIT_FUNC *jit_function)(jit_arguments *args); + +/* The following structure is the key data type for the recursive +code generator. It is allocated by compile_matchingpath, and contains +the arguments for compile_backtrackingpath. Must be the first member +of its descendants. */ +typedef struct backtrack_common { + /* Concatenation stack. */ + struct backtrack_common *prev; + jump_list *nextbacktracks; + /* Internal stack (for component operators). */ + struct backtrack_common *top; + jump_list *topbacktracks; + /* Opcode pointer. */ + pcre_uchar *cc; +} backtrack_common; + +typedef struct assert_backtrack { + backtrack_common common; + jump_list *condfailed; + /* Less than 0 if a frame is not needed. */ + int framesize; + /* Points to our private memory word on the stack. */ + int private_data_ptr; + /* For iterators. */ + struct sljit_label *matchingpath; +} assert_backtrack; + +typedef struct bracket_backtrack { + backtrack_common common; + /* Where to coninue if an alternative is successfully matched. */ + struct sljit_label *alternative_matchingpath; + /* For rmin and rmax iterators. */ + struct sljit_label *recursive_matchingpath; + /* For greedy ? operator. */ + struct sljit_label *zero_matchingpath; + /* Contains the branches of a failed condition. */ + union { + /* Both for OP_COND, OP_SCOND. */ + jump_list *condfailed; + assert_backtrack *assert; + /* For OP_ONCE. Less than 0 if not needed. */ + int framesize; + } u; + /* Points to our private memory word on the stack. */ + int private_data_ptr; +} bracket_backtrack; + +typedef struct bracketpos_backtrack { + backtrack_common common; + /* Points to our private memory word on the stack. */ + int private_data_ptr; + /* Reverting stack is needed. */ + int framesize; + /* Allocated stack size. */ + int stacksize; +} bracketpos_backtrack; + +typedef struct braminzero_backtrack { + backtrack_common common; + struct sljit_label *matchingpath; +} braminzero_backtrack; + +typedef struct char_iterator_backtrack { + backtrack_common common; + /* Next iteration. */ + struct sljit_label *matchingpath; + union { + jump_list *backtracks; + struct { + unsigned int othercasebit; + pcre_uchar chr; + BOOL enabled; + } charpos; + } u; +} char_iterator_backtrack; + +typedef struct ref_iterator_backtrack { + backtrack_common common; + /* Next iteration. */ + struct sljit_label *matchingpath; +} ref_iterator_backtrack; + +typedef struct recurse_entry { + struct recurse_entry *next; + /* Contains the function entry. */ + struct sljit_label *entry; + /* Collects the calls until the function is not created. */ + jump_list *calls; + /* Points to the starting opcode. */ + sljit_sw start; +} recurse_entry; + +typedef struct recurse_backtrack { + backtrack_common common; + BOOL inlined_pattern; +} recurse_backtrack; + +#define OP_THEN_TRAP OP_TABLE_LENGTH + +typedef struct then_trap_backtrack { + backtrack_common common; + /* If then_trap is not NULL, this structure contains the real + then_trap for the backtracking path. */ + struct then_trap_backtrack *then_trap; + /* Points to the starting opcode. */ + sljit_sw start; + /* Exit point for the then opcodes of this alternative. */ + jump_list *quit; + /* Frame size of the current alternative. */ + int framesize; +} then_trap_backtrack; + +#define MAX_RANGE_SIZE 4 + +typedef struct compiler_common { + /* The sljit ceneric compiler. */ + struct sljit_compiler *compiler; + /* First byte code. */ + pcre_uchar *start; + /* Maps private data offset to each opcode. */ + sljit_s32 *private_data_ptrs; + /* Chain list of read-only data ptrs. */ + void *read_only_data_head; + /* Tells whether the capturing bracket is optimized. */ + sljit_u8 *optimized_cbracket; + /* Tells whether the starting offset is a target of then. */ + sljit_u8 *then_offsets; + /* Current position where a THEN must jump. */ + then_trap_backtrack *then_trap; + /* Starting offset of private data for capturing brackets. */ + sljit_s32 cbra_ptr; + /* Output vector starting point. Must be divisible by 2. */ + sljit_s32 ovector_start; + /* Points to the starting character of the current match. */ + sljit_s32 start_ptr; + /* Last known position of the requested byte. */ + sljit_s32 req_char_ptr; + /* Head of the last recursion. */ + sljit_s32 recursive_head_ptr; + /* First inspected character for partial matching. + (Needed for avoiding zero length partial matches.) */ + sljit_s32 start_used_ptr; + /* Starting pointer for partial soft matches. */ + sljit_s32 hit_start; + /* Pointer of the match end position. */ + sljit_s32 match_end_ptr; + /* Points to the marked string. */ + sljit_s32 mark_ptr; + /* Recursive control verb management chain. */ + sljit_s32 control_head_ptr; + /* Points to the last matched capture block index. */ + sljit_s32 capture_last_ptr; + /* Fast forward skipping byte code pointer. */ + pcre_uchar *fast_forward_bc_ptr; + /* Locals used by fast fail optimization. */ + sljit_s32 fast_fail_start_ptr; + sljit_s32 fast_fail_end_ptr; + + /* Flipped and lower case tables. */ + const sljit_u8 *fcc; + sljit_sw lcc; + /* Mode can be PCRE_STUDY_JIT_COMPILE and others. */ + int mode; + /* TRUE, when minlength is greater than 0. */ + BOOL might_be_empty; + /* \K is found in the pattern. */ + BOOL has_set_som; + /* (*SKIP:arg) is found in the pattern. */ + BOOL has_skip_arg; + /* (*THEN) is found in the pattern. */ + BOOL has_then; + /* (*SKIP) or (*SKIP:arg) is found in lookbehind assertion. */ + BOOL has_skip_in_assert_back; + /* Currently in recurse or negative assert. */ + BOOL local_exit; + /* Currently in a positive assert. */ + BOOL positive_assert; + /* Newline control. */ + int nltype; + sljit_u32 nlmax; + sljit_u32 nlmin; + int newline; + int bsr_nltype; + sljit_u32 bsr_nlmax; + sljit_u32 bsr_nlmin; + /* Dollar endonly. */ + int endonly; + /* Tables. */ + sljit_sw ctypes; + /* Named capturing brackets. */ + pcre_uchar *name_table; + sljit_sw name_count; + sljit_sw name_entry_size; + + /* Labels and jump lists. */ + struct sljit_label *partialmatchlabel; + struct sljit_label *quit_label; + struct sljit_label *forced_quit_label; + struct sljit_label *accept_label; + struct sljit_label *ff_newline_shortcut; + stub_list *stubs; + label_addr_list *label_addrs; + recurse_entry *entries; + recurse_entry *currententry; + jump_list *partialmatch; + jump_list *quit; + jump_list *positive_assert_quit; + jump_list *forced_quit; + jump_list *accept; + jump_list *calllimit; + jump_list *stackalloc; + jump_list *revertframes; + jump_list *wordboundary; + jump_list *anynewline; + jump_list *hspace; + jump_list *vspace; + jump_list *casefulcmp; + jump_list *caselesscmp; + jump_list *reset_match; + BOOL jscript_compat; +#ifdef SUPPORT_UTF + BOOL utf; +#ifdef SUPPORT_UCP + BOOL use_ucp; + jump_list *getucd; +#endif +#ifdef COMPILE_PCRE8 + jump_list *utfreadchar; + jump_list *utfreadchar16; + jump_list *utfreadtype8; +#endif +#endif /* SUPPORT_UTF */ +} compiler_common; + +/* For byte_sequence_compare. */ + +typedef struct compare_context { + int length; + int sourcereg; +#if defined SLJIT_UNALIGNED && SLJIT_UNALIGNED + int ucharptr; + union { + sljit_s32 asint; + sljit_u16 asushort; +#if defined COMPILE_PCRE8 + sljit_u8 asbyte; + sljit_u8 asuchars[4]; +#elif defined COMPILE_PCRE16 + sljit_u16 asuchars[2]; +#elif defined COMPILE_PCRE32 + sljit_u32 asuchars[1]; +#endif + } c; + union { + sljit_s32 asint; + sljit_u16 asushort; +#if defined COMPILE_PCRE8 + sljit_u8 asbyte; + sljit_u8 asuchars[4]; +#elif defined COMPILE_PCRE16 + sljit_u16 asuchars[2]; +#elif defined COMPILE_PCRE32 + sljit_u32 asuchars[1]; +#endif + } oc; +#endif +} compare_context; + +/* Undefine sljit macros. */ +#undef CMP + +/* Used for accessing the elements of the stack. */ +#define STACK(i) ((i) * (int)sizeof(sljit_sw)) + +#ifdef SLJIT_PREF_SHIFT_REG +#if SLJIT_PREF_SHIFT_REG == SLJIT_R2 +/* Nothing. */ +#elif SLJIT_PREF_SHIFT_REG == SLJIT_R3 +#define SHIFT_REG_IS_R3 +#else +#error "Unsupported shift register" +#endif +#endif + +#define TMP1 SLJIT_R0 +#ifdef SHIFT_REG_IS_R3 +#define TMP2 SLJIT_R3 +#define TMP3 SLJIT_R2 +#else +#define TMP2 SLJIT_R2 +#define TMP3 SLJIT_R3 +#endif +#define STR_PTR SLJIT_S0 +#define STR_END SLJIT_S1 +#define STACK_TOP SLJIT_R1 +#define STACK_LIMIT SLJIT_S2 +#define COUNT_MATCH SLJIT_S3 +#define ARGUMENTS SLJIT_S4 +#define RETURN_ADDR SLJIT_R4 + +/* Local space layout. */ +/* These two locals can be used by the current opcode. */ +#define LOCALS0 (0 * sizeof(sljit_sw)) +#define LOCALS1 (1 * sizeof(sljit_sw)) +/* Two local variables for possessive quantifiers (char1 cannot use them). */ +#define POSSESSIVE0 (2 * sizeof(sljit_sw)) +#define POSSESSIVE1 (3 * sizeof(sljit_sw)) +/* Max limit of recursions. */ +#define LIMIT_MATCH (4 * sizeof(sljit_sw)) +/* The output vector is stored on the stack, and contains pointers +to characters. The vector data is divided into two groups: the first +group contains the start / end character pointers, and the second is +the start pointers when the end of the capturing group has not yet reached. */ +#define OVECTOR_START (common->ovector_start) +#define OVECTOR(i) (OVECTOR_START + (i) * (sljit_sw)sizeof(sljit_sw)) +#define OVECTOR_PRIV(i) (common->cbra_ptr + (i) * (sljit_sw)sizeof(sljit_sw)) +#define PRIVATE_DATA(cc) (common->private_data_ptrs[(cc) - common->start]) + +#if defined COMPILE_PCRE8 +#define MOV_UCHAR SLJIT_MOV_U8 +#elif defined COMPILE_PCRE16 +#define MOV_UCHAR SLJIT_MOV_U16 +#elif defined COMPILE_PCRE32 +#define MOV_UCHAR SLJIT_MOV_U32 +#else +#error Unsupported compiling mode +#endif + +/* Shortcuts. */ +#define DEFINE_COMPILER \ + struct sljit_compiler *compiler = common->compiler +#define OP1(op, dst, dstw, src, srcw) \ + sljit_emit_op1(compiler, (op), (dst), (dstw), (src), (srcw)) +#define OP2(op, dst, dstw, src1, src1w, src2, src2w) \ + sljit_emit_op2(compiler, (op), (dst), (dstw), (src1), (src1w), (src2), (src2w)) +#define LABEL() \ + sljit_emit_label(compiler) +#define JUMP(type) \ + sljit_emit_jump(compiler, (type)) +#define JUMPTO(type, label) \ + sljit_set_label(sljit_emit_jump(compiler, (type)), (label)) +#define JUMPHERE(jump) \ + sljit_set_label((jump), sljit_emit_label(compiler)) +#define SET_LABEL(jump, label) \ + sljit_set_label((jump), (label)) +#define CMP(type, src1, src1w, src2, src2w) \ + sljit_emit_cmp(compiler, (type), (src1), (src1w), (src2), (src2w)) +#define CMPTO(type, src1, src1w, src2, src2w, label) \ + sljit_set_label(sljit_emit_cmp(compiler, (type), (src1), (src1w), (src2), (src2w)), (label)) +#define OP_FLAGS(op, dst, dstw, type) \ + sljit_emit_op_flags(compiler, (op), (dst), (dstw), (type)) +#define GET_LOCAL_BASE(dst, dstw, offset) \ + sljit_get_local_base(compiler, (dst), (dstw), (offset)) + +#define READ_CHAR_MAX 0x7fffffff + +#define INVALID_UTF_CHAR 888 + +static pcre_uchar *bracketend(pcre_uchar *cc) +{ +SLJIT_ASSERT((*cc >= OP_ASSERT && *cc <= OP_ASSERTBACK_NOT) || (*cc >= OP_ONCE && *cc <= OP_SCOND)); +do cc += GET(cc, 1); while (*cc == OP_ALT); +SLJIT_ASSERT(*cc >= OP_KET && *cc <= OP_KETRPOS); +cc += 1 + LINK_SIZE; +return cc; +} + +static int no_alternatives(pcre_uchar *cc) +{ +int count = 0; +SLJIT_ASSERT((*cc >= OP_ASSERT && *cc <= OP_ASSERTBACK_NOT) || (*cc >= OP_ONCE && *cc <= OP_SCOND)); +do + { + cc += GET(cc, 1); + count++; + } +while (*cc == OP_ALT); +SLJIT_ASSERT(*cc >= OP_KET && *cc <= OP_KETRPOS); +return count; +} + +/* Functions whose might need modification for all new supported opcodes: + next_opcode + check_opcode_types + set_private_data_ptrs + get_framesize + init_frame + get_private_data_copy_length + copy_private_data + compile_matchingpath + compile_backtrackingpath +*/ + +static pcre_uchar *next_opcode(compiler_common *common, pcre_uchar *cc) +{ +SLJIT_UNUSED_ARG(common); +switch(*cc) + { + case OP_SOD: + case OP_SOM: + case OP_SET_SOM: + case OP_NOT_WORD_BOUNDARY: + case OP_WORD_BOUNDARY: + case OP_NOT_DIGIT: + case OP_DIGIT: + case OP_NOT_WHITESPACE: + case OP_WHITESPACE: + case OP_NOT_WORDCHAR: + case OP_WORDCHAR: + case OP_ANY: + case OP_ALLANY: + case OP_NOTPROP: + case OP_PROP: + case OP_ANYNL: + case OP_NOT_HSPACE: + case OP_HSPACE: + case OP_NOT_VSPACE: + case OP_VSPACE: + case OP_EXTUNI: + case OP_EODN: + case OP_EOD: + case OP_CIRC: + case OP_CIRCM: + case OP_DOLL: + case OP_DOLLM: + case OP_CRSTAR: + case OP_CRMINSTAR: + case OP_CRPLUS: + case OP_CRMINPLUS: + case OP_CRQUERY: + case OP_CRMINQUERY: + case OP_CRRANGE: + case OP_CRMINRANGE: + case OP_CRPOSSTAR: + case OP_CRPOSPLUS: + case OP_CRPOSQUERY: + case OP_CRPOSRANGE: + case OP_CLASS: + case OP_NCLASS: + case OP_REF: + case OP_REFI: + case OP_DNREF: + case OP_DNREFI: + case OP_RECURSE: + case OP_CALLOUT: + case OP_ALT: + case OP_KET: + case OP_KETRMAX: + case OP_KETRMIN: + case OP_KETRPOS: + case OP_REVERSE: + case OP_ASSERT: + case OP_ASSERT_NOT: + case OP_ASSERTBACK: + case OP_ASSERTBACK_NOT: + case OP_ONCE: + case OP_ONCE_NC: + case OP_BRA: + case OP_BRAPOS: + case OP_CBRA: + case OP_CBRAPOS: + case OP_COND: + case OP_SBRA: + case OP_SBRAPOS: + case OP_SCBRA: + case OP_SCBRAPOS: + case OP_SCOND: + case OP_CREF: + case OP_DNCREF: + case OP_RREF: + case OP_DNRREF: + case OP_DEF: + case OP_BRAZERO: + case OP_BRAMINZERO: + case OP_BRAPOSZERO: + case OP_PRUNE: + case OP_SKIP: + case OP_THEN: + case OP_COMMIT: + case OP_FAIL: + case OP_ACCEPT: + case OP_ASSERT_ACCEPT: + case OP_CLOSE: + case OP_SKIPZERO: + return cc + PRIV(OP_lengths)[*cc]; + + case OP_CHAR: + case OP_CHARI: + case OP_NOT: + case OP_NOTI: + case OP_STAR: + case OP_MINSTAR: + case OP_PLUS: + case OP_MINPLUS: + case OP_QUERY: + case OP_MINQUERY: + case OP_UPTO: + case OP_MINUPTO: + case OP_EXACT: + case OP_POSSTAR: + case OP_POSPLUS: + case OP_POSQUERY: + case OP_POSUPTO: + case OP_STARI: + case OP_MINSTARI: + case OP_PLUSI: + case OP_MINPLUSI: + case OP_QUERYI: + case OP_MINQUERYI: + case OP_UPTOI: + case OP_MINUPTOI: + case OP_EXACTI: + case OP_POSSTARI: + case OP_POSPLUSI: + case OP_POSQUERYI: + case OP_POSUPTOI: + case OP_NOTSTAR: + case OP_NOTMINSTAR: + case OP_NOTPLUS: + case OP_NOTMINPLUS: + case OP_NOTQUERY: + case OP_NOTMINQUERY: + case OP_NOTUPTO: + case OP_NOTMINUPTO: + case OP_NOTEXACT: + case OP_NOTPOSSTAR: + case OP_NOTPOSPLUS: + case OP_NOTPOSQUERY: + case OP_NOTPOSUPTO: + case OP_NOTSTARI: + case OP_NOTMINSTARI: + case OP_NOTPLUSI: + case OP_NOTMINPLUSI: + case OP_NOTQUERYI: + case OP_NOTMINQUERYI: + case OP_NOTUPTOI: + case OP_NOTMINUPTOI: + case OP_NOTEXACTI: + case OP_NOTPOSSTARI: + case OP_NOTPOSPLUSI: + case OP_NOTPOSQUERYI: + case OP_NOTPOSUPTOI: + cc += PRIV(OP_lengths)[*cc]; +#ifdef SUPPORT_UTF + if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]); +#endif + return cc; + + /* Special cases. */ + case OP_TYPESTAR: + case OP_TYPEMINSTAR: + case OP_TYPEPLUS: + case OP_TYPEMINPLUS: + case OP_TYPEQUERY: + case OP_TYPEMINQUERY: + case OP_TYPEUPTO: + case OP_TYPEMINUPTO: + case OP_TYPEEXACT: + case OP_TYPEPOSSTAR: + case OP_TYPEPOSPLUS: + case OP_TYPEPOSQUERY: + case OP_TYPEPOSUPTO: + return cc + PRIV(OP_lengths)[*cc] - 1; + + case OP_ANYBYTE: +#ifdef SUPPORT_UTF + if (common->utf) return NULL; +#endif + return cc + 1; + +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 + case OP_XCLASS: + return cc + GET(cc, 1); +#endif + + case OP_MARK: + case OP_PRUNE_ARG: + case OP_SKIP_ARG: + case OP_THEN_ARG: + return cc + 1 + 2 + cc[1]; + + default: + /* All opcodes are supported now! */ + SLJIT_UNREACHABLE(); + return NULL; + } +} + +static BOOL check_opcode_types(compiler_common *common, pcre_uchar *cc, pcre_uchar *ccend) +{ +int count; +pcre_uchar *slot; +pcre_uchar *assert_back_end = cc - 1; + +/* Calculate important variables (like stack size) and checks whether all opcodes are supported. */ +while (cc < ccend) + { + switch(*cc) + { + case OP_SET_SOM: + common->has_set_som = TRUE; + common->might_be_empty = TRUE; + cc += 1; + break; + + case OP_REF: + case OP_REFI: + common->optimized_cbracket[GET2(cc, 1)] = 0; + cc += 1 + IMM2_SIZE; + break; + + case OP_CBRAPOS: + case OP_SCBRAPOS: + common->optimized_cbracket[GET2(cc, 1 + LINK_SIZE)] = 0; + cc += 1 + LINK_SIZE + IMM2_SIZE; + break; + + case OP_COND: + case OP_SCOND: + /* Only AUTO_CALLOUT can insert this opcode. We do + not intend to support this case. */ + if (cc[1 + LINK_SIZE] == OP_CALLOUT) + return FALSE; + cc += 1 + LINK_SIZE; + break; + + case OP_CREF: + common->optimized_cbracket[GET2(cc, 1)] = 0; + cc += 1 + IMM2_SIZE; + break; + + case OP_DNREF: + case OP_DNREFI: + case OP_DNCREF: + count = GET2(cc, 1 + IMM2_SIZE); + slot = common->name_table + GET2(cc, 1) * common->name_entry_size; + while (count-- > 0) + { + common->optimized_cbracket[GET2(slot, 0)] = 0; + slot += common->name_entry_size; + } + cc += 1 + 2 * IMM2_SIZE; + break; + + case OP_RECURSE: + /* Set its value only once. */ + if (common->recursive_head_ptr == 0) + { + common->recursive_head_ptr = common->ovector_start; + common->ovector_start += sizeof(sljit_sw); + } + cc += 1 + LINK_SIZE; + break; + + case OP_CALLOUT: + if (common->capture_last_ptr == 0) + { + common->capture_last_ptr = common->ovector_start; + common->ovector_start += sizeof(sljit_sw); + } + cc += 2 + 2 * LINK_SIZE; + break; + + case OP_ASSERTBACK: + slot = bracketend(cc); + if (slot > assert_back_end) + assert_back_end = slot; + cc += 1 + LINK_SIZE; + break; + + case OP_THEN_ARG: + common->has_then = TRUE; + common->control_head_ptr = 1; + /* Fall through. */ + + case OP_PRUNE_ARG: + case OP_MARK: + if (common->mark_ptr == 0) + { + common->mark_ptr = common->ovector_start; + common->ovector_start += sizeof(sljit_sw); + } + cc += 1 + 2 + cc[1]; + break; + + case OP_THEN: + common->has_then = TRUE; + common->control_head_ptr = 1; + cc += 1; + break; + + case OP_SKIP: + if (cc < assert_back_end) + common->has_skip_in_assert_back = TRUE; + cc += 1; + break; + + case OP_SKIP_ARG: + common->control_head_ptr = 1; + common->has_skip_arg = TRUE; + if (cc < assert_back_end) + common->has_skip_in_assert_back = TRUE; + cc += 1 + 2 + cc[1]; + break; + + default: + cc = next_opcode(common, cc); + if (cc == NULL) + return FALSE; + break; + } + } +return TRUE; +} + +static BOOL is_accelerated_repeat(pcre_uchar *cc) +{ +switch(*cc) + { + case OP_TYPESTAR: + case OP_TYPEMINSTAR: + case OP_TYPEPLUS: + case OP_TYPEMINPLUS: + case OP_TYPEPOSSTAR: + case OP_TYPEPOSPLUS: + return (cc[1] != OP_ANYNL && cc[1] != OP_EXTUNI); + + case OP_STAR: + case OP_MINSTAR: + case OP_PLUS: + case OP_MINPLUS: + case OP_POSSTAR: + case OP_POSPLUS: + + case OP_STARI: + case OP_MINSTARI: + case OP_PLUSI: + case OP_MINPLUSI: + case OP_POSSTARI: + case OP_POSPLUSI: + + case OP_NOTSTAR: + case OP_NOTMINSTAR: + case OP_NOTPLUS: + case OP_NOTMINPLUS: + case OP_NOTPOSSTAR: + case OP_NOTPOSPLUS: + + case OP_NOTSTARI: + case OP_NOTMINSTARI: + case OP_NOTPLUSI: + case OP_NOTMINPLUSI: + case OP_NOTPOSSTARI: + case OP_NOTPOSPLUSI: + return TRUE; + + case OP_CLASS: + case OP_NCLASS: +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 + case OP_XCLASS: + cc += (*cc == OP_XCLASS) ? GET(cc, 1) : (int)(1 + (32 / sizeof(pcre_uchar))); +#else + cc += (1 + (32 / sizeof(pcre_uchar))); +#endif + + switch(*cc) + { + case OP_CRSTAR: + case OP_CRMINSTAR: + case OP_CRPLUS: + case OP_CRMINPLUS: + case OP_CRPOSSTAR: + case OP_CRPOSPLUS: + return TRUE; + } + break; + } +return FALSE; +} + +static SLJIT_INLINE BOOL detect_fast_forward_skip(compiler_common *common, int *private_data_start) +{ +pcre_uchar *cc = common->start; +pcre_uchar *end; + +/* Skip not repeated brackets. */ +while (TRUE) + { + switch(*cc) + { + case OP_SOD: + case OP_SOM: + case OP_SET_SOM: + case OP_NOT_WORD_BOUNDARY: + case OP_WORD_BOUNDARY: + case OP_EODN: + case OP_EOD: + case OP_CIRC: + case OP_CIRCM: + case OP_DOLL: + case OP_DOLLM: + /* Zero width assertions. */ + cc++; + continue; + } + + if (*cc != OP_BRA && *cc != OP_CBRA) + break; + + end = cc + GET(cc, 1); + if (*end != OP_KET || PRIVATE_DATA(end) != 0) + return FALSE; + if (*cc == OP_CBRA) + { + if (common->optimized_cbracket[GET2(cc, 1 + LINK_SIZE)] == 0) + return FALSE; + cc += IMM2_SIZE; + } + cc += 1 + LINK_SIZE; + } + +if (is_accelerated_repeat(cc)) + { + common->fast_forward_bc_ptr = cc; + common->private_data_ptrs[(cc + 1) - common->start] = *private_data_start; + *private_data_start += sizeof(sljit_sw); + return TRUE; + } +return FALSE; +} + +static SLJIT_INLINE void detect_fast_fail(compiler_common *common, pcre_uchar *cc, int *private_data_start, sljit_s32 depth) +{ + pcre_uchar *next_alt; + + SLJIT_ASSERT(*cc == OP_BRA || *cc == OP_CBRA); + + if (*cc == OP_CBRA && common->optimized_cbracket[GET2(cc, 1 + LINK_SIZE)] == 0) + return; + + next_alt = bracketend(cc) - (1 + LINK_SIZE); + if (*next_alt != OP_KET || PRIVATE_DATA(next_alt) != 0) + return; + + do + { + next_alt = cc + GET(cc, 1); + + cc += 1 + LINK_SIZE + ((*cc == OP_CBRA) ? IMM2_SIZE : 0); + + while (TRUE) + { + switch(*cc) + { + case OP_SOD: + case OP_SOM: + case OP_SET_SOM: + case OP_NOT_WORD_BOUNDARY: + case OP_WORD_BOUNDARY: + case OP_EODN: + case OP_EOD: + case OP_CIRC: + case OP_CIRCM: + case OP_DOLL: + case OP_DOLLM: + /* Zero width assertions. */ + cc++; + continue; + } + break; + } + + if (depth > 0 && (*cc == OP_BRA || *cc == OP_CBRA)) + detect_fast_fail(common, cc, private_data_start, depth - 1); + + if (is_accelerated_repeat(cc)) + { + common->private_data_ptrs[(cc + 1) - common->start] = *private_data_start; + + if (common->fast_fail_start_ptr == 0) + common->fast_fail_start_ptr = *private_data_start; + + *private_data_start += sizeof(sljit_sw); + common->fast_fail_end_ptr = *private_data_start; + + if (*private_data_start > SLJIT_MAX_LOCAL_SIZE) + return; + } + + cc = next_alt; + } + while (*cc == OP_ALT); +} + +static int get_class_iterator_size(pcre_uchar *cc) +{ +sljit_u32 min; +sljit_u32 max; +switch(*cc) + { + case OP_CRSTAR: + case OP_CRPLUS: + return 2; + + case OP_CRMINSTAR: + case OP_CRMINPLUS: + case OP_CRQUERY: + case OP_CRMINQUERY: + return 1; + + case OP_CRRANGE: + case OP_CRMINRANGE: + min = GET2(cc, 1); + max = GET2(cc, 1 + IMM2_SIZE); + if (max == 0) + return (*cc == OP_CRRANGE) ? 2 : 1; + max -= min; + if (max > 2) + max = 2; + return max; + + default: + return 0; + } +} + +static BOOL detect_repeat(compiler_common *common, pcre_uchar *begin) +{ +pcre_uchar *end = bracketend(begin); +pcre_uchar *next; +pcre_uchar *next_end; +pcre_uchar *max_end; +pcre_uchar type; +sljit_sw length = end - begin; +int min, max, i; + +/* Detect fixed iterations first. */ +if (end[-(1 + LINK_SIZE)] != OP_KET) + return FALSE; + +/* Already detected repeat. */ +if (common->private_data_ptrs[end - common->start - LINK_SIZE] != 0) + return TRUE; + +next = end; +min = 1; +while (1) + { + if (*next != *begin) + break; + next_end = bracketend(next); + if (next_end - next != length || memcmp(begin, next, IN_UCHARS(length)) != 0) + break; + next = next_end; + min++; + } + +if (min == 2) + return FALSE; + +max = 0; +max_end = next; +if (*next == OP_BRAZERO || *next == OP_BRAMINZERO) + { + type = *next; + while (1) + { + if (next[0] != type || next[1] != OP_BRA || next[2 + LINK_SIZE] != *begin) + break; + next_end = bracketend(next + 2 + LINK_SIZE); + if (next_end - next != (length + 2 + LINK_SIZE) || memcmp(begin, next + 2 + LINK_SIZE, IN_UCHARS(length)) != 0) + break; + next = next_end; + max++; + } + + if (next[0] == type && next[1] == *begin && max >= 1) + { + next_end = bracketend(next + 1); + if (next_end - next == (length + 1) && memcmp(begin, next + 1, IN_UCHARS(length)) == 0) + { + for (i = 0; i < max; i++, next_end += 1 + LINK_SIZE) + if (*next_end != OP_KET) + break; + + if (i == max) + { + common->private_data_ptrs[max_end - common->start - LINK_SIZE] = next_end - max_end; + common->private_data_ptrs[max_end - common->start - LINK_SIZE + 1] = (type == OP_BRAZERO) ? OP_UPTO : OP_MINUPTO; + /* +2 the original and the last. */ + common->private_data_ptrs[max_end - common->start - LINK_SIZE + 2] = max + 2; + if (min == 1) + return TRUE; + min--; + max_end -= (1 + LINK_SIZE) + GET(max_end, -LINK_SIZE); + } + } + } + } + +if (min >= 3) + { + common->private_data_ptrs[end - common->start - LINK_SIZE] = max_end - end; + common->private_data_ptrs[end - common->start - LINK_SIZE + 1] = OP_EXACT; + common->private_data_ptrs[end - common->start - LINK_SIZE + 2] = min; + return TRUE; + } + +return FALSE; +} + +#define CASE_ITERATOR_PRIVATE_DATA_1 \ + case OP_MINSTAR: \ + case OP_MINPLUS: \ + case OP_QUERY: \ + case OP_MINQUERY: \ + case OP_MINSTARI: \ + case OP_MINPLUSI: \ + case OP_QUERYI: \ + case OP_MINQUERYI: \ + case OP_NOTMINSTAR: \ + case OP_NOTMINPLUS: \ + case OP_NOTQUERY: \ + case OP_NOTMINQUERY: \ + case OP_NOTMINSTARI: \ + case OP_NOTMINPLUSI: \ + case OP_NOTQUERYI: \ + case OP_NOTMINQUERYI: + +#define CASE_ITERATOR_PRIVATE_DATA_2A \ + case OP_STAR: \ + case OP_PLUS: \ + case OP_STARI: \ + case OP_PLUSI: \ + case OP_NOTSTAR: \ + case OP_NOTPLUS: \ + case OP_NOTSTARI: \ + case OP_NOTPLUSI: + +#define CASE_ITERATOR_PRIVATE_DATA_2B \ + case OP_UPTO: \ + case OP_MINUPTO: \ + case OP_UPTOI: \ + case OP_MINUPTOI: \ + case OP_NOTUPTO: \ + case OP_NOTMINUPTO: \ + case OP_NOTUPTOI: \ + case OP_NOTMINUPTOI: + +#define CASE_ITERATOR_TYPE_PRIVATE_DATA_1 \ + case OP_TYPEMINSTAR: \ + case OP_TYPEMINPLUS: \ + case OP_TYPEQUERY: \ + case OP_TYPEMINQUERY: + +#define CASE_ITERATOR_TYPE_PRIVATE_DATA_2A \ + case OP_TYPESTAR: \ + case OP_TYPEPLUS: + +#define CASE_ITERATOR_TYPE_PRIVATE_DATA_2B \ + case OP_TYPEUPTO: \ + case OP_TYPEMINUPTO: + +static void set_private_data_ptrs(compiler_common *common, int *private_data_start, pcre_uchar *ccend) +{ +pcre_uchar *cc = common->start; +pcre_uchar *alternative; +pcre_uchar *end = NULL; +int private_data_ptr = *private_data_start; +int space, size, bracketlen; +BOOL repeat_check = TRUE; + +while (cc < ccend) + { + space = 0; + size = 0; + bracketlen = 0; + if (private_data_ptr > SLJIT_MAX_LOCAL_SIZE) + break; + + if (repeat_check && (*cc == OP_ONCE || *cc == OP_ONCE_NC || *cc == OP_BRA || *cc == OP_CBRA || *cc == OP_COND)) + { + if (detect_repeat(common, cc)) + { + /* These brackets are converted to repeats, so no global + based single character repeat is allowed. */ + if (cc >= end) + end = bracketend(cc); + } + } + repeat_check = TRUE; + + switch(*cc) + { + case OP_KET: + if (common->private_data_ptrs[cc + 1 - common->start] != 0) + { + common->private_data_ptrs[cc - common->start] = private_data_ptr; + private_data_ptr += sizeof(sljit_sw); + cc += common->private_data_ptrs[cc + 1 - common->start]; + } + cc += 1 + LINK_SIZE; + break; + + case OP_ASSERT: + case OP_ASSERT_NOT: + case OP_ASSERTBACK: + case OP_ASSERTBACK_NOT: + case OP_ONCE: + case OP_ONCE_NC: + case OP_BRAPOS: + case OP_SBRA: + case OP_SBRAPOS: + case OP_SCOND: + common->private_data_ptrs[cc - common->start] = private_data_ptr; + private_data_ptr += sizeof(sljit_sw); + bracketlen = 1 + LINK_SIZE; + break; + + case OP_CBRAPOS: + case OP_SCBRAPOS: + common->private_data_ptrs[cc - common->start] = private_data_ptr; + private_data_ptr += sizeof(sljit_sw); + bracketlen = 1 + LINK_SIZE + IMM2_SIZE; + break; + + case OP_COND: + /* Might be a hidden SCOND. */ + alternative = cc + GET(cc, 1); + if (*alternative == OP_KETRMAX || *alternative == OP_KETRMIN) + { + common->private_data_ptrs[cc - common->start] = private_data_ptr; + private_data_ptr += sizeof(sljit_sw); + } + bracketlen = 1 + LINK_SIZE; + break; + + case OP_BRA: + bracketlen = 1 + LINK_SIZE; + break; + + case OP_CBRA: + case OP_SCBRA: + bracketlen = 1 + LINK_SIZE + IMM2_SIZE; + break; + + case OP_BRAZERO: + case OP_BRAMINZERO: + case OP_BRAPOSZERO: + repeat_check = FALSE; + size = 1; + break; + + CASE_ITERATOR_PRIVATE_DATA_1 + space = 1; + size = -2; + break; + + CASE_ITERATOR_PRIVATE_DATA_2A + space = 2; + size = -2; + break; + + CASE_ITERATOR_PRIVATE_DATA_2B + space = 2; + size = -(2 + IMM2_SIZE); + break; + + CASE_ITERATOR_TYPE_PRIVATE_DATA_1 + space = 1; + size = 1; + break; + + CASE_ITERATOR_TYPE_PRIVATE_DATA_2A + if (cc[1] != OP_ANYNL && cc[1] != OP_EXTUNI) + space = 2; + size = 1; + break; + + case OP_TYPEUPTO: + if (cc[1 + IMM2_SIZE] != OP_ANYNL && cc[1 + IMM2_SIZE] != OP_EXTUNI) + space = 2; + size = 1 + IMM2_SIZE; + break; + + case OP_TYPEMINUPTO: + space = 2; + size = 1 + IMM2_SIZE; + break; + + case OP_CLASS: + case OP_NCLASS: + space = get_class_iterator_size(cc + size); + size = 1 + 32 / sizeof(pcre_uchar); + break; + +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 + case OP_XCLASS: + space = get_class_iterator_size(cc + size); + size = GET(cc, 1); + break; +#endif + + default: + cc = next_opcode(common, cc); + SLJIT_ASSERT(cc != NULL); + break; + } + + /* Character iterators, which are not inside a repeated bracket, + gets a private slot instead of allocating it on the stack. */ + if (space > 0 && cc >= end) + { + common->private_data_ptrs[cc - common->start] = private_data_ptr; + private_data_ptr += sizeof(sljit_sw) * space; + } + + if (size != 0) + { + if (size < 0) + { + cc += -size; +#ifdef SUPPORT_UTF + if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]); +#endif + } + else + cc += size; + } + + if (bracketlen > 0) + { + if (cc >= end) + { + end = bracketend(cc); + if (end[-1 - LINK_SIZE] == OP_KET) + end = NULL; + } + cc += bracketlen; + } + } +*private_data_start = private_data_ptr; +} + +/* Returns with a frame_types (always < 0) if no need for frame. */ +static int get_framesize(compiler_common *common, pcre_uchar *cc, pcre_uchar *ccend, BOOL recursive, BOOL *needs_control_head) +{ +int length = 0; +int possessive = 0; +BOOL stack_restore = FALSE; +BOOL setsom_found = recursive; +BOOL setmark_found = recursive; +/* The last capture is a local variable even for recursions. */ +BOOL capture_last_found = FALSE; + +#if defined DEBUG_FORCE_CONTROL_HEAD && DEBUG_FORCE_CONTROL_HEAD +SLJIT_ASSERT(common->control_head_ptr != 0); +*needs_control_head = TRUE; +#else +*needs_control_head = FALSE; +#endif + +if (ccend == NULL) + { + ccend = bracketend(cc) - (1 + LINK_SIZE); + if (!recursive && (*cc == OP_CBRAPOS || *cc == OP_SCBRAPOS)) + { + possessive = length = (common->capture_last_ptr != 0) ? 5 : 3; + /* This is correct regardless of common->capture_last_ptr. */ + capture_last_found = TRUE; + } + cc = next_opcode(common, cc); + } + +SLJIT_ASSERT(cc != NULL); +while (cc < ccend) + switch(*cc) + { + case OP_SET_SOM: + SLJIT_ASSERT(common->has_set_som); + stack_restore = TRUE; + if (!setsom_found) + { + length += 2; + setsom_found = TRUE; + } + cc += 1; + break; + + case OP_MARK: + case OP_PRUNE_ARG: + case OP_THEN_ARG: + SLJIT_ASSERT(common->mark_ptr != 0); + stack_restore = TRUE; + if (!setmark_found) + { + length += 2; + setmark_found = TRUE; + } + if (common->control_head_ptr != 0) + *needs_control_head = TRUE; + cc += 1 + 2 + cc[1]; + break; + + case OP_RECURSE: + stack_restore = TRUE; + if (common->has_set_som && !setsom_found) + { + length += 2; + setsom_found = TRUE; + } + if (common->mark_ptr != 0 && !setmark_found) + { + length += 2; + setmark_found = TRUE; + } + if (common->capture_last_ptr != 0 && !capture_last_found) + { + length += 2; + capture_last_found = TRUE; + } + cc += 1 + LINK_SIZE; + break; + + case OP_CBRA: + case OP_CBRAPOS: + case OP_SCBRA: + case OP_SCBRAPOS: + stack_restore = TRUE; + if (common->capture_last_ptr != 0 && !capture_last_found) + { + length += 2; + capture_last_found = TRUE; + } + length += 3; + cc += 1 + LINK_SIZE + IMM2_SIZE; + break; + + case OP_THEN: + stack_restore = TRUE; + if (common->control_head_ptr != 0) + *needs_control_head = TRUE; + cc ++; + break; + + default: + stack_restore = TRUE; + /* Fall through. */ + + case OP_NOT_WORD_BOUNDARY: + case OP_WORD_BOUNDARY: + case OP_NOT_DIGIT: + case OP_DIGIT: + case OP_NOT_WHITESPACE: + case OP_WHITESPACE: + case OP_NOT_WORDCHAR: + case OP_WORDCHAR: + case OP_ANY: + case OP_ALLANY: + case OP_ANYBYTE: + case OP_NOTPROP: + case OP_PROP: + case OP_ANYNL: + case OP_NOT_HSPACE: + case OP_HSPACE: + case OP_NOT_VSPACE: + case OP_VSPACE: + case OP_EXTUNI: + case OP_EODN: + case OP_EOD: + case OP_CIRC: + case OP_CIRCM: + case OP_DOLL: + case OP_DOLLM: + case OP_CHAR: + case OP_CHARI: + case OP_NOT: + case OP_NOTI: + + case OP_EXACT: + case OP_POSSTAR: + case OP_POSPLUS: + case OP_POSQUERY: + case OP_POSUPTO: + + case OP_EXACTI: + case OP_POSSTARI: + case OP_POSPLUSI: + case OP_POSQUERYI: + case OP_POSUPTOI: + + case OP_NOTEXACT: + case OP_NOTPOSSTAR: + case OP_NOTPOSPLUS: + case OP_NOTPOSQUERY: + case OP_NOTPOSUPTO: + + case OP_NOTEXACTI: + case OP_NOTPOSSTARI: + case OP_NOTPOSPLUSI: + case OP_NOTPOSQUERYI: + case OP_NOTPOSUPTOI: + + case OP_TYPEEXACT: + case OP_TYPEPOSSTAR: + case OP_TYPEPOSPLUS: + case OP_TYPEPOSQUERY: + case OP_TYPEPOSUPTO: + + case OP_CLASS: + case OP_NCLASS: + case OP_XCLASS: + case OP_CALLOUT: + + cc = next_opcode(common, cc); + SLJIT_ASSERT(cc != NULL); + break; + } + +/* Possessive quantifiers can use a special case. */ +if (SLJIT_UNLIKELY(possessive == length)) + return stack_restore ? no_frame : no_stack; + +if (length > 0) + return length + 1; +return stack_restore ? no_frame : no_stack; +} + +static void init_frame(compiler_common *common, pcre_uchar *cc, pcre_uchar *ccend, int stackpos, int stacktop, BOOL recursive) +{ +DEFINE_COMPILER; +BOOL setsom_found = recursive; +BOOL setmark_found = recursive; +/* The last capture is a local variable even for recursions. */ +BOOL capture_last_found = FALSE; +int offset; + +/* >= 1 + shortest item size (2) */ +SLJIT_UNUSED_ARG(stacktop); +SLJIT_ASSERT(stackpos >= stacktop + 2); + +stackpos = STACK(stackpos); +if (ccend == NULL) + { + ccend = bracketend(cc) - (1 + LINK_SIZE); + if (recursive || (*cc != OP_CBRAPOS && *cc != OP_SCBRAPOS)) + cc = next_opcode(common, cc); + } + +SLJIT_ASSERT(cc != NULL); +while (cc < ccend) + switch(*cc) + { + case OP_SET_SOM: + SLJIT_ASSERT(common->has_set_som); + if (!setsom_found) + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(0)); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, SLJIT_IMM, -OVECTOR(0)); + stackpos -= (int)sizeof(sljit_sw); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, TMP1, 0); + stackpos -= (int)sizeof(sljit_sw); + setsom_found = TRUE; + } + cc += 1; + break; + + case OP_MARK: + case OP_PRUNE_ARG: + case OP_THEN_ARG: + SLJIT_ASSERT(common->mark_ptr != 0); + if (!setmark_found) + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->mark_ptr); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, SLJIT_IMM, -common->mark_ptr); + stackpos -= (int)sizeof(sljit_sw); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, TMP1, 0); + stackpos -= (int)sizeof(sljit_sw); + setmark_found = TRUE; + } + cc += 1 + 2 + cc[1]; + break; + + case OP_RECURSE: + if (common->has_set_som && !setsom_found) + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(0)); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, SLJIT_IMM, -OVECTOR(0)); + stackpos -= (int)sizeof(sljit_sw); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, TMP1, 0); + stackpos -= (int)sizeof(sljit_sw); + setsom_found = TRUE; + } + if (common->mark_ptr != 0 && !setmark_found) + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->mark_ptr); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, SLJIT_IMM, -common->mark_ptr); + stackpos -= (int)sizeof(sljit_sw); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, TMP1, 0); + stackpos -= (int)sizeof(sljit_sw); + setmark_found = TRUE; + } + if (common->capture_last_ptr != 0 && !capture_last_found) + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->capture_last_ptr); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, SLJIT_IMM, -common->capture_last_ptr); + stackpos -= (int)sizeof(sljit_sw); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, TMP1, 0); + stackpos -= (int)sizeof(sljit_sw); + capture_last_found = TRUE; + } + cc += 1 + LINK_SIZE; + break; + + case OP_CBRA: + case OP_CBRAPOS: + case OP_SCBRA: + case OP_SCBRAPOS: + if (common->capture_last_ptr != 0 && !capture_last_found) + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->capture_last_ptr); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, SLJIT_IMM, -common->capture_last_ptr); + stackpos -= (int)sizeof(sljit_sw); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, TMP1, 0); + stackpos -= (int)sizeof(sljit_sw); + capture_last_found = TRUE; + } + offset = (GET2(cc, 1 + LINK_SIZE)) << 1; + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, SLJIT_IMM, OVECTOR(offset)); + stackpos -= (int)sizeof(sljit_sw); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset)); + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1)); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, TMP1, 0); + stackpos -= (int)sizeof(sljit_sw); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, TMP2, 0); + stackpos -= (int)sizeof(sljit_sw); + + cc += 1 + LINK_SIZE + IMM2_SIZE; + break; + + default: + cc = next_opcode(common, cc); + SLJIT_ASSERT(cc != NULL); + break; + } + +OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, SLJIT_IMM, 0); +SLJIT_ASSERT(stackpos == STACK(stacktop)); +} + +static SLJIT_INLINE int get_private_data_copy_length(compiler_common *common, pcre_uchar *cc, pcre_uchar *ccend, BOOL needs_control_head) +{ +int private_data_length = needs_control_head ? 3 : 2; +int size; +pcre_uchar *alternative; +/* Calculate the sum of the private machine words. */ +while (cc < ccend) + { + size = 0; + switch(*cc) + { + case OP_KET: + if (PRIVATE_DATA(cc) != 0) + { + private_data_length++; + SLJIT_ASSERT(PRIVATE_DATA(cc + 1) != 0); + cc += PRIVATE_DATA(cc + 1); + } + cc += 1 + LINK_SIZE; + break; + + case OP_ASSERT: + case OP_ASSERT_NOT: + case OP_ASSERTBACK: + case OP_ASSERTBACK_NOT: + case OP_ONCE: + case OP_ONCE_NC: + case OP_BRAPOS: + case OP_SBRA: + case OP_SBRAPOS: + case OP_SCOND: + private_data_length++; + SLJIT_ASSERT(PRIVATE_DATA(cc) != 0); + cc += 1 + LINK_SIZE; + break; + + case OP_CBRA: + case OP_SCBRA: + if (common->optimized_cbracket[GET2(cc, 1 + LINK_SIZE)] == 0) + private_data_length++; + cc += 1 + LINK_SIZE + IMM2_SIZE; + break; + + case OP_CBRAPOS: + case OP_SCBRAPOS: + private_data_length += 2; + cc += 1 + LINK_SIZE + IMM2_SIZE; + break; + + case OP_COND: + /* Might be a hidden SCOND. */ + alternative = cc + GET(cc, 1); + if (*alternative == OP_KETRMAX || *alternative == OP_KETRMIN) + private_data_length++; + cc += 1 + LINK_SIZE; + break; + + CASE_ITERATOR_PRIVATE_DATA_1 + if (PRIVATE_DATA(cc)) + private_data_length++; + cc += 2; +#ifdef SUPPORT_UTF + if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]); +#endif + break; + + CASE_ITERATOR_PRIVATE_DATA_2A + if (PRIVATE_DATA(cc)) + private_data_length += 2; + cc += 2; +#ifdef SUPPORT_UTF + if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]); +#endif + break; + + CASE_ITERATOR_PRIVATE_DATA_2B + if (PRIVATE_DATA(cc)) + private_data_length += 2; + cc += 2 + IMM2_SIZE; +#ifdef SUPPORT_UTF + if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]); +#endif + break; + + CASE_ITERATOR_TYPE_PRIVATE_DATA_1 + if (PRIVATE_DATA(cc)) + private_data_length++; + cc += 1; + break; + + CASE_ITERATOR_TYPE_PRIVATE_DATA_2A + if (PRIVATE_DATA(cc)) + private_data_length += 2; + cc += 1; + break; + + CASE_ITERATOR_TYPE_PRIVATE_DATA_2B + if (PRIVATE_DATA(cc)) + private_data_length += 2; + cc += 1 + IMM2_SIZE; + break; + + case OP_CLASS: + case OP_NCLASS: +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 + case OP_XCLASS: + size = (*cc == OP_XCLASS) ? GET(cc, 1) : 1 + 32 / (int)sizeof(pcre_uchar); +#else + size = 1 + 32 / (int)sizeof(pcre_uchar); +#endif + if (PRIVATE_DATA(cc)) + private_data_length += get_class_iterator_size(cc + size); + cc += size; + break; + + default: + cc = next_opcode(common, cc); + SLJIT_ASSERT(cc != NULL); + break; + } + } +SLJIT_ASSERT(cc == ccend); +return private_data_length; +} + +static void copy_private_data(compiler_common *common, pcre_uchar *cc, pcre_uchar *ccend, + BOOL save, int stackptr, int stacktop, BOOL needs_control_head) +{ +DEFINE_COMPILER; +int srcw[2]; +int count, size; +BOOL tmp1next = TRUE; +BOOL tmp1empty = TRUE; +BOOL tmp2empty = TRUE; +pcre_uchar *alternative; +enum { + loop, + end +} status; + +status = loop; +stackptr = STACK(stackptr); +stacktop = STACK(stacktop - 1); + +if (!save) + { + stacktop -= (needs_control_head ? 2 : 1) * sizeof(sljit_sw); + if (stackptr < stacktop) + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), stackptr); + stackptr += sizeof(sljit_sw); + tmp1empty = FALSE; + } + if (stackptr < stacktop) + { + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), stackptr); + stackptr += sizeof(sljit_sw); + tmp2empty = FALSE; + } + /* The tmp1next must be TRUE in either way. */ + } + +SLJIT_ASSERT(common->recursive_head_ptr != 0); + +do + { + count = 0; + if (cc >= ccend) + { + if (!save) + break; + + count = 1; + srcw[0] = common->recursive_head_ptr; + if (needs_control_head) + { + SLJIT_ASSERT(common->control_head_ptr != 0); + count = 2; + srcw[0] = common->control_head_ptr; + srcw[1] = common->recursive_head_ptr; + } + status = end; + } + else switch(*cc) + { + case OP_KET: + if (PRIVATE_DATA(cc) != 0) + { + count = 1; + srcw[0] = PRIVATE_DATA(cc); + SLJIT_ASSERT(PRIVATE_DATA(cc + 1) != 0); + cc += PRIVATE_DATA(cc + 1); + } + cc += 1 + LINK_SIZE; + break; + + case OP_ASSERT: + case OP_ASSERT_NOT: + case OP_ASSERTBACK: + case OP_ASSERTBACK_NOT: + case OP_ONCE: + case OP_ONCE_NC: + case OP_BRAPOS: + case OP_SBRA: + case OP_SBRAPOS: + case OP_SCOND: + count = 1; + srcw[0] = PRIVATE_DATA(cc); + SLJIT_ASSERT(srcw[0] != 0); + cc += 1 + LINK_SIZE; + break; + + case OP_CBRA: + case OP_SCBRA: + if (common->optimized_cbracket[GET2(cc, 1 + LINK_SIZE)] == 0) + { + count = 1; + srcw[0] = OVECTOR_PRIV(GET2(cc, 1 + LINK_SIZE)); + } + cc += 1 + LINK_SIZE + IMM2_SIZE; + break; + + case OP_CBRAPOS: + case OP_SCBRAPOS: + count = 2; + srcw[0] = PRIVATE_DATA(cc); + srcw[1] = OVECTOR_PRIV(GET2(cc, 1 + LINK_SIZE)); + SLJIT_ASSERT(srcw[0] != 0 && srcw[1] != 0); + cc += 1 + LINK_SIZE + IMM2_SIZE; + break; + + case OP_COND: + /* Might be a hidden SCOND. */ + alternative = cc + GET(cc, 1); + if (*alternative == OP_KETRMAX || *alternative == OP_KETRMIN) + { + count = 1; + srcw[0] = PRIVATE_DATA(cc); + SLJIT_ASSERT(srcw[0] != 0); + } + cc += 1 + LINK_SIZE; + break; + + CASE_ITERATOR_PRIVATE_DATA_1 + if (PRIVATE_DATA(cc)) + { + count = 1; + srcw[0] = PRIVATE_DATA(cc); + } + cc += 2; +#ifdef SUPPORT_UTF + if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]); +#endif + break; + + CASE_ITERATOR_PRIVATE_DATA_2A + if (PRIVATE_DATA(cc)) + { + count = 2; + srcw[0] = PRIVATE_DATA(cc); + srcw[1] = PRIVATE_DATA(cc) + sizeof(sljit_sw); + } + cc += 2; +#ifdef SUPPORT_UTF + if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]); +#endif + break; + + CASE_ITERATOR_PRIVATE_DATA_2B + if (PRIVATE_DATA(cc)) + { + count = 2; + srcw[0] = PRIVATE_DATA(cc); + srcw[1] = PRIVATE_DATA(cc) + sizeof(sljit_sw); + } + cc += 2 + IMM2_SIZE; +#ifdef SUPPORT_UTF + if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]); +#endif + break; + + CASE_ITERATOR_TYPE_PRIVATE_DATA_1 + if (PRIVATE_DATA(cc)) + { + count = 1; + srcw[0] = PRIVATE_DATA(cc); + } + cc += 1; + break; + + CASE_ITERATOR_TYPE_PRIVATE_DATA_2A + if (PRIVATE_DATA(cc)) + { + count = 2; + srcw[0] = PRIVATE_DATA(cc); + srcw[1] = srcw[0] + sizeof(sljit_sw); + } + cc += 1; + break; + + CASE_ITERATOR_TYPE_PRIVATE_DATA_2B + if (PRIVATE_DATA(cc)) + { + count = 2; + srcw[0] = PRIVATE_DATA(cc); + srcw[1] = srcw[0] + sizeof(sljit_sw); + } + cc += 1 + IMM2_SIZE; + break; + + case OP_CLASS: + case OP_NCLASS: +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 + case OP_XCLASS: + size = (*cc == OP_XCLASS) ? GET(cc, 1) : 1 + 32 / (int)sizeof(pcre_uchar); +#else + size = 1 + 32 / (int)sizeof(pcre_uchar); +#endif + if (PRIVATE_DATA(cc)) + switch(get_class_iterator_size(cc + size)) + { + case 1: + count = 1; + srcw[0] = PRIVATE_DATA(cc); + break; + + case 2: + count = 2; + srcw[0] = PRIVATE_DATA(cc); + srcw[1] = srcw[0] + sizeof(sljit_sw); + break; + + default: + SLJIT_UNREACHABLE(); + break; + } + cc += size; + break; + + default: + cc = next_opcode(common, cc); + SLJIT_ASSERT(cc != NULL); + break; + } + + while (count > 0) + { + count--; + if (save) + { + if (tmp1next) + { + if (!tmp1empty) + { + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackptr, TMP1, 0); + stackptr += sizeof(sljit_sw); + } + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), srcw[count]); + tmp1empty = FALSE; + tmp1next = FALSE; + } + else + { + if (!tmp2empty) + { + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackptr, TMP2, 0); + stackptr += sizeof(sljit_sw); + } + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), srcw[count]); + tmp2empty = FALSE; + tmp1next = TRUE; + } + } + else + { + if (tmp1next) + { + SLJIT_ASSERT(!tmp1empty); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), srcw[count], TMP1, 0); + tmp1empty = stackptr >= stacktop; + if (!tmp1empty) + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), stackptr); + stackptr += sizeof(sljit_sw); + } + tmp1next = FALSE; + } + else + { + SLJIT_ASSERT(!tmp2empty); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), srcw[count], TMP2, 0); + tmp2empty = stackptr >= stacktop; + if (!tmp2empty) + { + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), stackptr); + stackptr += sizeof(sljit_sw); + } + tmp1next = TRUE; + } + } + } + } +while (status != end); + +if (save) + { + if (tmp1next) + { + if (!tmp1empty) + { + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackptr, TMP1, 0); + stackptr += sizeof(sljit_sw); + } + if (!tmp2empty) + { + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackptr, TMP2, 0); + stackptr += sizeof(sljit_sw); + } + } + else + { + if (!tmp2empty) + { + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackptr, TMP2, 0); + stackptr += sizeof(sljit_sw); + } + if (!tmp1empty) + { + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackptr, TMP1, 0); + stackptr += sizeof(sljit_sw); + } + } + } +SLJIT_ASSERT(cc == ccend && stackptr == stacktop && (save || (tmp1empty && tmp2empty))); +} + +static SLJIT_INLINE pcre_uchar *set_then_offsets(compiler_common *common, pcre_uchar *cc, sljit_u8 *current_offset) +{ +pcre_uchar *end = bracketend(cc); +BOOL has_alternatives = cc[GET(cc, 1)] == OP_ALT; + +/* Assert captures then. */ +if (*cc >= OP_ASSERT && *cc <= OP_ASSERTBACK_NOT) + current_offset = NULL; +/* Conditional block does not. */ +if (*cc == OP_COND || *cc == OP_SCOND) + has_alternatives = FALSE; + +cc = next_opcode(common, cc); +if (has_alternatives) + current_offset = common->then_offsets + (cc - common->start); + +while (cc < end) + { + if ((*cc >= OP_ASSERT && *cc <= OP_ASSERTBACK_NOT) || (*cc >= OP_ONCE && *cc <= OP_SCOND)) + cc = set_then_offsets(common, cc, current_offset); + else + { + if (*cc == OP_ALT && has_alternatives) + current_offset = common->then_offsets + (cc + 1 + LINK_SIZE - common->start); + if (*cc >= OP_THEN && *cc <= OP_THEN_ARG && current_offset != NULL) + *current_offset = 1; + cc = next_opcode(common, cc); + } + } + +return end; +} + +#undef CASE_ITERATOR_PRIVATE_DATA_1 +#undef CASE_ITERATOR_PRIVATE_DATA_2A +#undef CASE_ITERATOR_PRIVATE_DATA_2B +#undef CASE_ITERATOR_TYPE_PRIVATE_DATA_1 +#undef CASE_ITERATOR_TYPE_PRIVATE_DATA_2A +#undef CASE_ITERATOR_TYPE_PRIVATE_DATA_2B + +static SLJIT_INLINE BOOL is_powerof2(unsigned int value) +{ +return (value & (value - 1)) == 0; +} + +static SLJIT_INLINE void set_jumps(jump_list *list, struct sljit_label *label) +{ +while (list) + { + /* sljit_set_label is clever enough to do nothing + if either the jump or the label is NULL. */ + SET_LABEL(list->jump, label); + list = list->next; + } +} + +static SLJIT_INLINE void add_jump(struct sljit_compiler *compiler, jump_list **list, struct sljit_jump *jump) +{ +jump_list *list_item = sljit_alloc_memory(compiler, sizeof(jump_list)); +if (list_item) + { + list_item->next = *list; + list_item->jump = jump; + *list = list_item; + } +} + +static void add_stub(compiler_common *common, struct sljit_jump *start) +{ +DEFINE_COMPILER; +stub_list *list_item = sljit_alloc_memory(compiler, sizeof(stub_list)); + +if (list_item) + { + list_item->start = start; + list_item->quit = LABEL(); + list_item->next = common->stubs; + common->stubs = list_item; + } +} + +static void flush_stubs(compiler_common *common) +{ +DEFINE_COMPILER; +stub_list *list_item = common->stubs; + +while (list_item) + { + JUMPHERE(list_item->start); + add_jump(compiler, &common->stackalloc, JUMP(SLJIT_FAST_CALL)); + JUMPTO(SLJIT_JUMP, list_item->quit); + list_item = list_item->next; + } +common->stubs = NULL; +} + +static void add_label_addr(compiler_common *common, sljit_uw *update_addr) +{ +DEFINE_COMPILER; +label_addr_list *label_addr; + +label_addr = sljit_alloc_memory(compiler, sizeof(label_addr_list)); +if (label_addr == NULL) + return; +label_addr->label = LABEL(); +label_addr->update_addr = update_addr; +label_addr->next = common->label_addrs; +common->label_addrs = label_addr; +} + +static SLJIT_INLINE void count_match(compiler_common *common) +{ +DEFINE_COMPILER; + +OP2(SLJIT_SUB | SLJIT_SET_Z, COUNT_MATCH, 0, COUNT_MATCH, 0, SLJIT_IMM, 1); +add_jump(compiler, &common->calllimit, JUMP(SLJIT_ZERO)); +} + +static SLJIT_INLINE void allocate_stack(compiler_common *common, int size) +{ +/* May destroy all locals and registers except TMP2. */ +DEFINE_COMPILER; + +SLJIT_ASSERT(size > 0); +OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, size * sizeof(sljit_sw)); +#ifdef DESTROY_REGISTERS +OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 12345); +OP1(SLJIT_MOV, TMP3, 0, TMP1, 0); +OP1(SLJIT_MOV, RETURN_ADDR, 0, TMP1, 0); +OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS0, TMP1, 0); +OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS1, TMP1, 0); +#endif +add_stub(common, CMP(SLJIT_LESS, STACK_TOP, 0, STACK_LIMIT, 0)); +} + +static SLJIT_INLINE void free_stack(compiler_common *common, int size) +{ +DEFINE_COMPILER; + +SLJIT_ASSERT(size > 0); +OP2(SLJIT_ADD, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, size * sizeof(sljit_sw)); +} + +static sljit_uw * allocate_read_only_data(compiler_common *common, sljit_uw size) +{ +DEFINE_COMPILER; +sljit_uw *result; + +if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler))) + return NULL; + +result = (sljit_uw *)SLJIT_MALLOC(size + sizeof(sljit_uw), compiler->allocator_data); +if (SLJIT_UNLIKELY(result == NULL)) + { + sljit_set_compiler_memory_error(compiler); + return NULL; + } + +*(void**)result = common->read_only_data_head; +common->read_only_data_head = (void *)result; +return result + 1; +} + +static void free_read_only_data(void *current, void *allocator_data) +{ +void *next; + +SLJIT_UNUSED_ARG(allocator_data); + +while (current != NULL) + { + next = *(void**)current; + SLJIT_FREE(current, allocator_data); + current = next; + } +} + +static SLJIT_INLINE void reset_ovector(compiler_common *common, int length) +{ +DEFINE_COMPILER; +struct sljit_label *loop; +int i; + +/* At this point we can freely use all temporary registers. */ +SLJIT_ASSERT(length > 1); +/* TMP1 returns with begin - 1. */ +OP2(SLJIT_SUB, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_S0), SLJIT_OFFSETOF(jit_arguments, begin), SLJIT_IMM, IN_UCHARS(1)); +if (length < 8) + { + for (i = 1; i < length; i++) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(i), SLJIT_R0, 0); + } +else + { + if (sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_SUPP | SLJIT_MEM_STORE | SLJIT_MEM_PRE, SLJIT_R0, SLJIT_MEM1(SLJIT_R1), sizeof(sljit_sw)) == SLJIT_SUCCESS) + { + GET_LOCAL_BASE(SLJIT_R1, 0, OVECTOR_START); + OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, length - 1); + loop = LABEL(); + sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_STORE | SLJIT_MEM_PRE, SLJIT_R0, SLJIT_MEM1(SLJIT_R1), sizeof(sljit_sw)); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_R2, 0, SLJIT_R2, 0, SLJIT_IMM, 1); + JUMPTO(SLJIT_NOT_ZERO, loop); + } + else + { + GET_LOCAL_BASE(SLJIT_R1, 0, OVECTOR_START + sizeof(sljit_sw)); + OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, length - 1); + loop = LABEL(); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), 0, SLJIT_R0, 0); + OP2(SLJIT_ADD, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_IMM, sizeof(sljit_sw)); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_R2, 0, SLJIT_R2, 0, SLJIT_IMM, 1); + JUMPTO(SLJIT_NOT_ZERO, loop); + } + } +} + +static SLJIT_INLINE void reset_fast_fail(compiler_common *common) +{ +DEFINE_COMPILER; +sljit_s32 i; + +SLJIT_ASSERT(common->fast_fail_start_ptr < common->fast_fail_end_ptr); + +OP2(SLJIT_SUB, TMP1, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); +for (i = common->fast_fail_start_ptr; i < common->fast_fail_end_ptr; i += sizeof(sljit_sw)) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), i, TMP1, 0); +} + +static SLJIT_INLINE void do_reset_match(compiler_common *common, int length) +{ +DEFINE_COMPILER; +struct sljit_label *loop; +int i; + +SLJIT_ASSERT(length > 1); +/* OVECTOR(1) contains the "string begin - 1" constant. */ +if (length > 2) + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(1)); +if (length < 8) + { + for (i = 2; i < length; i++) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(i), TMP1, 0); + } +else + { + if (sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_SUPP | SLJIT_MEM_STORE | SLJIT_MEM_PRE, TMP1, SLJIT_MEM1(TMP2), sizeof(sljit_sw)) == SLJIT_SUCCESS) + { + GET_LOCAL_BASE(TMP2, 0, OVECTOR_START + sizeof(sljit_sw)); + OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_IMM, length - 2); + loop = LABEL(); + sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_STORE | SLJIT_MEM_PRE, TMP1, SLJIT_MEM1(TMP2), sizeof(sljit_sw)); + OP2(SLJIT_SUB | SLJIT_SET_Z, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, 1); + JUMPTO(SLJIT_NOT_ZERO, loop); + } + else + { + GET_LOCAL_BASE(TMP2, 0, OVECTOR_START + 2 * sizeof(sljit_sw)); + OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_IMM, length - 2); + loop = LABEL(); + OP1(SLJIT_MOV, SLJIT_MEM1(TMP2), 0, TMP1, 0); + OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, SLJIT_IMM, sizeof(sljit_sw)); + OP2(SLJIT_SUB | SLJIT_SET_Z, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, 1); + JUMPTO(SLJIT_NOT_ZERO, loop); + } + } + +OP1(SLJIT_MOV, STACK_TOP, 0, ARGUMENTS, 0); +if (common->mark_ptr != 0) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->mark_ptr, SLJIT_IMM, 0); +if (common->control_head_ptr != 0) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_IMM, 0); +OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(STACK_TOP), SLJIT_OFFSETOF(jit_arguments, stack)); +OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->start_ptr); +OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(STACK_TOP), SLJIT_OFFSETOF(struct sljit_stack, end)); +} + +static sljit_sw SLJIT_FUNC do_search_mark(sljit_sw *current, const pcre_uchar *skip_arg) +{ +while (current != NULL) + { + switch (current[1]) + { + case type_then_trap: + break; + + case type_mark: + if (STRCMP_UC_UC(skip_arg, (pcre_uchar *)current[2]) == 0) + return current[3]; + break; + + default: + SLJIT_UNREACHABLE(); + break; + } + SLJIT_ASSERT(current[0] == 0 || current < (sljit_sw*)current[0]); + current = (sljit_sw*)current[0]; + } +return 0; +} + +static SLJIT_INLINE void copy_ovector(compiler_common *common, int topbracket) +{ +DEFINE_COMPILER; +struct sljit_label *loop; +struct sljit_jump *early_quit; +BOOL has_pre; + +/* At this point we can freely use all registers. */ +OP1(SLJIT_MOV, SLJIT_S2, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(1)); +OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(1), STR_PTR, 0); + +OP1(SLJIT_MOV, SLJIT_R0, 0, ARGUMENTS, 0); +if (common->mark_ptr != 0) + OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_SP), common->mark_ptr); +OP1(SLJIT_MOV_S32, SLJIT_R1, 0, SLJIT_MEM1(SLJIT_R0), SLJIT_OFFSETOF(jit_arguments, offset_count)); +if (common->mark_ptr != 0) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), SLJIT_OFFSETOF(jit_arguments, mark_ptr), SLJIT_R2, 0); +OP2(SLJIT_SUB, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_R0), SLJIT_OFFSETOF(jit_arguments, offsets), SLJIT_IMM, sizeof(int)); +OP1(SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_R0), SLJIT_OFFSETOF(jit_arguments, begin)); + +has_pre = sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_SUPP | SLJIT_MEM_PRE, SLJIT_S1, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw)) == SLJIT_SUCCESS; +GET_LOCAL_BASE(SLJIT_S0, 0, OVECTOR_START - (has_pre ? sizeof(sljit_sw) : 0)); + +/* Unlikely, but possible */ +early_quit = CMP(SLJIT_EQUAL, SLJIT_R1, 0, SLJIT_IMM, 0); +loop = LABEL(); + +if (has_pre) + sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_PRE, SLJIT_S1, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw)); +else + { + OP1(SLJIT_MOV, SLJIT_S1, 0, SLJIT_MEM1(SLJIT_S0), 0); + OP2(SLJIT_ADD, SLJIT_S0, 0, SLJIT_S0, 0, SLJIT_IMM, sizeof(sljit_sw)); + } + +OP2(SLJIT_ADD, SLJIT_R2, 0, SLJIT_R2, 0, SLJIT_IMM, sizeof(int)); +OP2(SLJIT_SUB, SLJIT_S1, 0, SLJIT_S1, 0, SLJIT_R0, 0); +/* Copy the integer value to the output buffer */ +#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32 +OP2(SLJIT_ASHR, SLJIT_S1, 0, SLJIT_S1, 0, SLJIT_IMM, UCHAR_SHIFT); +#endif + +OP1(SLJIT_MOV_S32, SLJIT_MEM1(SLJIT_R2), 0, SLJIT_S1, 0); +OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_IMM, 1); +JUMPTO(SLJIT_NOT_ZERO, loop); +JUMPHERE(early_quit); + +/* Calculate the return value, which is the maximum ovector value. */ +if (topbracket > 1) + { + if (sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_SUPP | SLJIT_MEM_PRE, SLJIT_R2, SLJIT_MEM1(SLJIT_R0), -(2 * (sljit_sw)sizeof(sljit_sw))) == SLJIT_SUCCESS) + { + GET_LOCAL_BASE(SLJIT_R0, 0, OVECTOR_START + topbracket * 2 * sizeof(sljit_sw)); + OP1(SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, topbracket + 1); + + /* OVECTOR(0) is never equal to SLJIT_S2. */ + loop = LABEL(); + sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_PRE, SLJIT_R2, SLJIT_MEM1(SLJIT_R0), -(2 * (sljit_sw)sizeof(sljit_sw))); + OP2(SLJIT_SUB, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_IMM, 1); + CMPTO(SLJIT_EQUAL, SLJIT_R2, 0, SLJIT_S2, 0, loop); + } + else + { + GET_LOCAL_BASE(SLJIT_R0, 0, OVECTOR_START + (topbracket - 1) * 2 * sizeof(sljit_sw)); + OP1(SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, topbracket + 1); + + /* OVECTOR(0) is never equal to SLJIT_S2. */ + loop = LABEL(); + OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_R0), 0); + OP2(SLJIT_SUB, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 2 * (sljit_sw)sizeof(sljit_sw)); + OP2(SLJIT_SUB, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_IMM, 1); + CMPTO(SLJIT_EQUAL, SLJIT_R2, 0, SLJIT_S2, 0, loop); + } + OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_R1, 0); + } +else + OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, 1); +} + +static SLJIT_INLINE void return_with_partial_match(compiler_common *common, struct sljit_label *quit) +{ +DEFINE_COMPILER; +struct sljit_jump *jump; + +SLJIT_COMPILE_ASSERT(STR_END == SLJIT_S1, str_end_must_be_saved_reg2); +SLJIT_ASSERT(common->start_used_ptr != 0 && common->start_ptr != 0 + && (common->mode == JIT_PARTIAL_SOFT_COMPILE ? common->hit_start != 0 : common->hit_start == 0)); + +OP1(SLJIT_MOV, SLJIT_R1, 0, ARGUMENTS, 0); +OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, PCRE_ERROR_PARTIAL); +OP1(SLJIT_MOV_S32, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_R1), SLJIT_OFFSETOF(jit_arguments, real_offset_count)); +CMPTO(SLJIT_SIG_LESS, SLJIT_R2, 0, SLJIT_IMM, 2, quit); + +/* Store match begin and end. */ +OP1(SLJIT_MOV, SLJIT_S0, 0, SLJIT_MEM1(SLJIT_R1), SLJIT_OFFSETOF(jit_arguments, begin)); +OP1(SLJIT_MOV, SLJIT_R1, 0, SLJIT_MEM1(SLJIT_R1), SLJIT_OFFSETOF(jit_arguments, offsets)); + +jump = CMP(SLJIT_SIG_LESS, SLJIT_R2, 0, SLJIT_IMM, 3); +OP2(SLJIT_SUB, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_SP), common->mode == JIT_PARTIAL_HARD_COMPILE ? common->start_ptr : (common->hit_start + (int)sizeof(sljit_sw)), SLJIT_S0, 0); +#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32 +OP2(SLJIT_ASHR, SLJIT_R2, 0, SLJIT_R2, 0, SLJIT_IMM, UCHAR_SHIFT); +#endif +OP1(SLJIT_MOV_S32, SLJIT_MEM1(SLJIT_R1), 2 * sizeof(int), SLJIT_R2, 0); +JUMPHERE(jump); + +OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_SP), common->mode == JIT_PARTIAL_HARD_COMPILE ? common->start_used_ptr : common->hit_start); +OP2(SLJIT_SUB, SLJIT_S1, 0, STR_END, 0, SLJIT_S0, 0); +#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32 +OP2(SLJIT_ASHR, SLJIT_S1, 0, SLJIT_S1, 0, SLJIT_IMM, UCHAR_SHIFT); +#endif +OP1(SLJIT_MOV_S32, SLJIT_MEM1(SLJIT_R1), sizeof(int), SLJIT_S1, 0); + +OP2(SLJIT_SUB, SLJIT_R2, 0, SLJIT_R2, 0, SLJIT_S0, 0); +#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32 +OP2(SLJIT_ASHR, SLJIT_R2, 0, SLJIT_R2, 0, SLJIT_IMM, UCHAR_SHIFT); +#endif +OP1(SLJIT_MOV_S32, SLJIT_MEM1(SLJIT_R1), 0, SLJIT_R2, 0); + +JUMPTO(SLJIT_JUMP, quit); +} + +static SLJIT_INLINE void check_start_used_ptr(compiler_common *common) +{ +/* May destroy TMP1. */ +DEFINE_COMPILER; +struct sljit_jump *jump; + +if (common->mode == JIT_PARTIAL_SOFT_COMPILE) + { + /* The value of -1 must be kept for start_used_ptr! */ + OP2(SLJIT_ADD, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, SLJIT_IMM, 1); + /* Jumps if start_used_ptr < STR_PTR, or start_used_ptr == -1. Although overwriting + is not necessary if start_used_ptr == STR_PTR, it does not hurt as well. */ + jump = CMP(SLJIT_LESS_EQUAL, TMP1, 0, STR_PTR, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0); + JUMPHERE(jump); + } +else if (common->mode == JIT_PARTIAL_HARD_COMPILE) + { + jump = CMP(SLJIT_LESS_EQUAL, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0); + JUMPHERE(jump); + } +} + +static SLJIT_INLINE BOOL char_has_othercase(compiler_common *common, pcre_uchar *cc) +{ +/* Detects if the character has an othercase. */ +unsigned int c; + +#ifdef SUPPORT_UTF +if (common->utf) + { + GETCHAR(c, cc); + if (c > 127) + { +#ifdef SUPPORT_UCP + return c != UCD_OTHERCASE(c); +#else + return FALSE; +#endif + } +#ifndef COMPILE_PCRE8 + return common->fcc[c] != c; +#endif + } +else +#endif + c = *cc; +return MAX_255(c) ? common->fcc[c] != c : FALSE; +} + +static SLJIT_INLINE unsigned int char_othercase(compiler_common *common, unsigned int c) +{ +/* Returns with the othercase. */ +#ifdef SUPPORT_UTF +if (common->utf && c > 127) + { +#ifdef SUPPORT_UCP + return UCD_OTHERCASE(c); +#else + return c; +#endif + } +#endif +return TABLE_GET(c, common->fcc, c); +} + +static unsigned int char_get_othercase_bit(compiler_common *common, pcre_uchar *cc) +{ +/* Detects if the character and its othercase has only 1 bit difference. */ +unsigned int c, oc, bit; +#if defined SUPPORT_UTF && defined COMPILE_PCRE8 +int n; +#endif + +#ifdef SUPPORT_UTF +if (common->utf) + { + GETCHAR(c, cc); + if (c <= 127) + oc = common->fcc[c]; + else + { +#ifdef SUPPORT_UCP + oc = UCD_OTHERCASE(c); +#else + oc = c; +#endif + } + } +else + { + c = *cc; + oc = TABLE_GET(c, common->fcc, c); + } +#else +c = *cc; +oc = TABLE_GET(c, common->fcc, c); +#endif + +SLJIT_ASSERT(c != oc); + +bit = c ^ oc; +/* Optimized for English alphabet. */ +if (c <= 127 && bit == 0x20) + return (0 << 8) | 0x20; + +/* Since c != oc, they must have at least 1 bit difference. */ +if (!is_powerof2(bit)) + return 0; + +#if defined COMPILE_PCRE8 + +#ifdef SUPPORT_UTF +if (common->utf && c > 127) + { + n = GET_EXTRALEN(*cc); + while ((bit & 0x3f) == 0) + { + n--; + bit >>= 6; + } + return (n << 8) | bit; + } +#endif /* SUPPORT_UTF */ +return (0 << 8) | bit; + +#elif defined COMPILE_PCRE16 || defined COMPILE_PCRE32 + +#ifdef SUPPORT_UTF +if (common->utf && c > 65535) + { + if (bit >= (1 << 10)) + bit >>= 10; + else + return (bit < 256) ? ((2 << 8) | bit) : ((3 << 8) | (bit >> 8)); + } +#endif /* SUPPORT_UTF */ +return (bit < 256) ? ((0 << 8) | bit) : ((1 << 8) | (bit >> 8)); + +#endif /* COMPILE_PCRE[8|16|32] */ +} + +static void check_partial(compiler_common *common, BOOL force) +{ +/* Checks whether a partial matching is occurred. Does not modify registers. */ +DEFINE_COMPILER; +struct sljit_jump *jump = NULL; + +SLJIT_ASSERT(!force || common->mode != JIT_COMPILE); + +if (common->mode == JIT_COMPILE) + return; + +if (!force) + jump = CMP(SLJIT_GREATER_EQUAL, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0); +else if (common->mode == JIT_PARTIAL_SOFT_COMPILE) + jump = CMP(SLJIT_EQUAL, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, SLJIT_IMM, -1); + +if (common->mode == JIT_PARTIAL_SOFT_COMPILE) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->hit_start, SLJIT_IMM, 0); +else + { + if (common->partialmatchlabel != NULL) + JUMPTO(SLJIT_JUMP, common->partialmatchlabel); + else + add_jump(compiler, &common->partialmatch, JUMP(SLJIT_JUMP)); + } + +if (jump != NULL) + JUMPHERE(jump); +} + +static void check_str_end(compiler_common *common, jump_list **end_reached) +{ +/* Does not affect registers. Usually used in a tight spot. */ +DEFINE_COMPILER; +struct sljit_jump *jump; + +if (common->mode == JIT_COMPILE) + { + add_jump(compiler, end_reached, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0)); + return; + } + +jump = CMP(SLJIT_LESS, STR_PTR, 0, STR_END, 0); +if (common->mode == JIT_PARTIAL_SOFT_COMPILE) + { + add_jump(compiler, end_reached, CMP(SLJIT_GREATER_EQUAL, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0)); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->hit_start, SLJIT_IMM, 0); + add_jump(compiler, end_reached, JUMP(SLJIT_JUMP)); + } +else + { + add_jump(compiler, end_reached, CMP(SLJIT_GREATER_EQUAL, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0)); + if (common->partialmatchlabel != NULL) + JUMPTO(SLJIT_JUMP, common->partialmatchlabel); + else + add_jump(compiler, &common->partialmatch, JUMP(SLJIT_JUMP)); + } +JUMPHERE(jump); +} + +static void detect_partial_match(compiler_common *common, jump_list **backtracks) +{ +DEFINE_COMPILER; +struct sljit_jump *jump; + +if (common->mode == JIT_COMPILE) + { + add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0)); + return; + } + +/* Partial matching mode. */ +jump = CMP(SLJIT_LESS, STR_PTR, 0, STR_END, 0); +add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0)); +if (common->mode == JIT_PARTIAL_SOFT_COMPILE) + { + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->hit_start, SLJIT_IMM, 0); + add_jump(compiler, backtracks, JUMP(SLJIT_JUMP)); + } +else + { + if (common->partialmatchlabel != NULL) + JUMPTO(SLJIT_JUMP, common->partialmatchlabel); + else + add_jump(compiler, &common->partialmatch, JUMP(SLJIT_JUMP)); + } +JUMPHERE(jump); +} + +static void peek_char(compiler_common *common, sljit_u32 max) +{ +/* Reads the character into TMP1, keeps STR_PTR. +Does not check STR_END. TMP2 Destroyed. */ +DEFINE_COMPILER; +#if defined SUPPORT_UTF && !defined COMPILE_PCRE32 +struct sljit_jump *jump; +#endif + +SLJIT_UNUSED_ARG(max); + +OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0); +#if defined SUPPORT_UTF && defined COMPILE_PCRE8 +if (common->utf) + { + if (max < 128) return; + + jump = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0xc0); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + add_jump(compiler, &common->utfreadchar, JUMP(SLJIT_FAST_CALL)); + OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP2, 0); + JUMPHERE(jump); + } +#endif /* SUPPORT_UTF && !COMPILE_PCRE32 */ + +#if defined SUPPORT_UTF && defined COMPILE_PCRE16 +if (common->utf) + { + if (max < 0xd800) return; + + OP2(SLJIT_SUB, TMP2, 0, TMP1, 0, SLJIT_IMM, 0xd800); + jump = CMP(SLJIT_GREATER, TMP2, 0, SLJIT_IMM, 0xdc00 - 0xd800 - 1); + /* TMP2 contains the high surrogate. */ + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0)); + OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x40); + OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 10); + OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x3ff); + OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0); + JUMPHERE(jump); + } +#endif +} + +#if defined SUPPORT_UTF && defined COMPILE_PCRE8 + +static BOOL is_char7_bitset(const sljit_u8 *bitset, BOOL nclass) +{ +/* Tells whether the character codes below 128 are enough +to determine a match. */ +const sljit_u8 value = nclass ? 0xff : 0; +const sljit_u8 *end = bitset + 32; + +bitset += 16; +do + { + if (*bitset++ != value) + return FALSE; + } +while (bitset < end); +return TRUE; +} + +static void read_char7_type(compiler_common *common, BOOL full_read) +{ +/* Reads the precise character type of a character into TMP1, if the character +is less than 128. Otherwise it returns with zero. Does not check STR_END. The +full_read argument tells whether characters above max are accepted or not. */ +DEFINE_COMPILER; +struct sljit_jump *jump; + +SLJIT_ASSERT(common->utf); + +OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), 0); +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + +OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP2), common->ctypes); + +if (full_read) + { + jump = CMP(SLJIT_LESS, TMP2, 0, SLJIT_IMM, 0xc0); + OP1(SLJIT_MOV_U8, TMP2, 0, SLJIT_MEM1(TMP2), (sljit_sw)PRIV(utf8_table4) - 0xc0); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP2, 0); + JUMPHERE(jump); + } +} + +#endif /* SUPPORT_UTF && COMPILE_PCRE8 */ + +static void read_char_range(compiler_common *common, sljit_u32 min, sljit_u32 max, BOOL update_str_ptr) +{ +/* Reads the precise value of a character into TMP1, if the character is +between min and max (c >= min && c <= max). Otherwise it returns with a value +outside the range. Does not check STR_END. */ +DEFINE_COMPILER; +#if defined SUPPORT_UTF && !defined COMPILE_PCRE32 +struct sljit_jump *jump; +#endif +#if defined SUPPORT_UTF && defined COMPILE_PCRE8 +struct sljit_jump *jump2; +#endif + +SLJIT_UNUSED_ARG(update_str_ptr); +SLJIT_UNUSED_ARG(min); +SLJIT_UNUSED_ARG(max); +SLJIT_ASSERT(min <= max); + +OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0)); +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + +#if defined SUPPORT_UTF && defined COMPILE_PCRE8 +if (common->utf) + { + if (max < 128 && !update_str_ptr) return; + + jump = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0xc0); + if (min >= 0x10000) + { + OP2(SLJIT_SUB, TMP2, 0, TMP1, 0, SLJIT_IMM, 0xf0); + if (update_str_ptr) + OP1(SLJIT_MOV_U8, RETURN_ADDR, 0, SLJIT_MEM1(TMP1), (sljit_sw)PRIV(utf8_table4) - 0xc0); + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0)); + jump2 = CMP(SLJIT_GREATER, TMP2, 0, SLJIT_IMM, 0x7); + OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 6); + OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x3f); + OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0); + OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(1)); + OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6); + OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x3f); + OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0); + OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(2)); + if (!update_str_ptr) + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(3)); + OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6); + OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x3f); + OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0); + JUMPHERE(jump2); + if (update_str_ptr) + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, RETURN_ADDR, 0); + } + else if (min >= 0x800 && max <= 0xffff) + { + OP2(SLJIT_SUB, TMP2, 0, TMP1, 0, SLJIT_IMM, 0xe0); + if (update_str_ptr) + OP1(SLJIT_MOV_U8, RETURN_ADDR, 0, SLJIT_MEM1(TMP1), (sljit_sw)PRIV(utf8_table4) - 0xc0); + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0)); + jump2 = CMP(SLJIT_GREATER, TMP2, 0, SLJIT_IMM, 0xf); + OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 6); + OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x3f); + OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0); + OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(1)); + if (!update_str_ptr) + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2)); + OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6); + OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x3f); + OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0); + JUMPHERE(jump2); + if (update_str_ptr) + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, RETURN_ADDR, 0); + } + else if (max >= 0x800) + add_jump(compiler, (max < 0x10000) ? &common->utfreadchar16 : &common->utfreadchar, JUMP(SLJIT_FAST_CALL)); + else if (max < 128) + { + OP1(SLJIT_MOV_U8, TMP2, 0, SLJIT_MEM1(TMP1), (sljit_sw)PRIV(utf8_table4) - 0xc0); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP2, 0); + } + else + { + OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0)); + if (!update_str_ptr) + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + else + OP1(SLJIT_MOV_U8, RETURN_ADDR, 0, SLJIT_MEM1(TMP1), (sljit_sw)PRIV(utf8_table4) - 0xc0); + OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x3f); + OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6); + OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x3f); + OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0); + if (update_str_ptr) + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, RETURN_ADDR, 0); + } + JUMPHERE(jump); + } +#endif + +#if defined SUPPORT_UTF && defined COMPILE_PCRE16 +if (common->utf) + { + if (max >= 0x10000) + { + OP2(SLJIT_SUB, TMP2, 0, TMP1, 0, SLJIT_IMM, 0xd800); + jump = CMP(SLJIT_GREATER, TMP2, 0, SLJIT_IMM, 0xdc00 - 0xd800 - 1); + /* TMP2 contains the high surrogate. */ + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0)); + OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x40); + OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 10); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x3ff); + OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0); + JUMPHERE(jump); + return; + } + + if (max < 0xd800 && !update_str_ptr) return; + + /* Skip low surrogate if necessary. */ + OP2(SLJIT_SUB, TMP2, 0, TMP1, 0, SLJIT_IMM, 0xd800); + jump = CMP(SLJIT_GREATER, TMP2, 0, SLJIT_IMM, 0xdc00 - 0xd800 - 1); + if (update_str_ptr) + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + if (max >= 0xd800) + OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 0x10000); + JUMPHERE(jump); + } +#endif +} + +static SLJIT_INLINE void read_char(compiler_common *common) +{ +read_char_range(common, 0, READ_CHAR_MAX, TRUE); +} + +static void read_char8_type(compiler_common *common, BOOL update_str_ptr) +{ +/* Reads the character type into TMP1, updates STR_PTR. Does not check STR_END. */ +DEFINE_COMPILER; +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 +struct sljit_jump *jump; +#endif +#if defined SUPPORT_UTF && defined COMPILE_PCRE8 +struct sljit_jump *jump2; +#endif + +SLJIT_UNUSED_ARG(update_str_ptr); + +OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), 0); +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + +#if defined SUPPORT_UTF && defined COMPILE_PCRE8 +if (common->utf) + { + /* This can be an extra read in some situations, but hopefully + it is needed in most cases. */ + OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP2), common->ctypes); + jump = CMP(SLJIT_LESS, TMP2, 0, SLJIT_IMM, 0xc0); + if (!update_str_ptr) + { + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0)); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x3f); + OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 6); + OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x3f); + OP2(SLJIT_OR, TMP2, 0, TMP2, 0, TMP1, 0); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 0); + jump2 = CMP(SLJIT_GREATER, TMP2, 0, SLJIT_IMM, 255); + OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP2), common->ctypes); + JUMPHERE(jump2); + } + else + add_jump(compiler, &common->utfreadtype8, JUMP(SLJIT_FAST_CALL)); + JUMPHERE(jump); + return; + } +#endif /* SUPPORT_UTF && COMPILE_PCRE8 */ + +#if !defined COMPILE_PCRE8 +/* The ctypes array contains only 256 values. */ +OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 0); +jump = CMP(SLJIT_GREATER, TMP2, 0, SLJIT_IMM, 255); +#endif +OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP2), common->ctypes); +#if !defined COMPILE_PCRE8 +JUMPHERE(jump); +#endif + +#if defined SUPPORT_UTF && defined COMPILE_PCRE16 +if (common->utf && update_str_ptr) + { + /* Skip low surrogate if necessary. */ + OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xd800); + jump = CMP(SLJIT_GREATER, TMP2, 0, SLJIT_IMM, 0xdc00 - 0xd800 - 1); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + JUMPHERE(jump); + } +#endif /* SUPPORT_UTF && COMPILE_PCRE16 */ +} + +static void skip_char_back(compiler_common *common) +{ +/* Goes one character back. Affects STR_PTR and TMP1. Does not check begin. */ +DEFINE_COMPILER; +#if defined SUPPORT_UTF && !defined COMPILE_PCRE32 +#if defined COMPILE_PCRE8 +struct sljit_label *label; + +if (common->utf) + { + label = LABEL(); + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), -IN_UCHARS(1)); + OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xc0); + CMPTO(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, 0x80, label); + return; + } +#elif defined COMPILE_PCRE16 +if (common->utf) + { + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), -IN_UCHARS(1)); + OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + /* Skip low surrogate if necessary. */ + OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xfc00); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0xdc00); + OP_FLAGS(SLJIT_MOV, TMP1, 0, SLJIT_EQUAL); + OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 1); + OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP1, 0); + return; + } +#endif /* COMPILE_PCRE[8|16] */ +#endif /* SUPPORT_UTF && !COMPILE_PCRE32 */ +OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); +} + +static void check_newlinechar(compiler_common *common, int nltype, jump_list **backtracks, BOOL jumpifmatch) +{ +/* Character comes in TMP1. Checks if it is a newline. TMP2 may be destroyed. */ +DEFINE_COMPILER; +struct sljit_jump *jump; + +if (nltype == NLTYPE_ANY) + { + add_jump(compiler, &common->anynewline, JUMP(SLJIT_FAST_CALL)); + sljit_set_current_flags(compiler, SLJIT_SET_Z); + add_jump(compiler, backtracks, JUMP(jumpifmatch ? SLJIT_NOT_ZERO : SLJIT_ZERO)); + } +else if (nltype == NLTYPE_ANYCRLF) + { + if (jumpifmatch) + { + add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_CR)); + add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_NL)); + } + else + { + jump = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_CR); + add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_NL)); + JUMPHERE(jump); + } + } +else + { + SLJIT_ASSERT(nltype == NLTYPE_FIXED && common->newline < 256); + add_jump(compiler, backtracks, CMP(jumpifmatch ? SLJIT_EQUAL : SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, common->newline)); + } +} + +#ifdef SUPPORT_UTF + +#if defined COMPILE_PCRE8 +static void do_utfreadchar(compiler_common *common) +{ +/* Fast decoding a UTF-8 character. TMP1 contains the first byte +of the character (>= 0xc0). Return char value in TMP1, length in TMP2. */ +DEFINE_COMPILER; +struct sljit_jump *jump; + +sljit_emit_fast_enter(compiler, RETURN_ADDR, 0); +OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0)); +OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x3f); +OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6); +OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x3f); +OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0); + +/* Searching for the first zero. */ +OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x800); +jump = JUMP(SLJIT_NOT_ZERO); +/* Two byte sequence. */ +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); +OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, IN_UCHARS(2)); +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); + +JUMPHERE(jump); +OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(1)); +OP2(SLJIT_XOR, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x800); +OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6); +OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x3f); +OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0); + +OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x10000); +jump = JUMP(SLJIT_NOT_ZERO); +/* Three byte sequence. */ +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2)); +OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, IN_UCHARS(3)); +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); + +/* Four byte sequence. */ +JUMPHERE(jump); +OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(2)); +OP2(SLJIT_XOR, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x10000); +OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6); +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(3)); +OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x3f); +OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0); +OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, IN_UCHARS(4)); +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); +} + +static void do_utfreadchar16(compiler_common *common) +{ +/* Fast decoding a UTF-8 character. TMP1 contains the first byte +of the character (>= 0xc0). Return value in TMP1. */ +DEFINE_COMPILER; +struct sljit_jump *jump; + +sljit_emit_fast_enter(compiler, RETURN_ADDR, 0); +OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0)); +OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x3f); +OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6); +OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x3f); +OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0); + +/* Searching for the first zero. */ +OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x800); +jump = JUMP(SLJIT_NOT_ZERO); +/* Two byte sequence. */ +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); + +JUMPHERE(jump); +OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x400); +OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_NOT_ZERO); +/* This code runs only in 8 bit mode. No need to shift the value. */ +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP2, 0); +OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(1)); +OP2(SLJIT_XOR, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x800); +OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6); +OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x3f); +OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0); +/* Three byte sequence. */ +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2)); +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); +} + +static void do_utfreadtype8(compiler_common *common) +{ +/* Fast decoding a UTF-8 character type. TMP2 contains the first byte +of the character (>= 0xc0). Return value in TMP1. */ +DEFINE_COMPILER; +struct sljit_jump *jump; +struct sljit_jump *compare; + +sljit_emit_fast_enter(compiler, RETURN_ADDR, 0); + +OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP2, 0, SLJIT_IMM, 0x20); +jump = JUMP(SLJIT_NOT_ZERO); +/* Two byte sequence. */ +OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0)); +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); +OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x1f); +/* The upper 5 bits are known at this point. */ +compare = CMP(SLJIT_GREATER, TMP2, 0, SLJIT_IMM, 0x3); +OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 6); +OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x3f); +OP2(SLJIT_OR, TMP2, 0, TMP2, 0, TMP1, 0); +OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP2), common->ctypes); +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); + +JUMPHERE(compare); +OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 0); +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); + +/* We only have types for characters less than 256. */ +JUMPHERE(jump); +OP1(SLJIT_MOV_U8, TMP2, 0, SLJIT_MEM1(TMP2), (sljit_sw)PRIV(utf8_table4) - 0xc0); +OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 0); +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP2, 0); +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); +} + +#endif /* COMPILE_PCRE8 */ + +#endif /* SUPPORT_UTF */ + +#ifdef SUPPORT_UCP + +/* UCD_BLOCK_SIZE must be 128 (see the assert below). */ +#define UCD_BLOCK_MASK 127 +#define UCD_BLOCK_SHIFT 7 + +static void do_getucd(compiler_common *common) +{ +/* Search the UCD record for the character comes in TMP1. +Returns chartype in TMP1 and UCD offset in TMP2. */ +DEFINE_COMPILER; +#ifdef COMPILE_PCRE32 +struct sljit_jump *jump; +#endif + +#if defined SLJIT_DEBUG && SLJIT_DEBUG +/* dummy_ucd_record */ +const ucd_record *record = GET_UCD(INVALID_UTF_CHAR); +SLJIT_ASSERT(record->script == ucp_Common && record->chartype == ucp_Cn && record->gbprop == ucp_gbOther); +SLJIT_ASSERT(record->caseset == 0 && record->other_case == 0); +#endif + +SLJIT_ASSERT(UCD_BLOCK_SIZE == 128 && sizeof(ucd_record) == 8); + +sljit_emit_fast_enter(compiler, RETURN_ADDR, 0); + +#ifdef COMPILE_PCRE32 +if (!common->utf) + { + jump = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0x10ffff + 1); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR); + JUMPHERE(jump); + } +#endif + +OP2(SLJIT_LSHR, TMP2, 0, TMP1, 0, SLJIT_IMM, UCD_BLOCK_SHIFT); +OP1(SLJIT_MOV_U8, TMP2, 0, SLJIT_MEM1(TMP2), (sljit_sw)PRIV(ucd_stage1)); +OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, UCD_BLOCK_MASK); +OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, UCD_BLOCK_SHIFT); +OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, TMP2, 0); +OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, (sljit_sw)PRIV(ucd_stage2)); +OP1(SLJIT_MOV_U16, TMP2, 0, SLJIT_MEM2(TMP2, TMP1), 1); +OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, chartype)); +OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM2(TMP1, TMP2), 3); +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); +} +#endif + +static SLJIT_INLINE struct sljit_label *mainloop_entry(compiler_common *common, BOOL hascrorlf) +{ +DEFINE_COMPILER; +struct sljit_label *mainloop; +struct sljit_label *newlinelabel = NULL; +struct sljit_jump *start; +struct sljit_jump *end = NULL; +struct sljit_jump *end2 = NULL; +#if defined SUPPORT_UTF && !defined COMPILE_PCRE32 +struct sljit_jump *singlechar; +#endif +jump_list *newline = NULL; +BOOL newlinecheck = FALSE; +BOOL readuchar = FALSE; + +if (!(hascrorlf || (common->match_end_ptr != 0)) && + (common->nltype == NLTYPE_ANY || common->nltype == NLTYPE_ANYCRLF || common->newline > 255)) + newlinecheck = TRUE; + +if (common->match_end_ptr != 0) + { + /* Search for the end of the first line. */ + OP1(SLJIT_MOV, TMP3, 0, STR_PTR, 0); + + if (common->nltype == NLTYPE_FIXED && common->newline > 255) + { + mainloop = LABEL(); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + end = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0); + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-1)); + OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0)); + CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, (common->newline >> 8) & 0xff, mainloop); + CMPTO(SLJIT_NOT_EQUAL, TMP2, 0, SLJIT_IMM, common->newline & 0xff, mainloop); + JUMPHERE(end); + OP2(SLJIT_SUB, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + } + else + { + end = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0); + mainloop = LABEL(); + /* Continual stores does not cause data dependency. */ + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr, STR_PTR, 0); + read_char_range(common, common->nlmin, common->nlmax, TRUE); + check_newlinechar(common, common->nltype, &newline, TRUE); + CMPTO(SLJIT_LESS, STR_PTR, 0, STR_END, 0, mainloop); + JUMPHERE(end); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr, STR_PTR, 0); + set_jumps(newline, LABEL()); + } + + OP1(SLJIT_MOV, STR_PTR, 0, TMP3, 0); + } + +start = JUMP(SLJIT_JUMP); + +if (newlinecheck) + { + newlinelabel = LABEL(); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + end = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0); + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, common->newline & 0xff); + OP_FLAGS(SLJIT_MOV, TMP1, 0, SLJIT_EQUAL); +#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32 + OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, UCHAR_SHIFT); +#endif + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0); + end2 = JUMP(SLJIT_JUMP); + } + +mainloop = LABEL(); + +/* Increasing the STR_PTR here requires one less jump in the most common case. */ +#ifdef SUPPORT_UTF +if (common->utf) readuchar = TRUE; +#endif +if (newlinecheck) readuchar = TRUE; + +if (readuchar) + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0); + +if (newlinecheck) + CMPTO(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, (common->newline >> 8) & 0xff, newlinelabel); + +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); +#if defined SUPPORT_UTF && !defined COMPILE_PCRE32 +#if defined COMPILE_PCRE8 +if (common->utf) + { + singlechar = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0xc0); + OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_sw)PRIV(utf8_table4) - 0xc0); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0); + JUMPHERE(singlechar); + } +#elif defined COMPILE_PCRE16 +if (common->utf) + { + singlechar = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0xd800); + OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xfc00); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0xd800); + OP_FLAGS(SLJIT_MOV, TMP1, 0, SLJIT_EQUAL); + OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 1); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0); + JUMPHERE(singlechar); + } +#endif /* COMPILE_PCRE[8|16] */ +#endif /* SUPPORT_UTF && !COMPILE_PCRE32 */ +JUMPHERE(start); + +if (newlinecheck) + { + JUMPHERE(end); + JUMPHERE(end2); + } + +return mainloop; +} + +#define MAX_N_CHARS 16 +#define MAX_DIFF_CHARS 6 + +static SLJIT_INLINE void add_prefix_char(pcre_uchar chr, pcre_uchar *chars) +{ +pcre_uchar i, len; + +len = chars[0]; +if (len == 255) + return; + +if (len == 0) + { + chars[0] = 1; + chars[1] = chr; + return; + } + +for (i = len; i > 0; i--) + if (chars[i] == chr) + return; + +if (len >= MAX_DIFF_CHARS - 1) + { + chars[0] = 255; + return; + } + +len++; +chars[len] = chr; +chars[0] = len; +} + +static int scan_prefix(compiler_common *common, pcre_uchar *cc, pcre_uchar *chars, int max_chars, sljit_u32 *rec_count) +{ +/* Recursive function, which scans prefix literals. */ +BOOL last, any, class, caseless; +int len, repeat, len_save, consumed = 0; +sljit_u32 chr; /* Any unicode character. */ +sljit_u8 *bytes, *bytes_end, byte; +pcre_uchar *alternative, *cc_save, *oc; +#if defined SUPPORT_UTF && defined COMPILE_PCRE8 +pcre_uchar othercase[8]; +#elif defined SUPPORT_UTF && defined COMPILE_PCRE16 +pcre_uchar othercase[2]; +#else +pcre_uchar othercase[1]; +#endif + +repeat = 1; +while (TRUE) + { + if (*rec_count == 0) + return 0; + (*rec_count)--; + + last = TRUE; + any = FALSE; + class = FALSE; + caseless = FALSE; + + switch (*cc) + { + case OP_CHARI: + caseless = TRUE; + case OP_CHAR: + last = FALSE; + cc++; + break; + + case OP_SOD: + case OP_SOM: + case OP_SET_SOM: + case OP_NOT_WORD_BOUNDARY: + case OP_WORD_BOUNDARY: + case OP_EODN: + case OP_EOD: + case OP_CIRC: + case OP_CIRCM: + case OP_DOLL: + case OP_DOLLM: + /* Zero width assertions. */ + cc++; + continue; + + case OP_ASSERT: + case OP_ASSERT_NOT: + case OP_ASSERTBACK: + case OP_ASSERTBACK_NOT: + cc = bracketend(cc); + continue; + + case OP_PLUSI: + case OP_MINPLUSI: + case OP_POSPLUSI: + caseless = TRUE; + case OP_PLUS: + case OP_MINPLUS: + case OP_POSPLUS: + cc++; + break; + + case OP_EXACTI: + caseless = TRUE; + case OP_EXACT: + repeat = GET2(cc, 1); + last = FALSE; + cc += 1 + IMM2_SIZE; + break; + + case OP_QUERYI: + case OP_MINQUERYI: + case OP_POSQUERYI: + caseless = TRUE; + case OP_QUERY: + case OP_MINQUERY: + case OP_POSQUERY: + len = 1; + cc++; +#ifdef SUPPORT_UTF + if (common->utf && HAS_EXTRALEN(*cc)) len += GET_EXTRALEN(*cc); +#endif + max_chars = scan_prefix(common, cc + len, chars, max_chars, rec_count); + if (max_chars == 0) + return consumed; + last = FALSE; + break; + + case OP_KET: + cc += 1 + LINK_SIZE; + continue; + + case OP_ALT: + cc += GET(cc, 1); + continue; + + case OP_ONCE: + case OP_ONCE_NC: + case OP_BRA: + case OP_BRAPOS: + case OP_CBRA: + case OP_CBRAPOS: + alternative = cc + GET(cc, 1); + while (*alternative == OP_ALT) + { + max_chars = scan_prefix(common, alternative + 1 + LINK_SIZE, chars, max_chars, rec_count); + if (max_chars == 0) + return consumed; + alternative += GET(alternative, 1); + } + + if (*cc == OP_CBRA || *cc == OP_CBRAPOS) + cc += IMM2_SIZE; + cc += 1 + LINK_SIZE; + continue; + + case OP_CLASS: +#if defined SUPPORT_UTF && defined COMPILE_PCRE8 + if (common->utf && !is_char7_bitset((const sljit_u8 *)(cc + 1), FALSE)) + return consumed; +#endif + class = TRUE; + break; + + case OP_NCLASS: +#if defined SUPPORT_UTF && !defined COMPILE_PCRE32 + if (common->utf) return consumed; +#endif + class = TRUE; + break; + +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 + case OP_XCLASS: +#if defined SUPPORT_UTF && !defined COMPILE_PCRE32 + if (common->utf) return consumed; +#endif + any = TRUE; + cc += GET(cc, 1); + break; +#endif + + case OP_DIGIT: +#if defined SUPPORT_UTF && defined COMPILE_PCRE8 + if (common->utf && !is_char7_bitset((const sljit_u8 *)common->ctypes - cbit_length + cbit_digit, FALSE)) + return consumed; +#endif + any = TRUE; + cc++; + break; + + case OP_WHITESPACE: +#if defined SUPPORT_UTF && defined COMPILE_PCRE8 + if (common->utf && !is_char7_bitset((const sljit_u8 *)common->ctypes - cbit_length + cbit_space, FALSE)) + return consumed; +#endif + any = TRUE; + cc++; + break; + + case OP_WORDCHAR: +#if defined SUPPORT_UTF && defined COMPILE_PCRE8 + if (common->utf && !is_char7_bitset((const sljit_u8 *)common->ctypes - cbit_length + cbit_word, FALSE)) + return consumed; +#endif + any = TRUE; + cc++; + break; + + case OP_NOT: + case OP_NOTI: + cc++; + /* Fall through. */ + case OP_NOT_DIGIT: + case OP_NOT_WHITESPACE: + case OP_NOT_WORDCHAR: + case OP_ANY: + case OP_ALLANY: +#if defined SUPPORT_UTF && !defined COMPILE_PCRE32 + if (common->utf) return consumed; +#endif + any = TRUE; + cc++; + break; + +#ifdef SUPPORT_UTF + case OP_NOTPROP: + case OP_PROP: +#ifndef COMPILE_PCRE32 + if (common->utf) return consumed; +#endif + any = TRUE; + cc += 1 + 2; + break; +#endif + + case OP_TYPEEXACT: + repeat = GET2(cc, 1); + cc += 1 + IMM2_SIZE; + continue; + + case OP_NOTEXACT: + case OP_NOTEXACTI: +#if defined SUPPORT_UTF && !defined COMPILE_PCRE32 + if (common->utf) return consumed; +#endif + any = TRUE; + repeat = GET2(cc, 1); + cc += 1 + IMM2_SIZE + 1; + break; + + default: + return consumed; + } + + if (any) + { + do + { + chars[0] = 255; + + consumed++; + if (--max_chars == 0) + return consumed; + chars += MAX_DIFF_CHARS; + } + while (--repeat > 0); + + repeat = 1; + continue; + } + + if (class) + { + bytes = (sljit_u8*) (cc + 1); + cc += 1 + 32 / sizeof(pcre_uchar); + + switch (*cc) + { + case OP_CRSTAR: + case OP_CRMINSTAR: + case OP_CRPOSSTAR: + case OP_CRQUERY: + case OP_CRMINQUERY: + case OP_CRPOSQUERY: + max_chars = scan_prefix(common, cc + 1, chars, max_chars, rec_count); + if (max_chars == 0) + return consumed; + break; + + default: + case OP_CRPLUS: + case OP_CRMINPLUS: + case OP_CRPOSPLUS: + break; + + case OP_CRRANGE: + case OP_CRMINRANGE: + case OP_CRPOSRANGE: + repeat = GET2(cc, 1); + if (repeat <= 0) + return consumed; + break; + } + + do + { + if (bytes[31] & 0x80) + chars[0] = 255; + else if (chars[0] != 255) + { + bytes_end = bytes + 32; + chr = 0; + do + { + byte = *bytes++; + SLJIT_ASSERT((chr & 0x7) == 0); + if (byte == 0) + chr += 8; + else + { + do + { + if ((byte & 0x1) != 0) + add_prefix_char(chr, chars); + byte >>= 1; + chr++; + } + while (byte != 0); + chr = (chr + 7) & ~7; + } + } + while (chars[0] != 255 && bytes < bytes_end); + bytes = bytes_end - 32; + } + + consumed++; + if (--max_chars == 0) + return consumed; + chars += MAX_DIFF_CHARS; + } + while (--repeat > 0); + + switch (*cc) + { + case OP_CRSTAR: + case OP_CRMINSTAR: + case OP_CRPOSSTAR: + return consumed; + + case OP_CRQUERY: + case OP_CRMINQUERY: + case OP_CRPOSQUERY: + cc++; + break; + + case OP_CRRANGE: + case OP_CRMINRANGE: + case OP_CRPOSRANGE: + if (GET2(cc, 1) != GET2(cc, 1 + IMM2_SIZE)) + return consumed; + cc += 1 + 2 * IMM2_SIZE; + break; + } + + repeat = 1; + continue; + } + + len = 1; +#ifdef SUPPORT_UTF + if (common->utf && HAS_EXTRALEN(*cc)) len += GET_EXTRALEN(*cc); +#endif + + if (caseless && char_has_othercase(common, cc)) + { +#ifdef SUPPORT_UTF + if (common->utf) + { + GETCHAR(chr, cc); + if ((int)PRIV(ord2utf)(char_othercase(common, chr), othercase) != len) + return consumed; + } + else +#endif + { + chr = *cc; + othercase[0] = TABLE_GET(chr, common->fcc, chr); + } + } + else + { + caseless = FALSE; + othercase[0] = 0; /* Stops compiler warning - PH */ + } + + len_save = len; + cc_save = cc; + while (TRUE) + { + oc = othercase; + do + { + chr = *cc; + add_prefix_char(*cc, chars); + + if (caseless) + add_prefix_char(*oc, chars); + + len--; + consumed++; + if (--max_chars == 0) + return consumed; + chars += MAX_DIFF_CHARS; + cc++; + oc++; + } + while (len > 0); + + if (--repeat == 0) + break; + + len = len_save; + cc = cc_save; + } + + repeat = 1; + if (last) + return consumed; + } +} + +#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) && !(defined SUPPORT_VALGRIND) + +static sljit_s32 character_to_int32(pcre_uchar chr) +{ +sljit_s32 value = (sljit_s32)chr; +#if defined COMPILE_PCRE8 +#define SSE2_COMPARE_TYPE_INDEX 0 +return ((unsigned int)value << 24) | ((unsigned int)value << 16) | ((unsigned int)value << 8) | (unsigned int)value; +#elif defined COMPILE_PCRE16 +#define SSE2_COMPARE_TYPE_INDEX 1 +return ((unsigned int)value << 16) | value; +#elif defined COMPILE_PCRE32 +#define SSE2_COMPARE_TYPE_INDEX 2 +return value; +#else +#error "Unsupported unit width" +#endif +} + +static SLJIT_INLINE void fast_forward_first_char2_sse2(compiler_common *common, pcre_uchar char1, pcre_uchar char2) +{ +DEFINE_COMPILER; +struct sljit_label *start; +struct sljit_jump *quit[3]; +struct sljit_jump *nomatch; +sljit_u8 instruction[8]; +sljit_s32 tmp1_ind = sljit_get_register_index(TMP1); +sljit_s32 tmp2_ind = sljit_get_register_index(TMP2); +sljit_s32 str_ptr_ind = sljit_get_register_index(STR_PTR); +BOOL load_twice = FALSE; +pcre_uchar bit; + +bit = char1 ^ char2; +if (!is_powerof2(bit)) + bit = 0; + +if ((char1 != char2) && bit == 0) + load_twice = TRUE; + +quit[0] = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0); + +/* First part (unaligned start) */ + +OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, character_to_int32(char1 | bit)); + +SLJIT_ASSERT(tmp1_ind < 8 && tmp2_ind == 1); + +/* MOVD xmm, r/m32 */ +instruction[0] = 0x66; +instruction[1] = 0x0f; +instruction[2] = 0x6e; +instruction[3] = 0xc0 | (2 << 3) | tmp1_ind; +sljit_emit_op_custom(compiler, instruction, 4); + +if (char1 != char2) + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, character_to_int32(bit != 0 ? bit : char2)); + + /* MOVD xmm, r/m32 */ + instruction[3] = 0xc0 | (3 << 3) | tmp1_ind; + sljit_emit_op_custom(compiler, instruction, 4); + } + +/* PSHUFD xmm1, xmm2/m128, imm8 */ +instruction[2] = 0x70; +instruction[3] = 0xc0 | (2 << 3) | 2; +instruction[4] = 0; +sljit_emit_op_custom(compiler, instruction, 5); + +if (char1 != char2) + { + /* PSHUFD xmm1, xmm2/m128, imm8 */ + instruction[3] = 0xc0 | (3 << 3) | 3; + instruction[4] = 0; + sljit_emit_op_custom(compiler, instruction, 5); + } + +OP2(SLJIT_AND, TMP2, 0, STR_PTR, 0, SLJIT_IMM, 0xf); +OP2(SLJIT_AND, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, ~0xf); + +/* MOVDQA xmm1, xmm2/m128 */ +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + +if (str_ptr_ind < 8) + { + instruction[2] = 0x6f; + instruction[3] = (0 << 3) | str_ptr_ind; + sljit_emit_op_custom(compiler, instruction, 4); + + if (load_twice) + { + instruction[3] = (1 << 3) | str_ptr_ind; + sljit_emit_op_custom(compiler, instruction, 4); + } + } +else + { + instruction[1] = 0x41; + instruction[2] = 0x0f; + instruction[3] = 0x6f; + instruction[4] = (0 << 3) | (str_ptr_ind & 0x7); + sljit_emit_op_custom(compiler, instruction, 5); + + if (load_twice) + { + instruction[4] = (1 << 3) | str_ptr_ind; + sljit_emit_op_custom(compiler, instruction, 5); + } + instruction[1] = 0x0f; + } + +#else + +instruction[2] = 0x6f; +instruction[3] = (0 << 3) | str_ptr_ind; +sljit_emit_op_custom(compiler, instruction, 4); + +if (load_twice) + { + instruction[3] = (1 << 3) | str_ptr_ind; + sljit_emit_op_custom(compiler, instruction, 4); + } + +#endif + +if (bit != 0) + { + /* POR xmm1, xmm2/m128 */ + instruction[2] = 0xeb; + instruction[3] = 0xc0 | (0 << 3) | 3; + sljit_emit_op_custom(compiler, instruction, 4); + } + +/* PCMPEQB/W/D xmm1, xmm2/m128 */ +instruction[2] = 0x74 + SSE2_COMPARE_TYPE_INDEX; +instruction[3] = 0xc0 | (0 << 3) | 2; +sljit_emit_op_custom(compiler, instruction, 4); + +if (load_twice) + { + instruction[3] = 0xc0 | (1 << 3) | 3; + sljit_emit_op_custom(compiler, instruction, 4); + } + +/* PMOVMSKB reg, xmm */ +instruction[2] = 0xd7; +instruction[3] = 0xc0 | (tmp1_ind << 3) | 0; +sljit_emit_op_custom(compiler, instruction, 4); + +if (load_twice) + { + OP1(SLJIT_MOV, RETURN_ADDR, 0, TMP2, 0); + instruction[3] = 0xc0 | (tmp2_ind << 3) | 1; + sljit_emit_op_custom(compiler, instruction, 4); + + OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0); + OP1(SLJIT_MOV, TMP2, 0, RETURN_ADDR, 0); + } + +OP2(SLJIT_ASHR, TMP1, 0, TMP1, 0, TMP2, 0); + +/* BSF r32, r/m32 */ +instruction[0] = 0x0f; +instruction[1] = 0xbc; +instruction[2] = 0xc0 | (tmp1_ind << 3) | tmp1_ind; +sljit_emit_op_custom(compiler, instruction, 3); +sljit_set_current_flags(compiler, SLJIT_SET_Z); + +nomatch = JUMP(SLJIT_ZERO); + +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP2, 0); +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0); +quit[1] = JUMP(SLJIT_JUMP); + +JUMPHERE(nomatch); + +start = LABEL(); +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, 16); +quit[2] = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0); + +/* Second part (aligned) */ + +instruction[0] = 0x66; +instruction[1] = 0x0f; + +/* MOVDQA xmm1, xmm2/m128 */ +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + +if (str_ptr_ind < 8) + { + instruction[2] = 0x6f; + instruction[3] = (0 << 3) | str_ptr_ind; + sljit_emit_op_custom(compiler, instruction, 4); + + if (load_twice) + { + instruction[3] = (1 << 3) | str_ptr_ind; + sljit_emit_op_custom(compiler, instruction, 4); + } + } +else + { + instruction[1] = 0x41; + instruction[2] = 0x0f; + instruction[3] = 0x6f; + instruction[4] = (0 << 3) | (str_ptr_ind & 0x7); + sljit_emit_op_custom(compiler, instruction, 5); + + if (load_twice) + { + instruction[4] = (1 << 3) | str_ptr_ind; + sljit_emit_op_custom(compiler, instruction, 5); + } + instruction[1] = 0x0f; + } + +#else + +instruction[2] = 0x6f; +instruction[3] = (0 << 3) | str_ptr_ind; +sljit_emit_op_custom(compiler, instruction, 4); + +if (load_twice) + { + instruction[3] = (1 << 3) | str_ptr_ind; + sljit_emit_op_custom(compiler, instruction, 4); + } + +#endif + +if (bit != 0) + { + /* POR xmm1, xmm2/m128 */ + instruction[2] = 0xeb; + instruction[3] = 0xc0 | (0 << 3) | 3; + sljit_emit_op_custom(compiler, instruction, 4); + } + +/* PCMPEQB/W/D xmm1, xmm2/m128 */ +instruction[2] = 0x74 + SSE2_COMPARE_TYPE_INDEX; +instruction[3] = 0xc0 | (0 << 3) | 2; +sljit_emit_op_custom(compiler, instruction, 4); + +if (load_twice) + { + instruction[3] = 0xc0 | (1 << 3) | 3; + sljit_emit_op_custom(compiler, instruction, 4); + } + +/* PMOVMSKB reg, xmm */ +instruction[2] = 0xd7; +instruction[3] = 0xc0 | (tmp1_ind << 3) | 0; +sljit_emit_op_custom(compiler, instruction, 4); + +if (load_twice) + { + instruction[3] = 0xc0 | (tmp2_ind << 3) | 1; + sljit_emit_op_custom(compiler, instruction, 4); + + OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0); + } + +/* BSF r32, r/m32 */ +instruction[0] = 0x0f; +instruction[1] = 0xbc; +instruction[2] = 0xc0 | (tmp1_ind << 3) | tmp1_ind; +sljit_emit_op_custom(compiler, instruction, 3); +sljit_set_current_flags(compiler, SLJIT_SET_Z); + +JUMPTO(SLJIT_ZERO, start); + +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0); + +start = LABEL(); +SET_LABEL(quit[0], start); +SET_LABEL(quit[1], start); +SET_LABEL(quit[2], start); +} + +#undef SSE2_COMPARE_TYPE_INDEX + +#endif + +static void fast_forward_first_char2(compiler_common *common, pcre_uchar char1, pcre_uchar char2, sljit_s32 offset) +{ +DEFINE_COMPILER; +struct sljit_label *start; +struct sljit_jump *quit; +struct sljit_jump *found; +pcre_uchar mask; +#if defined SUPPORT_UTF && !defined COMPILE_PCRE32 +struct sljit_label *utf_start = NULL; +struct sljit_jump *utf_quit = NULL; +#endif +BOOL has_match_end = (common->match_end_ptr != 0); + +if (offset > 0) + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(offset)); + +if (has_match_end) + { + OP1(SLJIT_MOV, TMP3, 0, STR_END, 0); + + OP2(SLJIT_ADD, STR_END, 0, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr, SLJIT_IMM, IN_UCHARS(offset + 1)); + OP2(SLJIT_SUB | SLJIT_SET_GREATER, SLJIT_UNUSED, 0, STR_END, 0, TMP3, 0); + sljit_emit_cmov(compiler, SLJIT_GREATER, STR_END, TMP3, 0); + } + +#if defined SUPPORT_UTF && !defined COMPILE_PCRE32 +if (common->utf && offset > 0) + utf_start = LABEL(); +#endif + +#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) && !(defined SUPPORT_VALGRIND) + +/* SSE2 accelerated first character search. */ + +if (sljit_has_cpu_feature(SLJIT_HAS_SSE2)) + { + fast_forward_first_char2_sse2(common, char1, char2); + + SLJIT_ASSERT(common->mode == JIT_COMPILE || offset == 0); + if (common->mode == JIT_COMPILE) + { + /* In complete mode, we don't need to run a match when STR_PTR == STR_END. */ + SLJIT_ASSERT(common->forced_quit_label == NULL); + OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, PCRE_ERROR_NOMATCH); + add_jump(compiler, &common->forced_quit, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0)); + +#if defined SUPPORT_UTF && !defined COMPILE_PCRE32 + if (common->utf && offset > 0) + { + SLJIT_ASSERT(common->mode == JIT_COMPILE); + + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-offset)); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); +#if defined COMPILE_PCRE8 + OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xc0); + CMPTO(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, 0x80, utf_start); +#elif defined COMPILE_PCRE16 + OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xfc00); + CMPTO(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, 0xdc00, utf_start); +#else +#error "Unknown code width" +#endif + OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + } +#endif + + if (offset > 0) + OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(offset)); + } + else + { + OP2(SLJIT_SUB | SLJIT_SET_GREATER_EQUAL, SLJIT_UNUSED, 0, STR_PTR, 0, STR_END, 0); + if (has_match_end) + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr); + sljit_emit_cmov(compiler, SLJIT_GREATER_EQUAL, STR_PTR, TMP1, 0); + } + else + sljit_emit_cmov(compiler, SLJIT_GREATER_EQUAL, STR_PTR, STR_END, 0); + } + + if (has_match_end) + OP1(SLJIT_MOV, STR_END, 0, TMP3, 0); + return; + } + +#endif + +quit = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0); + +start = LABEL(); +OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0); + +if (char1 == char2) + found = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, char1); +else + { + mask = char1 ^ char2; + if (is_powerof2(mask)) + { + OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, mask); + found = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, char1 | mask); + } + else + { + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, char1); + OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, char2); + OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_EQUAL); + found = JUMP(SLJIT_NOT_ZERO); + } + } + +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); +CMPTO(SLJIT_LESS, STR_PTR, 0, STR_END, 0, start); + +#if defined SUPPORT_UTF && !defined COMPILE_PCRE32 +if (common->utf && offset > 0) + utf_quit = JUMP(SLJIT_JUMP); +#endif + +JUMPHERE(found); + +#if defined SUPPORT_UTF && !defined COMPILE_PCRE32 +if (common->utf && offset > 0) + { + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-offset)); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); +#if defined COMPILE_PCRE8 + OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xc0); + CMPTO(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, 0x80, utf_start); +#elif defined COMPILE_PCRE16 + OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xfc00); + CMPTO(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, 0xdc00, utf_start); +#else +#error "Unknown code width" +#endif + OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + JUMPHERE(utf_quit); + } +#endif + +JUMPHERE(quit); + +if (has_match_end) + { + quit = CMP(SLJIT_LESS, STR_PTR, 0, STR_END, 0); + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr); + if (offset > 0) + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(offset)); + JUMPHERE(quit); + OP1(SLJIT_MOV, STR_END, 0, TMP3, 0); + } + +if (offset > 0) + OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(offset)); +} + +static SLJIT_INLINE BOOL fast_forward_first_n_chars(compiler_common *common) +{ +DEFINE_COMPILER; +struct sljit_label *start; +struct sljit_jump *quit; +struct sljit_jump *match; +/* bytes[0] represent the number of characters between 0 +and MAX_N_BYTES - 1, 255 represents any character. */ +pcre_uchar chars[MAX_N_CHARS * MAX_DIFF_CHARS]; +sljit_s32 offset; +pcre_uchar mask; +pcre_uchar *char_set, *char_set_end; +int i, max, from; +int range_right = -1, range_len; +sljit_u8 *update_table = NULL; +BOOL in_range; +sljit_u32 rec_count; + +for (i = 0; i < MAX_N_CHARS; i++) + chars[i * MAX_DIFF_CHARS] = 0; + +rec_count = 10000; +max = scan_prefix(common, common->start, chars, MAX_N_CHARS, &rec_count); + +if (max < 1) + return FALSE; + +in_range = FALSE; +/* Prevent compiler "uninitialized" warning */ +from = 0; +range_len = 4 /* minimum length */ - 1; +for (i = 0; i <= max; i++) + { + if (in_range && (i - from) > range_len && (chars[(i - 1) * MAX_DIFF_CHARS] < 255)) + { + range_len = i - from; + range_right = i - 1; + } + + if (i < max && chars[i * MAX_DIFF_CHARS] < 255) + { + SLJIT_ASSERT(chars[i * MAX_DIFF_CHARS] > 0); + if (!in_range) + { + in_range = TRUE; + from = i; + } + } + else + in_range = FALSE; + } + +if (range_right >= 0) + { + update_table = (sljit_u8 *)allocate_read_only_data(common, 256); + if (update_table == NULL) + return TRUE; + memset(update_table, IN_UCHARS(range_len), 256); + + for (i = 0; i < range_len; i++) + { + char_set = chars + ((range_right - i) * MAX_DIFF_CHARS); + SLJIT_ASSERT(char_set[0] > 0 && char_set[0] < 255); + char_set_end = char_set + char_set[0]; + char_set++; + while (char_set <= char_set_end) + { + if (update_table[(*char_set) & 0xff] > IN_UCHARS(i)) + update_table[(*char_set) & 0xff] = IN_UCHARS(i); + char_set++; + } + } + } + +offset = -1; +/* Scan forward. */ +for (i = 0; i < max; i++) + { + if (offset == -1) + { + if (chars[i * MAX_DIFF_CHARS] <= 2) + offset = i; + } + else if (chars[offset * MAX_DIFF_CHARS] == 2 && chars[i * MAX_DIFF_CHARS] <= 2) + { + if (chars[i * MAX_DIFF_CHARS] == 1) + offset = i; + else + { + mask = chars[offset * MAX_DIFF_CHARS + 1] ^ chars[offset * MAX_DIFF_CHARS + 2]; + if (!is_powerof2(mask)) + { + mask = chars[i * MAX_DIFF_CHARS + 1] ^ chars[i * MAX_DIFF_CHARS + 2]; + if (is_powerof2(mask)) + offset = i; + } + } + } + } + +if (range_right < 0) + { + if (offset < 0) + return FALSE; + SLJIT_ASSERT(chars[offset * MAX_DIFF_CHARS] >= 1 && chars[offset * MAX_DIFF_CHARS] <= 2); + /* Works regardless the value is 1 or 2. */ + mask = chars[offset * MAX_DIFF_CHARS + chars[offset * MAX_DIFF_CHARS]]; + fast_forward_first_char2(common, chars[offset * MAX_DIFF_CHARS + 1], mask, offset); + return TRUE; + } + +if (range_right == offset) + offset = -1; + +SLJIT_ASSERT(offset == -1 || (chars[offset * MAX_DIFF_CHARS] >= 1 && chars[offset * MAX_DIFF_CHARS] <= 2)); + +max -= 1; +SLJIT_ASSERT(max > 0); +if (common->match_end_ptr != 0) + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr); + OP1(SLJIT_MOV, TMP3, 0, STR_END, 0); + OP2(SLJIT_SUB, STR_END, 0, STR_END, 0, SLJIT_IMM, IN_UCHARS(max)); + quit = CMP(SLJIT_LESS_EQUAL, STR_END, 0, TMP1, 0); + OP1(SLJIT_MOV, STR_END, 0, TMP1, 0); + JUMPHERE(quit); + } +else + OP2(SLJIT_SUB, STR_END, 0, STR_END, 0, SLJIT_IMM, IN_UCHARS(max)); + +SLJIT_ASSERT(range_right >= 0); + +#if !(defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) +OP1(SLJIT_MOV, RETURN_ADDR, 0, SLJIT_IMM, (sljit_sw)update_table); +#endif + +start = LABEL(); +quit = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0); + +#if defined COMPILE_PCRE8 || (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN) +OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(range_right)); +#else +OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(range_right + 1) - 1); +#endif + +#if !(defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) +OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM2(RETURN_ADDR, TMP1), 0); +#else +OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_sw)update_table); +#endif +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0); +CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, 0, start); + +if (offset >= 0) + { + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(offset)); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + + if (chars[offset * MAX_DIFF_CHARS] == 1) + CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, chars[offset * MAX_DIFF_CHARS + 1], start); + else + { + mask = chars[offset * MAX_DIFF_CHARS + 1] ^ chars[offset * MAX_DIFF_CHARS + 2]; + if (is_powerof2(mask)) + { + OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, mask); + CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, chars[offset * MAX_DIFF_CHARS + 1] | mask, start); + } + else + { + match = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, chars[offset * MAX_DIFF_CHARS + 1]); + CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, chars[offset * MAX_DIFF_CHARS + 2], start); + JUMPHERE(match); + } + } + } + +#if defined SUPPORT_UTF && !defined COMPILE_PCRE32 +if (common->utf && offset != 0) + { + if (offset < 0) + { + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + } + else + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-1)); +#if defined COMPILE_PCRE8 + OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xc0); + CMPTO(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, 0x80, start); +#elif defined COMPILE_PCRE16 + OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xfc00); + CMPTO(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, 0xdc00, start); +#else +#error "Unknown code width" +#endif + if (offset < 0) + OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + } +#endif + +if (offset >= 0) + OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + +JUMPHERE(quit); + +if (common->match_end_ptr != 0) + { + if (range_right >= 0) + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr); + OP1(SLJIT_MOV, STR_END, 0, TMP3, 0); + if (range_right >= 0) + { + quit = CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, TMP1, 0); + OP1(SLJIT_MOV, STR_PTR, 0, TMP1, 0); + JUMPHERE(quit); + } + } +else + OP2(SLJIT_ADD, STR_END, 0, STR_END, 0, SLJIT_IMM, IN_UCHARS(max)); +return TRUE; +} + +#undef MAX_N_CHARS +#undef MAX_DIFF_CHARS + +static SLJIT_INLINE void fast_forward_first_char(compiler_common *common, pcre_uchar first_char, BOOL caseless) +{ +pcre_uchar oc; + +oc = first_char; +if (caseless) + { + oc = TABLE_GET(first_char, common->fcc, first_char); +#if defined SUPPORT_UCP && !defined COMPILE_PCRE8 + if (first_char > 127 && common->utf) + oc = UCD_OTHERCASE(first_char); +#endif + } + +fast_forward_first_char2(common, first_char, oc, 0); +} + +static SLJIT_INLINE void fast_forward_newline(compiler_common *common) +{ +DEFINE_COMPILER; +struct sljit_label *loop; +struct sljit_jump *lastchar; +struct sljit_jump *firstchar; +struct sljit_jump *quit; +struct sljit_jump *foundcr = NULL; +struct sljit_jump *notfoundnl; +jump_list *newline = NULL; + +if (common->match_end_ptr != 0) + { + OP1(SLJIT_MOV, TMP3, 0, STR_END, 0); + OP1(SLJIT_MOV, STR_END, 0, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr); + } + +if (common->nltype == NLTYPE_FIXED && common->newline > 255) + { + lastchar = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0); + OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0); + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, str)); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, begin)); + firstchar = CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, TMP2, 0); + + OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(2)); + OP2(SLJIT_SUB | SLJIT_SET_GREATER_EQUAL, SLJIT_UNUSED, 0, STR_PTR, 0, TMP1, 0); + OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_GREATER_EQUAL); +#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32 + OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, UCHAR_SHIFT); +#endif + OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP2, 0); + + loop = LABEL(); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + quit = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0); + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-2)); + OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-1)); + CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, (common->newline >> 8) & 0xff, loop); + CMPTO(SLJIT_NOT_EQUAL, TMP2, 0, SLJIT_IMM, common->newline & 0xff, loop); + + JUMPHERE(quit); + JUMPHERE(firstchar); + JUMPHERE(lastchar); + + if (common->match_end_ptr != 0) + OP1(SLJIT_MOV, STR_END, 0, TMP3, 0); + return; + } + +OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0); +OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, str)); +firstchar = CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, TMP2, 0); +skip_char_back(common); + +loop = LABEL(); +common->ff_newline_shortcut = loop; + +read_char_range(common, common->nlmin, common->nlmax, TRUE); +lastchar = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0); +if (common->nltype == NLTYPE_ANY || common->nltype == NLTYPE_ANYCRLF) + foundcr = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_CR); +check_newlinechar(common, common->nltype, &newline, FALSE); +set_jumps(newline, loop); + +if (common->nltype == NLTYPE_ANY || common->nltype == NLTYPE_ANYCRLF) + { + quit = JUMP(SLJIT_JUMP); + JUMPHERE(foundcr); + notfoundnl = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0); + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, CHAR_NL); + OP_FLAGS(SLJIT_MOV, TMP1, 0, SLJIT_EQUAL); +#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32 + OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, UCHAR_SHIFT); +#endif + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0); + JUMPHERE(notfoundnl); + JUMPHERE(quit); + } +JUMPHERE(lastchar); +JUMPHERE(firstchar); + +if (common->match_end_ptr != 0) + OP1(SLJIT_MOV, STR_END, 0, TMP3, 0); +} + +static BOOL check_class_ranges(compiler_common *common, const sljit_u8 *bits, BOOL nclass, BOOL invert, jump_list **backtracks); + +static SLJIT_INLINE void fast_forward_start_bits(compiler_common *common, const sljit_u8 *start_bits) +{ +DEFINE_COMPILER; +struct sljit_label *start; +struct sljit_jump *quit; +struct sljit_jump *found = NULL; +jump_list *matches = NULL; +#ifndef COMPILE_PCRE8 +struct sljit_jump *jump; +#endif + +if (common->match_end_ptr != 0) + { + OP1(SLJIT_MOV, RETURN_ADDR, 0, STR_END, 0); + OP1(SLJIT_MOV, STR_END, 0, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr); + } + +start = LABEL(); +quit = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0); +OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0); +#ifdef SUPPORT_UTF +if (common->utf) + OP1(SLJIT_MOV, TMP3, 0, TMP1, 0); +#endif + +if (!check_class_ranges(common, start_bits, (start_bits[31] & 0x80) != 0, TRUE, &matches)) + { +#ifndef COMPILE_PCRE8 + jump = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 255); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 255); + JUMPHERE(jump); +#endif + OP2(SLJIT_AND, TMP2, 0, TMP1, 0, SLJIT_IMM, 0x7); + OP2(SLJIT_LSHR, TMP1, 0, TMP1, 0, SLJIT_IMM, 3); + OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_sw)start_bits); + OP2(SLJIT_SHL, TMP2, 0, SLJIT_IMM, 1, TMP2, 0); + OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, TMP2, 0); + found = JUMP(SLJIT_NOT_ZERO); + } + +#ifdef SUPPORT_UTF +if (common->utf) + OP1(SLJIT_MOV, TMP1, 0, TMP3, 0); +#endif +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); +#ifdef SUPPORT_UTF +#if defined COMPILE_PCRE8 +if (common->utf) + { + CMPTO(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0xc0, start); + OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_sw)PRIV(utf8_table4) - 0xc0); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0); + } +#elif defined COMPILE_PCRE16 +if (common->utf) + { + CMPTO(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0xd800, start); + OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xfc00); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0xd800); + OP_FLAGS(SLJIT_MOV, TMP1, 0, SLJIT_EQUAL); + OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 1); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0); + } +#endif /* COMPILE_PCRE[8|16] */ +#endif /* SUPPORT_UTF */ +JUMPTO(SLJIT_JUMP, start); +if (found != NULL) + JUMPHERE(found); +if (matches != NULL) + set_jumps(matches, LABEL()); +JUMPHERE(quit); + +if (common->match_end_ptr != 0) + OP1(SLJIT_MOV, STR_END, 0, RETURN_ADDR, 0); +} + +static SLJIT_INLINE struct sljit_jump *search_requested_char(compiler_common *common, pcre_uchar req_char, BOOL caseless, BOOL has_firstchar) +{ +DEFINE_COMPILER; +struct sljit_label *loop; +struct sljit_jump *toolong; +struct sljit_jump *alreadyfound; +struct sljit_jump *found; +struct sljit_jump *foundoc = NULL; +struct sljit_jump *notfound; +sljit_u32 oc, bit; + +SLJIT_ASSERT(common->req_char_ptr != 0); +OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), common->req_char_ptr); +OP2(SLJIT_ADD, TMP1, 0, STR_PTR, 0, SLJIT_IMM, REQ_BYTE_MAX); +toolong = CMP(SLJIT_LESS, TMP1, 0, STR_END, 0); +alreadyfound = CMP(SLJIT_LESS, STR_PTR, 0, TMP2, 0); + +if (has_firstchar) + OP2(SLJIT_ADD, TMP1, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); +else + OP1(SLJIT_MOV, TMP1, 0, STR_PTR, 0); + +loop = LABEL(); +notfound = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, STR_END, 0); + +OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(TMP1), 0); +oc = req_char; +if (caseless) + { + oc = TABLE_GET(req_char, common->fcc, req_char); +#if defined SUPPORT_UCP && !(defined COMPILE_PCRE8) + if (req_char > 127 && common->utf) + oc = UCD_OTHERCASE(req_char); +#endif + } +if (req_char == oc) + found = CMP(SLJIT_EQUAL, TMP2, 0, SLJIT_IMM, req_char); +else + { + bit = req_char ^ oc; + if (is_powerof2(bit)) + { + OP2(SLJIT_OR, TMP2, 0, TMP2, 0, SLJIT_IMM, bit); + found = CMP(SLJIT_EQUAL, TMP2, 0, SLJIT_IMM, req_char | bit); + } + else + { + found = CMP(SLJIT_EQUAL, TMP2, 0, SLJIT_IMM, req_char); + foundoc = CMP(SLJIT_EQUAL, TMP2, 0, SLJIT_IMM, oc); + } + } +OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(1)); +JUMPTO(SLJIT_JUMP, loop); + +JUMPHERE(found); +if (foundoc) + JUMPHERE(foundoc); +OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->req_char_ptr, TMP1, 0); +JUMPHERE(alreadyfound); +JUMPHERE(toolong); +return notfound; +} + +static void do_revertframes(compiler_common *common) +{ +DEFINE_COMPILER; +struct sljit_jump *jump; +struct sljit_label *mainloop; + +sljit_emit_fast_enter(compiler, RETURN_ADDR, 0); +OP1(SLJIT_MOV, TMP3, 0, STACK_TOP, 0); +GET_LOCAL_BASE(TMP1, 0, 0); + +/* Drop frames until we reach STACK_TOP. */ +mainloop = LABEL(); +OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), -sizeof(sljit_sw)); +jump = CMP(SLJIT_SIG_LESS_EQUAL, TMP2, 0, SLJIT_IMM, 0); + +OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, TMP1, 0); +OP1(SLJIT_MOV, SLJIT_MEM1(TMP2), 0, SLJIT_MEM1(STACK_TOP), -2 * sizeof(sljit_sw)); +OP1(SLJIT_MOV, SLJIT_MEM1(TMP2), sizeof(sljit_sw), SLJIT_MEM1(STACK_TOP), -3 * sizeof(sljit_sw)); +OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, 3 * sizeof(sljit_sw)); +JUMPTO(SLJIT_JUMP, mainloop); + +JUMPHERE(jump); +jump = CMP(SLJIT_NOT_ZERO /* SIG_LESS */, TMP2, 0, SLJIT_IMM, 0); +/* End of reverting values. */ +OP1(SLJIT_MOV, STACK_TOP, 0, TMP3, 0); +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); + +JUMPHERE(jump); +OP1(SLJIT_NEG, TMP2, 0, TMP2, 0); +OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, TMP1, 0); +OP1(SLJIT_MOV, SLJIT_MEM1(TMP2), 0, SLJIT_MEM1(STACK_TOP), -2 * sizeof(sljit_sw)); +OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, 2 * sizeof(sljit_sw)); +JUMPTO(SLJIT_JUMP, mainloop); +} + +static void check_wordboundary(compiler_common *common) +{ +DEFINE_COMPILER; +struct sljit_jump *skipread; +jump_list *skipread_list = NULL; +#if !(defined COMPILE_PCRE8) || defined SUPPORT_UTF +struct sljit_jump *jump; +#endif + +SLJIT_COMPILE_ASSERT(ctype_word == 0x10, ctype_word_must_be_16); + +sljit_emit_fast_enter(compiler, SLJIT_MEM1(SLJIT_SP), LOCALS0); +/* Get type of the previous char, and put it to LOCALS1. */ +OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0); +OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, begin)); +OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS1, SLJIT_IMM, 0); +skipread = CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, TMP1, 0); +skip_char_back(common); +check_start_used_ptr(common); +read_char(common); + +/* Testing char type. */ +#ifdef SUPPORT_UCP +if (common->use_ucp) + { + OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, 1); + jump = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_UNDERSCORE); + add_jump(compiler, &common->getucd, JUMP(SLJIT_FAST_CALL)); + OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ucp_Ll); + OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, ucp_Lu - ucp_Ll); + OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_LESS_EQUAL); + OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ucp_Nd - ucp_Ll); + OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, ucp_No - ucp_Nd); + OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_LESS_EQUAL); + JUMPHERE(jump); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS1, TMP2, 0); + } +else +#endif + { +#ifndef COMPILE_PCRE8 + jump = CMP(SLJIT_GREATER, TMP1, 0, SLJIT_IMM, 255); +#elif defined SUPPORT_UTF + /* Here LOCALS1 has already been zeroed. */ + jump = NULL; + if (common->utf) + jump = CMP(SLJIT_GREATER, TMP1, 0, SLJIT_IMM, 255); +#endif /* COMPILE_PCRE8 */ + OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP1), common->ctypes); + OP2(SLJIT_LSHR, TMP1, 0, TMP1, 0, SLJIT_IMM, 4 /* ctype_word */); + OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 1); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS1, TMP1, 0); +#ifndef COMPILE_PCRE8 + JUMPHERE(jump); +#elif defined SUPPORT_UTF + if (jump != NULL) + JUMPHERE(jump); +#endif /* COMPILE_PCRE8 */ + } +JUMPHERE(skipread); + +OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, 0); +check_str_end(common, &skipread_list); +peek_char(common, READ_CHAR_MAX); + +/* Testing char type. This is a code duplication. */ +#ifdef SUPPORT_UCP +if (common->use_ucp) + { + OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, 1); + jump = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_UNDERSCORE); + add_jump(compiler, &common->getucd, JUMP(SLJIT_FAST_CALL)); + OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ucp_Ll); + OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, ucp_Lu - ucp_Ll); + OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_LESS_EQUAL); + OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ucp_Nd - ucp_Ll); + OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, ucp_No - ucp_Nd); + OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_LESS_EQUAL); + JUMPHERE(jump); + } +else +#endif + { +#ifndef COMPILE_PCRE8 + /* TMP2 may be destroyed by peek_char. */ + OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, 0); + jump = CMP(SLJIT_GREATER, TMP1, 0, SLJIT_IMM, 255); +#elif defined SUPPORT_UTF + OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, 0); + jump = NULL; + if (common->utf) + jump = CMP(SLJIT_GREATER, TMP1, 0, SLJIT_IMM, 255); +#endif + OP1(SLJIT_MOV_U8, TMP2, 0, SLJIT_MEM1(TMP1), common->ctypes); + OP2(SLJIT_LSHR, TMP2, 0, TMP2, 0, SLJIT_IMM, 4 /* ctype_word */); + OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 1); +#ifndef COMPILE_PCRE8 + JUMPHERE(jump); +#elif defined SUPPORT_UTF + if (jump != NULL) + JUMPHERE(jump); +#endif /* COMPILE_PCRE8 */ + } +set_jumps(skipread_list, LABEL()); + +OP2(SLJIT_XOR | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP2, 0, SLJIT_MEM1(SLJIT_SP), LOCALS1); +sljit_emit_fast_return(compiler, SLJIT_MEM1(SLJIT_SP), LOCALS0); +} + +static BOOL check_class_ranges(compiler_common *common, const sljit_u8 *bits, BOOL nclass, BOOL invert, jump_list **backtracks) +{ +/* May destroy TMP1. */ +DEFINE_COMPILER; +int ranges[MAX_RANGE_SIZE]; +sljit_u8 bit, cbit, all; +int i, byte, length = 0; + +bit = bits[0] & 0x1; +/* All bits will be zero or one (since bit is zero or one). */ +all = -bit; + +for (i = 0; i < 256; ) + { + byte = i >> 3; + if ((i & 0x7) == 0 && bits[byte] == all) + i += 8; + else + { + cbit = (bits[byte] >> (i & 0x7)) & 0x1; + if (cbit != bit) + { + if (length >= MAX_RANGE_SIZE) + return FALSE; + ranges[length] = i; + length++; + bit = cbit; + all = -cbit; + } + i++; + } + } + +if (((bit == 0) && nclass) || ((bit == 1) && !nclass)) + { + if (length >= MAX_RANGE_SIZE) + return FALSE; + ranges[length] = 256; + length++; + } + +if (length < 0 || length > 4) + return FALSE; + +bit = bits[0] & 0x1; +if (invert) bit ^= 0x1; + +/* No character is accepted. */ +if (length == 0 && bit == 0) + add_jump(compiler, backtracks, JUMP(SLJIT_JUMP)); + +switch(length) + { + case 0: + /* When bit != 0, all characters are accepted. */ + return TRUE; + + case 1: + add_jump(compiler, backtracks, CMP(bit == 0 ? SLJIT_LESS : SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, ranges[0])); + return TRUE; + + case 2: + if (ranges[0] + 1 != ranges[1]) + { + OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ranges[0]); + add_jump(compiler, backtracks, CMP(bit != 0 ? SLJIT_LESS : SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, ranges[1] - ranges[0])); + } + else + add_jump(compiler, backtracks, CMP(bit != 0 ? SLJIT_EQUAL : SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, ranges[0])); + return TRUE; + + case 3: + if (bit != 0) + { + add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, ranges[2])); + if (ranges[0] + 1 != ranges[1]) + { + OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ranges[0]); + add_jump(compiler, backtracks, CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, ranges[1] - ranges[0])); + } + else + add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, ranges[0])); + return TRUE; + } + + add_jump(compiler, backtracks, CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, ranges[0])); + if (ranges[1] + 1 != ranges[2]) + { + OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ranges[1]); + add_jump(compiler, backtracks, CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, ranges[2] - ranges[1])); + } + else + add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, ranges[1])); + return TRUE; + + case 4: + if ((ranges[1] - ranges[0]) == (ranges[3] - ranges[2]) + && (ranges[0] | (ranges[2] - ranges[0])) == ranges[2] + && (ranges[1] & (ranges[2] - ranges[0])) == 0 + && is_powerof2(ranges[2] - ranges[0])) + { + SLJIT_ASSERT((ranges[0] & (ranges[2] - ranges[0])) == 0 && (ranges[2] & ranges[3] & (ranges[2] - ranges[0])) != 0); + OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, ranges[2] - ranges[0]); + if (ranges[2] + 1 != ranges[3]) + { + OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ranges[2]); + add_jump(compiler, backtracks, CMP(bit != 0 ? SLJIT_LESS : SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, ranges[3] - ranges[2])); + } + else + add_jump(compiler, backtracks, CMP(bit != 0 ? SLJIT_EQUAL : SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, ranges[2])); + return TRUE; + } + + if (bit != 0) + { + i = 0; + if (ranges[0] + 1 != ranges[1]) + { + OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ranges[0]); + add_jump(compiler, backtracks, CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, ranges[1] - ranges[0])); + i = ranges[0]; + } + else + add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, ranges[0])); + + if (ranges[2] + 1 != ranges[3]) + { + OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ranges[2] - i); + add_jump(compiler, backtracks, CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, ranges[3] - ranges[2])); + } + else + add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, ranges[2] - i)); + return TRUE; + } + + OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ranges[0]); + add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, ranges[3] - ranges[0])); + if (ranges[1] + 1 != ranges[2]) + { + OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ranges[1] - ranges[0]); + add_jump(compiler, backtracks, CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, ranges[2] - ranges[1])); + } + else + add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, ranges[1] - ranges[0])); + return TRUE; + + default: + SLJIT_UNREACHABLE(); + return FALSE; + } +} + +static void check_anynewline(compiler_common *common) +{ +/* Check whether TMP1 contains a newline character. TMP2 destroyed. */ +DEFINE_COMPILER; + +sljit_emit_fast_enter(compiler, RETURN_ADDR, 0); + +OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x0a); +OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x0d - 0x0a); +OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_LESS_EQUAL); +OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x85 - 0x0a); +#if defined SUPPORT_UTF || defined COMPILE_PCRE16 || defined COMPILE_PCRE32 +#ifdef COMPILE_PCRE8 +if (common->utf) + { +#endif + OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL); + OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x1); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x2029 - 0x0a); +#ifdef COMPILE_PCRE8 + } +#endif +#endif /* SUPPORT_UTF || COMPILE_PCRE16 || COMPILE_PCRE32 */ +OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_EQUAL); +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); +} + +static void check_hspace(compiler_common *common) +{ +/* Check whether TMP1 contains a newline character. TMP2 destroyed. */ +DEFINE_COMPILER; + +sljit_emit_fast_enter(compiler, RETURN_ADDR, 0); + +OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x09); +OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_EQUAL); +OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x20); +OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL); +OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0xa0); +#if defined SUPPORT_UTF || defined COMPILE_PCRE16 || defined COMPILE_PCRE32 +#ifdef COMPILE_PCRE8 +if (common->utf) + { +#endif + OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x1680); + OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x180e); + OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL); + OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x2000); + OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x200A - 0x2000); + OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_LESS_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x202f - 0x2000); + OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x205f - 0x2000); + OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x3000 - 0x2000); +#ifdef COMPILE_PCRE8 + } +#endif +#endif /* SUPPORT_UTF || COMPILE_PCRE16 || COMPILE_PCRE32 */ +OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_EQUAL); + +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); +} + +static void check_vspace(compiler_common *common) +{ +/* Check whether TMP1 contains a newline character. TMP2 destroyed. */ +DEFINE_COMPILER; + +sljit_emit_fast_enter(compiler, RETURN_ADDR, 0); + +OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x0a); +OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x0d - 0x0a); +OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_LESS_EQUAL); +OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x85 - 0x0a); +#if defined SUPPORT_UTF || defined COMPILE_PCRE16 || defined COMPILE_PCRE32 +#ifdef COMPILE_PCRE8 +if (common->utf) + { +#endif + OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL); + OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x1); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x2029 - 0x0a); +#ifdef COMPILE_PCRE8 + } +#endif +#endif /* SUPPORT_UTF || COMPILE_PCRE16 || COMPILE_PCRE32 */ +OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_EQUAL); + +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); +} + +static void do_casefulcmp(compiler_common *common) +{ +DEFINE_COMPILER; +struct sljit_jump *jump; +struct sljit_label *label; +int char1_reg; +int char2_reg; + +if (sljit_get_register_index(TMP3) < 0) + { + char1_reg = STR_END; + char2_reg = STACK_TOP; + } +else + { + char1_reg = TMP3; + char2_reg = RETURN_ADDR; + } + +sljit_emit_fast_enter(compiler, SLJIT_MEM1(SLJIT_SP), LOCALS0); +OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP2, 0); + +if (char1_reg == STR_END) + { + OP1(SLJIT_MOV, TMP3, 0, char1_reg, 0); + OP1(SLJIT_MOV, RETURN_ADDR, 0, char2_reg, 0); + } + +if (sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_SUPP | SLJIT_MEM_POST, char1_reg, SLJIT_MEM1(TMP1), IN_UCHARS(1)) == SLJIT_SUCCESS) + { + label = LABEL(); + sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_POST, char1_reg, SLJIT_MEM1(TMP1), IN_UCHARS(1)); + sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_POST, char2_reg, SLJIT_MEM1(STR_PTR), IN_UCHARS(1)); + jump = CMP(SLJIT_NOT_EQUAL, char1_reg, 0, char2_reg, 0); + OP2(SLJIT_SUB | SLJIT_SET_Z, TMP2, 0, TMP2, 0, SLJIT_IMM, IN_UCHARS(1)); + JUMPTO(SLJIT_NOT_ZERO, label); + + JUMPHERE(jump); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0); + } +else if (sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_SUPP | SLJIT_MEM_PRE, char1_reg, SLJIT_MEM1(TMP1), IN_UCHARS(1)) == SLJIT_SUCCESS) + { + OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(1)); + OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + + label = LABEL(); + sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_PRE, char1_reg, SLJIT_MEM1(TMP1), IN_UCHARS(1)); + sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_PRE, char2_reg, SLJIT_MEM1(STR_PTR), IN_UCHARS(1)); + jump = CMP(SLJIT_NOT_EQUAL, char1_reg, 0, char2_reg, 0); + OP2(SLJIT_SUB | SLJIT_SET_Z, TMP2, 0, TMP2, 0, SLJIT_IMM, IN_UCHARS(1)); + JUMPTO(SLJIT_NOT_ZERO, label); + + JUMPHERE(jump); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + } +else + { + label = LABEL(); + OP1(MOV_UCHAR, char1_reg, 0, SLJIT_MEM1(TMP1), 0); + OP1(MOV_UCHAR, char2_reg, 0, SLJIT_MEM1(STR_PTR), 0); + OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(1)); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + jump = CMP(SLJIT_NOT_EQUAL, char1_reg, 0, char2_reg, 0); + OP2(SLJIT_SUB | SLJIT_SET_Z, TMP2, 0, TMP2, 0, SLJIT_IMM, IN_UCHARS(1)); + JUMPTO(SLJIT_NOT_ZERO, label); + + JUMPHERE(jump); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0); + } + +if (char1_reg == STR_END) + { + OP1(SLJIT_MOV, char1_reg, 0, TMP3, 0); + OP1(SLJIT_MOV, char2_reg, 0, RETURN_ADDR, 0); + } + +sljit_emit_fast_return(compiler, TMP1, 0); +} + +static void do_caselesscmp(compiler_common *common) +{ +DEFINE_COMPILER; +struct sljit_jump *jump; +struct sljit_label *label; +int char1_reg = STR_END; +int char2_reg; +int lcc_table; +int opt_type = 0; + +if (sljit_get_register_index(TMP3) < 0) + { + char2_reg = STACK_TOP; + lcc_table = STACK_LIMIT; + } +else + { + char2_reg = RETURN_ADDR; + lcc_table = TMP3; + } + +if (sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_SUPP | SLJIT_MEM_POST, char1_reg, SLJIT_MEM1(TMP1), IN_UCHARS(1)) == SLJIT_SUCCESS) + opt_type = 1; +else if (sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_SUPP | SLJIT_MEM_PRE, char1_reg, SLJIT_MEM1(TMP1), IN_UCHARS(1)) == SLJIT_SUCCESS) + opt_type = 2; + +sljit_emit_fast_enter(compiler, SLJIT_MEM1(SLJIT_SP), LOCALS0); +OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP2, 0); + +OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS1, char1_reg, 0); + +if (char2_reg == STACK_TOP) + { + OP1(SLJIT_MOV, TMP3, 0, char2_reg, 0); + OP1(SLJIT_MOV, RETURN_ADDR, 0, lcc_table, 0); + } + +OP1(SLJIT_MOV, lcc_table, 0, SLJIT_IMM, common->lcc); + +if (opt_type == 1) + { + label = LABEL(); + sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_POST, char1_reg, SLJIT_MEM1(TMP1), IN_UCHARS(1)); + sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_POST, char2_reg, SLJIT_MEM1(STR_PTR), IN_UCHARS(1)); + } +else if (opt_type == 2) + { + OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(1)); + OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + + label = LABEL(); + sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_PRE, char1_reg, SLJIT_MEM1(TMP1), IN_UCHARS(1)); + sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_PRE, char2_reg, SLJIT_MEM1(STR_PTR), IN_UCHARS(1)); + } +else + { + label = LABEL(); + OP1(MOV_UCHAR, char1_reg, 0, SLJIT_MEM1(TMP1), 0); + OP1(MOV_UCHAR, char2_reg, 0, SLJIT_MEM1(STR_PTR), 0); + OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(1)); + } + +#ifndef COMPILE_PCRE8 +jump = CMP(SLJIT_GREATER, char1_reg, 0, SLJIT_IMM, 255); +#endif +OP1(SLJIT_MOV_U8, char1_reg, 0, SLJIT_MEM2(lcc_table, char1_reg), 0); +#ifndef COMPILE_PCRE8 +JUMPHERE(jump); +jump = CMP(SLJIT_GREATER, char2_reg, 0, SLJIT_IMM, 255); +#endif +OP1(SLJIT_MOV_U8, char2_reg, 0, SLJIT_MEM2(lcc_table, char2_reg), 0); +#ifndef COMPILE_PCRE8 +JUMPHERE(jump); +#endif + +if (opt_type == 0) + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + +jump = CMP(SLJIT_NOT_EQUAL, char1_reg, 0, char2_reg, 0); +OP2(SLJIT_SUB | SLJIT_SET_Z, TMP2, 0, TMP2, 0, SLJIT_IMM, IN_UCHARS(1)); +JUMPTO(SLJIT_NOT_ZERO, label); + +JUMPHERE(jump); +OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0); + +if (opt_type == 2) + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + +if (char2_reg == STACK_TOP) + { + OP1(SLJIT_MOV, char2_reg, 0, TMP3, 0); + OP1(SLJIT_MOV, lcc_table, 0, RETURN_ADDR, 0); + } + +OP1(SLJIT_MOV, char1_reg, 0, SLJIT_MEM1(SLJIT_SP), LOCALS1); +sljit_emit_fast_return(compiler, TMP1, 0); +} + +#if defined SUPPORT_UTF && defined SUPPORT_UCP + +static const pcre_uchar * SLJIT_FUNC do_utf_caselesscmp(pcre_uchar *src1, pcre_uchar *src2, pcre_uchar *end1, pcre_uchar *end2) +{ +/* This function would be ineffective to do in JIT level. */ +sljit_u32 c1, c2; +const ucd_record *ur; +const sljit_u32 *pp; + +while (src1 < end1) + { + if (src2 >= end2) + return (pcre_uchar*)1; + GETCHARINC(c1, src1); + GETCHARINC(c2, src2); + ur = GET_UCD(c2); + if (c1 != c2 && c1 != c2 + ur->other_case) + { + pp = PRIV(ucd_caseless_sets) + ur->caseset; + for (;;) + { + if (c1 < *pp) return NULL; + if (c1 == *pp++) break; + } + } + } +return src2; +} + +#endif /* SUPPORT_UTF && SUPPORT_UCP */ + +static pcre_uchar *byte_sequence_compare(compiler_common *common, BOOL caseless, pcre_uchar *cc, + compare_context *context, jump_list **backtracks) +{ +DEFINE_COMPILER; +unsigned int othercasebit = 0; +pcre_uchar *othercasechar = NULL; +#ifdef SUPPORT_UTF +int utflength; +#endif + +if (caseless && char_has_othercase(common, cc)) + { + othercasebit = char_get_othercase_bit(common, cc); + SLJIT_ASSERT(othercasebit); + /* Extracting bit difference info. */ +#if defined COMPILE_PCRE8 + othercasechar = cc + (othercasebit >> 8); + othercasebit &= 0xff; +#elif defined COMPILE_PCRE16 || defined COMPILE_PCRE32 + /* Note that this code only handles characters in the BMP. If there + ever are characters outside the BMP whose othercase differs in only one + bit from itself (there currently are none), this code will need to be + revised for COMPILE_PCRE32. */ + othercasechar = cc + (othercasebit >> 9); + if ((othercasebit & 0x100) != 0) + othercasebit = (othercasebit & 0xff) << 8; + else + othercasebit &= 0xff; +#endif /* COMPILE_PCRE[8|16|32] */ + } + +if (context->sourcereg == -1) + { +#if defined COMPILE_PCRE8 +#if defined SLJIT_UNALIGNED && SLJIT_UNALIGNED + if (context->length >= 4) + OP1(SLJIT_MOV_S32, TMP1, 0, SLJIT_MEM1(STR_PTR), -context->length); + else if (context->length >= 2) + OP1(SLJIT_MOV_U16, TMP1, 0, SLJIT_MEM1(STR_PTR), -context->length); + else +#endif + OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(STR_PTR), -context->length); +#elif defined COMPILE_PCRE16 +#if defined SLJIT_UNALIGNED && SLJIT_UNALIGNED + if (context->length >= 4) + OP1(SLJIT_MOV_S32, TMP1, 0, SLJIT_MEM1(STR_PTR), -context->length); + else +#endif + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), -context->length); +#elif defined COMPILE_PCRE32 + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), -context->length); +#endif /* COMPILE_PCRE[8|16|32] */ + context->sourcereg = TMP2; + } + +#ifdef SUPPORT_UTF +utflength = 1; +if (common->utf && HAS_EXTRALEN(*cc)) + utflength += GET_EXTRALEN(*cc); + +do + { +#endif + + context->length -= IN_UCHARS(1); +#if (defined SLJIT_UNALIGNED && SLJIT_UNALIGNED) && (defined COMPILE_PCRE8 || defined COMPILE_PCRE16) + + /* Unaligned read is supported. */ + if (othercasebit != 0 && othercasechar == cc) + { + context->c.asuchars[context->ucharptr] = *cc | othercasebit; + context->oc.asuchars[context->ucharptr] = othercasebit; + } + else + { + context->c.asuchars[context->ucharptr] = *cc; + context->oc.asuchars[context->ucharptr] = 0; + } + context->ucharptr++; + +#if defined COMPILE_PCRE8 + if (context->ucharptr >= 4 || context->length == 0 || (context->ucharptr == 2 && context->length == 1)) +#else + if (context->ucharptr >= 2 || context->length == 0) +#endif + { + if (context->length >= 4) + OP1(SLJIT_MOV_S32, context->sourcereg, 0, SLJIT_MEM1(STR_PTR), -context->length); + else if (context->length >= 2) + OP1(SLJIT_MOV_U16, context->sourcereg, 0, SLJIT_MEM1(STR_PTR), -context->length); +#if defined COMPILE_PCRE8 + else if (context->length >= 1) + OP1(SLJIT_MOV_U8, context->sourcereg, 0, SLJIT_MEM1(STR_PTR), -context->length); +#endif /* COMPILE_PCRE8 */ + context->sourcereg = context->sourcereg == TMP1 ? TMP2 : TMP1; + + switch(context->ucharptr) + { + case 4 / sizeof(pcre_uchar): + if (context->oc.asint != 0) + OP2(SLJIT_OR, context->sourcereg, 0, context->sourcereg, 0, SLJIT_IMM, context->oc.asint); + add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, context->sourcereg, 0, SLJIT_IMM, context->c.asint | context->oc.asint)); + break; + + case 2 / sizeof(pcre_uchar): + if (context->oc.asushort != 0) + OP2(SLJIT_OR, context->sourcereg, 0, context->sourcereg, 0, SLJIT_IMM, context->oc.asushort); + add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, context->sourcereg, 0, SLJIT_IMM, context->c.asushort | context->oc.asushort)); + break; + +#ifdef COMPILE_PCRE8 + case 1: + if (context->oc.asbyte != 0) + OP2(SLJIT_OR, context->sourcereg, 0, context->sourcereg, 0, SLJIT_IMM, context->oc.asbyte); + add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, context->sourcereg, 0, SLJIT_IMM, context->c.asbyte | context->oc.asbyte)); + break; +#endif + + default: + SLJIT_UNREACHABLE(); + break; + } + context->ucharptr = 0; + } + +#else + + /* Unaligned read is unsupported or in 32 bit mode. */ + if (context->length >= 1) + OP1(MOV_UCHAR, context->sourcereg, 0, SLJIT_MEM1(STR_PTR), -context->length); + + context->sourcereg = context->sourcereg == TMP1 ? TMP2 : TMP1; + + if (othercasebit != 0 && othercasechar == cc) + { + OP2(SLJIT_OR, context->sourcereg, 0, context->sourcereg, 0, SLJIT_IMM, othercasebit); + add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, context->sourcereg, 0, SLJIT_IMM, *cc | othercasebit)); + } + else + add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, context->sourcereg, 0, SLJIT_IMM, *cc)); + +#endif + + cc++; +#ifdef SUPPORT_UTF + utflength--; + } +while (utflength > 0); +#endif + +return cc; +} + +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 + +#define SET_TYPE_OFFSET(value) \ + if ((value) != typeoffset) \ + { \ + if ((value) < typeoffset) \ + OP2(SLJIT_ADD, typereg, 0, typereg, 0, SLJIT_IMM, typeoffset - (value)); \ + else \ + OP2(SLJIT_SUB, typereg, 0, typereg, 0, SLJIT_IMM, (value) - typeoffset); \ + } \ + typeoffset = (value); + +#define SET_CHAR_OFFSET(value) \ + if ((value) != charoffset) \ + { \ + if ((value) < charoffset) \ + OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(charoffset - (value))); \ + else \ + OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)((value) - charoffset)); \ + } \ + charoffset = (value); + +static pcre_uchar *compile_char1_matchingpath(compiler_common *common, pcre_uchar type, pcre_uchar *cc, jump_list **backtracks, BOOL check_str_ptr); + +static void compile_xclass_matchingpath(compiler_common *common, pcre_uchar *cc, jump_list **backtracks) +{ +DEFINE_COMPILER; +jump_list *found = NULL; +jump_list **list = (cc[0] & XCL_NOT) == 0 ? &found : backtracks; +sljit_uw c, charoffset, max = 256, min = READ_CHAR_MAX; +struct sljit_jump *jump = NULL; +pcre_uchar *ccbegin; +int compares, invertcmp, numberofcmps; +#if defined SUPPORT_UTF && (defined COMPILE_PCRE8 || defined COMPILE_PCRE16) +BOOL utf = common->utf; +#endif + +#ifdef SUPPORT_UCP +BOOL needstype = FALSE, needsscript = FALSE, needschar = FALSE; +BOOL charsaved = FALSE; +int typereg = TMP1; +const sljit_u32 *other_cases; +sljit_uw typeoffset; +#endif + +/* Scanning the necessary info. */ +cc++; +ccbegin = cc; +compares = 0; +if (cc[-1] & XCL_MAP) + { + min = 0; + cc += 32 / sizeof(pcre_uchar); + } + +while (*cc != XCL_END) + { + compares++; + if (*cc == XCL_SINGLE) + { + cc ++; + GETCHARINCTEST(c, cc); + if (c > max) max = c; + if (c < min) min = c; +#ifdef SUPPORT_UCP + needschar = TRUE; +#endif + } + else if (*cc == XCL_RANGE) + { + cc ++; + GETCHARINCTEST(c, cc); + if (c < min) min = c; + GETCHARINCTEST(c, cc); + if (c > max) max = c; +#ifdef SUPPORT_UCP + needschar = TRUE; +#endif + } +#ifdef SUPPORT_UCP + else + { + SLJIT_ASSERT(*cc == XCL_PROP || *cc == XCL_NOTPROP); + cc++; + if (*cc == PT_CLIST) + { + other_cases = PRIV(ucd_caseless_sets) + cc[1]; + while (*other_cases != NOTACHAR) + { + if (*other_cases > max) max = *other_cases; + if (*other_cases < min) min = *other_cases; + other_cases++; + } + } + else + { + max = READ_CHAR_MAX; + min = 0; + } + + switch(*cc) + { + case PT_ANY: + /* Any either accepts everything or ignored. */ + if (cc[-1] == XCL_PROP) + { + compile_char1_matchingpath(common, OP_ALLANY, cc, backtracks, FALSE); + if (list == backtracks) + add_jump(compiler, backtracks, JUMP(SLJIT_JUMP)); + return; + } + break; + + case PT_LAMP: + case PT_GC: + case PT_PC: + case PT_ALNUM: + needstype = TRUE; + break; + + case PT_SC: + needsscript = TRUE; + break; + + case PT_SPACE: + case PT_PXSPACE: + case PT_WORD: + case PT_PXGRAPH: + case PT_PXPRINT: + case PT_PXPUNCT: + needstype = TRUE; + needschar = TRUE; + break; + + case PT_CLIST: + case PT_UCNC: + needschar = TRUE; + break; + + default: + SLJIT_UNREACHABLE(); + break; + } + cc += 2; + } +#endif + } +SLJIT_ASSERT(compares > 0); + +/* We are not necessary in utf mode even in 8 bit mode. */ +cc = ccbegin; +read_char_range(common, min, max, (cc[-1] & XCL_NOT) != 0); + +if ((cc[-1] & XCL_HASPROP) == 0) + { + if ((cc[-1] & XCL_MAP) != 0) + { + jump = CMP(SLJIT_GREATER, TMP1, 0, SLJIT_IMM, 255); + if (!check_class_ranges(common, (const sljit_u8 *)cc, (((const sljit_u8 *)cc)[31] & 0x80) != 0, TRUE, &found)) + { + OP2(SLJIT_AND, TMP2, 0, TMP1, 0, SLJIT_IMM, 0x7); + OP2(SLJIT_LSHR, TMP1, 0, TMP1, 0, SLJIT_IMM, 3); + OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_sw)cc); + OP2(SLJIT_SHL, TMP2, 0, SLJIT_IMM, 1, TMP2, 0); + OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, TMP2, 0); + add_jump(compiler, &found, JUMP(SLJIT_NOT_ZERO)); + } + + add_jump(compiler, backtracks, JUMP(SLJIT_JUMP)); + JUMPHERE(jump); + + cc += 32 / sizeof(pcre_uchar); + } + else + { + OP2(SLJIT_SUB, TMP2, 0, TMP1, 0, SLJIT_IMM, min); + add_jump(compiler, (cc[-1] & XCL_NOT) == 0 ? backtracks : &found, CMP(SLJIT_GREATER, TMP2, 0, SLJIT_IMM, max - min)); + } + } +else if ((cc[-1] & XCL_MAP) != 0) + { + OP1(SLJIT_MOV, RETURN_ADDR, 0, TMP1, 0); +#ifdef SUPPORT_UCP + charsaved = TRUE; +#endif + if (!check_class_ranges(common, (const sljit_u8 *)cc, FALSE, TRUE, list)) + { +#ifdef COMPILE_PCRE8 + jump = NULL; + if (common->utf) +#endif + jump = CMP(SLJIT_GREATER, TMP1, 0, SLJIT_IMM, 255); + + OP2(SLJIT_AND, TMP2, 0, TMP1, 0, SLJIT_IMM, 0x7); + OP2(SLJIT_LSHR, TMP1, 0, TMP1, 0, SLJIT_IMM, 3); + OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_sw)cc); + OP2(SLJIT_SHL, TMP2, 0, SLJIT_IMM, 1, TMP2, 0); + OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, TMP2, 0); + add_jump(compiler, list, JUMP(SLJIT_NOT_ZERO)); + +#ifdef COMPILE_PCRE8 + if (common->utf) +#endif + JUMPHERE(jump); + } + + OP1(SLJIT_MOV, TMP1, 0, RETURN_ADDR, 0); + cc += 32 / sizeof(pcre_uchar); + } + +#ifdef SUPPORT_UCP +if (needstype || needsscript) + { + if (needschar && !charsaved) + OP1(SLJIT_MOV, RETURN_ADDR, 0, TMP1, 0); + +#ifdef COMPILE_PCRE32 + if (!common->utf) + { + jump = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0x10ffff + 1); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR); + JUMPHERE(jump); + } +#endif + + OP2(SLJIT_LSHR, TMP2, 0, TMP1, 0, SLJIT_IMM, UCD_BLOCK_SHIFT); + OP1(SLJIT_MOV_U8, TMP2, 0, SLJIT_MEM1(TMP2), (sljit_sw)PRIV(ucd_stage1)); + OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, UCD_BLOCK_MASK); + OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, UCD_BLOCK_SHIFT); + OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, TMP2, 0); + OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, (sljit_sw)PRIV(ucd_stage2)); + OP1(SLJIT_MOV_U16, TMP2, 0, SLJIT_MEM2(TMP2, TMP1), 1); + + /* Before anything else, we deal with scripts. */ + if (needsscript) + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, script)); + OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM2(TMP1, TMP2), 3); + + ccbegin = cc; + + while (*cc != XCL_END) + { + if (*cc == XCL_SINGLE) + { + cc ++; + GETCHARINCTEST(c, cc); + } + else if (*cc == XCL_RANGE) + { + cc ++; + GETCHARINCTEST(c, cc); + GETCHARINCTEST(c, cc); + } + else + { + SLJIT_ASSERT(*cc == XCL_PROP || *cc == XCL_NOTPROP); + cc++; + if (*cc == PT_SC) + { + compares--; + invertcmp = (compares == 0 && list != backtracks); + if (cc[-1] == XCL_NOTPROP) + invertcmp ^= 0x1; + jump = CMP(SLJIT_EQUAL ^ invertcmp, TMP1, 0, SLJIT_IMM, (int)cc[1]); + add_jump(compiler, compares > 0 ? list : backtracks, jump); + } + cc += 2; + } + } + + cc = ccbegin; + } + + if (needschar) + { + OP1(SLJIT_MOV, TMP1, 0, RETURN_ADDR, 0); + } + + if (needstype) + { + if (!needschar) + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, chartype)); + OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM2(TMP1, TMP2), 3); + } + else + { + OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 3); + OP1(SLJIT_MOV_U8, RETURN_ADDR, 0, SLJIT_MEM1(TMP2), (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, chartype)); + typereg = RETURN_ADDR; + } + } + } +#endif + +/* Generating code. */ +charoffset = 0; +numberofcmps = 0; +#ifdef SUPPORT_UCP +typeoffset = 0; +#endif + +while (*cc != XCL_END) + { + compares--; + invertcmp = (compares == 0 && list != backtracks); + jump = NULL; + + if (*cc == XCL_SINGLE) + { + cc ++; + GETCHARINCTEST(c, cc); + + if (numberofcmps < 3 && (*cc == XCL_SINGLE || *cc == XCL_RANGE)) + { + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(c - charoffset)); + OP_FLAGS(numberofcmps == 0 ? SLJIT_MOV : SLJIT_OR, TMP2, 0, SLJIT_EQUAL); + numberofcmps++; + } + else if (numberofcmps > 0) + { + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(c - charoffset)); + OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_EQUAL); + jump = JUMP(SLJIT_NOT_ZERO ^ invertcmp); + numberofcmps = 0; + } + else + { + jump = CMP(SLJIT_EQUAL ^ invertcmp, TMP1, 0, SLJIT_IMM, (sljit_sw)(c - charoffset)); + numberofcmps = 0; + } + } + else if (*cc == XCL_RANGE) + { + cc ++; + GETCHARINCTEST(c, cc); + SET_CHAR_OFFSET(c); + GETCHARINCTEST(c, cc); + + if (numberofcmps < 3 && (*cc == XCL_SINGLE || *cc == XCL_RANGE)) + { + OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(c - charoffset)); + OP_FLAGS(numberofcmps == 0 ? SLJIT_MOV : SLJIT_OR, TMP2, 0, SLJIT_LESS_EQUAL); + numberofcmps++; + } + else if (numberofcmps > 0) + { + OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(c - charoffset)); + OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_LESS_EQUAL); + jump = JUMP(SLJIT_NOT_ZERO ^ invertcmp); + numberofcmps = 0; + } + else + { + jump = CMP(SLJIT_LESS_EQUAL ^ invertcmp, TMP1, 0, SLJIT_IMM, (sljit_sw)(c - charoffset)); + numberofcmps = 0; + } + } +#ifdef SUPPORT_UCP + else + { + SLJIT_ASSERT(*cc == XCL_PROP || *cc == XCL_NOTPROP); + if (*cc == XCL_NOTPROP) + invertcmp ^= 0x1; + cc++; + switch(*cc) + { + case PT_ANY: + if (!invertcmp) + jump = JUMP(SLJIT_JUMP); + break; + + case PT_LAMP: + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, typereg, 0, SLJIT_IMM, ucp_Lu - typeoffset); + OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, typereg, 0, SLJIT_IMM, ucp_Ll - typeoffset); + OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, typereg, 0, SLJIT_IMM, ucp_Lt - typeoffset); + OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_EQUAL); + jump = JUMP(SLJIT_NOT_ZERO ^ invertcmp); + break; + + case PT_GC: + c = PRIV(ucp_typerange)[(int)cc[1] * 2]; + SET_TYPE_OFFSET(c); + jump = CMP(SLJIT_LESS_EQUAL ^ invertcmp, typereg, 0, SLJIT_IMM, PRIV(ucp_typerange)[(int)cc[1] * 2 + 1] - c); + break; + + case PT_PC: + jump = CMP(SLJIT_EQUAL ^ invertcmp, typereg, 0, SLJIT_IMM, (int)cc[1] - typeoffset); + break; + + case PT_SC: + compares++; + /* Do nothing. */ + break; + + case PT_SPACE: + case PT_PXSPACE: + SET_CHAR_OFFSET(9); + OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0xd - 0x9); + OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_LESS_EQUAL); + + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x85 - 0x9); + OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL); + + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x180e - 0x9); + OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL); + + SET_TYPE_OFFSET(ucp_Zl); + OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, typereg, 0, SLJIT_IMM, ucp_Zs - ucp_Zl); + OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_LESS_EQUAL); + jump = JUMP(SLJIT_NOT_ZERO ^ invertcmp); + break; + + case PT_WORD: + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(CHAR_UNDERSCORE - charoffset)); + OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_EQUAL); + /* Fall through. */ + + case PT_ALNUM: + SET_TYPE_OFFSET(ucp_Ll); + OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, typereg, 0, SLJIT_IMM, ucp_Lu - ucp_Ll); + OP_FLAGS((*cc == PT_ALNUM) ? SLJIT_MOV : SLJIT_OR, TMP2, 0, SLJIT_LESS_EQUAL); + SET_TYPE_OFFSET(ucp_Nd); + OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, typereg, 0, SLJIT_IMM, ucp_No - ucp_Nd); + OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_LESS_EQUAL); + jump = JUMP(SLJIT_NOT_ZERO ^ invertcmp); + break; + + case PT_CLIST: + other_cases = PRIV(ucd_caseless_sets) + cc[1]; + + /* At least three characters are required. + Otherwise this case would be handled by the normal code path. */ + SLJIT_ASSERT(other_cases[0] != NOTACHAR && other_cases[1] != NOTACHAR && other_cases[2] != NOTACHAR); + SLJIT_ASSERT(other_cases[0] < other_cases[1] && other_cases[1] < other_cases[2]); + + /* Optimizing character pairs, if their difference is power of 2. */ + if (is_powerof2(other_cases[1] ^ other_cases[0])) + { + if (charoffset == 0) + OP2(SLJIT_OR, TMP2, 0, TMP1, 0, SLJIT_IMM, other_cases[1] ^ other_cases[0]); + else + { + OP2(SLJIT_ADD, TMP2, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)charoffset); + OP2(SLJIT_OR, TMP2, 0, TMP2, 0, SLJIT_IMM, other_cases[1] ^ other_cases[0]); + } + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP2, 0, SLJIT_IMM, other_cases[1]); + OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_EQUAL); + other_cases += 2; + } + else if (is_powerof2(other_cases[2] ^ other_cases[1])) + { + if (charoffset == 0) + OP2(SLJIT_OR, TMP2, 0, TMP1, 0, SLJIT_IMM, other_cases[2] ^ other_cases[1]); + else + { + OP2(SLJIT_ADD, TMP2, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)charoffset); + OP2(SLJIT_OR, TMP2, 0, TMP2, 0, SLJIT_IMM, other_cases[1] ^ other_cases[0]); + } + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP2, 0, SLJIT_IMM, other_cases[2]); + OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_EQUAL); + + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(other_cases[0] - charoffset)); + OP_FLAGS(SLJIT_OR | ((other_cases[3] == NOTACHAR) ? SLJIT_SET_Z : 0), TMP2, 0, SLJIT_EQUAL); + + other_cases += 3; + } + else + { + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(*other_cases++ - charoffset)); + OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_EQUAL); + } + + while (*other_cases != NOTACHAR) + { + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(*other_cases++ - charoffset)); + OP_FLAGS(SLJIT_OR | ((*other_cases == NOTACHAR) ? SLJIT_SET_Z : 0), TMP2, 0, SLJIT_EQUAL); + } + jump = JUMP(SLJIT_NOT_ZERO ^ invertcmp); + break; + + case PT_UCNC: + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(CHAR_DOLLAR_SIGN - charoffset)); + OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(CHAR_COMMERCIAL_AT - charoffset)); + OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(CHAR_GRAVE_ACCENT - charoffset)); + OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL); + + SET_CHAR_OFFSET(0xa0); + OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(0xd7ff - charoffset)); + OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_LESS_EQUAL); + SET_CHAR_OFFSET(0); + OP2(SLJIT_SUB | SLJIT_SET_GREATER_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0xe000 - 0); + OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_GREATER_EQUAL); + jump = JUMP(SLJIT_NOT_ZERO ^ invertcmp); + break; + + case PT_PXGRAPH: + /* C and Z groups are the farthest two groups. */ + SET_TYPE_OFFSET(ucp_Ll); + OP2(SLJIT_SUB | SLJIT_SET_GREATER, SLJIT_UNUSED, 0, typereg, 0, SLJIT_IMM, ucp_So - ucp_Ll); + OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_GREATER); + + jump = CMP(SLJIT_NOT_EQUAL, typereg, 0, SLJIT_IMM, ucp_Cf - ucp_Ll); + + /* In case of ucp_Cf, we overwrite the result. */ + SET_CHAR_OFFSET(0x2066); + OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x2069 - 0x2066); + OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_LESS_EQUAL); + + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x061c - 0x2066); + OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL); + + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x180e - 0x2066); + OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL); + + JUMPHERE(jump); + jump = CMP(SLJIT_ZERO ^ invertcmp, TMP2, 0, SLJIT_IMM, 0); + break; + + case PT_PXPRINT: + /* C and Z groups are the farthest two groups. */ + SET_TYPE_OFFSET(ucp_Ll); + OP2(SLJIT_SUB | SLJIT_SET_GREATER, SLJIT_UNUSED, 0, typereg, 0, SLJIT_IMM, ucp_So - ucp_Ll); + OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_GREATER); + + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, typereg, 0, SLJIT_IMM, ucp_Zs - ucp_Ll); + OP_FLAGS(SLJIT_AND, TMP2, 0, SLJIT_NOT_EQUAL); + + jump = CMP(SLJIT_NOT_EQUAL, typereg, 0, SLJIT_IMM, ucp_Cf - ucp_Ll); + + /* In case of ucp_Cf, we overwrite the result. */ + SET_CHAR_OFFSET(0x2066); + OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x2069 - 0x2066); + OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_LESS_EQUAL); + + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x061c - 0x2066); + OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL); + + JUMPHERE(jump); + jump = CMP(SLJIT_ZERO ^ invertcmp, TMP2, 0, SLJIT_IMM, 0); + break; + + case PT_PXPUNCT: + SET_TYPE_OFFSET(ucp_Sc); + OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, typereg, 0, SLJIT_IMM, ucp_So - ucp_Sc); + OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_LESS_EQUAL); + + SET_CHAR_OFFSET(0); + OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x7f); + OP_FLAGS(SLJIT_AND, TMP2, 0, SLJIT_LESS_EQUAL); + + SET_TYPE_OFFSET(ucp_Pc); + OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, typereg, 0, SLJIT_IMM, ucp_Ps - ucp_Pc); + OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_LESS_EQUAL); + jump = JUMP(SLJIT_NOT_ZERO ^ invertcmp); + break; + + default: + SLJIT_UNREACHABLE(); + break; + } + cc += 2; + } +#endif + + if (jump != NULL) + add_jump(compiler, compares > 0 ? list : backtracks, jump); + } + +if (found != NULL) + set_jumps(found, LABEL()); +} + +#undef SET_TYPE_OFFSET +#undef SET_CHAR_OFFSET + +#endif + +static pcre_uchar *compile_simple_assertion_matchingpath(compiler_common *common, pcre_uchar type, pcre_uchar *cc, jump_list **backtracks) +{ +DEFINE_COMPILER; +int length; +struct sljit_jump *jump[4]; +#ifdef SUPPORT_UTF +struct sljit_label *label; +#endif /* SUPPORT_UTF */ + +switch(type) + { + case OP_SOD: + OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, begin)); + add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, STR_PTR, 0, TMP1, 0)); + return cc; + + case OP_SOM: + OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, str)); + add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, STR_PTR, 0, TMP1, 0)); + return cc; + + case OP_NOT_WORD_BOUNDARY: + case OP_WORD_BOUNDARY: + add_jump(compiler, &common->wordboundary, JUMP(SLJIT_FAST_CALL)); + sljit_set_current_flags(compiler, SLJIT_SET_Z); + add_jump(compiler, backtracks, JUMP(type == OP_NOT_WORD_BOUNDARY ? SLJIT_NOT_ZERO : SLJIT_ZERO)); + return cc; + + case OP_EODN: + /* Requires rather complex checks. */ + jump[0] = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0); + if (common->nltype == NLTYPE_FIXED && common->newline > 255) + { + OP2(SLJIT_ADD, TMP2, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2)); + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0)); + if (common->mode == JIT_COMPILE) + add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP2, 0, STR_END, 0)); + else + { + jump[1] = CMP(SLJIT_EQUAL, TMP2, 0, STR_END, 0); + OP2(SLJIT_SUB | SLJIT_SET_LESS, SLJIT_UNUSED, 0, TMP2, 0, STR_END, 0); + OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_LESS); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (common->newline >> 8) & 0xff); + OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_NOT_EQUAL); + add_jump(compiler, backtracks, JUMP(SLJIT_NOT_EQUAL)); + check_partial(common, TRUE); + add_jump(compiler, backtracks, JUMP(SLJIT_JUMP)); + JUMPHERE(jump[1]); + } + OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(1)); + add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, (common->newline >> 8) & 0xff)); + add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP2, 0, SLJIT_IMM, common->newline & 0xff)); + } + else if (common->nltype == NLTYPE_FIXED) + { + OP2(SLJIT_ADD, TMP2, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0)); + add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP2, 0, STR_END, 0)); + add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, common->newline)); + } + else + { + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0)); + jump[1] = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_CR); + OP2(SLJIT_ADD, TMP2, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2)); + OP2(SLJIT_SUB | SLJIT_SET_Z | SLJIT_SET_GREATER, SLJIT_UNUSED, 0, TMP2, 0, STR_END, 0); + jump[2] = JUMP(SLJIT_GREATER); + add_jump(compiler, backtracks, JUMP(SLJIT_NOT_EQUAL) /* LESS */); + /* Equal. */ + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(1)); + jump[3] = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_NL); + add_jump(compiler, backtracks, JUMP(SLJIT_JUMP)); + + JUMPHERE(jump[1]); + if (common->nltype == NLTYPE_ANYCRLF) + { + OP2(SLJIT_ADD, TMP2, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + add_jump(compiler, backtracks, CMP(SLJIT_LESS, TMP2, 0, STR_END, 0)); + add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_NL)); + } + else + { + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS1, STR_PTR, 0); + read_char_range(common, common->nlmin, common->nlmax, TRUE); + add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, STR_PTR, 0, STR_END, 0)); + add_jump(compiler, &common->anynewline, JUMP(SLJIT_FAST_CALL)); + sljit_set_current_flags(compiler, SLJIT_SET_Z); + add_jump(compiler, backtracks, JUMP(SLJIT_ZERO)); + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), LOCALS1); + } + JUMPHERE(jump[2]); + JUMPHERE(jump[3]); + } + JUMPHERE(jump[0]); + check_partial(common, FALSE); + return cc; + + case OP_EOD: + add_jump(compiler, backtracks, CMP(SLJIT_LESS, STR_PTR, 0, STR_END, 0)); + check_partial(common, FALSE); + return cc; + + case OP_DOLL: + OP1(SLJIT_MOV, TMP2, 0, ARGUMENTS, 0); + OP1(SLJIT_MOV_U8, TMP2, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, noteol)); + add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP2, 0, SLJIT_IMM, 0)); + + if (!common->endonly) + compile_simple_assertion_matchingpath(common, OP_EODN, cc, backtracks); + else + { + add_jump(compiler, backtracks, CMP(SLJIT_LESS, STR_PTR, 0, STR_END, 0)); + check_partial(common, FALSE); + } + return cc; + + case OP_DOLLM: + jump[1] = CMP(SLJIT_LESS, STR_PTR, 0, STR_END, 0); + OP1(SLJIT_MOV, TMP2, 0, ARGUMENTS, 0); + OP1(SLJIT_MOV_U8, TMP2, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, noteol)); + add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP2, 0, SLJIT_IMM, 0)); + check_partial(common, FALSE); + jump[0] = JUMP(SLJIT_JUMP); + JUMPHERE(jump[1]); + + if (common->nltype == NLTYPE_FIXED && common->newline > 255) + { + OP2(SLJIT_ADD, TMP2, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2)); + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0)); + if (common->mode == JIT_COMPILE) + add_jump(compiler, backtracks, CMP(SLJIT_GREATER, TMP2, 0, STR_END, 0)); + else + { + jump[1] = CMP(SLJIT_LESS_EQUAL, TMP2, 0, STR_END, 0); + /* STR_PTR = STR_END - IN_UCHARS(1) */ + add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, (common->newline >> 8) & 0xff)); + check_partial(common, TRUE); + add_jump(compiler, backtracks, JUMP(SLJIT_JUMP)); + JUMPHERE(jump[1]); + } + + OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(1)); + add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, (common->newline >> 8) & 0xff)); + add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP2, 0, SLJIT_IMM, common->newline & 0xff)); + } + else + { + peek_char(common, common->nlmax); + check_newlinechar(common, common->nltype, backtracks, FALSE); + } + JUMPHERE(jump[0]); + return cc; + + case OP_CIRC: + OP1(SLJIT_MOV, TMP2, 0, ARGUMENTS, 0); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, begin)); + add_jump(compiler, backtracks, CMP(SLJIT_GREATER, STR_PTR, 0, TMP1, 0)); + OP1(SLJIT_MOV_U8, TMP2, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, notbol)); + add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP2, 0, SLJIT_IMM, 0)); + return cc; + + case OP_CIRCM: + OP1(SLJIT_MOV, TMP2, 0, ARGUMENTS, 0); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, begin)); + jump[1] = CMP(SLJIT_GREATER, STR_PTR, 0, TMP1, 0); + OP1(SLJIT_MOV_U8, TMP2, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, notbol)); + add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP2, 0, SLJIT_IMM, 0)); + jump[0] = JUMP(SLJIT_JUMP); + JUMPHERE(jump[1]); + + add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0)); + if (common->nltype == NLTYPE_FIXED && common->newline > 255) + { + OP2(SLJIT_SUB, TMP2, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2)); + add_jump(compiler, backtracks, CMP(SLJIT_LESS, TMP2, 0, TMP1, 0)); + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-2)); + OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-1)); + add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, (common->newline >> 8) & 0xff)); + add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP2, 0, SLJIT_IMM, common->newline & 0xff)); + } + else + { + skip_char_back(common); + read_char_range(common, common->nlmin, common->nlmax, TRUE); + check_newlinechar(common, common->nltype, backtracks, FALSE); + } + JUMPHERE(jump[0]); + return cc; + + case OP_REVERSE: + length = GET(cc, 0); + if (length == 0) + return cc + LINK_SIZE; + OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0); +#ifdef SUPPORT_UTF + if (common->utf) + { + OP1(SLJIT_MOV, TMP3, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, begin)); + OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, length); + label = LABEL(); + add_jump(compiler, backtracks, CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, TMP3, 0)); + skip_char_back(common); + OP2(SLJIT_SUB | SLJIT_SET_Z, TMP2, 0, TMP2, 0, SLJIT_IMM, 1); + JUMPTO(SLJIT_NOT_ZERO, label); + } + else +#endif + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, begin)); + OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(length)); + add_jump(compiler, backtracks, CMP(SLJIT_LESS, STR_PTR, 0, TMP1, 0)); + } + check_start_used_ptr(common); + return cc + LINK_SIZE; + } +SLJIT_UNREACHABLE(); +return cc; +} + +static pcre_uchar *compile_char1_matchingpath(compiler_common *common, pcre_uchar type, pcre_uchar *cc, jump_list **backtracks, BOOL check_str_ptr) +{ +DEFINE_COMPILER; +int length; +unsigned int c, oc, bit; +compare_context context; +struct sljit_jump *jump[3]; +jump_list *end_list; +#ifdef SUPPORT_UTF +struct sljit_label *label; +#ifdef SUPPORT_UCP +pcre_uchar propdata[5]; +#endif +#endif /* SUPPORT_UTF */ + +switch(type) + { + case OP_NOT_DIGIT: + case OP_DIGIT: + /* Digits are usually 0-9, so it is worth to optimize them. */ + if (check_str_ptr) + detect_partial_match(common, backtracks); +#if defined SUPPORT_UTF && defined COMPILE_PCRE8 + if (common->utf && is_char7_bitset((const sljit_u8 *)common->ctypes - cbit_length + cbit_digit, FALSE)) + read_char7_type(common, type == OP_NOT_DIGIT); + else +#endif + read_char8_type(common, type == OP_NOT_DIGIT); + /* Flip the starting bit in the negative case. */ + OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, ctype_digit); + add_jump(compiler, backtracks, JUMP(type == OP_DIGIT ? SLJIT_ZERO : SLJIT_NOT_ZERO)); + return cc; + + case OP_NOT_WHITESPACE: + case OP_WHITESPACE: + if (check_str_ptr) + detect_partial_match(common, backtracks); +#if defined SUPPORT_UTF && defined COMPILE_PCRE8 + if (common->utf && is_char7_bitset((const sljit_u8 *)common->ctypes - cbit_length + cbit_space, FALSE)) + read_char7_type(common, type == OP_NOT_WHITESPACE); + else +#endif + read_char8_type(common, type == OP_NOT_WHITESPACE); + OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, ctype_space); + add_jump(compiler, backtracks, JUMP(type == OP_WHITESPACE ? SLJIT_ZERO : SLJIT_NOT_ZERO)); + return cc; + + case OP_NOT_WORDCHAR: + case OP_WORDCHAR: + if (check_str_ptr) + detect_partial_match(common, backtracks); +#if defined SUPPORT_UTF && defined COMPILE_PCRE8 + if (common->utf && is_char7_bitset((const sljit_u8 *)common->ctypes - cbit_length + cbit_word, FALSE)) + read_char7_type(common, type == OP_NOT_WORDCHAR); + else +#endif + read_char8_type(common, type == OP_NOT_WORDCHAR); + OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, ctype_word); + add_jump(compiler, backtracks, JUMP(type == OP_WORDCHAR ? SLJIT_ZERO : SLJIT_NOT_ZERO)); + return cc; + + case OP_ANY: + if (check_str_ptr) + detect_partial_match(common, backtracks); + read_char_range(common, common->nlmin, common->nlmax, TRUE); + if (common->nltype == NLTYPE_FIXED && common->newline > 255) + { + jump[0] = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, (common->newline >> 8) & 0xff); + end_list = NULL; + if (common->mode != JIT_PARTIAL_HARD_COMPILE) + add_jump(compiler, &end_list, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0)); + else + check_str_end(common, &end_list); + + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0); + add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, common->newline & 0xff)); + set_jumps(end_list, LABEL()); + JUMPHERE(jump[0]); + } + else + check_newlinechar(common, common->nltype, backtracks, TRUE); + return cc; + + case OP_ALLANY: + if (check_str_ptr) + detect_partial_match(common, backtracks); +#ifdef SUPPORT_UTF + if (common->utf) + { + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); +#if defined COMPILE_PCRE8 || defined COMPILE_PCRE16 +#if defined COMPILE_PCRE8 + jump[0] = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0xc0); + OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_sw)PRIV(utf8_table4) - 0xc0); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0); +#elif defined COMPILE_PCRE16 + jump[0] = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0xd800); + OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xfc00); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0xd800); + OP_FLAGS(SLJIT_MOV, TMP1, 0, SLJIT_EQUAL); + OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 1); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0); +#endif + JUMPHERE(jump[0]); +#endif /* COMPILE_PCRE[8|16] */ + return cc; + } +#endif + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + return cc; + + case OP_ANYBYTE: + if (check_str_ptr) + detect_partial_match(common, backtracks); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + return cc; + +#ifdef SUPPORT_UTF +#ifdef SUPPORT_UCP + case OP_NOTPROP: + case OP_PROP: + propdata[0] = XCL_HASPROP; + propdata[1] = type == OP_NOTPROP ? XCL_NOTPROP : XCL_PROP; + propdata[2] = cc[0]; + propdata[3] = cc[1]; + propdata[4] = XCL_END; + if (check_str_ptr) + detect_partial_match(common, backtracks); + compile_xclass_matchingpath(common, propdata, backtracks); + return cc + 2; +#endif +#endif + + case OP_ANYNL: + if (check_str_ptr) + detect_partial_match(common, backtracks); + read_char_range(common, common->bsr_nlmin, common->bsr_nlmax, FALSE); + jump[0] = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_CR); + /* We don't need to handle soft partial matching case. */ + end_list = NULL; + if (common->mode != JIT_PARTIAL_HARD_COMPILE) + add_jump(compiler, &end_list, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0)); + else + check_str_end(common, &end_list); + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0); + jump[1] = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_NL); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + jump[2] = JUMP(SLJIT_JUMP); + JUMPHERE(jump[0]); + check_newlinechar(common, common->bsr_nltype, backtracks, FALSE); + set_jumps(end_list, LABEL()); + JUMPHERE(jump[1]); + JUMPHERE(jump[2]); + return cc; + + case OP_NOT_HSPACE: + case OP_HSPACE: + if (check_str_ptr) + detect_partial_match(common, backtracks); + read_char_range(common, 0x9, 0x3000, type == OP_NOT_HSPACE); + add_jump(compiler, &common->hspace, JUMP(SLJIT_FAST_CALL)); + sljit_set_current_flags(compiler, SLJIT_SET_Z); + add_jump(compiler, backtracks, JUMP(type == OP_NOT_HSPACE ? SLJIT_NOT_ZERO : SLJIT_ZERO)); + return cc; + + case OP_NOT_VSPACE: + case OP_VSPACE: + if (check_str_ptr) + detect_partial_match(common, backtracks); + read_char_range(common, 0xa, 0x2029, type == OP_NOT_VSPACE); + add_jump(compiler, &common->vspace, JUMP(SLJIT_FAST_CALL)); + sljit_set_current_flags(compiler, SLJIT_SET_Z); + add_jump(compiler, backtracks, JUMP(type == OP_NOT_VSPACE ? SLJIT_NOT_ZERO : SLJIT_ZERO)); + return cc; + +#ifdef SUPPORT_UCP + case OP_EXTUNI: + if (check_str_ptr) + detect_partial_match(common, backtracks); + read_char(common); + add_jump(compiler, &common->getucd, JUMP(SLJIT_FAST_CALL)); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, gbprop)); + /* Optimize register allocation: use a real register. */ + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS0, STACK_TOP, 0); + OP1(SLJIT_MOV_U8, STACK_TOP, 0, SLJIT_MEM2(TMP1, TMP2), 3); + + label = LABEL(); + jump[0] = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0); + OP1(SLJIT_MOV, TMP3, 0, STR_PTR, 0); + read_char(common); + add_jump(compiler, &common->getucd, JUMP(SLJIT_FAST_CALL)); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, gbprop)); + OP1(SLJIT_MOV_U8, TMP2, 0, SLJIT_MEM2(TMP1, TMP2), 3); + + OP2(SLJIT_SHL, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, 2); + OP1(SLJIT_MOV_U32, TMP1, 0, SLJIT_MEM1(STACK_TOP), (sljit_sw)PRIV(ucp_gbtable)); + OP1(SLJIT_MOV, STACK_TOP, 0, TMP2, 0); + OP2(SLJIT_SHL, TMP2, 0, SLJIT_IMM, 1, TMP2, 0); + OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, TMP2, 0); + JUMPTO(SLJIT_NOT_ZERO, label); + + OP1(SLJIT_MOV, STR_PTR, 0, TMP3, 0); + JUMPHERE(jump[0]); + OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0); + + if (common->mode == JIT_PARTIAL_HARD_COMPILE) + { + jump[0] = CMP(SLJIT_LESS, STR_PTR, 0, STR_END, 0); + /* Since we successfully read a char above, partial matching must occure. */ + check_partial(common, TRUE); + JUMPHERE(jump[0]); + } + return cc; +#endif + + case OP_CHAR: + case OP_CHARI: + length = 1; +#ifdef SUPPORT_UTF + if (common->utf && HAS_EXTRALEN(*cc)) length += GET_EXTRALEN(*cc); +#endif + if (common->mode == JIT_COMPILE && check_str_ptr + && (type == OP_CHAR || !char_has_othercase(common, cc) || char_get_othercase_bit(common, cc) != 0)) + { + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(length)); + add_jump(compiler, backtracks, CMP(SLJIT_GREATER, STR_PTR, 0, STR_END, 0)); + + context.length = IN_UCHARS(length); + context.sourcereg = -1; +#if defined SLJIT_UNALIGNED && SLJIT_UNALIGNED + context.ucharptr = 0; +#endif + return byte_sequence_compare(common, type == OP_CHARI, cc, &context, backtracks); + } + + if (check_str_ptr) + detect_partial_match(common, backtracks); +#ifdef SUPPORT_UTF + if (common->utf) + { + GETCHAR(c, cc); + } + else +#endif + c = *cc; + + if (type == OP_CHAR || !char_has_othercase(common, cc)) + { + read_char_range(common, c, c, FALSE); + add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, c)); + return cc + length; + } + oc = char_othercase(common, c); + read_char_range(common, c < oc ? c : oc, c > oc ? c : oc, FALSE); + bit = c ^ oc; + if (is_powerof2(bit)) + { + OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, bit); + add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, c | bit)); + return cc + length; + } + jump[0] = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, c); + add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, oc)); + JUMPHERE(jump[0]); + return cc + length; + + case OP_NOT: + case OP_NOTI: + if (check_str_ptr) + detect_partial_match(common, backtracks); + length = 1; +#ifdef SUPPORT_UTF + if (common->utf) + { +#ifdef COMPILE_PCRE8 + c = *cc; + if (c < 128) + { + OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(STR_PTR), 0); + if (type == OP_NOT || !char_has_othercase(common, cc)) + add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, c)); + else + { + /* Since UTF8 code page is fixed, we know that c is in [a-z] or [A-Z] range. */ + OP2(SLJIT_OR, TMP2, 0, TMP1, 0, SLJIT_IMM, 0x20); + add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP2, 0, SLJIT_IMM, c | 0x20)); + } + /* Skip the variable-length character. */ + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + jump[0] = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0xc0); + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_sw)PRIV(utf8_table4) - 0xc0); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0); + JUMPHERE(jump[0]); + return cc + 1; + } + else +#endif /* COMPILE_PCRE8 */ + { + GETCHARLEN(c, cc, length); + } + } + else +#endif /* SUPPORT_UTF */ + c = *cc; + + if (type == OP_NOT || !char_has_othercase(common, cc)) + { + read_char_range(common, c, c, TRUE); + add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, c)); + } + else + { + oc = char_othercase(common, c); + read_char_range(common, c < oc ? c : oc, c > oc ? c : oc, TRUE); + bit = c ^ oc; + if (is_powerof2(bit)) + { + OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, bit); + add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, c | bit)); + } + else + { + add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, c)); + add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, oc)); + } + } + return cc + length; + + case OP_CLASS: + case OP_NCLASS: + if (check_str_ptr) + detect_partial_match(common, backtracks); + +#if defined SUPPORT_UTF && defined COMPILE_PCRE8 + bit = (common->utf && is_char7_bitset((const sljit_u8 *)cc, type == OP_NCLASS)) ? 127 : 255; + read_char_range(common, 0, bit, type == OP_NCLASS); +#else + read_char_range(common, 0, 255, type == OP_NCLASS); +#endif + + if (check_class_ranges(common, (const sljit_u8 *)cc, type == OP_NCLASS, FALSE, backtracks)) + return cc + 32 / sizeof(pcre_uchar); + +#if defined SUPPORT_UTF && defined COMPILE_PCRE8 + jump[0] = NULL; + if (common->utf) + { + jump[0] = CMP(SLJIT_GREATER, TMP1, 0, SLJIT_IMM, bit); + if (type == OP_CLASS) + { + add_jump(compiler, backtracks, jump[0]); + jump[0] = NULL; + } + } +#elif !defined COMPILE_PCRE8 + jump[0] = CMP(SLJIT_GREATER, TMP1, 0, SLJIT_IMM, 255); + if (type == OP_CLASS) + { + add_jump(compiler, backtracks, jump[0]); + jump[0] = NULL; + } +#endif /* SUPPORT_UTF && COMPILE_PCRE8 */ + + OP2(SLJIT_AND, TMP2, 0, TMP1, 0, SLJIT_IMM, 0x7); + OP2(SLJIT_LSHR, TMP1, 0, TMP1, 0, SLJIT_IMM, 3); + OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_sw)cc); + OP2(SLJIT_SHL, TMP2, 0, SLJIT_IMM, 1, TMP2, 0); + OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, TMP2, 0); + add_jump(compiler, backtracks, JUMP(SLJIT_ZERO)); + +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 + if (jump[0] != NULL) + JUMPHERE(jump[0]); +#endif + return cc + 32 / sizeof(pcre_uchar); + +#if defined SUPPORT_UTF || defined COMPILE_PCRE16 || defined COMPILE_PCRE32 + case OP_XCLASS: + if (check_str_ptr) + detect_partial_match(common, backtracks); + compile_xclass_matchingpath(common, cc + LINK_SIZE, backtracks); + return cc + GET(cc, 0) - 1; +#endif + } +SLJIT_UNREACHABLE(); +return cc; +} + +static SLJIT_INLINE pcre_uchar *compile_charn_matchingpath(compiler_common *common, pcre_uchar *cc, pcre_uchar *ccend, jump_list **backtracks) +{ +/* This function consumes at least one input character. */ +/* To decrease the number of length checks, we try to concatenate the fixed length character sequences. */ +DEFINE_COMPILER; +pcre_uchar *ccbegin = cc; +compare_context context; +int size; + +context.length = 0; +do + { + if (cc >= ccend) + break; + + if (*cc == OP_CHAR) + { + size = 1; +#ifdef SUPPORT_UTF + if (common->utf && HAS_EXTRALEN(cc[1])) + size += GET_EXTRALEN(cc[1]); +#endif + } + else if (*cc == OP_CHARI) + { + size = 1; +#ifdef SUPPORT_UTF + if (common->utf) + { + if (char_has_othercase(common, cc + 1) && char_get_othercase_bit(common, cc + 1) == 0) + size = 0; + else if (HAS_EXTRALEN(cc[1])) + size += GET_EXTRALEN(cc[1]); + } + else +#endif + if (char_has_othercase(common, cc + 1) && char_get_othercase_bit(common, cc + 1) == 0) + size = 0; + } + else + size = 0; + + cc += 1 + size; + context.length += IN_UCHARS(size); + } +while (size > 0 && context.length <= 128); + +cc = ccbegin; +if (context.length > 0) + { + /* We have a fixed-length byte sequence. */ + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, context.length); + add_jump(compiler, backtracks, CMP(SLJIT_GREATER, STR_PTR, 0, STR_END, 0)); + + context.sourcereg = -1; +#if defined SLJIT_UNALIGNED && SLJIT_UNALIGNED + context.ucharptr = 0; +#endif + do cc = byte_sequence_compare(common, *cc == OP_CHARI, cc + 1, &context, backtracks); while (context.length > 0); + return cc; + } + +/* A non-fixed length character will be checked if length == 0. */ +return compile_char1_matchingpath(common, *cc, cc + 1, backtracks, TRUE); +} + +/* Forward definitions. */ +static void compile_matchingpath(compiler_common *, pcre_uchar *, pcre_uchar *, backtrack_common *); +static void compile_backtrackingpath(compiler_common *, struct backtrack_common *); + +#define PUSH_BACKTRACK(size, ccstart, error) \ + do \ + { \ + backtrack = sljit_alloc_memory(compiler, (size)); \ + if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler))) \ + return error; \ + memset(backtrack, 0, size); \ + backtrack->prev = parent->top; \ + backtrack->cc = (ccstart); \ + parent->top = backtrack; \ + } \ + while (0) + +#define PUSH_BACKTRACK_NOVALUE(size, ccstart) \ + do \ + { \ + backtrack = sljit_alloc_memory(compiler, (size)); \ + if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler))) \ + return; \ + memset(backtrack, 0, size); \ + backtrack->prev = parent->top; \ + backtrack->cc = (ccstart); \ + parent->top = backtrack; \ + } \ + while (0) + +#define BACKTRACK_AS(type) ((type *)backtrack) + +static void compile_dnref_search(compiler_common *common, pcre_uchar *cc, jump_list **backtracks) +{ +/* The OVECTOR offset goes to TMP2. */ +DEFINE_COMPILER; +int count = GET2(cc, 1 + IMM2_SIZE); +pcre_uchar *slot = common->name_table + GET2(cc, 1) * common->name_entry_size; +unsigned int offset; +jump_list *found = NULL; + +SLJIT_ASSERT(*cc == OP_DNREF || *cc == OP_DNREFI); + +OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(1)); + +count--; +while (count-- > 0) + { + offset = GET2(slot, 0) << 1; + GET_LOCAL_BASE(TMP2, 0, OVECTOR(offset)); + add_jump(compiler, &found, CMP(SLJIT_NOT_EQUAL, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset), TMP1, 0)); + slot += common->name_entry_size; + } + +offset = GET2(slot, 0) << 1; +GET_LOCAL_BASE(TMP2, 0, OVECTOR(offset)); +if (backtracks != NULL && !common->jscript_compat) + add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset), TMP1, 0)); + +set_jumps(found, LABEL()); +} + +static void compile_ref_matchingpath(compiler_common *common, pcre_uchar *cc, jump_list **backtracks, BOOL withchecks, BOOL emptyfail) +{ +DEFINE_COMPILER; +BOOL ref = (*cc == OP_REF || *cc == OP_REFI); +int offset = 0; +struct sljit_jump *jump = NULL; +struct sljit_jump *partial; +struct sljit_jump *nopartial; + +if (ref) + { + offset = GET2(cc, 1) << 1; + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset)); + /* OVECTOR(1) contains the "string begin - 1" constant. */ + if (withchecks && !common->jscript_compat) + add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(1))); + } +else + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP2), 0); + +#if defined SUPPORT_UTF && defined SUPPORT_UCP +if (common->utf && *cc == OP_REFI) + { + SLJIT_ASSERT(TMP1 == SLJIT_R0 && STACK_TOP == SLJIT_R1); + if (ref) + OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1)); + else + OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_MEM1(TMP2), sizeof(sljit_sw)); + + if (withchecks) + jump = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_R2, 0); + + /* No free saved registers so save data on stack. */ + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS0, STACK_TOP, 0); + OP1(SLJIT_MOV, SLJIT_R1, 0, STR_PTR, 0); + OP1(SLJIT_MOV, SLJIT_R3, 0, STR_END, 0); + sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(SW) | SLJIT_ARG3(SW) | SLJIT_ARG4(SW), SLJIT_IMM, SLJIT_FUNC_OFFSET(do_utf_caselesscmp)); + OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0); + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_RETURN_REG, 0); + + if (common->mode == JIT_COMPILE) + add_jump(compiler, backtracks, CMP(SLJIT_LESS_EQUAL, SLJIT_RETURN_REG, 0, SLJIT_IMM, 1)); + else + { + OP2(SLJIT_SUB | SLJIT_SET_Z | SLJIT_SET_LESS, SLJIT_UNUSED, 0, SLJIT_RETURN_REG, 0, SLJIT_IMM, 1); + + add_jump(compiler, backtracks, JUMP(SLJIT_LESS)); + + nopartial = JUMP(SLJIT_NOT_EQUAL); + OP1(SLJIT_MOV, STR_PTR, 0, STR_END, 0); + check_partial(common, FALSE); + add_jump(compiler, backtracks, JUMP(SLJIT_JUMP)); + JUMPHERE(nopartial); + } + } +else +#endif /* SUPPORT_UTF && SUPPORT_UCP */ + { + if (ref) + OP2(SLJIT_SUB | SLJIT_SET_Z, TMP2, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1), TMP1, 0); + else + OP2(SLJIT_SUB | SLJIT_SET_Z, TMP2, 0, SLJIT_MEM1(TMP2), sizeof(sljit_sw), TMP1, 0); + + if (withchecks) + jump = JUMP(SLJIT_ZERO); + + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP2, 0); + partial = CMP(SLJIT_GREATER, STR_PTR, 0, STR_END, 0); + if (common->mode == JIT_COMPILE) + add_jump(compiler, backtracks, partial); + + add_jump(compiler, *cc == OP_REF ? &common->casefulcmp : &common->caselesscmp, JUMP(SLJIT_FAST_CALL)); + add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP2, 0, SLJIT_IMM, 0)); + + if (common->mode != JIT_COMPILE) + { + nopartial = JUMP(SLJIT_JUMP); + JUMPHERE(partial); + /* TMP2 -= STR_END - STR_PTR */ + OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, STR_PTR, 0); + OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, STR_END, 0); + partial = CMP(SLJIT_EQUAL, TMP2, 0, SLJIT_IMM, 0); + OP1(SLJIT_MOV, STR_PTR, 0, STR_END, 0); + add_jump(compiler, *cc == OP_REF ? &common->casefulcmp : &common->caselesscmp, JUMP(SLJIT_FAST_CALL)); + add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP2, 0, SLJIT_IMM, 0)); + JUMPHERE(partial); + check_partial(common, FALSE); + add_jump(compiler, backtracks, JUMP(SLJIT_JUMP)); + JUMPHERE(nopartial); + } + } + +if (jump != NULL) + { + if (emptyfail) + add_jump(compiler, backtracks, jump); + else + JUMPHERE(jump); + } +} + +static SLJIT_INLINE pcre_uchar *compile_ref_iterator_matchingpath(compiler_common *common, pcre_uchar *cc, backtrack_common *parent) +{ +DEFINE_COMPILER; +BOOL ref = (*cc == OP_REF || *cc == OP_REFI); +backtrack_common *backtrack; +pcre_uchar type; +int offset = 0; +struct sljit_label *label; +struct sljit_jump *zerolength; +struct sljit_jump *jump = NULL; +pcre_uchar *ccbegin = cc; +int min = 0, max = 0; +BOOL minimize; + +PUSH_BACKTRACK(sizeof(ref_iterator_backtrack), cc, NULL); + +if (ref) + offset = GET2(cc, 1) << 1; +else + cc += IMM2_SIZE; +type = cc[1 + IMM2_SIZE]; + +SLJIT_COMPILE_ASSERT((OP_CRSTAR & 0x1) == 0, crstar_opcode_must_be_even); +minimize = (type & 0x1) != 0; +switch(type) + { + case OP_CRSTAR: + case OP_CRMINSTAR: + min = 0; + max = 0; + cc += 1 + IMM2_SIZE + 1; + break; + case OP_CRPLUS: + case OP_CRMINPLUS: + min = 1; + max = 0; + cc += 1 + IMM2_SIZE + 1; + break; + case OP_CRQUERY: + case OP_CRMINQUERY: + min = 0; + max = 1; + cc += 1 + IMM2_SIZE + 1; + break; + case OP_CRRANGE: + case OP_CRMINRANGE: + min = GET2(cc, 1 + IMM2_SIZE + 1); + max = GET2(cc, 1 + IMM2_SIZE + 1 + IMM2_SIZE); + cc += 1 + IMM2_SIZE + 1 + 2 * IMM2_SIZE; + break; + default: + SLJIT_UNREACHABLE(); + break; + } + +if (!minimize) + { + if (min == 0) + { + allocate_stack(common, 2); + if (ref) + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset)); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, 0); + /* Temporary release of STR_PTR. */ + OP2(SLJIT_ADD, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, sizeof(sljit_sw)); + /* Handles both invalid and empty cases. Since the minimum repeat, + is zero the invalid case is basically the same as an empty case. */ + if (ref) + zerolength = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1)); + else + { + compile_dnref_search(common, ccbegin, NULL); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP2), 0); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), POSSESSIVE1, TMP2, 0); + zerolength = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_MEM1(TMP2), sizeof(sljit_sw)); + } + /* Restore if not zero length. */ + OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, sizeof(sljit_sw)); + } + else + { + allocate_stack(common, 1); + if (ref) + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset)); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0); + if (ref) + { + add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(1))); + zerolength = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1)); + } + else + { + compile_dnref_search(common, ccbegin, &backtrack->topbacktracks); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP2), 0); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), POSSESSIVE1, TMP2, 0); + zerolength = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_MEM1(TMP2), sizeof(sljit_sw)); + } + } + + if (min > 1 || max > 1) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), POSSESSIVE0, SLJIT_IMM, 0); + + label = LABEL(); + if (!ref) + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), POSSESSIVE1); + compile_ref_matchingpath(common, ccbegin, &backtrack->topbacktracks, FALSE, FALSE); + + if (min > 1 || max > 1) + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), POSSESSIVE0); + OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 1); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), POSSESSIVE0, TMP1, 0); + if (min > 1) + CMPTO(SLJIT_LESS, TMP1, 0, SLJIT_IMM, min, label); + if (max > 1) + { + jump = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, max); + allocate_stack(common, 1); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0); + JUMPTO(SLJIT_JUMP, label); + JUMPHERE(jump); + } + } + + if (max == 0) + { + /* Includes min > 1 case as well. */ + allocate_stack(common, 1); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0); + JUMPTO(SLJIT_JUMP, label); + } + + JUMPHERE(zerolength); + BACKTRACK_AS(ref_iterator_backtrack)->matchingpath = LABEL(); + + count_match(common); + return cc; + } + +allocate_stack(common, ref ? 2 : 3); +if (ref) + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset)); +OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0); +if (type != OP_CRMINSTAR) + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, 0); + +if (min == 0) + { + /* Handles both invalid and empty cases. Since the minimum repeat, + is zero the invalid case is basically the same as an empty case. */ + if (ref) + zerolength = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1)); + else + { + compile_dnref_search(common, ccbegin, NULL); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP2), 0); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(2), TMP2, 0); + zerolength = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_MEM1(TMP2), sizeof(sljit_sw)); + } + /* Length is non-zero, we can match real repeats. */ + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0); + jump = JUMP(SLJIT_JUMP); + } +else + { + if (ref) + { + add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(1))); + zerolength = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1)); + } + else + { + compile_dnref_search(common, ccbegin, &backtrack->topbacktracks); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP2), 0); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(2), TMP2, 0); + zerolength = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_MEM1(TMP2), sizeof(sljit_sw)); + } + } + +BACKTRACK_AS(ref_iterator_backtrack)->matchingpath = LABEL(); +if (max > 0) + add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_GREATER_EQUAL, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, max)); + +if (!ref) + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(2)); +compile_ref_matchingpath(common, ccbegin, &backtrack->topbacktracks, TRUE, TRUE); +OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0); + +if (min > 1) + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(1)); + OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 1); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), TMP1, 0); + CMPTO(SLJIT_LESS, TMP1, 0, SLJIT_IMM, min, BACKTRACK_AS(ref_iterator_backtrack)->matchingpath); + } +else if (max > 0) + OP2(SLJIT_ADD, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, 1); + +if (jump != NULL) + JUMPHERE(jump); +JUMPHERE(zerolength); + +count_match(common); +return cc; +} + +static SLJIT_INLINE pcre_uchar *compile_recurse_matchingpath(compiler_common *common, pcre_uchar *cc, backtrack_common *parent) +{ +DEFINE_COMPILER; +backtrack_common *backtrack; +recurse_entry *entry = common->entries; +recurse_entry *prev = NULL; +sljit_sw start = GET(cc, 1); +pcre_uchar *start_cc; +BOOL needs_control_head; + +PUSH_BACKTRACK(sizeof(recurse_backtrack), cc, NULL); + +/* Inlining simple patterns. */ +if (get_framesize(common, common->start + start, NULL, TRUE, &needs_control_head) == no_stack) + { + start_cc = common->start + start; + compile_matchingpath(common, next_opcode(common, start_cc), bracketend(start_cc) - (1 + LINK_SIZE), backtrack); + BACKTRACK_AS(recurse_backtrack)->inlined_pattern = TRUE; + return cc + 1 + LINK_SIZE; + } + +while (entry != NULL) + { + if (entry->start == start) + break; + prev = entry; + entry = entry->next; + } + +if (entry == NULL) + { + entry = sljit_alloc_memory(compiler, sizeof(recurse_entry)); + if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler))) + return NULL; + entry->next = NULL; + entry->entry = NULL; + entry->calls = NULL; + entry->start = start; + + if (prev != NULL) + prev->next = entry; + else + common->entries = entry; + } + +if (common->has_set_som && common->mark_ptr != 0) + { + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(0)); + allocate_stack(common, 2); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->mark_ptr); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP2, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), TMP1, 0); + } +else if (common->has_set_som || common->mark_ptr != 0) + { + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), common->has_set_som ? (int)(OVECTOR(0)) : common->mark_ptr); + allocate_stack(common, 1); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP2, 0); + } + +if (entry->entry == NULL) + add_jump(compiler, &entry->calls, JUMP(SLJIT_FAST_CALL)); +else + JUMPTO(SLJIT_FAST_CALL, entry->entry); +/* Leave if the match is failed. */ +add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, 0)); +return cc + 1 + LINK_SIZE; +} + +static sljit_s32 SLJIT_FUNC do_callout(struct jit_arguments *arguments, PUBL(callout_block) *callout_block, pcre_uchar **jit_ovector) +{ +const pcre_uchar *begin = arguments->begin; +int *offset_vector = arguments->offsets; +int offset_count = arguments->offset_count; +int i; + +if (PUBL(callout) == NULL) + return 0; + +callout_block->version = 2; +callout_block->callout_data = arguments->callout_data; + +/* Offsets in subject. */ +callout_block->subject_length = arguments->end - arguments->begin; +callout_block->start_match = (pcre_uchar*)callout_block->subject - arguments->begin; +callout_block->current_position = (pcre_uchar*)callout_block->offset_vector - arguments->begin; +#if defined COMPILE_PCRE8 +callout_block->subject = (PCRE_SPTR)begin; +#elif defined COMPILE_PCRE16 +callout_block->subject = (PCRE_SPTR16)begin; +#elif defined COMPILE_PCRE32 +callout_block->subject = (PCRE_SPTR32)begin; +#endif + +/* Convert and copy the JIT offset vector to the offset_vector array. */ +callout_block->capture_top = 0; +callout_block->offset_vector = offset_vector; +for (i = 2; i < offset_count; i += 2) + { + offset_vector[i] = jit_ovector[i] - begin; + offset_vector[i + 1] = jit_ovector[i + 1] - begin; + if (jit_ovector[i] >= begin) + callout_block->capture_top = i; + } + +callout_block->capture_top = (callout_block->capture_top >> 1) + 1; +if (offset_count > 0) + offset_vector[0] = -1; +if (offset_count > 1) + offset_vector[1] = -1; +return (*PUBL(callout))(callout_block); +} + +/* Aligning to 8 byte. */ +#define CALLOUT_ARG_SIZE \ + (((int)sizeof(PUBL(callout_block)) + 7) & ~7) + +#define CALLOUT_ARG_OFFSET(arg) \ + SLJIT_OFFSETOF(PUBL(callout_block), arg) + +static SLJIT_INLINE pcre_uchar *compile_callout_matchingpath(compiler_common *common, pcre_uchar *cc, backtrack_common *parent) +{ +DEFINE_COMPILER; +backtrack_common *backtrack; + +PUSH_BACKTRACK(sizeof(backtrack_common), cc, NULL); + +allocate_stack(common, CALLOUT_ARG_SIZE / sizeof(sljit_sw)); + +SLJIT_ASSERT(common->capture_last_ptr != 0); +OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), common->capture_last_ptr); +OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0); +OP1(SLJIT_MOV_S32, SLJIT_MEM1(STACK_TOP), CALLOUT_ARG_OFFSET(callout_number), SLJIT_IMM, cc[1]); +OP1(SLJIT_MOV_S32, SLJIT_MEM1(STACK_TOP), CALLOUT_ARG_OFFSET(capture_last), TMP2, 0); + +/* These pointer sized fields temporarly stores internal variables. */ +OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(0)); +OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), CALLOUT_ARG_OFFSET(offset_vector), STR_PTR, 0); +OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), CALLOUT_ARG_OFFSET(subject), TMP2, 0); + +if (common->mark_ptr != 0) + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, mark_ptr)); +OP1(SLJIT_MOV_S32, SLJIT_MEM1(STACK_TOP), CALLOUT_ARG_OFFSET(pattern_position), SLJIT_IMM, GET(cc, 2)); +OP1(SLJIT_MOV_S32, SLJIT_MEM1(STACK_TOP), CALLOUT_ARG_OFFSET(next_item_length), SLJIT_IMM, GET(cc, 2 + LINK_SIZE)); +OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), CALLOUT_ARG_OFFSET(mark), (common->mark_ptr != 0) ? TMP2 : SLJIT_IMM, 0); + +/* Needed to save important temporary registers. */ +OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS0, STACK_TOP, 0); +/* SLJIT_R0 = arguments */ +OP1(SLJIT_MOV, SLJIT_R1, 0, STACK_TOP, 0); +GET_LOCAL_BASE(SLJIT_R2, 0, OVECTOR_START); +sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(S32) | SLJIT_ARG1(SW) | SLJIT_ARG2(SW) | SLJIT_ARG3(SW), SLJIT_IMM, SLJIT_FUNC_OFFSET(do_callout)); +OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0); +free_stack(common, CALLOUT_ARG_SIZE / sizeof(sljit_sw)); + +/* Check return value. */ +OP2(SLJIT_SUB32 | SLJIT_SET_Z | SLJIT_SET_SIG_GREATER, SLJIT_UNUSED, 0, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0); +add_jump(compiler, &backtrack->topbacktracks, JUMP(SLJIT_SIG_GREATER32)); +if (common->forced_quit_label == NULL) + add_jump(compiler, &common->forced_quit, JUMP(SLJIT_NOT_EQUAL32) /* SIG_LESS */); +else + JUMPTO(SLJIT_NOT_EQUAL32 /* SIG_LESS */, common->forced_quit_label); +return cc + 2 + 2 * LINK_SIZE; +} + +#undef CALLOUT_ARG_SIZE +#undef CALLOUT_ARG_OFFSET + +static SLJIT_INLINE BOOL assert_needs_str_ptr_saving(pcre_uchar *cc) +{ +while (TRUE) + { + switch (*cc) + { + case OP_NOT_WORD_BOUNDARY: + case OP_WORD_BOUNDARY: + case OP_CIRC: + case OP_CIRCM: + case OP_DOLL: + case OP_DOLLM: + case OP_CALLOUT: + case OP_ALT: + cc += PRIV(OP_lengths)[*cc]; + break; + + case OP_KET: + return FALSE; + + default: + return TRUE; + } + } +} + +static pcre_uchar *compile_assert_matchingpath(compiler_common *common, pcre_uchar *cc, assert_backtrack *backtrack, BOOL conditional) +{ +DEFINE_COMPILER; +int framesize; +int extrasize; +BOOL needs_control_head; +int private_data_ptr; +backtrack_common altbacktrack; +pcre_uchar *ccbegin; +pcre_uchar opcode; +pcre_uchar bra = OP_BRA; +jump_list *tmp = NULL; +jump_list **target = (conditional) ? &backtrack->condfailed : &backtrack->common.topbacktracks; +jump_list **found; +/* Saving previous accept variables. */ +BOOL save_local_exit = common->local_exit; +BOOL save_positive_assert = common->positive_assert; +then_trap_backtrack *save_then_trap = common->then_trap; +struct sljit_label *save_quit_label = common->quit_label; +struct sljit_label *save_accept_label = common->accept_label; +jump_list *save_quit = common->quit; +jump_list *save_positive_assert_quit = common->positive_assert_quit; +jump_list *save_accept = common->accept; +struct sljit_jump *jump; +struct sljit_jump *brajump = NULL; + +/* Assert captures then. */ +common->then_trap = NULL; + +if (*cc == OP_BRAZERO || *cc == OP_BRAMINZERO) + { + SLJIT_ASSERT(!conditional); + bra = *cc; + cc++; + } +private_data_ptr = PRIVATE_DATA(cc); +SLJIT_ASSERT(private_data_ptr != 0); +framesize = get_framesize(common, cc, NULL, FALSE, &needs_control_head); +backtrack->framesize = framesize; +backtrack->private_data_ptr = private_data_ptr; +opcode = *cc; +SLJIT_ASSERT(opcode >= OP_ASSERT && opcode <= OP_ASSERTBACK_NOT); +found = (opcode == OP_ASSERT || opcode == OP_ASSERTBACK) ? &tmp : target; +ccbegin = cc; +cc += GET(cc, 1); + +if (bra == OP_BRAMINZERO) + { + /* This is a braminzero backtrack path. */ + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + free_stack(common, 1); + brajump = CMP(SLJIT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0); + } + +if (framesize < 0) + { + extrasize = 1; + if (bra == OP_BRA && !assert_needs_str_ptr_saving(ccbegin + 1 + LINK_SIZE)) + extrasize = 0; + + if (needs_control_head) + extrasize++; + + if (framesize == no_frame) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, STACK_TOP, 0); + + if (extrasize > 0) + allocate_stack(common, extrasize); + + if (needs_control_head) + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr); + + if (extrasize > 0) + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0); + + if (needs_control_head) + { + SLJIT_ASSERT(extrasize == 2); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_IMM, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), TMP1, 0); + } + } +else + { + extrasize = needs_control_head ? 3 : 2; + allocate_stack(common, framesize + extrasize); + + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr); + OP2(SLJIT_ADD, TMP2, 0, STACK_TOP, 0, SLJIT_IMM, (framesize + extrasize) * sizeof(sljit_sw)); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, TMP2, 0); + if (needs_control_head) + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0); + + if (needs_control_head) + { + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(2), TMP1, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), TMP2, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_IMM, 0); + } + else + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), TMP1, 0); + + init_frame(common, ccbegin, NULL, framesize + extrasize - 1, extrasize, FALSE); + } + +memset(&altbacktrack, 0, sizeof(backtrack_common)); +if (opcode == OP_ASSERT_NOT || opcode == OP_ASSERTBACK_NOT) + { + /* Negative assert is stronger than positive assert. */ + common->local_exit = TRUE; + common->quit_label = NULL; + common->quit = NULL; + common->positive_assert = FALSE; + } +else + common->positive_assert = TRUE; +common->positive_assert_quit = NULL; + +while (1) + { + common->accept_label = NULL; + common->accept = NULL; + altbacktrack.top = NULL; + altbacktrack.topbacktracks = NULL; + + if (*ccbegin == OP_ALT && extrasize > 0) + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + + altbacktrack.cc = ccbegin; + compile_matchingpath(common, ccbegin + 1 + LINK_SIZE, cc, &altbacktrack); + if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler))) + { + if (opcode == OP_ASSERT_NOT || opcode == OP_ASSERTBACK_NOT) + { + common->local_exit = save_local_exit; + common->quit_label = save_quit_label; + common->quit = save_quit; + } + common->positive_assert = save_positive_assert; + common->then_trap = save_then_trap; + common->accept_label = save_accept_label; + common->positive_assert_quit = save_positive_assert_quit; + common->accept = save_accept; + return NULL; + } + common->accept_label = LABEL(); + if (common->accept != NULL) + set_jumps(common->accept, common->accept_label); + + /* Reset stack. */ + if (framesize < 0) + { + if (framesize == no_frame) + OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr); + else if (extrasize > 0) + free_stack(common, extrasize); + + if (needs_control_head) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_MEM1(STACK_TOP), STACK(-1)); + } + else + { + if ((opcode != OP_ASSERT_NOT && opcode != OP_ASSERTBACK_NOT) || conditional) + { + /* We don't need to keep the STR_PTR, only the previous private_data_ptr. */ + OP2(SLJIT_SUB, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_IMM, (framesize + 1) * sizeof(sljit_sw)); + if (needs_control_head) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_MEM1(STACK_TOP), STACK(-1)); + } + else + { + OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr); + if (needs_control_head) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_MEM1(STACK_TOP), STACK(-framesize - 2)); + add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL)); + } + } + + if (opcode == OP_ASSERT_NOT || opcode == OP_ASSERTBACK_NOT) + { + /* We know that STR_PTR was stored on the top of the stack. */ + if (conditional) + { + if (extrasize > 0) + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), needs_control_head ? STACK(-2) : STACK(-1)); + } + else if (bra == OP_BRAZERO) + { + if (framesize < 0) + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(-extrasize)); + else + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(-framesize - 1)); + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(-framesize - extrasize)); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, TMP1, 0); + } + OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, sizeof(sljit_sw)); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0); + } + else if (framesize >= 0) + { + /* For OP_BRA and OP_BRAMINZERO. */ + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_MEM1(STACK_TOP), STACK(-framesize - 1)); + } + } + add_jump(compiler, found, JUMP(SLJIT_JUMP)); + + compile_backtrackingpath(common, altbacktrack.top); + if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler))) + { + if (opcode == OP_ASSERT_NOT || opcode == OP_ASSERTBACK_NOT) + { + common->local_exit = save_local_exit; + common->quit_label = save_quit_label; + common->quit = save_quit; + } + common->positive_assert = save_positive_assert; + common->then_trap = save_then_trap; + common->accept_label = save_accept_label; + common->positive_assert_quit = save_positive_assert_quit; + common->accept = save_accept; + return NULL; + } + set_jumps(altbacktrack.topbacktracks, LABEL()); + + if (*cc != OP_ALT) + break; + + ccbegin = cc; + cc += GET(cc, 1); + } + +if (opcode == OP_ASSERT_NOT || opcode == OP_ASSERTBACK_NOT) + { + SLJIT_ASSERT(common->positive_assert_quit == NULL); + /* Makes the check less complicated below. */ + common->positive_assert_quit = common->quit; + } + +/* None of them matched. */ +if (common->positive_assert_quit != NULL) + { + jump = JUMP(SLJIT_JUMP); + set_jumps(common->positive_assert_quit, LABEL()); + SLJIT_ASSERT(framesize != no_stack); + if (framesize < 0) + OP2(SLJIT_SUB, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_IMM, extrasize * sizeof(sljit_sw)); + else + { + OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr); + add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL)); + OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, (framesize + extrasize) * sizeof(sljit_sw)); + } + JUMPHERE(jump); + } + +if (needs_control_head) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_MEM1(STACK_TOP), STACK(1)); + +if (opcode == OP_ASSERT || opcode == OP_ASSERTBACK) + { + /* Assert is failed. */ + if ((conditional && extrasize > 0) || bra == OP_BRAZERO) + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + + if (framesize < 0) + { + /* The topmost item should be 0. */ + if (bra == OP_BRAZERO) + { + if (extrasize == 2) + free_stack(common, 1); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0); + } + else if (extrasize > 0) + free_stack(common, extrasize); + } + else + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(extrasize - 1)); + /* The topmost item should be 0. */ + if (bra == OP_BRAZERO) + { + free_stack(common, framesize + extrasize - 1); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0); + } + else + free_stack(common, framesize + extrasize); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, TMP1, 0); + } + jump = JUMP(SLJIT_JUMP); + if (bra != OP_BRAZERO) + add_jump(compiler, target, jump); + + /* Assert is successful. */ + set_jumps(tmp, LABEL()); + if (framesize < 0) + { + /* We know that STR_PTR was stored on the top of the stack. */ + if (extrasize > 0) + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(-extrasize)); + + /* Keep the STR_PTR on the top of the stack. */ + if (bra == OP_BRAZERO) + { + OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, sizeof(sljit_sw)); + if (extrasize == 2) + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0); + } + else if (bra == OP_BRAMINZERO) + { + OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, sizeof(sljit_sw)); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0); + } + } + else + { + if (bra == OP_BRA) + { + /* We don't need to keep the STR_PTR, only the previous private_data_ptr. */ + OP2(SLJIT_SUB, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_IMM, (framesize + 1) * sizeof(sljit_sw)); + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(-extrasize + 1)); + } + else + { + /* We don't need to keep the STR_PTR, only the previous private_data_ptr. */ + OP2(SLJIT_SUB, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_IMM, (framesize + 2) * sizeof(sljit_sw)); + if (extrasize == 2) + { + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + if (bra == OP_BRAMINZERO) + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0); + } + else + { + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), 0); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), bra == OP_BRAZERO ? STR_PTR : SLJIT_IMM, 0); + } + } + } + + if (bra == OP_BRAZERO) + { + backtrack->matchingpath = LABEL(); + SET_LABEL(jump, backtrack->matchingpath); + } + else if (bra == OP_BRAMINZERO) + { + JUMPTO(SLJIT_JUMP, backtrack->matchingpath); + JUMPHERE(brajump); + if (framesize >= 0) + { + OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr); + add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL)); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_MEM1(STACK_TOP), STACK(-framesize - 1)); + } + set_jumps(backtrack->common.topbacktracks, LABEL()); + } + } +else + { + /* AssertNot is successful. */ + if (framesize < 0) + { + if (extrasize > 0) + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + + if (bra != OP_BRA) + { + if (extrasize == 2) + free_stack(common, 1); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0); + } + else if (extrasize > 0) + free_stack(common, extrasize); + } + else + { + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(extrasize - 1)); + /* The topmost item should be 0. */ + if (bra != OP_BRA) + { + free_stack(common, framesize + extrasize - 1); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0); + } + else + free_stack(common, framesize + extrasize); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, TMP1, 0); + } + + if (bra == OP_BRAZERO) + backtrack->matchingpath = LABEL(); + else if (bra == OP_BRAMINZERO) + { + JUMPTO(SLJIT_JUMP, backtrack->matchingpath); + JUMPHERE(brajump); + } + + if (bra != OP_BRA) + { + SLJIT_ASSERT(found == &backtrack->common.topbacktracks); + set_jumps(backtrack->common.topbacktracks, LABEL()); + backtrack->common.topbacktracks = NULL; + } + } + +if (opcode == OP_ASSERT_NOT || opcode == OP_ASSERTBACK_NOT) + { + common->local_exit = save_local_exit; + common->quit_label = save_quit_label; + common->quit = save_quit; + } +common->positive_assert = save_positive_assert; +common->then_trap = save_then_trap; +common->accept_label = save_accept_label; +common->positive_assert_quit = save_positive_assert_quit; +common->accept = save_accept; +return cc + 1 + LINK_SIZE; +} + +static SLJIT_INLINE void match_once_common(compiler_common *common, pcre_uchar ket, int framesize, int private_data_ptr, BOOL has_alternatives, BOOL needs_control_head) +{ +DEFINE_COMPILER; +int stacksize; + +if (framesize < 0) + { + if (framesize == no_frame) + OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr); + else + { + stacksize = needs_control_head ? 1 : 0; + if (ket != OP_KET || has_alternatives) + stacksize++; + + if (stacksize > 0) + free_stack(common, stacksize); + } + + if (needs_control_head) + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), (ket != OP_KET || has_alternatives) ? STACK(-2) : STACK(-1)); + + /* TMP2 which is set here used by OP_KETRMAX below. */ + if (ket == OP_KETRMAX) + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(-1)); + else if (ket == OP_KETRMIN) + { + /* Move the STR_PTR to the private_data_ptr. */ + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_MEM1(STACK_TOP), STACK(-1)); + } + } +else + { + stacksize = (ket != OP_KET || has_alternatives) ? 2 : 1; + OP2(SLJIT_SUB, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_IMM, (framesize + stacksize) * sizeof(sljit_sw)); + if (needs_control_head) + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(-1)); + + if (ket == OP_KETRMAX) + { + /* TMP2 which is set here used by OP_KETRMAX below. */ + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + } + } +if (needs_control_head) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, TMP1, 0); +} + +static SLJIT_INLINE int match_capture_common(compiler_common *common, int stacksize, int offset, int private_data_ptr) +{ +DEFINE_COMPILER; + +if (common->capture_last_ptr != 0) + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->capture_last_ptr); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->capture_last_ptr, SLJIT_IMM, offset >> 1); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), TMP1, 0); + stacksize++; + } +if (common->optimized_cbracket[offset >> 1] == 0) + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset)); + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1)); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), TMP1, 0); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize + 1), TMP2, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1), STR_PTR, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset), TMP1, 0); + stacksize += 2; + } +return stacksize; +} + +/* + Handling bracketed expressions is probably the most complex part. + + Stack layout naming characters: + S - Push the current STR_PTR + 0 - Push a 0 (NULL) + A - Push the current STR_PTR. Needed for restoring the STR_PTR + before the next alternative. Not pushed if there are no alternatives. + M - Any values pushed by the current alternative. Can be empty, or anything. + C - Push the previous OVECTOR(i), OVECTOR(i+1) and OVECTOR_PRIV(i) to the stack. + L - Push the previous local (pointed by localptr) to the stack + () - opional values stored on the stack + ()* - optonal, can be stored multiple times + + The following list shows the regular expression templates, their PCRE byte codes + and stack layout supported by pcre-sljit. + + (?:) OP_BRA | OP_KET A M + () OP_CBRA | OP_KET C M + (?:)+ OP_BRA | OP_KETRMAX 0 A M S ( A M S )* + OP_SBRA | OP_KETRMAX 0 L M S ( L M S )* + (?:)+? OP_BRA | OP_KETRMIN 0 A M S ( A M S )* + OP_SBRA | OP_KETRMIN 0 L M S ( L M S )* + ()+ OP_CBRA | OP_KETRMAX 0 C M S ( C M S )* + OP_SCBRA | OP_KETRMAX 0 C M S ( C M S )* + ()+? OP_CBRA | OP_KETRMIN 0 C M S ( C M S )* + OP_SCBRA | OP_KETRMIN 0 C M S ( C M S )* + (?:)? OP_BRAZERO | OP_BRA | OP_KET S ( A M 0 ) + (?:)?? OP_BRAMINZERO | OP_BRA | OP_KET S ( A M 0 ) + ()? OP_BRAZERO | OP_CBRA | OP_KET S ( C M 0 ) + ()?? OP_BRAMINZERO | OP_CBRA | OP_KET S ( C M 0 ) + (?:)* OP_BRAZERO | OP_BRA | OP_KETRMAX S 0 ( A M S )* + OP_BRAZERO | OP_SBRA | OP_KETRMAX S 0 ( L M S )* + (?:)*? OP_BRAMINZERO | OP_BRA | OP_KETRMIN S 0 ( A M S )* + OP_BRAMINZERO | OP_SBRA | OP_KETRMIN S 0 ( L M S )* + ()* OP_BRAZERO | OP_CBRA | OP_KETRMAX S 0 ( C M S )* + OP_BRAZERO | OP_SCBRA | OP_KETRMAX S 0 ( C M S )* + ()*? OP_BRAMINZERO | OP_CBRA | OP_KETRMIN S 0 ( C M S )* + OP_BRAMINZERO | OP_SCBRA | OP_KETRMIN S 0 ( C M S )* + + + Stack layout naming characters: + A - Push the alternative index (starting from 0) on the stack. + Not pushed if there is no alternatives. + M - Any values pushed by the current alternative. Can be empty, or anything. + + The next list shows the possible content of a bracket: + (|) OP_*BRA | OP_ALT ... M A + (?()|) OP_*COND | OP_ALT M A + (?>|) OP_ONCE | OP_ALT ... [stack trace] M A + (?>|) OP_ONCE_NC | OP_ALT ... [stack trace] M A + Or nothing, if trace is unnecessary +*/ + +static pcre_uchar *compile_bracket_matchingpath(compiler_common *common, pcre_uchar *cc, backtrack_common *parent) +{ +DEFINE_COMPILER; +backtrack_common *backtrack; +pcre_uchar opcode; +int private_data_ptr = 0; +int offset = 0; +int i, stacksize; +int repeat_ptr = 0, repeat_length = 0; +int repeat_type = 0, repeat_count = 0; +pcre_uchar *ccbegin; +pcre_uchar *matchingpath; +pcre_uchar *slot; +pcre_uchar bra = OP_BRA; +pcre_uchar ket; +assert_backtrack *assert; +BOOL has_alternatives; +BOOL needs_control_head = FALSE; +struct sljit_jump *jump; +struct sljit_jump *skip; +struct sljit_label *rmax_label = NULL; +struct sljit_jump *braminzero = NULL; + +PUSH_BACKTRACK(sizeof(bracket_backtrack), cc, NULL); + +if (*cc == OP_BRAZERO || *cc == OP_BRAMINZERO) + { + bra = *cc; + cc++; + opcode = *cc; + } + +opcode = *cc; +ccbegin = cc; +matchingpath = bracketend(cc) - 1 - LINK_SIZE; +ket = *matchingpath; +if (ket == OP_KET && PRIVATE_DATA(matchingpath) != 0) + { + repeat_ptr = PRIVATE_DATA(matchingpath); + repeat_length = PRIVATE_DATA(matchingpath + 1); + repeat_type = PRIVATE_DATA(matchingpath + 2); + repeat_count = PRIVATE_DATA(matchingpath + 3); + SLJIT_ASSERT(repeat_length != 0 && repeat_type != 0 && repeat_count != 0); + if (repeat_type == OP_UPTO) + ket = OP_KETRMAX; + if (repeat_type == OP_MINUPTO) + ket = OP_KETRMIN; + } + +if ((opcode == OP_COND || opcode == OP_SCOND) && cc[1 + LINK_SIZE] == OP_DEF) + { + /* Drop this bracket_backtrack. */ + parent->top = backtrack->prev; + return matchingpath + 1 + LINK_SIZE + repeat_length; + } + +matchingpath = ccbegin + 1 + LINK_SIZE; +SLJIT_ASSERT(ket == OP_KET || ket == OP_KETRMAX || ket == OP_KETRMIN); +SLJIT_ASSERT(!((bra == OP_BRAZERO && ket == OP_KETRMIN) || (bra == OP_BRAMINZERO && ket == OP_KETRMAX))); +cc += GET(cc, 1); + +has_alternatives = *cc == OP_ALT; +if (SLJIT_UNLIKELY(opcode == OP_COND || opcode == OP_SCOND)) + has_alternatives = (*matchingpath == OP_RREF || *matchingpath == OP_DNRREF || *matchingpath == OP_FAIL) ? FALSE : TRUE; + +if (SLJIT_UNLIKELY(opcode == OP_COND) && (*cc == OP_KETRMAX || *cc == OP_KETRMIN)) + opcode = OP_SCOND; +if (SLJIT_UNLIKELY(opcode == OP_ONCE_NC)) + opcode = OP_ONCE; + +if (opcode == OP_CBRA || opcode == OP_SCBRA) + { + /* Capturing brackets has a pre-allocated space. */ + offset = GET2(ccbegin, 1 + LINK_SIZE); + if (common->optimized_cbracket[offset] == 0) + { + private_data_ptr = OVECTOR_PRIV(offset); + offset <<= 1; + } + else + { + offset <<= 1; + private_data_ptr = OVECTOR(offset); + } + BACKTRACK_AS(bracket_backtrack)->private_data_ptr = private_data_ptr; + matchingpath += IMM2_SIZE; + } +else if (opcode == OP_ONCE || opcode == OP_SBRA || opcode == OP_SCOND) + { + /* Other brackets simply allocate the next entry. */ + private_data_ptr = PRIVATE_DATA(ccbegin); + SLJIT_ASSERT(private_data_ptr != 0); + BACKTRACK_AS(bracket_backtrack)->private_data_ptr = private_data_ptr; + if (opcode == OP_ONCE) + BACKTRACK_AS(bracket_backtrack)->u.framesize = get_framesize(common, ccbegin, NULL, FALSE, &needs_control_head); + } + +/* Instructions before the first alternative. */ +stacksize = 0; +if (ket == OP_KETRMAX || (ket == OP_KETRMIN && bra != OP_BRAMINZERO)) + stacksize++; +if (bra == OP_BRAZERO) + stacksize++; + +if (stacksize > 0) + allocate_stack(common, stacksize); + +stacksize = 0; +if (ket == OP_KETRMAX || (ket == OP_KETRMIN && bra != OP_BRAMINZERO)) + { + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), SLJIT_IMM, 0); + stacksize++; + } + +if (bra == OP_BRAZERO) + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), STR_PTR, 0); + +if (bra == OP_BRAMINZERO) + { + /* This is a backtrack path! (Since the try-path of OP_BRAMINZERO matches to the empty string) */ + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + if (ket != OP_KETRMIN) + { + free_stack(common, 1); + braminzero = CMP(SLJIT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0); + } + else + { + if (opcode == OP_ONCE || opcode >= OP_SBRA) + { + jump = CMP(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0); + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(1)); + /* Nothing stored during the first run. */ + skip = JUMP(SLJIT_JUMP); + JUMPHERE(jump); + /* Checking zero-length iteration. */ + if (opcode != OP_ONCE || BACKTRACK_AS(bracket_backtrack)->u.framesize < 0) + { + /* When we come from outside, private_data_ptr contains the previous STR_PTR. */ + braminzero = CMP(SLJIT_EQUAL, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr); + } + else + { + /* Except when the whole stack frame must be saved. */ + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr); + braminzero = CMP(SLJIT_EQUAL, STR_PTR, 0, SLJIT_MEM1(TMP1), STACK(-BACKTRACK_AS(bracket_backtrack)->u.framesize - 2)); + } + JUMPHERE(skip); + } + else + { + jump = CMP(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0); + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(1)); + JUMPHERE(jump); + } + } + } + +if (repeat_type != 0) + { + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), repeat_ptr, SLJIT_IMM, repeat_count); + if (repeat_type == OP_EXACT) + rmax_label = LABEL(); + } + +if (ket == OP_KETRMIN) + BACKTRACK_AS(bracket_backtrack)->recursive_matchingpath = LABEL(); + +if (ket == OP_KETRMAX) + { + rmax_label = LABEL(); + if (has_alternatives && opcode != OP_ONCE && opcode < OP_SBRA && repeat_type == 0) + BACKTRACK_AS(bracket_backtrack)->alternative_matchingpath = rmax_label; + } + +/* Handling capturing brackets and alternatives. */ +if (opcode == OP_ONCE) + { + stacksize = 0; + if (needs_control_head) + { + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr); + stacksize++; + } + + if (BACKTRACK_AS(bracket_backtrack)->u.framesize < 0) + { + /* Neither capturing brackets nor recursions are found in the block. */ + if (ket == OP_KETRMIN) + { + stacksize += 2; + if (!needs_control_head) + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr); + } + else + { + if (BACKTRACK_AS(bracket_backtrack)->u.framesize == no_frame) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, STACK_TOP, 0); + if (ket == OP_KETRMAX || has_alternatives) + stacksize++; + } + + if (stacksize > 0) + allocate_stack(common, stacksize); + + stacksize = 0; + if (needs_control_head) + { + stacksize++; + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP2, 0); + } + + if (ket == OP_KETRMIN) + { + if (needs_control_head) + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), STR_PTR, 0); + if (BACKTRACK_AS(bracket_backtrack)->u.framesize == no_frame) + OP2(SLJIT_ADD, SLJIT_MEM1(SLJIT_SP), private_data_ptr, STACK_TOP, 0, SLJIT_IMM, needs_control_head ? (2 * sizeof(sljit_sw)) : sizeof(sljit_sw)); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize + 1), TMP2, 0); + } + else if (ket == OP_KETRMAX || has_alternatives) + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), STR_PTR, 0); + } + else + { + if (ket != OP_KET || has_alternatives) + stacksize++; + + stacksize += BACKTRACK_AS(bracket_backtrack)->u.framesize + 1; + allocate_stack(common, stacksize); + + if (needs_control_head) + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP2, 0); + + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr); + OP2(SLJIT_ADD, TMP2, 0, STACK_TOP, 0, SLJIT_IMM, stacksize * sizeof(sljit_sw)); + + stacksize = needs_control_head ? 1 : 0; + if (ket != OP_KET || has_alternatives) + { + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), STR_PTR, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, TMP2, 0); + stacksize++; + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), TMP1, 0); + } + else + { + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, TMP2, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), TMP1, 0); + } + init_frame(common, ccbegin, NULL, BACKTRACK_AS(bracket_backtrack)->u.framesize + stacksize, stacksize + 1, FALSE); + } + } +else if (opcode == OP_CBRA || opcode == OP_SCBRA) + { + /* Saving the previous values. */ + if (common->optimized_cbracket[offset >> 1] != 0) + { + SLJIT_ASSERT(private_data_ptr == OVECTOR(offset)); + allocate_stack(common, 2); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr); + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr + sizeof(sljit_sw)); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, STR_PTR, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP1, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), TMP2, 0); + } + else + { + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr); + allocate_stack(common, 1); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, STR_PTR, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP2, 0); + } + } +else if (opcode == OP_SBRA || opcode == OP_SCOND) + { + /* Saving the previous value. */ + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr); + allocate_stack(common, 1); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, STR_PTR, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP2, 0); + } +else if (has_alternatives) + { + /* Pushing the starting string pointer. */ + allocate_stack(common, 1); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0); + } + +/* Generating code for the first alternative. */ +if (opcode == OP_COND || opcode == OP_SCOND) + { + if (*matchingpath == OP_CREF) + { + SLJIT_ASSERT(has_alternatives); + add_jump(compiler, &(BACKTRACK_AS(bracket_backtrack)->u.condfailed), + CMP(SLJIT_EQUAL, SLJIT_MEM1(SLJIT_SP), OVECTOR(GET2(matchingpath, 1) << 1), SLJIT_MEM1(SLJIT_SP), OVECTOR(1))); + matchingpath += 1 + IMM2_SIZE; + } + else if (*matchingpath == OP_DNCREF) + { + SLJIT_ASSERT(has_alternatives); + + i = GET2(matchingpath, 1 + IMM2_SIZE); + slot = common->name_table + GET2(matchingpath, 1) * common->name_entry_size; + OP1(SLJIT_MOV, TMP3, 0, STR_PTR, 0); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(1)); + OP2(SLJIT_SUB | SLJIT_SET_Z, TMP2, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(GET2(slot, 0) << 1), TMP1, 0); + slot += common->name_entry_size; + i--; + while (i-- > 0) + { + OP2(SLJIT_SUB, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(GET2(slot, 0) << 1), TMP1, 0); + OP2(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, TMP2, 0, STR_PTR, 0); + slot += common->name_entry_size; + } + OP1(SLJIT_MOV, STR_PTR, 0, TMP3, 0); + add_jump(compiler, &(BACKTRACK_AS(bracket_backtrack)->u.condfailed), JUMP(SLJIT_ZERO)); + matchingpath += 1 + 2 * IMM2_SIZE; + } + else if (*matchingpath == OP_RREF || *matchingpath == OP_DNRREF || *matchingpath == OP_FAIL) + { + /* Never has other case. */ + BACKTRACK_AS(bracket_backtrack)->u.condfailed = NULL; + SLJIT_ASSERT(!has_alternatives); + + if (*matchingpath == OP_FAIL) + stacksize = 0; + else if (*matchingpath == OP_RREF) + { + stacksize = GET2(matchingpath, 1); + if (common->currententry == NULL) + stacksize = 0; + else if (stacksize == RREF_ANY) + stacksize = 1; + else if (common->currententry->start == 0) + stacksize = stacksize == 0; + else + stacksize = stacksize == (int)GET2(common->start, common->currententry->start + 1 + LINK_SIZE); + + if (stacksize != 0) + matchingpath += 1 + IMM2_SIZE; + } + else + { + if (common->currententry == NULL || common->currententry->start == 0) + stacksize = 0; + else + { + stacksize = GET2(matchingpath, 1 + IMM2_SIZE); + slot = common->name_table + GET2(matchingpath, 1) * common->name_entry_size; + i = (int)GET2(common->start, common->currententry->start + 1 + LINK_SIZE); + while (stacksize > 0) + { + if ((int)GET2(slot, 0) == i) + break; + slot += common->name_entry_size; + stacksize--; + } + } + + if (stacksize != 0) + matchingpath += 1 + 2 * IMM2_SIZE; + } + + /* The stacksize == 0 is a common "else" case. */ + if (stacksize == 0) + { + if (*cc == OP_ALT) + { + matchingpath = cc + 1 + LINK_SIZE; + cc += GET(cc, 1); + } + else + matchingpath = cc; + } + } + else + { + SLJIT_ASSERT(has_alternatives && *matchingpath >= OP_ASSERT && *matchingpath <= OP_ASSERTBACK_NOT); + /* Similar code as PUSH_BACKTRACK macro. */ + assert = sljit_alloc_memory(compiler, sizeof(assert_backtrack)); + if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler))) + return NULL; + memset(assert, 0, sizeof(assert_backtrack)); + assert->common.cc = matchingpath; + BACKTRACK_AS(bracket_backtrack)->u.assert = assert; + matchingpath = compile_assert_matchingpath(common, matchingpath, assert, TRUE); + } + } + +compile_matchingpath(common, matchingpath, cc, backtrack); +if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler))) + return NULL; + +if (opcode == OP_ONCE) + match_once_common(common, ket, BACKTRACK_AS(bracket_backtrack)->u.framesize, private_data_ptr, has_alternatives, needs_control_head); + +stacksize = 0; +if (repeat_type == OP_MINUPTO) + { + /* We need to preserve the counter. TMP2 will be used below. */ + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), repeat_ptr); + stacksize++; + } +if (ket != OP_KET || bra != OP_BRA) + stacksize++; +if (offset != 0) + { + if (common->capture_last_ptr != 0) + stacksize++; + if (common->optimized_cbracket[offset >> 1] == 0) + stacksize += 2; + } +if (has_alternatives && opcode != OP_ONCE) + stacksize++; + +if (stacksize > 0) + allocate_stack(common, stacksize); + +stacksize = 0; +if (repeat_type == OP_MINUPTO) + { + /* TMP2 was set above. */ + OP2(SLJIT_SUB, SLJIT_MEM1(STACK_TOP), STACK(stacksize), TMP2, 0, SLJIT_IMM, 1); + stacksize++; + } + +if (ket != OP_KET || bra != OP_BRA) + { + if (ket != OP_KET) + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), STR_PTR, 0); + else + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), SLJIT_IMM, 0); + stacksize++; + } + +if (offset != 0) + stacksize = match_capture_common(common, stacksize, offset, private_data_ptr); + +if (has_alternatives) + { + if (opcode != OP_ONCE) + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), SLJIT_IMM, 0); + if (ket != OP_KETRMAX) + BACKTRACK_AS(bracket_backtrack)->alternative_matchingpath = LABEL(); + } + +/* Must be after the matchingpath label. */ +if (offset != 0 && common->optimized_cbracket[offset >> 1] != 0) + { + SLJIT_ASSERT(private_data_ptr == OVECTOR(offset + 0)); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1), STR_PTR, 0); + } + +if (ket == OP_KETRMAX) + { + if (repeat_type != 0) + { + if (has_alternatives) + BACKTRACK_AS(bracket_backtrack)->alternative_matchingpath = LABEL(); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_MEM1(SLJIT_SP), repeat_ptr, SLJIT_MEM1(SLJIT_SP), repeat_ptr, SLJIT_IMM, 1); + JUMPTO(SLJIT_NOT_ZERO, rmax_label); + /* Drop STR_PTR for greedy plus quantifier. */ + if (opcode != OP_ONCE) + free_stack(common, 1); + } + else if (opcode == OP_ONCE || opcode >= OP_SBRA) + { + if (has_alternatives) + BACKTRACK_AS(bracket_backtrack)->alternative_matchingpath = LABEL(); + /* Checking zero-length iteration. */ + if (opcode != OP_ONCE) + { + CMPTO(SLJIT_NOT_EQUAL, SLJIT_MEM1(SLJIT_SP), private_data_ptr, STR_PTR, 0, rmax_label); + /* Drop STR_PTR for greedy plus quantifier. */ + if (bra != OP_BRAZERO) + free_stack(common, 1); + } + else + /* TMP2 must contain the starting STR_PTR. */ + CMPTO(SLJIT_NOT_EQUAL, TMP2, 0, STR_PTR, 0, rmax_label); + } + else + JUMPTO(SLJIT_JUMP, rmax_label); + BACKTRACK_AS(bracket_backtrack)->recursive_matchingpath = LABEL(); + } + +if (repeat_type == OP_EXACT) + { + count_match(common); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_MEM1(SLJIT_SP), repeat_ptr, SLJIT_MEM1(SLJIT_SP), repeat_ptr, SLJIT_IMM, 1); + JUMPTO(SLJIT_NOT_ZERO, rmax_label); + } +else if (repeat_type == OP_UPTO) + { + /* We need to preserve the counter. */ + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), repeat_ptr); + allocate_stack(common, 1); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP2, 0); + } + +if (bra == OP_BRAZERO) + BACKTRACK_AS(bracket_backtrack)->zero_matchingpath = LABEL(); + +if (bra == OP_BRAMINZERO) + { + /* This is a backtrack path! (From the viewpoint of OP_BRAMINZERO) */ + JUMPTO(SLJIT_JUMP, ((braminzero_backtrack *)parent)->matchingpath); + if (braminzero != NULL) + { + JUMPHERE(braminzero); + /* We need to release the end pointer to perform the + backtrack for the zero-length iteration. When + framesize is < 0, OP_ONCE will do the release itself. */ + if (opcode == OP_ONCE && BACKTRACK_AS(bracket_backtrack)->u.framesize >= 0) + { + OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr); + add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL)); + } + else if (ket == OP_KETRMIN && opcode != OP_ONCE) + free_stack(common, 1); + } + /* Continue to the normal backtrack. */ + } + +if ((ket != OP_KET && bra != OP_BRAMINZERO) || bra == OP_BRAZERO) + count_match(common); + +/* Skip the other alternatives. */ +while (*cc == OP_ALT) + cc += GET(cc, 1); +cc += 1 + LINK_SIZE; + +if (opcode == OP_ONCE) + { + /* We temporarily encode the needs_control_head in the lowest bit. + Note: on the target architectures of SLJIT the ((x << 1) >> 1) returns + the same value for small signed numbers (including negative numbers). */ + BACKTRACK_AS(bracket_backtrack)->u.framesize = ((unsigned int)BACKTRACK_AS(bracket_backtrack)->u.framesize << 1) | (needs_control_head ? 1 : 0); + } +return cc + repeat_length; +} + +static pcre_uchar *compile_bracketpos_matchingpath(compiler_common *common, pcre_uchar *cc, backtrack_common *parent) +{ +DEFINE_COMPILER; +backtrack_common *backtrack; +pcre_uchar opcode; +int private_data_ptr; +int cbraprivptr = 0; +BOOL needs_control_head; +int framesize; +int stacksize; +int offset = 0; +BOOL zero = FALSE; +pcre_uchar *ccbegin = NULL; +int stack; /* Also contains the offset of control head. */ +struct sljit_label *loop = NULL; +struct jump_list *emptymatch = NULL; + +PUSH_BACKTRACK(sizeof(bracketpos_backtrack), cc, NULL); +if (*cc == OP_BRAPOSZERO) + { + zero = TRUE; + cc++; + } + +opcode = *cc; +private_data_ptr = PRIVATE_DATA(cc); +SLJIT_ASSERT(private_data_ptr != 0); +BACKTRACK_AS(bracketpos_backtrack)->private_data_ptr = private_data_ptr; +switch(opcode) + { + case OP_BRAPOS: + case OP_SBRAPOS: + ccbegin = cc + 1 + LINK_SIZE; + break; + + case OP_CBRAPOS: + case OP_SCBRAPOS: + offset = GET2(cc, 1 + LINK_SIZE); + /* This case cannot be optimized in the same was as + normal capturing brackets. */ + SLJIT_ASSERT(common->optimized_cbracket[offset] == 0); + cbraprivptr = OVECTOR_PRIV(offset); + offset <<= 1; + ccbegin = cc + 1 + LINK_SIZE + IMM2_SIZE; + break; + + default: + SLJIT_UNREACHABLE(); + break; + } + +framesize = get_framesize(common, cc, NULL, FALSE, &needs_control_head); +BACKTRACK_AS(bracketpos_backtrack)->framesize = framesize; +if (framesize < 0) + { + if (offset != 0) + { + stacksize = 2; + if (common->capture_last_ptr != 0) + stacksize++; + } + else + stacksize = 1; + + if (needs_control_head) + stacksize++; + if (!zero) + stacksize++; + + BACKTRACK_AS(bracketpos_backtrack)->stacksize = stacksize; + allocate_stack(common, stacksize); + if (framesize == no_frame) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, STACK_TOP, 0); + + stack = 0; + if (offset != 0) + { + stack = 2; + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset)); + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1)); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP1, 0); + if (common->capture_last_ptr != 0) + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->capture_last_ptr); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), TMP2, 0); + if (needs_control_head) + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr); + if (common->capture_last_ptr != 0) + { + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(2), TMP1, 0); + stack = 3; + } + } + else + { + if (needs_control_head) + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0); + stack = 1; + } + + if (needs_control_head) + stack++; + if (!zero) + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stack), SLJIT_IMM, 1); + if (needs_control_head) + { + stack--; + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stack), TMP2, 0); + } + } +else + { + stacksize = framesize + 1; + if (!zero) + stacksize++; + if (needs_control_head) + stacksize++; + if (offset == 0) + stacksize++; + BACKTRACK_AS(bracketpos_backtrack)->stacksize = stacksize; + + allocate_stack(common, stacksize); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr); + if (needs_control_head) + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr); + OP2(SLJIT_ADD, SLJIT_MEM1(SLJIT_SP), private_data_ptr, STACK_TOP, 0, SLJIT_IMM, stacksize * sizeof(sljit_sw)); + + stack = 0; + if (!zero) + { + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 1); + stack = 1; + } + if (needs_control_head) + { + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stack), TMP2, 0); + stack++; + } + if (offset == 0) + { + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stack), STR_PTR, 0); + stack++; + } + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stack), TMP1, 0); + init_frame(common, cc, NULL, stacksize - 1, stacksize - framesize, FALSE); + stack -= 1 + (offset == 0); + } + +if (offset != 0) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), cbraprivptr, STR_PTR, 0); + +loop = LABEL(); +while (*cc != OP_KETRPOS) + { + backtrack->top = NULL; + backtrack->topbacktracks = NULL; + cc += GET(cc, 1); + + compile_matchingpath(common, ccbegin, cc, backtrack); + if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler))) + return NULL; + + if (framesize < 0) + { + if (framesize == no_frame) + OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr); + + if (offset != 0) + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), cbraprivptr); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1), STR_PTR, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), cbraprivptr, STR_PTR, 0); + if (common->capture_last_ptr != 0) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->capture_last_ptr, SLJIT_IMM, offset >> 1); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset), TMP1, 0); + } + else + { + if (opcode == OP_SBRAPOS) + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0); + } + + /* Even if the match is empty, we need to reset the control head. */ + if (needs_control_head) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_MEM1(STACK_TOP), STACK(stack)); + + if (opcode == OP_SBRAPOS || opcode == OP_SCBRAPOS) + add_jump(compiler, &emptymatch, CMP(SLJIT_EQUAL, TMP1, 0, STR_PTR, 0)); + + if (!zero) + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize - 1), SLJIT_IMM, 0); + } + else + { + if (offset != 0) + { + OP2(SLJIT_SUB, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_IMM, stacksize * sizeof(sljit_sw)); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), cbraprivptr); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1), STR_PTR, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), cbraprivptr, STR_PTR, 0); + if (common->capture_last_ptr != 0) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->capture_last_ptr, SLJIT_IMM, offset >> 1); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset), TMP1, 0); + } + else + { + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr); + OP2(SLJIT_SUB, STACK_TOP, 0, TMP2, 0, SLJIT_IMM, stacksize * sizeof(sljit_sw)); + if (opcode == OP_SBRAPOS) + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP2), STACK(-framesize - 2)); + OP1(SLJIT_MOV, SLJIT_MEM1(TMP2), STACK(-framesize - 2), STR_PTR, 0); + } + + /* Even if the match is empty, we need to reset the control head. */ + if (needs_control_head) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_MEM1(STACK_TOP), STACK(stack)); + + if (opcode == OP_SBRAPOS || opcode == OP_SCBRAPOS) + add_jump(compiler, &emptymatch, CMP(SLJIT_EQUAL, TMP1, 0, STR_PTR, 0)); + + if (!zero) + { + if (framesize < 0) + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize - 1), SLJIT_IMM, 0); + else + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0); + } + } + + JUMPTO(SLJIT_JUMP, loop); + flush_stubs(common); + + compile_backtrackingpath(common, backtrack->top); + if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler))) + return NULL; + set_jumps(backtrack->topbacktracks, LABEL()); + + if (framesize < 0) + { + if (offset != 0) + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), cbraprivptr); + else + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + } + else + { + if (offset != 0) + { + /* Last alternative. */ + if (*cc == OP_KETRPOS) + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr); + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), cbraprivptr); + } + else + { + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr); + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(TMP2), STACK(-framesize - 2)); + } + } + + if (*cc == OP_KETRPOS) + break; + ccbegin = cc + 1 + LINK_SIZE; + } + +/* We don't have to restore the control head in case of a failed match. */ + +backtrack->topbacktracks = NULL; +if (!zero) + { + if (framesize < 0) + add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_NOT_EQUAL, SLJIT_MEM1(STACK_TOP), STACK(stacksize - 1), SLJIT_IMM, 0)); + else /* TMP2 is set to [private_data_ptr] above. */ + add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_NOT_EQUAL, SLJIT_MEM1(TMP2), STACK(-stacksize), SLJIT_IMM, 0)); + } + +/* None of them matched. */ +set_jumps(emptymatch, LABEL()); +count_match(common); +return cc + 1 + LINK_SIZE; +} + +static SLJIT_INLINE pcre_uchar *get_iterator_parameters(compiler_common *common, pcre_uchar *cc, pcre_uchar *opcode, pcre_uchar *type, sljit_u32 *max, sljit_u32 *exact, pcre_uchar **end) +{ +int class_len; + +*opcode = *cc; +*exact = 0; + +if (*opcode >= OP_STAR && *opcode <= OP_POSUPTO) + { + cc++; + *type = OP_CHAR; + } +else if (*opcode >= OP_STARI && *opcode <= OP_POSUPTOI) + { + cc++; + *type = OP_CHARI; + *opcode -= OP_STARI - OP_STAR; + } +else if (*opcode >= OP_NOTSTAR && *opcode <= OP_NOTPOSUPTO) + { + cc++; + *type = OP_NOT; + *opcode -= OP_NOTSTAR - OP_STAR; + } +else if (*opcode >= OP_NOTSTARI && *opcode <= OP_NOTPOSUPTOI) + { + cc++; + *type = OP_NOTI; + *opcode -= OP_NOTSTARI - OP_STAR; + } +else if (*opcode >= OP_TYPESTAR && *opcode <= OP_TYPEPOSUPTO) + { + cc++; + *opcode -= OP_TYPESTAR - OP_STAR; + *type = OP_END; + } +else + { + SLJIT_ASSERT(*opcode == OP_CLASS || *opcode == OP_NCLASS || *opcode == OP_XCLASS); + *type = *opcode; + cc++; + class_len = (*type < OP_XCLASS) ? (int)(1 + (32 / sizeof(pcre_uchar))) : GET(cc, 0); + *opcode = cc[class_len - 1]; + + if (*opcode >= OP_CRSTAR && *opcode <= OP_CRMINQUERY) + { + *opcode -= OP_CRSTAR - OP_STAR; + *end = cc + class_len; + + if (*opcode == OP_PLUS || *opcode == OP_MINPLUS) + { + *exact = 1; + *opcode -= OP_PLUS - OP_STAR; + } + } + else if (*opcode >= OP_CRPOSSTAR && *opcode <= OP_CRPOSQUERY) + { + *opcode -= OP_CRPOSSTAR - OP_POSSTAR; + *end = cc + class_len; + + if (*opcode == OP_POSPLUS) + { + *exact = 1; + *opcode = OP_POSSTAR; + } + } + else + { + SLJIT_ASSERT(*opcode == OP_CRRANGE || *opcode == OP_CRMINRANGE || *opcode == OP_CRPOSRANGE); + *max = GET2(cc, (class_len + IMM2_SIZE)); + *exact = GET2(cc, class_len); + + if (*max == 0) + { + if (*opcode == OP_CRPOSRANGE) + *opcode = OP_POSSTAR; + else + *opcode -= OP_CRRANGE - OP_STAR; + } + else + { + *max -= *exact; + if (*max == 0) + *opcode = OP_EXACT; + else if (*max == 1) + { + if (*opcode == OP_CRPOSRANGE) + *opcode = OP_POSQUERY; + else + *opcode -= OP_CRRANGE - OP_QUERY; + } + else + { + if (*opcode == OP_CRPOSRANGE) + *opcode = OP_POSUPTO; + else + *opcode -= OP_CRRANGE - OP_UPTO; + } + } + *end = cc + class_len + 2 * IMM2_SIZE; + } + return cc; + } + +switch(*opcode) + { + case OP_EXACT: + *exact = GET2(cc, 0); + cc += IMM2_SIZE; + break; + + case OP_PLUS: + case OP_MINPLUS: + *exact = 1; + *opcode -= OP_PLUS - OP_STAR; + break; + + case OP_POSPLUS: + *exact = 1; + *opcode = OP_POSSTAR; + break; + + case OP_UPTO: + case OP_MINUPTO: + case OP_POSUPTO: + *max = GET2(cc, 0); + cc += IMM2_SIZE; + break; + } + +if (*type == OP_END) + { + *type = *cc; + *end = next_opcode(common, cc); + cc++; + return cc; + } + +*end = cc + 1; +#ifdef SUPPORT_UTF +if (common->utf && HAS_EXTRALEN(*cc)) *end += GET_EXTRALEN(*cc); +#endif +return cc; +} + +static pcre_uchar *compile_iterator_matchingpath(compiler_common *common, pcre_uchar *cc, backtrack_common *parent) +{ +DEFINE_COMPILER; +backtrack_common *backtrack; +pcre_uchar opcode; +pcre_uchar type; +sljit_u32 max = 0, exact; +BOOL fast_fail; +sljit_s32 fast_str_ptr; +BOOL charpos_enabled; +pcre_uchar charpos_char; +unsigned int charpos_othercasebit; +pcre_uchar *end; +jump_list *no_match = NULL; +jump_list *no_char1_match = NULL; +struct sljit_jump *jump = NULL; +struct sljit_label *label; +int private_data_ptr = PRIVATE_DATA(cc); +int base = (private_data_ptr == 0) ? SLJIT_MEM1(STACK_TOP) : SLJIT_MEM1(SLJIT_SP); +int offset0 = (private_data_ptr == 0) ? STACK(0) : private_data_ptr; +int offset1 = (private_data_ptr == 0) ? STACK(1) : private_data_ptr + (int)sizeof(sljit_sw); +int tmp_base, tmp_offset; + +PUSH_BACKTRACK(sizeof(char_iterator_backtrack), cc, NULL); + +fast_str_ptr = PRIVATE_DATA(cc + 1); +fast_fail = TRUE; + +SLJIT_ASSERT(common->fast_forward_bc_ptr == NULL || fast_str_ptr == 0 || cc == common->fast_forward_bc_ptr); + +if (cc == common->fast_forward_bc_ptr) + fast_fail = FALSE; +else if (common->fast_fail_start_ptr == 0) + fast_str_ptr = 0; + +SLJIT_ASSERT(common->fast_forward_bc_ptr != NULL || fast_str_ptr == 0 + || (fast_str_ptr >= common->fast_fail_start_ptr && fast_str_ptr <= common->fast_fail_end_ptr)); + +cc = get_iterator_parameters(common, cc, &opcode, &type, &max, &exact, &end); + +if (type != OP_EXTUNI) + { + tmp_base = TMP3; + tmp_offset = 0; + } +else + { + tmp_base = SLJIT_MEM1(SLJIT_SP); + tmp_offset = POSSESSIVE0; + } + +if (fast_fail && fast_str_ptr != 0) + add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), fast_str_ptr)); + +/* Handle fixed part first. */ +if (exact > 1) + { + SLJIT_ASSERT(fast_str_ptr == 0); + if (common->mode == JIT_COMPILE +#ifdef SUPPORT_UTF + && !common->utf +#endif + && type != OP_ANYNL && type != OP_EXTUNI) + { + OP2(SLJIT_ADD, TMP1, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(exact)); + add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_GREATER, TMP1, 0, STR_END, 0)); + OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, exact); + label = LABEL(); + compile_char1_matchingpath(common, type, cc, &backtrack->topbacktracks, FALSE); + OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1); + JUMPTO(SLJIT_NOT_ZERO, label); + } + else + { + OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, exact); + label = LABEL(); + compile_char1_matchingpath(common, type, cc, &backtrack->topbacktracks, TRUE); + OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1); + JUMPTO(SLJIT_NOT_ZERO, label); + } + } +else if (exact == 1) + compile_char1_matchingpath(common, type, cc, &backtrack->topbacktracks, TRUE); + +switch(opcode) + { + case OP_STAR: + case OP_UPTO: + SLJIT_ASSERT(fast_str_ptr == 0 || opcode == OP_STAR); + + if (type == OP_ANYNL || type == OP_EXTUNI) + { + SLJIT_ASSERT(private_data_ptr == 0); + SLJIT_ASSERT(fast_str_ptr == 0); + + allocate_stack(common, 2); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, 0); + + if (opcode == OP_UPTO) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), POSSESSIVE0, SLJIT_IMM, max); + + label = LABEL(); + compile_char1_matchingpath(common, type, cc, &BACKTRACK_AS(char_iterator_backtrack)->u.backtracks, TRUE); + if (opcode == OP_UPTO) + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), POSSESSIVE0); + OP2(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, TMP1, 0, SLJIT_IMM, 1); + jump = JUMP(SLJIT_ZERO); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), POSSESSIVE0, TMP1, 0); + } + + /* We cannot use TMP3 because of this allocate_stack. */ + allocate_stack(common, 1); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0); + JUMPTO(SLJIT_JUMP, label); + if (jump != NULL) + JUMPHERE(jump); + } + else + { + charpos_enabled = FALSE; + charpos_char = 0; + charpos_othercasebit = 0; + + if ((type != OP_CHAR && type != OP_CHARI) && (*end == OP_CHAR || *end == OP_CHARI)) + { + charpos_enabled = TRUE; +#ifdef SUPPORT_UTF + charpos_enabled = !common->utf || !HAS_EXTRALEN(end[1]); +#endif + if (charpos_enabled && *end == OP_CHARI && char_has_othercase(common, end + 1)) + { + charpos_othercasebit = char_get_othercase_bit(common, end + 1); + if (charpos_othercasebit == 0) + charpos_enabled = FALSE; + } + + if (charpos_enabled) + { + charpos_char = end[1]; + /* Consumpe the OP_CHAR opcode. */ + end += 2; +#if defined COMPILE_PCRE8 + SLJIT_ASSERT((charpos_othercasebit >> 8) == 0); +#elif defined COMPILE_PCRE16 || defined COMPILE_PCRE32 + SLJIT_ASSERT((charpos_othercasebit >> 9) == 0); + if ((charpos_othercasebit & 0x100) != 0) + charpos_othercasebit = (charpos_othercasebit & 0xff) << 8; +#endif + if (charpos_othercasebit != 0) + charpos_char |= charpos_othercasebit; + + BACKTRACK_AS(char_iterator_backtrack)->u.charpos.enabled = TRUE; + BACKTRACK_AS(char_iterator_backtrack)->u.charpos.chr = charpos_char; + BACKTRACK_AS(char_iterator_backtrack)->u.charpos.othercasebit = charpos_othercasebit; + } + } + + if (charpos_enabled) + { + if (opcode == OP_UPTO) + OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, max + 1); + + /* Search the first instance of charpos_char. */ + jump = JUMP(SLJIT_JUMP); + label = LABEL(); + if (opcode == OP_UPTO) + { + OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1); + add_jump(compiler, &backtrack->topbacktracks, JUMP(SLJIT_ZERO)); + } + compile_char1_matchingpath(common, type, cc, &backtrack->topbacktracks, FALSE); + if (fast_str_ptr != 0) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0); + JUMPHERE(jump); + + detect_partial_match(common, &backtrack->topbacktracks); + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0)); + if (charpos_othercasebit != 0) + OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, charpos_othercasebit); + CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, charpos_char, label); + + if (private_data_ptr == 0) + allocate_stack(common, 2); + OP1(SLJIT_MOV, base, offset0, STR_PTR, 0); + OP1(SLJIT_MOV, base, offset1, STR_PTR, 0); + if (opcode == OP_UPTO) + { + OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1); + add_jump(compiler, &no_match, JUMP(SLJIT_ZERO)); + } + + /* Search the last instance of charpos_char. */ + label = LABEL(); + compile_char1_matchingpath(common, type, cc, &no_match, FALSE); + if (fast_str_ptr != 0) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0); + detect_partial_match(common, &no_match); + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0)); + if (charpos_othercasebit != 0) + OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, charpos_othercasebit); + if (opcode == OP_STAR) + { + CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, charpos_char, label); + OP1(SLJIT_MOV, base, offset0, STR_PTR, 0); + } + else + { + jump = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, charpos_char); + OP1(SLJIT_MOV, base, offset0, STR_PTR, 0); + JUMPHERE(jump); + } + + if (opcode == OP_UPTO) + { + OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1); + JUMPTO(SLJIT_NOT_ZERO, label); + } + else + JUMPTO(SLJIT_JUMP, label); + + set_jumps(no_match, LABEL()); + OP1(SLJIT_MOV, STR_PTR, 0, base, offset0); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + OP1(SLJIT_MOV, base, offset0, STR_PTR, 0); + } +#if defined SUPPORT_UTF && !defined COMPILE_PCRE32 + else if (common->utf) + { + if (private_data_ptr == 0) + allocate_stack(common, 2); + + OP1(SLJIT_MOV, base, offset0, STR_PTR, 0); + OP1(SLJIT_MOV, base, offset1, STR_PTR, 0); + + if (opcode == OP_UPTO) + OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, max); + + label = LABEL(); + compile_char1_matchingpath(common, type, cc, &no_match, TRUE); + OP1(SLJIT_MOV, base, offset0, STR_PTR, 0); + + if (opcode == OP_UPTO) + { + OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1); + JUMPTO(SLJIT_NOT_ZERO, label); + } + else + JUMPTO(SLJIT_JUMP, label); + + set_jumps(no_match, LABEL()); + OP1(SLJIT_MOV, STR_PTR, 0, base, offset0); + if (fast_str_ptr != 0) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0); + } +#endif + else + { + if (private_data_ptr == 0) + allocate_stack(common, 2); + + OP1(SLJIT_MOV, base, offset1, STR_PTR, 0); + if (opcode == OP_UPTO) + OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, max); + + label = LABEL(); + detect_partial_match(common, &no_match); + compile_char1_matchingpath(common, type, cc, &no_char1_match, FALSE); + if (opcode == OP_UPTO) + { + OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1); + JUMPTO(SLJIT_NOT_ZERO, label); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + } + else + JUMPTO(SLJIT_JUMP, label); + + set_jumps(no_char1_match, LABEL()); + OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + set_jumps(no_match, LABEL()); + OP1(SLJIT_MOV, base, offset0, STR_PTR, 0); + if (fast_str_ptr != 0) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0); + } + } + BACKTRACK_AS(char_iterator_backtrack)->matchingpath = LABEL(); + break; + + case OP_MINSTAR: + if (private_data_ptr == 0) + allocate_stack(common, 1); + OP1(SLJIT_MOV, base, offset0, STR_PTR, 0); + BACKTRACK_AS(char_iterator_backtrack)->matchingpath = LABEL(); + if (fast_str_ptr != 0) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0); + break; + + case OP_MINUPTO: + SLJIT_ASSERT(fast_str_ptr == 0); + if (private_data_ptr == 0) + allocate_stack(common, 2); + OP1(SLJIT_MOV, base, offset0, STR_PTR, 0); + OP1(SLJIT_MOV, base, offset1, SLJIT_IMM, max + 1); + BACKTRACK_AS(char_iterator_backtrack)->matchingpath = LABEL(); + break; + + case OP_QUERY: + case OP_MINQUERY: + SLJIT_ASSERT(fast_str_ptr == 0); + if (private_data_ptr == 0) + allocate_stack(common, 1); + OP1(SLJIT_MOV, base, offset0, STR_PTR, 0); + if (opcode == OP_QUERY) + compile_char1_matchingpath(common, type, cc, &BACKTRACK_AS(char_iterator_backtrack)->u.backtracks, TRUE); + BACKTRACK_AS(char_iterator_backtrack)->matchingpath = LABEL(); + break; + + case OP_EXACT: + break; + + case OP_POSSTAR: +#if defined SUPPORT_UTF && !defined COMPILE_PCRE32 + if (common->utf) + { + OP1(SLJIT_MOV, tmp_base, tmp_offset, STR_PTR, 0); + label = LABEL(); + compile_char1_matchingpath(common, type, cc, &no_match, TRUE); + OP1(SLJIT_MOV, tmp_base, tmp_offset, STR_PTR, 0); + JUMPTO(SLJIT_JUMP, label); + set_jumps(no_match, LABEL()); + OP1(SLJIT_MOV, STR_PTR, 0, tmp_base, tmp_offset); + if (fast_str_ptr != 0) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0); + break; + } +#endif + label = LABEL(); + detect_partial_match(common, &no_match); + compile_char1_matchingpath(common, type, cc, &no_char1_match, FALSE); + JUMPTO(SLJIT_JUMP, label); + set_jumps(no_char1_match, LABEL()); + OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + set_jumps(no_match, LABEL()); + if (fast_str_ptr != 0) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0); + break; + + case OP_POSUPTO: + SLJIT_ASSERT(fast_str_ptr == 0); +#if defined SUPPORT_UTF && !defined COMPILE_PCRE32 + if (common->utf) + { + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), POSSESSIVE1, STR_PTR, 0); + OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, max); + label = LABEL(); + compile_char1_matchingpath(common, type, cc, &no_match, TRUE); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), POSSESSIVE1, STR_PTR, 0); + OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1); + JUMPTO(SLJIT_NOT_ZERO, label); + set_jumps(no_match, LABEL()); + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), POSSESSIVE1); + break; + } +#endif + OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, max); + label = LABEL(); + detect_partial_match(common, &no_match); + compile_char1_matchingpath(common, type, cc, &no_char1_match, FALSE); + OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1); + JUMPTO(SLJIT_NOT_ZERO, label); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + set_jumps(no_char1_match, LABEL()); + OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + set_jumps(no_match, LABEL()); + break; + + case OP_POSQUERY: + SLJIT_ASSERT(fast_str_ptr == 0); + OP1(SLJIT_MOV, tmp_base, tmp_offset, STR_PTR, 0); + compile_char1_matchingpath(common, type, cc, &no_match, TRUE); + OP1(SLJIT_MOV, tmp_base, tmp_offset, STR_PTR, 0); + set_jumps(no_match, LABEL()); + OP1(SLJIT_MOV, STR_PTR, 0, tmp_base, tmp_offset); + break; + + default: + SLJIT_UNREACHABLE(); + break; + } + +count_match(common); +return end; +} + +static SLJIT_INLINE pcre_uchar *compile_fail_accept_matchingpath(compiler_common *common, pcre_uchar *cc, backtrack_common *parent) +{ +DEFINE_COMPILER; +backtrack_common *backtrack; + +PUSH_BACKTRACK(sizeof(backtrack_common), cc, NULL); + +if (*cc == OP_FAIL) + { + add_jump(compiler, &backtrack->topbacktracks, JUMP(SLJIT_JUMP)); + return cc + 1; + } + +if (*cc == OP_ASSERT_ACCEPT || common->currententry != NULL || !common->might_be_empty) + { + /* No need to check notempty conditions. */ + if (common->accept_label == NULL) + add_jump(compiler, &common->accept, JUMP(SLJIT_JUMP)); + else + JUMPTO(SLJIT_JUMP, common->accept_label); + return cc + 1; + } + +if (common->accept_label == NULL) + add_jump(compiler, &common->accept, CMP(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(0))); +else + CMPTO(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(0), common->accept_label); +OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0); +OP1(SLJIT_MOV_U8, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, notempty)); +add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_NOT_EQUAL, TMP2, 0, SLJIT_IMM, 0)); +OP1(SLJIT_MOV_U8, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, notempty_atstart)); +if (common->accept_label == NULL) + add_jump(compiler, &common->accept, CMP(SLJIT_EQUAL, TMP2, 0, SLJIT_IMM, 0)); +else + CMPTO(SLJIT_EQUAL, TMP2, 0, SLJIT_IMM, 0, common->accept_label); +OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, str)); +if (common->accept_label == NULL) + add_jump(compiler, &common->accept, CMP(SLJIT_NOT_EQUAL, TMP2, 0, STR_PTR, 0)); +else + CMPTO(SLJIT_NOT_EQUAL, TMP2, 0, STR_PTR, 0, common->accept_label); +add_jump(compiler, &backtrack->topbacktracks, JUMP(SLJIT_JUMP)); +return cc + 1; +} + +static SLJIT_INLINE pcre_uchar *compile_close_matchingpath(compiler_common *common, pcre_uchar *cc) +{ +DEFINE_COMPILER; +int offset = GET2(cc, 1); +BOOL optimized_cbracket = common->optimized_cbracket[offset] != 0; + +/* Data will be discarded anyway... */ +if (common->currententry != NULL) + return cc + 1 + IMM2_SIZE; + +if (!optimized_cbracket) + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR_PRIV(offset)); +offset <<= 1; +OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1), STR_PTR, 0); +if (!optimized_cbracket) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset), TMP1, 0); +return cc + 1 + IMM2_SIZE; +} + +static SLJIT_INLINE pcre_uchar *compile_control_verb_matchingpath(compiler_common *common, pcre_uchar *cc, backtrack_common *parent) +{ +DEFINE_COMPILER; +backtrack_common *backtrack; +pcre_uchar opcode = *cc; +pcre_uchar *ccend = cc + 1; + +if (opcode == OP_PRUNE_ARG || opcode == OP_SKIP_ARG || opcode == OP_THEN_ARG) + ccend += 2 + cc[1]; + +PUSH_BACKTRACK(sizeof(backtrack_common), cc, NULL); + +if (opcode == OP_SKIP) + { + allocate_stack(common, 1); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0); + return ccend; + } + +if (opcode == OP_PRUNE_ARG || opcode == OP_THEN_ARG) + { + OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0); + OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, (sljit_sw)(cc + 2)); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->mark_ptr, TMP2, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, mark_ptr), TMP2, 0); + } + +return ccend; +} + +static pcre_uchar then_trap_opcode[1] = { OP_THEN_TRAP }; + +static SLJIT_INLINE void compile_then_trap_matchingpath(compiler_common *common, pcre_uchar *cc, pcre_uchar *ccend, backtrack_common *parent) +{ +DEFINE_COMPILER; +backtrack_common *backtrack; +BOOL needs_control_head; +int size; + +PUSH_BACKTRACK_NOVALUE(sizeof(then_trap_backtrack), cc); +common->then_trap = BACKTRACK_AS(then_trap_backtrack); +BACKTRACK_AS(then_trap_backtrack)->common.cc = then_trap_opcode; +BACKTRACK_AS(then_trap_backtrack)->start = (sljit_sw)(cc - common->start); +BACKTRACK_AS(then_trap_backtrack)->framesize = get_framesize(common, cc, ccend, FALSE, &needs_control_head); + +size = BACKTRACK_AS(then_trap_backtrack)->framesize; +size = 3 + (size < 0 ? 0 : size); + +OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr); +allocate_stack(common, size); +if (size > 3) + OP2(SLJIT_ADD, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, STACK_TOP, 0, SLJIT_IMM, (size - 3) * sizeof(sljit_sw)); +else + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, STACK_TOP, 0); +OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(size - 1), SLJIT_IMM, BACKTRACK_AS(then_trap_backtrack)->start); +OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(size - 2), SLJIT_IMM, type_then_trap); +OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(size - 3), TMP2, 0); + +size = BACKTRACK_AS(then_trap_backtrack)->framesize; +if (size >= 0) + init_frame(common, cc, ccend, size - 1, 0, FALSE); +} + +static void compile_matchingpath(compiler_common *common, pcre_uchar *cc, pcre_uchar *ccend, backtrack_common *parent) +{ +DEFINE_COMPILER; +backtrack_common *backtrack; +BOOL has_then_trap = FALSE; +then_trap_backtrack *save_then_trap = NULL; + +SLJIT_ASSERT(*ccend == OP_END || (*ccend >= OP_ALT && *ccend <= OP_KETRPOS)); + +if (common->has_then && common->then_offsets[cc - common->start] != 0) + { + SLJIT_ASSERT(*ccend != OP_END && common->control_head_ptr != 0); + has_then_trap = TRUE; + save_then_trap = common->then_trap; + /* Tail item on backtrack. */ + compile_then_trap_matchingpath(common, cc, ccend, parent); + } + +while (cc < ccend) + { + switch(*cc) + { + case OP_SOD: + case OP_SOM: + case OP_NOT_WORD_BOUNDARY: + case OP_WORD_BOUNDARY: + case OP_EODN: + case OP_EOD: + case OP_DOLL: + case OP_DOLLM: + case OP_CIRC: + case OP_CIRCM: + case OP_REVERSE: + cc = compile_simple_assertion_matchingpath(common, *cc, cc + 1, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks); + break; + + case OP_NOT_DIGIT: + case OP_DIGIT: + case OP_NOT_WHITESPACE: + case OP_WHITESPACE: + case OP_NOT_WORDCHAR: + case OP_WORDCHAR: + case OP_ANY: + case OP_ALLANY: + case OP_ANYBYTE: + case OP_NOTPROP: + case OP_PROP: + case OP_ANYNL: + case OP_NOT_HSPACE: + case OP_HSPACE: + case OP_NOT_VSPACE: + case OP_VSPACE: + case OP_EXTUNI: + case OP_NOT: + case OP_NOTI: + cc = compile_char1_matchingpath(common, *cc, cc + 1, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks, TRUE); + break; + + case OP_SET_SOM: + PUSH_BACKTRACK_NOVALUE(sizeof(backtrack_common), cc); + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(0)); + allocate_stack(common, 1); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(0), STR_PTR, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP2, 0); + cc++; + break; + + case OP_CHAR: + case OP_CHARI: + if (common->mode == JIT_COMPILE) + cc = compile_charn_matchingpath(common, cc, ccend, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks); + else + cc = compile_char1_matchingpath(common, *cc, cc + 1, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks, TRUE); + break; + + case OP_STAR: + case OP_MINSTAR: + case OP_PLUS: + case OP_MINPLUS: + case OP_QUERY: + case OP_MINQUERY: + case OP_UPTO: + case OP_MINUPTO: + case OP_EXACT: + case OP_POSSTAR: + case OP_POSPLUS: + case OP_POSQUERY: + case OP_POSUPTO: + case OP_STARI: + case OP_MINSTARI: + case OP_PLUSI: + case OP_MINPLUSI: + case OP_QUERYI: + case OP_MINQUERYI: + case OP_UPTOI: + case OP_MINUPTOI: + case OP_EXACTI: + case OP_POSSTARI: + case OP_POSPLUSI: + case OP_POSQUERYI: + case OP_POSUPTOI: + case OP_NOTSTAR: + case OP_NOTMINSTAR: + case OP_NOTPLUS: + case OP_NOTMINPLUS: + case OP_NOTQUERY: + case OP_NOTMINQUERY: + case OP_NOTUPTO: + case OP_NOTMINUPTO: + case OP_NOTEXACT: + case OP_NOTPOSSTAR: + case OP_NOTPOSPLUS: + case OP_NOTPOSQUERY: + case OP_NOTPOSUPTO: + case OP_NOTSTARI: + case OP_NOTMINSTARI: + case OP_NOTPLUSI: + case OP_NOTMINPLUSI: + case OP_NOTQUERYI: + case OP_NOTMINQUERYI: + case OP_NOTUPTOI: + case OP_NOTMINUPTOI: + case OP_NOTEXACTI: + case OP_NOTPOSSTARI: + case OP_NOTPOSPLUSI: + case OP_NOTPOSQUERYI: + case OP_NOTPOSUPTOI: + case OP_TYPESTAR: + case OP_TYPEMINSTAR: + case OP_TYPEPLUS: + case OP_TYPEMINPLUS: + case OP_TYPEQUERY: + case OP_TYPEMINQUERY: + case OP_TYPEUPTO: + case OP_TYPEMINUPTO: + case OP_TYPEEXACT: + case OP_TYPEPOSSTAR: + case OP_TYPEPOSPLUS: + case OP_TYPEPOSQUERY: + case OP_TYPEPOSUPTO: + cc = compile_iterator_matchingpath(common, cc, parent); + break; + + case OP_CLASS: + case OP_NCLASS: + if (cc[1 + (32 / sizeof(pcre_uchar))] >= OP_CRSTAR && cc[1 + (32 / sizeof(pcre_uchar))] <= OP_CRPOSRANGE) + cc = compile_iterator_matchingpath(common, cc, parent); + else + cc = compile_char1_matchingpath(common, *cc, cc + 1, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks, TRUE); + break; + +#if defined SUPPORT_UTF || defined COMPILE_PCRE16 || defined COMPILE_PCRE32 + case OP_XCLASS: + if (*(cc + GET(cc, 1)) >= OP_CRSTAR && *(cc + GET(cc, 1)) <= OP_CRPOSRANGE) + cc = compile_iterator_matchingpath(common, cc, parent); + else + cc = compile_char1_matchingpath(common, *cc, cc + 1, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks, TRUE); + break; +#endif + + case OP_REF: + case OP_REFI: + if (cc[1 + IMM2_SIZE] >= OP_CRSTAR && cc[1 + IMM2_SIZE] <= OP_CRPOSRANGE) + cc = compile_ref_iterator_matchingpath(common, cc, parent); + else + { + compile_ref_matchingpath(common, cc, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks, TRUE, FALSE); + cc += 1 + IMM2_SIZE; + } + break; + + case OP_DNREF: + case OP_DNREFI: + if (cc[1 + 2 * IMM2_SIZE] >= OP_CRSTAR && cc[1 + 2 * IMM2_SIZE] <= OP_CRPOSRANGE) + cc = compile_ref_iterator_matchingpath(common, cc, parent); + else + { + compile_dnref_search(common, cc, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks); + compile_ref_matchingpath(common, cc, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks, TRUE, FALSE); + cc += 1 + 2 * IMM2_SIZE; + } + break; + + case OP_RECURSE: + cc = compile_recurse_matchingpath(common, cc, parent); + break; + + case OP_CALLOUT: + cc = compile_callout_matchingpath(common, cc, parent); + break; + + case OP_ASSERT: + case OP_ASSERT_NOT: + case OP_ASSERTBACK: + case OP_ASSERTBACK_NOT: + PUSH_BACKTRACK_NOVALUE(sizeof(assert_backtrack), cc); + cc = compile_assert_matchingpath(common, cc, BACKTRACK_AS(assert_backtrack), FALSE); + break; + + case OP_BRAMINZERO: + PUSH_BACKTRACK_NOVALUE(sizeof(braminzero_backtrack), cc); + cc = bracketend(cc + 1); + if (*(cc - 1 - LINK_SIZE) != OP_KETRMIN) + { + allocate_stack(common, 1); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0); + } + else + { + allocate_stack(common, 2); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), STR_PTR, 0); + } + BACKTRACK_AS(braminzero_backtrack)->matchingpath = LABEL(); + count_match(common); + break; + + case OP_ONCE: + case OP_ONCE_NC: + case OP_BRA: + case OP_CBRA: + case OP_COND: + case OP_SBRA: + case OP_SCBRA: + case OP_SCOND: + cc = compile_bracket_matchingpath(common, cc, parent); + break; + + case OP_BRAZERO: + if (cc[1] > OP_ASSERTBACK_NOT) + cc = compile_bracket_matchingpath(common, cc, parent); + else + { + PUSH_BACKTRACK_NOVALUE(sizeof(assert_backtrack), cc); + cc = compile_assert_matchingpath(common, cc, BACKTRACK_AS(assert_backtrack), FALSE); + } + break; + + case OP_BRAPOS: + case OP_CBRAPOS: + case OP_SBRAPOS: + case OP_SCBRAPOS: + case OP_BRAPOSZERO: + cc = compile_bracketpos_matchingpath(common, cc, parent); + break; + + case OP_MARK: + PUSH_BACKTRACK_NOVALUE(sizeof(backtrack_common), cc); + SLJIT_ASSERT(common->mark_ptr != 0); + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), common->mark_ptr); + allocate_stack(common, common->has_skip_arg ? 5 : 1); + OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(common->has_skip_arg ? 4 : 0), TMP2, 0); + OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, (sljit_sw)(cc + 2)); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->mark_ptr, TMP2, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, mark_ptr), TMP2, 0); + if (common->has_skip_arg) + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, STACK_TOP, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, type_mark); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(2), SLJIT_IMM, (sljit_sw)(cc + 2)); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(3), STR_PTR, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP1, 0); + } + cc += 1 + 2 + cc[1]; + break; + + case OP_PRUNE: + case OP_PRUNE_ARG: + case OP_SKIP: + case OP_SKIP_ARG: + case OP_THEN: + case OP_THEN_ARG: + case OP_COMMIT: + cc = compile_control_verb_matchingpath(common, cc, parent); + break; + + case OP_FAIL: + case OP_ACCEPT: + case OP_ASSERT_ACCEPT: + cc = compile_fail_accept_matchingpath(common, cc, parent); + break; + + case OP_CLOSE: + cc = compile_close_matchingpath(common, cc); + break; + + case OP_SKIPZERO: + cc = bracketend(cc + 1); + break; + + default: + SLJIT_UNREACHABLE(); + return; + } + if (cc == NULL) + return; + } + +if (has_then_trap) + { + /* Head item on backtrack. */ + PUSH_BACKTRACK_NOVALUE(sizeof(then_trap_backtrack), cc); + BACKTRACK_AS(then_trap_backtrack)->common.cc = then_trap_opcode; + BACKTRACK_AS(then_trap_backtrack)->then_trap = common->then_trap; + common->then_trap = save_then_trap; + } +SLJIT_ASSERT(cc == ccend); +} + +#undef PUSH_BACKTRACK +#undef PUSH_BACKTRACK_NOVALUE +#undef BACKTRACK_AS + +#define COMPILE_BACKTRACKINGPATH(current) \ + do \ + { \ + compile_backtrackingpath(common, (current)); \ + if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler))) \ + return; \ + } \ + while (0) + +#define CURRENT_AS(type) ((type *)current) + +static void compile_iterator_backtrackingpath(compiler_common *common, struct backtrack_common *current) +{ +DEFINE_COMPILER; +pcre_uchar *cc = current->cc; +pcre_uchar opcode; +pcre_uchar type; +sljit_u32 max = 0, exact; +struct sljit_label *label = NULL; +struct sljit_jump *jump = NULL; +jump_list *jumplist = NULL; +pcre_uchar *end; +int private_data_ptr = PRIVATE_DATA(cc); +int base = (private_data_ptr == 0) ? SLJIT_MEM1(STACK_TOP) : SLJIT_MEM1(SLJIT_SP); +int offset0 = (private_data_ptr == 0) ? STACK(0) : private_data_ptr; +int offset1 = (private_data_ptr == 0) ? STACK(1) : private_data_ptr + (int)sizeof(sljit_sw); + +cc = get_iterator_parameters(common, cc, &opcode, &type, &max, &exact, &end); + +switch(opcode) + { + case OP_STAR: + case OP_UPTO: + if (type == OP_ANYNL || type == OP_EXTUNI) + { + SLJIT_ASSERT(private_data_ptr == 0); + set_jumps(CURRENT_AS(char_iterator_backtrack)->u.backtracks, LABEL()); + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + free_stack(common, 1); + CMPTO(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0, CURRENT_AS(char_iterator_backtrack)->matchingpath); + } + else + { + if (CURRENT_AS(char_iterator_backtrack)->u.charpos.enabled) + { + OP1(SLJIT_MOV, STR_PTR, 0, base, offset0); + OP1(SLJIT_MOV, TMP2, 0, base, offset1); + OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + + jump = CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, TMP2, 0); + label = LABEL(); + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-1)); + OP1(SLJIT_MOV, base, offset0, STR_PTR, 0); + if (CURRENT_AS(char_iterator_backtrack)->u.charpos.othercasebit != 0) + OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, CURRENT_AS(char_iterator_backtrack)->u.charpos.othercasebit); + CMPTO(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, CURRENT_AS(char_iterator_backtrack)->u.charpos.chr, CURRENT_AS(char_iterator_backtrack)->matchingpath); + skip_char_back(common); + CMPTO(SLJIT_GREATER, STR_PTR, 0, TMP2, 0, label); + } + else + { + OP1(SLJIT_MOV, STR_PTR, 0, base, offset0); + jump = CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, base, offset1); + skip_char_back(common); + OP1(SLJIT_MOV, base, offset0, STR_PTR, 0); + JUMPTO(SLJIT_JUMP, CURRENT_AS(char_iterator_backtrack)->matchingpath); + } + JUMPHERE(jump); + if (private_data_ptr == 0) + free_stack(common, 2); + } + break; + + case OP_MINSTAR: + OP1(SLJIT_MOV, STR_PTR, 0, base, offset0); + compile_char1_matchingpath(common, type, cc, &jumplist, TRUE); + OP1(SLJIT_MOV, base, offset0, STR_PTR, 0); + JUMPTO(SLJIT_JUMP, CURRENT_AS(char_iterator_backtrack)->matchingpath); + set_jumps(jumplist, LABEL()); + if (private_data_ptr == 0) + free_stack(common, 1); + break; + + case OP_MINUPTO: + OP1(SLJIT_MOV, TMP1, 0, base, offset1); + OP1(SLJIT_MOV, STR_PTR, 0, base, offset0); + OP2(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, TMP1, 0, SLJIT_IMM, 1); + add_jump(compiler, &jumplist, JUMP(SLJIT_ZERO)); + + OP1(SLJIT_MOV, base, offset1, TMP1, 0); + compile_char1_matchingpath(common, type, cc, &jumplist, TRUE); + OP1(SLJIT_MOV, base, offset0, STR_PTR, 0); + JUMPTO(SLJIT_JUMP, CURRENT_AS(char_iterator_backtrack)->matchingpath); + + set_jumps(jumplist, LABEL()); + if (private_data_ptr == 0) + free_stack(common, 2); + break; + + case OP_QUERY: + OP1(SLJIT_MOV, STR_PTR, 0, base, offset0); + OP1(SLJIT_MOV, base, offset0, SLJIT_IMM, 0); + CMPTO(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0, CURRENT_AS(char_iterator_backtrack)->matchingpath); + jump = JUMP(SLJIT_JUMP); + set_jumps(CURRENT_AS(char_iterator_backtrack)->u.backtracks, LABEL()); + OP1(SLJIT_MOV, STR_PTR, 0, base, offset0); + OP1(SLJIT_MOV, base, offset0, SLJIT_IMM, 0); + JUMPTO(SLJIT_JUMP, CURRENT_AS(char_iterator_backtrack)->matchingpath); + JUMPHERE(jump); + if (private_data_ptr == 0) + free_stack(common, 1); + break; + + case OP_MINQUERY: + OP1(SLJIT_MOV, STR_PTR, 0, base, offset0); + OP1(SLJIT_MOV, base, offset0, SLJIT_IMM, 0); + jump = CMP(SLJIT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0); + compile_char1_matchingpath(common, type, cc, &jumplist, TRUE); + JUMPTO(SLJIT_JUMP, CURRENT_AS(char_iterator_backtrack)->matchingpath); + set_jumps(jumplist, LABEL()); + JUMPHERE(jump); + if (private_data_ptr == 0) + free_stack(common, 1); + break; + + case OP_EXACT: + case OP_POSSTAR: + case OP_POSQUERY: + case OP_POSUPTO: + break; + + default: + SLJIT_UNREACHABLE(); + break; + } + +set_jumps(current->topbacktracks, LABEL()); +} + +static SLJIT_INLINE void compile_ref_iterator_backtrackingpath(compiler_common *common, struct backtrack_common *current) +{ +DEFINE_COMPILER; +pcre_uchar *cc = current->cc; +BOOL ref = (*cc == OP_REF || *cc == OP_REFI); +pcre_uchar type; + +type = cc[ref ? 1 + IMM2_SIZE : 1 + 2 * IMM2_SIZE]; + +if ((type & 0x1) == 0) + { + /* Maximize case. */ + set_jumps(current->topbacktracks, LABEL()); + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + free_stack(common, 1); + CMPTO(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0, CURRENT_AS(ref_iterator_backtrack)->matchingpath); + return; + } + +OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); +CMPTO(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0, CURRENT_AS(ref_iterator_backtrack)->matchingpath); +set_jumps(current->topbacktracks, LABEL()); +free_stack(common, ref ? 2 : 3); +} + +static SLJIT_INLINE void compile_recurse_backtrackingpath(compiler_common *common, struct backtrack_common *current) +{ +DEFINE_COMPILER; + +if (CURRENT_AS(recurse_backtrack)->inlined_pattern) + compile_backtrackingpath(common, current->top); +set_jumps(current->topbacktracks, LABEL()); +if (CURRENT_AS(recurse_backtrack)->inlined_pattern) + return; + +if (common->has_set_som && common->mark_ptr != 0) + { + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(1)); + free_stack(common, 2); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(0), TMP2, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->mark_ptr, TMP1, 0); + } +else if (common->has_set_som || common->mark_ptr != 0) + { + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + free_stack(common, 1); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->has_set_som ? (int)(OVECTOR(0)) : common->mark_ptr, TMP2, 0); + } +} + +static void compile_assert_backtrackingpath(compiler_common *common, struct backtrack_common *current) +{ +DEFINE_COMPILER; +pcre_uchar *cc = current->cc; +pcre_uchar bra = OP_BRA; +struct sljit_jump *brajump = NULL; + +SLJIT_ASSERT(*cc != OP_BRAMINZERO); +if (*cc == OP_BRAZERO) + { + bra = *cc; + cc++; + } + +if (bra == OP_BRAZERO) + { + SLJIT_ASSERT(current->topbacktracks == NULL); + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + } + +if (CURRENT_AS(assert_backtrack)->framesize < 0) + { + set_jumps(current->topbacktracks, LABEL()); + + if (bra == OP_BRAZERO) + { + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0); + CMPTO(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0, CURRENT_AS(assert_backtrack)->matchingpath); + free_stack(common, 1); + } + return; + } + +if (bra == OP_BRAZERO) + { + if (*cc == OP_ASSERT_NOT || *cc == OP_ASSERTBACK_NOT) + { + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0); + CMPTO(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0, CURRENT_AS(assert_backtrack)->matchingpath); + free_stack(common, 1); + return; + } + free_stack(common, 1); + brajump = CMP(SLJIT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0); + } + +if (*cc == OP_ASSERT || *cc == OP_ASSERTBACK) + { + OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), CURRENT_AS(assert_backtrack)->private_data_ptr); + add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL)); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), CURRENT_AS(assert_backtrack)->private_data_ptr, SLJIT_MEM1(STACK_TOP), STACK(-CURRENT_AS(assert_backtrack)->framesize - 1)); + + set_jumps(current->topbacktracks, LABEL()); + } +else + set_jumps(current->topbacktracks, LABEL()); + +if (bra == OP_BRAZERO) + { + /* We know there is enough place on the stack. */ + OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, sizeof(sljit_sw)); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0); + JUMPTO(SLJIT_JUMP, CURRENT_AS(assert_backtrack)->matchingpath); + JUMPHERE(brajump); + } +} + +static void compile_bracket_backtrackingpath(compiler_common *common, struct backtrack_common *current) +{ +DEFINE_COMPILER; +int opcode, stacksize, alt_count, alt_max; +int offset = 0; +int private_data_ptr = CURRENT_AS(bracket_backtrack)->private_data_ptr; +int repeat_ptr = 0, repeat_type = 0, repeat_count = 0; +pcre_uchar *cc = current->cc; +pcre_uchar *ccbegin; +pcre_uchar *ccprev; +pcre_uchar bra = OP_BRA; +pcre_uchar ket; +assert_backtrack *assert; +sljit_uw *next_update_addr = NULL; +BOOL has_alternatives; +BOOL needs_control_head = FALSE; +struct sljit_jump *brazero = NULL; +struct sljit_jump *alt1 = NULL; +struct sljit_jump *alt2 = NULL; +struct sljit_jump *once = NULL; +struct sljit_jump *cond = NULL; +struct sljit_label *rmin_label = NULL; +struct sljit_label *exact_label = NULL; + +if (*cc == OP_BRAZERO || *cc == OP_BRAMINZERO) + { + bra = *cc; + cc++; + } + +opcode = *cc; +ccbegin = bracketend(cc) - 1 - LINK_SIZE; +ket = *ccbegin; +if (ket == OP_KET && PRIVATE_DATA(ccbegin) != 0) + { + repeat_ptr = PRIVATE_DATA(ccbegin); + repeat_type = PRIVATE_DATA(ccbegin + 2); + repeat_count = PRIVATE_DATA(ccbegin + 3); + SLJIT_ASSERT(repeat_type != 0 && repeat_count != 0); + if (repeat_type == OP_UPTO) + ket = OP_KETRMAX; + if (repeat_type == OP_MINUPTO) + ket = OP_KETRMIN; + } +ccbegin = cc; +cc += GET(cc, 1); +has_alternatives = *cc == OP_ALT; +if (SLJIT_UNLIKELY(opcode == OP_COND) || SLJIT_UNLIKELY(opcode == OP_SCOND)) + has_alternatives = (ccbegin[1 + LINK_SIZE] >= OP_ASSERT && ccbegin[1 + LINK_SIZE] <= OP_ASSERTBACK_NOT) || CURRENT_AS(bracket_backtrack)->u.condfailed != NULL; +if (opcode == OP_CBRA || opcode == OP_SCBRA) + offset = (GET2(ccbegin, 1 + LINK_SIZE)) << 1; +if (SLJIT_UNLIKELY(opcode == OP_COND) && (*cc == OP_KETRMAX || *cc == OP_KETRMIN)) + opcode = OP_SCOND; +if (SLJIT_UNLIKELY(opcode == OP_ONCE_NC)) + opcode = OP_ONCE; + +alt_max = has_alternatives ? no_alternatives(ccbegin) : 0; + +/* Decoding the needs_control_head in framesize. */ +if (opcode == OP_ONCE) + { + needs_control_head = (CURRENT_AS(bracket_backtrack)->u.framesize & 0x1) != 0; + CURRENT_AS(bracket_backtrack)->u.framesize >>= 1; + } + +if (ket != OP_KET && repeat_type != 0) + { + /* TMP1 is used in OP_KETRMIN below. */ + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + free_stack(common, 1); + if (repeat_type == OP_UPTO) + OP2(SLJIT_ADD, SLJIT_MEM1(SLJIT_SP), repeat_ptr, TMP1, 0, SLJIT_IMM, 1); + else + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), repeat_ptr, TMP1, 0); + } + +if (ket == OP_KETRMAX) + { + if (bra == OP_BRAZERO) + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + free_stack(common, 1); + brazero = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, 0); + } + } +else if (ket == OP_KETRMIN) + { + if (bra != OP_BRAMINZERO) + { + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + if (repeat_type != 0) + { + /* TMP1 was set a few lines above. */ + CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, 0, CURRENT_AS(bracket_backtrack)->recursive_matchingpath); + /* Drop STR_PTR for non-greedy plus quantifier. */ + if (opcode != OP_ONCE) + free_stack(common, 1); + } + else if (opcode >= OP_SBRA || opcode == OP_ONCE) + { + /* Checking zero-length iteration. */ + if (opcode != OP_ONCE || CURRENT_AS(bracket_backtrack)->u.framesize < 0) + CMPTO(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr, CURRENT_AS(bracket_backtrack)->recursive_matchingpath); + else + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr); + CMPTO(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_MEM1(TMP1), STACK(-CURRENT_AS(bracket_backtrack)->u.framesize - 2), CURRENT_AS(bracket_backtrack)->recursive_matchingpath); + } + /* Drop STR_PTR for non-greedy plus quantifier. */ + if (opcode != OP_ONCE) + free_stack(common, 1); + } + else + JUMPTO(SLJIT_JUMP, CURRENT_AS(bracket_backtrack)->recursive_matchingpath); + } + rmin_label = LABEL(); + if (repeat_type != 0) + OP2(SLJIT_ADD, SLJIT_MEM1(SLJIT_SP), repeat_ptr, SLJIT_MEM1(SLJIT_SP), repeat_ptr, SLJIT_IMM, 1); + } +else if (bra == OP_BRAZERO) + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + free_stack(common, 1); + brazero = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, 0); + } +else if (repeat_type == OP_EXACT) + { + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), repeat_ptr, SLJIT_IMM, 1); + exact_label = LABEL(); + } + +if (offset != 0) + { + if (common->capture_last_ptr != 0) + { + SLJIT_ASSERT(common->optimized_cbracket[offset >> 1] == 0); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(1)); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->capture_last_ptr, TMP1, 0); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(2)); + free_stack(common, 3); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset), TMP2, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1), TMP1, 0); + } + else if (common->optimized_cbracket[offset >> 1] == 0) + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(1)); + free_stack(common, 2); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset), TMP1, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1), TMP2, 0); + } + } + +if (SLJIT_UNLIKELY(opcode == OP_ONCE)) + { + if (CURRENT_AS(bracket_backtrack)->u.framesize >= 0) + { + OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr); + add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL)); + } + once = JUMP(SLJIT_JUMP); + } +else if (SLJIT_UNLIKELY(opcode == OP_COND) || SLJIT_UNLIKELY(opcode == OP_SCOND)) + { + if (has_alternatives) + { + /* Always exactly one alternative. */ + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + free_stack(common, 1); + + alt_max = 2; + alt1 = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, sizeof(sljit_uw)); + } + } +else if (has_alternatives) + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + free_stack(common, 1); + + if (alt_max > 4) + { + /* Table jump if alt_max is greater than 4. */ + next_update_addr = allocate_read_only_data(common, alt_max * sizeof(sljit_uw)); + if (SLJIT_UNLIKELY(next_update_addr == NULL)) + return; + sljit_emit_ijump(compiler, SLJIT_JUMP, SLJIT_MEM1(TMP1), (sljit_sw)next_update_addr); + add_label_addr(common, next_update_addr++); + } + else + { + if (alt_max == 4) + alt2 = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 2 * sizeof(sljit_uw)); + alt1 = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, sizeof(sljit_uw)); + } + } + +COMPILE_BACKTRACKINGPATH(current->top); +if (current->topbacktracks) + set_jumps(current->topbacktracks, LABEL()); + +if (SLJIT_UNLIKELY(opcode == OP_COND) || SLJIT_UNLIKELY(opcode == OP_SCOND)) + { + /* Conditional block always has at most one alternative. */ + if (ccbegin[1 + LINK_SIZE] >= OP_ASSERT && ccbegin[1 + LINK_SIZE] <= OP_ASSERTBACK_NOT) + { + SLJIT_ASSERT(has_alternatives); + assert = CURRENT_AS(bracket_backtrack)->u.assert; + if (assert->framesize >= 0 && (ccbegin[1 + LINK_SIZE] == OP_ASSERT || ccbegin[1 + LINK_SIZE] == OP_ASSERTBACK)) + { + OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), assert->private_data_ptr); + add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL)); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), assert->private_data_ptr, SLJIT_MEM1(STACK_TOP), STACK(-assert->framesize - 1)); + } + cond = JUMP(SLJIT_JUMP); + set_jumps(CURRENT_AS(bracket_backtrack)->u.assert->condfailed, LABEL()); + } + else if (CURRENT_AS(bracket_backtrack)->u.condfailed != NULL) + { + SLJIT_ASSERT(has_alternatives); + cond = JUMP(SLJIT_JUMP); + set_jumps(CURRENT_AS(bracket_backtrack)->u.condfailed, LABEL()); + } + else + SLJIT_ASSERT(!has_alternatives); + } + +if (has_alternatives) + { + alt_count = sizeof(sljit_uw); + do + { + current->top = NULL; + current->topbacktracks = NULL; + current->nextbacktracks = NULL; + /* Conditional blocks always have an additional alternative, even if it is empty. */ + if (*cc == OP_ALT) + { + ccprev = cc + 1 + LINK_SIZE; + cc += GET(cc, 1); + if (opcode != OP_COND && opcode != OP_SCOND) + { + if (opcode != OP_ONCE) + { + if (private_data_ptr != 0) + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr); + else + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + } + else + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(needs_control_head ? 1 : 0)); + } + compile_matchingpath(common, ccprev, cc, current); + if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler))) + return; + } + + /* Instructions after the current alternative is successfully matched. */ + /* There is a similar code in compile_bracket_matchingpath. */ + if (opcode == OP_ONCE) + match_once_common(common, ket, CURRENT_AS(bracket_backtrack)->u.framesize, private_data_ptr, has_alternatives, needs_control_head); + + stacksize = 0; + if (repeat_type == OP_MINUPTO) + { + /* We need to preserve the counter. TMP2 will be used below. */ + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), repeat_ptr); + stacksize++; + } + if (ket != OP_KET || bra != OP_BRA) + stacksize++; + if (offset != 0) + { + if (common->capture_last_ptr != 0) + stacksize++; + if (common->optimized_cbracket[offset >> 1] == 0) + stacksize += 2; + } + if (opcode != OP_ONCE) + stacksize++; + + if (stacksize > 0) + allocate_stack(common, stacksize); + + stacksize = 0; + if (repeat_type == OP_MINUPTO) + { + /* TMP2 was set above. */ + OP2(SLJIT_SUB, SLJIT_MEM1(STACK_TOP), STACK(stacksize), TMP2, 0, SLJIT_IMM, 1); + stacksize++; + } + + if (ket != OP_KET || bra != OP_BRA) + { + if (ket != OP_KET) + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), STR_PTR, 0); + else + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), SLJIT_IMM, 0); + stacksize++; + } + + if (offset != 0) + stacksize = match_capture_common(common, stacksize, offset, private_data_ptr); + + if (opcode != OP_ONCE) + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), SLJIT_IMM, alt_count); + + if (offset != 0 && ket == OP_KETRMAX && common->optimized_cbracket[offset >> 1] != 0) + { + /* If ket is not OP_KETRMAX, this code path is executed after the jump to alternative_matchingpath. */ + SLJIT_ASSERT(private_data_ptr == OVECTOR(offset + 0)); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1), STR_PTR, 0); + } + + JUMPTO(SLJIT_JUMP, CURRENT_AS(bracket_backtrack)->alternative_matchingpath); + + if (opcode != OP_ONCE) + { + if (alt_max > 4) + add_label_addr(common, next_update_addr++); + else + { + if (alt_count != 2 * sizeof(sljit_uw)) + { + JUMPHERE(alt1); + if (alt_max == 3 && alt_count == sizeof(sljit_uw)) + alt2 = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 2 * sizeof(sljit_uw)); + } + else + { + JUMPHERE(alt2); + if (alt_max == 4) + alt1 = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 3 * sizeof(sljit_uw)); + } + } + alt_count += sizeof(sljit_uw); + } + + COMPILE_BACKTRACKINGPATH(current->top); + if (current->topbacktracks) + set_jumps(current->topbacktracks, LABEL()); + SLJIT_ASSERT(!current->nextbacktracks); + } + while (*cc == OP_ALT); + + if (cond != NULL) + { + SLJIT_ASSERT(opcode == OP_COND || opcode == OP_SCOND); + assert = CURRENT_AS(bracket_backtrack)->u.assert; + if ((ccbegin[1 + LINK_SIZE] == OP_ASSERT_NOT || ccbegin[1 + LINK_SIZE] == OP_ASSERTBACK_NOT) && assert->framesize >= 0) + { + OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), assert->private_data_ptr); + add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL)); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), assert->private_data_ptr, SLJIT_MEM1(STACK_TOP), STACK(-assert->framesize - 1)); + } + JUMPHERE(cond); + } + + /* Free the STR_PTR. */ + if (private_data_ptr == 0) + free_stack(common, 1); + } + +if (offset != 0) + { + /* Using both tmp register is better for instruction scheduling. */ + if (common->optimized_cbracket[offset >> 1] != 0) + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(1)); + free_stack(common, 2); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset), TMP1, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1), TMP2, 0); + } + else + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + free_stack(common, 1); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, TMP1, 0); + } + } +else if (opcode == OP_SBRA || opcode == OP_SCOND) + { + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_MEM1(STACK_TOP), STACK(0)); + free_stack(common, 1); + } +else if (opcode == OP_ONCE) + { + cc = ccbegin + GET(ccbegin, 1); + stacksize = needs_control_head ? 1 : 0; + + if (CURRENT_AS(bracket_backtrack)->u.framesize >= 0) + { + /* Reset head and drop saved frame. */ + stacksize += CURRENT_AS(bracket_backtrack)->u.framesize + ((ket != OP_KET || *cc == OP_ALT) ? 2 : 1); + } + else if (ket == OP_KETRMAX || (*cc == OP_ALT && ket != OP_KETRMIN)) + { + /* The STR_PTR must be released. */ + stacksize++; + } + + if (stacksize > 0) + free_stack(common, stacksize); + + JUMPHERE(once); + /* Restore previous private_data_ptr */ + if (CURRENT_AS(bracket_backtrack)->u.framesize >= 0) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_MEM1(STACK_TOP), STACK(-CURRENT_AS(bracket_backtrack)->u.framesize - 1)); + else if (ket == OP_KETRMIN) + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(1)); + /* See the comment below. */ + free_stack(common, 2); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, TMP1, 0); + } + } + +if (repeat_type == OP_EXACT) + { + OP2(SLJIT_ADD, TMP1, 0, SLJIT_MEM1(SLJIT_SP), repeat_ptr, SLJIT_IMM, 1); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), repeat_ptr, TMP1, 0); + CMPTO(SLJIT_LESS_EQUAL, TMP1, 0, SLJIT_IMM, repeat_count, exact_label); + } +else if (ket == OP_KETRMAX) + { + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + if (bra != OP_BRAZERO) + free_stack(common, 1); + + CMPTO(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0, CURRENT_AS(bracket_backtrack)->recursive_matchingpath); + if (bra == OP_BRAZERO) + { + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(1)); + JUMPTO(SLJIT_JUMP, CURRENT_AS(bracket_backtrack)->zero_matchingpath); + JUMPHERE(brazero); + free_stack(common, 1); + } + } +else if (ket == OP_KETRMIN) + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + + /* OP_ONCE removes everything in case of a backtrack, so we don't + need to explicitly release the STR_PTR. The extra release would + affect badly the free_stack(2) above. */ + if (opcode != OP_ONCE) + free_stack(common, 1); + CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, 0, rmin_label); + if (opcode == OP_ONCE) + free_stack(common, bra == OP_BRAMINZERO ? 2 : 1); + else if (bra == OP_BRAMINZERO) + free_stack(common, 1); + } +else if (bra == OP_BRAZERO) + { + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + JUMPTO(SLJIT_JUMP, CURRENT_AS(bracket_backtrack)->zero_matchingpath); + JUMPHERE(brazero); + } +} + +static SLJIT_INLINE void compile_bracketpos_backtrackingpath(compiler_common *common, struct backtrack_common *current) +{ +DEFINE_COMPILER; +int offset; +struct sljit_jump *jump; + +if (CURRENT_AS(bracketpos_backtrack)->framesize < 0) + { + if (*current->cc == OP_CBRAPOS || *current->cc == OP_SCBRAPOS) + { + offset = (GET2(current->cc, 1 + LINK_SIZE)) << 1; + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(1)); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset), TMP1, 0); + if (common->capture_last_ptr != 0) + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(2)); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1), TMP2, 0); + if (common->capture_last_ptr != 0) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->capture_last_ptr, TMP1, 0); + } + set_jumps(current->topbacktracks, LABEL()); + free_stack(common, CURRENT_AS(bracketpos_backtrack)->stacksize); + return; + } + +OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), CURRENT_AS(bracketpos_backtrack)->private_data_ptr); +add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL)); + +if (current->topbacktracks) + { + jump = JUMP(SLJIT_JUMP); + set_jumps(current->topbacktracks, LABEL()); + /* Drop the stack frame. */ + free_stack(common, CURRENT_AS(bracketpos_backtrack)->stacksize); + JUMPHERE(jump); + } +OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), CURRENT_AS(bracketpos_backtrack)->private_data_ptr, SLJIT_MEM1(STACK_TOP), STACK(-CURRENT_AS(bracketpos_backtrack)->framesize - 1)); +} + +static SLJIT_INLINE void compile_braminzero_backtrackingpath(compiler_common *common, struct backtrack_common *current) +{ +assert_backtrack backtrack; + +current->top = NULL; +current->topbacktracks = NULL; +current->nextbacktracks = NULL; +if (current->cc[1] > OP_ASSERTBACK_NOT) + { + /* Manual call of compile_bracket_matchingpath and compile_bracket_backtrackingpath. */ + compile_bracket_matchingpath(common, current->cc, current); + compile_bracket_backtrackingpath(common, current->top); + } +else + { + memset(&backtrack, 0, sizeof(backtrack)); + backtrack.common.cc = current->cc; + backtrack.matchingpath = CURRENT_AS(braminzero_backtrack)->matchingpath; + /* Manual call of compile_assert_matchingpath. */ + compile_assert_matchingpath(common, current->cc, &backtrack, FALSE); + } +SLJIT_ASSERT(!current->nextbacktracks && !current->topbacktracks); +} + +static SLJIT_INLINE void compile_control_verb_backtrackingpath(compiler_common *common, struct backtrack_common *current) +{ +DEFINE_COMPILER; +pcre_uchar opcode = *current->cc; +struct sljit_label *loop; +struct sljit_jump *jump; + +if (opcode == OP_THEN || opcode == OP_THEN_ARG) + { + if (common->then_trap != NULL) + { + SLJIT_ASSERT(common->control_head_ptr != 0); + + OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, type_then_trap); + OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, common->then_trap->start); + jump = JUMP(SLJIT_JUMP); + + loop = LABEL(); + OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + JUMPHERE(jump); + CMPTO(SLJIT_NOT_EQUAL, SLJIT_MEM1(STACK_TOP), STACK(1), TMP1, 0, loop); + CMPTO(SLJIT_NOT_EQUAL, SLJIT_MEM1(STACK_TOP), STACK(2), TMP2, 0, loop); + add_jump(compiler, &common->then_trap->quit, JUMP(SLJIT_JUMP)); + return; + } + else if (common->positive_assert) + { + add_jump(compiler, &common->positive_assert_quit, JUMP(SLJIT_JUMP)); + return; + } + } + +if (common->local_exit) + { + if (common->quit_label == NULL) + add_jump(compiler, &common->quit, JUMP(SLJIT_JUMP)); + else + JUMPTO(SLJIT_JUMP, common->quit_label); + return; + } + +if (opcode == OP_SKIP_ARG) + { + SLJIT_ASSERT(common->control_head_ptr != 0); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS0, STACK_TOP, 0); + OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_IMM, (sljit_sw)(current->cc + 2)); + sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(SW), SLJIT_IMM, SLJIT_FUNC_OFFSET(do_search_mark)); + OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0); + + OP1(SLJIT_MOV, STR_PTR, 0, TMP1, 0); + add_jump(compiler, &common->reset_match, CMP(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0)); + return; + } + +if (opcode == OP_SKIP) + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); +else + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_IMM, 0); +add_jump(compiler, &common->reset_match, JUMP(SLJIT_JUMP)); +} + +static SLJIT_INLINE void compile_then_trap_backtrackingpath(compiler_common *common, struct backtrack_common *current) +{ +DEFINE_COMPILER; +struct sljit_jump *jump; +int size; + +if (CURRENT_AS(then_trap_backtrack)->then_trap) + { + common->then_trap = CURRENT_AS(then_trap_backtrack)->then_trap; + return; + } + +size = CURRENT_AS(then_trap_backtrack)->framesize; +size = 3 + (size < 0 ? 0 : size); + +OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(size - 3)); +free_stack(common, size); +jump = JUMP(SLJIT_JUMP); + +set_jumps(CURRENT_AS(then_trap_backtrack)->quit, LABEL()); +/* STACK_TOP is set by THEN. */ +if (CURRENT_AS(then_trap_backtrack)->framesize >= 0) + add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL)); +OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); +free_stack(common, 3); + +JUMPHERE(jump); +OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, TMP1, 0); +} + +static void compile_backtrackingpath(compiler_common *common, struct backtrack_common *current) +{ +DEFINE_COMPILER; +then_trap_backtrack *save_then_trap = common->then_trap; + +while (current) + { + if (current->nextbacktracks != NULL) + set_jumps(current->nextbacktracks, LABEL()); + switch(*current->cc) + { + case OP_SET_SOM: + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + free_stack(common, 1); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(0), TMP1, 0); + break; + + case OP_STAR: + case OP_MINSTAR: + case OP_PLUS: + case OP_MINPLUS: + case OP_QUERY: + case OP_MINQUERY: + case OP_UPTO: + case OP_MINUPTO: + case OP_EXACT: + case OP_POSSTAR: + case OP_POSPLUS: + case OP_POSQUERY: + case OP_POSUPTO: + case OP_STARI: + case OP_MINSTARI: + case OP_PLUSI: + case OP_MINPLUSI: + case OP_QUERYI: + case OP_MINQUERYI: + case OP_UPTOI: + case OP_MINUPTOI: + case OP_EXACTI: + case OP_POSSTARI: + case OP_POSPLUSI: + case OP_POSQUERYI: + case OP_POSUPTOI: + case OP_NOTSTAR: + case OP_NOTMINSTAR: + case OP_NOTPLUS: + case OP_NOTMINPLUS: + case OP_NOTQUERY: + case OP_NOTMINQUERY: + case OP_NOTUPTO: + case OP_NOTMINUPTO: + case OP_NOTEXACT: + case OP_NOTPOSSTAR: + case OP_NOTPOSPLUS: + case OP_NOTPOSQUERY: + case OP_NOTPOSUPTO: + case OP_NOTSTARI: + case OP_NOTMINSTARI: + case OP_NOTPLUSI: + case OP_NOTMINPLUSI: + case OP_NOTQUERYI: + case OP_NOTMINQUERYI: + case OP_NOTUPTOI: + case OP_NOTMINUPTOI: + case OP_NOTEXACTI: + case OP_NOTPOSSTARI: + case OP_NOTPOSPLUSI: + case OP_NOTPOSQUERYI: + case OP_NOTPOSUPTOI: + case OP_TYPESTAR: + case OP_TYPEMINSTAR: + case OP_TYPEPLUS: + case OP_TYPEMINPLUS: + case OP_TYPEQUERY: + case OP_TYPEMINQUERY: + case OP_TYPEUPTO: + case OP_TYPEMINUPTO: + case OP_TYPEEXACT: + case OP_TYPEPOSSTAR: + case OP_TYPEPOSPLUS: + case OP_TYPEPOSQUERY: + case OP_TYPEPOSUPTO: + case OP_CLASS: + case OP_NCLASS: +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 + case OP_XCLASS: +#endif + compile_iterator_backtrackingpath(common, current); + break; + + case OP_REF: + case OP_REFI: + case OP_DNREF: + case OP_DNREFI: + compile_ref_iterator_backtrackingpath(common, current); + break; + + case OP_RECURSE: + compile_recurse_backtrackingpath(common, current); + break; + + case OP_ASSERT: + case OP_ASSERT_NOT: + case OP_ASSERTBACK: + case OP_ASSERTBACK_NOT: + compile_assert_backtrackingpath(common, current); + break; + + case OP_ONCE: + case OP_ONCE_NC: + case OP_BRA: + case OP_CBRA: + case OP_COND: + case OP_SBRA: + case OP_SCBRA: + case OP_SCOND: + compile_bracket_backtrackingpath(common, current); + break; + + case OP_BRAZERO: + if (current->cc[1] > OP_ASSERTBACK_NOT) + compile_bracket_backtrackingpath(common, current); + else + compile_assert_backtrackingpath(common, current); + break; + + case OP_BRAPOS: + case OP_CBRAPOS: + case OP_SBRAPOS: + case OP_SCBRAPOS: + case OP_BRAPOSZERO: + compile_bracketpos_backtrackingpath(common, current); + break; + + case OP_BRAMINZERO: + compile_braminzero_backtrackingpath(common, current); + break; + + case OP_MARK: + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(common->has_skip_arg ? 4 : 0)); + if (common->has_skip_arg) + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + free_stack(common, common->has_skip_arg ? 5 : 1); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->mark_ptr, TMP1, 0); + if (common->has_skip_arg) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, TMP2, 0); + break; + + case OP_THEN: + case OP_THEN_ARG: + case OP_PRUNE: + case OP_PRUNE_ARG: + case OP_SKIP: + case OP_SKIP_ARG: + compile_control_verb_backtrackingpath(common, current); + break; + + case OP_COMMIT: + if (!common->local_exit) + OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, PCRE_ERROR_NOMATCH); + if (common->quit_label == NULL) + add_jump(compiler, &common->quit, JUMP(SLJIT_JUMP)); + else + JUMPTO(SLJIT_JUMP, common->quit_label); + break; + + case OP_CALLOUT: + case OP_FAIL: + case OP_ACCEPT: + case OP_ASSERT_ACCEPT: + set_jumps(current->topbacktracks, LABEL()); + break; + + case OP_THEN_TRAP: + /* A virtual opcode for then traps. */ + compile_then_trap_backtrackingpath(common, current); + break; + + default: + SLJIT_UNREACHABLE(); + break; + } + current = current->prev; + } +common->then_trap = save_then_trap; +} + +static SLJIT_INLINE void compile_recurse(compiler_common *common) +{ +DEFINE_COMPILER; +pcre_uchar *cc = common->start + common->currententry->start; +pcre_uchar *ccbegin = cc + 1 + LINK_SIZE + (*cc == OP_BRA ? 0 : IMM2_SIZE); +pcre_uchar *ccend = bracketend(cc) - (1 + LINK_SIZE); +BOOL needs_control_head; +int framesize = get_framesize(common, cc, NULL, TRUE, &needs_control_head); +int private_data_size = get_private_data_copy_length(common, ccbegin, ccend, needs_control_head); +int alternativesize; +BOOL needs_frame; +backtrack_common altbacktrack; +struct sljit_jump *jump; + +/* Recurse captures then. */ +common->then_trap = NULL; + +SLJIT_ASSERT(*cc == OP_BRA || *cc == OP_CBRA || *cc == OP_CBRAPOS || *cc == OP_SCBRA || *cc == OP_SCBRAPOS); +needs_frame = framesize >= 0; +if (!needs_frame) + framesize = 0; +alternativesize = *(cc + GET(cc, 1)) == OP_ALT ? 1 : 0; + +SLJIT_ASSERT(common->currententry->entry == NULL && common->recursive_head_ptr != 0); +common->currententry->entry = LABEL(); +set_jumps(common->currententry->calls, common->currententry->entry); + +sljit_emit_fast_enter(compiler, TMP2, 0); +count_match(common); +allocate_stack(common, private_data_size + framesize + alternativesize); +OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(private_data_size + framesize + alternativesize - 1), TMP2, 0); +copy_private_data(common, ccbegin, ccend, TRUE, framesize + alternativesize, private_data_size + framesize + alternativesize, needs_control_head); +if (needs_control_head) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_IMM, 0); +OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->recursive_head_ptr, STACK_TOP, 0); +if (needs_frame) + init_frame(common, cc, NULL, framesize + alternativesize - 1, alternativesize, TRUE); + +if (alternativesize > 0) + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0); + +memset(&altbacktrack, 0, sizeof(backtrack_common)); +common->quit_label = NULL; +common->accept_label = NULL; +common->quit = NULL; +common->accept = NULL; +altbacktrack.cc = ccbegin; +cc += GET(cc, 1); +while (1) + { + altbacktrack.top = NULL; + altbacktrack.topbacktracks = NULL; + + if (altbacktrack.cc != ccbegin) + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + + compile_matchingpath(common, altbacktrack.cc, cc, &altbacktrack); + if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler))) + return; + + add_jump(compiler, &common->accept, JUMP(SLJIT_JUMP)); + + compile_backtrackingpath(common, altbacktrack.top); + if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler))) + return; + set_jumps(altbacktrack.topbacktracks, LABEL()); + + if (*cc != OP_ALT) + break; + + altbacktrack.cc = cc + 1 + LINK_SIZE; + cc += GET(cc, 1); + } + +/* None of them matched. */ +OP1(SLJIT_MOV, TMP3, 0, SLJIT_IMM, 0); +jump = JUMP(SLJIT_JUMP); + +if (common->quit != NULL) + { + set_jumps(common->quit, LABEL()); + OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), common->recursive_head_ptr); + if (needs_frame) + { + OP2(SLJIT_ADD, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, (framesize + alternativesize) * sizeof(sljit_sw)); + add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL)); + OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, (framesize + alternativesize) * sizeof(sljit_sw)); + } + OP1(SLJIT_MOV, TMP3, 0, SLJIT_IMM, 0); + common->quit = NULL; + add_jump(compiler, &common->quit, JUMP(SLJIT_JUMP)); + } + +set_jumps(common->accept, LABEL()); +OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), common->recursive_head_ptr); +if (needs_frame) + { + OP2(SLJIT_ADD, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, (framesize + alternativesize) * sizeof(sljit_sw)); + add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL)); + OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, (framesize + alternativesize) * sizeof(sljit_sw)); + } +OP1(SLJIT_MOV, TMP3, 0, SLJIT_IMM, 1); + +JUMPHERE(jump); +if (common->quit != NULL) + set_jumps(common->quit, LABEL()); +copy_private_data(common, ccbegin, ccend, FALSE, framesize + alternativesize, private_data_size + framesize + alternativesize, needs_control_head); +free_stack(common, private_data_size + framesize + alternativesize); +if (needs_control_head) + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(-3)); + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(-2)); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->recursive_head_ptr, TMP1, 0); + OP1(SLJIT_MOV, TMP1, 0, TMP3, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, TMP2, 0); + } +else + { + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(-2)); + OP1(SLJIT_MOV, TMP1, 0, TMP3, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->recursive_head_ptr, TMP2, 0); + } +sljit_emit_fast_return(compiler, SLJIT_MEM1(STACK_TOP), STACK(-1)); +} + +#undef COMPILE_BACKTRACKINGPATH +#undef CURRENT_AS + +void +PRIV(jit_compile)(const REAL_PCRE *re, PUBL(extra) *extra, int mode) +{ +struct sljit_compiler *compiler; +backtrack_common rootbacktrack; +compiler_common common_data; +compiler_common *common = &common_data; +const sljit_u8 *tables = re->tables; +pcre_study_data *study; +int private_data_size; +pcre_uchar *ccend; +executable_functions *functions; +void *executable_func; +sljit_uw executable_size; +sljit_uw total_length; +label_addr_list *label_addr; +struct sljit_label *mainloop_label = NULL; +struct sljit_label *continue_match_label; +struct sljit_label *empty_match_found_label = NULL; +struct sljit_label *empty_match_backtrack_label = NULL; +struct sljit_label *reset_match_label; +struct sljit_label *quit_label; +struct sljit_jump *jump; +struct sljit_jump *minlength_check_failed = NULL; +struct sljit_jump *reqbyte_notfound = NULL; +struct sljit_jump *empty_match = NULL; + +SLJIT_ASSERT((extra->flags & PCRE_EXTRA_STUDY_DATA) != 0); +study = extra->study_data; + +if (!tables) + tables = PRIV(default_tables); + +memset(&rootbacktrack, 0, sizeof(backtrack_common)); +memset(common, 0, sizeof(compiler_common)); +rootbacktrack.cc = (pcre_uchar *)re + re->name_table_offset + re->name_count * re->name_entry_size; + +common->start = rootbacktrack.cc; +common->read_only_data_head = NULL; +common->fcc = tables + fcc_offset; +common->lcc = (sljit_sw)(tables + lcc_offset); +common->mode = mode; +common->might_be_empty = study->minlength == 0; +common->nltype = NLTYPE_FIXED; +switch(re->options & PCRE_NEWLINE_BITS) + { + case 0: + /* Compile-time default */ + switch(NEWLINE) + { + case -1: common->newline = (CHAR_CR << 8) | CHAR_NL; common->nltype = NLTYPE_ANY; break; + case -2: common->newline = (CHAR_CR << 8) | CHAR_NL; common->nltype = NLTYPE_ANYCRLF; break; + default: common->newline = NEWLINE; break; + } + break; + case PCRE_NEWLINE_CR: common->newline = CHAR_CR; break; + case PCRE_NEWLINE_LF: common->newline = CHAR_NL; break; + case PCRE_NEWLINE_CR+ + PCRE_NEWLINE_LF: common->newline = (CHAR_CR << 8) | CHAR_NL; break; + case PCRE_NEWLINE_ANY: common->newline = (CHAR_CR << 8) | CHAR_NL; common->nltype = NLTYPE_ANY; break; + case PCRE_NEWLINE_ANYCRLF: common->newline = (CHAR_CR << 8) | CHAR_NL; common->nltype = NLTYPE_ANYCRLF; break; + default: return; + } +common->nlmax = READ_CHAR_MAX; +common->nlmin = 0; +if ((re->options & PCRE_BSR_ANYCRLF) != 0) + common->bsr_nltype = NLTYPE_ANYCRLF; +else if ((re->options & PCRE_BSR_UNICODE) != 0) + common->bsr_nltype = NLTYPE_ANY; +else + { +#ifdef BSR_ANYCRLF + common->bsr_nltype = NLTYPE_ANYCRLF; +#else + common->bsr_nltype = NLTYPE_ANY; +#endif + } +common->bsr_nlmax = READ_CHAR_MAX; +common->bsr_nlmin = 0; +common->endonly = (re->options & PCRE_DOLLAR_ENDONLY) != 0; +common->ctypes = (sljit_sw)(tables + ctypes_offset); +common->name_table = ((pcre_uchar *)re) + re->name_table_offset; +common->name_count = re->name_count; +common->name_entry_size = re->name_entry_size; +common->jscript_compat = (re->options & PCRE_JAVASCRIPT_COMPAT) != 0; +#ifdef SUPPORT_UTF +/* PCRE_UTF[16|32] have the same value as PCRE_UTF8. */ +common->utf = (re->options & PCRE_UTF8) != 0; +#ifdef SUPPORT_UCP +common->use_ucp = (re->options & PCRE_UCP) != 0; +#endif +if (common->utf) + { + if (common->nltype == NLTYPE_ANY) + common->nlmax = 0x2029; + else if (common->nltype == NLTYPE_ANYCRLF) + common->nlmax = (CHAR_CR > CHAR_NL) ? CHAR_CR : CHAR_NL; + else + { + /* We only care about the first newline character. */ + common->nlmax = common->newline & 0xff; + } + + if (common->nltype == NLTYPE_FIXED) + common->nlmin = common->newline & 0xff; + else + common->nlmin = (CHAR_CR < CHAR_NL) ? CHAR_CR : CHAR_NL; + + if (common->bsr_nltype == NLTYPE_ANY) + common->bsr_nlmax = 0x2029; + else + common->bsr_nlmax = (CHAR_CR > CHAR_NL) ? CHAR_CR : CHAR_NL; + common->bsr_nlmin = (CHAR_CR < CHAR_NL) ? CHAR_CR : CHAR_NL; + } +#endif /* SUPPORT_UTF */ +ccend = bracketend(common->start); + +/* Calculate the local space size on the stack. */ +common->ovector_start = LIMIT_MATCH + sizeof(sljit_sw); +common->optimized_cbracket = (sljit_u8 *)SLJIT_MALLOC(re->top_bracket + 1, compiler->allocator_data); +if (!common->optimized_cbracket) + return; +#if defined DEBUG_FORCE_UNOPTIMIZED_CBRAS && DEBUG_FORCE_UNOPTIMIZED_CBRAS == 1 +memset(common->optimized_cbracket, 0, re->top_bracket + 1); +#else +memset(common->optimized_cbracket, 1, re->top_bracket + 1); +#endif + +SLJIT_ASSERT(*common->start == OP_BRA && ccend[-(1 + LINK_SIZE)] == OP_KET); +#if defined DEBUG_FORCE_UNOPTIMIZED_CBRAS && DEBUG_FORCE_UNOPTIMIZED_CBRAS == 2 +common->capture_last_ptr = common->ovector_start; +common->ovector_start += sizeof(sljit_sw); +#endif +if (!check_opcode_types(common, common->start, ccend)) + { + SLJIT_FREE(common->optimized_cbracket, compiler->allocator_data); + return; + } + +/* Checking flags and updating ovector_start. */ +if (mode == JIT_COMPILE && (re->flags & PCRE_REQCHSET) != 0 && (re->options & PCRE_NO_START_OPTIMIZE) == 0) + { + common->req_char_ptr = common->ovector_start; + common->ovector_start += sizeof(sljit_sw); + } +if (mode != JIT_COMPILE) + { + common->start_used_ptr = common->ovector_start; + common->ovector_start += sizeof(sljit_sw); + if (mode == JIT_PARTIAL_SOFT_COMPILE) + { + common->hit_start = common->ovector_start; + common->ovector_start += 2 * sizeof(sljit_sw); + } + } +if ((re->options & PCRE_FIRSTLINE) != 0) + { + common->match_end_ptr = common->ovector_start; + common->ovector_start += sizeof(sljit_sw); + } +#if defined DEBUG_FORCE_CONTROL_HEAD && DEBUG_FORCE_CONTROL_HEAD +common->control_head_ptr = 1; +#endif +if (common->control_head_ptr != 0) + { + common->control_head_ptr = common->ovector_start; + common->ovector_start += sizeof(sljit_sw); + } +if (common->has_set_som) + { + /* Saving the real start pointer is necessary. */ + common->start_ptr = common->ovector_start; + common->ovector_start += sizeof(sljit_sw); + } + +/* Aligning ovector to even number of sljit words. */ +if ((common->ovector_start & sizeof(sljit_sw)) != 0) + common->ovector_start += sizeof(sljit_sw); + +if (common->start_ptr == 0) + common->start_ptr = OVECTOR(0); + +/* Capturing brackets cannot be optimized if callouts are allowed. */ +if (common->capture_last_ptr != 0) + memset(common->optimized_cbracket, 0, re->top_bracket + 1); + +SLJIT_ASSERT(!(common->req_char_ptr != 0 && common->start_used_ptr != 0)); +common->cbra_ptr = OVECTOR_START + (re->top_bracket + 1) * 2 * sizeof(sljit_sw); + +total_length = ccend - common->start; +common->private_data_ptrs = (sljit_s32 *)SLJIT_MALLOC(total_length * (sizeof(sljit_s32) + (common->has_then ? 1 : 0)), compiler->allocator_data); +if (!common->private_data_ptrs) + { + SLJIT_FREE(common->optimized_cbracket, compiler->allocator_data); + return; + } +memset(common->private_data_ptrs, 0, total_length * sizeof(sljit_s32)); + +private_data_size = common->cbra_ptr + (re->top_bracket + 1) * sizeof(sljit_sw); +set_private_data_ptrs(common, &private_data_size, ccend); +if ((re->options & PCRE_ANCHORED) == 0 && (re->options & PCRE_NO_START_OPTIMIZE) == 0) + { + if (!detect_fast_forward_skip(common, &private_data_size) && !common->has_skip_in_assert_back) + detect_fast_fail(common, common->start, &private_data_size, 4); + } + +SLJIT_ASSERT(common->fast_fail_start_ptr <= common->fast_fail_end_ptr); + +if (private_data_size > SLJIT_MAX_LOCAL_SIZE) + { + SLJIT_FREE(common->private_data_ptrs, compiler->allocator_data); + SLJIT_FREE(common->optimized_cbracket, compiler->allocator_data); + return; + } + +if (common->has_then) + { + common->then_offsets = (sljit_u8 *)(common->private_data_ptrs + total_length); + memset(common->then_offsets, 0, total_length); + set_then_offsets(common, common->start, NULL); + } + +compiler = sljit_create_compiler(NULL); +if (!compiler) + { + SLJIT_FREE(common->optimized_cbracket, compiler->allocator_data); + SLJIT_FREE(common->private_data_ptrs, compiler->allocator_data); + return; + } +common->compiler = compiler; + +/* Main pcre_jit_exec entry. */ +sljit_emit_enter(compiler, 0, SLJIT_ARG1(SW), 5, 5, 0, 0, private_data_size); + +/* Register init. */ +reset_ovector(common, (re->top_bracket + 1) * 2); +if (common->req_char_ptr != 0) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->req_char_ptr, SLJIT_R0, 0); + +OP1(SLJIT_MOV, ARGUMENTS, 0, SLJIT_S0, 0); +OP1(SLJIT_MOV, TMP1, 0, SLJIT_S0, 0); +OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, str)); +OP1(SLJIT_MOV, STR_END, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, end)); +OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, stack)); +OP1(SLJIT_MOV_U32, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, limit_match)); +OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(struct sljit_stack, end)); +OP1(SLJIT_MOV, STACK_LIMIT, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(struct sljit_stack, start)); +OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 1); +OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LIMIT_MATCH, TMP1, 0); + +if (common->fast_fail_start_ptr < common->fast_fail_end_ptr) + reset_fast_fail(common); + +if (mode == JIT_PARTIAL_SOFT_COMPILE) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->hit_start, SLJIT_IMM, -1); +if (common->mark_ptr != 0) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->mark_ptr, SLJIT_IMM, 0); +if (common->control_head_ptr != 0) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_IMM, 0); + +/* Main part of the matching */ +if ((re->options & PCRE_ANCHORED) == 0) + { + mainloop_label = mainloop_entry(common, (re->flags & PCRE_HASCRORLF) != 0); + continue_match_label = LABEL(); + /* Forward search if possible. */ + if ((re->options & PCRE_NO_START_OPTIMIZE) == 0) + { + if (mode == JIT_COMPILE && fast_forward_first_n_chars(common)) + ; + else if ((re->flags & PCRE_FIRSTSET) != 0) + fast_forward_first_char(common, (pcre_uchar)re->first_char, (re->flags & PCRE_FCH_CASELESS) != 0); + else if ((re->flags & PCRE_STARTLINE) != 0) + fast_forward_newline(common); + else if (study != NULL && (study->flags & PCRE_STUDY_MAPPED) != 0) + fast_forward_start_bits(common, study->start_bits); + } + } +else + continue_match_label = LABEL(); + +if (mode == JIT_COMPILE && study->minlength > 0 && (re->options & PCRE_NO_START_OPTIMIZE) == 0) + { + OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, PCRE_ERROR_NOMATCH); + OP2(SLJIT_ADD, TMP2, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(study->minlength)); + minlength_check_failed = CMP(SLJIT_GREATER, TMP2, 0, STR_END, 0); + } +if (common->req_char_ptr != 0) + reqbyte_notfound = search_requested_char(common, (pcre_uchar)re->req_char, (re->flags & PCRE_RCH_CASELESS) != 0, (re->flags & PCRE_FIRSTSET) != 0); + +/* Store the current STR_PTR in OVECTOR(0). */ +OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(0), STR_PTR, 0); +/* Copy the limit of allowed recursions. */ +OP1(SLJIT_MOV, COUNT_MATCH, 0, SLJIT_MEM1(SLJIT_SP), LIMIT_MATCH); +if (common->capture_last_ptr != 0) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->capture_last_ptr, SLJIT_IMM, -1); +if (common->fast_forward_bc_ptr != NULL) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), PRIVATE_DATA(common->fast_forward_bc_ptr + 1), STR_PTR, 0); + +if (common->start_ptr != OVECTOR(0)) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->start_ptr, STR_PTR, 0); + +/* Copy the beginning of the string. */ +if (mode == JIT_PARTIAL_SOFT_COMPILE) + { + jump = CMP(SLJIT_NOT_EQUAL, SLJIT_MEM1(SLJIT_SP), common->hit_start, SLJIT_IMM, -1); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->hit_start + sizeof(sljit_sw), STR_PTR, 0); + JUMPHERE(jump); + } +else if (mode == JIT_PARTIAL_HARD_COMPILE) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0); + +compile_matchingpath(common, common->start, ccend, &rootbacktrack); +if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler))) + { + sljit_free_compiler(compiler); + SLJIT_FREE(common->optimized_cbracket, compiler->allocator_data); + SLJIT_FREE(common->private_data_ptrs, compiler->allocator_data); + free_read_only_data(common->read_only_data_head, compiler->allocator_data); + return; + } + +if (common->might_be_empty) + { + empty_match = CMP(SLJIT_EQUAL, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(0)); + empty_match_found_label = LABEL(); + } + +common->accept_label = LABEL(); +if (common->accept != NULL) + set_jumps(common->accept, common->accept_label); + +/* This means we have a match. Update the ovector. */ +copy_ovector(common, re->top_bracket + 1); +common->quit_label = common->forced_quit_label = LABEL(); +if (common->quit != NULL) + set_jumps(common->quit, common->quit_label); +if (common->forced_quit != NULL) + set_jumps(common->forced_quit, common->forced_quit_label); +if (minlength_check_failed != NULL) + SET_LABEL(minlength_check_failed, common->forced_quit_label); +sljit_emit_return(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0); + +if (mode != JIT_COMPILE) + { + common->partialmatchlabel = LABEL(); + set_jumps(common->partialmatch, common->partialmatchlabel); + return_with_partial_match(common, common->quit_label); + } + +if (common->might_be_empty) + empty_match_backtrack_label = LABEL(); +compile_backtrackingpath(common, rootbacktrack.top); +if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler))) + { + sljit_free_compiler(compiler); + SLJIT_FREE(common->optimized_cbracket, compiler->allocator_data); + SLJIT_FREE(common->private_data_ptrs, compiler->allocator_data); + free_read_only_data(common->read_only_data_head, compiler->allocator_data); + return; + } + +SLJIT_ASSERT(rootbacktrack.prev == NULL); +reset_match_label = LABEL(); + +if (mode == JIT_PARTIAL_SOFT_COMPILE) + { + /* Update hit_start only in the first time. */ + jump = CMP(SLJIT_NOT_EQUAL, SLJIT_MEM1(SLJIT_SP), common->hit_start, SLJIT_IMM, 0); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, SLJIT_IMM, -1); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->hit_start, TMP1, 0); + JUMPHERE(jump); + } + +/* Check we have remaining characters. */ +if ((re->options & PCRE_ANCHORED) == 0 && (re->options & PCRE_FIRSTLINE) != 0) + { + SLJIT_ASSERT(common->match_end_ptr != 0); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr); + } + +OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), + (common->fast_forward_bc_ptr != NULL) ? (PRIVATE_DATA(common->fast_forward_bc_ptr + 1)) : common->start_ptr); + +if ((re->options & PCRE_ANCHORED) == 0) + { + if (common->ff_newline_shortcut != NULL) + { + if ((re->options & PCRE_FIRSTLINE) == 0) + CMPTO(SLJIT_LESS, STR_PTR, 0, STR_END, 0, common->ff_newline_shortcut); + /* There cannot be more newlines here. */ + } + else + CMPTO(SLJIT_LESS, STR_PTR, 0, ((re->options & PCRE_FIRSTLINE) == 0) ? STR_END : TMP1, 0, mainloop_label); + } + +/* No more remaining characters. */ +if (reqbyte_notfound != NULL) + JUMPHERE(reqbyte_notfound); + +if (mode == JIT_PARTIAL_SOFT_COMPILE) + CMPTO(SLJIT_NOT_EQUAL, SLJIT_MEM1(SLJIT_SP), common->hit_start, SLJIT_IMM, -1, common->partialmatchlabel); + +OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, PCRE_ERROR_NOMATCH); +JUMPTO(SLJIT_JUMP, common->quit_label); + +flush_stubs(common); + +if (common->might_be_empty) + { + JUMPHERE(empty_match); + OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0); + OP1(SLJIT_MOV_U8, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, notempty)); + CMPTO(SLJIT_NOT_EQUAL, TMP2, 0, SLJIT_IMM, 0, empty_match_backtrack_label); + OP1(SLJIT_MOV_U8, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, notempty_atstart)); + CMPTO(SLJIT_EQUAL, TMP2, 0, SLJIT_IMM, 0, empty_match_found_label); + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, str)); + CMPTO(SLJIT_NOT_EQUAL, TMP2, 0, STR_PTR, 0, empty_match_found_label); + JUMPTO(SLJIT_JUMP, empty_match_backtrack_label); + } + +common->fast_forward_bc_ptr = NULL; +common->fast_fail_start_ptr = 0; +common->fast_fail_end_ptr = 0; +common->currententry = common->entries; +common->local_exit = TRUE; +quit_label = common->quit_label; +while (common->currententry != NULL) + { + /* Might add new entries. */ + compile_recurse(common); + if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler))) + { + sljit_free_compiler(compiler); + SLJIT_FREE(common->optimized_cbracket, compiler->allocator_data); + SLJIT_FREE(common->private_data_ptrs, compiler->allocator_data); + free_read_only_data(common->read_only_data_head, compiler->allocator_data); + return; + } + flush_stubs(common); + common->currententry = common->currententry->next; + } +common->local_exit = FALSE; +common->quit_label = quit_label; + +/* Allocating stack, returns with PCRE_ERROR_JIT_STACKLIMIT if fails. */ +/* This is a (really) rare case. */ +set_jumps(common->stackalloc, LABEL()); +/* RETURN_ADDR is not a saved register. */ +sljit_emit_fast_enter(compiler, SLJIT_MEM1(SLJIT_SP), LOCALS0); + +SLJIT_ASSERT(TMP1 == SLJIT_R0 && STACK_TOP == SLJIT_R1); + +OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS1, STACK_TOP, 0); +OP1(SLJIT_MOV, SLJIT_R0, 0, ARGUMENTS, 0); +OP2(SLJIT_SUB, SLJIT_R1, 0, STACK_LIMIT, 0, SLJIT_IMM, STACK_GROWTH_RATE); +OP1(SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_R0), SLJIT_OFFSETOF(jit_arguments, stack)); +OP1(SLJIT_MOV, STACK_LIMIT, 0, TMP2, 0); + +sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(SW), SLJIT_IMM, SLJIT_FUNC_OFFSET(sljit_stack_resize)); +jump = CMP(SLJIT_EQUAL, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0); +OP1(SLJIT_MOV, TMP2, 0, STACK_LIMIT, 0); +OP1(SLJIT_MOV, STACK_LIMIT, 0, SLJIT_RETURN_REG, 0); +OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0); +OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), LOCALS1); +sljit_emit_fast_return(compiler, TMP1, 0); + +/* Allocation failed. */ +JUMPHERE(jump); +/* We break the return address cache here, but this is a really rare case. */ +OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, PCRE_ERROR_JIT_STACKLIMIT); +JUMPTO(SLJIT_JUMP, common->quit_label); + +/* Call limit reached. */ +set_jumps(common->calllimit, LABEL()); +OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, PCRE_ERROR_MATCHLIMIT); +JUMPTO(SLJIT_JUMP, common->quit_label); + +if (common->revertframes != NULL) + { + set_jumps(common->revertframes, LABEL()); + do_revertframes(common); + } +if (common->wordboundary != NULL) + { + set_jumps(common->wordboundary, LABEL()); + check_wordboundary(common); + } +if (common->anynewline != NULL) + { + set_jumps(common->anynewline, LABEL()); + check_anynewline(common); + } +if (common->hspace != NULL) + { + set_jumps(common->hspace, LABEL()); + check_hspace(common); + } +if (common->vspace != NULL) + { + set_jumps(common->vspace, LABEL()); + check_vspace(common); + } +if (common->casefulcmp != NULL) + { + set_jumps(common->casefulcmp, LABEL()); + do_casefulcmp(common); + } +if (common->caselesscmp != NULL) + { + set_jumps(common->caselesscmp, LABEL()); + do_caselesscmp(common); + } +if (common->reset_match != NULL) + { + set_jumps(common->reset_match, LABEL()); + do_reset_match(common, (re->top_bracket + 1) * 2); + CMPTO(SLJIT_GREATER, STR_PTR, 0, TMP1, 0, continue_match_label); + OP1(SLJIT_MOV, STR_PTR, 0, TMP1, 0); + JUMPTO(SLJIT_JUMP, reset_match_label); + } +#ifdef SUPPORT_UTF +#ifdef COMPILE_PCRE8 +if (common->utfreadchar != NULL) + { + set_jumps(common->utfreadchar, LABEL()); + do_utfreadchar(common); + } +if (common->utfreadchar16 != NULL) + { + set_jumps(common->utfreadchar16, LABEL()); + do_utfreadchar16(common); + } +if (common->utfreadtype8 != NULL) + { + set_jumps(common->utfreadtype8, LABEL()); + do_utfreadtype8(common); + } +#endif /* COMPILE_PCRE8 */ +#endif /* SUPPORT_UTF */ +#ifdef SUPPORT_UCP +if (common->getucd != NULL) + { + set_jumps(common->getucd, LABEL()); + do_getucd(common); + } +#endif + +SLJIT_FREE(common->optimized_cbracket, compiler->allocator_data); +SLJIT_FREE(common->private_data_ptrs, compiler->allocator_data); + +executable_func = sljit_generate_code(compiler); +executable_size = sljit_get_generated_code_size(compiler); +label_addr = common->label_addrs; +while (label_addr != NULL) + { + *label_addr->update_addr = sljit_get_label_addr(label_addr->label); + label_addr = label_addr->next; + } +sljit_free_compiler(compiler); +if (executable_func == NULL) + { + free_read_only_data(common->read_only_data_head, compiler->allocator_data); + return; + } + +/* Reuse the function descriptor if possible. */ +if ((extra->flags & PCRE_EXTRA_EXECUTABLE_JIT) != 0 && extra->executable_jit != NULL) + functions = (executable_functions *)extra->executable_jit; +else + { + /* Note: If your memory-checker has flagged the allocation below as a + * memory leak, it is probably because you either forgot to call + * pcre_free_study() (or pcre16_free_study()) on the pcre_extra (or + * pcre16_extra) object, or you called said function after having + * cleared the PCRE_EXTRA_EXECUTABLE_JIT bit from the "flags" field + * of the object. (The function will only free the JIT data if the + * bit remains set, as the bit indicates that the pointer to the data + * is valid.) + */ + functions = SLJIT_MALLOC(sizeof(executable_functions), compiler->allocator_data); + if (functions == NULL) + { + /* This case is highly unlikely since we just recently + freed a lot of memory. Not impossible though. */ + sljit_free_code(executable_func); + free_read_only_data(common->read_only_data_head, compiler->allocator_data); + return; + } + memset(functions, 0, sizeof(executable_functions)); + functions->top_bracket = (re->top_bracket + 1) * 2; + functions->limit_match = (re->flags & PCRE_MLSET) != 0 ? re->limit_match : 0; + extra->executable_jit = functions; + extra->flags |= PCRE_EXTRA_EXECUTABLE_JIT; + } + +functions->executable_funcs[mode] = executable_func; +functions->read_only_data_heads[mode] = common->read_only_data_head; +functions->executable_sizes[mode] = executable_size; +} + +static SLJIT_NOINLINE int jit_machine_stack_exec(jit_arguments *arguments, void *executable_func) +{ +union { + void *executable_func; + jit_function call_executable_func; +} convert_executable_func; +sljit_u8 local_space[MACHINE_STACK_SIZE]; +struct sljit_stack local_stack; + +local_stack.min_start = local_space; +local_stack.start = local_space; +local_stack.end = local_space + MACHINE_STACK_SIZE; +local_stack.top = local_space + MACHINE_STACK_SIZE; +arguments->stack = &local_stack; +convert_executable_func.executable_func = executable_func; +return convert_executable_func.call_executable_func(arguments); +} + +int +PRIV(jit_exec)(const PUBL(extra) *extra_data, const pcre_uchar *subject, + int length, int start_offset, int options, int *offsets, int offset_count) +{ +executable_functions *functions = (executable_functions *)extra_data->executable_jit; +union { + void *executable_func; + jit_function call_executable_func; +} convert_executable_func; +jit_arguments arguments; +int max_offset_count; +int retval; +int mode = JIT_COMPILE; + +if ((options & PCRE_PARTIAL_HARD) != 0) + mode = JIT_PARTIAL_HARD_COMPILE; +else if ((options & PCRE_PARTIAL_SOFT) != 0) + mode = JIT_PARTIAL_SOFT_COMPILE; + +if (functions->executable_funcs[mode] == NULL) + return PCRE_ERROR_JIT_BADOPTION; + +/* Sanity checks should be handled by pcre_exec. */ +arguments.str = subject + start_offset; +arguments.begin = subject; +arguments.end = subject + length; +arguments.mark_ptr = NULL; +/* JIT decreases this value less frequently than the interpreter. */ +arguments.limit_match = ((extra_data->flags & PCRE_EXTRA_MATCH_LIMIT) == 0) ? MATCH_LIMIT : (sljit_u32)(extra_data->match_limit); +if (functions->limit_match != 0 && functions->limit_match < arguments.limit_match) + arguments.limit_match = functions->limit_match; +arguments.notbol = (options & PCRE_NOTBOL) != 0; +arguments.noteol = (options & PCRE_NOTEOL) != 0; +arguments.notempty = (options & PCRE_NOTEMPTY) != 0; +arguments.notempty_atstart = (options & PCRE_NOTEMPTY_ATSTART) != 0; +arguments.offsets = offsets; +arguments.callout_data = (extra_data->flags & PCRE_EXTRA_CALLOUT_DATA) != 0 ? extra_data->callout_data : NULL; +arguments.real_offset_count = offset_count; + +/* pcre_exec() rounds offset_count to a multiple of 3, and then uses only 2/3 of +the output vector for storing captured strings, with the remainder used as +workspace. We don't need the workspace here. For compatibility, we limit the +number of captured strings in the same way as pcre_exec(), so that the user +gets the same result with and without JIT. */ + +if (offset_count != 2) + offset_count = ((offset_count - (offset_count % 3)) * 2) / 3; +max_offset_count = functions->top_bracket; +if (offset_count > max_offset_count) + offset_count = max_offset_count; +arguments.offset_count = offset_count; + +if (functions->callback) + arguments.stack = (struct sljit_stack *)functions->callback(functions->userdata); +else + arguments.stack = (struct sljit_stack *)functions->userdata; + +if (arguments.stack == NULL) + retval = jit_machine_stack_exec(&arguments, functions->executable_funcs[mode]); +else + { + convert_executable_func.executable_func = functions->executable_funcs[mode]; + retval = convert_executable_func.call_executable_func(&arguments); + } + +if (retval * 2 > offset_count) + retval = 0; +if ((extra_data->flags & PCRE_EXTRA_MARK) != 0) + *(extra_data->mark) = arguments.mark_ptr; + +return retval; +} + +#if defined COMPILE_PCRE8 +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre_jit_exec(const pcre *argument_re, const pcre_extra *extra_data, + PCRE_SPTR subject, int length, int start_offset, int options, + int *offsets, int offset_count, pcre_jit_stack *stack) +#elif defined COMPILE_PCRE16 +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre16_jit_exec(const pcre16 *argument_re, const pcre16_extra *extra_data, + PCRE_SPTR16 subject, int length, int start_offset, int options, + int *offsets, int offset_count, pcre16_jit_stack *stack) +#elif defined COMPILE_PCRE32 +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre32_jit_exec(const pcre32 *argument_re, const pcre32_extra *extra_data, + PCRE_SPTR32 subject, int length, int start_offset, int options, + int *offsets, int offset_count, pcre32_jit_stack *stack) +#endif +{ +pcre_uchar *subject_ptr = (pcre_uchar *)subject; +executable_functions *functions = (executable_functions *)extra_data->executable_jit; +union { + void *executable_func; + jit_function call_executable_func; +} convert_executable_func; +jit_arguments arguments; +int max_offset_count; +int retval; +int mode = JIT_COMPILE; + +SLJIT_UNUSED_ARG(argument_re); + +/* Plausibility checks */ +if ((options & ~PUBLIC_JIT_EXEC_OPTIONS) != 0) return PCRE_ERROR_JIT_BADOPTION; + +if ((options & PCRE_PARTIAL_HARD) != 0) + mode = JIT_PARTIAL_HARD_COMPILE; +else if ((options & PCRE_PARTIAL_SOFT) != 0) + mode = JIT_PARTIAL_SOFT_COMPILE; + +if (functions == NULL || functions->executable_funcs[mode] == NULL) + return PCRE_ERROR_JIT_BADOPTION; + +/* Sanity checks should be handled by pcre_exec. */ +arguments.stack = (struct sljit_stack *)stack; +arguments.str = subject_ptr + start_offset; +arguments.begin = subject_ptr; +arguments.end = subject_ptr + length; +arguments.mark_ptr = NULL; +/* JIT decreases this value less frequently than the interpreter. */ +arguments.limit_match = ((extra_data->flags & PCRE_EXTRA_MATCH_LIMIT) == 0) ? MATCH_LIMIT : (sljit_u32)(extra_data->match_limit); +if (functions->limit_match != 0 && functions->limit_match < arguments.limit_match) + arguments.limit_match = functions->limit_match; +arguments.notbol = (options & PCRE_NOTBOL) != 0; +arguments.noteol = (options & PCRE_NOTEOL) != 0; +arguments.notempty = (options & PCRE_NOTEMPTY) != 0; +arguments.notempty_atstart = (options & PCRE_NOTEMPTY_ATSTART) != 0; +arguments.offsets = offsets; +arguments.callout_data = (extra_data->flags & PCRE_EXTRA_CALLOUT_DATA) != 0 ? extra_data->callout_data : NULL; +arguments.real_offset_count = offset_count; + +/* pcre_exec() rounds offset_count to a multiple of 3, and then uses only 2/3 of +the output vector for storing captured strings, with the remainder used as +workspace. We don't need the workspace here. For compatibility, we limit the +number of captured strings in the same way as pcre_exec(), so that the user +gets the same result with and without JIT. */ + +if (offset_count != 2) + offset_count = ((offset_count - (offset_count % 3)) * 2) / 3; +max_offset_count = functions->top_bracket; +if (offset_count > max_offset_count) + offset_count = max_offset_count; +arguments.offset_count = offset_count; + +convert_executable_func.executable_func = functions->executable_funcs[mode]; +retval = convert_executable_func.call_executable_func(&arguments); + +if (retval * 2 > offset_count) + retval = 0; +if ((extra_data->flags & PCRE_EXTRA_MARK) != 0) + *(extra_data->mark) = arguments.mark_ptr; + +return retval; +} + +void +PRIV(jit_free)(void *executable_funcs) +{ +int i; +executable_functions *functions = (executable_functions *)executable_funcs; +for (i = 0; i < JIT_NUMBER_OF_COMPILE_MODES; i++) + { + if (functions->executable_funcs[i] != NULL) + sljit_free_code(functions->executable_funcs[i]); + free_read_only_data(functions->read_only_data_heads[i], NULL); + } +SLJIT_FREE(functions, compiler->allocator_data); +} + +int +PRIV(jit_get_size)(void *executable_funcs) +{ +int i; +sljit_uw size = 0; +sljit_uw *executable_sizes = ((executable_functions *)executable_funcs)->executable_sizes; +for (i = 0; i < JIT_NUMBER_OF_COMPILE_MODES; i++) + size += executable_sizes[i]; +return (int)size; +} + +const char* +PRIV(jit_get_target)(void) +{ +return sljit_get_platform_name(); +} + +#if defined COMPILE_PCRE8 +PCRE_EXP_DECL pcre_jit_stack * +pcre_jit_stack_alloc(int startsize, int maxsize) +#elif defined COMPILE_PCRE16 +PCRE_EXP_DECL pcre16_jit_stack * +pcre16_jit_stack_alloc(int startsize, int maxsize) +#elif defined COMPILE_PCRE32 +PCRE_EXP_DECL pcre32_jit_stack * +pcre32_jit_stack_alloc(int startsize, int maxsize) +#endif +{ +if (startsize < 1 || maxsize < 1) + return NULL; +if (startsize > maxsize) + startsize = maxsize; +startsize = (startsize + STACK_GROWTH_RATE - 1) & ~(STACK_GROWTH_RATE - 1); +maxsize = (maxsize + STACK_GROWTH_RATE - 1) & ~(STACK_GROWTH_RATE - 1); +return (PUBL(jit_stack)*)sljit_allocate_stack(startsize, maxsize, NULL); +} + +#if defined COMPILE_PCRE8 +PCRE_EXP_DECL void +pcre_jit_stack_free(pcre_jit_stack *stack) +#elif defined COMPILE_PCRE16 +PCRE_EXP_DECL void +pcre16_jit_stack_free(pcre16_jit_stack *stack) +#elif defined COMPILE_PCRE32 +PCRE_EXP_DECL void +pcre32_jit_stack_free(pcre32_jit_stack *stack) +#endif +{ +sljit_free_stack((struct sljit_stack *)stack, NULL); +} + +#if defined COMPILE_PCRE8 +PCRE_EXP_DECL void +pcre_assign_jit_stack(pcre_extra *extra, pcre_jit_callback callback, void *userdata) +#elif defined COMPILE_PCRE16 +PCRE_EXP_DECL void +pcre16_assign_jit_stack(pcre16_extra *extra, pcre16_jit_callback callback, void *userdata) +#elif defined COMPILE_PCRE32 +PCRE_EXP_DECL void +pcre32_assign_jit_stack(pcre32_extra *extra, pcre32_jit_callback callback, void *userdata) +#endif +{ +executable_functions *functions; +if (extra != NULL && + (extra->flags & PCRE_EXTRA_EXECUTABLE_JIT) != 0 && + extra->executable_jit != NULL) + { + functions = (executable_functions *)extra->executable_jit; + functions->callback = callback; + functions->userdata = userdata; + } +} + +#if defined COMPILE_PCRE8 +PCRE_EXP_DECL void +pcre_jit_free_unused_memory(void) +#elif defined COMPILE_PCRE16 +PCRE_EXP_DECL void +pcre16_jit_free_unused_memory(void) +#elif defined COMPILE_PCRE32 +PCRE_EXP_DECL void +pcre32_jit_free_unused_memory(void) +#endif +{ +sljit_free_unused_memory_exec(); +} + +#else /* SUPPORT_JIT */ + +/* These are dummy functions to avoid linking errors when JIT support is not +being compiled. */ + +#if defined COMPILE_PCRE8 +PCRE_EXP_DECL pcre_jit_stack * +pcre_jit_stack_alloc(int startsize, int maxsize) +#elif defined COMPILE_PCRE16 +PCRE_EXP_DECL pcre16_jit_stack * +pcre16_jit_stack_alloc(int startsize, int maxsize) +#elif defined COMPILE_PCRE32 +PCRE_EXP_DECL pcre32_jit_stack * +pcre32_jit_stack_alloc(int startsize, int maxsize) +#endif +{ +(void)startsize; +(void)maxsize; +return NULL; +} + +#if defined COMPILE_PCRE8 +PCRE_EXP_DECL void +pcre_jit_stack_free(pcre_jit_stack *stack) +#elif defined COMPILE_PCRE16 +PCRE_EXP_DECL void +pcre16_jit_stack_free(pcre16_jit_stack *stack) +#elif defined COMPILE_PCRE32 +PCRE_EXP_DECL void +pcre32_jit_stack_free(pcre32_jit_stack *stack) +#endif +{ +(void)stack; +} + +#if defined COMPILE_PCRE8 +PCRE_EXP_DECL void +pcre_assign_jit_stack(pcre_extra *extra, pcre_jit_callback callback, void *userdata) +#elif defined COMPILE_PCRE16 +PCRE_EXP_DECL void +pcre16_assign_jit_stack(pcre16_extra *extra, pcre16_jit_callback callback, void *userdata) +#elif defined COMPILE_PCRE32 +PCRE_EXP_DECL void +pcre32_assign_jit_stack(pcre32_extra *extra, pcre32_jit_callback callback, void *userdata) +#endif +{ +(void)extra; +(void)callback; +(void)userdata; +} + +#if defined COMPILE_PCRE8 +PCRE_EXP_DECL void +pcre_jit_free_unused_memory(void) +#elif defined COMPILE_PCRE16 +PCRE_EXP_DECL void +pcre16_jit_free_unused_memory(void) +#elif defined COMPILE_PCRE32 +PCRE_EXP_DECL void +pcre32_jit_free_unused_memory(void) +#endif +{ +} + +#endif + +/* End of pcre_jit_compile.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_jit_test.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_jit_test.c new file mode 100755 index 000000000..034cb5269 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_jit_test.c @@ -0,0 +1,1765 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Main Library written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + + This JIT compiler regression test program was written by Zoltan Herczeg + Copyright (c) 2010-2012 + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include "pcre.h" + + +#include "pcre_internal.h" + +/* + Letter characters: + \xe6\x92\xad = 0x64ad = 25773 (kanji) + Non-letter characters: + \xc2\xa1 = 0xa1 = (Inverted Exclamation Mark) + \xf3\xa9\xb7\x80 = 0xe9dc0 = 957888 + \xed\xa0\x80 = 55296 = 0xd800 (Invalid UTF character) + \xed\xb0\x80 = 56320 = 0xdc00 (Invalid UTF character) + Newlines: + \xc2\x85 = 0x85 = 133 (NExt Line = NEL) + \xe2\x80\xa8 = 0x2028 = 8232 (Line Separator) + Othercase pairs: + \xc3\xa9 = 0xe9 = 233 (e') + \xc3\x89 = 0xc9 = 201 (E') + \xc3\xa1 = 0xe1 = 225 (a') + \xc3\x81 = 0xc1 = 193 (A') + \x53 = 0x53 = S + \x73 = 0x73 = s + \xc5\xbf = 0x17f = 383 (long S) + \xc8\xba = 0x23a = 570 + \xe2\xb1\xa5 = 0x2c65 = 11365 + \xe1\xbd\xb8 = 0x1f78 = 8056 + \xe1\xbf\xb8 = 0x1ff8 = 8184 + \xf0\x90\x90\x80 = 0x10400 = 66560 + \xf0\x90\x90\xa8 = 0x10428 = 66600 + \xc7\x84 = 0x1c4 = 452 + \xc7\x85 = 0x1c5 = 453 + \xc7\x86 = 0x1c6 = 454 + Caseless sets: + ucp_Armenian - \x{531}-\x{556} -> \x{561}-\x{586} + ucp_Coptic - \x{2c80}-\x{2ce3} -> caseless: XOR 0x1 + ucp_Latin - \x{ff21}-\x{ff3a} -> \x{ff41]-\x{ff5a} + + Mark property: + \xcc\x8d = 0x30d = 781 + Special: + \xc2\x80 = 0x80 = 128 (lowest 2 byte character) + \xdf\xbf = 0x7ff = 2047 (highest 2 byte character) + \xe0\xa0\x80 = 0x800 = 2048 (lowest 2 byte character) + \xef\xbf\xbf = 0xffff = 65535 (highest 3 byte character) + \xf0\x90\x80\x80 = 0x10000 = 65536 (lowest 4 byte character) + \xf4\x8f\xbf\xbf = 0x10ffff = 1114111 (highest allowed utf character) +*/ + +static int regression_tests(void); + +int main(void) +{ + int jit = 0; +#if defined SUPPORT_PCRE8 + pcre_config(PCRE_CONFIG_JIT, &jit); +#elif defined SUPPORT_PCRE16 + pcre16_config(PCRE_CONFIG_JIT, &jit); +#elif defined SUPPORT_PCRE32 + pcre32_config(PCRE_CONFIG_JIT, &jit); +#endif + if (!jit) { + printf("JIT must be enabled to run pcre_jit_test\n"); + return 1; + } + return regression_tests(); +} + +/* --------------------------------------------------------------------------------------- */ + +#if !(defined SUPPORT_PCRE8) && !(defined SUPPORT_PCRE16) && !(defined SUPPORT_PCRE32) +#error SUPPORT_PCRE8 or SUPPORT_PCRE16 or SUPPORT_PCRE32 must be defined +#endif + +#define MUA (PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_ANYCRLF) +#define MUAP (PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_ANYCRLF | PCRE_UCP) +#define CMUA (PCRE_CASELESS | PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_ANYCRLF) +#define CMUAP (PCRE_CASELESS | PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_ANYCRLF | PCRE_UCP) +#define MA (PCRE_MULTILINE | PCRE_NEWLINE_ANYCRLF) +#define MAP (PCRE_MULTILINE | PCRE_NEWLINE_ANYCRLF | PCRE_UCP) +#define CMA (PCRE_CASELESS | PCRE_MULTILINE | PCRE_NEWLINE_ANYCRLF) + +#define OFFSET_MASK 0x00ffff +#define F_NO8 0x010000 +#define F_NO16 0x020000 +#define F_NO32 0x020000 +#define F_NOMATCH 0x040000 +#define F_DIFF 0x080000 +#define F_FORCECONV 0x100000 +#define F_PROPERTY 0x200000 +#define F_STUDY 0x400000 + +struct regression_test_case { + int flags; + int start_offset; + const char *pattern; + const char *input; +}; + +static struct regression_test_case regression_test_cases[] = { + /* Constant strings. */ + { MUA, 0, "AbC", "AbAbC" }, + { MUA, 0, "ACCEPT", "AACACCACCEACCEPACCEPTACCEPTT" }, + { CMUA, 0, "aA#\xc3\xa9\xc3\x81", "aA#Aa#\xc3\x89\xc3\xa1" }, + { MA, 0, "[^a]", "aAbB" }, + { CMA, 0, "[^m]", "mMnN" }, + { MA, 0, "a[^b][^#]", "abacd" }, + { CMA, 0, "A[^B][^E]", "abacd" }, + { CMUA, 0, "[^x][^#]", "XxBll" }, + { MUA, 0, "[^a]", "aaa\xc3\xa1#Ab" }, + { CMUA, 0, "[^A]", "aA\xe6\x92\xad" }, + { MUA, 0, "\\W(\\W)?\\w", "\r\n+bc" }, + { MUA, 0, "\\W(\\W)?\\w", "\n\r+bc" }, + { MUA, 0, "\\W(\\W)?\\w", "\r\r+bc" }, + { MUA, 0, "\\W(\\W)?\\w", "\n\n+bc" }, + { MUA, 0, "[axd]", "sAXd" }, + { CMUA, 0, "[axd]", "sAXd" }, + { CMUA, 0 | F_NOMATCH, "[^axd]", "DxA" }, + { MUA, 0, "[a-dA-C]", "\xe6\x92\xad\xc3\xa9.B" }, + { MUA, 0, "[^a-dA-C]", "\xe6\x92\xad\xc3\xa9" }, + { CMUA, 0, "[^\xc3\xa9]", "\xc3\xa9\xc3\x89." }, + { MUA, 0, "[^\xc3\xa9]", "\xc3\xa9\xc3\x89." }, + { MUA, 0, "[^a]", "\xc2\x80[]" }, + { CMUA, 0, "\xf0\x90\x90\xa7", "\xf0\x90\x91\x8f" }, + { CMA, 0, "1a2b3c4", "1a2B3c51A2B3C4" }, + { PCRE_CASELESS, 0, "\xff#a", "\xff#\xff\xfe##\xff#A" }, + { PCRE_CASELESS, 0, "\xfe", "\xff\xfc#\xfe\xfe" }, + { PCRE_CASELESS, 0, "a1", "Aa1" }, + { MA, 0, "\\Ca", "cda" }, + { CMA, 0, "\\Ca", "CDA" }, + { MA, 0 | F_NOMATCH, "\\Cx", "cda" }, + { CMA, 0 | F_NOMATCH, "\\Cx", "CDA" }, + { CMUAP, 0, "\xf0\x90\x90\x80\xf0\x90\x90\xa8", "\xf0\x90\x90\xa8\xf0\x90\x90\x80" }, + { CMUAP, 0, "\xf0\x90\x90\x80{2}", "\xf0\x90\x90\x80#\xf0\x90\x90\xa8\xf0\x90\x90\x80" }, + { CMUAP, 0, "\xf0\x90\x90\xa8{2}", "\xf0\x90\x90\x80#\xf0\x90\x90\xa8\xf0\x90\x90\x80" }, + { CMUAP, 0, "\xe1\xbd\xb8\xe1\xbf\xb8", "\xe1\xbf\xb8\xe1\xbd\xb8" }, + { MA, 0, "[3-57-9]", "5" }, + + /* Assertions. */ + { MUA, 0, "\\b[^A]", "A_B#" }, + { MA, 0 | F_NOMATCH, "\\b\\W", "\n*" }, + { MUA, 0, "\\B[^,]\\b[^s]\\b", "#X" }, + { MAP, 0, "\\B", "_\xa1" }, + { MAP, 0, "\\b_\\b[,A]\\B", "_," }, + { MUAP, 0, "\\b", "\xe6\x92\xad!" }, + { MUAP, 0, "\\B", "_\xc2\xa1\xc3\xa1\xc2\x85" }, + { MUAP, 0, "\\b[^A]\\B[^c]\\b[^_]\\B", "_\xc3\xa1\xe2\x80\xa8" }, + { MUAP, 0, "\\b\\w+\\B", "\xc3\x89\xc2\xa1\xe6\x92\xad\xc3\x81\xc3\xa1" }, + { MUA, 0 | F_NOMATCH, "\\b.", "\xcd\xbe" }, + { CMUAP, 0, "\\By", "\xf0\x90\x90\xa8y" }, + { MA, 0 | F_NOMATCH, "\\R^", "\n" }, + { MA, 1 | F_NOMATCH, "^", "\n" }, + { 0, 0, "^ab", "ab" }, + { 0, 0 | F_NOMATCH, "^ab", "aab" }, + { PCRE_MULTILINE | PCRE_NEWLINE_CRLF, 0, "^a", "\r\raa\n\naa\r\naa" }, + { PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_ANYCRLF, 0, "^-", "\xe2\x80\xa8--\xc2\x85-\r\n-" }, + { PCRE_MULTILINE | PCRE_NEWLINE_ANY, 0, "^-", "a--b--\x85--" }, + { PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_ANY, 0, "^-", "a--\xe2\x80\xa8--" }, + { PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_ANY, 0, "^-", "a--\xc2\x85--" }, + { 0, 0, "ab$", "ab" }, + { 0, 0 | F_NOMATCH, "ab$", "abab\n\n" }, + { PCRE_DOLLAR_ENDONLY, 0 | F_NOMATCH, "ab$", "abab\r\n" }, + { PCRE_MULTILINE | PCRE_NEWLINE_CRLF, 0, "a$", "\r\raa\n\naa\r\naa" }, + { PCRE_MULTILINE | PCRE_NEWLINE_ANY, 0, "a$", "aaa" }, + { PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_ANYCRLF, 0, "#$", "#\xc2\x85###\r#" }, + { PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_ANY, 0, "#$", "#\xe2\x80\xa9" }, + { PCRE_NOTBOL | PCRE_NEWLINE_ANY, 0 | F_NOMATCH, "^a", "aa\naa" }, + { PCRE_NOTBOL | PCRE_MULTILINE | PCRE_NEWLINE_ANY, 0, "^a", "aa\naa" }, + { PCRE_NOTEOL | PCRE_NEWLINE_ANY, 0 | F_NOMATCH, "a$", "aa\naa" }, + { PCRE_NOTEOL | PCRE_NEWLINE_ANY, 0 | F_NOMATCH, "a$", "aa\r\n" }, + { PCRE_UTF8 | PCRE_DOLLAR_ENDONLY | PCRE_NEWLINE_ANY, 0 | F_PROPERTY, "\\p{Any}{2,}$", "aa\r\n" }, + { PCRE_NOTEOL | PCRE_MULTILINE | PCRE_NEWLINE_ANY, 0, "a$", "aa\naa" }, + { PCRE_NEWLINE_CR, 0, ".\\Z", "aaa" }, + { PCRE_NEWLINE_CR | PCRE_UTF8, 0, "a\\Z", "aaa\r" }, + { PCRE_NEWLINE_CR, 0, ".\\Z", "aaa\n" }, + { PCRE_NEWLINE_CRLF, 0, ".\\Z", "aaa\r" }, + { PCRE_NEWLINE_CRLF | PCRE_UTF8, 0, ".\\Z", "aaa\n" }, + { PCRE_NEWLINE_CRLF, 0, ".\\Z", "aaa\r\n" }, + { PCRE_NEWLINE_ANYCRLF | PCRE_UTF8, 0, ".\\Z", "aaa" }, + { PCRE_NEWLINE_ANYCRLF | PCRE_UTF8, 0, ".\\Z", "aaa\r" }, + { PCRE_NEWLINE_ANYCRLF | PCRE_UTF8, 0, ".\\Z", "aaa\n" }, + { PCRE_NEWLINE_ANYCRLF | PCRE_UTF8, 0, ".\\Z", "aaa\r\n" }, + { PCRE_NEWLINE_ANYCRLF | PCRE_UTF8, 0, ".\\Z", "aaa\xe2\x80\xa8" }, + { PCRE_NEWLINE_ANYCRLF | PCRE_UTF8, 0, ".\\Z", "aaa" }, + { PCRE_NEWLINE_ANYCRLF | PCRE_UTF8, 0, ".\\Z", "aaa\r" }, + { PCRE_NEWLINE_ANYCRLF | PCRE_UTF8, 0, ".\\Z", "aaa\n" }, + { PCRE_NEWLINE_ANYCRLF | PCRE_UTF8, 0, ".\\Z", "aaa\r\n" }, + { PCRE_NEWLINE_ANY | PCRE_UTF8, 0, ".\\Z", "aaa\xc2\x85" }, + { PCRE_NEWLINE_ANY | PCRE_UTF8, 0, ".\\Z", "aaa\xe2\x80\xa8" }, + { MA, 0, "\\Aa", "aaa" }, + { MA, 1 | F_NOMATCH, "\\Aa", "aaa" }, + { MA, 1, "\\Ga", "aaa" }, + { MA, 1 | F_NOMATCH, "\\Ga", "aba" }, + { MA, 0, "a\\z", "aaa" }, + { MA, 0 | F_NOMATCH, "a\\z", "aab" }, + + /* Brackets and alternatives. */ + { MUA, 0, "(ab|bb|cd)", "bacde" }, + { MUA, 0, "(?:ab|a)(bc|c)", "ababc" }, + { MUA, 0, "((ab|(cc))|(bb)|(?:cd|efg))", "abac" }, + { CMUA, 0, "((aB|(Cc))|(bB)|(?:cd|EFg))", "AcCe" }, + { MUA, 0, "((ab|(cc))|(bb)|(?:cd|ebg))", "acebebg" }, + { MUA, 0, "(?:(a)|(?:b))(cc|(?:d|e))(a|b)k", "accabdbbccbk" }, + { MUA, 0, "\xc7\x82|\xc6\x82", "\xf1\x83\x82\x82\xc7\x82\xc7\x83" }, + { MUA, 0, "=\xc7\x82|#\xc6\x82", "\xf1\x83\x82\x82=\xc7\x82\xc7\x83" }, + { MUA, 0, "\xc7\x82\xc7\x83|\xc6\x82\xc6\x82", "\xf1\x83\x82\x82\xc7\x82\xc7\x83" }, + { MUA, 0, "\xc6\x82\xc6\x82|\xc7\x83\xc7\x83|\xc8\x84\xc8\x84", "\xf1\x83\x82\x82\xc8\x84\xc8\x84" }, + + /* Greedy and non-greedy ? operators. */ + { MUA, 0, "(?:a)?a", "laab" }, + { CMUA, 0, "(A)?A", "llaab" }, + { MUA, 0, "(a)?\?a", "aab" }, /* ?? is the prefix of trygraphs in GCC. */ + { MUA, 0, "(a)?a", "manm" }, + { CMUA, 0, "(a|b)?\?d((?:e)?)", "ABABdx" }, + { MUA, 0, "(a|b)?\?d((?:e)?)", "abcde" }, + { MUA, 0, "((?:ab)?\?g|b(?:g(nn|d)?\?)?)?\?(?:n)?m", "abgnbgnnbgdnmm" }, + + /* Greedy and non-greedy + operators */ + { MUA, 0, "(aa)+aa", "aaaaaaa" }, + { MUA, 0, "(aa)+?aa", "aaaaaaa" }, + { MUA, 0, "(?:aba|ab|a)+l", "ababamababal" }, + { MUA, 0, "(?:aba|ab|a)+?l", "ababamababal" }, + { MUA, 0, "(a(?:bc|cb|b|c)+?|ss)+e", "accssabccbcacbccbbXaccssabccbcacbccbbe" }, + { MUA, 0, "(a(?:bc|cb|b|c)+|ss)+?e", "accssabccbcacbccbbXaccssabccbcacbccbbe" }, + { MUA, 0, "(?:(b(c)+?)+)?\?(?:(bc)+|(cb)+)+(?:m)+", "bccbcccbcbccbcbPbccbcccbcbccbcbmmn" }, + + /* Greedy and non-greedy * operators */ + { CMUA, 0, "(?:AA)*AB", "aaaaaaamaaaaaaab" }, + { MUA, 0, "(?:aa)*?ab", "aaaaaaamaaaaaaab" }, + { MUA, 0, "(aa|ab)*ab", "aaabaaab" }, + { CMUA, 0, "(aa|Ab)*?aB", "aaabaaab" }, + { MUA, 0, "(a|b)*(?:a)*(?:b)*m", "abbbaaababanabbbaaababamm" }, + { MUA, 0, "(a|b)*?(?:a)*?(?:b)*?m", "abbbaaababanabbbaaababamm" }, + { MA, 0, "a(a(\\1*)a|(b)b+){0}a", "aa" }, + { MA, 0, "((?:a|)*){0}a", "a" }, + + /* Combining ? + * operators */ + { MUA, 0, "((bm)+)?\?(?:a)*(bm)+n|((am)+?)?(?:a)+(am)*n", "bmbmabmamaaamambmaman" }, + { MUA, 0, "(((ab)?cd)*ef)+g", "abcdcdefcdefefmabcdcdefcdefefgg" }, + { MUA, 0, "(((ab)?\?cd)*?ef)+?g", "abcdcdefcdefefmabcdcdefcdefefgg" }, + { MUA, 0, "(?:(ab)?c|(?:ab)+?d)*g", "ababcdccababddg" }, + { MUA, 0, "(?:(?:ab)?\?c|(ab)+d)*?g", "ababcdccababddg" }, + + /* Single character iterators. */ + { MUA, 0, "(a+aab)+aaaab", "aaaabcaaaabaabcaabcaaabaaaab" }, + { MUA, 0, "(a*a*aab)+x", "aaaaabaabaaabmaabx" }, + { MUA, 0, "(a*?(b|ab)a*?)+x", "aaaabcxbbaabaacbaaabaabax" }, + { MUA, 0, "(a+(ab|ad)a+)+x", "aaabaaaadaabaaabaaaadaaax" }, + { MUA, 0, "(a?(a)a?)+(aaa)", "abaaabaaaaaaaa" }, + { MUA, 0, "(a?\?(a)a?\?)+(b)", "aaaacaaacaacacbaaab" }, + { MUA, 0, "(a{0,4}(b))+d", "aaaaaabaabcaaaaabaaaaabd" }, + { MUA, 0, "(a{0,4}?[^b])+d+(a{0,4}[^b])d+", "aaaaadaaaacaadddaaddd" }, + { MUA, 0, "(ba{2})+c", "baabaaabacbaabaac" }, + { MUA, 0, "(a*+bc++)+", "aaabbcaaabcccab" }, + { MUA, 0, "(a?+[^b])+", "babaacacb" }, + { MUA, 0, "(a{0,3}+b)(a{0,3}+b)(a{0,3}+)[^c]", "abaabaaacbaabaaaac" }, + { CMUA, 0, "([a-c]+[d-f]+?)+?g", "aBdacdehAbDaFgA" }, + { CMUA, 0, "[c-f]+k", "DemmFke" }, + { MUA, 0, "([DGH]{0,4}M)+", "GGDGHDGMMHMDHHGHM" }, + { MUA, 0, "([a-c]{4,}s)+", "abasabbasbbaabsbba" }, + { CMUA, 0, "[ace]{3,7}", "AcbDAcEEcEd" }, + { CMUA, 0, "[ace]{3,7}?", "AcbDAcEEcEd" }, + { CMUA, 0, "[ace]{3,}", "AcbDAcEEcEd" }, + { CMUA, 0, "[ace]{3,}?", "AcbDAcEEcEd" }, + { MUA, 0, "[ckl]{2,}?g", "cdkkmlglglkcg" }, + { CMUA, 0, "[ace]{5}?", "AcCebDAcEEcEd" }, + { MUA, 0, "([AbC]{3,5}?d)+", "BACaAbbAEAACCbdCCbdCCAAbb" }, + { MUA, 0, "([^ab]{0,}s){2}", "abaabcdsABamsDDs" }, + { MUA, 0, "\\b\\w+\\B", "x,a_cd" }, + { MUAP, 0, "\\b[^\xc2\xa1]+\\B", "\xc3\x89\xc2\xa1\xe6\x92\xad\xc3\x81\xc3\xa1" }, + { CMUA, 0, "[^b]+(a*)([^c]?d{3})", "aaaaddd" }, + { CMUAP, 0, "\xe1\xbd\xb8{2}", "\xe1\xbf\xb8#\xe1\xbf\xb8\xe1\xbd\xb8" }, + { CMUA, 0, "[^\xf0\x90\x90\x80]{2,4}@", "\xf0\x90\x90\xa8\xf0\x90\x90\x80###\xf0\x90\x90\x80@@@" }, + { CMUA, 0, "[^\xe1\xbd\xb8][^\xc3\xa9]", "\xe1\xbd\xb8\xe1\xbf\xb8\xc3\xa9\xc3\x89#" }, + { MUA, 0, "[^\xe1\xbd\xb8][^\xc3\xa9]", "\xe1\xbd\xb8\xe1\xbf\xb8\xc3\xa9\xc3\x89#" }, + { MUA, 0, "[^\xe1\xbd\xb8]{3,}?", "##\xe1\xbd\xb8#\xe1\xbd\xb8#\xc3\x89#\xe1\xbd\xb8" }, + { MUA, 0, "\\d+123", "987654321,01234" }, + { MUA, 0, "abcd*|\\w+xy", "aaaaa,abxyz" }, + { MUA, 0, "(?:abc|((?:amc|\\b\\w*xy)))", "aaaaa,abxyz" }, + { MUA, 0, "a(?R)|([a-z]++)#", ".abcd.abcd#."}, + { MUA, 0, "a(?R)|([a-z]++)#", ".abcd.mbcd#."}, + { MUA, 0, ".[ab]*.", "xx" }, + { MUA, 0, ".[ab]*a", "xxa" }, + { MUA, 0, ".[ab]?.", "xx" }, + + /* Bracket repeats with limit. */ + { MUA, 0, "(?:(ab){2}){5}M", "abababababababababababM" }, + { MUA, 0, "(?:ab|abab){1,5}M", "abababababababababababM" }, + { MUA, 0, "(?>ab|abab){1,5}M", "abababababababababababM" }, + { MUA, 0, "(?:ab|abab){1,5}?M", "abababababababababababM" }, + { MUA, 0, "(?>ab|abab){1,5}?M", "abababababababababababM" }, + { MUA, 0, "(?:(ab){1,4}?){1,3}?M", "abababababababababababababM" }, + { MUA, 0, "(?:(ab){1,4}){1,3}abababababababababababM", "ababababababababababababM" }, + { MUA, 0 | F_NOMATCH, "(?:(ab){1,4}){1,3}abababababababababababM", "abababababababababababM" }, + { MUA, 0, "(ab){4,6}?M", "abababababababM" }, + + /* Basic character sets. */ + { MUA, 0, "(?:\\s)+(?:\\S)+", "ab \t\xc3\xa9\xe6\x92\xad " }, + { MUA, 0, "(\\w)*(k)(\\W)?\?", "abcdef abck11" }, + { MUA, 0, "\\((\\d)+\\)\\D", "a() (83 (8)2 (9)ab" }, + { MUA, 0, "\\w(\\s|(?:\\d)*,)+\\w\\wb", "a 5, 4,, bb 5, 4,, aab" }, + { MUA, 0, "(\\v+)(\\V+)", "\x0e\xc2\x85\xe2\x80\xa8\x0b\x09\xe2\x80\xa9" }, + { MUA, 0, "(\\h+)(\\H+)", "\xe2\x80\xa8\xe2\x80\x80\x20\xe2\x80\x8a\xe2\x81\x9f\xe3\x80\x80\x09\x20\xc2\xa0\x0a" }, + { MUA, 0, "x[bcef]+", "xaxdxecbfg" }, + { MUA, 0, "x[bcdghij]+", "xaxexfxdgbjk" }, + { MUA, 0, "x[^befg]+", "xbxexacdhg" }, + { MUA, 0, "x[^bcdl]+", "xlxbxaekmd" }, + { MUA, 0, "x[^bcdghi]+", "xbxdxgxaefji" }, + { MUA, 0, "x[B-Fb-f]+", "xaxAxgxbfBFG" }, + { CMUA, 0, "\\x{e9}+", "#\xf0\x90\x90\xa8\xc3\xa8\xc3\xa9\xc3\x89\xc3\x88" }, + { CMUA, 0, "[^\\x{e9}]+", "\xc3\xa9#\xf0\x90\x90\xa8\xc3\xa8\xc3\x88\xc3\x89" }, + { MUA, 0, "[\\x02\\x7e]+", "\xc3\x81\xe1\xbf\xb8\xf0\x90\x90\xa8\x01\x02\x7e\x7f" }, + { MUA, 0, "[^\\x02\\x7e]+", "\x02\xc3\x81\xe1\xbf\xb8\xf0\x90\x90\xa8\x01\x7f\x7e" }, + { MUA, 0, "[\\x{81}-\\x{7fe}]+", "#\xe1\xbf\xb8\xf0\x90\x90\xa8\xc2\x80\xc2\x81\xdf\xbe\xdf\xbf" }, + { MUA, 0, "[^\\x{81}-\\x{7fe}]+", "\xc2\x81#\xe1\xbf\xb8\xf0\x90\x90\xa8\xc2\x80\xdf\xbf\xdf\xbe" }, + { MUA, 0, "[\\x{801}-\\x{fffe}]+", "#\xc3\xa9\xf0\x90\x90\x80\xe0\xa0\x80\xe0\xa0\x81\xef\xbf\xbe\xef\xbf\xbf" }, + { MUA, 0, "[^\\x{801}-\\x{fffe}]+", "\xe0\xa0\x81#\xc3\xa9\xf0\x90\x90\x80\xe0\xa0\x80\xef\xbf\xbf\xef\xbf\xbe" }, + { MUA, 0, "[\\x{10001}-\\x{10fffe}]+", "#\xc3\xa9\xe2\xb1\xa5\xf0\x90\x80\x80\xf0\x90\x80\x81\xf4\x8f\xbf\xbe\xf4\x8f\xbf\xbf" }, + { MUA, 0, "[^\\x{10001}-\\x{10fffe}]+", "\xf0\x90\x80\x81#\xc3\xa9\xe2\xb1\xa5\xf0\x90\x80\x80\xf4\x8f\xbf\xbf\xf4\x8f\xbf\xbe" }, + + /* Unicode properties. */ + { MUAP, 0, "[1-5\xc3\xa9\\w]", "\xc3\xa1_" }, + { MUAP, 0 | F_PROPERTY, "[\xc3\x81\\p{Ll}]", "A_\xc3\x89\xc3\xa1" }, + { MUAP, 0, "[\\Wd-h_x-z]+", "a\xc2\xa1#_yhzdxi" }, + { MUAP, 0 | F_NOMATCH | F_PROPERTY, "[\\P{Any}]", "abc" }, + { MUAP, 0 | F_NOMATCH | F_PROPERTY, "[^\\p{Any}]", "abc" }, + { MUAP, 0 | F_NOMATCH | F_PROPERTY, "[\\P{Any}\xc3\xa1-\xc3\xa8]", "abc" }, + { MUAP, 0 | F_NOMATCH | F_PROPERTY, "[^\\p{Any}\xc3\xa1-\xc3\xa8]", "abc" }, + { MUAP, 0 | F_NOMATCH | F_PROPERTY, "[\xc3\xa1-\xc3\xa8\\P{Any}]", "abc" }, + { MUAP, 0 | F_NOMATCH | F_PROPERTY, "[^\xc3\xa1-\xc3\xa8\\p{Any}]", "abc" }, + { MUAP, 0 | F_PROPERTY, "[\xc3\xa1-\xc3\xa8\\p{Any}]", "abc" }, + { MUAP, 0 | F_PROPERTY, "[^\xc3\xa1-\xc3\xa8\\P{Any}]", "abc" }, + { MUAP, 0, "[b-\xc3\xa9\\s]", "a\xc\xe6\x92\xad" }, + { CMUAP, 0, "[\xc2\x85-\xc2\x89\xc3\x89]", "\xc2\x84\xc3\xa9" }, + { MUAP, 0, "[^b-d^&\\s]{3,}", "db^ !a\xe2\x80\xa8_ae" }, + { MUAP, 0 | F_PROPERTY, "[^\\S\\P{Any}][\\sN]{1,3}[\\P{N}]{4}", "\xe2\x80\xaa\xa N\x9\xc3\xa9_0" }, + { MUA, 0 | F_PROPERTY, "[^\\P{L}\x9!D-F\xa]{2,3}", "\x9,.DF\xa.CG\xc3\x81" }, + { CMUAP, 0, "[\xc3\xa1-\xc3\xa9_\xe2\x80\xa0-\xe2\x80\xaf]{1,5}[^\xe2\x80\xa0-\xe2\x80\xaf]", "\xc2\xa1\xc3\x89\xc3\x89\xe2\x80\xaf_\xe2\x80\xa0" }, + { MUAP, 0 | F_PROPERTY, "[\xc3\xa2-\xc3\xa6\xc3\x81-\xc3\x84\xe2\x80\xa8-\xe2\x80\xa9\xe6\x92\xad\\p{Zs}]{2,}", "\xe2\x80\xa7\xe2\x80\xa9\xe6\x92\xad \xe6\x92\xae" }, + { MUAP, 0 | F_PROPERTY, "[\\P{L&}]{2}[^\xc2\x85-\xc2\x89\\p{Ll}\\p{Lu}]{2}", "\xc3\xa9\xe6\x92\xad.a\xe6\x92\xad|\xc2\x8a#" }, + { PCRE_UCP, 0, "[a-b\\s]{2,5}[^a]", "AB baaa" }, + + /* Possible empty brackets. */ + { MUA, 0, "(?:|ab||bc|a)+d", "abcxabcabd" }, + { MUA, 0, "(|ab||bc|a)+d", "abcxabcabd" }, + { MUA, 0, "(?:|ab||bc|a)*d", "abcxabcabd" }, + { MUA, 0, "(|ab||bc|a)*d", "abcxabcabd" }, + { MUA, 0, "(?:|ab||bc|a)+?d", "abcxabcabd" }, + { MUA, 0, "(|ab||bc|a)+?d", "abcxabcabd" }, + { MUA, 0, "(?:|ab||bc|a)*?d", "abcxabcabd" }, + { MUA, 0, "(|ab||bc|a)*?d", "abcxabcabd" }, + { MUA, 0, "(((a)*?|(?:ba)+)+?|(?:|c|ca)*)*m", "abaacaccabacabalabaacaccabacabamm" }, + { MUA, 0, "(?:((?:a)*|(ba)+?)+|(|c|ca)*?)*?m", "abaacaccabacabalabaacaccabacabamm" }, + + /* Start offset. */ + { MUA, 3, "(\\d|(?:\\w)*\\w)+", "0ac01Hb" }, + { MUA, 4 | F_NOMATCH, "(\\w\\W\\w)+", "ab#d" }, + { MUA, 2 | F_NOMATCH, "(\\w\\W\\w)+", "ab#d" }, + { MUA, 1, "(\\w\\W\\w)+", "ab#d" }, + + /* Newline. */ + { PCRE_MULTILINE | PCRE_NEWLINE_CRLF, 0, "\\W{0,2}[^#]{3}", "\r\n#....." }, + { PCRE_MULTILINE | PCRE_NEWLINE_CR, 0, "\\W{0,2}[^#]{3}", "\r\n#....." }, + { PCRE_MULTILINE | PCRE_NEWLINE_CRLF, 0, "\\W{1,3}[^#]", "\r\n##...." }, + { MUA | PCRE_NO_UTF8_CHECK, 1, "^.a", "\n\x80\nxa" }, + { MUA, 1, "^", "\r\n" }, + { PCRE_MULTILINE | PCRE_NEWLINE_CRLF, 1 | F_NOMATCH, "^", "\r\n" }, + { PCRE_MULTILINE | PCRE_NEWLINE_CRLF, 1, "^", "\r\na" }, + + /* Any character except newline or any newline. */ + { PCRE_NEWLINE_CRLF, 0, ".", "\r" }, + { PCRE_NEWLINE_CRLF | PCRE_UTF8, 0, ".(.).", "a\xc3\xa1\r\n\n\r\r" }, + { PCRE_NEWLINE_ANYCRLF, 0, ".(.)", "a\rb\nc\r\n\xc2\x85\xe2\x80\xa8" }, + { PCRE_NEWLINE_ANYCRLF | PCRE_UTF8, 0, ".(.)", "a\rb\nc\r\n\xc2\x85\xe2\x80\xa8" }, + { PCRE_NEWLINE_ANY | PCRE_UTF8, 0, "(.).", "a\rb\nc\r\n\xc2\x85\xe2\x80\xa9$de" }, + { PCRE_NEWLINE_ANYCRLF | PCRE_UTF8, 0 | F_NOMATCH, ".(.).", "\xe2\x80\xa8\nb\r" }, + { PCRE_NEWLINE_ANY, 0, "(.)(.)", "#\x85#\r#\n#\r\n#\x84" }, + { PCRE_NEWLINE_ANY | PCRE_UTF8, 0, "(.+)#", "#\rMn\xc2\x85#\n###" }, + { PCRE_BSR_ANYCRLF, 0, "\\R", "\r" }, + { PCRE_BSR_ANYCRLF, 0, "\\R", "\x85#\r\n#" }, + { PCRE_BSR_UNICODE | PCRE_UTF8, 0, "\\R", "ab\xe2\x80\xa8#c" }, + { PCRE_BSR_UNICODE | PCRE_UTF8, 0, "\\R", "ab\r\nc" }, + { PCRE_NEWLINE_CRLF | PCRE_BSR_UNICODE | PCRE_UTF8, 0, "(\\R.)+", "\xc2\x85\r\n#\xe2\x80\xa8\n\r\n\r" }, + { MUA, 0 | F_NOMATCH, "\\R+", "ab" }, + { MUA, 0, "\\R+", "ab\r\n\r" }, + { MUA, 0, "\\R*", "ab\r\n\r" }, + { MUA, 0, "\\R*", "\r\n\r" }, + { MUA, 0, "\\R{2,4}", "\r\nab\r\r" }, + { MUA, 0, "\\R{2,4}", "\r\nab\n\n\n\r\r\r" }, + { MUA, 0, "\\R{2,}", "\r\nab\n\n\n\r\r\r" }, + { MUA, 0, "\\R{0,3}", "\r\n\r\n\r\n\r\n\r\n" }, + { MUA, 0 | F_NOMATCH, "\\R+\\R\\R", "\r\n\r\n" }, + { MUA, 0, "\\R+\\R\\R", "\r\r\r" }, + { MUA, 0, "\\R*\\R\\R", "\n\r" }, + { MUA, 0 | F_NOMATCH, "\\R{2,4}\\R\\R", "\r\r\r" }, + { MUA, 0, "\\R{2,4}\\R\\R", "\r\r\r\r" }, + + /* Atomic groups (no fallback from "next" direction). */ + { MUA, 0 | F_NOMATCH, "(?>ab)ab", "bab" }, + { MUA, 0 | F_NOMATCH, "(?>(ab))ab", "bab" }, + { MUA, 0, "(?>ab)+abc(?>de)*def(?>gh)?ghe(?>ij)+?k(?>lm)*?n(?>op)?\?op", + "bababcdedefgheijijklmlmnop" }, + { MUA, 0, "(?>a(b)+a|(ab)?\?(b))an", "abban" }, + { MUA, 0, "(?>ab+a|(?:ab)?\?b)an", "abban" }, + { MUA, 0, "((?>ab|ad|)*?)(?>|c)*abad", "abababcababad" }, + { MUA, 0, "(?>(aa|b|)*+(?>(##)|###)*d|(aa)(?>(baa)?)m)", "aabaa#####da" }, + { MUA, 0, "((?>a|)+?)b", "aaacaaab" }, + { MUA, 0, "(?>x|)*$", "aaa" }, + { MUA, 0, "(?>(x)|)*$", "aaa" }, + { MUA, 0, "(?>x|())*$", "aaa" }, + { MUA, 0, "((?>[cxy]a|[a-d])*?)b", "aaa+ aaab" }, + { MUA, 0, "((?>[cxy](a)|[a-d])*?)b", "aaa+ aaab" }, + { MUA, 0, "(?>((?>(a+))))bab|(?>((?>(a+))))bb", "aaaabaaabaabab" }, + { MUA, 0, "(?>(?>a+))bab|(?>(?>a+))bb", "aaaabaaabaabab" }, + { MUA, 0, "(?>(a)c|(?>(c)|(a))a)b*?bab", "aaaabaaabaabab" }, + { MUA, 0, "(?>ac|(?>c|a)a)b*?bab", "aaaabaaabaabab" }, + { MUA, 0, "(?>(b)b|(a))*b(?>(c)|d)?x", "ababcaaabdbx" }, + { MUA, 0, "(?>bb|a)*b(?>c|d)?x", "ababcaaabdbx" }, + { MUA, 0, "(?>(bb)|a)*b(?>c|(d))?x", "ababcaaabdbx" }, + { MUA, 0, "(?>(a))*?(?>(a))+?(?>(a))??x", "aaaaaacccaaaaabax" }, + { MUA, 0, "(?>a)*?(?>a)+?(?>a)??x", "aaaaaacccaaaaabax" }, + { MUA, 0, "(?>(a)|)*?(?>(a)|)+?(?>(a)|)??x", "aaaaaacccaaaaabax" }, + { MUA, 0, "(?>a|)*?(?>a|)+?(?>a|)??x", "aaaaaacccaaaaabax" }, + { MUA, 0, "(?>a(?>(a{0,2}))*?b|aac)+b", "aaaaaaacaaaabaaaaacaaaabaacaaabb" }, + { CMA, 0, "(?>((?>a{32}|b+|(a*))?(?>c+|d*)?\?)+e)+?f", "aaccebbdde bbdaaaccebbdee bbdaaaccebbdeef" }, + { MUA, 0, "(?>(?:(?>aa|a||x)+?b|(?>aa|a||(x))+?c)?(?>[ad]{0,2})*?d)+d", "aaacdbaabdcabdbaaacd aacaabdbdcdcaaaadaabcbaadd" }, + { MUA, 0, "(?>(?:(?>aa|a||(x))+?b|(?>aa|a||x)+?c)?(?>[ad]{0,2})*?d)+d", "aaacdbaabdcabdbaaacd aacaabdbdcdcaaaadaabcbaadd" }, + { MUA, 0 | F_PROPERTY, "\\X", "\xcc\x8d\xcc\x8d" }, + { MUA, 0 | F_PROPERTY, "\\X", "\xcc\x8d\xcc\x8d#\xcc\x8d\xcc\x8d" }, + { MUA, 0 | F_PROPERTY, "\\X+..", "\xcc\x8d#\xcc\x8d#\xcc\x8d\xcc\x8d" }, + { MUA, 0 | F_PROPERTY, "\\X{2,4}", "abcdef" }, + { MUA, 0 | F_PROPERTY, "\\X{2,4}?", "abcdef" }, + { MUA, 0 | F_NOMATCH | F_PROPERTY, "\\X{2,4}..", "#\xcc\x8d##" }, + { MUA, 0 | F_PROPERTY, "\\X{2,4}..", "#\xcc\x8d#\xcc\x8d##" }, + { MUA, 0, "(c(ab)?+ab)+", "cabcababcab" }, + { MUA, 0, "(?>(a+)b)+aabab", "aaaabaaabaabab" }, + + /* Possessive quantifiers. */ + { MUA, 0, "(?:a|b)++m", "mababbaaxababbaam" }, + { MUA, 0, "(?:a|b)*+m", "mababbaaxababbaam" }, + { MUA, 0, "(?:a|b)*+m", "ababbaaxababbaam" }, + { MUA, 0, "(a|b)++m", "mababbaaxababbaam" }, + { MUA, 0, "(a|b)*+m", "mababbaaxababbaam" }, + { MUA, 0, "(a|b)*+m", "ababbaaxababbaam" }, + { MUA, 0, "(a|b(*ACCEPT))++m", "maaxab" }, + { MUA, 0, "(?:b*)++m", "bxbbxbbbxm" }, + { MUA, 0, "(?:b*)++m", "bxbbxbbbxbbm" }, + { MUA, 0, "(?:b*)*+m", "bxbbxbbbxm" }, + { MUA, 0, "(?:b*)*+m", "bxbbxbbbxbbm" }, + { MUA, 0, "(b*)++m", "bxbbxbbbxm" }, + { MUA, 0, "(b*)++m", "bxbbxbbbxbbm" }, + { MUA, 0, "(b*)*+m", "bxbbxbbbxm" }, + { MUA, 0, "(b*)*+m", "bxbbxbbbxbbm" }, + { MUA, 0, "(?:a|(b))++m", "mababbaaxababbaam" }, + { MUA, 0, "(?:(a)|b)*+m", "mababbaaxababbaam" }, + { MUA, 0, "(?:(a)|(b))*+m", "ababbaaxababbaam" }, + { MUA, 0, "(a|(b))++m", "mababbaaxababbaam" }, + { MUA, 0, "((a)|b)*+m", "mababbaaxababbaam" }, + { MUA, 0, "((a)|(b))*+m", "ababbaaxababbaam" }, + { MUA, 0, "(a|(b)(*ACCEPT))++m", "maaxab" }, + { MUA, 0, "(?:(b*))++m", "bxbbxbbbxm" }, + { MUA, 0, "(?:(b*))++m", "bxbbxbbbxbbm" }, + { MUA, 0, "(?:(b*))*+m", "bxbbxbbbxm" }, + { MUA, 0, "(?:(b*))*+m", "bxbbxbbbxbbm" }, + { MUA, 0, "((b*))++m", "bxbbxbbbxm" }, + { MUA, 0, "((b*))++m", "bxbbxbbbxbbm" }, + { MUA, 0, "((b*))*+m", "bxbbxbbbxm" }, + { MUA, 0, "((b*))*+m", "bxbbxbbbxbbm" }, + { MUA, 0 | F_NOMATCH, "(?>(b{2,4}))(?:(?:(aa|c))++m|(?:(aa|c))+n)", "bbaacaaccaaaacxbbbmbn" }, + { MUA, 0, "((?:b)++a)+(cd)*+m", "bbababbacdcdnbbababbacdcdm" }, + { MUA, 0, "((?:(b))++a)+((c)d)*+m", "bbababbacdcdnbbababbacdcdm" }, + { MUA, 0, "(?:(?:(?:ab)*+k)++(?:n(?:cd)++)*+)*+m", "ababkkXababkkabkncXababkkabkncdcdncdXababkkabkncdcdncdkkabkncdXababkkabkncdcdncdkkabkncdm" }, + { MUA, 0, "(?:((ab)*+(k))++(n(?:c(d))++)*+)*+m", "ababkkXababkkabkncXababkkabkncdcdncdXababkkabkncdcdncdkkabkncdXababkkabkncdcdncdkkabkncdm" }, + + /* Back references. */ + { MUA, 0, "(aa|bb)(\\1*)(ll|)(\\3*)bbbbbbc", "aaaaaabbbbbbbbc" }, + { CMUA, 0, "(aa|bb)(\\1+)(ll|)(\\3+)bbbbbbc", "bBbbBbCbBbbbBbbcbbBbbbBBbbC" }, + { CMA, 0, "(a{2,4})\\1", "AaAaaAaA" }, + { MUA, 0, "(aa|bb)(\\1?)aa(\\1?)(ll|)(\\4+)bbc", "aaaaaaaabbaabbbbaabbbbc" }, + { MUA, 0, "(aa|bb)(\\1{0,5})(ll|)(\\3{0,5})cc", "bbxxbbbbxxaaaaaaaaaaaaaaaacc" }, + { MUA, 0, "(aa|bb)(\\1{3,5})(ll|)(\\3{3,5})cc", "bbbbbbbbbbbbaaaaaaccbbbbbbbbbbbbbbcc" }, + { MUA, 0, "(aa|bb)(\\1{3,})(ll|)(\\3{3,})cc", "bbbbbbbbbbbbaaaaaaccbbbbbbbbbbbbbbcc" }, + { MUA, 0, "(\\w+)b(\\1+)c", "GabGaGaDbGaDGaDc" }, + { MUA, 0, "(?:(aa)|b)\\1?b", "bb" }, + { CMUA, 0, "(aa|bb)(\\1*?)aa(\\1+?)", "bBBbaaAAaaAAaa" }, + { MUA, 0, "(aa|bb)(\\1*?)(dd|)cc(\\3+?)", "aaaaaccdd" }, + { CMUA, 0, "(?:(aa|bb)(\\1?\?)cc){2}(\\1?\?)", "aAaABBbbAAaAcCaAcCaA" }, + { MUA, 0, "(?:(aa|bb)(\\1{3,5}?)){2}(dd|)(\\3{3,5}?)", "aaaaaabbbbbbbbbbaaaaaaaaaaaaaa" }, + { CMA, 0, "(?:(aa|bb)(\\1{3,}?)){2}(dd|)(\\3{3,}?)", "aaaaaabbbbbbbbbbaaaaaaaaaaaaaa" }, + { MUA, 0, "(?:(aa|bb)(\\1{0,3}?)){2}(dd|)(\\3{0,3}?)b(\\1{0,3}?)(\\1{0,3})", "aaaaaaaaaaaaaaabaaaaa" }, + { MUA, 0, "(a(?:\\1|)a){3}b", "aaaaaaaaaaab" }, + { MA, 0, "(a?)b(\\1\\1*\\1+\\1?\\1*?\\1+?\\1??\\1*+\\1++\\1?+\\1{4}\\1{3,5}\\1{4,}\\1{0,5}\\1{3,5}?\\1{4,}?\\1{0,5}?\\1{3,5}+\\1{4,}+\\1{0,5}+#){2}d", "bb#b##d" }, + { MUAP, 0 | F_PROPERTY, "(\\P{N})\\1{2,}", ".www." }, + { MUAP, 0 | F_PROPERTY, "(\\P{N})\\1{0,2}", "wwwww." }, + { MUAP, 0 | F_PROPERTY, "(\\P{N})\\1{1,2}ww", "wwww" }, + { MUAP, 0 | F_PROPERTY, "(\\P{N})\\1{1,2}ww", "wwwww" }, + { PCRE_UCP, 0 | F_PROPERTY, "(\\P{N})\\1{2,}", ".www." }, + { CMUAP, 0, "(\xf0\x90\x90\x80)\\1", "\xf0\x90\x90\xa8\xf0\x90\x90\xa8" }, + { MUA | PCRE_DUPNAMES, 0 | F_NOMATCH, "\\k{1,3}(?aa)(?bb)", "aabb" }, + { MUA | PCRE_DUPNAMES | PCRE_JAVASCRIPT_COMPAT, 0, "\\k{1,3}(?aa)(?bb)", "aabb" }, + { MUA | PCRE_DUPNAMES | PCRE_JAVASCRIPT_COMPAT, 0, "\\k*(?aa)(?bb)", "aabb" }, + { MUA | PCRE_DUPNAMES, 0, "(?aa)(?bb)\\k{0,3}aaaaaa", "aabbaaaaaa" }, + { MUA | PCRE_DUPNAMES, 0, "(?aa)(?bb)\\k{2,5}bb", "aabbaaaabb" }, + { MUA | PCRE_DUPNAMES, 0, "(?:(?aa)|(?bb))\\k{0,3}m", "aaaaaaaabbbbaabbbbm" }, + { MUA | PCRE_DUPNAMES, 0 | F_NOMATCH, "\\k{1,3}?(?aa)(?bb)", "aabb" }, + { MUA | PCRE_DUPNAMES | PCRE_JAVASCRIPT_COMPAT, 0, "\\k{1,3}?(?aa)(?bb)", "aabb" }, + { MUA | PCRE_DUPNAMES, 0, "\\k*?(?aa)(?bb)", "aabb" }, + { MUA | PCRE_DUPNAMES, 0, "(?:(?aa)|(?bb))\\k{0,3}?m", "aaaaaabbbbbbaabbbbbbbbbbm" }, + { MUA | PCRE_DUPNAMES, 0, "(?:(?aa)|(?bb))\\k*?m", "aaaaaabbbbbbaabbbbbbbbbbm" }, + { MUA | PCRE_DUPNAMES, 0, "(?:(?aa)|(?bb))\\k{2,3}?", "aaaabbbbaaaabbbbbbbbbb" }, + { CMUA | PCRE_DUPNAMES, 0, "(?:(?AA)|(?BB))\\k{0,3}M", "aaaaaaaabbbbaabbbbm" }, + { CMUA | PCRE_DUPNAMES, 0, "(?:(?AA)|(?BB))\\k{1,3}M", "aaaaaaaabbbbaabbbbm" }, + { CMUA | PCRE_DUPNAMES, 0, "(?:(?AA)|(?BB))\\k{0,3}?M", "aaaaaabbbbbbaabbbbbbbbbbm" }, + { CMUA | PCRE_DUPNAMES, 0, "(?:(?AA)|(?BB))\\k{2,3}?", "aaaabbbbaaaabbbbbbbbbb" }, + + /* Assertions. */ + { MUA, 0, "(?=xx|yy|zz)\\w{4}", "abczzdefg" }, + { MUA, 0, "(?=((\\w+)b){3}|ab)", "dbbbb ab" }, + { MUA, 0, "(?!ab|bc|cd)[a-z]{2}", "Xabcdef" }, + { MUA, 0, "(?<=aaa|aa|a)a", "aaa" }, + { MUA, 2, "(?<=aaa|aa|a)a", "aaa" }, + { MA, 0, "(?<=aaa|aa|a)a", "aaa" }, + { MA, 2, "(?<=aaa|aa|a)a", "aaa" }, + { MUA, 0, "(\\d{2})(?!\\w+c|(((\\w?)m){2}n)+|\\1)", "x5656" }, + { MUA, 0, "((?=((\\d{2,6}\\w){2,}))\\w{5,20}K){2,}", "567v09708K12l00M00 567v09708K12l00M00K45K" }, + { MUA, 0, "(?=(?:(?=\\S+a)\\w*(b)){3})\\w+\\d", "bba bbab nbbkba nbbkba0kl" }, + { MUA, 0, "(?>a(?>(b+))a(?=(..)))*?k", "acabbcabbaabacabaabbakk" }, + { MUA, 0, "((?(?=(a))a)+k)", "bbak" }, + { MUA, 0, "((?(?=a)a)+k)", "bbak" }, + { MUA, 0 | F_NOMATCH, "(?=(?>(a))m)amk", "a k" }, + { MUA, 0 | F_NOMATCH, "(?!(?>(a))m)amk", "a k" }, + { MUA, 0 | F_NOMATCH, "(?>(?=(a))am)amk", "a k" }, + { MUA, 0, "(?=(?>a|(?=(?>(b+))a|c)[a-c]+)*?m)[a-cm]+k", "aaam bbam baaambaam abbabba baaambaamk" }, + { MUA, 0, "(?> ?\?\\b(?(?=\\w{1,4}(a))m)\\w{0,8}bc){2,}?", "bca ssbc mabd ssbc mabc" }, + { MUA, 0, "(?:(?=ab)?[^n][^n])+m", "ababcdabcdcdabnababcdabcdcdabm" }, + { MUA, 0, "(?:(?=a(b))?[^n][^n])+m", "ababcdabcdcdabnababcdabcdcdabm" }, + { MUA, 0, "(?:(?=.(.))??\\1.)+m", "aabbbcbacccanaabbbcbacccam" }, + { MUA, 0, "(?:(?=.)??[a-c])+m", "abacdcbacacdcaccam" }, + { MUA, 0, "((?!a)?(?!([^a]))?)+$", "acbab" }, + { MUA, 0, "((?!a)?\?(?!([^a]))?\?)+$", "acbab" }, + { MUA, 0, "a(?=(?C)\\B)b", "ab" }, + { MUA, 0, "a(?!(?C)\\B)bb|ab", "abb" }, + { MUA, 0, "a(?=\\b|(?C)\\B)b", "ab" }, + { MUA, 0, "a(?!\\b|(?C)\\B)bb|ab", "abb" }, + { MUA, 0, "c(?(?=(?C)\\B)ab|a)", "cab" }, + { MUA, 0, "c(?(?!(?C)\\B)ab|a)", "cab" }, + { MUA, 0, "c(?(?=\\b|(?C)\\B)ab|a)", "cab" }, + { MUA, 0, "c(?(?!\\b|(?C)\\B)ab|a)", "cab" }, + { MUA, 0, "a(?=)b", "ab" }, + { MUA, 0 | F_NOMATCH, "a(?!)b", "ab" }, + + /* Not empty, ACCEPT, FAIL */ + { MUA | PCRE_NOTEMPTY, 0 | F_NOMATCH, "a*", "bcx" }, + { MUA | PCRE_NOTEMPTY, 0, "a*", "bcaad" }, + { MUA | PCRE_NOTEMPTY, 0, "a*?", "bcaad" }, + { MUA | PCRE_NOTEMPTY_ATSTART, 0, "a*", "bcaad" }, + { MUA, 0, "a(*ACCEPT)b", "ab" }, + { MUA | PCRE_NOTEMPTY, 0 | F_NOMATCH, "a*(*ACCEPT)b", "bcx" }, + { MUA | PCRE_NOTEMPTY, 0, "a*(*ACCEPT)b", "bcaad" }, + { MUA | PCRE_NOTEMPTY, 0, "a*?(*ACCEPT)b", "bcaad" }, + { MUA | PCRE_NOTEMPTY, 0 | F_NOMATCH, "(?:z|a*(*ACCEPT)b)", "bcx" }, + { MUA | PCRE_NOTEMPTY, 0, "(?:z|a*(*ACCEPT)b)", "bcaad" }, + { MUA | PCRE_NOTEMPTY, 0, "(?:z|a*?(*ACCEPT)b)", "bcaad" }, + { MUA | PCRE_NOTEMPTY_ATSTART, 0, "a*(*ACCEPT)b", "bcx" }, + { MUA | PCRE_NOTEMPTY_ATSTART, 0 | F_NOMATCH, "a*(*ACCEPT)b", "" }, + { MUA, 0, "((a(*ACCEPT)b))", "ab" }, + { MUA, 0, "(a(*FAIL)a|a)", "aaa" }, + { MUA, 0, "(?=ab(*ACCEPT)b)a", "ab" }, + { MUA, 0, "(?=(?:x|ab(*ACCEPT)b))", "ab" }, + { MUA, 0, "(?=(a(b(*ACCEPT)b)))a", "ab" }, + { MUA | PCRE_NOTEMPTY, 0, "(?=a*(*ACCEPT))c", "c" }, + + /* Conditional blocks. */ + { MUA, 0, "(?(?=(a))a|b)+k", "ababbalbbadabak" }, + { MUA, 0, "(?(?!(b))a|b)+k", "ababbalbbadabak" }, + { MUA, 0, "(?(?=a)a|b)+k", "ababbalbbadabak" }, + { MUA, 0, "(?(?!b)a|b)+k", "ababbalbbadabak" }, + { MUA, 0, "(?(?=(a))a*|b*)+k", "ababbalbbadabak" }, + { MUA, 0, "(?(?!(b))a*|b*)+k", "ababbalbbadabak" }, + { MUA, 0, "(?(?!(b))(?:aaaaaa|a)|(?:bbbbbb|b))+aaaak", "aaaaaaaaaaaaaa bbbbbbbbbbbbbbb aaaaaaak" }, + { MUA, 0, "(?(?!b)(?:aaaaaa|a)|(?:bbbbbb|b))+aaaak", "aaaaaaaaaaaaaa bbbbbbbbbbbbbbb aaaaaaak" }, + { MUA, 0 | F_DIFF, "(?(?!(b))(?:aaaaaa|a)|(?:bbbbbb|b))+bbbbk", "aaaaaaaaaaaaaa bbbbbbbbbbbbbbb bbbbbbbk" }, + { MUA, 0, "(?(?!b)(?:aaaaaa|a)|(?:bbbbbb|b))+bbbbk", "aaaaaaaaaaaaaa bbbbbbbbbbbbbbb bbbbbbbk" }, + { MUA, 0, "(?(?=a)a*|b*)+k", "ababbalbbadabak" }, + { MUA, 0, "(?(?!b)a*|b*)+k", "ababbalbbadabak" }, + { MUA, 0, "(?(?=a)ab)", "a" }, + { MUA, 0, "(?(?a)?(?Pb)?(?(Name)c|d)*l", "bc ddd abccabccl" }, + { MUA, 0, "(?Pa)?(?Pb)?(?(Name)c|d)+?dd", "bcabcacdb bdddd" }, + { MUA, 0, "(?Pa)?(?Pb)?(?(Name)c|d)+l", "ababccddabdbccd abcccl" }, + { MUA, 0, "((?:a|aa)(?(1)aaa))x", "aax" }, + { MUA, 0, "(?(?!)a|b)", "ab" }, + { MUA, 0, "(?(?!)a)", "ab" }, + { MUA, 0 | F_NOMATCH, "(?(?!)a|b)", "ac" }, + + /* Set start of match. */ + { MUA, 0, "(?:\\Ka)*aaaab", "aaaaaaaa aaaaaaabb" }, + { MUA, 0, "(?>\\Ka\\Ka)*aaaab", "aaaaaaaa aaaaaaaaaabb" }, + { MUA, 0, "a+\\K(?<=\\Gaa)a", "aaaaaa" }, + { MUA | PCRE_NOTEMPTY, 0 | F_NOMATCH, "a\\K(*ACCEPT)b", "aa" }, + { MUA | PCRE_NOTEMPTY_ATSTART, 0, "a\\K(*ACCEPT)b", "aa" }, + + /* First line. */ + { MUA | PCRE_FIRSTLINE, 0 | F_PROPERTY, "\\p{Any}a", "bb\naaa" }, + { MUA | PCRE_FIRSTLINE, 0 | F_NOMATCH | F_PROPERTY, "\\p{Any}a", "bb\r\naaa" }, + { MUA | PCRE_FIRSTLINE, 0, "(?<=a)", "a" }, + { MUA | PCRE_FIRSTLINE, 0 | F_NOMATCH, "[^a][^b]", "ab" }, + { MUA | PCRE_FIRSTLINE, 0 | F_NOMATCH, "a", "\na" }, + { MUA | PCRE_FIRSTLINE, 0 | F_NOMATCH, "[abc]", "\na" }, + { MUA | PCRE_FIRSTLINE, 0 | F_NOMATCH, "^a", "\na" }, + { MUA | PCRE_FIRSTLINE, 0 | F_NOMATCH, "^(?<=\n)", "\na" }, + { MUA | PCRE_FIRSTLINE, 0, "\xf0\x90\x90\x80", "\xf0\x90\x90\x80" }, + { PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_ANY | PCRE_FIRSTLINE, 0 | F_NOMATCH, "#", "\xc2\x85#" }, + { PCRE_MULTILINE | PCRE_NEWLINE_ANY | PCRE_FIRSTLINE, 0 | F_NOMATCH, "#", "\x85#" }, + { PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_ANY | PCRE_FIRSTLINE, 0 | F_NOMATCH, "^#", "\xe2\x80\xa8#" }, + { PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_CRLF | PCRE_FIRSTLINE, 0 | F_PROPERTY, "\\p{Any}", "\r\na" }, + { PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_CRLF | PCRE_FIRSTLINE, 0, ".", "\r" }, + { PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_CRLF | PCRE_FIRSTLINE, 0, "a", "\ra" }, + { PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_CRLF | PCRE_FIRSTLINE, 0 | F_NOMATCH, "ba", "bbb\r\nba" }, + { PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_CRLF | PCRE_FIRSTLINE, 0 | F_NOMATCH | F_PROPERTY, "\\p{Any}{4}|a", "\r\na" }, + { PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_CRLF | PCRE_FIRSTLINE, 1, ".", "\r\n" }, + { PCRE_FIRSTLINE | PCRE_NEWLINE_LF | PCRE_DOTALL, 0 | F_NOMATCH, "ab.", "ab" }, + { MUA | PCRE_FIRSTLINE, 1 | F_NOMATCH, "^[a-d0-9]", "\nxx\nd" }, + { PCRE_NEWLINE_ANY | PCRE_FIRSTLINE | PCRE_DOTALL, 0, "....a", "012\n0a" }, + { MUA | PCRE_FIRSTLINE, 0, "[aC]", "a" }, + + /* Recurse. */ + { MUA, 0, "(a)(?1)", "aa" }, + { MUA, 0, "((a))(?1)", "aa" }, + { MUA, 0, "(b|a)(?1)", "aa" }, + { MUA, 0, "(b|(a))(?1)", "aa" }, + { MUA, 0 | F_NOMATCH, "((a)(b)(?:a*))(?1)", "aba" }, + { MUA, 0, "((a)(b)(?:a*))(?1)", "abab" }, + { MUA, 0, "((a+)c(?2))b(?1)", "aacaabaca" }, + { MUA, 0, "((?2)b|(a)){2}(?1)", "aabab" }, + { MUA, 0, "(?1)(a)*+(?2)(b(?1))", "aababa" }, + { MUA, 0, "(?1)(((a(*ACCEPT)))b)", "axaa" }, + { MUA, 0, "(?1)(?(DEFINE) (((ac(*ACCEPT)))b) )", "akaac" }, + { MUA, 0, "(a+)b(?1)b\\1", "abaaabaaaaa" }, + { MUA, 0 | F_NOMATCH, "(?(DEFINE)(aa|a))(?1)ab", "aab" }, + { MUA, 0, "(?(DEFINE)(a\\Kb))(?1)+ababc", "abababxabababc" }, + { MUA, 0, "(a\\Kb)(?1)+ababc", "abababxababababc" }, + { MUA, 0 | F_NOMATCH, "(a\\Kb)(?1)+ababc", "abababxababababxc" }, + { MUA, 0, "b|<(?R)*>", "<" }, + { MUA, 0, "(a\\K){0}(?:(?1)b|ac)", "ac" }, + { MUA, 0, "(?(DEFINE)(a(?2)|b)(b(?1)|(a)))(?:(?1)|(?2))m", "ababababnababababaam" }, + { MUA, 0, "(a)((?(R)a|b))(?2)", "aabbabaa" }, + { MUA, 0, "(a)((?(R2)a|b))(?2)", "aabbabaa" }, + { MUA, 0, "(a)((?(R1)a|b))(?2)", "ababba" }, + { MUA, 0, "(?(R0)aa|bb(?R))", "abba aabb bbaa" }, + { MUA, 0, "((?(R)(?:aaaa|a)|(?:(aaaa)|(a)))+)(?1)$", "aaaaaaaaaa aaaa" }, + { MUA, 0, "(?Pa(?(R&Name)a|b))(?1)", "aab abb abaa" }, + { MUA, 0, "((?(R)a|(?1)){3})", "XaaaaaaaaaX" }, + { MUA, 0, "((?:(?(R)a|(?1))){3})", "XaaaaaaaaaX" }, + { MUA, 0, "((?(R)a|(?1)){1,3})aaaaaa", "aaaaaaaaXaaaaaaaaa" }, + { MUA, 0, "((?(R)a|(?1)){1,3}?)M", "aaaM" }, + + /* 16 bit specific tests. */ + { CMA, 0 | F_FORCECONV, "\xc3\xa1", "\xc3\x81\xc3\xa1" }, + { CMA, 0 | F_FORCECONV, "\xe1\xbd\xb8", "\xe1\xbf\xb8\xe1\xbd\xb8" }, + { CMA, 0 | F_FORCECONV, "[\xc3\xa1]", "\xc3\x81\xc3\xa1" }, + { CMA, 0 | F_FORCECONV, "[\xe1\xbd\xb8]", "\xe1\xbf\xb8\xe1\xbd\xb8" }, + { CMA, 0 | F_FORCECONV, "[a-\xed\xb0\x80]", "A" }, + { CMA, 0 | F_NO8 | F_FORCECONV, "[a-\\x{dc00}]", "B" }, + { CMA, 0 | F_NO8 | F_NOMATCH | F_FORCECONV, "[b-\\x{dc00}]", "a" }, + { CMA, 0 | F_NO8 | F_FORCECONV, "\xed\xa0\x80\\x{d800}\xed\xb0\x80\\x{dc00}", "\xed\xa0\x80\xed\xa0\x80\xed\xb0\x80\xed\xb0\x80" }, + { CMA, 0 | F_NO8 | F_FORCECONV, "[\xed\xa0\x80\\x{d800}]{1,2}?[\xed\xb0\x80\\x{dc00}]{1,2}?#", "\xed\xa0\x80\xed\xa0\x80\xed\xb0\x80\xed\xb0\x80#" }, + { CMA, 0 | F_FORCECONV, "[\xed\xa0\x80\xed\xb0\x80#]{0,3}(?<=\xed\xb0\x80.)", "\xed\xa0\x80#\xed\xa0\x80##\xed\xb0\x80\xed\xa0\x80" }, + { CMA, 0 | F_FORCECONV, "[\xed\xa0\x80-\xed\xb3\xbf]", "\xed\x9f\xbf\xed\xa0\x83" }, + { CMA, 0 | F_FORCECONV, "[\xed\xa0\x80-\xed\xb3\xbf]", "\xed\xb4\x80\xed\xb3\xb0" }, + { CMA, 0 | F_NO8 | F_FORCECONV, "[\\x{d800}-\\x{dcff}]", "\xed\x9f\xbf\xed\xa0\x83" }, + { CMA, 0 | F_NO8 | F_FORCECONV, "[\\x{d800}-\\x{dcff}]", "\xed\xb4\x80\xed\xb3\xb0" }, + { CMA, 0 | F_FORCECONV, "[\xed\xa0\x80-\xef\xbf\xbf]+[\x1-\xed\xb0\x80]+#", "\xed\xa0\x85\xc3\x81\xed\xa0\x85\xef\xbf\xb0\xc2\x85\xed\xa9\x89#" }, + { CMA, 0 | F_FORCECONV, "[\xed\xa0\x80][\xed\xb0\x80]{2,}", "\xed\xa0\x80\xed\xb0\x80\xed\xa0\x80\xed\xb0\x80\xed\xb0\x80\xed\xb0\x80" }, + { MA, 0 | F_FORCECONV, "[^\xed\xb0\x80]{3,}?", "##\xed\xb0\x80#\xed\xb0\x80#\xc3\x89#\xed\xb0\x80" }, + { MA, 0 | F_NO8 | F_FORCECONV, "[^\\x{dc00}]{3,}?", "##\xed\xb0\x80#\xed\xb0\x80#\xc3\x89#\xed\xb0\x80" }, + { CMA, 0 | F_FORCECONV, ".\\B.", "\xed\xa0\x80\xed\xb0\x80" }, + { CMA, 0 | F_FORCECONV, "\\D+(?:\\d+|.)\\S+(?:\\s+|.)\\W+(?:\\w+|.)\xed\xa0\x80\xed\xa0\x80", "\xed\xa0\x80\xed\xa0\x80\xed\xa0\x80\xed\xa0\x80\xed\xa0\x80\xed\xa0\x80\xed\xa0\x80\xed\xa0\x80" }, + { CMA, 0 | F_FORCECONV, "\\d*\\s*\\w*\xed\xa0\x80\xed\xa0\x80", "\xed\xa0\x80\xed\xa0\x80" }, + { CMA, 0 | F_FORCECONV | F_NOMATCH, "\\d*?\\D*?\\s*?\\S*?\\w*?\\W*?##", "\xed\xa0\x80\xed\xa0\x80\xed\xa0\x80\xed\xa0\x80#" }, + { CMA | PCRE_EXTENDED, 0 | F_FORCECONV, "\xed\xa0\x80 \xed\xb0\x80 !", "\xed\xa0\x80\xed\xb0\x80!" }, + { CMA, 0 | F_FORCECONV, "\xed\xa0\x80+#[^#]+\xed\xa0\x80", "\xed\xa0\x80#a\xed\xa0\x80" }, + { CMA, 0 | F_FORCECONV, "(\xed\xa0\x80+)#\\1", "\xed\xa0\x80\xed\xa0\x80#\xed\xa0\x80\xed\xa0\x80" }, + { PCRE_MULTILINE | PCRE_NEWLINE_ANY, 0 | F_NO8 | F_FORCECONV, "^-", "a--\xe2\x80\xa8--" }, + { PCRE_BSR_UNICODE, 0 | F_NO8 | F_FORCECONV, "\\R", "ab\xe2\x80\xa8" }, + { 0, 0 | F_NO8 | F_FORCECONV, "\\v", "ab\xe2\x80\xa9" }, + { 0, 0 | F_NO8 | F_FORCECONV, "\\h", "ab\xe1\xa0\x8e" }, + { 0, 0 | F_NO8 | F_FORCECONV, "\\v+?\\V+?#", "\xe2\x80\xa9\xe2\x80\xa9\xef\xbf\xbf\xef\xbf\xbf#" }, + { 0, 0 | F_NO8 | F_FORCECONV, "\\h+?\\H+?#", "\xe1\xa0\x8e\xe1\xa0\x8e\xef\xbf\xbf\xef\xbf\xbf#" }, + + /* Partial matching. */ + { MUA | PCRE_PARTIAL_SOFT, 0, "ab", "a" }, + { MUA | PCRE_PARTIAL_SOFT, 0, "ab|a", "a" }, + { MUA | PCRE_PARTIAL_HARD, 0, "ab|a", "a" }, + { MUA | PCRE_PARTIAL_SOFT, 0, "\\b#", "a" }, + { MUA | PCRE_PARTIAL_SOFT, 0, "(?<=a)b", "a" }, + { MUA | PCRE_PARTIAL_SOFT, 0, "abc|(?<=xxa)bc", "xxab" }, + { MUA | PCRE_PARTIAL_SOFT, 0, "a\\B", "a" }, + { MUA | PCRE_PARTIAL_HARD, 0, "a\\b", "a" }, + + /* (*MARK) verb. */ + { MUA, 0, "a(*MARK:aa)a", "ababaa" }, + { MUA, 0 | F_NOMATCH, "a(*:aa)a", "abab" }, + { MUA, 0, "a(*:aa)(b(*:bb)b|bc)", "abc" }, + { MUA, 0 | F_NOMATCH, "a(*:1)x|b(*:2)y", "abc" }, + { MUA, 0, "(?>a(*:aa))b|ac", "ac" }, + { MUA, 0, "(?(DEFINE)(a(*:aa)))(?1)", "a" }, + { MUA, 0 | F_NOMATCH, "(?(DEFINE)((a)(*:aa)))(?1)b", "aa" }, + { MUA, 0, "(?(DEFINE)(a(*:aa)))a(?1)b|aac", "aac" }, + { MUA, 0, "(a(*:aa)){0}(?:b(?1)b|c)+c", "babbab cc" }, + { MUA, 0, "(a(*:aa)){0}(?:b(?1)b)+", "babba" }, + { MUA, 0 | F_NOMATCH | F_STUDY, "(a(*:aa)){0}(?:b(?1)b)+", "ba" }, + { MUA, 0, "(a\\K(*:aa)){0}(?:b(?1)b|c)+c", "babbab cc" }, + { MUA, 0, "(a\\K(*:aa)){0}(?:b(?1)b)+", "babba" }, + { MUA, 0 | F_NOMATCH | F_STUDY, "(a\\K(*:aa)){0}(?:b(?1)b)+", "ba" }, + { MUA, 0 | F_NOMATCH | F_STUDY, "(*:mark)m", "a" }, + + /* (*COMMIT) verb. */ + { MUA, 0 | F_NOMATCH, "a(*COMMIT)b", "ac" }, + { MUA, 0, "aa(*COMMIT)b", "xaxaab" }, + { MUA, 0 | F_NOMATCH, "a(*COMMIT)(*:msg)b|ac", "ac" }, + { MUA, 0 | F_NOMATCH, "(a(*COMMIT)b)++", "abac" }, + { MUA, 0 | F_NOMATCH, "((a)(*COMMIT)b)++", "abac" }, + { MUA, 0 | F_NOMATCH, "(?=a(*COMMIT)b)ab|ad", "ad" }, + + /* (*PRUNE) verb. */ + { MUA, 0, "aa\\K(*PRUNE)b", "aaab" }, + { MUA, 0, "aa(*PRUNE:bb)b|a", "aa" }, + { MUA, 0, "(a)(a)(*PRUNE)b|(a)", "aa" }, + { MUA, 0, "(a)(a)(a)(a)(a)(a)(a)(a)(*PRUNE)b|(a)", "aaaaaaaa" }, + { MUA | PCRE_PARTIAL_SOFT, 0, "a(*PRUNE)a|", "a" }, + { MUA | PCRE_PARTIAL_SOFT, 0, "a(*PRUNE)a|m", "a" }, + { MUA, 0 | F_NOMATCH, "(?=a(*PRUNE)b)ab|ad", "ad" }, + { MUA, 0, "a(*COMMIT)(*PRUNE)d|bc", "abc" }, + { MUA, 0, "(?=a(*COMMIT)b)a(*PRUNE)c|bc", "abc" }, + { MUA, 0 | F_NOMATCH, "(*COMMIT)(?=a(*COMMIT)b)a(*PRUNE)c|bc", "abc" }, + { MUA, 0, "(?=(a)(*COMMIT)b)a(*PRUNE)c|bc", "abc" }, + { MUA, 0 | F_NOMATCH, "(*COMMIT)(?=(a)(*COMMIT)b)a(*PRUNE)c|bc", "abc" }, + { MUA, 0, "(a(*COMMIT)b){0}a(?1)(*PRUNE)c|bc", "abc" }, + { MUA, 0 | F_NOMATCH, "(a(*COMMIT)b){0}a(*COMMIT)(?1)(*PRUNE)c|bc", "abc" }, + { MUA, 0, "(a(*COMMIT)b)++(*PRUNE)d|c", "ababc" }, + { MUA, 0 | F_NOMATCH, "(*COMMIT)(a(*COMMIT)b)++(*PRUNE)d|c", "ababc" }, + { MUA, 0, "((a)(*COMMIT)b)++(*PRUNE)d|c", "ababc" }, + { MUA, 0 | F_NOMATCH, "(*COMMIT)((a)(*COMMIT)b)++(*PRUNE)d|c", "ababc" }, + { MUA, 0, "(?>a(*COMMIT)b)*abab(*PRUNE)d|ba", "ababab" }, + { MUA, 0 | F_NOMATCH, "(*COMMIT)(?>a(*COMMIT)b)*abab(*PRUNE)d|ba", "ababab" }, + { MUA, 0, "(?>a(*COMMIT)b)+abab(*PRUNE)d|ba", "ababab" }, + { MUA, 0 | F_NOMATCH, "(*COMMIT)(?>a(*COMMIT)b)+abab(*PRUNE)d|ba", "ababab" }, + { MUA, 0, "(?>a(*COMMIT)b)?ab(*PRUNE)d|ba", "aba" }, + { MUA, 0 | F_NOMATCH, "(*COMMIT)(?>a(*COMMIT)b)?ab(*PRUNE)d|ba", "aba" }, + { MUA, 0, "(?>a(*COMMIT)b)*?n(*PRUNE)d|ba", "abababn" }, + { MUA, 0 | F_NOMATCH, "(*COMMIT)(?>a(*COMMIT)b)*?n(*PRUNE)d|ba", "abababn" }, + { MUA, 0, "(?>a(*COMMIT)b)+?n(*PRUNE)d|ba", "abababn" }, + { MUA, 0 | F_NOMATCH, "(*COMMIT)(?>a(*COMMIT)b)+?n(*PRUNE)d|ba", "abababn" }, + { MUA, 0, "(?>a(*COMMIT)b)??n(*PRUNE)d|bn", "abn" }, + { MUA, 0 | F_NOMATCH, "(*COMMIT)(?>a(*COMMIT)b)??n(*PRUNE)d|bn", "abn" }, + + /* (*SKIP) verb. */ + { MUA, 0 | F_NOMATCH, "(?=a(*SKIP)b)ab|ad", "ad" }, + { MUA, 0, "(\\w+(*SKIP)#)", "abcd,xyz#," }, + { MUA, 0, "\\w+(*SKIP)#|mm", "abcd,xyz#," }, + { MUA, 0 | F_NOMATCH, "b+(?<=(*SKIP)#c)|b+", "#bbb" }, + + /* (*THEN) verb. */ + { MUA, 0, "((?:a(*THEN)|aab)(*THEN)c|a+)+m", "aabcaabcaabcaabcnacm" }, + { MUA, 0 | F_NOMATCH, "((?:a(*THEN)|aab)(*THEN)c|a+)+m", "aabcm" }, + { MUA, 0, "((?:a(*THEN)|aab)c|a+)+m", "aabcaabcnmaabcaabcm" }, + { MUA, 0, "((?:a|aab)(*THEN)c|a+)+m", "aam" }, + { MUA, 0, "((?:a(*COMMIT)|aab)(*THEN)c|a+)+m", "aam" }, + { MUA, 0, "(?(?=a(*THEN)b)ab|ad)", "ad" }, + { MUA, 0, "(?(?!a(*THEN)b)ad|add)", "add" }, + { MUA, 0 | F_NOMATCH, "(?(?=a)a(*THEN)b|ad)", "ad" }, + { MUA, 0, "(?!(?(?=a)ab|b(*THEN)d))bn|bnn", "bnn" }, + + /* Deep recursion. */ + { MUA, 0, "((((?:(?:(?:\\w)+)?)*|(?>\\w)+?)+|(?>\\w)?\?)*)?\\s", "aaaaa+ " }, + { MUA, 0, "(?:((?:(?:(?:\\w*?)+)??|(?>\\w)?|\\w*+)*)+)+?\\s", "aa+ " }, + { MUA, 0, "((a?)+)+b", "aaaaaaaaaaaa b" }, + + /* Deep recursion: Stack limit reached. */ + { MA, 0 | F_NOMATCH, "a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?aaaaaaaaaaaaaaaaaaaaaaa", "aaaaaaaaaaaaaaaaaaaaaaa" }, + { MA, 0 | F_NOMATCH, "(?:a+)+b", "aaaaaaaaaaaaaaaaaaaaaaaa b" }, + { MA, 0 | F_NOMATCH, "(?:a+?)+?b", "aaaaaaaaaaaaaaaaaaaaaaaa b" }, + { MA, 0 | F_NOMATCH, "(?:a*)*b", "aaaaaaaaaaaaaaaaaaaaaaaa b" }, + { MA, 0 | F_NOMATCH, "(?:a*?)*?b", "aaaaaaaaaaaaaaaaaaaaaaaa b" }, + + { 0, 0, NULL, NULL } +}; + +static const unsigned char *tables(int mode) +{ + /* The purpose of this function to allow valgrind + for reporting invalid reads and writes. */ + static unsigned char *tables_copy; + const char *errorptr; + int erroroffset; + unsigned char *default_tables; +#if defined SUPPORT_PCRE8 + pcre *regex; + char null_str[1] = { 0 }; +#elif defined SUPPORT_PCRE16 + pcre16 *regex; + PCRE_UCHAR16 null_str[1] = { 0 }; +#elif defined SUPPORT_PCRE32 + pcre32 *regex; + PCRE_UCHAR32 null_str[1] = { 0 }; +#endif + + if (mode) { + if (tables_copy) + free(tables_copy); + tables_copy = NULL; + return NULL; + } + + if (tables_copy) + return tables_copy; + + default_tables = NULL; +#if defined SUPPORT_PCRE8 + regex = pcre_compile(null_str, 0, &errorptr, &erroroffset, NULL); + if (regex) { + pcre_fullinfo(regex, NULL, PCRE_INFO_DEFAULT_TABLES, &default_tables); + pcre_free(regex); + } +#elif defined SUPPORT_PCRE16 + regex = pcre16_compile(null_str, 0, &errorptr, &erroroffset, NULL); + if (regex) { + pcre16_fullinfo(regex, NULL, PCRE_INFO_DEFAULT_TABLES, &default_tables); + pcre16_free(regex); + } +#elif defined SUPPORT_PCRE32 + regex = pcre32_compile(null_str, 0, &errorptr, &erroroffset, NULL); + if (regex) { + pcre32_fullinfo(regex, NULL, PCRE_INFO_DEFAULT_TABLES, &default_tables); + pcre32_free(regex); + } +#endif + /* Shouldn't ever happen. */ + if (!default_tables) + return NULL; + + /* Unfortunately this value cannot get from pcre_fullinfo. + Since this is a test program, this is acceptable at the moment. */ + tables_copy = (unsigned char *)malloc(1088); + if (!tables_copy) + return NULL; + + memcpy(tables_copy, default_tables, 1088); + return tables_copy; +} + +#ifdef SUPPORT_PCRE8 +static pcre_jit_stack* callback8(void *arg) +{ + return (pcre_jit_stack *)arg; +} +#endif + +#ifdef SUPPORT_PCRE16 +static pcre16_jit_stack* callback16(void *arg) +{ + return (pcre16_jit_stack *)arg; +} +#endif + +#ifdef SUPPORT_PCRE32 +static pcre32_jit_stack* callback32(void *arg) +{ + return (pcre32_jit_stack *)arg; +} +#endif + +#ifdef SUPPORT_PCRE8 +static pcre_jit_stack *stack8; + +static pcre_jit_stack *getstack8(void) +{ + if (!stack8) + stack8 = pcre_jit_stack_alloc(1, 1024 * 1024); + return stack8; +} + +static void setstack8(pcre_extra *extra) +{ + if (!extra) { + if (stack8) + pcre_jit_stack_free(stack8); + stack8 = NULL; + return; + } + + pcre_assign_jit_stack(extra, callback8, getstack8()); +} +#endif /* SUPPORT_PCRE8 */ + +#ifdef SUPPORT_PCRE16 +static pcre16_jit_stack *stack16; + +static pcre16_jit_stack *getstack16(void) +{ + if (!stack16) + stack16 = pcre16_jit_stack_alloc(1, 1024 * 1024); + return stack16; +} + +static void setstack16(pcre16_extra *extra) +{ + if (!extra) { + if (stack16) + pcre16_jit_stack_free(stack16); + stack16 = NULL; + return; + } + + pcre16_assign_jit_stack(extra, callback16, getstack16()); +} +#endif /* SUPPORT_PCRE16 */ + +#ifdef SUPPORT_PCRE32 +static pcre32_jit_stack *stack32; + +static pcre32_jit_stack *getstack32(void) +{ + if (!stack32) + stack32 = pcre32_jit_stack_alloc(1, 1024 * 1024); + return stack32; +} + +static void setstack32(pcre32_extra *extra) +{ + if (!extra) { + if (stack32) + pcre32_jit_stack_free(stack32); + stack32 = NULL; + return; + } + + pcre32_assign_jit_stack(extra, callback32, getstack32()); +} +#endif /* SUPPORT_PCRE32 */ + +#ifdef SUPPORT_PCRE16 + +static int convert_utf8_to_utf16(const char *input, PCRE_UCHAR16 *output, int *offsetmap, int max_length) +{ + unsigned char *iptr = (unsigned char*)input; + PCRE_UCHAR16 *optr = output; + unsigned int c; + + if (max_length == 0) + return 0; + + while (*iptr && max_length > 1) { + c = 0; + if (offsetmap) + *offsetmap++ = (int)(iptr - (unsigned char*)input); + + if (*iptr < 0xc0) + c = *iptr++; + else if (!(*iptr & 0x20)) { + c = ((iptr[0] & 0x1f) << 6) | (iptr[1] & 0x3f); + iptr += 2; + } else if (!(*iptr & 0x10)) { + c = ((iptr[0] & 0x0f) << 12) | ((iptr[1] & 0x3f) << 6) | (iptr[2] & 0x3f); + iptr += 3; + } else if (!(*iptr & 0x08)) { + c = ((iptr[0] & 0x07) << 18) | ((iptr[1] & 0x3f) << 12) | ((iptr[2] & 0x3f) << 6) | (iptr[3] & 0x3f); + iptr += 4; + } + + if (c < 65536) { + *optr++ = c; + max_length--; + } else if (max_length <= 2) { + *optr = '\0'; + return (int)(optr - output); + } else { + c -= 0x10000; + *optr++ = 0xd800 | ((c >> 10) & 0x3ff); + *optr++ = 0xdc00 | (c & 0x3ff); + max_length -= 2; + if (offsetmap) + offsetmap++; + } + } + if (offsetmap) + *offsetmap = (int)(iptr - (unsigned char*)input); + *optr = '\0'; + return (int)(optr - output); +} + +static int copy_char8_to_char16(const char *input, PCRE_UCHAR16 *output, int max_length) +{ + unsigned char *iptr = (unsigned char*)input; + PCRE_UCHAR16 *optr = output; + + if (max_length == 0) + return 0; + + while (*iptr && max_length > 1) { + *optr++ = *iptr++; + max_length--; + } + *optr = '\0'; + return (int)(optr - output); +} + +#define REGTEST_MAX_LENGTH16 4096 +static PCRE_UCHAR16 regtest_buf16[REGTEST_MAX_LENGTH16]; +static int regtest_offsetmap16[REGTEST_MAX_LENGTH16]; + +#endif /* SUPPORT_PCRE16 */ + +#ifdef SUPPORT_PCRE32 + +static int convert_utf8_to_utf32(const char *input, PCRE_UCHAR32 *output, int *offsetmap, int max_length) +{ + unsigned char *iptr = (unsigned char*)input; + PCRE_UCHAR32 *optr = output; + unsigned int c; + + if (max_length == 0) + return 0; + + while (*iptr && max_length > 1) { + c = 0; + if (offsetmap) + *offsetmap++ = (int)(iptr - (unsigned char*)input); + + if (*iptr < 0xc0) + c = *iptr++; + else if (!(*iptr & 0x20)) { + c = ((iptr[0] & 0x1f) << 6) | (iptr[1] & 0x3f); + iptr += 2; + } else if (!(*iptr & 0x10)) { + c = ((iptr[0] & 0x0f) << 12) | ((iptr[1] & 0x3f) << 6) | (iptr[2] & 0x3f); + iptr += 3; + } else if (!(*iptr & 0x08)) { + c = ((iptr[0] & 0x07) << 18) | ((iptr[1] & 0x3f) << 12) | ((iptr[2] & 0x3f) << 6) | (iptr[3] & 0x3f); + iptr += 4; + } + + *optr++ = c; + max_length--; + } + if (offsetmap) + *offsetmap = (int)(iptr - (unsigned char*)input); + *optr = 0; + return (int)(optr - output); +} + +static int copy_char8_to_char32(const char *input, PCRE_UCHAR32 *output, int max_length) +{ + unsigned char *iptr = (unsigned char*)input; + PCRE_UCHAR32 *optr = output; + + if (max_length == 0) + return 0; + + while (*iptr && max_length > 1) { + *optr++ = *iptr++; + max_length--; + } + *optr = '\0'; + return (int)(optr - output); +} + +#define REGTEST_MAX_LENGTH32 4096 +static PCRE_UCHAR32 regtest_buf32[REGTEST_MAX_LENGTH32]; +static int regtest_offsetmap32[REGTEST_MAX_LENGTH32]; + +#endif /* SUPPORT_PCRE32 */ + +static int check_ascii(const char *input) +{ + const unsigned char *ptr = (unsigned char *)input; + while (*ptr) { + if (*ptr > 127) + return 0; + ptr++; + } + return 1; +} + +static int regression_tests(void) +{ + struct regression_test_case *current = regression_test_cases; + const char *error; + char *cpu_info; + int i, err_offs; + int is_successful, is_ascii; + int total = 0; + int successful = 0; + int successful_row = 0; + int counter = 0; + int study_mode; + int utf = 0, ucp = 0; + int disabled_flags = 0; +#ifdef SUPPORT_PCRE8 + pcre *re8; + pcre_extra *extra8; + pcre_extra dummy_extra8; + int ovector8_1[32]; + int ovector8_2[32]; + int return_value8[2]; + unsigned char *mark8_1, *mark8_2; +#endif +#ifdef SUPPORT_PCRE16 + pcre16 *re16; + pcre16_extra *extra16; + pcre16_extra dummy_extra16; + int ovector16_1[32]; + int ovector16_2[32]; + int return_value16[2]; + PCRE_UCHAR16 *mark16_1, *mark16_2; + int length16; +#endif +#ifdef SUPPORT_PCRE32 + pcre32 *re32; + pcre32_extra *extra32; + pcre32_extra dummy_extra32; + int ovector32_1[32]; + int ovector32_2[32]; + int return_value32[2]; + PCRE_UCHAR32 *mark32_1, *mark32_2; + int length32; +#endif + + /* This test compares the behaviour of interpreter and JIT. Although disabling + utf or ucp may make tests fail, if the pcre_exec result is the SAME, it is + still considered successful from pcre_jit_test point of view. */ + +#if defined SUPPORT_PCRE8 + pcre_config(PCRE_CONFIG_JITTARGET, &cpu_info); +#elif defined SUPPORT_PCRE16 + pcre16_config(PCRE_CONFIG_JITTARGET, &cpu_info); +#elif defined SUPPORT_PCRE32 + pcre32_config(PCRE_CONFIG_JITTARGET, &cpu_info); +#endif + + printf("Running JIT regression tests\n"); + printf(" target CPU of SLJIT compiler: %s\n", cpu_info); + +#if defined SUPPORT_PCRE8 + pcre_config(PCRE_CONFIG_UTF8, &utf); + pcre_config(PCRE_CONFIG_UNICODE_PROPERTIES, &ucp); +#elif defined SUPPORT_PCRE16 + pcre16_config(PCRE_CONFIG_UTF16, &utf); + pcre16_config(PCRE_CONFIG_UNICODE_PROPERTIES, &ucp); +#elif defined SUPPORT_PCRE32 + pcre32_config(PCRE_CONFIG_UTF32, &utf); + pcre32_config(PCRE_CONFIG_UNICODE_PROPERTIES, &ucp); +#endif + + if (!utf) + disabled_flags |= PCRE_UTF8 | PCRE_UTF16 | PCRE_UTF32; + if (!ucp) + disabled_flags |= PCRE_UCP; +#ifdef SUPPORT_PCRE8 + printf(" in 8 bit mode with UTF-8 %s and ucp %s:\n", utf ? "enabled" : "disabled", ucp ? "enabled" : "disabled"); +#endif +#ifdef SUPPORT_PCRE16 + printf(" in 16 bit mode with UTF-16 %s and ucp %s:\n", utf ? "enabled" : "disabled", ucp ? "enabled" : "disabled"); +#endif +#ifdef SUPPORT_PCRE32 + printf(" in 32 bit mode with UTF-32 %s and ucp %s:\n", utf ? "enabled" : "disabled", ucp ? "enabled" : "disabled"); +#endif + + while (current->pattern) { + /* printf("\nPattern: %s :\n", current->pattern); */ + total++; + is_ascii = 0; + if (!(current->start_offset & F_PROPERTY)) + is_ascii = check_ascii(current->pattern) && check_ascii(current->input); + + if (current->flags & PCRE_PARTIAL_SOFT) + study_mode = PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE; + else if (current->flags & PCRE_PARTIAL_HARD) + study_mode = PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE; + else + study_mode = PCRE_STUDY_JIT_COMPILE; + error = NULL; +#ifdef SUPPORT_PCRE8 + re8 = NULL; + if (!(current->start_offset & F_NO8)) + re8 = pcre_compile(current->pattern, + current->flags & ~(PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | PCRE_PARTIAL_SOFT | PCRE_PARTIAL_HARD | disabled_flags), + &error, &err_offs, tables(0)); + + extra8 = NULL; + if (re8) { + error = NULL; + extra8 = pcre_study(re8, study_mode, &error); + if (!extra8) { + printf("\n8 bit: Cannot study pattern: %s\n", current->pattern); + pcre_free(re8); + re8 = NULL; + } + else if (!(extra8->flags & PCRE_EXTRA_EXECUTABLE_JIT)) { + printf("\n8 bit: JIT compiler does not support: %s\n", current->pattern); + pcre_free_study(extra8); + pcre_free(re8); + re8 = NULL; + } + extra8->flags |= PCRE_EXTRA_MARK; + } else if (((utf && ucp) || is_ascii) && !(current->start_offset & F_NO8)) + printf("\n8 bit: Cannot compile pattern \"%s\": %s\n", current->pattern, error); +#endif +#ifdef SUPPORT_PCRE16 + if ((current->flags & PCRE_UTF16) || (current->start_offset & F_FORCECONV)) + convert_utf8_to_utf16(current->pattern, regtest_buf16, NULL, REGTEST_MAX_LENGTH16); + else + copy_char8_to_char16(current->pattern, regtest_buf16, REGTEST_MAX_LENGTH16); + + re16 = NULL; + if (!(current->start_offset & F_NO16)) + re16 = pcre16_compile(regtest_buf16, + current->flags & ~(PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | PCRE_PARTIAL_SOFT | PCRE_PARTIAL_HARD | disabled_flags), + &error, &err_offs, tables(0)); + + extra16 = NULL; + if (re16) { + error = NULL; + extra16 = pcre16_study(re16, study_mode, &error); + if (!extra16) { + printf("\n16 bit: Cannot study pattern: %s\n", current->pattern); + pcre16_free(re16); + re16 = NULL; + } + else if (!(extra16->flags & PCRE_EXTRA_EXECUTABLE_JIT)) { + printf("\n16 bit: JIT compiler does not support: %s\n", current->pattern); + pcre16_free_study(extra16); + pcre16_free(re16); + re16 = NULL; + } + extra16->flags |= PCRE_EXTRA_MARK; + } else if (((utf && ucp) || is_ascii) && !(current->start_offset & F_NO16)) + printf("\n16 bit: Cannot compile pattern \"%s\": %s\n", current->pattern, error); +#endif +#ifdef SUPPORT_PCRE32 + if ((current->flags & PCRE_UTF32) || (current->start_offset & F_FORCECONV)) + convert_utf8_to_utf32(current->pattern, regtest_buf32, NULL, REGTEST_MAX_LENGTH32); + else + copy_char8_to_char32(current->pattern, regtest_buf32, REGTEST_MAX_LENGTH32); + + re32 = NULL; + if (!(current->start_offset & F_NO32)) + re32 = pcre32_compile(regtest_buf32, + current->flags & ~(PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | PCRE_PARTIAL_SOFT | PCRE_PARTIAL_HARD | disabled_flags), + &error, &err_offs, tables(0)); + + extra32 = NULL; + if (re32) { + error = NULL; + extra32 = pcre32_study(re32, study_mode, &error); + if (!extra32) { + printf("\n32 bit: Cannot study pattern: %s\n", current->pattern); + pcre32_free(re32); + re32 = NULL; + } + if (!(extra32->flags & PCRE_EXTRA_EXECUTABLE_JIT)) { + printf("\n32 bit: JIT compiler does not support: %s\n", current->pattern); + pcre32_free_study(extra32); + pcre32_free(re32); + re32 = NULL; + } + extra32->flags |= PCRE_EXTRA_MARK; + } else if (((utf && ucp) || is_ascii) && !(current->start_offset & F_NO32)) + printf("\n32 bit: Cannot compile pattern \"%s\": %s\n", current->pattern, error); +#endif + + counter++; + if ((counter & 0x3) != 0) { +#ifdef SUPPORT_PCRE8 + setstack8(NULL); +#endif +#ifdef SUPPORT_PCRE16 + setstack16(NULL); +#endif +#ifdef SUPPORT_PCRE32 + setstack32(NULL); +#endif + } + +#ifdef SUPPORT_PCRE8 + return_value8[0] = -1000; + return_value8[1] = -1000; + for (i = 0; i < 32; ++i) + ovector8_1[i] = -2; + for (i = 0; i < 32; ++i) + ovector8_2[i] = -2; + if (re8) { + mark8_1 = NULL; + mark8_2 = NULL; + extra8->mark = &mark8_1; + + if ((counter & 0x1) != 0) { + setstack8(extra8); + return_value8[0] = pcre_exec(re8, extra8, current->input, strlen(current->input), current->start_offset & OFFSET_MASK, + current->flags & (PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | PCRE_PARTIAL_SOFT | PCRE_PARTIAL_HARD | PCRE_NO_UTF8_CHECK), ovector8_1, 32); + } else + return_value8[0] = pcre_jit_exec(re8, extra8, current->input, strlen(current->input), current->start_offset & OFFSET_MASK, + current->flags & (PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | PCRE_PARTIAL_SOFT | PCRE_PARTIAL_HARD | PCRE_NO_UTF8_CHECK), ovector8_1, 32, getstack8()); + memset(&dummy_extra8, 0, sizeof(pcre_extra)); + dummy_extra8.flags = PCRE_EXTRA_MARK; + if (current->start_offset & F_STUDY) { + dummy_extra8.flags |= PCRE_EXTRA_STUDY_DATA; + dummy_extra8.study_data = extra8->study_data; + } + dummy_extra8.mark = &mark8_2; + return_value8[1] = pcre_exec(re8, &dummy_extra8, current->input, strlen(current->input), current->start_offset & OFFSET_MASK, + current->flags & (PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | PCRE_PARTIAL_SOFT | PCRE_PARTIAL_HARD | PCRE_NO_UTF8_CHECK), ovector8_2, 32); + } +#endif + +#ifdef SUPPORT_PCRE16 + return_value16[0] = -1000; + return_value16[1] = -1000; + for (i = 0; i < 32; ++i) + ovector16_1[i] = -2; + for (i = 0; i < 32; ++i) + ovector16_2[i] = -2; + if (re16) { + mark16_1 = NULL; + mark16_2 = NULL; + if ((current->flags & PCRE_UTF16) || (current->start_offset & F_FORCECONV)) + length16 = convert_utf8_to_utf16(current->input, regtest_buf16, regtest_offsetmap16, REGTEST_MAX_LENGTH16); + else + length16 = copy_char8_to_char16(current->input, regtest_buf16, REGTEST_MAX_LENGTH16); + extra16->mark = &mark16_1; + if ((counter & 0x1) != 0) { + setstack16(extra16); + return_value16[0] = pcre16_exec(re16, extra16, regtest_buf16, length16, current->start_offset & OFFSET_MASK, + current->flags & (PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | PCRE_PARTIAL_SOFT | PCRE_PARTIAL_HARD | PCRE_NO_UTF8_CHECK), ovector16_1, 32); + } else + return_value16[0] = pcre16_jit_exec(re16, extra16, regtest_buf16, length16, current->start_offset & OFFSET_MASK, + current->flags & (PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | PCRE_PARTIAL_SOFT | PCRE_PARTIAL_HARD | PCRE_NO_UTF8_CHECK), ovector16_1, 32, getstack16()); + memset(&dummy_extra16, 0, sizeof(pcre16_extra)); + dummy_extra16.flags = PCRE_EXTRA_MARK; + if (current->start_offset & F_STUDY) { + dummy_extra16.flags |= PCRE_EXTRA_STUDY_DATA; + dummy_extra16.study_data = extra16->study_data; + } + dummy_extra16.mark = &mark16_2; + return_value16[1] = pcre16_exec(re16, &dummy_extra16, regtest_buf16, length16, current->start_offset & OFFSET_MASK, + current->flags & (PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | PCRE_PARTIAL_SOFT | PCRE_PARTIAL_HARD | PCRE_NO_UTF8_CHECK), ovector16_2, 32); + } +#endif + +#ifdef SUPPORT_PCRE32 + return_value32[0] = -1000; + return_value32[1] = -1000; + for (i = 0; i < 32; ++i) + ovector32_1[i] = -2; + for (i = 0; i < 32; ++i) + ovector32_2[i] = -2; + if (re32) { + mark32_1 = NULL; + mark32_2 = NULL; + if ((current->flags & PCRE_UTF32) || (current->start_offset & F_FORCECONV)) + length32 = convert_utf8_to_utf32(current->input, regtest_buf32, regtest_offsetmap32, REGTEST_MAX_LENGTH32); + else + length32 = copy_char8_to_char32(current->input, regtest_buf32, REGTEST_MAX_LENGTH32); + extra32->mark = &mark32_1; + if ((counter & 0x1) != 0) { + setstack32(extra32); + return_value32[0] = pcre32_exec(re32, extra32, regtest_buf32, length32, current->start_offset & OFFSET_MASK, + current->flags & (PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | PCRE_PARTIAL_SOFT | PCRE_PARTIAL_HARD | PCRE_NO_UTF8_CHECK), ovector32_1, 32); + } else + return_value32[0] = pcre32_jit_exec(re32, extra32, regtest_buf32, length32, current->start_offset & OFFSET_MASK, + current->flags & (PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | PCRE_PARTIAL_SOFT | PCRE_PARTIAL_HARD | PCRE_NO_UTF8_CHECK), ovector32_1, 32, getstack32()); + memset(&dummy_extra32, 0, sizeof(pcre32_extra)); + dummy_extra32.flags = PCRE_EXTRA_MARK; + if (current->start_offset & F_STUDY) { + dummy_extra32.flags |= PCRE_EXTRA_STUDY_DATA; + dummy_extra32.study_data = extra32->study_data; + } + dummy_extra32.mark = &mark32_2; + return_value32[1] = pcre32_exec(re32, &dummy_extra32, regtest_buf32, length32, current->start_offset & OFFSET_MASK, + current->flags & (PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | PCRE_PARTIAL_SOFT | PCRE_PARTIAL_HARD | PCRE_NO_UTF8_CHECK), ovector32_2, 32); + } +#endif + + /* printf("[%d-%d-%d|%d-%d|%d-%d|%d-%d]%s", + return_value8[0], return_value16[0], return_value32[0], + ovector8_1[0], ovector8_1[1], + ovector16_1[0], ovector16_1[1], + ovector32_1[0], ovector32_1[1], + (current->flags & PCRE_CASELESS) ? "C" : ""); */ + + /* If F_DIFF is set, just run the test, but do not compare the results. + Segfaults can still be captured. */ + + is_successful = 1; + if (!(current->start_offset & F_DIFF)) { +#if defined SUPPORT_UTF && ((defined(SUPPORT_PCRE8) + defined(SUPPORT_PCRE16) + defined(SUPPORT_PCRE32)) >= 2) + if (!(current->start_offset & F_FORCECONV)) { + int return_value; + + /* All results must be the same. */ +#ifdef SUPPORT_PCRE8 + if ((return_value = return_value8[0]) != return_value8[1]) { + printf("\n8 bit: Return value differs(J8:%d,I8:%d): [%d] '%s' @ '%s'\n", + return_value8[0], return_value8[1], total, current->pattern, current->input); + is_successful = 0; + } else +#endif +#ifdef SUPPORT_PCRE16 + if ((return_value = return_value16[0]) != return_value16[1]) { + printf("\n16 bit: Return value differs(J16:%d,I16:%d): [%d] '%s' @ '%s'\n", + return_value16[0], return_value16[1], total, current->pattern, current->input); + is_successful = 0; + } else +#endif +#ifdef SUPPORT_PCRE32 + if ((return_value = return_value32[0]) != return_value32[1]) { + printf("\n32 bit: Return value differs(J32:%d,I32:%d): [%d] '%s' @ '%s'\n", + return_value32[0], return_value32[1], total, current->pattern, current->input); + is_successful = 0; + } else +#endif +#if defined SUPPORT_PCRE8 && defined SUPPORT_PCRE16 + if (return_value8[0] != return_value16[0]) { + printf("\n8 and 16 bit: Return value differs(J8:%d,J16:%d): [%d] '%s' @ '%s'\n", + return_value8[0], return_value16[0], + total, current->pattern, current->input); + is_successful = 0; + } else +#endif +#if defined SUPPORT_PCRE8 && defined SUPPORT_PCRE32 + if (return_value8[0] != return_value32[0]) { + printf("\n8 and 32 bit: Return value differs(J8:%d,J32:%d): [%d] '%s' @ '%s'\n", + return_value8[0], return_value32[0], + total, current->pattern, current->input); + is_successful = 0; + } else +#endif +#if defined SUPPORT_PCRE16 && defined SUPPORT_PCRE32 + if (return_value16[0] != return_value32[0]) { + printf("\n16 and 32 bit: Return value differs(J16:%d,J32:%d): [%d] '%s' @ '%s'\n", + return_value16[0], return_value32[0], + total, current->pattern, current->input); + is_successful = 0; + } else +#endif + if (return_value >= 0 || return_value == PCRE_ERROR_PARTIAL) { + if (return_value == PCRE_ERROR_PARTIAL) { + return_value = 2; + } else { + return_value *= 2; + } +#ifdef SUPPORT_PCRE8 + return_value8[0] = return_value; +#endif +#ifdef SUPPORT_PCRE16 + return_value16[0] = return_value; +#endif +#ifdef SUPPORT_PCRE32 + return_value32[0] = return_value; +#endif + /* Transform back the results. */ + if (current->flags & PCRE_UTF8) { +#ifdef SUPPORT_PCRE16 + for (i = 0; i < return_value; ++i) { + if (ovector16_1[i] >= 0) + ovector16_1[i] = regtest_offsetmap16[ovector16_1[i]]; + if (ovector16_2[i] >= 0) + ovector16_2[i] = regtest_offsetmap16[ovector16_2[i]]; + } +#endif +#ifdef SUPPORT_PCRE32 + for (i = 0; i < return_value; ++i) { + if (ovector32_1[i] >= 0) + ovector32_1[i] = regtest_offsetmap32[ovector32_1[i]]; + if (ovector32_2[i] >= 0) + ovector32_2[i] = regtest_offsetmap32[ovector32_2[i]]; + } +#endif + } + + for (i = 0; i < return_value; ++i) { +#if defined SUPPORT_PCRE8 && defined SUPPORT_PCRE16 + if (ovector8_1[i] != ovector8_2[i] || ovector8_1[i] != ovector16_1[i] || ovector8_1[i] != ovector16_2[i]) { + printf("\n8 and 16 bit: Ovector[%d] value differs(J8:%d,I8:%d,J16:%d,I16:%d): [%d] '%s' @ '%s' \n", + i, ovector8_1[i], ovector8_2[i], ovector16_1[i], ovector16_2[i], + total, current->pattern, current->input); + is_successful = 0; + } +#endif +#if defined SUPPORT_PCRE8 && defined SUPPORT_PCRE32 + if (ovector8_1[i] != ovector8_2[i] || ovector8_1[i] != ovector32_1[i] || ovector8_1[i] != ovector32_2[i]) { + printf("\n8 and 32 bit: Ovector[%d] value differs(J8:%d,I8:%d,J32:%d,I32:%d): [%d] '%s' @ '%s' \n", + i, ovector8_1[i], ovector8_2[i], ovector32_1[i], ovector32_2[i], + total, current->pattern, current->input); + is_successful = 0; + } +#endif +#if defined SUPPORT_PCRE16 && defined SUPPORT_PCRE32 + if (ovector16_1[i] != ovector16_2[i] || ovector16_1[i] != ovector32_1[i] || ovector16_1[i] != ovector32_2[i]) { + printf("\n16 and 32 bit: Ovector[%d] value differs(J16:%d,I16:%d,J32:%d,I32:%d): [%d] '%s' @ '%s' \n", + i, ovector16_1[i], ovector16_2[i], ovector32_1[i], ovector32_2[i], + total, current->pattern, current->input); + is_successful = 0; + } +#endif + } + } + } else +#endif /* more than one of SUPPORT_PCRE8, SUPPORT_PCRE16 and SUPPORT_PCRE32 */ + { + /* Only the 8 bit and 16 bit results must be equal. */ +#ifdef SUPPORT_PCRE8 + if (return_value8[0] != return_value8[1]) { + printf("\n8 bit: Return value differs(%d:%d): [%d] '%s' @ '%s'\n", + return_value8[0], return_value8[1], total, current->pattern, current->input); + is_successful = 0; + } else if (return_value8[0] >= 0 || return_value8[0] == PCRE_ERROR_PARTIAL) { + if (return_value8[0] == PCRE_ERROR_PARTIAL) + return_value8[0] = 2; + else + return_value8[0] *= 2; + + for (i = 0; i < return_value8[0]; ++i) + if (ovector8_1[i] != ovector8_2[i]) { + printf("\n8 bit: Ovector[%d] value differs(%d:%d): [%d] '%s' @ '%s'\n", + i, ovector8_1[i], ovector8_2[i], total, current->pattern, current->input); + is_successful = 0; + } + } +#endif + +#ifdef SUPPORT_PCRE16 + if (return_value16[0] != return_value16[1]) { + printf("\n16 bit: Return value differs(%d:%d): [%d] '%s' @ '%s'\n", + return_value16[0], return_value16[1], total, current->pattern, current->input); + is_successful = 0; + } else if (return_value16[0] >= 0 || return_value16[0] == PCRE_ERROR_PARTIAL) { + if (return_value16[0] == PCRE_ERROR_PARTIAL) + return_value16[0] = 2; + else + return_value16[0] *= 2; + + for (i = 0; i < return_value16[0]; ++i) + if (ovector16_1[i] != ovector16_2[i]) { + printf("\n16 bit: Ovector[%d] value differs(%d:%d): [%d] '%s' @ '%s'\n", + i, ovector16_1[i], ovector16_2[i], total, current->pattern, current->input); + is_successful = 0; + } + } +#endif + +#ifdef SUPPORT_PCRE32 + if (return_value32[0] != return_value32[1]) { + printf("\n32 bit: Return value differs(%d:%d): [%d] '%s' @ '%s'\n", + return_value32[0], return_value32[1], total, current->pattern, current->input); + is_successful = 0; + } else if (return_value32[0] >= 0 || return_value32[0] == PCRE_ERROR_PARTIAL) { + if (return_value32[0] == PCRE_ERROR_PARTIAL) + return_value32[0] = 2; + else + return_value32[0] *= 2; + + for (i = 0; i < return_value32[0]; ++i) + if (ovector32_1[i] != ovector32_2[i]) { + printf("\n32 bit: Ovector[%d] value differs(%d:%d): [%d] '%s' @ '%s'\n", + i, ovector32_1[i], ovector32_2[i], total, current->pattern, current->input); + is_successful = 0; + } + } +#endif + } + } + + if (is_successful) { +#ifdef SUPPORT_PCRE8 + if (!(current->start_offset & F_NO8) && ((utf && ucp) || is_ascii)) { + if (return_value8[0] < 0 && !(current->start_offset & F_NOMATCH)) { + printf("8 bit: Test should match: [%d] '%s' @ '%s'\n", + total, current->pattern, current->input); + is_successful = 0; + } + + if (return_value8[0] >= 0 && (current->start_offset & F_NOMATCH)) { + printf("8 bit: Test should not match: [%d] '%s' @ '%s'\n", + total, current->pattern, current->input); + is_successful = 0; + } + } +#endif +#ifdef SUPPORT_PCRE16 + if (!(current->start_offset & F_NO16) && ((utf && ucp) || is_ascii)) { + if (return_value16[0] < 0 && !(current->start_offset & F_NOMATCH)) { + printf("16 bit: Test should match: [%d] '%s' @ '%s'\n", + total, current->pattern, current->input); + is_successful = 0; + } + + if (return_value16[0] >= 0 && (current->start_offset & F_NOMATCH)) { + printf("16 bit: Test should not match: [%d] '%s' @ '%s'\n", + total, current->pattern, current->input); + is_successful = 0; + } + } +#endif +#ifdef SUPPORT_PCRE32 + if (!(current->start_offset & F_NO32) && ((utf && ucp) || is_ascii)) { + if (return_value32[0] < 0 && !(current->start_offset & F_NOMATCH)) { + printf("32 bit: Test should match: [%d] '%s' @ '%s'\n", + total, current->pattern, current->input); + is_successful = 0; + } + + if (return_value32[0] >= 0 && (current->start_offset & F_NOMATCH)) { + printf("32 bit: Test should not match: [%d] '%s' @ '%s'\n", + total, current->pattern, current->input); + is_successful = 0; + } + } +#endif + } + + if (is_successful) { +#ifdef SUPPORT_PCRE8 + if (mark8_1 != mark8_2) { + printf("8 bit: Mark value mismatch: [%d] '%s' @ '%s'\n", + total, current->pattern, current->input); + is_successful = 0; + } +#endif +#ifdef SUPPORT_PCRE16 + if (mark16_1 != mark16_2) { + printf("16 bit: Mark value mismatch: [%d] '%s' @ '%s'\n", + total, current->pattern, current->input); + is_successful = 0; + } +#endif +#ifdef SUPPORT_PCRE32 + if (mark32_1 != mark32_2) { + printf("32 bit: Mark value mismatch: [%d] '%s' @ '%s'\n", + total, current->pattern, current->input); + is_successful = 0; + } +#endif + } + +#ifdef SUPPORT_PCRE8 + if (re8) { + pcre_free_study(extra8); + pcre_free(re8); + } +#endif +#ifdef SUPPORT_PCRE16 + if (re16) { + pcre16_free_study(extra16); + pcre16_free(re16); + } +#endif +#ifdef SUPPORT_PCRE32 + if (re32) { + pcre32_free_study(extra32); + pcre32_free(re32); + } +#endif + + if (is_successful) { + successful++; + successful_row++; + printf("."); + if (successful_row >= 60) { + successful_row = 0; + printf("\n"); + } + } else + successful_row = 0; + + fflush(stdout); + current++; + } + tables(1); +#ifdef SUPPORT_PCRE8 + setstack8(NULL); +#endif +#ifdef SUPPORT_PCRE16 + setstack16(NULL); +#endif +#ifdef SUPPORT_PCRE32 + setstack32(NULL); +#endif + + if (total == successful) { + printf("\nAll JIT regression tests are successfully passed.\n"); + return 0; + } else { + printf("\nSuccessful test ratio: %d%% (%d failed)\n", successful * 100 / total, total - successful); + return 1; + } +} + +/* End of pcre_jit_test.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_maketables.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_maketables.c new file mode 100755 index 000000000..a44a6eaa9 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_maketables.c @@ -0,0 +1,156 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + + +/* This module contains the external function pcre_maketables(), which builds +character tables for PCRE in the current locale. The file is compiled on its +own as part of the PCRE library. However, it is also included in the +compilation of dftables.c, in which case the macro DFTABLES is defined. */ + + +#ifndef DFTABLES +# ifdef HAVE_CONFIG_H +# include "config.h" +# endif +# include "pcre_internal.h" +#endif + + +/************************************************* +* Create PCRE character tables * +*************************************************/ + +/* This function builds a set of character tables for use by PCRE and returns +a pointer to them. They are build using the ctype functions, and consequently +their contents will depend upon the current locale setting. When compiled as +part of the library, the store is obtained via PUBL(malloc)(), but when +compiled inside dftables, use malloc(). + +Arguments: none +Returns: pointer to the contiguous block of data +*/ + +#if defined COMPILE_PCRE8 +const unsigned char * +pcre_maketables(void) +#elif defined COMPILE_PCRE16 +const unsigned char * +pcre16_maketables(void) +#elif defined COMPILE_PCRE32 +const unsigned char * +pcre32_maketables(void) +#endif +{ +unsigned char *yield, *p; +int i; + +#ifndef DFTABLES +yield = (unsigned char*)(PUBL(malloc))(tables_length); +#else +yield = (unsigned char*)malloc(tables_length); +#endif + +if (yield == NULL) return NULL; +p = yield; + +/* First comes the lower casing table */ + +for (i = 0; i < 256; i++) *p++ = tolower(i); + +/* Next the case-flipping table */ + +for (i = 0; i < 256; i++) *p++ = islower(i)? toupper(i) : tolower(i); + +/* Then the character class tables. Don't try to be clever and save effort on +exclusive ones - in some locales things may be different. + +Note that the table for "space" includes everything "isspace" gives, including +VT in the default locale. This makes it work for the POSIX class [:space:]. +From release 8.34 is is also correct for Perl space, because Perl added VT at +release 5.18. + +Note also that it is possible for a character to be alnum or alpha without +being lower or upper, such as "male and female ordinals" (\xAA and \xBA) in the +fr_FR locale (at least under Debian Linux's locales as of 12/2005). So we must +test for alnum specially. */ + +memset(p, 0, cbit_length); +for (i = 0; i < 256; i++) + { + if (isdigit(i)) p[cbit_digit + i/8] |= 1 << (i&7); + if (isupper(i)) p[cbit_upper + i/8] |= 1 << (i&7); + if (islower(i)) p[cbit_lower + i/8] |= 1 << (i&7); + if (isalnum(i)) p[cbit_word + i/8] |= 1 << (i&7); + if (i == '_') p[cbit_word + i/8] |= 1 << (i&7); + if (isspace(i)) p[cbit_space + i/8] |= 1 << (i&7); + if (isxdigit(i))p[cbit_xdigit + i/8] |= 1 << (i&7); + if (isgraph(i)) p[cbit_graph + i/8] |= 1 << (i&7); + if (isprint(i)) p[cbit_print + i/8] |= 1 << (i&7); + if (ispunct(i)) p[cbit_punct + i/8] |= 1 << (i&7); + if (iscntrl(i)) p[cbit_cntrl + i/8] |= 1 << (i&7); + } +p += cbit_length; + +/* Finally, the character type table. In this, we used to exclude VT from the +white space chars, because Perl didn't recognize it as such for \s and for +comments within regexes. However, Perl changed at release 5.18, so PCRE changed +at release 8.34. */ + +for (i = 0; i < 256; i++) + { + int x = 0; + if (isspace(i)) x += ctype_space; + if (isalpha(i)) x += ctype_letter; + if (isdigit(i)) x += ctype_digit; + if (isxdigit(i)) x += ctype_xdigit; + if (isalnum(i) || i == '_') x += ctype_word; + + /* Note: strchr includes the terminating zero in the characters it considers. + In this instance, that is ok because we want binary zero to be flagged as a + meta-character, which in this sense is any character that terminates a run + of data characters. */ + + if (strchr("\\*+?{^.$|()[", i) != 0) x += ctype_meta; + *p++ = x; + } + +return yield; +} + +/* End of pcre_maketables.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_newline.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_newline.c new file mode 100755 index 000000000..b8f5a4de1 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_newline.c @@ -0,0 +1,210 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + + +/* This module contains internal functions for testing newlines when more than +one kind of newline is to be recognized. When a newline is found, its length is +returned. In principle, we could implement several newline "types", each +referring to a different set of newline characters. At present, PCRE supports +only NLTYPE_FIXED, which gets handled without these functions, NLTYPE_ANYCRLF, +and NLTYPE_ANY. The full list of Unicode newline characters is taken from +http://unicode.org/unicode/reports/tr18/. */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "pcre_internal.h" + + + +/************************************************* +* Check for newline at given position * +*************************************************/ + +/* It is guaranteed that the initial value of ptr is less than the end of the +string that is being processed. + +Arguments: + ptr pointer to possible newline + type the newline type + endptr pointer to the end of the string + lenptr where to return the length + utf TRUE if in utf mode + +Returns: TRUE or FALSE +*/ + +BOOL +PRIV(is_newline)(PCRE_PUCHAR ptr, int type, PCRE_PUCHAR endptr, int *lenptr, + BOOL utf) +{ +pcre_uint32 c; +(void)utf; +#ifdef SUPPORT_UTF +if (utf) + { + GETCHAR(c, ptr); + } +else +#endif /* SUPPORT_UTF */ + c = *ptr; + +/* Note that this function is called only for ANY or ANYCRLF. */ + +if (type == NLTYPE_ANYCRLF) switch(c) + { + case CHAR_LF: *lenptr = 1; return TRUE; + case CHAR_CR: *lenptr = (ptr < endptr - 1 && ptr[1] == CHAR_LF)? 2 : 1; + return TRUE; + default: return FALSE; + } + +/* NLTYPE_ANY */ + +else switch(c) + { +#ifdef EBCDIC + case CHAR_NEL: +#endif + case CHAR_LF: + case CHAR_VT: + case CHAR_FF: *lenptr = 1; return TRUE; + + case CHAR_CR: + *lenptr = (ptr < endptr - 1 && ptr[1] == CHAR_LF)? 2 : 1; + return TRUE; + +#ifndef EBCDIC +#ifdef COMPILE_PCRE8 + case CHAR_NEL: *lenptr = utf? 2 : 1; return TRUE; + case 0x2028: /* LS */ + case 0x2029: *lenptr = 3; return TRUE; /* PS */ +#else /* COMPILE_PCRE16 || COMPILE_PCRE32 */ + case CHAR_NEL: + case 0x2028: /* LS */ + case 0x2029: *lenptr = 1; return TRUE; /* PS */ +#endif /* COMPILE_PCRE8 */ +#endif /* Not EBCDIC */ + + default: return FALSE; + } +} + + + +/************************************************* +* Check for newline at previous position * +*************************************************/ + +/* It is guaranteed that the initial value of ptr is greater than the start of +the string that is being processed. + +Arguments: + ptr pointer to possible newline + type the newline type + startptr pointer to the start of the string + lenptr where to return the length + utf TRUE if in utf mode + +Returns: TRUE or FALSE +*/ + +BOOL +PRIV(was_newline)(PCRE_PUCHAR ptr, int type, PCRE_PUCHAR startptr, int *lenptr, + BOOL utf) +{ +pcre_uint32 c; +(void)utf; +ptr--; +#ifdef SUPPORT_UTF +if (utf) + { + BACKCHAR(ptr); + GETCHAR(c, ptr); + } +else +#endif /* SUPPORT_UTF */ + c = *ptr; + +/* Note that this function is called only for ANY or ANYCRLF. */ + +if (type == NLTYPE_ANYCRLF) switch(c) + { + case CHAR_LF: + *lenptr = (ptr > startptr && ptr[-1] == CHAR_CR)? 2 : 1; + return TRUE; + + case CHAR_CR: *lenptr = 1; return TRUE; + default: return FALSE; + } + +/* NLTYPE_ANY */ + +else switch(c) + { + case CHAR_LF: + *lenptr = (ptr > startptr && ptr[-1] == CHAR_CR)? 2 : 1; + return TRUE; + +#ifdef EBCDIC + case CHAR_NEL: +#endif + case CHAR_VT: + case CHAR_FF: + case CHAR_CR: *lenptr = 1; return TRUE; + +#ifndef EBCDIC +#ifdef COMPILE_PCRE8 + case CHAR_NEL: *lenptr = utf? 2 : 1; return TRUE; + case 0x2028: /* LS */ + case 0x2029: *lenptr = 3; return TRUE; /* PS */ +#else /* COMPILE_PCRE16 || COMPILE_PCRE32 */ + case CHAR_NEL: + case 0x2028: /* LS */ + case 0x2029: *lenptr = 1; return TRUE; /* PS */ +#endif /* COMPILE_PCRE8 */ +#endif /* NotEBCDIC */ + + default: return FALSE; + } +} + +/* End of pcre_newline.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_ord2utf8.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_ord2utf8.c new file mode 100755 index 000000000..95f1beb96 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_ord2utf8.c @@ -0,0 +1,94 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + + +/* This file contains a private PCRE function that converts an ordinal +character value into a UTF8 string. */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#define COMPILE_PCRE8 + +#include "pcre_internal.h" + +/************************************************* +* Convert character value to UTF-8 * +*************************************************/ + +/* This function takes an integer value in the range 0 - 0x10ffff +and encodes it as a UTF-8 character in 1 to 4 pcre_uchars. + +Arguments: + cvalue the character value + buffer pointer to buffer for result - at least 6 pcre_uchars long + +Returns: number of characters placed in the buffer +*/ + +unsigned +int +PRIV(ord2utf)(pcre_uint32 cvalue, pcre_uchar *buffer) +{ +#ifdef SUPPORT_UTF + +register int i, j; + +for (i = 0; i < PRIV(utf8_table1_size); i++) + if ((int)cvalue <= PRIV(utf8_table1)[i]) break; +buffer += i; +for (j = i; j > 0; j--) + { + *buffer-- = 0x80 | (cvalue & 0x3f); + cvalue >>= 6; + } +*buffer = PRIV(utf8_table2)[i] | cvalue; +return i + 1; + +#else + +(void)(cvalue); /* Keep compiler happy; this function won't ever be */ +(void)(buffer); /* called when SUPPORT_UTF is not defined. */ +return 0; + +#endif +} + +/* End of pcre_ord2utf8.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_printint.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_printint.c new file mode 100755 index 000000000..60dcb55ef --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_printint.c @@ -0,0 +1,834 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + + +/* This module contains a PCRE private debugging function for printing out the +internal form of a compiled regular expression, along with some supporting +local functions. This source file is used in two places: + +(1) It is #included by pcre_compile.c when it is compiled in debugging mode +(PCRE_DEBUG defined in pcre_internal.h). It is not included in production +compiles. In this case PCRE_INCLUDED is defined. + +(2) It is also compiled separately and linked with pcretest.c, which can be +asked to print out a compiled regex for debugging purposes. */ + +#ifndef PCRE_INCLUDED + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +/* For pcretest program. */ +#define PRIV(name) name + +/* We have to include pcre_internal.h because we need the internal info for +displaying the results of pcre_study() and we also need to know about the +internal macros, structures, and other internal data values; pcretest has +"inside information" compared to a program that strictly follows the PCRE API. + +Although pcre_internal.h does itself include pcre.h, we explicitly include it +here before pcre_internal.h so that the PCRE_EXP_xxx macros get set +appropriately for an application, not for building PCRE. */ + +#include "pcre.h" +#include "pcre_internal.h" + +/* These are the funtions that are contained within. It doesn't seem worth +having a separate .h file just for this. */ + +#endif /* PCRE_INCLUDED */ + +#ifdef PCRE_INCLUDED +static /* Keep the following function as private. */ +#endif + +#if defined COMPILE_PCRE8 +void pcre_printint(pcre *external_re, FILE *f, BOOL print_lengths); +#elif defined COMPILE_PCRE16 +void pcre16_printint(pcre *external_re, FILE *f, BOOL print_lengths); +#elif defined COMPILE_PCRE32 +void pcre32_printint(pcre *external_re, FILE *f, BOOL print_lengths); +#endif + +/* Macro that decides whether a character should be output as a literal or in +hexadecimal. We don't use isprint() because that can vary from system to system +(even without the use of locales) and we want the output always to be the same, +for testing purposes. */ + +#ifdef EBCDIC +#define PRINTABLE(c) ((c) >= 64 && (c) < 255) +#else +#define PRINTABLE(c) ((c) >= 32 && (c) < 127) +#endif + +/* The table of operator names. */ + +static const char *priv_OP_names[] = { OP_NAME_LIST }; + +/* This table of operator lengths is not actually used by the working code, +but its size is needed for a check that ensures it is the correct size for the +number of opcodes (thus catching update omissions). */ + +static const pcre_uint8 priv_OP_lengths[] = { OP_LENGTHS }; + + + +/************************************************* +* Print single- or multi-byte character * +*************************************************/ + +static unsigned int +print_char(FILE *f, pcre_uchar *ptr, BOOL utf) +{ +pcre_uint32 c = *ptr; + +#ifndef SUPPORT_UTF + +(void)utf; /* Avoid compiler warning */ +if (PRINTABLE(c)) fprintf(f, "%c", (char)c); +else if (c <= 0x80) fprintf(f, "\\x%02x", c); +else fprintf(f, "\\x{%x}", c); +return 0; + +#else + +#if defined COMPILE_PCRE8 + +if (!utf || (c & 0xc0) != 0xc0) + { + if (PRINTABLE(c)) fprintf(f, "%c", (char)c); + else if (c < 0x80) fprintf(f, "\\x%02x", c); + else fprintf(f, "\\x{%02x}", c); + return 0; + } +else + { + int i; + int a = PRIV(utf8_table4)[c & 0x3f]; /* Number of additional bytes */ + int s = 6*a; + c = (c & PRIV(utf8_table3)[a]) << s; + for (i = 1; i <= a; i++) + { + /* This is a check for malformed UTF-8; it should only occur if the sanity + check has been turned off. Rather than swallow random bytes, just stop if + we hit a bad one. Print it with \X instead of \x as an indication. */ + + if ((ptr[i] & 0xc0) != 0x80) + { + fprintf(f, "\\X{%x}", c); + return i - 1; + } + + /* The byte is OK */ + + s -= 6; + c |= (ptr[i] & 0x3f) << s; + } + fprintf(f, "\\x{%x}", c); + return a; + } + +#elif defined COMPILE_PCRE16 + +if (!utf || (c & 0xfc00) != 0xd800) + { + if (PRINTABLE(c)) fprintf(f, "%c", (char)c); + else if (c <= 0x80) fprintf(f, "\\x%02x", c); + else fprintf(f, "\\x{%02x}", c); + return 0; + } +else + { + /* This is a check for malformed UTF-16; it should only occur if the sanity + check has been turned off. Rather than swallow a low surrogate, just stop if + we hit a bad one. Print it with \X instead of \x as an indication. */ + + if ((ptr[1] & 0xfc00) != 0xdc00) + { + fprintf(f, "\\X{%x}", c); + return 0; + } + + c = (((c & 0x3ff) << 10) | (ptr[1] & 0x3ff)) + 0x10000; + fprintf(f, "\\x{%x}", c); + return 1; + } + +#elif defined COMPILE_PCRE32 + +if (!utf || (c & 0xfffff800u) != 0xd800u) + { + if (PRINTABLE(c)) fprintf(f, "%c", (char)c); + else if (c <= 0x80) fprintf(f, "\\x%02x", c); + else fprintf(f, "\\x{%x}", c); + return 0; + } +else + { + /* This is a check for malformed UTF-32; it should only occur if the sanity + check has been turned off. Rather than swallow a surrogate, just stop if + we hit one. Print it with \X instead of \x as an indication. */ + fprintf(f, "\\X{%x}", c); + return 0; + } + +#endif /* COMPILE_PCRE[8|16|32] */ + +#endif /* SUPPORT_UTF */ +} + +/************************************************* +* Print uchar string (regardless of utf) * +*************************************************/ + +static void +print_puchar(FILE *f, PCRE_PUCHAR ptr) +{ +while (*ptr != '\0') + { + register pcre_uint32 c = *ptr++; + if (PRINTABLE(c)) fprintf(f, "%c", c); else fprintf(f, "\\x{%x}", c); + } +} + +/************************************************* +* Find Unicode property name * +*************************************************/ + +static const char * +get_ucpname(unsigned int ptype, unsigned int pvalue) +{ +#ifdef SUPPORT_UCP +int i; +for (i = PRIV(utt_size) - 1; i >= 0; i--) + { + if (ptype == PRIV(utt)[i].type && pvalue == PRIV(utt)[i].value) break; + } +return (i >= 0)? PRIV(utt_names) + PRIV(utt)[i].name_offset : "??"; +#else +/* It gets harder and harder to shut off unwanted compiler warnings. */ +ptype = ptype * pvalue; +return (ptype == pvalue)? "??" : "??"; +#endif +} + + +/************************************************* +* Print Unicode property value * +*************************************************/ + +/* "Normal" properties can be printed from tables. The PT_CLIST property is a +pseudo-property that contains a pointer to a list of case-equivalent +characters. This is used only when UCP support is available and UTF mode is +selected. It should never occur otherwise, but just in case it does, have +something ready to print. */ + +static void +print_prop(FILE *f, pcre_uchar *code, const char *before, const char *after) +{ +if (code[1] != PT_CLIST) + { + fprintf(f, "%s%s %s%s", before, priv_OP_names[*code], get_ucpname(code[1], + code[2]), after); + } +else + { + const char *not = (*code == OP_PROP)? "" : "not "; +#ifndef SUPPORT_UCP + fprintf(f, "%s%sclist %d%s", before, not, code[2], after); +#else + const pcre_uint32 *p = PRIV(ucd_caseless_sets) + code[2]; + fprintf (f, "%s%sclist", before, not); + while (*p < NOTACHAR) fprintf(f, " %04x", *p++); + fprintf(f, "%s", after); +#endif + } +} + + + + +/************************************************* +* Print compiled regex * +*************************************************/ + +/* Make this function work for a regex with integers either byte order. +However, we assume that what we are passed is a compiled regex. The +print_lengths flag controls whether offsets and lengths of items are printed. +They can be turned off from pcretest so that automatic tests on bytecode can be +written that do not depend on the value of LINK_SIZE. */ + +#ifdef PCRE_INCLUDED +static /* Keep the following function as private. */ +#endif +#if defined COMPILE_PCRE8 +void +pcre_printint(pcre *external_re, FILE *f, BOOL print_lengths) +#elif defined COMPILE_PCRE16 +void +pcre16_printint(pcre *external_re, FILE *f, BOOL print_lengths) +#elif defined COMPILE_PCRE32 +void +pcre32_printint(pcre *external_re, FILE *f, BOOL print_lengths) +#endif +{ +REAL_PCRE *re = (REAL_PCRE *)external_re; +pcre_uchar *codestart, *code; +BOOL utf; + +unsigned int options = re->options; +int offset = re->name_table_offset; +int count = re->name_count; +int size = re->name_entry_size; + +if (re->magic_number != MAGIC_NUMBER) + { + offset = ((offset << 8) & 0xff00) | ((offset >> 8) & 0xff); + count = ((count << 8) & 0xff00) | ((count >> 8) & 0xff); + size = ((size << 8) & 0xff00) | ((size >> 8) & 0xff); + options = ((options << 24) & 0xff000000) | + ((options << 8) & 0x00ff0000) | + ((options >> 8) & 0x0000ff00) | + ((options >> 24) & 0x000000ff); + } + +code = codestart = (pcre_uchar *)re + offset + count * size; +/* PCRE_UTF(16|32) have the same value as PCRE_UTF8. */ +utf = (options & PCRE_UTF8) != 0; + +for(;;) + { + pcre_uchar *ccode; + const char *flag = " "; + pcre_uint32 c; + unsigned int extra = 0; + + if (print_lengths) + fprintf(f, "%3d ", (int)(code - codestart)); + else + fprintf(f, " "); + + switch(*code) + { +/* ========================================================================== */ + /* These cases are never obeyed. This is a fudge that causes a compile- + time error if the vectors OP_names or OP_lengths, which are indexed + by opcode, are not the correct length. It seems to be the only way to do + such a check at compile time, as the sizeof() operator does not work in + the C preprocessor. */ + + case OP_TABLE_LENGTH: + case OP_TABLE_LENGTH + + ((sizeof(priv_OP_names)/sizeof(const char *) == OP_TABLE_LENGTH) && + (sizeof(priv_OP_lengths) == OP_TABLE_LENGTH)): + break; +/* ========================================================================== */ + + case OP_END: + fprintf(f, " %s\n", priv_OP_names[*code]); + fprintf(f, "------------------------------------------------------------------\n"); + return; + + case OP_CHAR: + fprintf(f, " "); + do + { + code++; + code += 1 + print_char(f, code, utf); + } + while (*code == OP_CHAR); + fprintf(f, "\n"); + continue; + + case OP_CHARI: + fprintf(f, " /i "); + do + { + code++; + code += 1 + print_char(f, code, utf); + } + while (*code == OP_CHARI); + fprintf(f, "\n"); + continue; + + case OP_CBRA: + case OP_CBRAPOS: + case OP_SCBRA: + case OP_SCBRAPOS: + if (print_lengths) fprintf(f, "%3d ", GET(code, 1)); + else fprintf(f, " "); + fprintf(f, "%s %d", priv_OP_names[*code], GET2(code, 1+LINK_SIZE)); + break; + + case OP_BRA: + case OP_BRAPOS: + case OP_SBRA: + case OP_SBRAPOS: + case OP_KETRMAX: + case OP_KETRMIN: + case OP_KETRPOS: + case OP_ALT: + case OP_KET: + case OP_ASSERT: + case OP_ASSERT_NOT: + case OP_ASSERTBACK: + case OP_ASSERTBACK_NOT: + case OP_ONCE: + case OP_ONCE_NC: + case OP_COND: + case OP_SCOND: + case OP_REVERSE: + if (print_lengths) fprintf(f, "%3d ", GET(code, 1)); + else fprintf(f, " "); + fprintf(f, "%s", priv_OP_names[*code]); + break; + + case OP_CLOSE: + fprintf(f, " %s %d", priv_OP_names[*code], GET2(code, 1)); + break; + + case OP_CREF: + fprintf(f, "%3d %s", GET2(code,1), priv_OP_names[*code]); + break; + + case OP_DNCREF: + { + pcre_uchar *entry = (pcre_uchar *)re + offset + (GET2(code, 1) * size) + + IMM2_SIZE; + fprintf(f, " %s Cond ref <", flag); + print_puchar(f, entry); + fprintf(f, ">%d", GET2(code, 1 + IMM2_SIZE)); + } + break; + + case OP_RREF: + c = GET2(code, 1); + if (c == RREF_ANY) + fprintf(f, " Cond recurse any"); + else + fprintf(f, " Cond recurse %d", c); + break; + + case OP_DNRREF: + { + pcre_uchar *entry = (pcre_uchar *)re + offset + (GET2(code, 1) * size) + + IMM2_SIZE; + fprintf(f, " %s Cond recurse <", flag); + print_puchar(f, entry); + fprintf(f, ">%d", GET2(code, 1 + IMM2_SIZE)); + } + break; + + case OP_DEF: + fprintf(f, " Cond def"); + break; + + case OP_STARI: + case OP_MINSTARI: + case OP_POSSTARI: + case OP_PLUSI: + case OP_MINPLUSI: + case OP_POSPLUSI: + case OP_QUERYI: + case OP_MINQUERYI: + case OP_POSQUERYI: + flag = "/i"; + /* Fall through */ + case OP_STAR: + case OP_MINSTAR: + case OP_POSSTAR: + case OP_PLUS: + case OP_MINPLUS: + case OP_POSPLUS: + case OP_QUERY: + case OP_MINQUERY: + case OP_POSQUERY: + case OP_TYPESTAR: + case OP_TYPEMINSTAR: + case OP_TYPEPOSSTAR: + case OP_TYPEPLUS: + case OP_TYPEMINPLUS: + case OP_TYPEPOSPLUS: + case OP_TYPEQUERY: + case OP_TYPEMINQUERY: + case OP_TYPEPOSQUERY: + fprintf(f, " %s ", flag); + if (*code >= OP_TYPESTAR) + { + if (code[1] == OP_PROP || code[1] == OP_NOTPROP) + { + print_prop(f, code + 1, "", " "); + extra = 2; + } + else fprintf(f, "%s", priv_OP_names[code[1]]); + } + else extra = print_char(f, code+1, utf); + fprintf(f, "%s", priv_OP_names[*code]); + break; + + case OP_EXACTI: + case OP_UPTOI: + case OP_MINUPTOI: + case OP_POSUPTOI: + flag = "/i"; + /* Fall through */ + case OP_EXACT: + case OP_UPTO: + case OP_MINUPTO: + case OP_POSUPTO: + fprintf(f, " %s ", flag); + extra = print_char(f, code + 1 + IMM2_SIZE, utf); + fprintf(f, "{"); + if (*code != OP_EXACT && *code != OP_EXACTI) fprintf(f, "0,"); + fprintf(f, "%d}", GET2(code,1)); + if (*code == OP_MINUPTO || *code == OP_MINUPTOI) fprintf(f, "?"); + else if (*code == OP_POSUPTO || *code == OP_POSUPTOI) fprintf(f, "+"); + break; + + case OP_TYPEEXACT: + case OP_TYPEUPTO: + case OP_TYPEMINUPTO: + case OP_TYPEPOSUPTO: + if (code[1 + IMM2_SIZE] == OP_PROP || code[1 + IMM2_SIZE] == OP_NOTPROP) + { + print_prop(f, code + IMM2_SIZE + 1, " ", " "); + extra = 2; + } + else fprintf(f, " %s", priv_OP_names[code[1 + IMM2_SIZE]]); + fprintf(f, "{"); + if (*code != OP_TYPEEXACT) fprintf(f, "0,"); + fprintf(f, "%d}", GET2(code,1)); + if (*code == OP_TYPEMINUPTO) fprintf(f, "?"); + else if (*code == OP_TYPEPOSUPTO) fprintf(f, "+"); + break; + + case OP_NOTI: + flag = "/i"; + /* Fall through */ + case OP_NOT: + fprintf(f, " %s [^", flag); + extra = print_char(f, code + 1, utf); + fprintf(f, "]"); + break; + + case OP_NOTSTARI: + case OP_NOTMINSTARI: + case OP_NOTPOSSTARI: + case OP_NOTPLUSI: + case OP_NOTMINPLUSI: + case OP_NOTPOSPLUSI: + case OP_NOTQUERYI: + case OP_NOTMINQUERYI: + case OP_NOTPOSQUERYI: + flag = "/i"; + /* Fall through */ + + case OP_NOTSTAR: + case OP_NOTMINSTAR: + case OP_NOTPOSSTAR: + case OP_NOTPLUS: + case OP_NOTMINPLUS: + case OP_NOTPOSPLUS: + case OP_NOTQUERY: + case OP_NOTMINQUERY: + case OP_NOTPOSQUERY: + fprintf(f, " %s [^", flag); + extra = print_char(f, code + 1, utf); + fprintf(f, "]%s", priv_OP_names[*code]); + break; + + case OP_NOTEXACTI: + case OP_NOTUPTOI: + case OP_NOTMINUPTOI: + case OP_NOTPOSUPTOI: + flag = "/i"; + /* Fall through */ + + case OP_NOTEXACT: + case OP_NOTUPTO: + case OP_NOTMINUPTO: + case OP_NOTPOSUPTO: + fprintf(f, " %s [^", flag); + extra = print_char(f, code + 1 + IMM2_SIZE, utf); + fprintf(f, "]{"); + if (*code != OP_NOTEXACT && *code != OP_NOTEXACTI) fprintf(f, "0,"); + fprintf(f, "%d}", GET2(code,1)); + if (*code == OP_NOTMINUPTO || *code == OP_NOTMINUPTOI) fprintf(f, "?"); + else + if (*code == OP_NOTPOSUPTO || *code == OP_NOTPOSUPTOI) fprintf(f, "+"); + break; + + case OP_RECURSE: + if (print_lengths) fprintf(f, "%3d ", GET(code, 1)); + else fprintf(f, " "); + fprintf(f, "%s", priv_OP_names[*code]); + break; + + case OP_REFI: + flag = "/i"; + /* Fall through */ + case OP_REF: + fprintf(f, " %s \\%d", flag, GET2(code,1)); + ccode = code + priv_OP_lengths[*code]; + goto CLASS_REF_REPEAT; + + case OP_DNREFI: + flag = "/i"; + /* Fall through */ + case OP_DNREF: + { + pcre_uchar *entry = (pcre_uchar *)re + offset + (GET2(code, 1) * size) + + IMM2_SIZE; + fprintf(f, " %s \\k<", flag); + print_puchar(f, entry); + fprintf(f, ">%d", GET2(code, 1 + IMM2_SIZE)); + } + ccode = code + priv_OP_lengths[*code]; + goto CLASS_REF_REPEAT; + + case OP_CALLOUT: + fprintf(f, " %s %d %d %d", priv_OP_names[*code], code[1], GET(code,2), + GET(code, 2 + LINK_SIZE)); + break; + + case OP_PROP: + case OP_NOTPROP: + print_prop(f, code, " ", ""); + break; + + /* OP_XCLASS cannot occur in 8-bit, non-UTF mode. However, there's no harm + in having this code always here, and it makes it less messy without all + those #ifdefs. */ + + case OP_CLASS: + case OP_NCLASS: + case OP_XCLASS: + { + int i; + unsigned int min, max; + BOOL printmap; + BOOL invertmap = FALSE; + pcre_uint8 *map; + pcre_uint8 inverted_map[32]; + + fprintf(f, " ["); + + if (*code == OP_XCLASS) + { + extra = GET(code, 1); + ccode = code + LINK_SIZE + 1; + printmap = (*ccode & XCL_MAP) != 0; + if ((*ccode & XCL_NOT) != 0) + { + invertmap = (*ccode & XCL_HASPROP) == 0; + fprintf(f, "^"); + } + ccode++; + } + else + { + printmap = TRUE; + ccode = code + 1; + } + + /* Print a bit map */ + + if (printmap) + { + map = (pcre_uint8 *)ccode; + if (invertmap) + { + for (i = 0; i < 32; i++) inverted_map[i] = ~map[i]; + map = inverted_map; + } + + for (i = 0; i < 256; i++) + { + if ((map[i/8] & (1 << (i&7))) != 0) + { + int j; + for (j = i+1; j < 256; j++) + if ((map[j/8] & (1 << (j&7))) == 0) break; + if (i == '-' || i == ']') fprintf(f, "\\"); + if (PRINTABLE(i)) fprintf(f, "%c", i); + else fprintf(f, "\\x%02x", i); + if (--j > i) + { + if (j != i + 1) fprintf(f, "-"); + if (j == '-' || j == ']') fprintf(f, "\\"); + if (PRINTABLE(j)) fprintf(f, "%c", j); + else fprintf(f, "\\x%02x", j); + } + i = j; + } + } + ccode += 32 / sizeof(pcre_uchar); + } + + /* For an XCLASS there is always some additional data */ + + if (*code == OP_XCLASS) + { + pcre_uchar ch; + while ((ch = *ccode++) != XCL_END) + { + BOOL not = FALSE; + const char *notch = ""; + + switch(ch) + { + case XCL_NOTPROP: + not = TRUE; + notch = "^"; + /* Fall through */ + + case XCL_PROP: + { + unsigned int ptype = *ccode++; + unsigned int pvalue = *ccode++; + + switch(ptype) + { + case PT_PXGRAPH: + fprintf(f, "[:%sgraph:]", notch); + break; + + case PT_PXPRINT: + fprintf(f, "[:%sprint:]", notch); + break; + + case PT_PXPUNCT: + fprintf(f, "[:%spunct:]", notch); + break; + + default: + fprintf(f, "\\%c{%s}", (not? 'P':'p'), + get_ucpname(ptype, pvalue)); + break; + } + } + break; + + default: + ccode += 1 + print_char(f, ccode, utf); + if (ch == XCL_RANGE) + { + fprintf(f, "-"); + ccode += 1 + print_char(f, ccode, utf); + } + break; + } + } + } + + /* Indicate a non-UTF class which was created by negation */ + + fprintf(f, "]%s", (*code == OP_NCLASS)? " (neg)" : ""); + + /* Handle repeats after a class or a back reference */ + + CLASS_REF_REPEAT: + switch(*ccode) + { + case OP_CRSTAR: + case OP_CRMINSTAR: + case OP_CRPLUS: + case OP_CRMINPLUS: + case OP_CRQUERY: + case OP_CRMINQUERY: + case OP_CRPOSSTAR: + case OP_CRPOSPLUS: + case OP_CRPOSQUERY: + fprintf(f, "%s", priv_OP_names[*ccode]); + extra += priv_OP_lengths[*ccode]; + break; + + case OP_CRRANGE: + case OP_CRMINRANGE: + case OP_CRPOSRANGE: + min = GET2(ccode,1); + max = GET2(ccode,1 + IMM2_SIZE); + if (max == 0) fprintf(f, "{%u,}", min); + else fprintf(f, "{%u,%u}", min, max); + if (*ccode == OP_CRMINRANGE) fprintf(f, "?"); + else if (*ccode == OP_CRPOSRANGE) fprintf(f, "+"); + extra += priv_OP_lengths[*ccode]; + break; + + /* Do nothing if it's not a repeat; this code stops picky compilers + warning about the lack of a default code path. */ + + default: + break; + } + } + break; + + case OP_MARK: + case OP_PRUNE_ARG: + case OP_SKIP_ARG: + case OP_THEN_ARG: + fprintf(f, " %s ", priv_OP_names[*code]); + print_puchar(f, code + 2); + extra += code[1]; + break; + + case OP_THEN: + fprintf(f, " %s", priv_OP_names[*code]); + break; + + case OP_CIRCM: + case OP_DOLLM: + flag = "/m"; + /* Fall through */ + + /* Anything else is just an item with no data, but possibly a flag. */ + + default: + fprintf(f, " %s %s", flag, priv_OP_names[*code]); + break; + } + + code += priv_OP_lengths[*code] + extra; + fprintf(f, "\n"); + } +} + +/* End of pcre_printint.src */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_refcount.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_refcount.c new file mode 100755 index 000000000..79efa90f2 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_refcount.c @@ -0,0 +1,92 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + + +/* This module contains the external function pcre_refcount(), which is an +auxiliary function that can be used to maintain a reference count in a compiled +pattern data block. This might be helpful in applications where the block is +shared by different users. */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "pcre_internal.h" + + +/************************************************* +* Maintain reference count * +*************************************************/ + +/* The reference count is a 16-bit field, initialized to zero. It is not +possible to transfer a non-zero count from one host to a different host that +has a different byte order - though I can't see why anyone in their right mind +would ever want to do that! + +Arguments: + argument_re points to compiled code + adjust value to add to the count + +Returns: the (possibly updated) count value (a non-negative number), or + a negative error number +*/ + +#if defined COMPILE_PCRE8 +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre_refcount(pcre *argument_re, int adjust) +#elif defined COMPILE_PCRE16 +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre16_refcount(pcre16 *argument_re, int adjust) +#elif defined COMPILE_PCRE32 +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre32_refcount(pcre32 *argument_re, int adjust) +#endif +{ +REAL_PCRE *re = (REAL_PCRE *)argument_re; +if (re == NULL) return PCRE_ERROR_NULL; +if (re->magic_number != MAGIC_NUMBER) return PCRE_ERROR_BADMAGIC; +if ((re->flags & PCRE_MODE) == 0) return PCRE_ERROR_BADMODE; +re->ref_count = (-adjust > re->ref_count)? 0 : + (adjust + re->ref_count > 65535)? 65535 : + re->ref_count + adjust; +return re->ref_count; +} + +/* End of pcre_refcount.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_scanner.cc b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_scanner.cc new file mode 100755 index 000000000..6be2be682 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_scanner.cc @@ -0,0 +1,199 @@ +// Copyright (c) 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: Sanjay Ghemawat + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#include "pcrecpp_internal.h" +#include "pcre_scanner.h" + +using std::vector; + +namespace pcrecpp { + +Scanner::Scanner() + : data_(), + input_(data_), + skip_(NULL), + should_skip_(false), + skip_repeat_(false), + save_comments_(false), + comments_(NULL), + comments_offset_(0) { +} + +Scanner::Scanner(const string& in) + : data_(in), + input_(data_), + skip_(NULL), + should_skip_(false), + skip_repeat_(false), + save_comments_(false), + comments_(NULL), + comments_offset_(0) { +} + +Scanner::~Scanner() { + delete skip_; + delete comments_; +} + +void Scanner::SetSkipExpression(const char* re) { + delete skip_; + if (re != NULL) { + skip_ = new RE(re); + should_skip_ = true; + skip_repeat_ = true; + ConsumeSkip(); + } else { + skip_ = NULL; + should_skip_ = false; + skip_repeat_ = false; + } +} + +void Scanner::Skip(const char* re) { + delete skip_; + if (re != NULL) { + skip_ = new RE(re); + should_skip_ = true; + skip_repeat_ = false; + ConsumeSkip(); + } else { + skip_ = NULL; + should_skip_ = false; + skip_repeat_ = false; + } +} + +void Scanner::DisableSkip() { + assert(skip_ != NULL); + should_skip_ = false; +} + +void Scanner::EnableSkip() { + assert(skip_ != NULL); + should_skip_ = true; + ConsumeSkip(); +} + +int Scanner::LineNumber() const { + // TODO: Make it more efficient by keeping track of the last point + // where we computed line numbers and counting newlines since then. + // We could use std:count, but not all systems have it. :-( + int count = 1; + for (const char* p = data_.data(); p < input_.data(); ++p) + if (*p == '\n') + ++count; + return count; +} + +int Scanner::Offset() const { + return (int)(input_.data() - data_.c_str()); +} + +bool Scanner::LookingAt(const RE& re) const { + int consumed; + return re.DoMatch(input_, RE::ANCHOR_START, &consumed, 0, 0); +} + + +bool Scanner::Consume(const RE& re, + const Arg& arg0, + const Arg& arg1, + const Arg& arg2) { + const bool result = re.Consume(&input_, arg0, arg1, arg2); + if (result && should_skip_) ConsumeSkip(); + return result; +} + +// helper function to consume *skip_ and honour save_comments_ +void Scanner::ConsumeSkip() { + const char* start_data = input_.data(); + while (skip_->Consume(&input_)) { + if (!skip_repeat_) { + // Only one skip allowed. + break; + } + } + if (save_comments_) { + if (comments_ == NULL) { + comments_ = new vector; + } + // already pointing one past end, so no need to +1 + int length = (int)(input_.data() - start_data); + if (length > 0) { + comments_->push_back(StringPiece(start_data, length)); + } + } +} + + +void Scanner::GetComments(int start, int end, vector *ranges) { + // short circuit out if we've not yet initialized comments_ + // (e.g., when save_comments is false) + if (!comments_) { + return; + } + // TODO: if we guarantee that comments_ will contain StringPieces + // that are ordered by their start, then we can do a binary search + // for the first StringPiece at or past start and then scan for the + // ones contained in the range, quit early (use equal_range or + // lower_bound) + for (vector::const_iterator it = comments_->begin(); + it != comments_->end(); ++it) { + if ((it->data() >= data_.c_str() + start && + it->data() + it->size() <= data_.c_str() + end)) { + ranges->push_back(*it); + } + } +} + + +void Scanner::GetNextComments(vector *ranges) { + // short circuit out if we've not yet initialized comments_ + // (e.g., when save_comments is false) + if (!comments_) { + return; + } + for (vector::const_iterator it = + comments_->begin() + comments_offset_; + it != comments_->end(); ++it) { + ranges->push_back(*it); + ++comments_offset_; + } +} + +} // namespace pcrecpp diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_scanner.h b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_scanner.h new file mode 100755 index 000000000..5617e4515 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_scanner.h @@ -0,0 +1,172 @@ +// Copyright (c) 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: Sanjay Ghemawat +// +// Regular-expression based scanner for parsing an input stream. +// +// Example 1: parse a sequence of "var = number" entries from input: +// +// Scanner scanner(input); +// string var; +// int number; +// scanner.SetSkipExpression("\\s+"); // Skip any white space we encounter +// while (scanner.Consume("(\\w+) = (\\d+)", &var, &number)) { +// ...; +// } + +#ifndef _PCRE_SCANNER_H +#define _PCRE_SCANNER_H + +#include +#include +#include + +#include +#include + +namespace pcrecpp { + +class PCRECPP_EXP_DEFN Scanner { + public: + Scanner(); + explicit Scanner(const std::string& input); + ~Scanner(); + + // Return current line number. The returned line-number is + // one-based. I.e. it returns 1 + the number of consumed newlines. + // + // Note: this method may be slow. It may take time proportional to + // the size of the input. + int LineNumber() const; + + // Return the byte-offset that the scanner is looking in the + // input data; + int Offset() const; + + // Return true iff the start of the remaining input matches "re" + bool LookingAt(const RE& re) const; + + // Return true iff all of the following are true + // a. the start of the remaining input matches "re", + // b. if any arguments are supplied, matched sub-patterns can be + // parsed and stored into the arguments. + // If it returns true, it skips over the matched input and any + // following input that matches the "skip" regular expression. + bool Consume(const RE& re, + const Arg& arg0 = RE::no_arg, + const Arg& arg1 = RE::no_arg, + const Arg& arg2 = RE::no_arg + // TODO: Allow more arguments? + ); + + // Set the "skip" regular expression. If after consuming some data, + // a prefix of the input matches this RE, it is automatically + // skipped. For example, a programming language scanner would use + // a skip RE that matches white space and comments. + // + // scanner.SetSkipExpression("\\s+|//.*|/[*](.|\n)*?[*]/"); + // + // Skipping repeats as long as it succeeds. We used to let people do + // this by writing "(...)*" in the regular expression, but that added + // up to lots of recursive calls within the pcre library, so now we + // control repetition explicitly via the function call API. + // + // You can pass NULL for "re" if you do not want any data to be skipped. + void Skip(const char* re); // DEPRECATED; does *not* repeat + void SetSkipExpression(const char* re); + + // Temporarily pause "skip"ing. This + // Skip("Foo"); code ; DisableSkip(); code; EnableSkip() + // is similar to + // Skip("Foo"); code ; Skip(NULL); code ; Skip("Foo"); + // but avoids creating/deleting new RE objects. + void DisableSkip(); + + // Reenable previously paused skipping. Any prefix of the input + // that matches the skip pattern is immediately dropped. + void EnableSkip(); + + /***** Special wrappers around SetSkip() for some common idioms *****/ + + // Arranges to skip whitespace, C comments, C++ comments. + // The overall RE is a disjunction of the following REs: + // \\s whitespace + // //.*\n C++ comment + // /[*](.|\n)*?[*]/ C comment (x*? means minimal repetitions of x) + // We get repetition via the semantics of SetSkipExpression, not by using * + void SkipCXXComments() { + SetSkipExpression("\\s|//.*\n|/[*](?:\n|.)*?[*]/"); + } + + void set_save_comments(bool comments) { + save_comments_ = comments; + } + + bool save_comments() { + return save_comments_; + } + + // Append to vector ranges the comments found in the + // byte range [start,end] (inclusive) of the input data. + // Only comments that were extracted entirely within that + // range are returned: no range splitting of atomically-extracted + // comments is performed. + void GetComments(int start, int end, std::vector *ranges); + + // Append to vector ranges the comments added + // since the last time this was called. This + // functionality is provided for efficiency when + // interleaving scanning with parsing. + void GetNextComments(std::vector *ranges); + + private: + std::string data_; // All the input data + StringPiece input_; // Unprocessed input + RE* skip_; // If non-NULL, RE for skipping input + bool should_skip_; // If true, use skip_ + bool skip_repeat_; // If true, repeat skip_ as long as it works + bool save_comments_; // If true, aggregate the skip expression + + // the skipped comments + // TODO: later consider requiring that the StringPieces be added + // in order by their start position + std::vector *comments_; + + // the offset into comments_ that has been returned by GetNextComments + int comments_offset_; + + // helper function to consume *skip_ and honour + // save_comments_ + void ConsumeSkip(); +}; + +} // namespace pcrecpp + +#endif /* _PCRE_SCANNER_H */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_scanner_unittest.cc b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_scanner_unittest.cc new file mode 100755 index 000000000..623e2afda --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_scanner_unittest.cc @@ -0,0 +1,162 @@ +// Copyright (c) 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: Greg J. Badros +// +// Unittest for scanner, especially GetNextComments and GetComments() +// functionality. + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include /* for strchr */ +#include +#include + +#include "pcrecpp.h" +#include "pcre_stringpiece.h" +#include "pcre_scanner.h" + +#define FLAGS_unittest_stack_size 49152 + +// Dies with a fatal error if the two values are not equal. +#define CHECK_EQ(a, b) do { \ + if ( (a) != (b) ) { \ + fprintf(stderr, "%s:%d: Check failed because %s != %s\n", \ + __FILE__, __LINE__, #a, #b); \ + exit(1); \ + } \ +} while (0) + +using std::vector; +using std::string; +using pcrecpp::StringPiece; +using pcrecpp::Scanner; + +static void TestScanner() { + const char input[] = "\n" + "alpha = 1; // this sets alpha\n" + "bravo = 2; // bravo is set here\n" + "gamma = 33; /* and here is gamma */\n"; + + const char *re = "(\\w+) = (\\d+);"; + + Scanner s(input); + string var; + int number; + s.SkipCXXComments(); + s.set_save_comments(true); + vector comments; + + s.Consume(re, &var, &number); + CHECK_EQ(var, "alpha"); + CHECK_EQ(number, 1); + CHECK_EQ(s.LineNumber(), 3); + s.GetNextComments(&comments); + CHECK_EQ(comments.size(), 1); + CHECK_EQ(comments[0].as_string(), " // this sets alpha\n"); + comments.resize(0); + + s.Consume(re, &var, &number); + CHECK_EQ(var, "bravo"); + CHECK_EQ(number, 2); + s.GetNextComments(&comments); + CHECK_EQ(comments.size(), 1); + CHECK_EQ(comments[0].as_string(), " // bravo is set here\n"); + comments.resize(0); + + s.Consume(re, &var, &number); + CHECK_EQ(var, "gamma"); + CHECK_EQ(number, 33); + s.GetNextComments(&comments); + CHECK_EQ(comments.size(), 1); + CHECK_EQ(comments[0].as_string(), " /* and here is gamma */\n"); + comments.resize(0); + + s.GetComments(0, sizeof(input), &comments); + CHECK_EQ(comments.size(), 3); + CHECK_EQ(comments[0].as_string(), " // this sets alpha\n"); + CHECK_EQ(comments[1].as_string(), " // bravo is set here\n"); + CHECK_EQ(comments[2].as_string(), " /* and here is gamma */\n"); + comments.resize(0); + + s.GetComments(0, (int)(strchr(input, '/') - input), &comments); + CHECK_EQ(comments.size(), 0); + comments.resize(0); + + s.GetComments((int)(strchr(input, '/') - input - 1), sizeof(input), + &comments); + CHECK_EQ(comments.size(), 3); + CHECK_EQ(comments[0].as_string(), " // this sets alpha\n"); + CHECK_EQ(comments[1].as_string(), " // bravo is set here\n"); + CHECK_EQ(comments[2].as_string(), " /* and here is gamma */\n"); + comments.resize(0); + + s.GetComments((int)(strchr(input, '/') - input - 1), + (int)(strchr(input + 1, '\n') - input + 1), &comments); + CHECK_EQ(comments.size(), 1); + CHECK_EQ(comments[0].as_string(), " // this sets alpha\n"); + comments.resize(0); +} + +static void TestBigComment() { + string input; + for (int i = 0; i < 1024; ++i) { + char buf[1024]; // definitely big enough + sprintf(buf, " # Comment %d\n", i); + input += buf; + } + input += "name = value;\n"; + + Scanner s(input.c_str()); + s.SetSkipExpression("\\s+|#.*\n"); + + string name; + string value; + s.Consume("(\\w+) = (\\w+);", &name, &value); + CHECK_EQ(name, "name"); + CHECK_EQ(value, "value"); +} + +// TODO: also test scanner and big-comment in a thread with a +// small stack size + +int main(int argc, char** argv) { + (void)argc; + (void)argv; + TestScanner(); + TestBigComment(); + + // Done + printf("OK\n"); + + return 0; +} diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_string_utils.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_string_utils.c new file mode 100755 index 000000000..25eacc850 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_string_utils.c @@ -0,0 +1,211 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2014 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + + +/* This module contains internal functions for comparing and finding the length +of strings for different data item sizes. */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "pcre_internal.h" + +#ifndef COMPILE_PCRE8 + +/************************************************* +* Compare string utilities * +*************************************************/ + +/* The following two functions compares two strings. Basically a strcmp +for non 8 bit characters. + +Arguments: + str1 first string + str2 second string + +Returns: 0 if both string are equal (like strcmp), 1 otherwise +*/ + +int +PRIV(strcmp_uc_uc)(const pcre_uchar *str1, const pcre_uchar *str2) +{ +pcre_uchar c1; +pcre_uchar c2; + +while (*str1 != '\0' || *str2 != '\0') + { + c1 = *str1++; + c2 = *str2++; + if (c1 != c2) + return ((c1 > c2) << 1) - 1; + } +/* Both length and characters must be equal. */ +return 0; +} + +#ifdef COMPILE_PCRE32 + +int +PRIV(strcmp_uc_uc_utf)(const pcre_uchar *str1, const pcre_uchar *str2) +{ +pcre_uchar c1; +pcre_uchar c2; + +while (*str1 != '\0' || *str2 != '\0') + { + c1 = UCHAR21INC(str1); + c2 = UCHAR21INC(str2); + if (c1 != c2) + return ((c1 > c2) << 1) - 1; + } +/* Both length and characters must be equal. */ +return 0; +} + +#endif /* COMPILE_PCRE32 */ + +int +PRIV(strcmp_uc_c8)(const pcre_uchar *str1, const char *str2) +{ +const pcre_uint8 *ustr2 = (pcre_uint8 *)str2; +pcre_uchar c1; +pcre_uchar c2; + +while (*str1 != '\0' || *ustr2 != '\0') + { + c1 = *str1++; + c2 = (pcre_uchar)*ustr2++; + if (c1 != c2) + return ((c1 > c2) << 1) - 1; + } +/* Both length and characters must be equal. */ +return 0; +} + +#ifdef COMPILE_PCRE32 + +int +PRIV(strcmp_uc_c8_utf)(const pcre_uchar *str1, const char *str2) +{ +const pcre_uint8 *ustr2 = (pcre_uint8 *)str2; +pcre_uchar c1; +pcre_uchar c2; + +while (*str1 != '\0' || *ustr2 != '\0') + { + c1 = UCHAR21INC(str1); + c2 = (pcre_uchar)*ustr2++; + if (c1 != c2) + return ((c1 > c2) << 1) - 1; + } +/* Both length and characters must be equal. */ +return 0; +} + +#endif /* COMPILE_PCRE32 */ + +/* The following two functions compares two, fixed length +strings. Basically an strncmp for non 8 bit characters. + +Arguments: + str1 first string + str2 second string + num size of the string + +Returns: 0 if both string are equal (like strcmp), 1 otherwise +*/ + +int +PRIV(strncmp_uc_uc)(const pcre_uchar *str1, const pcre_uchar *str2, unsigned int num) +{ +pcre_uchar c1; +pcre_uchar c2; + +while (num-- > 0) + { + c1 = *str1++; + c2 = *str2++; + if (c1 != c2) + return ((c1 > c2) << 1) - 1; + } +/* Both length and characters must be equal. */ +return 0; +} + +int +PRIV(strncmp_uc_c8)(const pcre_uchar *str1, const char *str2, unsigned int num) +{ +const pcre_uint8 *ustr2 = (pcre_uint8 *)str2; +pcre_uchar c1; +pcre_uchar c2; + +while (num-- > 0) + { + c1 = *str1++; + c2 = (pcre_uchar)*ustr2++; + if (c1 != c2) + return ((c1 > c2) << 1) - 1; + } +/* Both length and characters must be equal. */ +return 0; +} + +/* The following function returns with the length of +a zero terminated string. Basically an strlen for non 8 bit characters. + +Arguments: + str string + +Returns: length of the string +*/ + +unsigned int +PRIV(strlen_uc)(const pcre_uchar *str) +{ +unsigned int len = 0; +while (*str++ != 0) + len++; +return len; +} + +#endif /* !COMPILE_PCRE8 */ + +/* End of pcre_string_utils.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_stringpiece.cc b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_stringpiece.cc new file mode 100755 index 000000000..67c0f1fc0 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_stringpiece.cc @@ -0,0 +1,43 @@ +// Copyright (c) 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wilsonh@google.com (Wilson Hsieh) +// + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include "pcrecpp_internal.h" +#include "pcre_stringpiece.h" + +std::ostream& operator<<(std::ostream& o, const pcrecpp::StringPiece& piece) { + return (o << piece.as_string()); +} diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_stringpiece.h.in b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_stringpiece.h.in new file mode 100755 index 000000000..f54f3f3b3 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_stringpiece.h.in @@ -0,0 +1,180 @@ +// Copyright (c) 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: Sanjay Ghemawat +// +// A string like object that points into another piece of memory. +// Useful for providing an interface that allows clients to easily +// pass in either a "const char*" or a "string". +// +// Arghh! I wish C++ literals were automatically of type "string". + +#ifndef _PCRE_STRINGPIECE_H +#define _PCRE_STRINGPIECE_H + +#include +#include +#include // for ostream forward-declaration + +#if @pcre_have_type_traits@ +#define HAVE_TYPE_TRAITS +#include +#elif @pcre_have_bits_type_traits@ +#define HAVE_TYPE_TRAITS +#include +#endif + +#include + +namespace pcrecpp { + +using std::memcmp; +using std::strlen; +using std::string; + +class PCRECPP_EXP_DEFN StringPiece { + private: + const char* ptr_; + int length_; + + public: + // We provide non-explicit singleton constructors so users can pass + // in a "const char*" or a "string" wherever a "StringPiece" is + // expected. + StringPiece() + : ptr_(NULL), length_(0) { } + StringPiece(const char* str) + : ptr_(str), length_(static_cast(strlen(ptr_))) { } + StringPiece(const unsigned char* str) + : ptr_(reinterpret_cast(str)), + length_(static_cast(strlen(ptr_))) { } + StringPiece(const string& str) + : ptr_(str.data()), length_(static_cast(str.size())) { } + StringPiece(const char* offset, int len) + : ptr_(offset), length_(len) { } + + // data() may return a pointer to a buffer with embedded NULs, and the + // returned buffer may or may not be null terminated. Therefore it is + // typically a mistake to pass data() to a routine that expects a NUL + // terminated string. Use "as_string().c_str()" if you really need to do + // this. Or better yet, change your routine so it does not rely on NUL + // termination. + const char* data() const { return ptr_; } + int size() const { return length_; } + bool empty() const { return length_ == 0; } + + void clear() { ptr_ = NULL; length_ = 0; } + void set(const char* buffer, int len) { ptr_ = buffer; length_ = len; } + void set(const char* str) { + ptr_ = str; + length_ = static_cast(strlen(str)); + } + void set(const void* buffer, int len) { + ptr_ = reinterpret_cast(buffer); + length_ = len; + } + + char operator[](int i) const { return ptr_[i]; } + + void remove_prefix(int n) { + ptr_ += n; + length_ -= n; + } + + void remove_suffix(int n) { + length_ -= n; + } + + bool operator==(const StringPiece& x) const { + return ((length_ == x.length_) && + (memcmp(ptr_, x.ptr_, length_) == 0)); + } + bool operator!=(const StringPiece& x) const { + return !(*this == x); + } + +#define STRINGPIECE_BINARY_PREDICATE(cmp,auxcmp) \ + bool operator cmp (const StringPiece& x) const { \ + int r = memcmp(ptr_, x.ptr_, length_ < x.length_ ? length_ : x.length_); \ + return ((r auxcmp 0) || ((r == 0) && (length_ cmp x.length_))); \ + } + STRINGPIECE_BINARY_PREDICATE(<, <); + STRINGPIECE_BINARY_PREDICATE(<=, <); + STRINGPIECE_BINARY_PREDICATE(>=, >); + STRINGPIECE_BINARY_PREDICATE(>, >); +#undef STRINGPIECE_BINARY_PREDICATE + + int compare(const StringPiece& x) const { + int r = memcmp(ptr_, x.ptr_, length_ < x.length_ ? length_ : x.length_); + if (r == 0) { + if (length_ < x.length_) r = -1; + else if (length_ > x.length_) r = +1; + } + return r; + } + + string as_string() const { + return string(data(), size()); + } + + void CopyToString(string* target) const { + target->assign(ptr_, length_); + } + + // Does "this" start with "x" + bool starts_with(const StringPiece& x) const { + return ((length_ >= x.length_) && (memcmp(ptr_, x.ptr_, x.length_) == 0)); + } +}; + +} // namespace pcrecpp + +// ------------------------------------------------------------------ +// Functions used to create STL containers that use StringPiece +// Remember that a StringPiece's lifetime had better be less than +// that of the underlying string or char*. If it is not, then you +// cannot safely store a StringPiece into an STL container +// ------------------------------------------------------------------ + +#ifdef HAVE_TYPE_TRAITS +// This makes vector really fast for some STL implementations +template<> struct __type_traits { + typedef __true_type has_trivial_default_constructor; + typedef __true_type has_trivial_copy_constructor; + typedef __true_type has_trivial_assignment_operator; + typedef __true_type has_trivial_destructor; + typedef __true_type is_POD_type; +}; +#endif + +// allow StringPiece to be logged +PCRECPP_EXP_DECL std::ostream& operator<<(std::ostream& o, + const pcrecpp::StringPiece& piece); + +#endif /* _PCRE_STRINGPIECE_H */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_stringpiece_unittest.cc b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_stringpiece_unittest.cc new file mode 100755 index 000000000..88e73a1f9 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_stringpiece_unittest.cc @@ -0,0 +1,153 @@ +// Copyright 2003 and onwards Google Inc. +// Author: Sanjay Ghemawat + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include // for make_pair + +#include "pcrecpp.h" +#include "pcre_stringpiece.h" + +// CHECK dies with a fatal error if condition is not true. It is *not* +// controlled by NDEBUG, so the check will be executed regardless of +// compilation mode. Therefore, it is safe to do things like: +// CHECK(fp->Write(x) == 4) +#define CHECK(condition) do { \ + if (!(condition)) { \ + fprintf(stderr, "%s:%d: Check failed: %s\n", \ + __FILE__, __LINE__, #condition); \ + exit(1); \ + } \ +} while (0) + +using std::string; +using pcrecpp::StringPiece; + +static void CheckSTLComparator() { + string s1("foo"); + string s2("bar"); + string s3("baz"); + + StringPiece p1(s1); + StringPiece p2(s2); + StringPiece p3(s3); + + typedef std::map TestMap; + TestMap map; + + map.insert(std::make_pair(p1, 0)); + map.insert(std::make_pair(p2, 1)); + map.insert(std::make_pair(p3, 2)); + + CHECK(map.size() == 3); + + TestMap::const_iterator iter = map.begin(); + CHECK(iter->second == 1); + ++iter; + CHECK(iter->second == 2); + ++iter; + CHECK(iter->second == 0); + ++iter; + CHECK(iter == map.end()); + + TestMap::iterator new_iter = map.find("zot"); + CHECK(new_iter == map.end()); + + new_iter = map.find("bar"); + CHECK(new_iter != map.end()); + + map.erase(new_iter); + CHECK(map.size() == 2); + + iter = map.begin(); + CHECK(iter->second == 2); + ++iter; + CHECK(iter->second == 0); + ++iter; + CHECK(iter == map.end()); +} + +static void CheckComparisonOperators() { +#define CMP_Y(op, x, y) \ + CHECK( (StringPiece((x)) op StringPiece((y)))); \ + CHECK( (StringPiece((x)).compare(StringPiece((y))) op 0)) + +#define CMP_N(op, x, y) \ + CHECK(!(StringPiece((x)) op StringPiece((y)))); \ + CHECK(!(StringPiece((x)).compare(StringPiece((y))) op 0)) + + CMP_Y(==, "", ""); + CMP_Y(==, "a", "a"); + CMP_Y(==, "aa", "aa"); + CMP_N(==, "a", ""); + CMP_N(==, "", "a"); + CMP_N(==, "a", "b"); + CMP_N(==, "a", "aa"); + CMP_N(==, "aa", "a"); + + CMP_N(!=, "", ""); + CMP_N(!=, "a", "a"); + CMP_N(!=, "aa", "aa"); + CMP_Y(!=, "a", ""); + CMP_Y(!=, "", "a"); + CMP_Y(!=, "a", "b"); + CMP_Y(!=, "a", "aa"); + CMP_Y(!=, "aa", "a"); + + CMP_Y(<, "a", "b"); + CMP_Y(<, "a", "aa"); + CMP_Y(<, "aa", "b"); + CMP_Y(<, "aa", "bb"); + CMP_N(<, "a", "a"); + CMP_N(<, "b", "a"); + CMP_N(<, "aa", "a"); + CMP_N(<, "b", "aa"); + CMP_N(<, "bb", "aa"); + + CMP_Y(<=, "a", "a"); + CMP_Y(<=, "a", "b"); + CMP_Y(<=, "a", "aa"); + CMP_Y(<=, "aa", "b"); + CMP_Y(<=, "aa", "bb"); + CMP_N(<=, "b", "a"); + CMP_N(<=, "aa", "a"); + CMP_N(<=, "b", "aa"); + CMP_N(<=, "bb", "aa"); + + CMP_N(>=, "a", "b"); + CMP_N(>=, "a", "aa"); + CMP_N(>=, "aa", "b"); + CMP_N(>=, "aa", "bb"); + CMP_Y(>=, "a", "a"); + CMP_Y(>=, "b", "a"); + CMP_Y(>=, "aa", "a"); + CMP_Y(>=, "b", "aa"); + CMP_Y(>=, "bb", "aa"); + + CMP_N(>, "a", "a"); + CMP_N(>, "a", "b"); + CMP_N(>, "a", "aa"); + CMP_N(>, "aa", "b"); + CMP_N(>, "aa", "bb"); + CMP_Y(>, "b", "a"); + CMP_Y(>, "aa", "a"); + CMP_Y(>, "b", "aa"); + CMP_Y(>, "bb", "aa"); + +#undef CMP_Y +#undef CMP_N +} + +int main(int argc, char** argv) { + (void)argc; + (void)argv; + CheckComparisonOperators(); + CheckSTLComparator(); + + printf("OK\n"); + return 0; +} diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_study.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_study.c new file mode 100755 index 000000000..d9d4960d8 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_study.c @@ -0,0 +1,1686 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + + +/* This module contains the external function pcre_study(), along with local +supporting functions. */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "pcre_internal.h" + +#define SET_BIT(c) start_bits[c/8] |= (1 << (c&7)) + +/* Returns from set_start_bits() */ + +enum { SSB_FAIL, SSB_DONE, SSB_CONTINUE, SSB_UNKNOWN }; + + + +/************************************************* +* Find the minimum subject length for a group * +*************************************************/ + +/* Scan a parenthesized group and compute the minimum length of subject that +is needed to match it. This is a lower bound; it does not mean there is a +string of that length that matches. In UTF8 mode, the result is in characters +rather than bytes. + +Arguments: + re compiled pattern block + code pointer to start of group (the bracket) + startcode pointer to start of the whole pattern's code + options the compiling options + recurses chain of recurse_check to catch mutual recursion + countptr pointer to call count (to catch over complexity) + +Returns: the minimum length + -1 if \C in UTF-8 mode or (*ACCEPT) was encountered + -2 internal error (missing capturing bracket) + -3 internal error (opcode not listed) +*/ + +static int +find_minlength(const REAL_PCRE *re, const pcre_uchar *code, + const pcre_uchar *startcode, int options, recurse_check *recurses, + int *countptr) +{ +int length = -1; +/* PCRE_UTF16 has the same value as PCRE_UTF8. */ +BOOL utf = (options & PCRE_UTF8) != 0; +BOOL had_recurse = FALSE; +recurse_check this_recurse; +register int branchlength = 0; +register pcre_uchar *cc = (pcre_uchar *)code + 1 + LINK_SIZE; + +if ((*countptr)++ > 1000) return -1; /* too complex */ + +if (*code == OP_CBRA || *code == OP_SCBRA || + *code == OP_CBRAPOS || *code == OP_SCBRAPOS) cc += IMM2_SIZE; + +/* Scan along the opcodes for this branch. If we get to the end of the +branch, check the length against that of the other branches. */ + +for (;;) + { + int d, min; + pcre_uchar *cs, *ce; + register pcre_uchar op = *cc; + + switch (op) + { + case OP_COND: + case OP_SCOND: + + /* If there is only one branch in a condition, the implied branch has zero + length, so we don't add anything. This covers the DEFINE "condition" + automatically. */ + + cs = cc + GET(cc, 1); + if (*cs != OP_ALT) + { + cc = cs + 1 + LINK_SIZE; + break; + } + + /* Otherwise we can fall through and treat it the same as any other + subpattern. */ + + case OP_CBRA: + case OP_SCBRA: + case OP_BRA: + case OP_SBRA: + case OP_CBRAPOS: + case OP_SCBRAPOS: + case OP_BRAPOS: + case OP_SBRAPOS: + case OP_ONCE: + case OP_ONCE_NC: + d = find_minlength(re, cc, startcode, options, recurses, countptr); + if (d < 0) return d; + branchlength += d; + do cc += GET(cc, 1); while (*cc == OP_ALT); + cc += 1 + LINK_SIZE; + break; + + /* ACCEPT makes things far too complicated; we have to give up. */ + + case OP_ACCEPT: + case OP_ASSERT_ACCEPT: + return -1; + + /* Reached end of a branch; if it's a ket it is the end of a nested + call. If it's ALT it is an alternation in a nested call. If it is END it's + the end of the outer call. All can be handled by the same code. If an + ACCEPT was previously encountered, use the length that was in force at that + time, and pass back the shortest ACCEPT length. */ + + case OP_ALT: + case OP_KET: + case OP_KETRMAX: + case OP_KETRMIN: + case OP_KETRPOS: + case OP_END: + if (length < 0 || (!had_recurse && branchlength < length)) + length = branchlength; + if (op != OP_ALT) return length; + cc += 1 + LINK_SIZE; + branchlength = 0; + had_recurse = FALSE; + break; + + /* Skip over assertive subpatterns */ + + case OP_ASSERT: + case OP_ASSERT_NOT: + case OP_ASSERTBACK: + case OP_ASSERTBACK_NOT: + do cc += GET(cc, 1); while (*cc == OP_ALT); + /* Fall through */ + + /* Skip over things that don't match chars */ + + case OP_REVERSE: + case OP_CREF: + case OP_DNCREF: + case OP_RREF: + case OP_DNRREF: + case OP_DEF: + case OP_CALLOUT: + case OP_SOD: + case OP_SOM: + case OP_EOD: + case OP_EODN: + case OP_CIRC: + case OP_CIRCM: + case OP_DOLL: + case OP_DOLLM: + case OP_NOT_WORD_BOUNDARY: + case OP_WORD_BOUNDARY: + cc += PRIV(OP_lengths)[*cc]; + break; + + /* Skip over a subpattern that has a {0} or {0,x} quantifier */ + + case OP_BRAZERO: + case OP_BRAMINZERO: + case OP_BRAPOSZERO: + case OP_SKIPZERO: + cc += PRIV(OP_lengths)[*cc]; + do cc += GET(cc, 1); while (*cc == OP_ALT); + cc += 1 + LINK_SIZE; + break; + + /* Handle literal characters and + repetitions */ + + case OP_CHAR: + case OP_CHARI: + case OP_NOT: + case OP_NOTI: + case OP_PLUS: + case OP_PLUSI: + case OP_MINPLUS: + case OP_MINPLUSI: + case OP_POSPLUS: + case OP_POSPLUSI: + case OP_NOTPLUS: + case OP_NOTPLUSI: + case OP_NOTMINPLUS: + case OP_NOTMINPLUSI: + case OP_NOTPOSPLUS: + case OP_NOTPOSPLUSI: + branchlength++; + cc += 2; +#ifdef SUPPORT_UTF + if (utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]); +#endif + break; + + case OP_TYPEPLUS: + case OP_TYPEMINPLUS: + case OP_TYPEPOSPLUS: + branchlength++; + cc += (cc[1] == OP_PROP || cc[1] == OP_NOTPROP)? 4 : 2; + break; + + /* Handle exact repetitions. The count is already in characters, but we + need to skip over a multibyte character in UTF8 mode. */ + + case OP_EXACT: + case OP_EXACTI: + case OP_NOTEXACT: + case OP_NOTEXACTI: + branchlength += GET2(cc,1); + cc += 2 + IMM2_SIZE; +#ifdef SUPPORT_UTF + if (utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]); +#endif + break; + + case OP_TYPEEXACT: + branchlength += GET2(cc,1); + cc += 2 + IMM2_SIZE + ((cc[1 + IMM2_SIZE] == OP_PROP + || cc[1 + IMM2_SIZE] == OP_NOTPROP)? 2 : 0); + break; + + /* Handle single-char non-literal matchers */ + + case OP_PROP: + case OP_NOTPROP: + cc += 2; + /* Fall through */ + + case OP_NOT_DIGIT: + case OP_DIGIT: + case OP_NOT_WHITESPACE: + case OP_WHITESPACE: + case OP_NOT_WORDCHAR: + case OP_WORDCHAR: + case OP_ANY: + case OP_ALLANY: + case OP_EXTUNI: + case OP_HSPACE: + case OP_NOT_HSPACE: + case OP_VSPACE: + case OP_NOT_VSPACE: + branchlength++; + cc++; + break; + + /* "Any newline" might match two characters, but it also might match just + one. */ + + case OP_ANYNL: + branchlength += 1; + cc++; + break; + + /* The single-byte matcher means we can't proceed in UTF-8 mode. (In + non-UTF-8 mode \C will actually be turned into OP_ALLANY, so won't ever + appear, but leave the code, just in case.) */ + + case OP_ANYBYTE: +#ifdef SUPPORT_UTF + if (utf) return -1; +#endif + branchlength++; + cc++; + break; + + /* For repeated character types, we have to test for \p and \P, which have + an extra two bytes of parameters. */ + + case OP_TYPESTAR: + case OP_TYPEMINSTAR: + case OP_TYPEQUERY: + case OP_TYPEMINQUERY: + case OP_TYPEPOSSTAR: + case OP_TYPEPOSQUERY: + if (cc[1] == OP_PROP || cc[1] == OP_NOTPROP) cc += 2; + cc += PRIV(OP_lengths)[op]; + break; + + case OP_TYPEUPTO: + case OP_TYPEMINUPTO: + case OP_TYPEPOSUPTO: + if (cc[1 + IMM2_SIZE] == OP_PROP + || cc[1 + IMM2_SIZE] == OP_NOTPROP) cc += 2; + cc += PRIV(OP_lengths)[op]; + break; + + /* Check a class for variable quantification */ + + case OP_CLASS: + case OP_NCLASS: +#if defined SUPPORT_UTF || defined COMPILE_PCRE16 || defined COMPILE_PCRE32 + case OP_XCLASS: + /* The original code caused an unsigned overflow in 64 bit systems, + so now we use a conditional statement. */ + if (op == OP_XCLASS) + cc += GET(cc, 1); + else + cc += PRIV(OP_lengths)[OP_CLASS]; +#else + cc += PRIV(OP_lengths)[OP_CLASS]; +#endif + + switch (*cc) + { + case OP_CRPLUS: + case OP_CRMINPLUS: + case OP_CRPOSPLUS: + branchlength++; + /* Fall through */ + + case OP_CRSTAR: + case OP_CRMINSTAR: + case OP_CRQUERY: + case OP_CRMINQUERY: + case OP_CRPOSSTAR: + case OP_CRPOSQUERY: + cc++; + break; + + case OP_CRRANGE: + case OP_CRMINRANGE: + case OP_CRPOSRANGE: + branchlength += GET2(cc,1); + cc += 1 + 2 * IMM2_SIZE; + break; + + default: + branchlength++; + break; + } + break; + + /* Backreferences and subroutine calls are treated in the same way: we find + the minimum length for the subpattern. A recursion, however, causes an + a flag to be set that causes the length of this branch to be ignored. The + logic is that a recursion can only make sense if there is another + alternation that stops the recursing. That will provide the minimum length + (when no recursion happens). A backreference within the group that it is + referencing behaves in the same way. + + If PCRE_JAVASCRIPT_COMPAT is set, a backreference to an unset bracket + matches an empty string (by default it causes a matching failure), so in + that case we must set the minimum length to zero. */ + + case OP_DNREF: /* Duplicate named pattern back reference */ + case OP_DNREFI: + if ((options & PCRE_JAVASCRIPT_COMPAT) == 0) + { + int count = GET2(cc, 1+IMM2_SIZE); + pcre_uchar *slot = (pcre_uchar *)re + + re->name_table_offset + GET2(cc, 1) * re->name_entry_size; + d = INT_MAX; + while (count-- > 0) + { + ce = cs = (pcre_uchar *)PRIV(find_bracket)(startcode, utf, GET2(slot, 0)); + if (cs == NULL) return -2; + do ce += GET(ce, 1); while (*ce == OP_ALT); + if (cc > cs && cc < ce) /* Simple recursion */ + { + d = 0; + had_recurse = TRUE; + break; + } + else + { + recurse_check *r = recurses; + for (r = recurses; r != NULL; r = r->prev) if (r->group == cs) break; + if (r != NULL) /* Mutual recursion */ + { + d = 0; + had_recurse = TRUE; + break; + } + else + { + int dd; + this_recurse.prev = recurses; + this_recurse.group = cs; + dd = find_minlength(re, cs, startcode, options, &this_recurse, + countptr); + if (dd < d) d = dd; + } + } + slot += re->name_entry_size; + } + } + else d = 0; + cc += 1 + 2*IMM2_SIZE; + goto REPEAT_BACK_REFERENCE; + + case OP_REF: /* Single back reference */ + case OP_REFI: + if ((options & PCRE_JAVASCRIPT_COMPAT) == 0) + { + ce = cs = (pcre_uchar *)PRIV(find_bracket)(startcode, utf, GET2(cc, 1)); + if (cs == NULL) return -2; + do ce += GET(ce, 1); while (*ce == OP_ALT); + if (cc > cs && cc < ce) /* Simple recursion */ + { + d = 0; + had_recurse = TRUE; + } + else + { + recurse_check *r = recurses; + for (r = recurses; r != NULL; r = r->prev) if (r->group == cs) break; + if (r != NULL) /* Mutual recursion */ + { + d = 0; + had_recurse = TRUE; + } + else + { + this_recurse.prev = recurses; + this_recurse.group = cs; + d = find_minlength(re, cs, startcode, options, &this_recurse, + countptr); + } + } + } + else d = 0; + cc += 1 + IMM2_SIZE; + + /* Handle repeated back references */ + + REPEAT_BACK_REFERENCE: + switch (*cc) + { + case OP_CRSTAR: + case OP_CRMINSTAR: + case OP_CRQUERY: + case OP_CRMINQUERY: + case OP_CRPOSSTAR: + case OP_CRPOSQUERY: + min = 0; + cc++; + break; + + case OP_CRPLUS: + case OP_CRMINPLUS: + case OP_CRPOSPLUS: + min = 1; + cc++; + break; + + case OP_CRRANGE: + case OP_CRMINRANGE: + case OP_CRPOSRANGE: + min = GET2(cc, 1); + cc += 1 + 2 * IMM2_SIZE; + break; + + default: + min = 1; + break; + } + + branchlength += min * d; + break; + + /* We can easily detect direct recursion, but not mutual recursion. This is + caught by a recursion depth count. */ + + case OP_RECURSE: + cs = ce = (pcre_uchar *)startcode + GET(cc, 1); + do ce += GET(ce, 1); while (*ce == OP_ALT); + if (cc > cs && cc < ce) /* Simple recursion */ + had_recurse = TRUE; + else + { + recurse_check *r = recurses; + for (r = recurses; r != NULL; r = r->prev) if (r->group == cs) break; + if (r != NULL) /* Mutual recursion */ + had_recurse = TRUE; + else + { + this_recurse.prev = recurses; + this_recurse.group = cs; + branchlength += find_minlength(re, cs, startcode, options, + &this_recurse, countptr); + } + } + cc += 1 + LINK_SIZE; + break; + + /* Anything else does not or need not match a character. We can get the + item's length from the table, but for those that can match zero occurrences + of a character, we must take special action for UTF-8 characters. As it + happens, the "NOT" versions of these opcodes are used at present only for + ASCII characters, so they could be omitted from this list. However, in + future that may change, so we include them here so as not to leave a + gotcha for a future maintainer. */ + + case OP_UPTO: + case OP_UPTOI: + case OP_NOTUPTO: + case OP_NOTUPTOI: + case OP_MINUPTO: + case OP_MINUPTOI: + case OP_NOTMINUPTO: + case OP_NOTMINUPTOI: + case OP_POSUPTO: + case OP_POSUPTOI: + case OP_NOTPOSUPTO: + case OP_NOTPOSUPTOI: + + case OP_STAR: + case OP_STARI: + case OP_NOTSTAR: + case OP_NOTSTARI: + case OP_MINSTAR: + case OP_MINSTARI: + case OP_NOTMINSTAR: + case OP_NOTMINSTARI: + case OP_POSSTAR: + case OP_POSSTARI: + case OP_NOTPOSSTAR: + case OP_NOTPOSSTARI: + + case OP_QUERY: + case OP_QUERYI: + case OP_NOTQUERY: + case OP_NOTQUERYI: + case OP_MINQUERY: + case OP_MINQUERYI: + case OP_NOTMINQUERY: + case OP_NOTMINQUERYI: + case OP_POSQUERY: + case OP_POSQUERYI: + case OP_NOTPOSQUERY: + case OP_NOTPOSQUERYI: + + cc += PRIV(OP_lengths)[op]; +#ifdef SUPPORT_UTF + if (utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]); +#endif + break; + + /* Skip these, but we need to add in the name length. */ + + case OP_MARK: + case OP_PRUNE_ARG: + case OP_SKIP_ARG: + case OP_THEN_ARG: + cc += PRIV(OP_lengths)[op] + cc[1]; + break; + + /* The remaining opcodes are just skipped over. */ + + case OP_CLOSE: + case OP_COMMIT: + case OP_FAIL: + case OP_PRUNE: + case OP_SET_SOM: + case OP_SKIP: + case OP_THEN: + cc += PRIV(OP_lengths)[op]; + break; + + /* This should not occur: we list all opcodes explicitly so that when + new ones get added they are properly considered. */ + + default: + return -3; + } + } +/* Control never gets here */ +} + + + +/************************************************* +* Set a bit and maybe its alternate case * +*************************************************/ + +/* Given a character, set its first byte's bit in the table, and also the +corresponding bit for the other version of a letter if we are caseless. In +UTF-8 mode, for characters greater than 127, we can only do the caseless thing +when Unicode property support is available. + +Arguments: + start_bits points to the bit map + p points to the character + caseless the caseless flag + cd the block with char table pointers + utf TRUE for UTF-8 / UTF-16 / UTF-32 mode + +Returns: pointer after the character +*/ + +static const pcre_uchar * +set_table_bit(pcre_uint8 *start_bits, const pcre_uchar *p, BOOL caseless, + compile_data *cd, BOOL utf) +{ +pcre_uint32 c = *p; + +#ifdef COMPILE_PCRE8 +SET_BIT(c); + +#ifdef SUPPORT_UTF +if (utf && c > 127) + { + GETCHARINC(c, p); +#ifdef SUPPORT_UCP + if (caseless) + { + pcre_uchar buff[6]; + c = UCD_OTHERCASE(c); + (void)PRIV(ord2utf)(c, buff); + SET_BIT(buff[0]); + } +#endif /* Not SUPPORT_UCP */ + return p; + } +#else /* Not SUPPORT_UTF */ +(void)(utf); /* Stops warning for unused parameter */ +#endif /* SUPPORT_UTF */ + +/* Not UTF-8 mode, or character is less than 127. */ + +if (caseless && (cd->ctypes[c] & ctype_letter) != 0) SET_BIT(cd->fcc[c]); +return p + 1; +#endif /* COMPILE_PCRE8 */ + +#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32 +if (c > 0xff) + { + c = 0xff; + caseless = FALSE; + } +SET_BIT(c); + +#ifdef SUPPORT_UTF +if (utf && c > 127) + { + GETCHARINC(c, p); +#ifdef SUPPORT_UCP + if (caseless) + { + c = UCD_OTHERCASE(c); + if (c > 0xff) + c = 0xff; + SET_BIT(c); + } +#endif /* SUPPORT_UCP */ + return p; + } +#else /* Not SUPPORT_UTF */ +(void)(utf); /* Stops warning for unused parameter */ +#endif /* SUPPORT_UTF */ + +if (caseless && (cd->ctypes[c] & ctype_letter) != 0) SET_BIT(cd->fcc[c]); +return p + 1; +#endif +} + + + +/************************************************* +* Set bits for a positive character type * +*************************************************/ + +/* This function sets starting bits for a character type. In UTF-8 mode, we can +only do a direct setting for bytes less than 128, as otherwise there can be +confusion with bytes in the middle of UTF-8 characters. In a "traditional" +environment, the tables will only recognize ASCII characters anyway, but in at +least one Windows environment, some higher bytes bits were set in the tables. +So we deal with that case by considering the UTF-8 encoding. + +Arguments: + start_bits the starting bitmap + cbit type the type of character wanted + table_limit 32 for non-UTF-8; 16 for UTF-8 + cd the block with char table pointers + +Returns: nothing +*/ + +static void +set_type_bits(pcre_uint8 *start_bits, int cbit_type, unsigned int table_limit, + compile_data *cd) +{ +register pcre_uint32 c; +for (c = 0; c < table_limit; c++) start_bits[c] |= cd->cbits[c+cbit_type]; +#if defined SUPPORT_UTF && defined COMPILE_PCRE8 +if (table_limit == 32) return; +for (c = 128; c < 256; c++) + { + if ((cd->cbits[c/8] & (1 << (c&7))) != 0) + { + pcre_uchar buff[6]; + (void)PRIV(ord2utf)(c, buff); + SET_BIT(buff[0]); + } + } +#endif +} + + +/************************************************* +* Set bits for a negative character type * +*************************************************/ + +/* This function sets starting bits for a negative character type such as \D. +In UTF-8 mode, we can only do a direct setting for bytes less than 128, as +otherwise there can be confusion with bytes in the middle of UTF-8 characters. +Unlike in the positive case, where we can set appropriate starting bits for +specific high-valued UTF-8 characters, in this case we have to set the bits for +all high-valued characters. The lowest is 0xc2, but we overkill by starting at +0xc0 (192) for simplicity. + +Arguments: + start_bits the starting bitmap + cbit type the type of character wanted + table_limit 32 for non-UTF-8; 16 for UTF-8 + cd the block with char table pointers + +Returns: nothing +*/ + +static void +set_nottype_bits(pcre_uint8 *start_bits, int cbit_type, unsigned int table_limit, + compile_data *cd) +{ +register pcre_uint32 c; +for (c = 0; c < table_limit; c++) start_bits[c] |= ~cd->cbits[c+cbit_type]; +#if defined SUPPORT_UTF && defined COMPILE_PCRE8 +if (table_limit != 32) for (c = 24; c < 32; c++) start_bits[c] = 0xff; +#endif +} + + + +/************************************************* +* Create bitmap of starting bytes * +*************************************************/ + +/* This function scans a compiled unanchored expression recursively and +attempts to build a bitmap of the set of possible starting bytes. As time goes +by, we may be able to get more clever at doing this. The SSB_CONTINUE return is +useful for parenthesized groups in patterns such as (a*)b where the group +provides some optional starting bytes but scanning must continue at the outer +level to find at least one mandatory byte. At the outermost level, this +function fails unless the result is SSB_DONE. + +Arguments: + code points to an expression + start_bits points to a 32-byte table, initialized to 0 + utf TRUE if in UTF-8 / UTF-16 / UTF-32 mode + cd the block with char table pointers + +Returns: SSB_FAIL => Failed to find any starting bytes + SSB_DONE => Found mandatory starting bytes + SSB_CONTINUE => Found optional starting bytes + SSB_UNKNOWN => Hit an unrecognized opcode +*/ + +static int +set_start_bits(const pcre_uchar *code, pcre_uint8 *start_bits, BOOL utf, + compile_data *cd) +{ +register pcre_uint32 c; +int yield = SSB_DONE; +#if defined SUPPORT_UTF && defined COMPILE_PCRE8 +int table_limit = utf? 16:32; +#else +int table_limit = 32; +#endif + +#if 0 +/* ========================================================================= */ +/* The following comment and code was inserted in January 1999. In May 2006, +when it was observed to cause compiler warnings about unused values, I took it +out again. If anybody is still using OS/2, they will have to put it back +manually. */ + +/* This next statement and the later reference to dummy are here in order to +trick the optimizer of the IBM C compiler for OS/2 into generating correct +code. Apparently IBM isn't going to fix the problem, and we would rather not +disable optimization (in this module it actually makes a big difference, and +the pcre module can use all the optimization it can get). */ + +volatile int dummy; +/* ========================================================================= */ +#endif + +do + { + BOOL try_next = TRUE; + const pcre_uchar *tcode = code + 1 + LINK_SIZE; + + if (*code == OP_CBRA || *code == OP_SCBRA || + *code == OP_CBRAPOS || *code == OP_SCBRAPOS) tcode += IMM2_SIZE; + + while (try_next) /* Loop for items in this branch */ + { + int rc; + + switch(*tcode) + { + /* If we reach something we don't understand, it means a new opcode has + been created that hasn't been added to this code. Hopefully this problem + will be discovered during testing. */ + + default: + return SSB_UNKNOWN; + + /* Fail for a valid opcode that implies no starting bits. */ + + case OP_ACCEPT: + case OP_ASSERT_ACCEPT: + case OP_ALLANY: + case OP_ANY: + case OP_ANYBYTE: + case OP_CIRC: + case OP_CIRCM: + case OP_CLOSE: + case OP_COMMIT: + case OP_COND: + case OP_CREF: + case OP_DEF: + case OP_DNCREF: + case OP_DNREF: + case OP_DNREFI: + case OP_DNRREF: + case OP_DOLL: + case OP_DOLLM: + case OP_END: + case OP_EOD: + case OP_EODN: + case OP_EXTUNI: + case OP_FAIL: + case OP_MARK: + case OP_NOT: + case OP_NOTEXACT: + case OP_NOTEXACTI: + case OP_NOTI: + case OP_NOTMINPLUS: + case OP_NOTMINPLUSI: + case OP_NOTMINQUERY: + case OP_NOTMINQUERYI: + case OP_NOTMINSTAR: + case OP_NOTMINSTARI: + case OP_NOTMINUPTO: + case OP_NOTMINUPTOI: + case OP_NOTPLUS: + case OP_NOTPLUSI: + case OP_NOTPOSPLUS: + case OP_NOTPOSPLUSI: + case OP_NOTPOSQUERY: + case OP_NOTPOSQUERYI: + case OP_NOTPOSSTAR: + case OP_NOTPOSSTARI: + case OP_NOTPOSUPTO: + case OP_NOTPOSUPTOI: + case OP_NOTPROP: + case OP_NOTQUERY: + case OP_NOTQUERYI: + case OP_NOTSTAR: + case OP_NOTSTARI: + case OP_NOTUPTO: + case OP_NOTUPTOI: + case OP_NOT_HSPACE: + case OP_NOT_VSPACE: + case OP_PRUNE: + case OP_PRUNE_ARG: + case OP_RECURSE: + case OP_REF: + case OP_REFI: + case OP_REVERSE: + case OP_RREF: + case OP_SCOND: + case OP_SET_SOM: + case OP_SKIP: + case OP_SKIP_ARG: + case OP_SOD: + case OP_SOM: + case OP_THEN: + case OP_THEN_ARG: + return SSB_FAIL; + + /* A "real" property test implies no starting bits, but the fake property + PT_CLIST identifies a list of characters. These lists are short, as they + are used for characters with more than one "other case", so there is no + point in recognizing them for OP_NOTPROP. */ + + case OP_PROP: + if (tcode[1] != PT_CLIST) return SSB_FAIL; + { + const pcre_uint32 *p = PRIV(ucd_caseless_sets) + tcode[2]; + while ((c = *p++) < NOTACHAR) + { +#if defined SUPPORT_UTF && defined COMPILE_PCRE8 + if (utf) + { + pcre_uchar buff[6]; + (void)PRIV(ord2utf)(c, buff); + c = buff[0]; + } +#endif + if (c > 0xff) SET_BIT(0xff); else SET_BIT(c); + } + } + try_next = FALSE; + break; + + /* We can ignore word boundary tests. */ + + case OP_WORD_BOUNDARY: + case OP_NOT_WORD_BOUNDARY: + tcode++; + break; + + /* If we hit a bracket or a positive lookahead assertion, recurse to set + bits from within the subpattern. If it can't find anything, we have to + give up. If it finds some mandatory character(s), we are done for this + branch. Otherwise, carry on scanning after the subpattern. */ + + case OP_BRA: + case OP_SBRA: + case OP_CBRA: + case OP_SCBRA: + case OP_BRAPOS: + case OP_SBRAPOS: + case OP_CBRAPOS: + case OP_SCBRAPOS: + case OP_ONCE: + case OP_ONCE_NC: + case OP_ASSERT: + rc = set_start_bits(tcode, start_bits, utf, cd); + if (rc == SSB_FAIL || rc == SSB_UNKNOWN) return rc; + if (rc == SSB_DONE) try_next = FALSE; else + { + do tcode += GET(tcode, 1); while (*tcode == OP_ALT); + tcode += 1 + LINK_SIZE; + } + break; + + /* If we hit ALT or KET, it means we haven't found anything mandatory in + this branch, though we might have found something optional. For ALT, we + continue with the next alternative, but we have to arrange that the final + result from subpattern is SSB_CONTINUE rather than SSB_DONE. For KET, + return SSB_CONTINUE: if this is the top level, that indicates failure, + but after a nested subpattern, it causes scanning to continue. */ + + case OP_ALT: + yield = SSB_CONTINUE; + try_next = FALSE; + break; + + case OP_KET: + case OP_KETRMAX: + case OP_KETRMIN: + case OP_KETRPOS: + return SSB_CONTINUE; + + /* Skip over callout */ + + case OP_CALLOUT: + tcode += 2 + 2*LINK_SIZE; + break; + + /* Skip over lookbehind and negative lookahead assertions */ + + case OP_ASSERT_NOT: + case OP_ASSERTBACK: + case OP_ASSERTBACK_NOT: + do tcode += GET(tcode, 1); while (*tcode == OP_ALT); + tcode += 1 + LINK_SIZE; + break; + + /* BRAZERO does the bracket, but carries on. */ + + case OP_BRAZERO: + case OP_BRAMINZERO: + case OP_BRAPOSZERO: + rc = set_start_bits(++tcode, start_bits, utf, cd); + if (rc == SSB_FAIL || rc == SSB_UNKNOWN) return rc; +/* ========================================================================= + See the comment at the head of this function concerning the next line, + which was an old fudge for the benefit of OS/2. + dummy = 1; + ========================================================================= */ + do tcode += GET(tcode,1); while (*tcode == OP_ALT); + tcode += 1 + LINK_SIZE; + break; + + /* SKIPZERO skips the bracket. */ + + case OP_SKIPZERO: + tcode++; + do tcode += GET(tcode,1); while (*tcode == OP_ALT); + tcode += 1 + LINK_SIZE; + break; + + /* Single-char * or ? sets the bit and tries the next item */ + + case OP_STAR: + case OP_MINSTAR: + case OP_POSSTAR: + case OP_QUERY: + case OP_MINQUERY: + case OP_POSQUERY: + tcode = set_table_bit(start_bits, tcode + 1, FALSE, cd, utf); + break; + + case OP_STARI: + case OP_MINSTARI: + case OP_POSSTARI: + case OP_QUERYI: + case OP_MINQUERYI: + case OP_POSQUERYI: + tcode = set_table_bit(start_bits, tcode + 1, TRUE, cd, utf); + break; + + /* Single-char upto sets the bit and tries the next */ + + case OP_UPTO: + case OP_MINUPTO: + case OP_POSUPTO: + tcode = set_table_bit(start_bits, tcode + 1 + IMM2_SIZE, FALSE, cd, utf); + break; + + case OP_UPTOI: + case OP_MINUPTOI: + case OP_POSUPTOI: + tcode = set_table_bit(start_bits, tcode + 1 + IMM2_SIZE, TRUE, cd, utf); + break; + + /* At least one single char sets the bit and stops */ + + case OP_EXACT: + tcode += IMM2_SIZE; + /* Fall through */ + case OP_CHAR: + case OP_PLUS: + case OP_MINPLUS: + case OP_POSPLUS: + (void)set_table_bit(start_bits, tcode + 1, FALSE, cd, utf); + try_next = FALSE; + break; + + case OP_EXACTI: + tcode += IMM2_SIZE; + /* Fall through */ + case OP_CHARI: + case OP_PLUSI: + case OP_MINPLUSI: + case OP_POSPLUSI: + (void)set_table_bit(start_bits, tcode + 1, TRUE, cd, utf); + try_next = FALSE; + break; + + /* Special spacing and line-terminating items. These recognize specific + lists of characters. The difference between VSPACE and ANYNL is that the + latter can match the two-character CRLF sequence, but that is not + relevant for finding the first character, so their code here is + identical. */ + + case OP_HSPACE: + SET_BIT(CHAR_HT); + SET_BIT(CHAR_SPACE); +#ifdef SUPPORT_UTF + if (utf) + { +#ifdef COMPILE_PCRE8 + SET_BIT(0xC2); /* For U+00A0 */ + SET_BIT(0xE1); /* For U+1680, U+180E */ + SET_BIT(0xE2); /* For U+2000 - U+200A, U+202F, U+205F */ + SET_BIT(0xE3); /* For U+3000 */ +#elif defined COMPILE_PCRE16 || defined COMPILE_PCRE32 + SET_BIT(0xA0); + SET_BIT(0xFF); /* For characters > 255 */ +#endif /* COMPILE_PCRE[8|16|32] */ + } + else +#endif /* SUPPORT_UTF */ + { +#ifndef EBCDIC + SET_BIT(0xA0); +#endif /* Not EBCDIC */ +#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32 + SET_BIT(0xFF); /* For characters > 255 */ +#endif /* COMPILE_PCRE[16|32] */ + } + try_next = FALSE; + break; + + case OP_ANYNL: + case OP_VSPACE: + SET_BIT(CHAR_LF); + SET_BIT(CHAR_VT); + SET_BIT(CHAR_FF); + SET_BIT(CHAR_CR); +#ifdef SUPPORT_UTF + if (utf) + { +#ifdef COMPILE_PCRE8 + SET_BIT(0xC2); /* For U+0085 */ + SET_BIT(0xE2); /* For U+2028, U+2029 */ +#elif defined COMPILE_PCRE16 || defined COMPILE_PCRE32 + SET_BIT(CHAR_NEL); + SET_BIT(0xFF); /* For characters > 255 */ +#endif /* COMPILE_PCRE[8|16|32] */ + } + else +#endif /* SUPPORT_UTF */ + { + SET_BIT(CHAR_NEL); +#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32 + SET_BIT(0xFF); /* For characters > 255 */ +#endif + } + try_next = FALSE; + break; + + /* Single character types set the bits and stop. Note that if PCRE_UCP + is set, we do not see these op codes because \d etc are converted to + properties. Therefore, these apply in the case when only characters less + than 256 are recognized to match the types. */ + + case OP_NOT_DIGIT: + set_nottype_bits(start_bits, cbit_digit, table_limit, cd); + try_next = FALSE; + break; + + case OP_DIGIT: + set_type_bits(start_bits, cbit_digit, table_limit, cd); + try_next = FALSE; + break; + + /* The cbit_space table has vertical tab as whitespace; we no longer + have to play fancy tricks because Perl added VT to its whitespace at + release 5.18. PCRE added it at release 8.34. */ + + case OP_NOT_WHITESPACE: + set_nottype_bits(start_bits, cbit_space, table_limit, cd); + try_next = FALSE; + break; + + case OP_WHITESPACE: + set_type_bits(start_bits, cbit_space, table_limit, cd); + try_next = FALSE; + break; + + case OP_NOT_WORDCHAR: + set_nottype_bits(start_bits, cbit_word, table_limit, cd); + try_next = FALSE; + break; + + case OP_WORDCHAR: + set_type_bits(start_bits, cbit_word, table_limit, cd); + try_next = FALSE; + break; + + /* One or more character type fudges the pointer and restarts, knowing + it will hit a single character type and stop there. */ + + case OP_TYPEPLUS: + case OP_TYPEMINPLUS: + case OP_TYPEPOSPLUS: + tcode++; + break; + + case OP_TYPEEXACT: + tcode += 1 + IMM2_SIZE; + break; + + /* Zero or more repeats of character types set the bits and then + try again. */ + + case OP_TYPEUPTO: + case OP_TYPEMINUPTO: + case OP_TYPEPOSUPTO: + tcode += IMM2_SIZE; /* Fall through */ + + case OP_TYPESTAR: + case OP_TYPEMINSTAR: + case OP_TYPEPOSSTAR: + case OP_TYPEQUERY: + case OP_TYPEMINQUERY: + case OP_TYPEPOSQUERY: + switch(tcode[1]) + { + default: + case OP_ANY: + case OP_ALLANY: + return SSB_FAIL; + + case OP_HSPACE: + SET_BIT(CHAR_HT); + SET_BIT(CHAR_SPACE); +#ifdef SUPPORT_UTF + if (utf) + { +#ifdef COMPILE_PCRE8 + SET_BIT(0xC2); /* For U+00A0 */ + SET_BIT(0xE1); /* For U+1680, U+180E */ + SET_BIT(0xE2); /* For U+2000 - U+200A, U+202F, U+205F */ + SET_BIT(0xE3); /* For U+3000 */ +#elif defined COMPILE_PCRE16 || defined COMPILE_PCRE32 + SET_BIT(0xA0); + SET_BIT(0xFF); /* For characters > 255 */ +#endif /* COMPILE_PCRE[8|16|32] */ + } + else +#endif /* SUPPORT_UTF */ +#ifndef EBCDIC + SET_BIT(0xA0); +#endif /* Not EBCDIC */ + break; + + case OP_ANYNL: + case OP_VSPACE: + SET_BIT(CHAR_LF); + SET_BIT(CHAR_VT); + SET_BIT(CHAR_FF); + SET_BIT(CHAR_CR); +#ifdef SUPPORT_UTF + if (utf) + { +#ifdef COMPILE_PCRE8 + SET_BIT(0xC2); /* For U+0085 */ + SET_BIT(0xE2); /* For U+2028, U+2029 */ +#elif defined COMPILE_PCRE16 || defined COMPILE_PCRE32 + SET_BIT(CHAR_NEL); + SET_BIT(0xFF); /* For characters > 255 */ +#endif /* COMPILE_PCRE16 */ + } + else +#endif /* SUPPORT_UTF */ + SET_BIT(CHAR_NEL); + break; + + case OP_NOT_DIGIT: + set_nottype_bits(start_bits, cbit_digit, table_limit, cd); + break; + + case OP_DIGIT: + set_type_bits(start_bits, cbit_digit, table_limit, cd); + break; + + /* The cbit_space table has vertical tab as whitespace; we no longer + have to play fancy tricks because Perl added VT to its whitespace at + release 5.18. PCRE added it at release 8.34. */ + + case OP_NOT_WHITESPACE: + set_nottype_bits(start_bits, cbit_space, table_limit, cd); + break; + + case OP_WHITESPACE: + set_type_bits(start_bits, cbit_space, table_limit, cd); + break; + + case OP_NOT_WORDCHAR: + set_nottype_bits(start_bits, cbit_word, table_limit, cd); + break; + + case OP_WORDCHAR: + set_type_bits(start_bits, cbit_word, table_limit, cd); + break; + } + + tcode += 2; + break; + + /* Character class where all the information is in a bit map: set the + bits and either carry on or not, according to the repeat count. If it was + a negative class, and we are operating with UTF-8 characters, any byte + with a value >= 0xc4 is a potentially valid starter because it starts a + character with a value > 255. */ + +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 + case OP_XCLASS: + if ((tcode[1 + LINK_SIZE] & XCL_HASPROP) != 0) + return SSB_FAIL; + /* All bits are set. */ + if ((tcode[1 + LINK_SIZE] & XCL_MAP) == 0 && (tcode[1 + LINK_SIZE] & XCL_NOT) != 0) + return SSB_FAIL; +#endif + /* Fall through */ + + case OP_NCLASS: +#if defined SUPPORT_UTF && defined COMPILE_PCRE8 + if (utf) + { + start_bits[24] |= 0xf0; /* Bits for 0xc4 - 0xc8 */ + memset(start_bits+25, 0xff, 7); /* Bits for 0xc9 - 0xff */ + } +#endif +#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32 + SET_BIT(0xFF); /* For characters > 255 */ +#endif + /* Fall through */ + + case OP_CLASS: + { + pcre_uint8 *map; +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 + map = NULL; + if (*tcode == OP_XCLASS) + { + if ((tcode[1 + LINK_SIZE] & XCL_MAP) != 0) + map = (pcre_uint8 *)(tcode + 1 + LINK_SIZE + 1); + tcode += GET(tcode, 1); + } + else +#endif + { + tcode++; + map = (pcre_uint8 *)tcode; + tcode += 32 / sizeof(pcre_uchar); + } + + /* In UTF-8 mode, the bits in a bit map correspond to character + values, not to byte values. However, the bit map we are constructing is + for byte values. So we have to do a conversion for characters whose + value is > 127. In fact, there are only two possible starting bytes for + characters in the range 128 - 255. */ + +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 + if (map != NULL) +#endif + { +#if defined SUPPORT_UTF && defined COMPILE_PCRE8 + if (utf) + { + for (c = 0; c < 16; c++) start_bits[c] |= map[c]; + for (c = 128; c < 256; c++) + { + if ((map[c/8] & (1 << (c&7))) != 0) + { + int d = (c >> 6) | 0xc0; /* Set bit for this starter */ + start_bits[d/8] |= (1 << (d&7)); /* and then skip on to the */ + c = (c & 0xc0) + 0x40 - 1; /* next relevant character. */ + } + } + } + else +#endif + { + /* In non-UTF-8 mode, the two bit maps are completely compatible. */ + for (c = 0; c < 32; c++) start_bits[c] |= map[c]; + } + } + + /* Advance past the bit map, and act on what follows. For a zero + minimum repeat, continue; otherwise stop processing. */ + + switch (*tcode) + { + case OP_CRSTAR: + case OP_CRMINSTAR: + case OP_CRQUERY: + case OP_CRMINQUERY: + case OP_CRPOSSTAR: + case OP_CRPOSQUERY: + tcode++; + break; + + case OP_CRRANGE: + case OP_CRMINRANGE: + case OP_CRPOSRANGE: + if (GET2(tcode, 1) == 0) tcode += 1 + 2 * IMM2_SIZE; + else try_next = FALSE; + break; + + default: + try_next = FALSE; + break; + } + } + break; /* End of bitmap class handling */ + + } /* End of switch */ + } /* End of try_next loop */ + + code += GET(code, 1); /* Advance to next branch */ + } +while (*code == OP_ALT); +return yield; +} + + + + + +/************************************************* +* Study a compiled expression * +*************************************************/ + +/* This function is handed a compiled expression that it must study to produce +information that will speed up the matching. It returns a pcre[16]_extra block +which then gets handed back to pcre_exec(). + +Arguments: + re points to the compiled expression + options contains option bits + errorptr points to where to place error messages; + set NULL unless error + +Returns: pointer to a pcre[16]_extra block, with study_data filled in and + the appropriate flags set; + NULL on error or if no optimization possible +*/ + +#if defined COMPILE_PCRE8 +PCRE_EXP_DEFN pcre_extra * PCRE_CALL_CONVENTION +pcre_study(const pcre *external_re, int options, const char **errorptr) +#elif defined COMPILE_PCRE16 +PCRE_EXP_DEFN pcre16_extra * PCRE_CALL_CONVENTION +pcre16_study(const pcre16 *external_re, int options, const char **errorptr) +#elif defined COMPILE_PCRE32 +PCRE_EXP_DEFN pcre32_extra * PCRE_CALL_CONVENTION +pcre32_study(const pcre32 *external_re, int options, const char **errorptr) +#endif +{ +int min; +int count = 0; +BOOL bits_set = FALSE; +pcre_uint8 start_bits[32]; +PUBL(extra) *extra = NULL; +pcre_study_data *study; +const pcre_uint8 *tables; +pcre_uchar *code; +compile_data compile_block; +const REAL_PCRE *re = (const REAL_PCRE *)external_re; + + +*errorptr = NULL; + +if (re == NULL || re->magic_number != MAGIC_NUMBER) + { + *errorptr = "argument is not a compiled regular expression"; + return NULL; + } + +if ((re->flags & PCRE_MODE) == 0) + { +#if defined COMPILE_PCRE8 + *errorptr = "argument not compiled in 8 bit mode"; +#elif defined COMPILE_PCRE16 + *errorptr = "argument not compiled in 16 bit mode"; +#elif defined COMPILE_PCRE32 + *errorptr = "argument not compiled in 32 bit mode"; +#endif + return NULL; + } + +if ((options & ~PUBLIC_STUDY_OPTIONS) != 0) + { + *errorptr = "unknown or incorrect option bit(s) set"; + return NULL; + } + +code = (pcre_uchar *)re + re->name_table_offset + + (re->name_count * re->name_entry_size); + +/* For an anchored pattern, or an unanchored pattern that has a first char, or +a multiline pattern that matches only at "line starts", there is no point in +seeking a list of starting bytes. */ + +if ((re->options & PCRE_ANCHORED) == 0 && + (re->flags & (PCRE_FIRSTSET|PCRE_STARTLINE)) == 0) + { + int rc; + + /* Set the character tables in the block that is passed around */ + + tables = re->tables; + +#if defined COMPILE_PCRE8 + if (tables == NULL) + (void)pcre_fullinfo(external_re, NULL, PCRE_INFO_DEFAULT_TABLES, + (void *)(&tables)); +#elif defined COMPILE_PCRE16 + if (tables == NULL) + (void)pcre16_fullinfo(external_re, NULL, PCRE_INFO_DEFAULT_TABLES, + (void *)(&tables)); +#elif defined COMPILE_PCRE32 + if (tables == NULL) + (void)pcre32_fullinfo(external_re, NULL, PCRE_INFO_DEFAULT_TABLES, + (void *)(&tables)); +#endif + + compile_block.lcc = tables + lcc_offset; + compile_block.fcc = tables + fcc_offset; + compile_block.cbits = tables + cbits_offset; + compile_block.ctypes = tables + ctypes_offset; + + /* See if we can find a fixed set of initial characters for the pattern. */ + + memset(start_bits, 0, 32 * sizeof(pcre_uint8)); + rc = set_start_bits(code, start_bits, (re->options & PCRE_UTF8) != 0, + &compile_block); + bits_set = rc == SSB_DONE; + if (rc == SSB_UNKNOWN) + { + *errorptr = "internal error: opcode not recognized"; + return NULL; + } + } + +/* Find the minimum length of subject string. */ + +switch(min = find_minlength(re, code, code, re->options, NULL, &count)) + { + case -2: *errorptr = "internal error: missing capturing bracket"; return NULL; + case -3: *errorptr = "internal error: opcode not recognized"; return NULL; + default: break; + } + +/* If a set of starting bytes has been identified, or if the minimum length is +greater than zero, or if JIT optimization has been requested, or if +PCRE_STUDY_EXTRA_NEEDED is set, get a pcre[16]_extra block and a +pcre_study_data block. The study data is put in the latter, which is pointed to +by the former, which may also get additional data set later by the calling +program. At the moment, the size of pcre_study_data is fixed. We nevertheless +save it in a field for returning via the pcre_fullinfo() function so that if it +becomes variable in the future, we don't have to change that code. */ + +if (bits_set || min > 0 || (options & ( +#ifdef SUPPORT_JIT + PCRE_STUDY_JIT_COMPILE | PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE | + PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE | +#endif + PCRE_STUDY_EXTRA_NEEDED)) != 0) + { + extra = (PUBL(extra) *)(PUBL(malloc)) + (sizeof(PUBL(extra)) + sizeof(pcre_study_data)); + if (extra == NULL) + { + *errorptr = "failed to get memory"; + return NULL; + } + + study = (pcre_study_data *)((char *)extra + sizeof(PUBL(extra))); + extra->flags = PCRE_EXTRA_STUDY_DATA; + extra->study_data = study; + + study->size = sizeof(pcre_study_data); + study->flags = 0; + + /* Set the start bits always, to avoid unset memory errors if the + study data is written to a file, but set the flag only if any of the bits + are set, to save time looking when none are. */ + + if (bits_set) + { + study->flags |= PCRE_STUDY_MAPPED; + memcpy(study->start_bits, start_bits, sizeof(start_bits)); + } + else memset(study->start_bits, 0, 32 * sizeof(pcre_uint8)); + +#ifdef PCRE_DEBUG + if (bits_set) + { + pcre_uint8 *ptr = start_bits; + int i; + + printf("Start bits:\n"); + for (i = 0; i < 32; i++) + printf("%3d: %02x%s", i * 8, *ptr++, ((i + 1) & 0x7) != 0? " " : "\n"); + } +#endif + + /* Always set the minlength value in the block, because the JIT compiler + makes use of it. However, don't set the bit unless the length is greater than + zero - the interpretive pcre_exec() and pcre_dfa_exec() needn't waste time + checking the zero case. */ + + if (min > 0) + { + study->flags |= PCRE_STUDY_MINLEN; + study->minlength = min; + } + else study->minlength = 0; + + /* If JIT support was compiled and requested, attempt the JIT compilation. + If no starting bytes were found, and the minimum length is zero, and JIT + compilation fails, abandon the extra block and return NULL, unless + PCRE_STUDY_EXTRA_NEEDED is set. */ + +#ifdef SUPPORT_JIT + extra->executable_jit = NULL; + if ((options & PCRE_STUDY_JIT_COMPILE) != 0) + PRIV(jit_compile)(re, extra, JIT_COMPILE); + if ((options & PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE) != 0) + PRIV(jit_compile)(re, extra, JIT_PARTIAL_SOFT_COMPILE); + if ((options & PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE) != 0) + PRIV(jit_compile)(re, extra, JIT_PARTIAL_HARD_COMPILE); + + if (study->flags == 0 && (extra->flags & PCRE_EXTRA_EXECUTABLE_JIT) == 0 && + (options & PCRE_STUDY_EXTRA_NEEDED) == 0) + { +#if defined COMPILE_PCRE8 + pcre_free_study(extra); +#elif defined COMPILE_PCRE16 + pcre16_free_study(extra); +#elif defined COMPILE_PCRE32 + pcre32_free_study(extra); +#endif + extra = NULL; + } +#endif + } + +return extra; +} + + +/************************************************* +* Free the study data * +*************************************************/ + +/* This function frees the memory that was obtained by pcre_study(). + +Argument: a pointer to the pcre[16]_extra block +Returns: nothing +*/ + +#if defined COMPILE_PCRE8 +PCRE_EXP_DEFN void +pcre_free_study(pcre_extra *extra) +#elif defined COMPILE_PCRE16 +PCRE_EXP_DEFN void +pcre16_free_study(pcre16_extra *extra) +#elif defined COMPILE_PCRE32 +PCRE_EXP_DEFN void +pcre32_free_study(pcre32_extra *extra) +#endif +{ +if (extra == NULL) + return; +#ifdef SUPPORT_JIT +if ((extra->flags & PCRE_EXTRA_EXECUTABLE_JIT) != 0 && + extra->executable_jit != NULL) + PRIV(jit_free)(extra->executable_jit); +#endif +PUBL(free)(extra); +} + +/* End of pcre_study.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_tables.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_tables.c new file mode 100755 index 000000000..5e18e8cf9 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_tables.c @@ -0,0 +1,727 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2017 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +#ifndef PCRE_INCLUDED + +/* This module contains some fixed tables that are used by more than one of the +PCRE code modules. The tables are also #included by the pcretest program, which +uses macros to change their names from _pcre_xxx to xxxx, thereby avoiding name +clashes with the library. */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "pcre_internal.h" + +#endif /* PCRE_INCLUDED */ + +/* Table of sizes for the fixed-length opcodes. It's defined in a macro so that +the definition is next to the definition of the opcodes in pcre_internal.h. */ + +const pcre_uint8 PRIV(OP_lengths)[] = { OP_LENGTHS }; + +/* Tables of horizontal and vertical whitespace characters, suitable for +adding to classes. */ + +const pcre_uint32 PRIV(hspace_list)[] = { HSPACE_LIST }; +const pcre_uint32 PRIV(vspace_list)[] = { VSPACE_LIST }; + + + +/************************************************* +* Tables for UTF-8 support * +*************************************************/ + +/* These are the breakpoints for different numbers of bytes in a UTF-8 +character. */ + +#if (defined SUPPORT_UTF && defined COMPILE_PCRE8) \ + || (defined PCRE_INCLUDED && (defined SUPPORT_PCRE16 || defined SUPPORT_PCRE32)) + +/* These tables are also required by pcretest in 16- or 32-bit mode. */ + +const int PRIV(utf8_table1)[] = + { 0x7f, 0x7ff, 0xffff, 0x1fffff, 0x3ffffff, 0x7fffffff}; + +const int PRIV(utf8_table1_size) = sizeof(PRIV(utf8_table1)) / sizeof(int); + +/* These are the indicator bits and the mask for the data bits to set in the +first byte of a character, indexed by the number of additional bytes. */ + +const int PRIV(utf8_table2)[] = { 0, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc}; +const int PRIV(utf8_table3)[] = { 0xff, 0x1f, 0x0f, 0x07, 0x03, 0x01}; + +/* Table of the number of extra bytes, indexed by the first byte masked with +0x3f. The highest number for a valid UTF-8 first byte is in fact 0x3d. */ + +const pcre_uint8 PRIV(utf8_table4)[] = { + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5 }; + +#endif /* (SUPPORT_UTF && COMPILE_PCRE8) || (PCRE_INCLUDED && SUPPORT_PCRE[16|32])*/ + +#ifdef SUPPORT_UTF + +/* Table to translate from particular type value to the general value. */ + +const pcre_uint32 PRIV(ucp_gentype)[] = { + ucp_C, ucp_C, ucp_C, ucp_C, ucp_C, /* Cc, Cf, Cn, Co, Cs */ + ucp_L, ucp_L, ucp_L, ucp_L, ucp_L, /* Ll, Lu, Lm, Lo, Lt */ + ucp_M, ucp_M, ucp_M, /* Mc, Me, Mn */ + ucp_N, ucp_N, ucp_N, /* Nd, Nl, No */ + ucp_P, ucp_P, ucp_P, ucp_P, ucp_P, /* Pc, Pd, Pe, Pf, Pi */ + ucp_P, ucp_P, /* Ps, Po */ + ucp_S, ucp_S, ucp_S, ucp_S, /* Sc, Sk, Sm, So */ + ucp_Z, ucp_Z, ucp_Z /* Zl, Zp, Zs */ +}; + +/* This table encodes the rules for finding the end of an extended grapheme +cluster. Every code point has a grapheme break property which is one of the +ucp_gbXX values defined in ucp.h. The 2-dimensional table is indexed by the +properties of two adjacent code points. The left property selects a word from +the table, and the right property selects a bit from that word like this: + + ucp_gbtable[left-property] & (1 << right-property) + +The value is non-zero if a grapheme break is NOT permitted between the relevant +two code points. The breaking rules are as follows: + +1. Break at the start and end of text (pretty obviously). + +2. Do not break between a CR and LF; otherwise, break before and after + controls. + +3. Do not break Hangul syllable sequences, the rules for which are: + + L may be followed by L, V, LV or LVT + LV or V may be followed by V or T + LVT or T may be followed by T + +4. Do not break before extending characters. + +The next two rules are only for extended grapheme clusters (but that's what we +are implementing). + +5. Do not break before SpacingMarks. + +6. Do not break after Prepend characters. + +7. Otherwise, break everywhere. +*/ + +const pcre_uint32 PRIV(ucp_gbtable[]) = { + (1< 0x10ffff is not permitted +PCRE_UTF8_ERR14 3-byte character with value 0xd000-0xdfff is not permitted +PCRE_UTF8_ERR15 Overlong 2-byte sequence +PCRE_UTF8_ERR16 Overlong 3-byte sequence +PCRE_UTF8_ERR17 Overlong 4-byte sequence +PCRE_UTF8_ERR18 Overlong 5-byte sequence (won't ever occur) +PCRE_UTF8_ERR19 Overlong 6-byte sequence (won't ever occur) +PCRE_UTF8_ERR20 Isolated 0x80 byte (not within UTF-8 character) +PCRE_UTF8_ERR21 Byte with the illegal value 0xfe or 0xff +PCRE_UTF8_ERR22 Unused (was non-character) + +Arguments: + string points to the string + length length of string, or -1 if the string is zero-terminated + errp pointer to an error position offset variable + +Returns: = 0 if the string is a valid UTF-8 string + > 0 otherwise, setting the offset of the bad character +*/ + +int +PRIV(valid_utf)(PCRE_PUCHAR string, int length, int *erroroffset) +{ +#ifdef SUPPORT_UTF +register PCRE_PUCHAR p; + +if (length < 0) + { + for (p = string; *p != 0; p++); + length = (int)(p - string); + } + +for (p = string; length-- > 0; p++) + { + register pcre_uchar ab, c, d; + + c = *p; + if (c < 128) continue; /* ASCII character */ + + if (c < 0xc0) /* Isolated 10xx xxxx byte */ + { + *erroroffset = (int)(p - string); + return PCRE_UTF8_ERR20; + } + + if (c >= 0xfe) /* Invalid 0xfe or 0xff bytes */ + { + *erroroffset = (int)(p - string); + return PCRE_UTF8_ERR21; + } + + ab = PRIV(utf8_table4)[c & 0x3f]; /* Number of additional bytes */ + if (length < ab) + { + *erroroffset = (int)(p - string); /* Missing bytes */ + return ab - length; /* Codes ERR1 to ERR5 */ + } + length -= ab; /* Length remaining */ + + /* Check top bits in the second byte */ + + if (((d = *(++p)) & 0xc0) != 0x80) + { + *erroroffset = (int)(p - string) - 1; + return PCRE_UTF8_ERR6; + } + + /* For each length, check that the remaining bytes start with the 0x80 bit + set and not the 0x40 bit. Then check for an overlong sequence, and for the + excluded range 0xd800 to 0xdfff. */ + + switch (ab) + { + /* 2-byte character. No further bytes to check for 0x80. Check first byte + for for xx00 000x (overlong sequence). */ + + case 1: if ((c & 0x3e) == 0) + { + *erroroffset = (int)(p - string) - 1; + return PCRE_UTF8_ERR15; + } + break; + + /* 3-byte character. Check third byte for 0x80. Then check first 2 bytes + for 1110 0000, xx0x xxxx (overlong sequence) or + 1110 1101, 1010 xxxx (0xd800 - 0xdfff) */ + + case 2: + if ((*(++p) & 0xc0) != 0x80) /* Third byte */ + { + *erroroffset = (int)(p - string) - 2; + return PCRE_UTF8_ERR7; + } + if (c == 0xe0 && (d & 0x20) == 0) + { + *erroroffset = (int)(p - string) - 2; + return PCRE_UTF8_ERR16; + } + if (c == 0xed && d >= 0xa0) + { + *erroroffset = (int)(p - string) - 2; + return PCRE_UTF8_ERR14; + } + break; + + /* 4-byte character. Check 3rd and 4th bytes for 0x80. Then check first 2 + bytes for for 1111 0000, xx00 xxxx (overlong sequence), then check for a + character greater than 0x0010ffff (f4 8f bf bf) */ + + case 3: + if ((*(++p) & 0xc0) != 0x80) /* Third byte */ + { + *erroroffset = (int)(p - string) - 2; + return PCRE_UTF8_ERR7; + } + if ((*(++p) & 0xc0) != 0x80) /* Fourth byte */ + { + *erroroffset = (int)(p - string) - 3; + return PCRE_UTF8_ERR8; + } + if (c == 0xf0 && (d & 0x30) == 0) + { + *erroroffset = (int)(p - string) - 3; + return PCRE_UTF8_ERR17; + } + if (c > 0xf4 || (c == 0xf4 && d > 0x8f)) + { + *erroroffset = (int)(p - string) - 3; + return PCRE_UTF8_ERR13; + } + break; + + /* 5-byte and 6-byte characters are not allowed by RFC 3629, and will be + rejected by the length test below. However, we do the appropriate tests + here so that overlong sequences get diagnosed, and also in case there is + ever an option for handling these larger code points. */ + + /* 5-byte character. Check 3rd, 4th, and 5th bytes for 0x80. Then check for + 1111 1000, xx00 0xxx */ + + case 4: + if ((*(++p) & 0xc0) != 0x80) /* Third byte */ + { + *erroroffset = (int)(p - string) - 2; + return PCRE_UTF8_ERR7; + } + if ((*(++p) & 0xc0) != 0x80) /* Fourth byte */ + { + *erroroffset = (int)(p - string) - 3; + return PCRE_UTF8_ERR8; + } + if ((*(++p) & 0xc0) != 0x80) /* Fifth byte */ + { + *erroroffset = (int)(p - string) - 4; + return PCRE_UTF8_ERR9; + } + if (c == 0xf8 && (d & 0x38) == 0) + { + *erroroffset = (int)(p - string) - 4; + return PCRE_UTF8_ERR18; + } + break; + + /* 6-byte character. Check 3rd-6th bytes for 0x80. Then check for + 1111 1100, xx00 00xx. */ + + case 5: + if ((*(++p) & 0xc0) != 0x80) /* Third byte */ + { + *erroroffset = (int)(p - string) - 2; + return PCRE_UTF8_ERR7; + } + if ((*(++p) & 0xc0) != 0x80) /* Fourth byte */ + { + *erroroffset = (int)(p - string) - 3; + return PCRE_UTF8_ERR8; + } + if ((*(++p) & 0xc0) != 0x80) /* Fifth byte */ + { + *erroroffset = (int)(p - string) - 4; + return PCRE_UTF8_ERR9; + } + if ((*(++p) & 0xc0) != 0x80) /* Sixth byte */ + { + *erroroffset = (int)(p - string) - 5; + return PCRE_UTF8_ERR10; + } + if (c == 0xfc && (d & 0x3c) == 0) + { + *erroroffset = (int)(p - string) - 5; + return PCRE_UTF8_ERR19; + } + break; + } + + /* Character is valid under RFC 2279, but 4-byte and 5-byte characters are + excluded by RFC 3629. The pointer p is currently at the last byte of the + character. */ + + if (ab > 3) + { + *erroroffset = (int)(p - string) - ab; + return (ab == 4)? PCRE_UTF8_ERR11 : PCRE_UTF8_ERR12; + } + } + +#else /* Not SUPPORT_UTF */ +(void)(string); /* Keep picky compilers happy */ +(void)(length); +(void)(erroroffset); +#endif + +return PCRE_UTF8_ERR0; /* This indicates success */ +} + +/* End of pcre_valid_utf8.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_version.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_version.c new file mode 100755 index 000000000..ae86ff28b --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_version.c @@ -0,0 +1,98 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + + +/* This module contains the external function pcre_version(), which returns a +string that identifies the PCRE version that is in use. */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "pcre_internal.h" + + +/************************************************* +* Return version string * +*************************************************/ + +/* These macros are the standard way of turning unquoted text into C strings. +They allow macros like PCRE_MAJOR to be defined without quotes, which is +convenient for user programs that want to test its value. */ + +#define STRING(a) # a +#define XSTRING(s) STRING(s) + +/* A problem turned up with PCRE_PRERELEASE, which is defined empty for +production releases. Originally, it was used naively in this code: + + return XSTRING(PCRE_MAJOR) + "." XSTRING(PCRE_MINOR) + XSTRING(PCRE_PRERELEASE) + " " XSTRING(PCRE_DATE); + +However, when PCRE_PRERELEASE is empty, this leads to an attempted expansion of +STRING(). The C standard states: "If (before argument substitution) any +argument consists of no preprocessing tokens, the behavior is undefined." It +turns out the gcc treats this case as a single empty string - which is what we +really want - but Visual C grumbles about the lack of an argument for the +macro. Unfortunately, both are within their rights. To cope with both ways of +handling this, I had resort to some messy hackery that does a test at run time. +I could find no way of detecting that a macro is defined as an empty string at +pre-processor time. This hack uses a standard trick for avoiding calling +the STRING macro with an empty argument when doing the test. */ + +#if defined COMPILE_PCRE8 +PCRE_EXP_DEFN const char * PCRE_CALL_CONVENTION +pcre_version(void) +#elif defined COMPILE_PCRE16 +PCRE_EXP_DEFN const char * PCRE_CALL_CONVENTION +pcre16_version(void) +#elif defined COMPILE_PCRE32 +PCRE_EXP_DEFN const char * PCRE_CALL_CONVENTION +pcre32_version(void) +#endif +{ +return (XSTRING(Z PCRE_PRERELEASE)[1] == 0)? + XSTRING(PCRE_MAJOR.PCRE_MINOR PCRE_DATE) : + XSTRING(PCRE_MAJOR.PCRE_MINOR) XSTRING(PCRE_PRERELEASE PCRE_DATE); +} + +/* End of pcre_version.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_xclass.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_xclass.c new file mode 100755 index 000000000..ef759a589 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcre_xclass.c @@ -0,0 +1,268 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2013 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + + +/* This module contains an internal function that is used to match an extended +class. It is used by both pcre_exec() and pcre_def_exec(). */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "pcre_internal.h" + + +/************************************************* +* Match character against an XCLASS * +*************************************************/ + +/* This function is called to match a character against an extended class that +might contain values > 255 and/or Unicode properties. + +Arguments: + c the character + data points to the flag byte of the XCLASS data + +Returns: TRUE if character matches, else FALSE +*/ + +BOOL +PRIV(xclass)(pcre_uint32 c, const pcre_uchar *data, BOOL utf) +{ +pcre_uchar t; +BOOL negated = (*data & XCL_NOT) != 0; + +(void)utf; +#ifdef COMPILE_PCRE8 +/* In 8 bit mode, this must always be TRUE. Help the compiler to know that. */ +utf = TRUE; +#endif + +/* Character values < 256 are matched against a bitmap, if one is present. If +not, we still carry on, because there may be ranges that start below 256 in the +additional data. */ + +if (c < 256) + { + if ((*data & XCL_HASPROP) == 0) + { + if ((*data & XCL_MAP) == 0) return negated; + return (((pcre_uint8 *)(data + 1))[c/8] & (1 << (c&7))) != 0; + } + if ((*data & XCL_MAP) != 0 && + (((pcre_uint8 *)(data + 1))[c/8] & (1 << (c&7))) != 0) + return !negated; /* char found */ + } + +/* First skip the bit map if present. Then match against the list of Unicode +properties or large chars or ranges that end with a large char. We won't ever +encounter XCL_PROP or XCL_NOTPROP when UCP support is not compiled. */ + +if ((*data++ & XCL_MAP) != 0) data += 32 / sizeof(pcre_uchar); + +while ((t = *data++) != XCL_END) + { + pcre_uint32 x, y; + if (t == XCL_SINGLE) + { +#ifdef SUPPORT_UTF + if (utf) + { + GETCHARINC(x, data); /* macro generates multiple statements */ + } + else +#endif + x = *data++; + if (c == x) return !negated; + } + else if (t == XCL_RANGE) + { +#ifdef SUPPORT_UTF + if (utf) + { + GETCHARINC(x, data); /* macro generates multiple statements */ + GETCHARINC(y, data); /* macro generates multiple statements */ + } + else +#endif + { + x = *data++; + y = *data++; + } + if (c >= x && c <= y) return !negated; + } + +#ifdef SUPPORT_UCP + else /* XCL_PROP & XCL_NOTPROP */ + { + const ucd_record *prop = GET_UCD(c); + BOOL isprop = t == XCL_PROP; + + switch(*data) + { + case PT_ANY: + if (isprop) return !negated; + break; + + case PT_LAMP: + if ((prop->chartype == ucp_Lu || prop->chartype == ucp_Ll || + prop->chartype == ucp_Lt) == isprop) return !negated; + break; + + case PT_GC: + if ((data[1] == PRIV(ucp_gentype)[prop->chartype]) == isprop) + return !negated; + break; + + case PT_PC: + if ((data[1] == prop->chartype) == isprop) return !negated; + break; + + case PT_SC: + if ((data[1] == prop->script) == isprop) return !negated; + break; + + case PT_ALNUM: + if ((PRIV(ucp_gentype)[prop->chartype] == ucp_L || + PRIV(ucp_gentype)[prop->chartype] == ucp_N) == isprop) + return !negated; + break; + + /* Perl space used to exclude VT, but from Perl 5.18 it is included, + which means that Perl space and POSIX space are now identical. PCRE + was changed at release 8.34. */ + + case PT_SPACE: /* Perl space */ + case PT_PXSPACE: /* POSIX space */ + switch(c) + { + HSPACE_CASES: + VSPACE_CASES: + if (isprop) return !negated; + break; + + default: + if ((PRIV(ucp_gentype)[prop->chartype] == ucp_Z) == isprop) + return !negated; + break; + } + break; + + case PT_WORD: + if ((PRIV(ucp_gentype)[prop->chartype] == ucp_L || + PRIV(ucp_gentype)[prop->chartype] == ucp_N || c == CHAR_UNDERSCORE) + == isprop) + return !negated; + break; + + case PT_UCNC: + if (c < 0xa0) + { + if ((c == CHAR_DOLLAR_SIGN || c == CHAR_COMMERCIAL_AT || + c == CHAR_GRAVE_ACCENT) == isprop) + return !negated; + } + else + { + if ((c < 0xd800 || c > 0xdfff) == isprop) + return !negated; + } + break; + + /* The following three properties can occur only in an XCLASS, as there + is no \p or \P coding for them. */ + + /* Graphic character. Implement this as not Z (space or separator) and + not C (other), except for Cf (format) with a few exceptions. This seems + to be what Perl does. The exceptional characters are: + + U+061C Arabic Letter Mark + U+180E Mongolian Vowel Separator + U+2066 - U+2069 Various "isolate"s + */ + + case PT_PXGRAPH: + if ((PRIV(ucp_gentype)[prop->chartype] != ucp_Z && + (PRIV(ucp_gentype)[prop->chartype] != ucp_C || + (prop->chartype == ucp_Cf && + c != 0x061c && c != 0x180e && (c < 0x2066 || c > 0x2069)) + )) == isprop) + return !negated; + break; + + /* Printable character: same as graphic, with the addition of Zs, i.e. + not Zl and not Zp, and U+180E. */ + + case PT_PXPRINT: + if ((prop->chartype != ucp_Zl && + prop->chartype != ucp_Zp && + (PRIV(ucp_gentype)[prop->chartype] != ucp_C || + (prop->chartype == ucp_Cf && + c != 0x061c && (c < 0x2066 || c > 0x2069)) + )) == isprop) + return !negated; + break; + + /* Punctuation: all Unicode punctuation, plus ASCII characters that + Unicode treats as symbols rather than punctuation, for Perl + compatibility (these are $+<=>^`|~). */ + + case PT_PXPUNCT: + if ((PRIV(ucp_gentype)[prop->chartype] == ucp_P || + (c < 128 && PRIV(ucp_gentype)[prop->chartype] == ucp_S)) == isprop) + return !negated; + break; + + /* This should never occur, but compilers may mutter if there is no + default. */ + + default: + return FALSE; + } + + data += 2; + } +#endif /* SUPPORT_UCP */ + } + +return negated; /* char did not match */ +} + +/* End of pcre_xclass.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcrecpp.cc b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcrecpp.cc new file mode 100755 index 000000000..ce289afaf --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcrecpp.cc @@ -0,0 +1,986 @@ +// Copyright (c) 2010, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: Sanjay Ghemawat + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include /* for SHRT_MIN, USHRT_MAX, etc */ +#include /* for memcpy */ +#include +#include +#include +#include + +#include "pcrecpp_internal.h" +#include "pcre.h" +#include "pcrecpp.h" +#include "pcre_stringpiece.h" + + +namespace pcrecpp { + +// Maximum number of args we can set +static const int kMaxArgs = 16; +static const int kVecSize = (1 + kMaxArgs) * 3; // results + PCRE workspace + +// Special object that stands-in for no argument +Arg RE::no_arg((void*)NULL); + +// This is for ABI compatibility with old versions of pcre (pre-7.6), +// which defined a global no_arg variable instead of putting it in the +// RE class. This works on GCC >= 3, at least. It definitely works +// for ELF, but may not for other object formats (Mach-O, for +// instance, does not support aliases.) We could probably have a more +// inclusive test if we ever needed it. (Note that not only the +// __attribute__ syntax, but also __USER_LABEL_PREFIX__, are +// gnu-specific.) +#if defined(__GNUC__) && __GNUC__ >= 3 && defined(__ELF__) \ + && !defined(__INTEL_COMPILER) && !defined(__LCC__) +# define ULP_AS_STRING(x) ULP_AS_STRING_INTERNAL(x) +# define ULP_AS_STRING_INTERNAL(x) #x +# define USER_LABEL_PREFIX_STR ULP_AS_STRING(__USER_LABEL_PREFIX__) +extern Arg no_arg + __attribute__((alias(USER_LABEL_PREFIX_STR "_ZN7pcrecpp2RE6no_argE"))); +#endif + +// If a regular expression has no error, its error_ field points here +static const string empty_string; + +// If the user doesn't ask for any options, we just use this one +static RE_Options default_options; + +// Specials for the start of patterns. See comments where start_options is used +// below. (PH June 2018) +static const char *start_options[] = { + "(*UTF8)", + "(*UTF)", + "(*UCP)", + "(*NO_START_OPT)", + "(*NO_AUTO_POSSESS)", + "(*LIMIT_RECURSION=", + "(*LIMIT_MATCH=", + "(*CRLF)", + "(*LF)", + "(*CR)", + "(*BSR_UNICODE)", + "(*BSR_ANYCRLF)", + "(*ANYCRLF)", + "(*ANY)", + "" }; + +void RE::Init(const string& pat, const RE_Options* options) { + pattern_ = pat; + if (options == NULL) { + options_ = default_options; + } else { + options_ = *options; + } + error_ = &empty_string; + re_full_ = NULL; + re_partial_ = NULL; + + re_partial_ = Compile(UNANCHORED); + if (re_partial_ != NULL) { + re_full_ = Compile(ANCHOR_BOTH); + } +} + +void RE::Cleanup() { + if (re_full_ != NULL) (*pcre_free)(re_full_); + if (re_partial_ != NULL) (*pcre_free)(re_partial_); + if (error_ != &empty_string) delete error_; +} + + +RE::~RE() { + Cleanup(); +} + + +pcre* RE::Compile(Anchor anchor) { + // First, convert RE_Options into pcre options + int pcre_options = 0; + pcre_options = options_.all_options(); + + // Special treatment for anchoring. This is needed because at + // runtime pcre only provides an option for anchoring at the + // beginning of a string (unless you use offset). + // + // There are three types of anchoring we want: + // UNANCHORED Compile the original pattern, and use + // a pcre unanchored match. + // ANCHOR_START Compile the original pattern, and use + // a pcre anchored match. + // ANCHOR_BOTH Tack a "\z" to the end of the original pattern + // and use a pcre anchored match. + + const char* compile_error; + int eoffset; + pcre* re; + if (anchor != ANCHOR_BOTH) { + re = pcre_compile(pattern_.c_str(), pcre_options, + &compile_error, &eoffset, NULL); + } else { + // Tack a '\z' at the end of RE. Parenthesize it first so that + // the '\z' applies to all top-level alternatives in the regexp. + + /* When this code was written (for PCRE 6.0) it was enough just to + parenthesize the entire pattern. Unfortunately, when the feature of + starting patterns with (*UTF8) or (*CR) etc. was added to PCRE patterns, + this code was never updated. This bug was not noticed till 2018, long after + PCRE became obsolescent and its maintainer no longer around. Since PCRE is + frozen, I have added a hack to check for all the existing "start of + pattern" specials - knowing that no new ones will ever be added. I am not a + C++ programmer, so the code style is no doubt crude. It is also + inefficient, but is only run when the pattern starts with "(*". + PH June 2018. */ + + string wrapped = ""; + + if (pattern_.c_str()[0] == '(' && pattern_.c_str()[1] == '*') { + int kk, klen, kmat; + for (;;) { // Loop for any number of leading items + + for (kk = 0; start_options[kk][0] != 0; kk++) { + klen = strlen(start_options[kk]); + kmat = strncmp(pattern_.c_str(), start_options[kk], klen); + if (kmat >= 0) break; + } + if (kmat != 0) break; // Not found + + // If the item ended in "=" we must copy digits up to ")". + + if (start_options[kk][klen-1] == '=') { + while (isdigit(pattern_.c_str()[klen])) klen++; + if (pattern_.c_str()[klen] != ')') break; // Syntax error + klen++; + } + + // Move the item from the pattern to the start of the wrapped string. + + wrapped += pattern_.substr(0, klen); + pattern_.erase(0, klen); + } + } + + // Wrap the rest of the pattern. + + wrapped += "(?:"; // A non-counting grouping operator + wrapped += pattern_; + wrapped += ")\\z"; + re = pcre_compile(wrapped.c_str(), pcre_options, + &compile_error, &eoffset, NULL); + } + if (re == NULL) { + if (error_ == &empty_string) error_ = new string(compile_error); + } + return re; +} + +/***** Matching interfaces *****/ + +bool RE::FullMatch(const StringPiece& text, + const Arg& ptr1, + const Arg& ptr2, + const Arg& ptr3, + const Arg& ptr4, + const Arg& ptr5, + const Arg& ptr6, + const Arg& ptr7, + const Arg& ptr8, + const Arg& ptr9, + const Arg& ptr10, + const Arg& ptr11, + const Arg& ptr12, + const Arg& ptr13, + const Arg& ptr14, + const Arg& ptr15, + const Arg& ptr16) const { + const Arg* args[kMaxArgs]; + int n = 0; + if (&ptr1 == &no_arg) { goto done; } args[n++] = &ptr1; + if (&ptr2 == &no_arg) { goto done; } args[n++] = &ptr2; + if (&ptr3 == &no_arg) { goto done; } args[n++] = &ptr3; + if (&ptr4 == &no_arg) { goto done; } args[n++] = &ptr4; + if (&ptr5 == &no_arg) { goto done; } args[n++] = &ptr5; + if (&ptr6 == &no_arg) { goto done; } args[n++] = &ptr6; + if (&ptr7 == &no_arg) { goto done; } args[n++] = &ptr7; + if (&ptr8 == &no_arg) { goto done; } args[n++] = &ptr8; + if (&ptr9 == &no_arg) { goto done; } args[n++] = &ptr9; + if (&ptr10 == &no_arg) { goto done; } args[n++] = &ptr10; + if (&ptr11 == &no_arg) { goto done; } args[n++] = &ptr11; + if (&ptr12 == &no_arg) { goto done; } args[n++] = &ptr12; + if (&ptr13 == &no_arg) { goto done; } args[n++] = &ptr13; + if (&ptr14 == &no_arg) { goto done; } args[n++] = &ptr14; + if (&ptr15 == &no_arg) { goto done; } args[n++] = &ptr15; + if (&ptr16 == &no_arg) { goto done; } args[n++] = &ptr16; + done: + + int consumed; + int vec[kVecSize]; + return DoMatchImpl(text, ANCHOR_BOTH, &consumed, args, n, vec, kVecSize); +} + +bool RE::PartialMatch(const StringPiece& text, + const Arg& ptr1, + const Arg& ptr2, + const Arg& ptr3, + const Arg& ptr4, + const Arg& ptr5, + const Arg& ptr6, + const Arg& ptr7, + const Arg& ptr8, + const Arg& ptr9, + const Arg& ptr10, + const Arg& ptr11, + const Arg& ptr12, + const Arg& ptr13, + const Arg& ptr14, + const Arg& ptr15, + const Arg& ptr16) const { + const Arg* args[kMaxArgs]; + int n = 0; + if (&ptr1 == &no_arg) { goto done; } args[n++] = &ptr1; + if (&ptr2 == &no_arg) { goto done; } args[n++] = &ptr2; + if (&ptr3 == &no_arg) { goto done; } args[n++] = &ptr3; + if (&ptr4 == &no_arg) { goto done; } args[n++] = &ptr4; + if (&ptr5 == &no_arg) { goto done; } args[n++] = &ptr5; + if (&ptr6 == &no_arg) { goto done; } args[n++] = &ptr6; + if (&ptr7 == &no_arg) { goto done; } args[n++] = &ptr7; + if (&ptr8 == &no_arg) { goto done; } args[n++] = &ptr8; + if (&ptr9 == &no_arg) { goto done; } args[n++] = &ptr9; + if (&ptr10 == &no_arg) { goto done; } args[n++] = &ptr10; + if (&ptr11 == &no_arg) { goto done; } args[n++] = &ptr11; + if (&ptr12 == &no_arg) { goto done; } args[n++] = &ptr12; + if (&ptr13 == &no_arg) { goto done; } args[n++] = &ptr13; + if (&ptr14 == &no_arg) { goto done; } args[n++] = &ptr14; + if (&ptr15 == &no_arg) { goto done; } args[n++] = &ptr15; + if (&ptr16 == &no_arg) { goto done; } args[n++] = &ptr16; + done: + + int consumed; + int vec[kVecSize]; + return DoMatchImpl(text, UNANCHORED, &consumed, args, n, vec, kVecSize); +} + +bool RE::Consume(StringPiece* input, + const Arg& ptr1, + const Arg& ptr2, + const Arg& ptr3, + const Arg& ptr4, + const Arg& ptr5, + const Arg& ptr6, + const Arg& ptr7, + const Arg& ptr8, + const Arg& ptr9, + const Arg& ptr10, + const Arg& ptr11, + const Arg& ptr12, + const Arg& ptr13, + const Arg& ptr14, + const Arg& ptr15, + const Arg& ptr16) const { + const Arg* args[kMaxArgs]; + int n = 0; + if (&ptr1 == &no_arg) { goto done; } args[n++] = &ptr1; + if (&ptr2 == &no_arg) { goto done; } args[n++] = &ptr2; + if (&ptr3 == &no_arg) { goto done; } args[n++] = &ptr3; + if (&ptr4 == &no_arg) { goto done; } args[n++] = &ptr4; + if (&ptr5 == &no_arg) { goto done; } args[n++] = &ptr5; + if (&ptr6 == &no_arg) { goto done; } args[n++] = &ptr6; + if (&ptr7 == &no_arg) { goto done; } args[n++] = &ptr7; + if (&ptr8 == &no_arg) { goto done; } args[n++] = &ptr8; + if (&ptr9 == &no_arg) { goto done; } args[n++] = &ptr9; + if (&ptr10 == &no_arg) { goto done; } args[n++] = &ptr10; + if (&ptr11 == &no_arg) { goto done; } args[n++] = &ptr11; + if (&ptr12 == &no_arg) { goto done; } args[n++] = &ptr12; + if (&ptr13 == &no_arg) { goto done; } args[n++] = &ptr13; + if (&ptr14 == &no_arg) { goto done; } args[n++] = &ptr14; + if (&ptr15 == &no_arg) { goto done; } args[n++] = &ptr15; + if (&ptr16 == &no_arg) { goto done; } args[n++] = &ptr16; + done: + + int consumed; + int vec[kVecSize]; + if (DoMatchImpl(*input, ANCHOR_START, &consumed, + args, n, vec, kVecSize)) { + input->remove_prefix(consumed); + return true; + } else { + return false; + } +} + +bool RE::FindAndConsume(StringPiece* input, + const Arg& ptr1, + const Arg& ptr2, + const Arg& ptr3, + const Arg& ptr4, + const Arg& ptr5, + const Arg& ptr6, + const Arg& ptr7, + const Arg& ptr8, + const Arg& ptr9, + const Arg& ptr10, + const Arg& ptr11, + const Arg& ptr12, + const Arg& ptr13, + const Arg& ptr14, + const Arg& ptr15, + const Arg& ptr16) const { + const Arg* args[kMaxArgs]; + int n = 0; + if (&ptr1 == &no_arg) { goto done; } args[n++] = &ptr1; + if (&ptr2 == &no_arg) { goto done; } args[n++] = &ptr2; + if (&ptr3 == &no_arg) { goto done; } args[n++] = &ptr3; + if (&ptr4 == &no_arg) { goto done; } args[n++] = &ptr4; + if (&ptr5 == &no_arg) { goto done; } args[n++] = &ptr5; + if (&ptr6 == &no_arg) { goto done; } args[n++] = &ptr6; + if (&ptr7 == &no_arg) { goto done; } args[n++] = &ptr7; + if (&ptr8 == &no_arg) { goto done; } args[n++] = &ptr8; + if (&ptr9 == &no_arg) { goto done; } args[n++] = &ptr9; + if (&ptr10 == &no_arg) { goto done; } args[n++] = &ptr10; + if (&ptr11 == &no_arg) { goto done; } args[n++] = &ptr11; + if (&ptr12 == &no_arg) { goto done; } args[n++] = &ptr12; + if (&ptr13 == &no_arg) { goto done; } args[n++] = &ptr13; + if (&ptr14 == &no_arg) { goto done; } args[n++] = &ptr14; + if (&ptr15 == &no_arg) { goto done; } args[n++] = &ptr15; + if (&ptr16 == &no_arg) { goto done; } args[n++] = &ptr16; + done: + + int consumed; + int vec[kVecSize]; + if (DoMatchImpl(*input, UNANCHORED, &consumed, + args, n, vec, kVecSize)) { + input->remove_prefix(consumed); + return true; + } else { + return false; + } +} + +bool RE::Replace(const StringPiece& rewrite, + string *str) const { + int vec[kVecSize]; + int matches = TryMatch(*str, 0, UNANCHORED, true, vec, kVecSize); + if (matches == 0) + return false; + + string s; + if (!Rewrite(&s, rewrite, *str, vec, matches)) + return false; + + assert(vec[0] >= 0); + assert(vec[1] >= 0); + str->replace(vec[0], vec[1] - vec[0], s); + return true; +} + +// Returns PCRE_NEWLINE_CRLF, PCRE_NEWLINE_CR, or PCRE_NEWLINE_LF. +// Note that PCRE_NEWLINE_CRLF is defined to be P_N_CR | P_N_LF. +// Modified by PH to add PCRE_NEWLINE_ANY and PCRE_NEWLINE_ANYCRLF. + +static int NewlineMode(int pcre_options) { + // TODO: if we can make it threadsafe, cache this var + int newline_mode = 0; + /* if (newline_mode) return newline_mode; */ // do this once it's cached + if (pcre_options & (PCRE_NEWLINE_CRLF|PCRE_NEWLINE_CR|PCRE_NEWLINE_LF| + PCRE_NEWLINE_ANY|PCRE_NEWLINE_ANYCRLF)) { + newline_mode = (pcre_options & + (PCRE_NEWLINE_CRLF|PCRE_NEWLINE_CR|PCRE_NEWLINE_LF| + PCRE_NEWLINE_ANY|PCRE_NEWLINE_ANYCRLF)); + } else { + int newline; + pcre_config(PCRE_CONFIG_NEWLINE, &newline); + if (newline == 10) + newline_mode = PCRE_NEWLINE_LF; + else if (newline == 13) + newline_mode = PCRE_NEWLINE_CR; + else if (newline == 3338) + newline_mode = PCRE_NEWLINE_CRLF; + else if (newline == -1) + newline_mode = PCRE_NEWLINE_ANY; + else if (newline == -2) + newline_mode = PCRE_NEWLINE_ANYCRLF; + else + assert(NULL == "Unexpected return value from pcre_config(NEWLINE)"); + } + return newline_mode; +} + +int RE::GlobalReplace(const StringPiece& rewrite, + string *str) const { + int count = 0; + int vec[kVecSize]; + string out; + int start = 0; + bool last_match_was_empty_string = false; + + while (start <= static_cast(str->length())) { + // If the previous match was for the empty string, we shouldn't + // just match again: we'll match in the same way and get an + // infinite loop. Instead, we do the match in a special way: + // anchored -- to force another try at the same position -- + // and with a flag saying that this time, ignore empty matches. + // If this special match returns, that means there's a non-empty + // match at this position as well, and we can continue. If not, + // we do what perl does, and just advance by one. + // Notice that perl prints '@@@' for this; + // perl -le '$_ = "aa"; s/b*|aa/@/g; print' + int matches; + if (last_match_was_empty_string) { + matches = TryMatch(*str, start, ANCHOR_START, false, vec, kVecSize); + if (matches <= 0) { + int matchend = start + 1; // advance one character. + // If the current char is CR and we're in CRLF mode, skip LF too. + // Note it's better to call pcre_fullinfo() than to examine + // all_options(), since options_ could have changed bewteen + // compile-time and now, but this is simpler and safe enough. + // Modified by PH to add ANY and ANYCRLF. + if (matchend < static_cast(str->length()) && + (*str)[start] == '\r' && (*str)[matchend] == '\n' && + (NewlineMode(options_.all_options()) == PCRE_NEWLINE_CRLF || + NewlineMode(options_.all_options()) == PCRE_NEWLINE_ANY || + NewlineMode(options_.all_options()) == PCRE_NEWLINE_ANYCRLF)) { + matchend++; + } + // We also need to advance more than one char if we're in utf8 mode. +#ifdef SUPPORT_UTF + if (options_.utf8()) { + while (matchend < static_cast(str->length()) && + ((*str)[matchend] & 0xc0) == 0x80) + matchend++; + } +#endif + if (start < static_cast(str->length())) + out.append(*str, start, matchend - start); + start = matchend; + last_match_was_empty_string = false; + continue; + } + } else { + matches = TryMatch(*str, start, UNANCHORED, true, vec, kVecSize); + if (matches <= 0) + break; + } + int matchstart = vec[0], matchend = vec[1]; + assert(matchstart >= start); + assert(matchend >= matchstart); + out.append(*str, start, matchstart - start); + Rewrite(&out, rewrite, *str, vec, matches); + start = matchend; + count++; + last_match_was_empty_string = (matchstart == matchend); + } + + if (count == 0) + return 0; + + if (start < static_cast(str->length())) + out.append(*str, start, str->length() - start); + swap(out, *str); + return count; +} + +bool RE::Extract(const StringPiece& rewrite, + const StringPiece& text, + string *out) const { + int vec[kVecSize]; + int matches = TryMatch(text, 0, UNANCHORED, true, vec, kVecSize); + if (matches == 0) + return false; + out->erase(); + return Rewrite(out, rewrite, text, vec, matches); +} + +/*static*/ string RE::QuoteMeta(const StringPiece& unquoted) { + string result; + + // Escape any ascii character not in [A-Za-z_0-9]. + // + // Note that it's legal to escape a character even if it has no + // special meaning in a regular expression -- so this function does + // that. (This also makes it identical to the perl function of the + // same name; see `perldoc -f quotemeta`.) The one exception is + // escaping NUL: rather than doing backslash + NUL, like perl does, + // we do '\0', because pcre itself doesn't take embedded NUL chars. + for (int ii = 0; ii < unquoted.size(); ++ii) { + // Note that using 'isalnum' here raises the benchmark time from + // 32ns to 58ns: + if (unquoted[ii] == '\0') { + result += "\\0"; + } else if ((unquoted[ii] < 'a' || unquoted[ii] > 'z') && + (unquoted[ii] < 'A' || unquoted[ii] > 'Z') && + (unquoted[ii] < '0' || unquoted[ii] > '9') && + unquoted[ii] != '_' && + // If this is the part of a UTF8 or Latin1 character, we need + // to copy this byte without escaping. Experimentally this is + // what works correctly with the regexp library. + !(unquoted[ii] & 128)) { + result += '\\'; + result += unquoted[ii]; + } else { + result += unquoted[ii]; + } + } + + return result; +} + +/***** Actual matching and rewriting code *****/ + +int RE::TryMatch(const StringPiece& text, + int startpos, + Anchor anchor, + bool empty_ok, + int *vec, + int vecsize) const { + pcre* re = (anchor == ANCHOR_BOTH) ? re_full_ : re_partial_; + if (re == NULL) { + //fprintf(stderr, "Matching against invalid re: %s\n", error_->c_str()); + return 0; + } + + pcre_extra extra = { 0, 0, 0, 0, 0, 0, 0, 0 }; + if (options_.match_limit() > 0) { + extra.flags |= PCRE_EXTRA_MATCH_LIMIT; + extra.match_limit = options_.match_limit(); + } + if (options_.match_limit_recursion() > 0) { + extra.flags |= PCRE_EXTRA_MATCH_LIMIT_RECURSION; + extra.match_limit_recursion = options_.match_limit_recursion(); + } + + // int options = 0; + // Changed by PH as a result of bugzilla #1288 + int options = (options_.all_options() & PCRE_NO_UTF8_CHECK); + + if (anchor != UNANCHORED) + options |= PCRE_ANCHORED; + if (!empty_ok) + options |= PCRE_NOTEMPTY; + + int rc = pcre_exec(re, // The regular expression object + &extra, + (text.data() == NULL) ? "" : text.data(), + text.size(), + startpos, + options, + vec, + vecsize); + + // Handle errors + if (rc == PCRE_ERROR_NOMATCH) { + return 0; + } else if (rc < 0) { + //fprintf(stderr, "Unexpected return code: %d when matching '%s'\n", + // re, pattern_.c_str()); + return 0; + } else if (rc == 0) { + // pcre_exec() returns 0 as a special case when the number of + // capturing subpatterns exceeds the size of the vector. + // When this happens, there is a match and the output vector + // is filled, but we miss out on the positions of the extra subpatterns. + rc = vecsize / 2; + } + + return rc; +} + +bool RE::DoMatchImpl(const StringPiece& text, + Anchor anchor, + int* consumed, + const Arg* const* args, + int n, + int* vec, + int vecsize) const { + assert((1 + n) * 3 <= vecsize); // results + PCRE workspace + int matches = TryMatch(text, 0, anchor, true, vec, vecsize); + assert(matches >= 0); // TryMatch never returns negatives + if (matches == 0) + return false; + + *consumed = vec[1]; + + if (n == 0 || args == NULL) { + // We are not interested in results + return true; + } + + if (NumberOfCapturingGroups() < n) { + // RE has fewer capturing groups than number of arg pointers passed in + return false; + } + + // If we got here, we must have matched the whole pattern. + // We do not need (can not do) any more checks on the value of 'matches' here + // -- see the comment for TryMatch. + for (int i = 0; i < n; i++) { + const int start = vec[2*(i+1)]; + const int limit = vec[2*(i+1)+1]; + if (!args[i]->Parse(text.data() + start, limit-start)) { + // TODO: Should we indicate what the error was? + return false; + } + } + + return true; +} + +bool RE::DoMatch(const StringPiece& text, + Anchor anchor, + int* consumed, + const Arg* const args[], + int n) const { + assert(n >= 0); + size_t const vecsize = (1 + n) * 3; // results + PCRE workspace + // (as for kVecSize) + int space[21]; // use stack allocation for small vecsize (common case) + int* vec = vecsize <= 21 ? space : new int[vecsize]; + bool retval = DoMatchImpl(text, anchor, consumed, args, n, vec, (int)vecsize); + if (vec != space) delete [] vec; + return retval; +} + +bool RE::Rewrite(string *out, const StringPiece &rewrite, + const StringPiece &text, int *vec, int veclen) const { + for (const char *s = rewrite.data(), *end = s + rewrite.size(); + s < end; s++) { + int c = *s; + if (c == '\\') { + c = *++s; + if (isdigit(c)) { + int n = (c - '0'); + if (n >= veclen) { + //fprintf(stderr, requested group %d in regexp %.*s\n", + // n, rewrite.size(), rewrite.data()); + return false; + } + int start = vec[2 * n]; + if (start >= 0) + out->append(text.data() + start, vec[2 * n + 1] - start); + } else if (c == '\\') { + *out += '\\'; + } else { + //fprintf(stderr, "invalid rewrite pattern: %.*s\n", + // rewrite.size(), rewrite.data()); + return false; + } + } else { + *out += c; + } + } + return true; +} + +// Return the number of capturing subpatterns, or -1 if the +// regexp wasn't valid on construction. +int RE::NumberOfCapturingGroups() const { + if (re_partial_ == NULL) return -1; + + int result; + int pcre_retval = pcre_fullinfo(re_partial_, // The regular expression object + NULL, // We did not study the pattern + PCRE_INFO_CAPTURECOUNT, + &result); + assert(pcre_retval == 0); + return result; +} + +/***** Parsers for various types *****/ + +bool Arg::parse_null(const char* str, int n, void* dest) { + (void)str; + (void)n; + // We fail if somebody asked us to store into a non-NULL void* pointer + return (dest == NULL); +} + +bool Arg::parse_string(const char* str, int n, void* dest) { + if (dest == NULL) return true; + reinterpret_cast(dest)->assign(str, n); + return true; +} + +bool Arg::parse_stringpiece(const char* str, int n, void* dest) { + if (dest == NULL) return true; + reinterpret_cast(dest)->set(str, n); + return true; +} + +bool Arg::parse_char(const char* str, int n, void* dest) { + if (n != 1) return false; + if (dest == NULL) return true; + *(reinterpret_cast(dest)) = str[0]; + return true; +} + +bool Arg::parse_uchar(const char* str, int n, void* dest) { + if (n != 1) return false; + if (dest == NULL) return true; + *(reinterpret_cast(dest)) = str[0]; + return true; +} + +// Largest number spec that we are willing to parse +static const int kMaxNumberLength = 32; + +// REQUIRES "buf" must have length at least kMaxNumberLength+1 +// REQUIRES "n > 0" +// Copies "str" into "buf" and null-terminates if necessary. +// Returns one of: +// a. "str" if no termination is needed +// b. "buf" if the string was copied and null-terminated +// c. "" if the input was invalid and has no hope of being parsed +static const char* TerminateNumber(char* buf, const char* str, int n) { + if ((n > 0) && isspace(*str)) { + // We are less forgiving than the strtoxxx() routines and do not + // allow leading spaces. + return ""; + } + + // See if the character right after the input text may potentially + // look like a digit. + if (isdigit(str[n]) || + ((str[n] >= 'a') && (str[n] <= 'f')) || + ((str[n] >= 'A') && (str[n] <= 'F'))) { + if (n > kMaxNumberLength) return ""; // Input too big to be a valid number + memcpy(buf, str, n); + buf[n] = '\0'; + return buf; + } else { + // We can parse right out of the supplied string, so return it. + return str; + } +} + +bool Arg::parse_long_radix(const char* str, + int n, + void* dest, + int radix) { + if (n == 0) return false; + char buf[kMaxNumberLength+1]; + str = TerminateNumber(buf, str, n); + char* end; + errno = 0; + long r = strtol(str, &end, radix); + if (end != str + n) return false; // Leftover junk + if (errno) return false; + if (dest == NULL) return true; + *(reinterpret_cast(dest)) = r; + return true; +} + +bool Arg::parse_ulong_radix(const char* str, + int n, + void* dest, + int radix) { + if (n == 0) return false; + char buf[kMaxNumberLength+1]; + str = TerminateNumber(buf, str, n); + if (str[0] == '-') return false; // strtoul() on a negative number?! + char* end; + errno = 0; + unsigned long r = strtoul(str, &end, radix); + if (end != str + n) return false; // Leftover junk + if (errno) return false; + if (dest == NULL) return true; + *(reinterpret_cast(dest)) = r; + return true; +} + +bool Arg::parse_short_radix(const char* str, + int n, + void* dest, + int radix) { + long r; + if (!parse_long_radix(str, n, &r, radix)) return false; // Could not parse + if (r < SHRT_MIN || r > SHRT_MAX) return false; // Out of range + if (dest == NULL) return true; + *(reinterpret_cast(dest)) = static_cast(r); + return true; +} + +bool Arg::parse_ushort_radix(const char* str, + int n, + void* dest, + int radix) { + unsigned long r; + if (!parse_ulong_radix(str, n, &r, radix)) return false; // Could not parse + if (r > USHRT_MAX) return false; // Out of range + if (dest == NULL) return true; + *(reinterpret_cast(dest)) = static_cast(r); + return true; +} + +bool Arg::parse_int_radix(const char* str, + int n, + void* dest, + int radix) { + long r; + if (!parse_long_radix(str, n, &r, radix)) return false; // Could not parse + if (r < INT_MIN || r > INT_MAX) return false; // Out of range + if (dest == NULL) return true; + *(reinterpret_cast(dest)) = r; + return true; +} + +bool Arg::parse_uint_radix(const char* str, + int n, + void* dest, + int radix) { + unsigned long r; + if (!parse_ulong_radix(str, n, &r, radix)) return false; // Could not parse + if (r > UINT_MAX) return false; // Out of range + if (dest == NULL) return true; + *(reinterpret_cast(dest)) = r; + return true; +} + +bool Arg::parse_longlong_radix(const char* str, + int n, + void* dest, + int radix) { +#ifndef HAVE_LONG_LONG + return false; +#else + if (n == 0) return false; + char buf[kMaxNumberLength+1]; + str = TerminateNumber(buf, str, n); + char* end; + errno = 0; +#if defined HAVE_STRTOQ + long long r = strtoq(str, &end, radix); +#elif defined HAVE_STRTOLL + long long r = strtoll(str, &end, radix); +#elif defined HAVE__STRTOI64 + long long r = _strtoi64(str, &end, radix); +#elif defined HAVE_STRTOIMAX + long long r = strtoimax(str, &end, radix); +#else +#error parse_longlong_radix: cannot convert input to a long-long +#endif + if (end != str + n) return false; // Leftover junk + if (errno) return false; + if (dest == NULL) return true; + *(reinterpret_cast(dest)) = r; + return true; +#endif /* HAVE_LONG_LONG */ +} + +bool Arg::parse_ulonglong_radix(const char* str, + int n, + void* dest, + int radix) { +#ifndef HAVE_UNSIGNED_LONG_LONG + return false; +#else + if (n == 0) return false; + char buf[kMaxNumberLength+1]; + str = TerminateNumber(buf, str, n); + if (str[0] == '-') return false; // strtoull() on a negative number?! + char* end; + errno = 0; +#if defined HAVE_STRTOQ + unsigned long long r = strtouq(str, &end, radix); +#elif defined HAVE_STRTOLL + unsigned long long r = strtoull(str, &end, radix); +#elif defined HAVE__STRTOI64 + unsigned long long r = _strtoui64(str, &end, radix); +#elif defined HAVE_STRTOIMAX + unsigned long long r = strtoumax(str, &end, radix); +#else +#error parse_ulonglong_radix: cannot convert input to a long-long +#endif + if (end != str + n) return false; // Leftover junk + if (errno) return false; + if (dest == NULL) return true; + *(reinterpret_cast(dest)) = r; + return true; +#endif /* HAVE_UNSIGNED_LONG_LONG */ +} + +bool Arg::parse_double(const char* str, int n, void* dest) { + if (n == 0) return false; + static const int kMaxLength = 200; + char buf[kMaxLength]; + if (n >= kMaxLength) return false; + memcpy(buf, str, n); + buf[n] = '\0'; + errno = 0; + char* end; + double r = strtod(buf, &end); + if (end != buf + n) return false; // Leftover junk + if (errno) return false; + if (dest == NULL) return true; + *(reinterpret_cast(dest)) = r; + return true; +} + +bool Arg::parse_float(const char* str, int n, void* dest) { + double r; + if (!parse_double(str, n, &r)) return false; + if (dest == NULL) return true; + *(reinterpret_cast(dest)) = static_cast(r); + return true; +} + + +#define DEFINE_INTEGER_PARSERS(name) \ + bool Arg::parse_##name(const char* str, int n, void* dest) { \ + return parse_##name##_radix(str, n, dest, 10); \ + } \ + bool Arg::parse_##name##_hex(const char* str, int n, void* dest) { \ + return parse_##name##_radix(str, n, dest, 16); \ + } \ + bool Arg::parse_##name##_octal(const char* str, int n, void* dest) { \ + return parse_##name##_radix(str, n, dest, 8); \ + } \ + bool Arg::parse_##name##_cradix(const char* str, int n, void* dest) { \ + return parse_##name##_radix(str, n, dest, 0); \ + } + +DEFINE_INTEGER_PARSERS(short) /* */ +DEFINE_INTEGER_PARSERS(ushort) /* */ +DEFINE_INTEGER_PARSERS(int) /* Don't use semicolons after these */ +DEFINE_INTEGER_PARSERS(uint) /* statements because they can cause */ +DEFINE_INTEGER_PARSERS(long) /* compiler warnings if the checking */ +DEFINE_INTEGER_PARSERS(ulong) /* level is turned up high enough. */ +DEFINE_INTEGER_PARSERS(longlong) /* */ +DEFINE_INTEGER_PARSERS(ulonglong) /* */ + +#undef DEFINE_INTEGER_PARSERS + +} // namespace pcrecpp diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcrecpp.h b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcrecpp.h new file mode 100755 index 000000000..3e594b0d4 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcrecpp.h @@ -0,0 +1,710 @@ +// Copyright (c) 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: Sanjay Ghemawat +// Support for PCRE_XXX modifiers added by Giuseppe Maxia, July 2005 + +#ifndef _PCRECPP_H +#define _PCRECPP_H + +// C++ interface to the pcre regular-expression library. RE supports +// Perl-style regular expressions (with extensions like \d, \w, \s, +// ...). +// +// ----------------------------------------------------------------------- +// REGEXP SYNTAX: +// +// This module is part of the pcre library and hence supports its syntax +// for regular expressions. +// +// The syntax is pretty similar to Perl's. For those not familiar +// with Perl's regular expressions, here are some examples of the most +// commonly used extensions: +// +// "hello (\\w+) world" -- \w matches a "word" character +// "version (\\d+)" -- \d matches a digit +// "hello\\s+world" -- \s matches any whitespace character +// "\\b(\\w+)\\b" -- \b matches empty string at a word boundary +// "(?i)hello" -- (?i) turns on case-insensitive matching +// "/\\*(.*?)\\*/" -- .*? matches . minimum no. of times possible +// +// ----------------------------------------------------------------------- +// MATCHING INTERFACE: +// +// The "FullMatch" operation checks that supplied text matches a +// supplied pattern exactly. +// +// Example: successful match +// pcrecpp::RE re("h.*o"); +// re.FullMatch("hello"); +// +// Example: unsuccessful match (requires full match): +// pcrecpp::RE re("e"); +// !re.FullMatch("hello"); +// +// Example: creating a temporary RE object: +// pcrecpp::RE("h.*o").FullMatch("hello"); +// +// You can pass in a "const char*" or a "string" for "text". The +// examples below tend to use a const char*. +// +// You can, as in the different examples above, store the RE object +// explicitly in a variable or use a temporary RE object. The +// examples below use one mode or the other arbitrarily. Either +// could correctly be used for any of these examples. +// +// ----------------------------------------------------------------------- +// MATCHING WITH SUB-STRING EXTRACTION: +// +// You can supply extra pointer arguments to extract matched subpieces. +// +// Example: extracts "ruby" into "s" and 1234 into "i" +// int i; +// string s; +// pcrecpp::RE re("(\\w+):(\\d+)"); +// re.FullMatch("ruby:1234", &s, &i); +// +// Example: does not try to extract any extra sub-patterns +// re.FullMatch("ruby:1234", &s); +// +// Example: does not try to extract into NULL +// re.FullMatch("ruby:1234", NULL, &i); +// +// Example: integer overflow causes failure +// !re.FullMatch("ruby:1234567891234", NULL, &i); +// +// Example: fails because there aren't enough sub-patterns: +// !pcrecpp::RE("\\w+:\\d+").FullMatch("ruby:1234", &s); +// +// Example: fails because string cannot be stored in integer +// !pcrecpp::RE("(.*)").FullMatch("ruby", &i); +// +// The provided pointer arguments can be pointers to any scalar numeric +// type, or one of +// string (matched piece is copied to string) +// StringPiece (StringPiece is mutated to point to matched piece) +// T (where "bool T::ParseFrom(const char*, int)" exists) +// NULL (the corresponding matched sub-pattern is not copied) +// +// CAVEAT: An optional sub-pattern that does not exist in the matched +// string is assigned the empty string. Therefore, the following will +// return false (because the empty string is not a valid number): +// int number; +// pcrecpp::RE::FullMatch("abc", "[a-z]+(\\d+)?", &number); +// +// ----------------------------------------------------------------------- +// DO_MATCH +// +// The matching interface supports at most 16 arguments per call. +// If you need more, consider using the more general interface +// pcrecpp::RE::DoMatch(). See pcrecpp.h for the signature for DoMatch. +// +// ----------------------------------------------------------------------- +// PARTIAL MATCHES +// +// You can use the "PartialMatch" operation when you want the pattern +// to match any substring of the text. +// +// Example: simple search for a string: +// pcrecpp::RE("ell").PartialMatch("hello"); +// +// Example: find first number in a string: +// int number; +// pcrecpp::RE re("(\\d+)"); +// re.PartialMatch("x*100 + 20", &number); +// assert(number == 100); +// +// ----------------------------------------------------------------------- +// UTF-8 AND THE MATCHING INTERFACE: +// +// By default, pattern and text are plain text, one byte per character. +// The UTF8 flag, passed to the constructor, causes both pattern +// and string to be treated as UTF-8 text, still a byte stream but +// potentially multiple bytes per character. In practice, the text +// is likelier to be UTF-8 than the pattern, but the match returned +// may depend on the UTF8 flag, so always use it when matching +// UTF8 text. E.g., "." will match one byte normally but with UTF8 +// set may match up to three bytes of a multi-byte character. +// +// Example: +// pcrecpp::RE_Options options; +// options.set_utf8(); +// pcrecpp::RE re(utf8_pattern, options); +// re.FullMatch(utf8_string); +// +// Example: using the convenience function UTF8(): +// pcrecpp::RE re(utf8_pattern, pcrecpp::UTF8()); +// re.FullMatch(utf8_string); +// +// NOTE: The UTF8 option is ignored if pcre was not configured with the +// --enable-utf8 flag. +// +// ----------------------------------------------------------------------- +// PASSING MODIFIERS TO THE REGULAR EXPRESSION ENGINE +// +// PCRE defines some modifiers to change the behavior of the regular +// expression engine. +// The C++ wrapper defines an auxiliary class, RE_Options, as a vehicle +// to pass such modifiers to a RE class. +// +// Currently, the following modifiers are supported +// +// modifier description Perl corresponding +// +// PCRE_CASELESS case insensitive match /i +// PCRE_MULTILINE multiple lines match /m +// PCRE_DOTALL dot matches newlines /s +// PCRE_DOLLAR_ENDONLY $ matches only at end N/A +// PCRE_EXTRA strict escape parsing N/A +// PCRE_EXTENDED ignore whitespaces /x +// PCRE_UTF8 handles UTF8 chars built-in +// PCRE_UNGREEDY reverses * and *? N/A +// PCRE_NO_AUTO_CAPTURE disables matching parens N/A (*) +// +// (For a full account on how each modifier works, please check the +// PCRE API reference manual). +// +// (*) Both Perl and PCRE allow non matching parentheses by means of the +// "?:" modifier within the pattern itself. e.g. (?:ab|cd) does not +// capture, while (ab|cd) does. +// +// For each modifier, there are two member functions whose name is made +// out of the modifier in lowercase, without the "PCRE_" prefix. For +// instance, PCRE_CASELESS is handled by +// bool caseless(), +// which returns true if the modifier is set, and +// RE_Options & set_caseless(bool), +// which sets or unsets the modifier. +// +// Moreover, PCRE_EXTRA_MATCH_LIMIT can be accessed through the +// set_match_limit() and match_limit() member functions. +// Setting match_limit to a non-zero value will limit the executation of +// pcre to keep it from doing bad things like blowing the stack or taking +// an eternity to return a result. A value of 5000 is good enough to stop +// stack blowup in a 2MB thread stack. Setting match_limit to zero will +// disable match limiting. Alternately, you can set match_limit_recursion() +// which uses PCRE_EXTRA_MATCH_LIMIT_RECURSION to limit how much pcre +// recurses. match_limit() caps the number of matches pcre does; +// match_limit_recrusion() caps the depth of recursion. +// +// Normally, to pass one or more modifiers to a RE class, you declare +// a RE_Options object, set the appropriate options, and pass this +// object to a RE constructor. Example: +// +// RE_options opt; +// opt.set_caseless(true); +// +// if (RE("HELLO", opt).PartialMatch("hello world")) ... +// +// RE_options has two constructors. The default constructor takes no +// arguments and creates a set of flags that are off by default. +// +// The optional parameter 'option_flags' is to facilitate transfer +// of legacy code from C programs. This lets you do +// RE(pattern, RE_Options(PCRE_CASELESS|PCRE_MULTILINE)).PartialMatch(str); +// +// But new code is better off doing +// RE(pattern, +// RE_Options().set_caseless(true).set_multiline(true)).PartialMatch(str); +// (See below) +// +// If you are going to pass one of the most used modifiers, there are some +// convenience functions that return a RE_Options class with the +// appropriate modifier already set: +// CASELESS(), UTF8(), MULTILINE(), DOTALL(), EXTENDED() +// +// If you need to set several options at once, and you don't want to go +// through the pains of declaring a RE_Options object and setting several +// options, there is a parallel method that give you such ability on the +// fly. You can concatenate several set_xxxxx member functions, since each +// of them returns a reference to its class object. e.g.: to pass +// PCRE_CASELESS, PCRE_EXTENDED, and PCRE_MULTILINE to a RE with one +// statement, you may write +// +// RE(" ^ xyz \\s+ .* blah$", RE_Options() +// .set_caseless(true) +// .set_extended(true) +// .set_multiline(true)).PartialMatch(sometext); +// +// ----------------------------------------------------------------------- +// SCANNING TEXT INCREMENTALLY +// +// The "Consume" operation may be useful if you want to repeatedly +// match regular expressions at the front of a string and skip over +// them as they match. This requires use of the "StringPiece" type, +// which represents a sub-range of a real string. Like RE, StringPiece +// is defined in the pcrecpp namespace. +// +// Example: read lines of the form "var = value" from a string. +// string contents = ...; // Fill string somehow +// pcrecpp::StringPiece input(contents); // Wrap in a StringPiece +// +// string var; +// int value; +// pcrecpp::RE re("(\\w+) = (\\d+)\n"); +// while (re.Consume(&input, &var, &value)) { +// ...; +// } +// +// Each successful call to "Consume" will set "var/value", and also +// advance "input" so it points past the matched text. +// +// The "FindAndConsume" operation is similar to "Consume" but does not +// anchor your match at the beginning of the string. For example, you +// could extract all words from a string by repeatedly calling +// pcrecpp::RE("(\\w+)").FindAndConsume(&input, &word) +// +// ----------------------------------------------------------------------- +// PARSING HEX/OCTAL/C-RADIX NUMBERS +// +// By default, if you pass a pointer to a numeric value, the +// corresponding text is interpreted as a base-10 number. You can +// instead wrap the pointer with a call to one of the operators Hex(), +// Octal(), or CRadix() to interpret the text in another base. The +// CRadix operator interprets C-style "0" (base-8) and "0x" (base-16) +// prefixes, but defaults to base-10. +// +// Example: +// int a, b, c, d; +// pcrecpp::RE re("(.*) (.*) (.*) (.*)"); +// re.FullMatch("100 40 0100 0x40", +// pcrecpp::Octal(&a), pcrecpp::Hex(&b), +// pcrecpp::CRadix(&c), pcrecpp::CRadix(&d)); +// will leave 64 in a, b, c, and d. +// +// ----------------------------------------------------------------------- +// REPLACING PARTS OF STRINGS +// +// You can replace the first match of "pattern" in "str" with +// "rewrite". Within "rewrite", backslash-escaped digits (\1 to \9) +// can be used to insert text matching corresponding parenthesized +// group from the pattern. \0 in "rewrite" refers to the entire +// matching text. E.g., +// +// string s = "yabba dabba doo"; +// pcrecpp::RE("b+").Replace("d", &s); +// +// will leave "s" containing "yada dabba doo". The result is true if +// the pattern matches and a replacement occurs, or false otherwise. +// +// GlobalReplace() is like Replace(), except that it replaces all +// occurrences of the pattern in the string with the rewrite. +// Replacements are not subject to re-matching. E.g., +// +// string s = "yabba dabba doo"; +// pcrecpp::RE("b+").GlobalReplace("d", &s); +// +// will leave "s" containing "yada dada doo". It returns the number +// of replacements made. +// +// Extract() is like Replace(), except that if the pattern matches, +// "rewrite" is copied into "out" (an additional argument) with +// substitutions. The non-matching portions of "text" are ignored. +// Returns true iff a match occurred and the extraction happened +// successfully. If no match occurs, the string is left unaffected. + + +#include +#include +#include // defines the Arg class +// This isn't technically needed here, but we include it +// anyway so folks who include pcrecpp.h don't have to. +#include + +namespace pcrecpp { + +#define PCRE_SET_OR_CLEAR(b, o) \ + if (b) all_options_ |= (o); else all_options_ &= ~(o); \ + return *this + +#define PCRE_IS_SET(o) \ + (all_options_ & o) == o + +/***** Compiling regular expressions: the RE class *****/ + +// RE_Options allow you to set options to be passed along to pcre, +// along with other options we put on top of pcre. +// Only 9 modifiers, plus match_limit and match_limit_recursion, +// are supported now. +class PCRECPP_EXP_DEFN RE_Options { + public: + // constructor + RE_Options() : match_limit_(0), match_limit_recursion_(0), all_options_(0) {} + + // alternative constructor. + // To facilitate transfer of legacy code from C programs + // + // This lets you do + // RE(pattern, RE_Options(PCRE_CASELESS|PCRE_MULTILINE)).PartialMatch(str); + // But new code is better off doing + // RE(pattern, + // RE_Options().set_caseless(true).set_multiline(true)).PartialMatch(str); + RE_Options(int option_flags) : match_limit_(0), match_limit_recursion_(0), + all_options_(option_flags) {} + // we're fine with the default destructor, copy constructor, etc. + + // accessors and mutators + int match_limit() const { return match_limit_; }; + RE_Options &set_match_limit(int limit) { + match_limit_ = limit; + return *this; + } + + int match_limit_recursion() const { return match_limit_recursion_; }; + RE_Options &set_match_limit_recursion(int limit) { + match_limit_recursion_ = limit; + return *this; + } + + bool caseless() const { + return PCRE_IS_SET(PCRE_CASELESS); + } + RE_Options &set_caseless(bool x) { + PCRE_SET_OR_CLEAR(x, PCRE_CASELESS); + } + + bool multiline() const { + return PCRE_IS_SET(PCRE_MULTILINE); + } + RE_Options &set_multiline(bool x) { + PCRE_SET_OR_CLEAR(x, PCRE_MULTILINE); + } + + bool dotall() const { + return PCRE_IS_SET(PCRE_DOTALL); + } + RE_Options &set_dotall(bool x) { + PCRE_SET_OR_CLEAR(x, PCRE_DOTALL); + } + + bool extended() const { + return PCRE_IS_SET(PCRE_EXTENDED); + } + RE_Options &set_extended(bool x) { + PCRE_SET_OR_CLEAR(x, PCRE_EXTENDED); + } + + bool dollar_endonly() const { + return PCRE_IS_SET(PCRE_DOLLAR_ENDONLY); + } + RE_Options &set_dollar_endonly(bool x) { + PCRE_SET_OR_CLEAR(x, PCRE_DOLLAR_ENDONLY); + } + + bool extra() const { + return PCRE_IS_SET(PCRE_EXTRA); + } + RE_Options &set_extra(bool x) { + PCRE_SET_OR_CLEAR(x, PCRE_EXTRA); + } + + bool ungreedy() const { + return PCRE_IS_SET(PCRE_UNGREEDY); + } + RE_Options &set_ungreedy(bool x) { + PCRE_SET_OR_CLEAR(x, PCRE_UNGREEDY); + } + + bool utf8() const { + return PCRE_IS_SET(PCRE_UTF8); + } + RE_Options &set_utf8(bool x) { + PCRE_SET_OR_CLEAR(x, PCRE_UTF8); + } + + bool no_auto_capture() const { + return PCRE_IS_SET(PCRE_NO_AUTO_CAPTURE); + } + RE_Options &set_no_auto_capture(bool x) { + PCRE_SET_OR_CLEAR(x, PCRE_NO_AUTO_CAPTURE); + } + + RE_Options &set_all_options(int opt) { + all_options_ = opt; + return *this; + } + int all_options() const { + return all_options_ ; + } + + // TODO: add other pcre flags + + private: + int match_limit_; + int match_limit_recursion_; + int all_options_; +}; + +// These functions return some common RE_Options +static inline RE_Options UTF8() { + return RE_Options().set_utf8(true); +} + +static inline RE_Options CASELESS() { + return RE_Options().set_caseless(true); +} +static inline RE_Options MULTILINE() { + return RE_Options().set_multiline(true); +} + +static inline RE_Options DOTALL() { + return RE_Options().set_dotall(true); +} + +static inline RE_Options EXTENDED() { + return RE_Options().set_extended(true); +} + +// Interface for regular expression matching. Also corresponds to a +// pre-compiled regular expression. An "RE" object is safe for +// concurrent use by multiple threads. +class PCRECPP_EXP_DEFN RE { + public: + // We provide implicit conversions from strings so that users can + // pass in a string or a "const char*" wherever an "RE" is expected. + RE(const string& pat) { Init(pat, NULL); } + RE(const string& pat, const RE_Options& option) { Init(pat, &option); } + RE(const char* pat) { Init(pat, NULL); } + RE(const char* pat, const RE_Options& option) { Init(pat, &option); } + RE(const unsigned char* pat) { + Init(reinterpret_cast(pat), NULL); + } + RE(const unsigned char* pat, const RE_Options& option) { + Init(reinterpret_cast(pat), &option); + } + + // Copy constructor & assignment - note that these are expensive + // because they recompile the expression. + RE(const RE& re) { Init(re.pattern_, &re.options_); } + const RE& operator=(const RE& re) { + if (this != &re) { + Cleanup(); + + // This is the code that originally came from Google + // Init(re.pattern_.c_str(), &re.options_); + + // This is the replacement from Ari Pollak + Init(re.pattern_, &re.options_); + } + return *this; + } + + + ~RE(); + + // The string specification for this RE. E.g. + // RE re("ab*c?d+"); + // re.pattern(); // "ab*c?d+" + const string& pattern() const { return pattern_; } + + // If RE could not be created properly, returns an error string. + // Else returns the empty string. + const string& error() const { return *error_; } + + /***** The useful part: the matching interface *****/ + + // This is provided so one can do pattern.ReplaceAll() just as + // easily as ReplaceAll(pattern-text, ....) + + bool FullMatch(const StringPiece& text, + const Arg& ptr1 = no_arg, + const Arg& ptr2 = no_arg, + const Arg& ptr3 = no_arg, + const Arg& ptr4 = no_arg, + const Arg& ptr5 = no_arg, + const Arg& ptr6 = no_arg, + const Arg& ptr7 = no_arg, + const Arg& ptr8 = no_arg, + const Arg& ptr9 = no_arg, + const Arg& ptr10 = no_arg, + const Arg& ptr11 = no_arg, + const Arg& ptr12 = no_arg, + const Arg& ptr13 = no_arg, + const Arg& ptr14 = no_arg, + const Arg& ptr15 = no_arg, + const Arg& ptr16 = no_arg) const; + + bool PartialMatch(const StringPiece& text, + const Arg& ptr1 = no_arg, + const Arg& ptr2 = no_arg, + const Arg& ptr3 = no_arg, + const Arg& ptr4 = no_arg, + const Arg& ptr5 = no_arg, + const Arg& ptr6 = no_arg, + const Arg& ptr7 = no_arg, + const Arg& ptr8 = no_arg, + const Arg& ptr9 = no_arg, + const Arg& ptr10 = no_arg, + const Arg& ptr11 = no_arg, + const Arg& ptr12 = no_arg, + const Arg& ptr13 = no_arg, + const Arg& ptr14 = no_arg, + const Arg& ptr15 = no_arg, + const Arg& ptr16 = no_arg) const; + + bool Consume(StringPiece* input, + const Arg& ptr1 = no_arg, + const Arg& ptr2 = no_arg, + const Arg& ptr3 = no_arg, + const Arg& ptr4 = no_arg, + const Arg& ptr5 = no_arg, + const Arg& ptr6 = no_arg, + const Arg& ptr7 = no_arg, + const Arg& ptr8 = no_arg, + const Arg& ptr9 = no_arg, + const Arg& ptr10 = no_arg, + const Arg& ptr11 = no_arg, + const Arg& ptr12 = no_arg, + const Arg& ptr13 = no_arg, + const Arg& ptr14 = no_arg, + const Arg& ptr15 = no_arg, + const Arg& ptr16 = no_arg) const; + + bool FindAndConsume(StringPiece* input, + const Arg& ptr1 = no_arg, + const Arg& ptr2 = no_arg, + const Arg& ptr3 = no_arg, + const Arg& ptr4 = no_arg, + const Arg& ptr5 = no_arg, + const Arg& ptr6 = no_arg, + const Arg& ptr7 = no_arg, + const Arg& ptr8 = no_arg, + const Arg& ptr9 = no_arg, + const Arg& ptr10 = no_arg, + const Arg& ptr11 = no_arg, + const Arg& ptr12 = no_arg, + const Arg& ptr13 = no_arg, + const Arg& ptr14 = no_arg, + const Arg& ptr15 = no_arg, + const Arg& ptr16 = no_arg) const; + + bool Replace(const StringPiece& rewrite, + string *str) const; + + int GlobalReplace(const StringPiece& rewrite, + string *str) const; + + bool Extract(const StringPiece &rewrite, + const StringPiece &text, + string *out) const; + + // Escapes all potentially meaningful regexp characters in + // 'unquoted'. The returned string, used as a regular expression, + // will exactly match the original string. For example, + // 1.5-2.0? + // may become: + // 1\.5\-2\.0\? + // Note QuoteMeta behaves the same as perl's QuoteMeta function, + // *except* that it escapes the NUL character (\0) as backslash + 0, + // rather than backslash + NUL. + static string QuoteMeta(const StringPiece& unquoted); + + + /***** Generic matching interface *****/ + + // Type of match (TODO: Should be restructured as part of RE_Options) + enum Anchor { + UNANCHORED, // No anchoring + ANCHOR_START, // Anchor at start only + ANCHOR_BOTH // Anchor at start and end + }; + + // General matching routine. Stores the length of the match in + // "*consumed" if successful. + bool DoMatch(const StringPiece& text, + Anchor anchor, + int* consumed, + const Arg* const* args, int n) const; + + // Return the number of capturing subpatterns, or -1 if the + // regexp wasn't valid on construction. + int NumberOfCapturingGroups() const; + + // The default value for an argument, to indicate the end of the argument + // list. This must be used only in optional argument defaults. It should NOT + // be passed explicitly. Some people have tried to use it like this: + // + // FullMatch(x, y, &z, no_arg, &w); + // + // This is a mistake, and will not work. + static Arg no_arg; + + private: + + void Init(const string& pattern, const RE_Options* options); + void Cleanup(); + + // Match against "text", filling in "vec" (up to "vecsize" * 2/3) with + // pairs of integers for the beginning and end positions of matched + // text. The first pair corresponds to the entire matched text; + // subsequent pairs correspond, in order, to parentheses-captured + // matches. Returns the number of pairs (one more than the number of + // the last subpattern with a match) if matching was successful + // and zero if the match failed. + // I.e. for RE("(foo)|(bar)|(baz)") it will return 2, 3, and 4 when matching + // against "foo", "bar", and "baz" respectively. + // When matching RE("(foo)|hello") against "hello", it will return 1. + // But the values for all subpattern are filled in into "vec". + int TryMatch(const StringPiece& text, + int startpos, + Anchor anchor, + bool empty_ok, + int *vec, + int vecsize) const; + + // Append the "rewrite" string, with backslash subsitutions from "text" + // and "vec", to string "out". + bool Rewrite(string *out, + const StringPiece& rewrite, + const StringPiece& text, + int *vec, + int veclen) const; + + // internal implementation for DoMatch + bool DoMatchImpl(const StringPiece& text, + Anchor anchor, + int* consumed, + const Arg* const args[], + int n, + int* vec, + int vecsize) const; + + // Compile the regexp for the specified anchoring mode + pcre* Compile(Anchor anchor); + + string pattern_; + RE_Options options_; + pcre* re_full_; // For full matches + pcre* re_partial_; // For partial matches + const string* error_; // Error indicator (or points to empty string) +}; + +} // namespace pcrecpp + +#endif /* _PCRECPP_H */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcrecpp_internal.h b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcrecpp_internal.h new file mode 100755 index 000000000..827f9e04e --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcrecpp_internal.h @@ -0,0 +1,71 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* +Copyright (c) 2005, Google Inc. +All rights reserved. + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + + +#ifndef PCRECPP_INTERNAL_H +#define PCRECPP_INTERNAL_H + +/* When compiling a DLL for Windows, the exported symbols have to be declared +using some MS magic. I found some useful information on this web page: +http://msdn2.microsoft.com/en-us/library/y4h7bcy6(VS.80).aspx. According to the +information there, using __declspec(dllexport) without "extern" we have a +definition; with "extern" we have a declaration. The settings here override the +setting in pcre.h. We use: + + PCRECPP_EXP_DECL for declarations + PCRECPP_EXP_DEFN for definitions of exported functions + +*/ + +#ifndef PCRECPP_EXP_DECL +# ifdef _WIN32 +# ifndef PCRE_STATIC +# define PCRECPP_EXP_DECL extern __declspec(dllexport) +# define PCRECPP_EXP_DEFN __declspec(dllexport) +# else +# define PCRECPP_EXP_DECL extern +# define PCRECPP_EXP_DEFN +# endif +# else +# define PCRECPP_EXP_DECL extern +# define PCRECPP_EXP_DEFN +# endif +#endif + +#endif /* PCRECPP_INTERNAL_H */ + +/* End of pcrecpp_internal.h */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcrecpp_unittest.cc b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcrecpp_unittest.cc new file mode 100755 index 000000000..1fc01a042 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcrecpp_unittest.cc @@ -0,0 +1,1316 @@ +// -*- coding: utf-8 -*- +// +// Copyright (c) 2005 - 2010, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: Sanjay Ghemawat +// +// TODO: Test extractions for PartialMatch/Consume + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include /* for memset and strcmp */ +#include +#include +#include "pcrecpp.h" + +using std::string; +using pcrecpp::StringPiece; +using pcrecpp::RE; +using pcrecpp::RE_Options; +using pcrecpp::Hex; +using pcrecpp::Octal; +using pcrecpp::CRadix; + +static bool VERBOSE_TEST = false; + +// CHECK dies with a fatal error if condition is not true. It is *not* +// controlled by NDEBUG, so the check will be executed regardless of +// compilation mode. Therefore, it is safe to do things like: +// CHECK_EQ(fp->Write(x), 4) +#define CHECK(condition) do { \ + if (!(condition)) { \ + fprintf(stderr, "%s:%d: Check failed: %s\n", \ + __FILE__, __LINE__, #condition); \ + exit(1); \ + } \ +} while (0) + +#define CHECK_EQ(a, b) CHECK(a == b) + +static void Timing1(int num_iters) { + // Same pattern lots of times + RE pattern("ruby:\\d+"); + StringPiece p("ruby:1234"); + for (int j = num_iters; j > 0; j--) { + CHECK(pattern.FullMatch(p)); + } +} + +static void Timing2(int num_iters) { + // Same pattern lots of times + RE pattern("ruby:(\\d+)"); + int i; + for (int j = num_iters; j > 0; j--) { + CHECK(pattern.FullMatch("ruby:1234", &i)); + CHECK_EQ(i, 1234); + } +} + +static void Timing3(int num_iters) { + string text_string; + for (int j = num_iters; j > 0; j--) { + text_string += "this is another line\n"; + } + + RE line_matcher(".*\n"); + string line; + StringPiece text(text_string); + int counter = 0; + while (line_matcher.Consume(&text)) { + counter++; + } + printf("Matched %d lines\n", counter); +} + +#if 0 // uncomment this if you have a way of defining VirtualProcessSize() + +static void LeakTest() { + // Check for memory leaks + unsigned long long initial_size = 0; + for (int i = 0; i < 100000; i++) { + if (i == 50000) { + initial_size = VirtualProcessSize(); + printf("Size after 50000: %llu\n", initial_size); + } + char buf[100]; // definitely big enough + sprintf(buf, "pat%09d", i); + RE newre(buf); + } + uint64 final_size = VirtualProcessSize(); + printf("Size after 100000: %llu\n", final_size); + const double growth = double(final_size - initial_size) / final_size; + printf("Growth: %0.2f%%", growth * 100); + CHECK(growth < 0.02); // Allow < 2% growth +} + +#endif + +static void RadixTests() { + printf("Testing hex\n"); + +#define CHECK_HEX(type, value) \ + do { \ + type v; \ + CHECK(RE("([0-9a-fA-F]+)[uUlL]*").FullMatch(#value, Hex(&v))); \ + CHECK_EQ(v, 0x ## value); \ + CHECK(RE("([0-9a-fA-FxX]+)[uUlL]*").FullMatch("0x" #value, CRadix(&v))); \ + CHECK_EQ(v, 0x ## value); \ + } while(0) + + CHECK_HEX(short, 2bad); + CHECK_HEX(unsigned short, 2badU); + CHECK_HEX(int, dead); + CHECK_HEX(unsigned int, deadU); + CHECK_HEX(long, 7eadbeefL); + CHECK_HEX(unsigned long, deadbeefUL); +#ifdef HAVE_LONG_LONG + CHECK_HEX(long long, 12345678deadbeefLL); +#endif +#ifdef HAVE_UNSIGNED_LONG_LONG + CHECK_HEX(unsigned long long, cafebabedeadbeefULL); +#endif + +#undef CHECK_HEX + + printf("Testing octal\n"); + +#define CHECK_OCTAL(type, value) \ + do { \ + type v; \ + CHECK(RE("([0-7]+)[uUlL]*").FullMatch(#value, Octal(&v))); \ + CHECK_EQ(v, 0 ## value); \ + CHECK(RE("([0-9a-fA-FxX]+)[uUlL]*").FullMatch("0" #value, CRadix(&v))); \ + CHECK_EQ(v, 0 ## value); \ + } while(0) + + CHECK_OCTAL(short, 77777); + CHECK_OCTAL(unsigned short, 177777U); + CHECK_OCTAL(int, 17777777777); + CHECK_OCTAL(unsigned int, 37777777777U); + CHECK_OCTAL(long, 17777777777L); + CHECK_OCTAL(unsigned long, 37777777777UL); +#ifdef HAVE_LONG_LONG + CHECK_OCTAL(long long, 777777777777777777777LL); +#endif +#ifdef HAVE_UNSIGNED_LONG_LONG + CHECK_OCTAL(unsigned long long, 1777777777777777777777ULL); +#endif + +#undef CHECK_OCTAL + + printf("Testing decimal\n"); + +#define CHECK_DECIMAL(type, value) \ + do { \ + type v; \ + CHECK(RE("(-?[0-9]+)[uUlL]*").FullMatch(#value, &v)); \ + CHECK_EQ(v, value); \ + CHECK(RE("(-?[0-9a-fA-FxX]+)[uUlL]*").FullMatch(#value, CRadix(&v))); \ + CHECK_EQ(v, value); \ + } while(0) + + CHECK_DECIMAL(short, -1); + CHECK_DECIMAL(unsigned short, 9999); + CHECK_DECIMAL(int, -1000); + CHECK_DECIMAL(unsigned int, 12345U); + CHECK_DECIMAL(long, -10000000L); + CHECK_DECIMAL(unsigned long, 3083324652U); +#ifdef HAVE_LONG_LONG + CHECK_DECIMAL(long long, -100000000000000LL); +#endif +#ifdef HAVE_UNSIGNED_LONG_LONG + CHECK_DECIMAL(unsigned long long, 1234567890987654321ULL); +#endif + +#undef CHECK_DECIMAL + +} + +static void TestReplace() { + printf("Testing Replace\n"); + + struct ReplaceTest { + const char *regexp; + const char *rewrite; + const char *original; + const char *single; + const char *global; + int global_count; // the expected return value from ReplaceAll + }; + static const ReplaceTest tests[] = { + { "(qu|[b-df-hj-np-tv-z]*)([a-z]+)", + "\\2\\1ay", + "the quick brown fox jumps over the lazy dogs.", + "ethay quick brown fox jumps over the lazy dogs.", + "ethay ickquay ownbray oxfay umpsjay overay ethay azylay ogsday.", + 9 }, + { "\\w+", + "\\0-NOSPAM", + "paul.haahr@google.com", + "paul-NOSPAM.haahr@google.com", + "paul-NOSPAM.haahr-NOSPAM@google-NOSPAM.com-NOSPAM", + 4 }, + { "^", + "(START)", + "foo", + "(START)foo", + "(START)foo", + 1 }, + { "^", + "(START)", + "", + "(START)", + "(START)", + 1 }, + { "$", + "(END)", + "", + "(END)", + "(END)", + 1 }, + { "b", + "bb", + "ababababab", + "abbabababab", + "abbabbabbabbabb", + 5 }, + { "b", + "bb", + "bbbbbb", + "bbbbbbb", + "bbbbbbbbbbbb", + 6 }, + { "b+", + "bb", + "bbbbbb", + "bb", + "bb", + 1 }, + { "b*", + "bb", + "bbbbbb", + "bb", + "bbbb", + 2 }, + { "b*", + "bb", + "aaaaa", + "bbaaaaa", + "bbabbabbabbabbabb", + 6 }, + { "b*", + "bb", + "aa\naa\n", + "bbaa\naa\n", + "bbabbabb\nbbabbabb\nbb", + 7 }, + { "b*", + "bb", + "aa\raa\r", + "bbaa\raa\r", + "bbabbabb\rbbabbabb\rbb", + 7 }, + { "b*", + "bb", + "aa\r\naa\r\n", + "bbaa\r\naa\r\n", + "bbabbabb\r\nbbabbabb\r\nbb", + 7 }, + // Check empty-string matching (it's tricky!) + { "aa|b*", + "@", + "aa", + "@", + "@@", + 2 }, + { "b*|aa", + "@", + "aa", + "@aa", + "@@@", + 3 }, +#ifdef SUPPORT_UTF + { "b*", + "bb", + "\xE3\x83\x9B\xE3\x83\xBC\xE3\x83\xA0\xE3\x81\xB8", // utf8 + "bb\xE3\x83\x9B\xE3\x83\xBC\xE3\x83\xA0\xE3\x81\xB8", + "bb\xE3\x83\x9B""bb""\xE3\x83\xBC""bb""\xE3\x83\xA0""bb""\xE3\x81\xB8""bb", + 5 }, + { "b*", + "bb", + "\xE3\x83\x9B\r\n\xE3\x83\xBC\r\xE3\x83\xA0\n\xE3\x81\xB8\r\n", // utf8 + "bb\xE3\x83\x9B\r\n\xE3\x83\xBC\r\xE3\x83\xA0\n\xE3\x81\xB8\r\n", + ("bb\xE3\x83\x9B""bb\r\nbb""\xE3\x83\xBC""bb\rbb""\xE3\x83\xA0" + "bb\nbb""\xE3\x81\xB8""bb\r\nbb"), + 9 }, +#endif + { "", NULL, NULL, NULL, NULL, 0 } + }; + +#ifdef SUPPORT_UTF + const bool support_utf8 = true; +#else + const bool support_utf8 = false; +#endif + + for (const ReplaceTest *t = tests; t->original != NULL; ++t) { + RE re(t->regexp, RE_Options(PCRE_NEWLINE_CRLF).set_utf8(support_utf8)); + assert(re.error().empty()); + string one(t->original); + CHECK(re.Replace(t->rewrite, &one)); + CHECK_EQ(one, t->single); + string all(t->original); + const int replace_count = re.GlobalReplace(t->rewrite, &all); + CHECK_EQ(all, t->global); + CHECK_EQ(replace_count, t->global_count); + } + + // One final test: test \r\n replacement when we're not in CRLF mode + { + RE re("b*", RE_Options(PCRE_NEWLINE_CR).set_utf8(support_utf8)); + assert(re.error().empty()); + string all("aa\r\naa\r\n"); + CHECK_EQ(re.GlobalReplace("bb", &all), 9); + CHECK_EQ(all, string("bbabbabb\rbb\nbbabbabb\rbb\nbb")); + } + { + RE re("b*", RE_Options(PCRE_NEWLINE_LF).set_utf8(support_utf8)); + assert(re.error().empty()); + string all("aa\r\naa\r\n"); + CHECK_EQ(re.GlobalReplace("bb", &all), 9); + CHECK_EQ(all, string("bbabbabb\rbb\nbbabbabb\rbb\nbb")); + } + // TODO: test what happens when no PCRE_NEWLINE_* flag is set. + // Alas, the answer depends on how pcre was compiled. +} + +static void TestExtract() { + printf("Testing Extract\n"); + + string s; + + CHECK(RE("(.*)@([^.]*)").Extract("\\2!\\1", "boris@kremvax.ru", &s)); + CHECK_EQ(s, "kremvax!boris"); + + // check the RE interface as well + CHECK(RE(".*").Extract("'\\0'", "foo", &s)); + CHECK_EQ(s, "'foo'"); + CHECK(!RE("bar").Extract("'\\0'", "baz", &s)); + CHECK_EQ(s, "'foo'"); +} + +static void TestConsume() { + printf("Testing Consume\n"); + + string word; + + string s(" aaa b!@#$@#$cccc"); + StringPiece input(s); + + RE r("\\s*(\\w+)"); // matches a word, possibly proceeded by whitespace + CHECK(r.Consume(&input, &word)); + CHECK_EQ(word, "aaa"); + CHECK(r.Consume(&input, &word)); + CHECK_EQ(word, "b"); + CHECK(! r.Consume(&input, &word)); +} + +static void TestFindAndConsume() { + printf("Testing FindAndConsume\n"); + + string word; + + string s(" aaa b!@#$@#$cccc"); + StringPiece input(s); + + RE r("(\\w+)"); // matches a word + CHECK(r.FindAndConsume(&input, &word)); + CHECK_EQ(word, "aaa"); + CHECK(r.FindAndConsume(&input, &word)); + CHECK_EQ(word, "b"); + CHECK(r.FindAndConsume(&input, &word)); + CHECK_EQ(word, "cccc"); + CHECK(! r.FindAndConsume(&input, &word)); +} + +static void TestMatchNumberPeculiarity() { + printf("Testing match-number peculiarity\n"); + + string word1; + string word2; + string word3; + + RE r("(foo)|(bar)|(baz)"); + CHECK(r.PartialMatch("foo", &word1, &word2, &word3)); + CHECK_EQ(word1, "foo"); + CHECK_EQ(word2, ""); + CHECK_EQ(word3, ""); + CHECK(r.PartialMatch("bar", &word1, &word2, &word3)); + CHECK_EQ(word1, ""); + CHECK_EQ(word2, "bar"); + CHECK_EQ(word3, ""); + CHECK(r.PartialMatch("baz", &word1, &word2, &word3)); + CHECK_EQ(word1, ""); + CHECK_EQ(word2, ""); + CHECK_EQ(word3, "baz"); + CHECK(!r.PartialMatch("f", &word1, &word2, &word3)); + + string a; + CHECK(RE("(foo)|hello").FullMatch("hello", &a)); + CHECK_EQ(a, ""); +} + +static void TestRecursion() { + printf("Testing recursion\n"); + + // Get one string that passes (sometimes), one that never does. + string text_good("abcdefghijk"); + string text_bad("acdefghijkl"); + + // According to pcretest, matching text_good against (\w+)*b + // requires match_limit of at least 8192, and match_recursion_limit + // of at least 37. + + RE_Options options_ml; + options_ml.set_match_limit(8192); + RE re("(\\w+)*b", options_ml); + CHECK(re.PartialMatch(text_good) == true); + CHECK(re.PartialMatch(text_bad) == false); + CHECK(re.FullMatch(text_good) == false); + CHECK(re.FullMatch(text_bad) == false); + + options_ml.set_match_limit(1024); + RE re2("(\\w+)*b", options_ml); + CHECK(re2.PartialMatch(text_good) == false); // because of match_limit + CHECK(re2.PartialMatch(text_bad) == false); + CHECK(re2.FullMatch(text_good) == false); + CHECK(re2.FullMatch(text_bad) == false); + + RE_Options options_mlr; + options_mlr.set_match_limit_recursion(50); + RE re3("(\\w+)*b", options_mlr); + CHECK(re3.PartialMatch(text_good) == true); + CHECK(re3.PartialMatch(text_bad) == false); + CHECK(re3.FullMatch(text_good) == false); + CHECK(re3.FullMatch(text_bad) == false); + + options_mlr.set_match_limit_recursion(10); + RE re4("(\\w+)*b", options_mlr); + CHECK(re4.PartialMatch(text_good) == false); + CHECK(re4.PartialMatch(text_bad) == false); + CHECK(re4.FullMatch(text_good) == false); + CHECK(re4.FullMatch(text_bad) == false); +} + +// A meta-quoted string, interpreted as a pattern, should always match +// the original unquoted string. +static void TestQuoteMeta(string unquoted, RE_Options options = RE_Options()) { + string quoted = RE::QuoteMeta(unquoted); + RE re(quoted, options); + CHECK(re.FullMatch(unquoted)); +} + +// A string containing meaningful regexp characters, which is then meta- +// quoted, should not generally match a string the unquoted string does. +static void NegativeTestQuoteMeta(string unquoted, string should_not_match, + RE_Options options = RE_Options()) { + string quoted = RE::QuoteMeta(unquoted); + RE re(quoted, options); + CHECK(!re.FullMatch(should_not_match)); +} + +// Tests that quoted meta characters match their original strings, +// and that a few things that shouldn't match indeed do not. +static void TestQuotaMetaSimple() { + TestQuoteMeta("foo"); + TestQuoteMeta("foo.bar"); + TestQuoteMeta("foo\\.bar"); + TestQuoteMeta("[1-9]"); + TestQuoteMeta("1.5-2.0?"); + TestQuoteMeta("\\d"); + TestQuoteMeta("Who doesn't like ice cream?"); + TestQuoteMeta("((a|b)c?d*e+[f-h]i)"); + TestQuoteMeta("((?!)xxx).*yyy"); + TestQuoteMeta("(["); + TestQuoteMeta(string("foo\0bar", 7)); +} + +static void TestQuoteMetaSimpleNegative() { + NegativeTestQuoteMeta("foo", "bar"); + NegativeTestQuoteMeta("...", "bar"); + NegativeTestQuoteMeta("\\.", "."); + NegativeTestQuoteMeta("\\.", ".."); + NegativeTestQuoteMeta("(a)", "a"); + NegativeTestQuoteMeta("(a|b)", "a"); + NegativeTestQuoteMeta("(a|b)", "(a)"); + NegativeTestQuoteMeta("(a|b)", "a|b"); + NegativeTestQuoteMeta("[0-9]", "0"); + NegativeTestQuoteMeta("[0-9]", "0-9"); + NegativeTestQuoteMeta("[0-9]", "[9]"); + NegativeTestQuoteMeta("((?!)xxx)", "xxx"); +} + +static void TestQuoteMetaLatin1() { + TestQuoteMeta("3\xb2 = 9"); +} + +static void TestQuoteMetaUtf8() { +#ifdef SUPPORT_UTF + TestQuoteMeta("Pl\xc3\xa1\x63ido Domingo", pcrecpp::UTF8()); + TestQuoteMeta("xyz", pcrecpp::UTF8()); // No fancy utf8 + TestQuoteMeta("\xc2\xb0", pcrecpp::UTF8()); // 2-byte utf8 (degree symbol) + TestQuoteMeta("27\xc2\xb0 degrees", pcrecpp::UTF8()); // As a middle character + TestQuoteMeta("\xe2\x80\xb3", pcrecpp::UTF8()); // 3-byte utf8 (double prime) + TestQuoteMeta("\xf0\x9d\x85\x9f", pcrecpp::UTF8()); // 4-byte utf8 (music note) + TestQuoteMeta("27\xc2\xb0"); // Interpreted as Latin-1, but should still work + NegativeTestQuoteMeta("27\xc2\xb0", // 2-byte utf (degree symbol) + "27\\\xc2\\\xb0", + pcrecpp::UTF8()); +#endif +} + +static void TestQuoteMetaAll() { + printf("Testing QuoteMeta\n"); + TestQuotaMetaSimple(); + TestQuoteMetaSimpleNegative(); + TestQuoteMetaLatin1(); + TestQuoteMetaUtf8(); +} + +// +// Options tests contributed by +// Giuseppe Maxia, CTO, Stardata s.r.l. +// July 2005 +// +static void GetOneOptionResult( + const char *option_name, + const char *regex, + const char *str, + RE_Options options, + bool full, + string expected) { + + printf("Testing Option <%s>\n", option_name); + if(VERBOSE_TEST) + printf("/%s/ finds \"%s\" within \"%s\" \n", + regex, + expected.c_str(), + str); + string captured(""); + if (full) + RE(regex,options).FullMatch(str, &captured); + else + RE(regex,options).PartialMatch(str, &captured); + CHECK_EQ(captured, expected); +} + +static void TestOneOption( + const char *option_name, + const char *regex, + const char *str, + RE_Options options, + bool full, + bool assertive = true) { + + printf("Testing Option <%s>\n", option_name); + if (VERBOSE_TEST) + printf("'%s' %s /%s/ \n", + str, + (assertive? "matches" : "doesn't match"), + regex); + if (assertive) { + if (full) + CHECK(RE(regex,options).FullMatch(str)); + else + CHECK(RE(regex,options).PartialMatch(str)); + } else { + if (full) + CHECK(!RE(regex,options).FullMatch(str)); + else + CHECK(!RE(regex,options).PartialMatch(str)); + } +} + +static void Test_CASELESS() { + RE_Options options; + RE_Options options2; + + options.set_caseless(true); + TestOneOption("CASELESS (class)", "HELLO", "hello", options, false); + TestOneOption("CASELESS (class2)", "HELLO", "hello", options2.set_caseless(true), false); + TestOneOption("CASELESS (class)", "^[A-Z]+$", "Hello", options, false); + + TestOneOption("CASELESS (function)", "HELLO", "hello", pcrecpp::CASELESS(), false); + TestOneOption("CASELESS (function)", "^[A-Z]+$", "Hello", pcrecpp::CASELESS(), false); + options.set_caseless(false); + TestOneOption("no CASELESS", "HELLO", "hello", options, false, false); +} + +static void Test_MULTILINE() { + RE_Options options; + RE_Options options2; + const char *str = "HELLO\n" "cruel\n" "world\n"; + + options.set_multiline(true); + TestOneOption("MULTILINE (class)", "^cruel$", str, options, false); + TestOneOption("MULTILINE (class2)", "^cruel$", str, options2.set_multiline(true), false); + TestOneOption("MULTILINE (function)", "^cruel$", str, pcrecpp::MULTILINE(), false); + options.set_multiline(false); + TestOneOption("no MULTILINE", "^cruel$", str, options, false, false); +} + +static void Test_DOTALL() { + RE_Options options; + RE_Options options2; + const char *str = "HELLO\n" "cruel\n" "world"; + + options.set_dotall(true); + TestOneOption("DOTALL (class)", "HELLO.*world", str, options, true); + TestOneOption("DOTALL (class2)", "HELLO.*world", str, options2.set_dotall(true), true); + TestOneOption("DOTALL (function)", "HELLO.*world", str, pcrecpp::DOTALL(), true); + options.set_dotall(false); + TestOneOption("no DOTALL", "HELLO.*world", str, options, true, false); +} + +static void Test_DOLLAR_ENDONLY() { + RE_Options options; + RE_Options options2; + const char *str = "HELLO world\n"; + + TestOneOption("no DOLLAR_ENDONLY", "world$", str, options, false); + options.set_dollar_endonly(true); + TestOneOption("DOLLAR_ENDONLY 1", "world$", str, options, false, false); + TestOneOption("DOLLAR_ENDONLY 2", "world$", str, options2.set_dollar_endonly(true), false, false); +} + +static void Test_EXTRA() { + RE_Options options; + const char *str = "HELLO"; + + options.set_extra(true); + TestOneOption("EXTRA 1", "\\HELL\\O", str, options, true, false ); + TestOneOption("EXTRA 2", "\\HELL\\O", str, RE_Options().set_extra(true), true, false ); + options.set_extra(false); + TestOneOption("no EXTRA", "\\HELL\\O", str, options, true ); +} + +static void Test_EXTENDED() { + RE_Options options; + RE_Options options2; + const char *str = "HELLO world"; + + options.set_extended(true); + TestOneOption("EXTENDED (class)", "HELLO world", str, options, false, false); + TestOneOption("EXTENDED (class2)", "HELLO world", str, options2.set_extended(true), false, false); + TestOneOption("EXTENDED (class)", + "^ HE L{2} O " + "\\s+ " + "\\w+ $ ", + str, + options, + false); + + TestOneOption("EXTENDED (function)", "HELLO world", str, pcrecpp::EXTENDED(), false, false); + TestOneOption("EXTENDED (function)", + "^ HE L{2} O " + "\\s+ " + "\\w+ $ ", + str, + pcrecpp::EXTENDED(), + false); + + options.set_extended(false); + TestOneOption("no EXTENDED", "HELLO world", str, options, false); +} + +static void Test_NO_AUTO_CAPTURE() { + RE_Options options; + const char *str = "HELLO world"; + string captured; + + printf("Testing Option \n"); + if (VERBOSE_TEST) + printf("parentheses capture text\n"); + RE re("(world|universe)$", options); + CHECK(re.Extract("\\1", str , &captured)); + CHECK_EQ(captured, "world"); + options.set_no_auto_capture(true); + printf("testing Option \n"); + if (VERBOSE_TEST) + printf("parentheses do not capture text\n"); + re.Extract("\\1",str, &captured ); + CHECK_EQ(captured, "world"); +} + +static void Test_UNGREEDY() { + RE_Options options; + const char *str = "HELLO, 'this' is the 'world'"; + + options.set_ungreedy(true); + GetOneOptionResult("UNGREEDY 1", "('.*')", str, options, false, "'this'" ); + GetOneOptionResult("UNGREEDY 2", "('.*')", str, RE_Options().set_ungreedy(true), false, "'this'" ); + GetOneOptionResult("UNGREEDY", "('.*?')", str, options, false, "'this' is the 'world'" ); + + options.set_ungreedy(false); + GetOneOptionResult("no UNGREEDY", "('.*')", str, options, false, "'this' is the 'world'" ); + GetOneOptionResult("no UNGREEDY", "('.*?')", str, options, false, "'this'" ); +} + +static void Test_all_options() { + const char *str = "HELLO\n" "cruel\n" "world"; + RE_Options options; + options.set_all_options(PCRE_CASELESS | PCRE_DOTALL); + + TestOneOption("all_options (CASELESS|DOTALL)", "^hello.*WORLD", str , options, false); + options.set_all_options(0); + TestOneOption("all_options (0)", "^hello.*WORLD", str , options, false, false); + options.set_all_options(PCRE_MULTILINE | PCRE_EXTENDED); + + TestOneOption("all_options (MULTILINE|EXTENDED)", " ^ c r u e l $ ", str, options, false); + TestOneOption("all_options (MULTILINE|EXTENDED) with constructor", + " ^ c r u e l $ ", + str, + RE_Options(PCRE_MULTILINE | PCRE_EXTENDED), + false); + + TestOneOption("all_options (MULTILINE|EXTENDED) with concatenation", + " ^ c r u e l $ ", + str, + RE_Options() + .set_multiline(true) + .set_extended(true), + false); + + options.set_all_options(0); + TestOneOption("all_options (0)", "^ c r u e l $", str, options, false, false); + +} + +static void TestOptions() { + printf("Testing Options\n"); + Test_CASELESS(); + Test_MULTILINE(); + Test_DOTALL(); + Test_DOLLAR_ENDONLY(); + Test_EXTENDED(); + Test_NO_AUTO_CAPTURE(); + Test_UNGREEDY(); + Test_EXTRA(); + Test_all_options(); +} + +static void TestConstructors() { + printf("Testing constructors\n"); + + RE_Options options; + options.set_dotall(true); + const char *str = "HELLO\n" "cruel\n" "world"; + + RE orig("HELLO.*world", options); + CHECK(orig.FullMatch(str)); + + RE copy1(orig); + CHECK(copy1.FullMatch(str)); + + RE copy2("not a match"); + CHECK(!copy2.FullMatch(str)); + copy2 = copy1; + CHECK(copy2.FullMatch(str)); + copy2 = orig; + CHECK(copy2.FullMatch(str)); + + // Make sure when we assign to ourselves, nothing bad happens + orig = orig; + copy1 = copy1; + copy2 = copy2; + CHECK(orig.FullMatch(str)); + CHECK(copy1.FullMatch(str)); + CHECK(copy2.FullMatch(str)); +} + +int main(int argc, char** argv) { + // Treat any flag as --help + if (argc > 1 && argv[1][0] == '-') { + printf("Usage: %s [timing1|timing2|timing3 num-iters]\n" + " If 'timingX ###' is specified, run the given timing test\n" + " with the given number of iterations, rather than running\n" + " the default corectness test.\n", argv[0]); + return 0; + } + + if (argc > 1) { + if ( argc == 2 || atoi(argv[2]) == 0) { + printf("timing mode needs a num-iters argument\n"); + return 1; + } + if (!strcmp(argv[1], "timing1")) + Timing1(atoi(argv[2])); + else if (!strcmp(argv[1], "timing2")) + Timing2(atoi(argv[2])); + else if (!strcmp(argv[1], "timing3")) + Timing3(atoi(argv[2])); + else + printf("Unknown argument '%s'\n", argv[1]); + return 0; + } + + printf("PCRE C++ wrapper tests\n"); + printf("Testing FullMatch\n"); + + int i; + string s; + + /***** FullMatch with no args *****/ + + CHECK(RE("h.*o").FullMatch("hello")); + CHECK(!RE("h.*o").FullMatch("othello")); // Must be anchored at front + CHECK(!RE("h.*o").FullMatch("hello!")); // Must be anchored at end + CHECK(RE("a*").FullMatch("aaaa")); // Fullmatch with normal op + CHECK(RE("a*?").FullMatch("aaaa")); // Fullmatch with nongreedy op + CHECK(RE("a*?\\z").FullMatch("aaaa")); // Two unusual ops + + /***** FullMatch with args *****/ + + // Zero-arg + CHECK(RE("\\d+").FullMatch("1001")); + + // Single-arg + CHECK(RE("(\\d+)").FullMatch("1001", &i)); + CHECK_EQ(i, 1001); + CHECK(RE("(-?\\d+)").FullMatch("-123", &i)); + CHECK_EQ(i, -123); + CHECK(!RE("()\\d+").FullMatch("10", &i)); + CHECK(!RE("(\\d+)").FullMatch("1234567890123456789012345678901234567890", + &i)); + + // Digits surrounding integer-arg + CHECK(RE("1(\\d*)4").FullMatch("1234", &i)); + CHECK_EQ(i, 23); + CHECK(RE("(\\d)\\d+").FullMatch("1234", &i)); + CHECK_EQ(i, 1); + CHECK(RE("(-\\d)\\d+").FullMatch("-1234", &i)); + CHECK_EQ(i, -1); + CHECK(RE("(\\d)").PartialMatch("1234", &i)); + CHECK_EQ(i, 1); + CHECK(RE("(-\\d)").PartialMatch("-1234", &i)); + CHECK_EQ(i, -1); + + // String-arg + CHECK(RE("h(.*)o").FullMatch("hello", &s)); + CHECK_EQ(s, string("ell")); + + // StringPiece-arg + StringPiece sp; + CHECK(RE("(\\w+):(\\d+)").FullMatch("ruby:1234", &sp, &i)); + CHECK_EQ(sp.size(), 4); + CHECK(memcmp(sp.data(), "ruby", 4) == 0); + CHECK_EQ(i, 1234); + + // Multi-arg + CHECK(RE("(\\w+):(\\d+)").FullMatch("ruby:1234", &s, &i)); + CHECK_EQ(s, string("ruby")); + CHECK_EQ(i, 1234); + + // Ignore non-void* NULL arg + CHECK(RE("he(.*)lo").FullMatch("hello", (char*)NULL)); + CHECK(RE("h(.*)o").FullMatch("hello", (string*)NULL)); + CHECK(RE("h(.*)o").FullMatch("hello", (StringPiece*)NULL)); + CHECK(RE("(.*)").FullMatch("1234", (int*)NULL)); +#ifdef HAVE_LONG_LONG + CHECK(RE("(.*)").FullMatch("1234567890123456", (long long*)NULL)); +#endif + CHECK(RE("(.*)").FullMatch("123.4567890123456", (double*)NULL)); + CHECK(RE("(.*)").FullMatch("123.4567890123456", (float*)NULL)); + + // Fail on non-void* NULL arg if the match doesn't parse for the given type. + CHECK(!RE("h(.*)lo").FullMatch("hello", &s, (char*)NULL)); + CHECK(!RE("(.*)").FullMatch("hello", (int*)NULL)); + CHECK(!RE("(.*)").FullMatch("1234567890123456", (int*)NULL)); + CHECK(!RE("(.*)").FullMatch("hello", (double*)NULL)); + CHECK(!RE("(.*)").FullMatch("hello", (float*)NULL)); + + // Ignored arg + CHECK(RE("(\\w+)(:)(\\d+)").FullMatch("ruby:1234", &s, (void*)NULL, &i)); + CHECK_EQ(s, string("ruby")); + CHECK_EQ(i, 1234); + + // Type tests + { + char c; + CHECK(RE("(H)ello").FullMatch("Hello", &c)); + CHECK_EQ(c, 'H'); + } + { + unsigned char c; + CHECK(RE("(H)ello").FullMatch("Hello", &c)); + CHECK_EQ(c, static_cast('H')); + } + { + short v; + CHECK(RE("(-?\\d+)").FullMatch("100", &v)); CHECK_EQ(v, 100); + CHECK(RE("(-?\\d+)").FullMatch("-100", &v)); CHECK_EQ(v, -100); + CHECK(RE("(-?\\d+)").FullMatch("32767", &v)); CHECK_EQ(v, 32767); + CHECK(RE("(-?\\d+)").FullMatch("-32768", &v)); CHECK_EQ(v, -32768); + CHECK(!RE("(-?\\d+)").FullMatch("-32769", &v)); + CHECK(!RE("(-?\\d+)").FullMatch("32768", &v)); + } + { + unsigned short v; + CHECK(RE("(\\d+)").FullMatch("100", &v)); CHECK_EQ(v, 100); + CHECK(RE("(\\d+)").FullMatch("32767", &v)); CHECK_EQ(v, 32767); + CHECK(RE("(\\d+)").FullMatch("65535", &v)); CHECK_EQ(v, 65535); + CHECK(!RE("(\\d+)").FullMatch("65536", &v)); + } + { + int v; + static const int max_value = 0x7fffffff; + static const int min_value = -max_value - 1; + CHECK(RE("(-?\\d+)").FullMatch("100", &v)); CHECK_EQ(v, 100); + CHECK(RE("(-?\\d+)").FullMatch("-100", &v)); CHECK_EQ(v, -100); + CHECK(RE("(-?\\d+)").FullMatch("2147483647", &v)); CHECK_EQ(v, max_value); + CHECK(RE("(-?\\d+)").FullMatch("-2147483648", &v)); CHECK_EQ(v, min_value); + CHECK(!RE("(-?\\d+)").FullMatch("-2147483649", &v)); + CHECK(!RE("(-?\\d+)").FullMatch("2147483648", &v)); + } + { + unsigned int v; + static const unsigned int max_value = 0xfffffffful; + CHECK(RE("(\\d+)").FullMatch("100", &v)); CHECK_EQ(v, 100); + CHECK(RE("(\\d+)").FullMatch("4294967295", &v)); CHECK_EQ(v, max_value); + CHECK(!RE("(\\d+)").FullMatch("4294967296", &v)); + } +#ifdef HAVE_LONG_LONG +# if defined(__MINGW__) || defined(__MINGW32__) +# define LLD "%I64d" +# define LLU "%I64u" +# else +# define LLD "%lld" +# define LLU "%llu" +# endif + { + long long v; + static const long long max_value = 0x7fffffffffffffffLL; + static const long long min_value = -max_value - 1; + char buf[32]; // definitely big enough for a long long + + CHECK(RE("(-?\\d+)").FullMatch("100", &v)); CHECK_EQ(v, 100); + CHECK(RE("(-?\\d+)").FullMatch("-100",&v)); CHECK_EQ(v, -100); + + sprintf(buf, LLD, max_value); + CHECK(RE("(-?\\d+)").FullMatch(buf,&v)); CHECK_EQ(v, max_value); + + sprintf(buf, LLD, min_value); + CHECK(RE("(-?\\d+)").FullMatch(buf,&v)); CHECK_EQ(v, min_value); + + sprintf(buf, LLD, max_value); + assert(buf[strlen(buf)-1] != '9'); + buf[strlen(buf)-1]++; + CHECK(!RE("(-?\\d+)").FullMatch(buf, &v)); + + sprintf(buf, LLD, min_value); + assert(buf[strlen(buf)-1] != '9'); + buf[strlen(buf)-1]++; + CHECK(!RE("(-?\\d+)").FullMatch(buf, &v)); + } +#endif +#if defined HAVE_UNSIGNED_LONG_LONG && defined HAVE_LONG_LONG + { + unsigned long long v; + long long v2; + static const unsigned long long max_value = 0xffffffffffffffffULL; + char buf[32]; // definitely big enough for a unsigned long long + + CHECK(RE("(-?\\d+)").FullMatch("100",&v)); CHECK_EQ(v, 100); + CHECK(RE("(-?\\d+)").FullMatch("-100",&v2)); CHECK_EQ(v2, -100); + + sprintf(buf, LLU, max_value); + CHECK(RE("(-?\\d+)").FullMatch(buf,&v)); CHECK_EQ(v, max_value); + + assert(buf[strlen(buf)-1] != '9'); + buf[strlen(buf)-1]++; + CHECK(!RE("(-?\\d+)").FullMatch(buf, &v)); + } +#endif + { + float v; + CHECK(RE("(.*)").FullMatch("100", &v)); + CHECK(RE("(.*)").FullMatch("-100.", &v)); + CHECK(RE("(.*)").FullMatch("1e23", &v)); + } + { + double v; + CHECK(RE("(.*)").FullMatch("100", &v)); + CHECK(RE("(.*)").FullMatch("-100.", &v)); + CHECK(RE("(.*)").FullMatch("1e23", &v)); + } + + // Check that matching is fully anchored + CHECK(!RE("(\\d+)").FullMatch("x1001", &i)); + CHECK(!RE("(\\d+)").FullMatch("1001x", &i)); + CHECK(RE("x(\\d+)").FullMatch("x1001", &i)); CHECK_EQ(i, 1001); + CHECK(RE("(\\d+)x").FullMatch("1001x", &i)); CHECK_EQ(i, 1001); + + // Braces + CHECK(RE("[0-9a-f+.-]{5,}").FullMatch("0abcd")); + CHECK(RE("[0-9a-f+.-]{5,}").FullMatch("0abcde")); + CHECK(!RE("[0-9a-f+.-]{5,}").FullMatch("0abc")); + + // Complicated RE + CHECK(RE("foo|bar|[A-Z]").FullMatch("foo")); + CHECK(RE("foo|bar|[A-Z]").FullMatch("bar")); + CHECK(RE("foo|bar|[A-Z]").FullMatch("X")); + CHECK(!RE("foo|bar|[A-Z]").FullMatch("XY")); + + // Check full-match handling (needs '$' tacked on internally) + CHECK(RE("fo|foo").FullMatch("fo")); + CHECK(RE("fo|foo").FullMatch("foo")); + CHECK(RE("fo|foo$").FullMatch("fo")); + CHECK(RE("fo|foo$").FullMatch("foo")); + CHECK(RE("foo$").FullMatch("foo")); + CHECK(!RE("foo\\$").FullMatch("foo$bar")); + CHECK(!RE("fo|bar").FullMatch("fox")); + + // Uncomment the following if we change the handling of '$' to + // prevent it from matching a trailing newline + if (false) { + // Check that we don't get bitten by pcre's special handling of a + // '\n' at the end of the string matching '$' + CHECK(!RE("foo$").PartialMatch("foo\n")); + } + + // Number of args + int a[16]; + CHECK(RE("").FullMatch("")); + + memset(a, 0, sizeof(0)); + CHECK(RE("(\\d){1}").FullMatch("1", + &a[0])); + CHECK_EQ(a[0], 1); + + memset(a, 0, sizeof(0)); + CHECK(RE("(\\d)(\\d)").FullMatch("12", + &a[0], &a[1])); + CHECK_EQ(a[0], 1); + CHECK_EQ(a[1], 2); + + memset(a, 0, sizeof(0)); + CHECK(RE("(\\d)(\\d)(\\d)").FullMatch("123", + &a[0], &a[1], &a[2])); + CHECK_EQ(a[0], 1); + CHECK_EQ(a[1], 2); + CHECK_EQ(a[2], 3); + + memset(a, 0, sizeof(0)); + CHECK(RE("(\\d)(\\d)(\\d)(\\d)").FullMatch("1234", + &a[0], &a[1], &a[2], &a[3])); + CHECK_EQ(a[0], 1); + CHECK_EQ(a[1], 2); + CHECK_EQ(a[2], 3); + CHECK_EQ(a[3], 4); + + memset(a, 0, sizeof(0)); + CHECK(RE("(\\d)(\\d)(\\d)(\\d)(\\d)").FullMatch("12345", + &a[0], &a[1], &a[2], + &a[3], &a[4])); + CHECK_EQ(a[0], 1); + CHECK_EQ(a[1], 2); + CHECK_EQ(a[2], 3); + CHECK_EQ(a[3], 4); + CHECK_EQ(a[4], 5); + + memset(a, 0, sizeof(0)); + CHECK(RE("(\\d)(\\d)(\\d)(\\d)(\\d)(\\d)").FullMatch("123456", + &a[0], &a[1], &a[2], + &a[3], &a[4], &a[5])); + CHECK_EQ(a[0], 1); + CHECK_EQ(a[1], 2); + CHECK_EQ(a[2], 3); + CHECK_EQ(a[3], 4); + CHECK_EQ(a[4], 5); + CHECK_EQ(a[5], 6); + + memset(a, 0, sizeof(0)); + CHECK(RE("(\\d)(\\d)(\\d)(\\d)(\\d)(\\d)(\\d)").FullMatch("1234567", + &a[0], &a[1], &a[2], &a[3], + &a[4], &a[5], &a[6])); + CHECK_EQ(a[0], 1); + CHECK_EQ(a[1], 2); + CHECK_EQ(a[2], 3); + CHECK_EQ(a[3], 4); + CHECK_EQ(a[4], 5); + CHECK_EQ(a[5], 6); + CHECK_EQ(a[6], 7); + + memset(a, 0, sizeof(0)); + CHECK(RE("(\\d)(\\d)(\\d)(\\d)(\\d)(\\d)(\\d)(\\d)" + "(\\d)(\\d)(\\d)(\\d)(\\d)(\\d)(\\d)(\\d)").FullMatch( + "1234567890123456", + &a[0], &a[1], &a[2], &a[3], + &a[4], &a[5], &a[6], &a[7], + &a[8], &a[9], &a[10], &a[11], + &a[12], &a[13], &a[14], &a[15])); + CHECK_EQ(a[0], 1); + CHECK_EQ(a[1], 2); + CHECK_EQ(a[2], 3); + CHECK_EQ(a[3], 4); + CHECK_EQ(a[4], 5); + CHECK_EQ(a[5], 6); + CHECK_EQ(a[6], 7); + CHECK_EQ(a[7], 8); + CHECK_EQ(a[8], 9); + CHECK_EQ(a[9], 0); + CHECK_EQ(a[10], 1); + CHECK_EQ(a[11], 2); + CHECK_EQ(a[12], 3); + CHECK_EQ(a[13], 4); + CHECK_EQ(a[14], 5); + CHECK_EQ(a[15], 6); + + /***** PartialMatch *****/ + + printf("Testing PartialMatch\n"); + + CHECK(RE("h.*o").PartialMatch("hello")); + CHECK(RE("h.*o").PartialMatch("othello")); + CHECK(RE("h.*o").PartialMatch("hello!")); + CHECK(RE("((((((((((((((((((((x))))))))))))))))))))").PartialMatch("x")); + + /***** other tests *****/ + + RadixTests(); + TestReplace(); + TestExtract(); + TestConsume(); + TestFindAndConsume(); + TestQuoteMetaAll(); + TestMatchNumberPeculiarity(); + + // Check the pattern() accessor + { + const string kPattern = "http://([^/]+)/.*"; + const RE re(kPattern); + CHECK_EQ(kPattern, re.pattern()); + } + + // Check RE error field. + { + RE re("foo"); + CHECK(re.error().empty()); // Must have no error + } + +#ifdef SUPPORT_UTF + // Check UTF-8 handling + { + printf("Testing UTF-8 handling\n"); + + // Three Japanese characters (nihongo) + const unsigned char utf8_string[] = { + 0xe6, 0x97, 0xa5, // 65e5 + 0xe6, 0x9c, 0xac, // 627c + 0xe8, 0xaa, 0x9e, // 8a9e + 0 + }; + const unsigned char utf8_pattern[] = { + '.', + 0xe6, 0x9c, 0xac, // 627c + '.', + 0 + }; + + // Both should match in either mode, bytes or UTF-8 + RE re_test1("........."); + CHECK(re_test1.FullMatch(utf8_string)); + RE re_test2("...", pcrecpp::UTF8()); + CHECK(re_test2.FullMatch(utf8_string)); + + // PH added these tests for leading option settings + + RE re_testZ0("(*CR)(*NO_START_OPT)........."); + CHECK(re_testZ0.FullMatch(utf8_string)); + +#ifdef SUPPORT_UTF + RE re_testZ1("(*UTF8)..."); + CHECK(re_testZ1.FullMatch(utf8_string)); + + RE re_testZ2("(*UTF)..."); + CHECK(re_testZ2.FullMatch(utf8_string)); + +#ifdef SUPPORT_UCP + RE re_testZ3("(*UCP)(*UTF)..."); + CHECK(re_testZ3.FullMatch(utf8_string)); + + RE re_testZ4("(*UCP)(*LIMIT_MATCH=1000)(*UTF)..."); + CHECK(re_testZ4.FullMatch(utf8_string)); + + RE re_testZ5("(*UCP)(*LIMIT_MATCH=1000)(*ANY)(*UTF)..."); + CHECK(re_testZ5.FullMatch(utf8_string)); +#endif +#endif + + // Check that '.' matches one byte or UTF-8 character + // according to the mode. + string ss; + RE re_test3("(.)"); + CHECK(re_test3.PartialMatch(utf8_string, &ss)); + CHECK_EQ(ss, string("\xe6")); + RE re_test4("(.)", pcrecpp::UTF8()); + CHECK(re_test4.PartialMatch(utf8_string, &ss)); + CHECK_EQ(ss, string("\xe6\x97\xa5")); + + // Check that string matches itself in either mode + RE re_test5(utf8_string); + CHECK(re_test5.FullMatch(utf8_string)); + RE re_test6(utf8_string, pcrecpp::UTF8()); + CHECK(re_test6.FullMatch(utf8_string)); + + // Check that pattern matches string only in UTF8 mode + RE re_test7(utf8_pattern); + CHECK(!re_test7.FullMatch(utf8_string)); + RE re_test8(utf8_pattern, pcrecpp::UTF8()); + CHECK(re_test8.FullMatch(utf8_string)); + } + + // Check that ungreedy, UTF8 regular expressions don't match when they + // oughtn't -- see bug 82246. + { + // This code always worked. + const char* pattern = "\\w+X"; + const string target = "a aX"; + RE match_sentence(pattern); + RE match_sentence_re(pattern, pcrecpp::UTF8()); + + CHECK(!match_sentence.FullMatch(target)); + CHECK(!match_sentence_re.FullMatch(target)); + } + + { + const char* pattern = "(?U)\\w+X"; + const string target = "a aX"; + RE match_sentence(pattern); + RE match_sentence_re(pattern, pcrecpp::UTF8()); + + CHECK(!match_sentence.FullMatch(target)); + CHECK(!match_sentence_re.FullMatch(target)); + } +#endif /* def SUPPORT_UTF */ + + printf("Testing error reporting\n"); + + { RE re("a\\1"); CHECK(!re.error().empty()); } + { + RE re("a[x"); + CHECK(!re.error().empty()); + } + { + RE re("a[z-a]"); + CHECK(!re.error().empty()); + } + { + RE re("a[[:foobar:]]"); + CHECK(!re.error().empty()); + } + { + RE re("a(b"); + CHECK(!re.error().empty()); + } + { + RE re("a\\"); + CHECK(!re.error().empty()); + } + + // Test that recursion is stopped + TestRecursion(); + + // Test Options + if (getenv("VERBOSE_TEST") != NULL) + VERBOSE_TEST = true; + TestOptions(); + + // Test the constructors + TestConstructors(); + + // Done + printf("OK\n"); + + return 0; +} diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcrecpparg.h.in b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcrecpparg.h.in new file mode 100755 index 000000000..61bcab540 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcrecpparg.h.in @@ -0,0 +1,174 @@ +// Copyright (c) 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: Sanjay Ghemawat + +#ifndef _PCRECPPARG_H +#define _PCRECPPARG_H + +#include // for NULL +#include + +#include + +namespace pcrecpp { + +class StringPiece; + +// Hex/Octal/Binary? + +// Special class for parsing into objects that define a ParseFrom() method +template +class _RE_MatchObject { + public: + static inline bool Parse(const char* str, int n, void* dest) { + if (dest == NULL) return true; + T* object = reinterpret_cast(dest); + return object->ParseFrom(str, n); + } +}; + +class PCRECPP_EXP_DEFN Arg { + public: + // Empty constructor so we can declare arrays of Arg + Arg(); + + // Constructor specially designed for NULL arguments + Arg(void*); + + typedef bool (*Parser)(const char* str, int n, void* dest); + +// Type-specific parsers +#define PCRE_MAKE_PARSER(type,name) \ + Arg(type* p) : arg_(p), parser_(name) { } \ + Arg(type* p, Parser parser) : arg_(p), parser_(parser) { } + + + PCRE_MAKE_PARSER(char, parse_char); + PCRE_MAKE_PARSER(unsigned char, parse_uchar); + PCRE_MAKE_PARSER(short, parse_short); + PCRE_MAKE_PARSER(unsigned short, parse_ushort); + PCRE_MAKE_PARSER(int, parse_int); + PCRE_MAKE_PARSER(unsigned int, parse_uint); + PCRE_MAKE_PARSER(long, parse_long); + PCRE_MAKE_PARSER(unsigned long, parse_ulong); +#if @pcre_have_long_long@ + PCRE_MAKE_PARSER(long long, parse_longlong); +#endif +#if @pcre_have_ulong_long@ + PCRE_MAKE_PARSER(unsigned long long, parse_ulonglong); +#endif + PCRE_MAKE_PARSER(float, parse_float); + PCRE_MAKE_PARSER(double, parse_double); + PCRE_MAKE_PARSER(std::string, parse_string); + PCRE_MAKE_PARSER(StringPiece, parse_stringpiece); + +#undef PCRE_MAKE_PARSER + + // Generic constructor + template Arg(T*, Parser parser); + // Generic constructor template + template Arg(T* p) + : arg_(p), parser_(_RE_MatchObject::Parse) { + } + + // Parse the data + bool Parse(const char* str, int n) const; + + private: + void* arg_; + Parser parser_; + + static bool parse_null (const char* str, int n, void* dest); + static bool parse_char (const char* str, int n, void* dest); + static bool parse_uchar (const char* str, int n, void* dest); + static bool parse_float (const char* str, int n, void* dest); + static bool parse_double (const char* str, int n, void* dest); + static bool parse_string (const char* str, int n, void* dest); + static bool parse_stringpiece (const char* str, int n, void* dest); + +#define PCRE_DECLARE_INTEGER_PARSER(name) \ + private: \ + static bool parse_ ## name(const char* str, int n, void* dest); \ + static bool parse_ ## name ## _radix( \ + const char* str, int n, void* dest, int radix); \ + public: \ + static bool parse_ ## name ## _hex(const char* str, int n, void* dest); \ + static bool parse_ ## name ## _octal(const char* str, int n, void* dest); \ + static bool parse_ ## name ## _cradix(const char* str, int n, void* dest) + + PCRE_DECLARE_INTEGER_PARSER(short); + PCRE_DECLARE_INTEGER_PARSER(ushort); + PCRE_DECLARE_INTEGER_PARSER(int); + PCRE_DECLARE_INTEGER_PARSER(uint); + PCRE_DECLARE_INTEGER_PARSER(long); + PCRE_DECLARE_INTEGER_PARSER(ulong); + PCRE_DECLARE_INTEGER_PARSER(longlong); + PCRE_DECLARE_INTEGER_PARSER(ulonglong); + +#undef PCRE_DECLARE_INTEGER_PARSER +}; + +inline Arg::Arg() : arg_(NULL), parser_(parse_null) { } +inline Arg::Arg(void* p) : arg_(p), parser_(parse_null) { } + +inline bool Arg::Parse(const char* str, int n) const { + return (*parser_)(str, n, arg_); +} + +// This part of the parser, appropriate only for ints, deals with bases +#define MAKE_INTEGER_PARSER(type, name) \ + inline Arg Hex(type* ptr) { \ + return Arg(ptr, Arg::parse_ ## name ## _hex); } \ + inline Arg Octal(type* ptr) { \ + return Arg(ptr, Arg::parse_ ## name ## _octal); } \ + inline Arg CRadix(type* ptr) { \ + return Arg(ptr, Arg::parse_ ## name ## _cradix); } + +MAKE_INTEGER_PARSER(short, short) /* */ +MAKE_INTEGER_PARSER(unsigned short, ushort) /* */ +MAKE_INTEGER_PARSER(int, int) /* Don't use semicolons */ +MAKE_INTEGER_PARSER(unsigned int, uint) /* after these statement */ +MAKE_INTEGER_PARSER(long, long) /* because they can cause */ +MAKE_INTEGER_PARSER(unsigned long, ulong) /* compiler warnings if */ +#if @pcre_have_long_long@ /* the checking level is */ +MAKE_INTEGER_PARSER(long long, longlong) /* turned up high enough. */ +#endif /* */ +#if @pcre_have_ulong_long@ /* */ +MAKE_INTEGER_PARSER(unsigned long long, ulonglong) /* */ +#endif + +#undef PCRE_IS_SET +#undef PCRE_SET_OR_CLEAR +#undef MAKE_INTEGER_PARSER + +} // namespace pcrecpp + + +#endif /* _PCRECPPARG_H */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcredemo.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcredemo.c new file mode 100755 index 000000000..946aba45c --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcredemo.c @@ -0,0 +1,406 @@ +/************************************************* +* PCRE DEMONSTRATION PROGRAM * +*************************************************/ + +/* This is a demonstration program to illustrate the most straightforward ways +of calling the PCRE regular expression library from a C program. See the +pcresample documentation for a short discussion ("man pcresample" if you have +the PCRE man pages installed). + +In Unix-like environments, if PCRE is installed in your standard system +libraries, you should be able to compile this program using this command: + +gcc -Wall pcredemo.c -lpcre -o pcredemo + +If PCRE is not installed in a standard place, it is likely to be installed with +support for the pkg-config mechanism. If you have pkg-config, you can compile +this program using this command: + +gcc -Wall pcredemo.c `pkg-config --cflags --libs libpcre` -o pcredemo + +If you do not have pkg-config, you may have to use this: + +gcc -Wall pcredemo.c -I/usr/local/include -L/usr/local/lib \ + -R/usr/local/lib -lpcre -o pcredemo + +Replace "/usr/local/include" and "/usr/local/lib" with wherever the include and +library files for PCRE are installed on your system. Only some operating +systems (e.g. Solaris) use the -R option. + +Building under Windows: + +If you want to statically link this program against a non-dll .a file, you must +define PCRE_STATIC before including pcre.h, otherwise the pcre_malloc() and +pcre_free() exported functions will be declared __declspec(dllimport), with +unwanted results. So in this environment, uncomment the following line. */ + +/* #define PCRE_STATIC */ + +#include +#include +#include + +#define OVECCOUNT 30 /* should be a multiple of 3 */ + + +int main(int argc, char **argv) +{ +pcre *re; +const char *error; +char *pattern; +char *subject; +unsigned char *name_table; +unsigned int option_bits; +int erroffset; +int find_all; +int crlf_is_newline; +int namecount; +int name_entry_size; +int ovector[OVECCOUNT]; +int subject_length; +int rc, i; +int utf8; + + +/************************************************************************** +* First, sort out the command line. There is only one possible option at * +* the moment, "-g" to request repeated matching to find all occurrences, * +* like Perl's /g option. We set the variable find_all to a non-zero value * +* if the -g option is present. Apart from that, there must be exactly two * +* arguments. * +**************************************************************************/ + +find_all = 0; +for (i = 1; i < argc; i++) + { + if (strcmp(argv[i], "-g") == 0) find_all = 1; + else break; + } + +/* After the options, we require exactly two arguments, which are the pattern, +and the subject string. */ + +if (argc - i != 2) + { + printf("Two arguments required: a regex and a subject string\n"); + return 1; + } + +pattern = argv[i]; +subject = argv[i+1]; +subject_length = (int)strlen(subject); + + +/************************************************************************* +* Now we are going to compile the regular expression pattern, and handle * +* and errors that are detected. * +*************************************************************************/ + +re = pcre_compile( + pattern, /* the pattern */ + 0, /* default options */ + &error, /* for error message */ + &erroffset, /* for error offset */ + NULL); /* use default character tables */ + +/* Compilation failed: print the error message and exit */ + +if (re == NULL) + { + printf("PCRE compilation failed at offset %d: %s\n", erroffset, error); + return 1; + } + + +/************************************************************************* +* If the compilation succeeded, we call PCRE again, in order to do a * +* pattern match against the subject string. This does just ONE match. If * +* further matching is needed, it will be done below. * +*************************************************************************/ + +rc = pcre_exec( + re, /* the compiled pattern */ + NULL, /* no extra data - we didn't study the pattern */ + subject, /* the subject string */ + subject_length, /* the length of the subject */ + 0, /* start at offset 0 in the subject */ + 0, /* default options */ + ovector, /* output vector for substring information */ + OVECCOUNT); /* number of elements in the output vector */ + +/* Matching failed: handle error cases */ + +if (rc < 0) + { + switch(rc) + { + case PCRE_ERROR_NOMATCH: printf("No match\n"); break; + /* + Handle other special cases if you like + */ + default: printf("Matching error %d\n", rc); break; + } + pcre_free(re); /* Release memory used for the compiled pattern */ + return 1; + } + +/* Match succeded */ + +printf("\nMatch succeeded at offset %d\n", ovector[0]); + + +/************************************************************************* +* We have found the first match within the subject string. If the output * +* vector wasn't big enough, say so. Then output any substrings that were * +* captured. * +*************************************************************************/ + +/* The output vector wasn't big enough */ + +if (rc == 0) + { + rc = OVECCOUNT/3; + printf("ovector only has room for %d captured substrings\n", rc - 1); + } + +/* Show substrings stored in the output vector by number. Obviously, in a real +application you might want to do things other than print them. */ + +for (i = 0; i < rc; i++) + { + char *substring_start = subject + ovector[2*i]; + int substring_length = ovector[2*i+1] - ovector[2*i]; + printf("%2d: %.*s\n", i, substring_length, substring_start); + } + + +/************************************************************************** +* That concludes the basic part of this demonstration program. We have * +* compiled a pattern, and performed a single match. The code that follows * +* shows first how to access named substrings, and then how to code for * +* repeated matches on the same subject. * +**************************************************************************/ + +/* See if there are any named substrings, and if so, show them by name. First +we have to extract the count of named parentheses from the pattern. */ + +(void)pcre_fullinfo( + re, /* the compiled pattern */ + NULL, /* no extra data - we didn't study the pattern */ + PCRE_INFO_NAMECOUNT, /* number of named substrings */ + &namecount); /* where to put the answer */ + +if (namecount <= 0) printf("No named substrings\n"); else + { + unsigned char *tabptr; + printf("Named substrings\n"); + + /* Before we can access the substrings, we must extract the table for + translating names to numbers, and the size of each entry in the table. */ + + (void)pcre_fullinfo( + re, /* the compiled pattern */ + NULL, /* no extra data - we didn't study the pattern */ + PCRE_INFO_NAMETABLE, /* address of the table */ + &name_table); /* where to put the answer */ + + (void)pcre_fullinfo( + re, /* the compiled pattern */ + NULL, /* no extra data - we didn't study the pattern */ + PCRE_INFO_NAMEENTRYSIZE, /* size of each entry in the table */ + &name_entry_size); /* where to put the answer */ + + /* Now we can scan the table and, for each entry, print the number, the name, + and the substring itself. */ + + tabptr = name_table; + for (i = 0; i < namecount; i++) + { + int n = (tabptr[0] << 8) | tabptr[1]; + printf("(%d) %*s: %.*s\n", n, name_entry_size - 3, tabptr + 2, + ovector[2*n+1] - ovector[2*n], subject + ovector[2*n]); + tabptr += name_entry_size; + } + } + + +/************************************************************************* +* If the "-g" option was given on the command line, we want to continue * +* to search for additional matches in the subject string, in a similar * +* way to the /g option in Perl. This turns out to be trickier than you * +* might think because of the possibility of matching an empty string. * +* What happens is as follows: * +* * +* If the previous match was NOT for an empty string, we can just start * +* the next match at the end of the previous one. * +* * +* If the previous match WAS for an empty string, we can't do that, as it * +* would lead to an infinite loop. Instead, a special call of pcre_exec() * +* is made with the PCRE_NOTEMPTY_ATSTART and PCRE_ANCHORED flags set. * +* The first of these tells PCRE that an empty string at the start of the * +* subject is not a valid match; other possibilities must be tried. The * +* second flag restricts PCRE to one match attempt at the initial string * +* position. If this match succeeds, an alternative to the empty string * +* match has been found, and we can print it and proceed round the loop, * +* advancing by the length of whatever was found. If this match does not * +* succeed, we still stay in the loop, advancing by just one character. * +* In UTF-8 mode, which can be set by (*UTF8) in the pattern, this may be * +* more than one byte. * +* * +* However, there is a complication concerned with newlines. When the * +* newline convention is such that CRLF is a valid newline, we must * +* advance by two characters rather than one. The newline convention can * +* be set in the regex by (*CR), etc.; if not, we must find the default. * +*************************************************************************/ + +if (!find_all) /* Check for -g */ + { + pcre_free(re); /* Release the memory used for the compiled pattern */ + return 0; /* Finish unless -g was given */ + } + +/* Before running the loop, check for UTF-8 and whether CRLF is a valid newline +sequence. First, find the options with which the regex was compiled; extract +the UTF-8 state, and mask off all but the newline options. */ + +(void)pcre_fullinfo(re, NULL, PCRE_INFO_OPTIONS, &option_bits); +utf8 = option_bits & PCRE_UTF8; +option_bits &= PCRE_NEWLINE_CR|PCRE_NEWLINE_LF|PCRE_NEWLINE_CRLF| + PCRE_NEWLINE_ANY|PCRE_NEWLINE_ANYCRLF; + +/* If no newline options were set, find the default newline convention from the +build configuration. */ + +if (option_bits == 0) + { + int d; + (void)pcre_config(PCRE_CONFIG_NEWLINE, &d); + /* Note that these values are always the ASCII ones, even in + EBCDIC environments. CR = 13, NL = 10. */ + option_bits = (d == 13)? PCRE_NEWLINE_CR : + (d == 10)? PCRE_NEWLINE_LF : + (d == (13<<8 | 10))? PCRE_NEWLINE_CRLF : + (d == -2)? PCRE_NEWLINE_ANYCRLF : + (d == -1)? PCRE_NEWLINE_ANY : 0; + } + +/* See if CRLF is a valid newline sequence. */ + +crlf_is_newline = + option_bits == PCRE_NEWLINE_ANY || + option_bits == PCRE_NEWLINE_CRLF || + option_bits == PCRE_NEWLINE_ANYCRLF; + +/* Loop for second and subsequent matches */ + +for (;;) + { + int options = 0; /* Normally no options */ + int start_offset = ovector[1]; /* Start at end of previous match */ + + /* If the previous match was for an empty string, we are finished if we are + at the end of the subject. Otherwise, arrange to run another match at the + same point to see if a non-empty match can be found. */ + + if (ovector[0] == ovector[1]) + { + if (ovector[0] == subject_length) break; + options = PCRE_NOTEMPTY_ATSTART | PCRE_ANCHORED; + } + + /* Run the next matching operation */ + + rc = pcre_exec( + re, /* the compiled pattern */ + NULL, /* no extra data - we didn't study the pattern */ + subject, /* the subject string */ + subject_length, /* the length of the subject */ + start_offset, /* starting offset in the subject */ + options, /* options */ + ovector, /* output vector for substring information */ + OVECCOUNT); /* number of elements in the output vector */ + + /* This time, a result of NOMATCH isn't an error. If the value in "options" + is zero, it just means we have found all possible matches, so the loop ends. + Otherwise, it means we have failed to find a non-empty-string match at a + point where there was a previous empty-string match. In this case, we do what + Perl does: advance the matching position by one character, and continue. We + do this by setting the "end of previous match" offset, because that is picked + up at the top of the loop as the point at which to start again. + + There are two complications: (a) When CRLF is a valid newline sequence, and + the current position is just before it, advance by an extra byte. (b) + Otherwise we must ensure that we skip an entire UTF-8 character if we are in + UTF-8 mode. */ + + if (rc == PCRE_ERROR_NOMATCH) + { + if (options == 0) break; /* All matches found */ + ovector[1] = start_offset + 1; /* Advance one byte */ + if (crlf_is_newline && /* If CRLF is newline & */ + start_offset < subject_length - 1 && /* we are at CRLF, */ + subject[start_offset] == '\r' && + subject[start_offset + 1] == '\n') + ovector[1] += 1; /* Advance by one more. */ + else if (utf8) /* Otherwise, ensure we */ + { /* advance a whole UTF-8 */ + while (ovector[1] < subject_length) /* character. */ + { + if ((subject[ovector[1]] & 0xc0) != 0x80) break; + ovector[1] += 1; + } + } + continue; /* Go round the loop again */ + } + + /* Other matching errors are not recoverable. */ + + if (rc < 0) + { + printf("Matching error %d\n", rc); + pcre_free(re); /* Release memory used for the compiled pattern */ + return 1; + } + + /* Match succeded */ + + printf("\nMatch succeeded again at offset %d\n", ovector[0]); + + /* The match succeeded, but the output vector wasn't big enough. */ + + if (rc == 0) + { + rc = OVECCOUNT/3; + printf("ovector only has room for %d captured substrings\n", rc - 1); + } + + /* As before, show substrings stored in the output vector by number, and then + also any named substrings. */ + + for (i = 0; i < rc; i++) + { + char *substring_start = subject + ovector[2*i]; + int substring_length = ovector[2*i+1] - ovector[2*i]; + printf("%2d: %.*s\n", i, substring_length, substring_start); + } + + if (namecount <= 0) printf("No named substrings\n"); else + { + unsigned char *tabptr = name_table; + printf("Named substrings\n"); + for (i = 0; i < namecount; i++) + { + int n = (tabptr[0] << 8) | tabptr[1]; + printf("(%d) %*s: %.*s\n", n, name_entry_size - 3, tabptr + 2, + ovector[2*n+1] - ovector[2*n], subject + ovector[2*n]); + tabptr += name_entry_size; + } + } + } /* End of loop to find second and subsequent matches */ + +printf("\n"); +pcre_free(re); /* Release memory used for the compiled pattern */ +return 0; +} + +/* End of pcredemo.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcregexp.pas b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcregexp.pas new file mode 100755 index 000000000..77afd561c --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcregexp.pas @@ -0,0 +1,845 @@ +{ + pcRegExp - Perl compatible regular expressions for Virtual Pascal + (c) 2001 Peter S. Voronov aka Chem O'Dun + + Based on PCRE library interface unit for Virtual Pascal. + (c) 2001 Alexander Tokarev + + The current PCRE version is: 3.7 + + This software may be distributed under the terms of the modified BSD license + Copyright (c) 2001, Alexander Tokarev + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + The PCRE library is written by: Philip Hazel + Copyright (c) 1997-2004 University of Cambridge + + AngelsHolocaust 4-11-04 updated to use version v5.0 + (INFO: this is regex-directed, NFA) + AH: 9-11-04 - pcre_free: removed var, pcre already gives the ptr, now + everything works as it should (no more crashes) + -> removed CheckRegExp because pcre handles errors perfectly + 10-11-04 - added pcError (errorhandling), pcInit + 13-11-04 - removed the ErrorPos = 0 check -> always print erroroffset + 17-10-05 - support for \1-\9 backreferences in TpcRegExp.GetReplStr + 17-02-06 - added RunTimeOptions: caller can set options while searching + 19-02-06 - added SearchOfs(): let PCRE use the complete string and offset + into the string itself + 20-12-06 - support for version 7.0 + 27.08.08 - support for v7.7 +} + +{$H+} {$DEFINE PCRE_3_7} {$DEFINE PCRE_5_0} {$DEFINE PCRE_7_0} {$DEFINE PCRE_7_7} + +Unit pcregexp; + +Interface + +uses objects; + +Type + PpcRegExp = ^TpcRegExp; +// TpcRegExp = object + TpcRegExp = object(TObject) + MatchesCount: integer; + RegExpC, RegExpExt : Pointer; + Matches:Pointer; + RegExp: shortstring; + SourceLen: integer; + PartialMatch : boolean; + Error : boolean; + ErrorMsg : Pchar; + ErrorPos : integer; + RunTimeOptions: Integer; // options which can be set by the caller + constructor Init(const ARegExp : shortstring; AOptions : integer; ALocale : Pointer); + function Search(AStr: Pchar; ALen : longint) : boolean; virtual; + function SearchNext( AStr: Pchar; ALen : longint) : boolean; virtual; + function SearchOfs ( AStr: Pchar; ALen, AOfs : longint) : boolean; virtual; + function MatchSub(ANom: integer; var Pos, Len : longint) : boolean; virtual; + function MatchFull(var Pos, Len : longint) : boolean; virtual; + function GetSubStr(ANom: integer; AStr: Pchar) : string; virtual; + function GetFullStr(AStr: Pchar) : string; virtual; + function GetReplStr(AStr: Pchar; const ARepl: string) : string; virtual; + function GetPreSubStr(AStr: Pchar) : string; virtual; + function GetPostSubStr(AStr: Pchar) : string; virtual; + function ErrorStr : string; virtual; + destructor Done; virtual; + end; + + function pcGrepMatch(WildCard, aStr: string; AOptions:integer; ALocale : Pointer): Boolean; + function pcGrepSub(WildCard, aStr, aRepl: string; AOptions:integer; ALocale : Pointer): string; + + function pcFastGrepMatch(WildCard, aStr: string): Boolean; + function pcFastGrepSub(WildCard, aStr, aRepl: string): string; + +{$IFDEF PCRE_5_0} + function pcGetVersion : pchar; +{$ENDIF} + + function pcError (var pRegExp : Pointer) : Boolean; + function pcInit (const Pattern: Shortstring; CaseSens: Boolean) : Pointer; + +Const { Options } + PCRE_CASELESS = $0001; + PCRE_MULTILINE = $0002; + PCRE_DOTALL = $0004; + PCRE_EXTENDED = $0008; + PCRE_ANCHORED = $0010; + PCRE_DOLLAR_ENDONLY = $0020; + PCRE_EXTRA = $0040; + PCRE_NOTBOL = $0080; + PCRE_NOTEOL = $0100; + PCRE_UNGREEDY = $0200; + PCRE_NOTEMPTY = $0400; +{$IFDEF PCRE_5_0} + PCRE_UTF8 = $0800; + PCRE_NO_AUTO_CAPTURE = $1000; + PCRE_NO_UTF8_CHECK = $2000; + PCRE_AUTO_CALLOUT = $4000; + PCRE_PARTIAL = $8000; +{$ENDIF} +{$IFDEF PCRE_7_0} + PCRE_DFA_SHORTEST = $00010000; + PCRE_DFA_RESTART = $00020000; + PCRE_FIRSTLINE = $00040000; + PCRE_DUPNAMES = $00080000; + PCRE_NEWLINE_CR = $00100000; + PCRE_NEWLINE_LF = $00200000; + PCRE_NEWLINE_CRLF = $00300000; + PCRE_NEWLINE_ANY = $00400000; + PCRE_NEWLINE_ANYCRLF = $00500000; + + PCRE_NEWLINE_BITS = PCRE_NEWLINE_CR or PCRE_NEWLINE_LF or PCRE_NEWLINE_ANY; + +{$ENDIF} +{$IFDEF PCRE_7_7} + PCRE_BSR_ANYCRLF = $00800000; + PCRE_BSR_UNICODE = $01000000; + PCRE_JAVASCRIPT_COMPAT= $02000000; +{$ENDIF} + + PCRE_COMPILE_ALLOWED_OPTIONS = PCRE_ANCHORED + PCRE_AUTO_CALLOUT + PCRE_CASELESS + + PCRE_DOLLAR_ENDONLY + PCRE_DOTALL + PCRE_EXTENDED + + PCRE_EXTRA + PCRE_MULTILINE + PCRE_NO_AUTO_CAPTURE + + PCRE_UNGREEDY + PCRE_UTF8 + PCRE_NO_UTF8_CHECK + {$IFDEF PCRE_7_0} + + PCRE_DUPNAMES + PCRE_FIRSTLINE + PCRE_NEWLINE_BITS + {$ENDIF} + {$IFDEF PCRE_7_7} + + PCRE_BSR_ANYCRLF + PCRE_BSR_UNICODE + PCRE_JAVASCRIPT_COMPAT + {$ENDIF} + ; + + PCRE_EXEC_ALLOWED_OPTIONS = PCRE_ANCHORED + PCRE_NOTBOL + PCRE_NOTEOL + + PCRE_NOTEMPTY + PCRE_NO_UTF8_CHECK + PCRE_PARTIAL + {$IFDEF PCRE_7_0} + + PCRE_NEWLINE_BITS + {$ENDIF} + {$IFDEF PCRE_7_7} + + PCRE_BSR_ANYCRLF + PCRE_BSR_UNICODE + {$ENDIF} + ; + +{$IFDEF PCRE_7_0} + PCRE_DFA_EXEC_ALLOWED_OPTIONS = PCRE_ANCHORED + PCRE_NOTBOL + PCRE_NOTEOL + + PCRE_NOTEMPTY + PCRE_NO_UTF8_CHECK + PCRE_PARTIAL + + PCRE_DFA_SHORTEST + PCRE_DFA_RESTART + + PCRE_NEWLINE_BITS + {$IFDEF PCRE_7_7} + + PCRE_BSR_ANYCRLF + PCRE_BSR_UNICODE + {$ENDIF} + ; +{$ENDIF} + +{ Exec-time and get/set-time error codes } + PCRE_ERROR_NOMATCH = -1; + PCRE_ERROR_NULL = -2; + PCRE_ERROR_BADOPTION = -3; + PCRE_ERROR_BADMAGIC = -4; + PCRE_ERROR_UNKNOWN_MODE = -5; + PCRE_ERROR_NOMEMORY = -6; + PCRE_ERROR_NOSUBSTRING = -7; +{$IFDEF PCRE_5_0} + PCRE_ERROR_MATCHLIMIT = -8; + PCRE_ERROR_CALLOUT = -9; { Never used by PCRE itself } + PCRE_ERROR_BADUTF8 = -10; + PCRE_ERROR_BADUTF8_OFFSET = -11; + PCRE_ERROR_PARTIAL = -12; + PCRE_ERROR_BADPARTIAL = -13; + PCRE_ERROR_INTERNAL = -14; + PCRE_ERROR_BADCOUNT = -15; +{$ENDIF} +{$IFDEF PCRE_7_0} + PCRE_ERROR_DFA_UITEM = -16; + PCRE_ERROR_DFA_UCOND = -17; + PCRE_ERROR_DFA_UMLIMIT = -18; + PCRE_ERROR_DFA_WSSIZE = -19; + PCRE_ERROR_DFA_RECURSE = -20; + PCRE_ERROR_RECURSIONLIMIT = -21; + PCRE_ERROR_NULLWSLIMIT = -22; + PCRE_ERROR_BADNEWLINE = -23; +{$ENDIF} + +{ Request types for pcre_fullinfo() } + + PCRE_INFO_OPTIONS = 0; + PCRE_INFO_SIZE = 1; + PCRE_INFO_CAPTURECOUNT = 2; + PCRE_INFO_BACKREFMAX = 3; + PCRE_INFO_FIRSTBYTE = 4; + PCRE_INFO_FIRSTCHAR = 4; { For backwards compatibility } + PCRE_INFO_FIRSTTABLE = 5; +{$IFDEF PCRE_5_0} + PCRE_INFO_LASTLITERAL = 6; + PCRE_INFO_NAMEENTRYSIZE = 7; + PCRE_INFO_NAMECOUNT = 8; + PCRE_INFO_NAMETABLE = 9; + PCRE_INFO_STUDYSIZE = 10; + PCRE_INFO_DEFAULT_TABLES = 11; +{$ENDIF PCRE_5_0} +{$IFDEF PCRE_7_7} + PCRE_INFO_OKPARTIAL = 12; + PCRE_INFO_JCHANGED = 13; + PCRE_INFO_HASCRORLF = 14; +{$ENDIF} + +{ Request types for pcre_config() } +{$IFDEF PCRE_5_0} + PCRE_CONFIG_UTF8 = 0; + PCRE_CONFIG_NEWLINE = 1; + PCRE_CONFIG_LINK_SIZE = 2; + PCRE_CONFIG_POSIX_MALLOC_THRESHOLD = 3; + PCRE_CONFIG_MATCH_LIMIT = 4; + PCRE_CONFIG_STACKRECURSE = 5; + PCRE_CONFIG_UNICODE_PROPERTIES = 6; +{$ENDIF PCRE_5_0} +{$IFDEF PCRE_7_0} + PCRE_CONFIG_MATCH_LIMIT_RECURSION = 7; +{$ENDIF} +{$IFDEF PCRE_7_7} + PCRE_CONFIG_BSR = 8; +{$ENDIF} + +{ Bit flags for the pcre_extra structure } +{$IFDEF PCRE_5_0} + PCRE_EXTRA_STUDY_DATA = $0001; + PCRE_EXTRA_MATCH_LIMIT = $0002; + PCRE_EXTRA_CALLOUT_DATA = $0004; + PCRE_EXTRA_TABLES = $0008; +{$ENDIF PCRE_5_0} +{$IFDEF PCRE_7_0} + PCRE_EXTRA_MATCH_LIMIT_RECURSION = $0010; +{$ENDIF} + +Const +// DefaultOptions : integer = 0; + DefaultLocaleTable : pointer = nil; + +{$IFDEF PCRE_5_0} +{ The structure for passing additional data to pcre_exec(). This is defined in +such as way as to be extensible. Always add new fields at the end, in order to +remain compatible. } + +type ppcre_extra = ^tpcre_extra; + tpcre_extra = record + flags : longint; { Bits for which fields are set } + study_data : pointer; { Opaque data from pcre_study() } + match_limit : longint; { Maximum number of calls to match() } + callout_data : pointer; { Data passed back in callouts } + tables : pointer; { Pointer to character tables } + match_limit_recursion: longint; { Max recursive calls to match() } + end; + +type ppcre_callout_block = ^pcre_callout_block; + pcre_callout_block = record + version, + (* ------------------------ Version 0 ------------------------------- *) + callout_number : integer; + offset_vector : pointer; + subject : pchar; + subject_length, start_match, current_position, capture_top, + capture_last : integer; + callout_data : pointer; + (* ------------------- Added for Version 1 -------------------------- *) + pattern_position, next_item_length : integer; + end; +{$ENDIF PCRE_5_0} + +{$OrgName+} +{$IFDEF VIRTUALPASCAL} {&Cdecl+} {$ENDIF VIRTUALPASCAL} + + { local replacement of external pcre memory management functions } + function pcre_malloc( size : integer ) : pointer; + procedure pcre_free( {var} p : pointer ); +{$IFDEF PCRE_5_0} + const pcre_stack_malloc: function ( size : integer ): pointer = pcre_malloc; + pcre_stack_free: procedure ( {var} p : pointer ) = pcre_free; + function pcre_callout(var p : ppcre_callout_block) : integer; +{$ENDIF PCRE_5_0} +{$IFDEF VIRTUALPASCAL} {&Cdecl-} {$ENDIF VIRTUALPASCAL} + +Implementation + +Uses strings, collect, messages, dnapp, commands, advance0, stringsx + {$IFDEF VIRTUALPASCAL} ,vpsyslow {$ENDIF VIRTUALPASCAL}; + +Const + MAGIC_NUMBER = $50435245; { 'PCRE' } + MAX_MATCHES = 90; { changed in 3.5 version; should be divisible by 3, was 64} + +Type + PMatchArray = ^TMatchArray; + TMatchArray = array[0..( MAX_MATCHES * 3 )] of integer; + + PRegExpCollection = ^TRegExpCollection; + TRegExpCollection = object(TSortedCollection) + MaxRegExp : integer; + SearchRegExp : shortstring; + CompareModeInsert : boolean; + constructor Init(AMaxRegExp:integer); + procedure FreeItem(P: Pointer); virtual; + function Compare(P1, P2: Pointer): Integer; virtual; + function Find(ARegExp:shortstring;var P: PpcRegExp):boolean; virtual; + function CheckNew(ARegExp:shortstring):PpcRegExp;virtual; + end; + +Var + PRegExpCache : PRegExpCollection; + + +{$IFDEF VIRTUALPASCAL} {&Cdecl+} {$ENDIF VIRTUALPASCAL} + + { imported original pcre functions } + + function pcre_compile( const pattern : PChar; options : integer; + var errorptr : PChar; var erroroffset : integer; + const tables : PChar ) : pointer {pcre}; external; +{$IFDEF PCRE_7_0} + function pcre_compile2( const pattern : PChar; options : integer; + var errorcodeptr : Integer; + var errorptr : PChar; var erroroffset : integer; + const tables : PChar ) : pointer {pcre}; external; +{$ENDIF} +{$IFDEF PCRE_5_0} + function pcre_config( what : integer; where : pointer) : integer; external; + function pcre_copy_named_substring( const code : pointer {pcre}; + const subject : pchar; + var ovector : integer; + stringcount : integer; + const stringname : pchar; + var buffer : pchar; + size : integer) : integer; external; + function pcre_copy_substring( const subject : pchar; var ovector : integer; + stringcount, stringnumber : integer; + var buffer : pchar; size : integer ) + : integer; external; + function pcre_exec( const argument_re : pointer {pcre}; + const extra_data : pointer {pcre_extra}; +{$ELSE} + function pcre_exec( const external_re : pointer; + const external_extra : pointer; +{$ENDIF} + const subject : PChar; + length, start_offset, options : integer; + offsets : pointer; + offsetcount : integer ) : integer; external; +{$IFDEF PCRE_7_0} + function pcre_dfa_exec( const argument_re : pointer {pcre}; + const extra_data : pointer {pcre_extra}; + const subject : pchar; + length, start_offset, options : integer; + offsets : pointer; + offsetcount : integer; + workspace : pointer; + wscount : integer ) : integer; external; +{$ENDIF} +{$IFDEF PCRE_5_0} + procedure pcre_free_substring( const p : pchar ); external; + procedure pcre_free_substring_list( var p : pchar ); external; + function pcre_fullinfo( const argument_re : pointer {pcre}; + const extra_data : pointer {pcre_extra}; + what : integer; + where : pointer ) : integer; external; + function pcre_get_named_substring( const code : pointer {pcre}; + const subject : pchar; + var ovector : integer; + stringcount : integer; + const stringname : pchar; + var stringptr : pchar ) : integer; external; + function pcre_get_stringnumber( const code : pointer {pcre}; + const stringname : pchar ) : integer; external; + function pcre_get_stringtable_entries( const code : pointer {pcre}; + const stringname : pchar; + var firstptr, + lastptr : pchar ) : integer; external; + function pcre_get_substring( const subject : pchar; var ovector : integer; + stringcount, stringnumber : integer; + var stringptr : pchar ) : integer; external; + function pcre_get_substring_list( const subject : pchar; var ovector : integer; + stringcount : integer; + listptr : pointer {const char ***listptr}) : integer; external; + function pcre_info( const argument_re : pointer {pcre}; + var optptr : integer; + var first_byte : integer ) : integer; external; + function pcre_maketables : pchar; external; +{$ENDIF} +{$IFDEF PCRE_7_0} + function pcre_refcount( const argument_re : pointer {pcre}; + adjust : integer ) : pchar; external; +{$ENDIF} + function pcre_study( const external_re : pointer {pcre}; + options : integer; + var errorptr : PChar ) : pointer {pcre_extra}; external; +{$IFDEF PCRE_5_0} + function pcre_version : pchar; external; +{$ENDIF} + + function pcre_malloc( size : integer ) : pointer; + begin + GetMem( result, size ); + end; + + procedure pcre_free( {var} p : pointer ); + begin + if (p <> nil) then + FreeMem( p, 0 ); + {@p := nil;} + end; + +{$IFDEF PCRE_5_0} +(* Called from PCRE as a result of the (?C) item. We print out where we are in +the match. Yield zero unless more callouts than the fail count, or the callout +data is not zero. *) + + function pcre_callout; + begin + end; +{$ENDIF} + +{$IFDEF VIRTUALPASCAL} {&Cdecl-} {$ENDIF VIRTUALPASCAL} + +// Always include the newest version of the library +{$IFDEF PCRE_7_7} + {$L pcre77.lib} +{$ELSE} + {$IFDEF PCRE_7_0} + {$L pcre70.lib} + {$ELSE} + {$IFDEF PCRE_5_0} + {$L pcre50.lib} + {$ELSE} + {$IFDEF PCRE_3_7} + {$L pcre37.lib} + {$ENDIF PCRE_3_7} + {$ENDIF PCRE_5_0} + {$ENDIF PCRE_7_0} +{$ENDIF PCRE_7_7} + +{TpcRegExp} + + constructor TpcRegExp.Init(const ARegExp:shortstring; AOptions:integer; ALocale : Pointer); + var + pRegExp : PChar; + begin + RegExp:=ARegExp; + RegExpC:=nil; + RegExpExt:=nil; + Matches:=nil; + MatchesCount:=0; + Error:=true; + ErrorMsg:=nil; + ErrorPos:=0; + RunTimeOptions := 0; + if length(RegExp) < 255 then + begin + RegExp[length(RegExp)+1]:=#0; + pRegExp:=@RegExp[1]; + end + else + begin + GetMem(pRegExp,length(RegExp)+1); + pRegExp:=strpcopy(pRegExp,RegExp); + end; + RegExpC := pcre_compile( pRegExp, + AOptions and PCRE_COMPILE_ALLOWED_OPTIONS, + ErrorMsg, ErrorPos, ALocale); + if length(RegExp) = 255 then + StrDispose(pRegExp); + if RegExpC = nil then + exit; + ErrorMsg:=nil; + RegExpExt := pcre_study( RegExpC, 0, ErrorMsg ); + if (RegExpExt = nil) and (ErrorMsg <> nil) then + begin + pcre_free(RegExpC); + exit; + end; + GetMem(Matches,SizeOf(TMatchArray)); + Error:=false; + end; + + destructor TpcRegExp.Done; + begin + if RegExpC <> nil then + pcre_free(RegExpC); + if RegExpExt <> nil then + pcre_free(RegExpExt); + if Matches <> nil then + FreeMem(Matches,SizeOf(TMatchArray)); + end; + + function TpcRegExp.SearchNext( AStr: Pchar; ALen : longint ) : boolean; + var Options: Integer; + begin // must handle PCRE_ERROR_PARTIAL here + Options := (RunTimeOptions or startup.MiscMultiData.cfgRegEx.DefaultOptions) and + PCRE_EXEC_ALLOWED_OPTIONS; + if MatchesCount > 0 then + MatchesCount:=pcre_exec( RegExpC, RegExpExt, AStr, ALen, PMatchArray(Matches)^[1], + Options, Matches, MAX_MATCHES ) else + MatchesCount:=pcre_exec( RegExpC, RegExpExt, AStr, ALen, 0, + Options, Matches, MAX_MATCHES ); +{ if MatchesCount = 0 then + MatchesCount := MatchesCount div 3;} + PartialMatch := MatchesCount = PCRE_ERROR_PARTIAL; + SearchNext := MatchesCount > 0; + end; + + function TpcRegExp.Search( AStr: Pchar; ALen : longint):boolean; + begin + MatchesCount:=0; + Search:=SearchNext(AStr,ALen); + SourceLen:=ALen; + end; + + function TpcRegExp.SearchOfs( AStr: Pchar; ALen, AOfs: longint ) : boolean; + var Options: Integer; + begin + MatchesCount:=0; + Options := (RunTimeOptions or startup.MiscMultiData.cfgRegEx.DefaultOptions) and + PCRE_EXEC_ALLOWED_OPTIONS; + MatchesCount:=pcre_exec( RegExpC, RegExpExt, AStr, ALen, AOfs, + Options, Matches, MAX_MATCHES ); + PartialMatch := MatchesCount = PCRE_ERROR_PARTIAL; + SearchOfs := MatchesCount > 0; + SourceLen := ALen-AOfs; + end; + + function TpcRegExp.MatchSub(ANom:integer; var Pos,Len:longint):boolean; + begin + if (MatchesCount > 0) and (ANom <= (MatchesCount-1)) then + begin + ANom:=ANom*2; + Pos:=PMatchArray(Matches)^[ANom]; + Len:=PMatchArray(Matches)^[ANom+1]-Pos; + MatchSub:=true; + end + else + MatchSub:=false; + end; + + function TpcRegExp.MatchFull(var Pos,Len:longint):boolean; + begin + MatchFull:=MatchSub(0,Pos,Len); + end; + + function TpcRegExp.GetSubStr(ANom: integer; AStr: Pchar):string; + var + s: ansistring; + pos,len: longint; + begin + s:=''; + if MatchSub(ANom, pos, len) then + begin + setlength(s, len); + Move(AStr[pos], s[1], len); + end; + GetSubStr:=s; + end; + + function TpcRegExp.GetPreSubStr(AStr: Pchar):string; + var + s: ansistring; + l: longint; + begin + s:=''; + if (MatchesCount > 0) then + begin + l:=PMatchArray(Matches)^[0]-1; + if l > 0 then + begin + setlength(s,l); + Move(AStr[1],s[1],l); + end; + end; + GetPreSubStr:=s; + end; + + function TpcRegExp.GetPostSubStr(AStr: Pchar):string; + var + s: ansistring; + l: longint; + ANom: integer; + begin + s:=''; + if (MatchesCount > 0) then + begin + ANom:=(MatchesCount-1){*2} shl 1; + l:=SourceLen-PMatchArray(Matches)^[ANom+1]+1; + if l > 0 then + begin + setlength(s,l); + Move(AStr[PMatchArray(Matches)^[ANom+1]],s[1],l); + end; + end; + GetPostSubStr:=s; + end; + + + function TpcRegExp.GetFullStr(AStr: Pchar):string; + var + s: ansistring; + l: longint; + begin + GetFullStr:=GetSubStr(0,AStr); + end; + + function TpcRegExp.GetReplStr(AStr: Pchar; const ARepl: string):string; + var + s: ansistring; + l,i,lasti: longint; + begin + l:=length(ARepl); + i:=1; + lasti:=1; + s:=''; + while i <= l do + begin + case ARepl[i] of + '\' : + begin + if i < l then + begin + s:=s+copy(ARepl,lasti,i-lasti){+ARepl[i+1]}; + {AH 17-10-05 support for POSIX \1-\9 backreferences} + case ARepl[i+1] of + '0' : s:=s+GetFullStr(AStr); + '1'..'9' : s:=s+GetSubStr(ord(ARepl[i+1])-ord('0'),AStr); + else s:=s+ARepl[i+1]; // copy the escaped character + end; + end; + inc(i); + lasti:=i+1; + end; + '$' : + begin + if i < l then + begin + s:=s+copy(ARepl,lasti,i-lasti); + case ARepl[i+1] of + '&' : s:=s+GetFullStr(AStr); + '1'..'9' : s:=s+GetSubStr(ord(ARepl[i+1])-ord('0'),AStr); + '`' : s:=s+GetPreSubStr(AStr); + #39 : s:=s+GetPostSubStr(AStr); + end; + end; + inc(i); + lasti:=i+1; + end; + end; + inc(i); + end; + if lasti <= {AH 25-10-2004 added =, else l==1 won't work} l then + s:=s+copy(ARepl,lasti,l-lasti+1); + GetReplStr:=s; + end; + + function TpcRegExp.ErrorStr:string; + begin + ErrorStr:=StrPas(ErrorMsg); + end; + +{TRegExpCollection} + +constructor TRegExpCollection.Init(AMaxRegExp: integer); +begin + Inherited Init(1,1); + MaxRegExp:=AMaxRegExp; + CompareModeInsert:=true; +end; + +procedure TRegExpCollection.FreeItem(P: Pointer); +begin + if P <> nil then + begin + Dispose(PpcRegExp(P),Done); + end; +end; + +function TRegExpCollection.Compare(P1, P2: Pointer): Integer; +//var +// l,l1,l2,i : byte; +//// wPos: pchar; +begin + if CompareModeInsert then + begin +// l1:=length(PpcRegExp(P1)^.RegExp); +// l2:=length(PpcRegExp(P2)^.RegExp); +// if l1 > l2 then l:=l2 else +// l:=l1; +// for i:=1 to l do +// if PpcRegExp(P1).RegExp[i] <> PpcRegExp(P2).RegExp[i] then break; +// if i <=l then +// Compare:=ord(PpcRegExp(P1).RegExp[i])-ord(PpcRegExp(P2).RegExp[i]) else +// Compare:=l1-l2; + Compare := stringsx.PasStrCmp(PpcRegExp(P1).RegExp, PpcRegExp(P2).RegExp, False); + end + else + begin +// l1:=length(PpcRegExp(P1)^.RegExp); +// l2:=length(SearchRegExp); +// if l1 > l2 then l:=l2 else +// l:=l1; +// for i:=1 to l do +// if PpcRegExp(P1).RegExp[i] <> SearchRegExp[i] then +// begin +// Compare:=ord(PpcRegExp(P1).RegExp[i])-ord(SearchRegExp[i]); +// break; +// end; +// if i > l then Compare:=l1-l2; + Compare := stringsx.PasStrCmp(PpcRegExp(P1).RegExp, SearchRegExp, False); + end; +end; + +function TRegExpCollection.Find(ARegExp:shortstring;var P: PpcRegExp):boolean; +var I : integer; +begin + CompareModeInsert:=false; + SearchRegExp:=ARegExp; + if Search(nil,I) then + begin + P:=PpcRegExp(At(I)); + Find:=true; + end + else + begin + P:=nil; + Find:=false; + end; + CompareModeInsert:=true; +end; + +function TRegExpCollection.CheckNew(ARegExp:shortstring):PpcRegExp; +var + P : PpcRegExp; +begin + if not Find(ARegExp,P) then + begin + if Count = MaxRegExp then + AtFree(0); + P:=New(ppcRegExp,Init(ARegExp,PCRE_CASELESS,nil)); + Insert(P); + end; + CheckNew:=P; +end; + +function pcGrepMatch(WildCard, aStr: string; AOptions:integer; ALocale : Pointer): Boolean; +var + PpcRE:PpcRegExp; +begin + PpcRE:=New(ppcRegExp,Init(WildCard,AOptions,Alocale)); + pcGrepMatch:=PpcRE^.Search(pchar(AStr),Length(AStr)); + Dispose(PpcRE,Done); +end; + +function pcGrepSub(WildCard, aStr, aRepl: string; AOptions:integer; ALocale : Pointer): string; +var + PpcRE:PpcRegExp; +begin + PpcRE:=New(ppcRegExp,Init(WildCard,AOptions,Alocale)); + if PpcRE^.Search(pchar(AStr),Length(AStr)) then + pcGrepSub:=PpcRE^.GetReplStr(pchar(AStr),ARepl) + else + pcGrepSub:=''; + Dispose(PpcRE,Done); +end; + +function pcFastGrepMatch(WildCard, aStr: string): Boolean; +var + PpcRE:PpcRegExp; +begin + PpcRE:=PRegExpCache^.CheckNew(WildCard); + pcFastGrepMatch:=PpcRE^.Search(pchar(AStr),Length(AStr)); +end; + +function pcFastGrepSub(WildCard, aStr, aRepl: string): string; +var + PpcRE:PpcRegExp; +begin + PpcRE:=PRegExpCache^.CheckNew(WildCard); + if PpcRE^.Search(pchar(AStr),Length(AStr)) then + pcFastGrepSub:=PpcRE^.GetReplStr(pchar(AStr),ARepl) + else + pcFastGrepSub:=''; +end; + +{$IFDEF PCRE_5_0} +function pcGetVersion : pchar; assembler; {$FRAME-}{$USES none} +asm + call pcre_version +end; +{$ENDIF PCRE_5_0} + +function pcError; +var P: ppcRegExp absolute pRegExp; +begin + Result := (P = nil) or P^.Error; + If Result and (P <> nil) then + begin +{ if P^.ErrorPos = 0 then + MessageBox(GetString(erRegExpCompile)+'"'+P^.ErrorStr+'"', nil,mfConfirmation+mfOkButton) + else} + MessageBox(GetString(erRegExpCompile)+'"'+P^.ErrorStr+'"'+GetString(erRegExpCompPos), + @P^.ErrorPos,mfConfirmation+mfOkButton); + Dispose(P, Done); + P:=nil; + end; +end; + +function pcInit; +var Options : Integer; +begin + If CaseSens then Options := 0 else Options := PCRE_CASELESS; + Result := New( PpcRegExp, Init( Pattern, + {DefaultOptions} + startup.MiscMultiData.cfgRegEx.DefaultOptions or Options, + DefaultLocaleTable) ); +end; + +Initialization + PRegExpCache:=New(PRegExpCollection,Init(64)); +Finalization + Dispose(PRegExpCache,Done); +End. diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcregrep.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcregrep.c new file mode 100755 index 000000000..598240686 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcregrep.c @@ -0,0 +1,3365 @@ +/************************************************* +* pcregrep program * +*************************************************/ + +/* This is a grep program that uses the PCRE regular expression library to do +its pattern matching. On Unix-like, Windows, and native z/OS systems it can +recurse into directories, and in z/OS it can handle PDS files. + +Note that for native z/OS, in addition to defining the NATIVE_ZOS macro, an +additional header is required. That header is not included in the main PCRE +distribution because other apparatus is needed to compile pcregrep for z/OS. +The header can be found in the special z/OS distribution, which is available +from www.zaconsultants.net or from www.cbttape.org. + + Copyright (c) 1997-2014 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include +#include +#include + +#include +#include + +#ifdef HAVE_UNISTD_H +#include +#endif + +#ifdef SUPPORT_LIBZ +#include +#endif + +#ifdef SUPPORT_LIBBZ2 +#include +#endif + +#include "pcre.h" + +#define FALSE 0 +#define TRUE 1 + +typedef int BOOL; + +#define OFFSET_SIZE 99 + +#if BUFSIZ > 8192 +#define MAXPATLEN BUFSIZ +#else +#define MAXPATLEN 8192 +#endif + +#define PATBUFSIZE (MAXPATLEN + 10) /* Allows for prefix+suffix */ + +/* Values for the "filenames" variable, which specifies options for file name +output. The order is important; it is assumed that a file name is wanted for +all values greater than FN_DEFAULT. */ + +enum { FN_NONE, FN_DEFAULT, FN_MATCH_ONLY, FN_NOMATCH_ONLY, FN_FORCE }; + +/* File reading styles */ + +enum { FR_PLAIN, FR_LIBZ, FR_LIBBZ2 }; + +/* Actions for the -d and -D options */ + +enum { dee_READ, dee_SKIP, dee_RECURSE }; +enum { DEE_READ, DEE_SKIP }; + +/* Actions for special processing options (flag bits) */ + +#define PO_WORD_MATCH 0x0001 +#define PO_LINE_MATCH 0x0002 +#define PO_FIXED_STRINGS 0x0004 + +/* Line ending types */ + +enum { EL_LF, EL_CR, EL_CRLF, EL_ANY, EL_ANYCRLF }; + +/* Binary file options */ + +enum { BIN_BINARY, BIN_NOMATCH, BIN_TEXT }; + +/* In newer versions of gcc, with FORTIFY_SOURCE set (the default in some +environments), a warning is issued if the value of fwrite() is ignored. +Unfortunately, casting to (void) does not suppress the warning. To get round +this, we use a macro that compiles a fudge. Oddly, this does not also seem to +apply to fprintf(). */ + +#define FWRITE(a,b,c,d) if (fwrite(a,b,c,d)) {} + + + +/************************************************* +* Global variables * +*************************************************/ + +/* Jeffrey Friedl has some debugging requirements that are not part of the +regular code. */ + +#ifdef JFRIEDL_DEBUG +static int S_arg = -1; +static unsigned int jfriedl_XR = 0; /* repeat regex attempt this many times */ +static unsigned int jfriedl_XT = 0; /* replicate text this many times */ +static const char *jfriedl_prefix = ""; +static const char *jfriedl_postfix = ""; +#endif + +static int endlinetype; + +static char *colour_string = (char *)"1;31"; +static char *colour_option = NULL; +static char *dee_option = NULL; +static char *DEE_option = NULL; +static char *locale = NULL; +static char *main_buffer = NULL; +static char *newline = NULL; +static char *om_separator = (char *)""; +static char *stdin_name = (char *)"(standard input)"; + +static const unsigned char *pcretables = NULL; + +static int after_context = 0; +static int before_context = 0; +static int binary_files = BIN_BINARY; +static int both_context = 0; +static int bufthird = PCREGREP_BUFSIZE; +static int bufsize = 3*PCREGREP_BUFSIZE; + +#if defined HAVE_WINDOWS_H && HAVE_WINDOWS_H +static int dee_action = dee_SKIP; +#else +static int dee_action = dee_READ; +#endif + +static int DEE_action = DEE_READ; +static int error_count = 0; +static int filenames = FN_DEFAULT; +static int pcre_options = 0; +static int process_options = 0; + +#ifdef SUPPORT_PCREGREP_JIT +static int study_options = PCRE_STUDY_JIT_COMPILE; +#else +static int study_options = 0; +#endif + +static unsigned long int match_limit = 0; +static unsigned long int match_limit_recursion = 0; + +static BOOL count_only = FALSE; +static BOOL do_colour = FALSE; +static BOOL file_offsets = FALSE; +static BOOL hyphenpending = FALSE; +static BOOL invert = FALSE; +static BOOL line_buffered = FALSE; +static BOOL line_offsets = FALSE; +static BOOL multiline = FALSE; +static BOOL number = FALSE; +static BOOL omit_zero_count = FALSE; +static BOOL resource_error = FALSE; +static BOOL quiet = FALSE; +static BOOL show_only_matching = FALSE; +static BOOL silent = FALSE; +static BOOL utf8 = FALSE; + +/* Structure for list of --only-matching capturing numbers. */ + +typedef struct omstr { + struct omstr *next; + int groupnum; +} omstr; + +static omstr *only_matching = NULL; +static omstr *only_matching_last = NULL; + +/* Structure for holding the two variables that describe a number chain. */ + +typedef struct omdatastr { + omstr **anchor; + omstr **lastptr; +} omdatastr; + +static omdatastr only_matching_data = { &only_matching, &only_matching_last }; + +/* Structure for list of file names (for -f and --{in,ex}clude-from) */ + +typedef struct fnstr { + struct fnstr *next; + char *name; +} fnstr; + +static fnstr *exclude_from = NULL; +static fnstr *exclude_from_last = NULL; +static fnstr *include_from = NULL; +static fnstr *include_from_last = NULL; + +static fnstr *file_lists = NULL; +static fnstr *file_lists_last = NULL; +static fnstr *pattern_files = NULL; +static fnstr *pattern_files_last = NULL; + +/* Structure for holding the two variables that describe a file name chain. */ + +typedef struct fndatastr { + fnstr **anchor; + fnstr **lastptr; +} fndatastr; + +static fndatastr exclude_from_data = { &exclude_from, &exclude_from_last }; +static fndatastr include_from_data = { &include_from, &include_from_last }; +static fndatastr file_lists_data = { &file_lists, &file_lists_last }; +static fndatastr pattern_files_data = { &pattern_files, &pattern_files_last }; + +/* Structure for pattern and its compiled form; used for matching patterns and +also for include/exclude patterns. */ + +typedef struct patstr { + struct patstr *next; + char *string; + pcre *compiled; + pcre_extra *hint; +} patstr; + +static patstr *patterns = NULL; +static patstr *patterns_last = NULL; +static patstr *include_patterns = NULL; +static patstr *include_patterns_last = NULL; +static patstr *exclude_patterns = NULL; +static patstr *exclude_patterns_last = NULL; +static patstr *include_dir_patterns = NULL; +static patstr *include_dir_patterns_last = NULL; +static patstr *exclude_dir_patterns = NULL; +static patstr *exclude_dir_patterns_last = NULL; + +/* Structure holding the two variables that describe a pattern chain. A pointer +to such structures is used for each appropriate option. */ + +typedef struct patdatastr { + patstr **anchor; + patstr **lastptr; +} patdatastr; + +static patdatastr match_patdata = { &patterns, &patterns_last }; +static patdatastr include_patdata = { &include_patterns, &include_patterns_last }; +static patdatastr exclude_patdata = { &exclude_patterns, &exclude_patterns_last }; +static patdatastr include_dir_patdata = { &include_dir_patterns, &include_dir_patterns_last }; +static patdatastr exclude_dir_patdata = { &exclude_dir_patterns, &exclude_dir_patterns_last }; + +static patstr **incexlist[4] = { &include_patterns, &exclude_patterns, + &include_dir_patterns, &exclude_dir_patterns }; + +static const char *incexname[4] = { "--include", "--exclude", + "--include-dir", "--exclude-dir" }; + +/* Structure for options and list of them */ + +enum { OP_NODATA, OP_STRING, OP_OP_STRING, OP_NUMBER, OP_LONGNUMBER, + OP_OP_NUMBER, OP_OP_NUMBERS, OP_PATLIST, OP_FILELIST, OP_BINFILES }; + +typedef struct option_item { + int type; + int one_char; + void *dataptr; + const char *long_name; + const char *help_text; +} option_item; + +/* Options without a single-letter equivalent get a negative value. This can be +used to identify them. */ + +#define N_COLOUR (-1) +#define N_EXCLUDE (-2) +#define N_EXCLUDE_DIR (-3) +#define N_HELP (-4) +#define N_INCLUDE (-5) +#define N_INCLUDE_DIR (-6) +#define N_LABEL (-7) +#define N_LOCALE (-8) +#define N_NULL (-9) +#define N_LOFFSETS (-10) +#define N_FOFFSETS (-11) +#define N_LBUFFER (-12) +#define N_M_LIMIT (-13) +#define N_M_LIMIT_REC (-14) +#define N_BUFSIZE (-15) +#define N_NOJIT (-16) +#define N_FILE_LIST (-17) +#define N_BINARY_FILES (-18) +#define N_EXCLUDE_FROM (-19) +#define N_INCLUDE_FROM (-20) +#define N_OM_SEPARATOR (-21) + +static option_item optionlist[] = { + { OP_NODATA, N_NULL, NULL, "", "terminate options" }, + { OP_NODATA, N_HELP, NULL, "help", "display this help and exit" }, + { OP_NUMBER, 'A', &after_context, "after-context=number", "set number of following context lines" }, + { OP_NODATA, 'a', NULL, "text", "treat binary files as text" }, + { OP_NUMBER, 'B', &before_context, "before-context=number", "set number of prior context lines" }, + { OP_BINFILES, N_BINARY_FILES, NULL, "binary-files=word", "set treatment of binary files" }, + { OP_NUMBER, N_BUFSIZE,&bufthird, "buffer-size=number", "set processing buffer size parameter" }, + { OP_OP_STRING, N_COLOUR, &colour_option, "color=option", "matched text color option" }, + { OP_OP_STRING, N_COLOUR, &colour_option, "colour=option", "matched text colour option" }, + { OP_NUMBER, 'C', &both_context, "context=number", "set number of context lines, before & after" }, + { OP_NODATA, 'c', NULL, "count", "print only a count of matching lines per FILE" }, + { OP_STRING, 'D', &DEE_option, "devices=action","how to handle devices, FIFOs, and sockets" }, + { OP_STRING, 'd', &dee_option, "directories=action", "how to handle directories" }, + { OP_PATLIST, 'e', &match_patdata, "regex(p)=pattern", "specify pattern (may be used more than once)" }, + { OP_NODATA, 'F', NULL, "fixed-strings", "patterns are sets of newline-separated strings" }, + { OP_FILELIST, 'f', &pattern_files_data, "file=path", "read patterns from file" }, + { OP_FILELIST, N_FILE_LIST, &file_lists_data, "file-list=path","read files to search from file" }, + { OP_NODATA, N_FOFFSETS, NULL, "file-offsets", "output file offsets, not text" }, + { OP_NODATA, 'H', NULL, "with-filename", "force the prefixing filename on output" }, + { OP_NODATA, 'h', NULL, "no-filename", "suppress the prefixing filename on output" }, + { OP_NODATA, 'I', NULL, "", "treat binary files as not matching (ignore)" }, + { OP_NODATA, 'i', NULL, "ignore-case", "ignore case distinctions" }, +#ifdef SUPPORT_PCREGREP_JIT + { OP_NODATA, N_NOJIT, NULL, "no-jit", "do not use just-in-time compiler optimization" }, +#else + { OP_NODATA, N_NOJIT, NULL, "no-jit", "ignored: this pcregrep does not support JIT" }, +#endif + { OP_NODATA, 'l', NULL, "files-with-matches", "print only FILE names containing matches" }, + { OP_NODATA, 'L', NULL, "files-without-match","print only FILE names not containing matches" }, + { OP_STRING, N_LABEL, &stdin_name, "label=name", "set name for standard input" }, + { OP_NODATA, N_LBUFFER, NULL, "line-buffered", "use line buffering" }, + { OP_NODATA, N_LOFFSETS, NULL, "line-offsets", "output line numbers and offsets, not text" }, + { OP_STRING, N_LOCALE, &locale, "locale=locale", "use the named locale" }, + { OP_LONGNUMBER, N_M_LIMIT, &match_limit, "match-limit=number", "set PCRE match limit option" }, + { OP_LONGNUMBER, N_M_LIMIT_REC, &match_limit_recursion, "recursion-limit=number", "set PCRE match recursion limit option" }, + { OP_NODATA, 'M', NULL, "multiline", "run in multiline mode" }, + { OP_STRING, 'N', &newline, "newline=type", "set newline type (CR, LF, CRLF, ANYCRLF or ANY)" }, + { OP_NODATA, 'n', NULL, "line-number", "print line number with output lines" }, + { OP_OP_NUMBERS, 'o', &only_matching_data, "only-matching=n", "show only the part of the line that matched" }, + { OP_STRING, N_OM_SEPARATOR, &om_separator, "om-separator=text", "set separator for multiple -o output" }, + { OP_NODATA, 'q', NULL, "quiet", "suppress output, just set return code" }, + { OP_NODATA, 'r', NULL, "recursive", "recursively scan sub-directories" }, + { OP_PATLIST, N_EXCLUDE,&exclude_patdata, "exclude=pattern","exclude matching files when recursing" }, + { OP_PATLIST, N_INCLUDE,&include_patdata, "include=pattern","include matching files when recursing" }, + { OP_PATLIST, N_EXCLUDE_DIR,&exclude_dir_patdata, "exclude-dir=pattern","exclude matching directories when recursing" }, + { OP_PATLIST, N_INCLUDE_DIR,&include_dir_patdata, "include-dir=pattern","include matching directories when recursing" }, + { OP_FILELIST, N_EXCLUDE_FROM,&exclude_from_data, "exclude-from=path", "read exclude list from file" }, + { OP_FILELIST, N_INCLUDE_FROM,&include_from_data, "include-from=path", "read include list from file" }, + + /* These two were accidentally implemented with underscores instead of + hyphens in the option names. As this was not discovered for several releases, + the incorrect versions are left in the table for compatibility. However, the + --help function misses out any option that has an underscore in its name. */ + + { OP_PATLIST, N_EXCLUDE_DIR,&exclude_dir_patdata, "exclude_dir=pattern","exclude matching directories when recursing" }, + { OP_PATLIST, N_INCLUDE_DIR,&include_dir_patdata, "include_dir=pattern","include matching directories when recursing" }, + +#ifdef JFRIEDL_DEBUG + { OP_OP_NUMBER, 'S', &S_arg, "jeffS", "replace matched (sub)string with X" }, +#endif + { OP_NODATA, 's', NULL, "no-messages", "suppress error messages" }, + { OP_NODATA, 'u', NULL, "utf-8", "use UTF-8 mode" }, + { OP_NODATA, 'V', NULL, "version", "print version information and exit" }, + { OP_NODATA, 'v', NULL, "invert-match", "select non-matching lines" }, + { OP_NODATA, 'w', NULL, "word-regex(p)", "force patterns to match only as words" }, + { OP_NODATA, 'x', NULL, "line-regex(p)", "force patterns to match only whole lines" }, + { OP_NODATA, 0, NULL, NULL, NULL } +}; + +/* Tables for prefixing and suffixing patterns, according to the -w, -x, and -F +options. These set the 1, 2, and 4 bits in process_options, respectively. Note +that the combination of -w and -x has the same effect as -x on its own, so we +can treat them as the same. Note that the MAXPATLEN macro assumes the longest +prefix+suffix is 10 characters; if anything longer is added, it must be +adjusted. */ + +static const char *prefix[] = { + "", "\\b", "^(?:", "^(?:", "\\Q", "\\b\\Q", "^(?:\\Q", "^(?:\\Q" }; + +static const char *suffix[] = { + "", "\\b", ")$", ")$", "\\E", "\\E\\b", "\\E)$", "\\E)$" }; + +/* UTF-8 tables - used only when the newline setting is "any". */ + +const int utf8_table3[] = { 0xff, 0x1f, 0x0f, 0x07, 0x03, 0x01}; + +const char utf8_table4[] = { + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5 }; + + + +/************************************************* +* Exit from the program * +*************************************************/ + +/* If there has been a resource error, give a suitable message. + +Argument: the return code +Returns: does not return +*/ + +static void +pcregrep_exit(int rc) +{ +if (resource_error) + { + fprintf(stderr, "pcregrep: Error %d, %d or %d means that a resource limit " + "was exceeded.\n", PCRE_ERROR_MATCHLIMIT, PCRE_ERROR_RECURSIONLIMIT, + PCRE_ERROR_JIT_STACKLIMIT); + fprintf(stderr, "pcregrep: Check your regex for nested unlimited loops.\n"); + } +exit(rc); +} + + +/************************************************* +* Add item to chain of patterns * +*************************************************/ + +/* Used to add an item onto a chain, or just return an unconnected item if the +"after" argument is NULL. + +Arguments: + s pattern string to add + after if not NULL points to item to insert after + +Returns: new pattern block or NULL on error +*/ + +static patstr * +add_pattern(char *s, patstr *after) +{ +patstr *p = (patstr *)malloc(sizeof(patstr)); +if (p == NULL) + { + fprintf(stderr, "pcregrep: malloc failed\n"); + pcregrep_exit(2); + } +if (strlen(s) > MAXPATLEN) + { + fprintf(stderr, "pcregrep: pattern is too long (limit is %d bytes)\n", + MAXPATLEN); + free(p); + return NULL; + } +p->next = NULL; +p->string = s; +p->compiled = NULL; +p->hint = NULL; + +if (after != NULL) + { + p->next = after->next; + after->next = p; + } +return p; +} + + +/************************************************* +* Free chain of patterns * +*************************************************/ + +/* Used for several chains of patterns. + +Argument: pointer to start of chain +Returns: nothing +*/ + +static void +free_pattern_chain(patstr *pc) +{ +while (pc != NULL) + { + patstr *p = pc; + pc = p->next; + if (p->hint != NULL) pcre_free_study(p->hint); + if (p->compiled != NULL) pcre_free(p->compiled); + free(p); + } +} + + +/************************************************* +* Free chain of file names * +*************************************************/ + +/* +Argument: pointer to start of chain +Returns: nothing +*/ + +static void +free_file_chain(fnstr *fn) +{ +while (fn != NULL) + { + fnstr *f = fn; + fn = f->next; + free(f); + } +} + + +/************************************************* +* OS-specific functions * +*************************************************/ + +/* These functions are defined so that they can be made system specific. +At present there are versions for Unix-style environments, Windows, native +z/OS, and "no support". */ + + +/************* Directory scanning Unix-style and z/OS ***********/ + +#if (defined HAVE_SYS_STAT_H && defined HAVE_DIRENT_H && defined HAVE_SYS_TYPES_H) || defined NATIVE_ZOS +#include +#include +#include + +#if defined NATIVE_ZOS +/************* Directory and PDS/E scanning for z/OS ***********/ +/************* z/OS looks mostly like Unix with USS ************/ +/* However, z/OS needs the #include statements in this header */ +#include "pcrzosfs.h" +/* That header is not included in the main PCRE distribution because + other apparatus is needed to compile pcregrep for z/OS. The header + can be found in the special z/OS distribution, which is available + from www.zaconsultants.net or from www.cbttape.org. */ +#endif + +typedef DIR directory_type; +#define FILESEP '/' + +static int +isdirectory(char *filename) +{ +struct stat statbuf; +if (stat(filename, &statbuf) < 0) + return 0; /* In the expectation that opening as a file will fail */ +return (statbuf.st_mode & S_IFMT) == S_IFDIR; +} + +static directory_type * +opendirectory(char *filename) +{ +return opendir(filename); +} + +static char * +readdirectory(directory_type *dir) +{ +for (;;) + { + struct dirent *dent = readdir(dir); + if (dent == NULL) return NULL; + if (strcmp(dent->d_name, ".") != 0 && strcmp(dent->d_name, "..") != 0) + return dent->d_name; + } +/* Control never reaches here */ +} + +static void +closedirectory(directory_type *dir) +{ +closedir(dir); +} + + +/************* Test for regular file, Unix-style **********/ + +static int +isregfile(char *filename) +{ +struct stat statbuf; +if (stat(filename, &statbuf) < 0) + return 1; /* In the expectation that opening as a file will fail */ +return (statbuf.st_mode & S_IFMT) == S_IFREG; +} + + +#if defined NATIVE_ZOS +/************* Test for a terminal in z/OS **********/ +/* isatty() does not work in a TSO environment, so always give FALSE.*/ + +static BOOL +is_stdout_tty(void) +{ +return FALSE; +} + +static BOOL +is_file_tty(FILE *f) +{ +return FALSE; +} + + +/************* Test for a terminal, Unix-style **********/ + +#else +static BOOL +is_stdout_tty(void) +{ +return isatty(fileno(stdout)); +} + +static BOOL +is_file_tty(FILE *f) +{ +return isatty(fileno(f)); +} +#endif + +/* End of Unix-style or native z/OS environment functions. */ + + +/************* Directory scanning in Windows ***********/ + +/* I (Philip Hazel) have no means of testing this code. It was contributed by +Lionel Fourquaux. David Burgess added a patch to define INVALID_FILE_ATTRIBUTES +when it did not exist. David Byron added a patch that moved the #include of + to before the INVALID_FILE_ATTRIBUTES definition rather than after. +The double test below stops gcc 4.4.4 grumbling that HAVE_WINDOWS_H is +undefined when it is indeed undefined. */ + +#elif defined HAVE_WINDOWS_H && HAVE_WINDOWS_H + +#ifndef STRICT +# define STRICT +#endif +#ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +#endif + +#include + +#ifndef INVALID_FILE_ATTRIBUTES +#define INVALID_FILE_ATTRIBUTES 0xFFFFFFFF +#endif + +typedef struct directory_type +{ +HANDLE handle; +BOOL first; +WIN32_FIND_DATA data; +} directory_type; + +#define FILESEP '/' + +int +isdirectory(char *filename) +{ +DWORD attr = GetFileAttributes(filename); +if (attr == INVALID_FILE_ATTRIBUTES) + return 0; +return (attr & FILE_ATTRIBUTE_DIRECTORY) != 0; +} + +directory_type * +opendirectory(char *filename) +{ +size_t len; +char *pattern; +directory_type *dir; +DWORD err; +len = strlen(filename); +pattern = (char *)malloc(len + 3); +dir = (directory_type *)malloc(sizeof(*dir)); +if ((pattern == NULL) || (dir == NULL)) + { + fprintf(stderr, "pcregrep: malloc failed\n"); + pcregrep_exit(2); + } +memcpy(pattern, filename, len); +memcpy(&(pattern[len]), "\\*", 3); +dir->handle = FindFirstFile(pattern, &(dir->data)); +if (dir->handle != INVALID_HANDLE_VALUE) + { + free(pattern); + dir->first = TRUE; + return dir; + } +err = GetLastError(); +free(pattern); +free(dir); +errno = (err == ERROR_ACCESS_DENIED) ? EACCES : ENOENT; +return NULL; +} + +char * +readdirectory(directory_type *dir) +{ +for (;;) + { + if (!dir->first) + { + if (!FindNextFile(dir->handle, &(dir->data))) + return NULL; + } + else + { + dir->first = FALSE; + } + if (strcmp(dir->data.cFileName, ".") != 0 && strcmp(dir->data.cFileName, "..") != 0) + return dir->data.cFileName; + } +#ifndef _MSC_VER +return NULL; /* Keep compiler happy; never executed */ +#endif +} + +void +closedirectory(directory_type *dir) +{ +FindClose(dir->handle); +free(dir); +} + + +/************* Test for regular file in Windows **********/ + +/* I don't know how to do this, or if it can be done; assume all paths are +regular if they are not directories. */ + +int isregfile(char *filename) +{ +return !isdirectory(filename); +} + + +/************* Test for a terminal in Windows **********/ + +/* I don't know how to do this; assume never */ + +static BOOL +is_stdout_tty(void) +{ +return FALSE; +} + +static BOOL +is_file_tty(FILE *f) +{ +return FALSE; +} + +/* End of Windows functions */ + + +/************* Directory scanning when we can't do it ***********/ + +/* The type is void, and apart from isdirectory(), the functions do nothing. */ + +#else + +#define FILESEP 0 +typedef void directory_type; + +int isdirectory(char *filename) { return 0; } +directory_type * opendirectory(char *filename) { return (directory_type*)0;} +char *readdirectory(directory_type *dir) { return (char*)0;} +void closedirectory(directory_type *dir) {} + + +/************* Test for regular file when we can't do it **********/ + +/* Assume all files are regular. */ + +int isregfile(char *filename) { return 1; } + + +/************* Test for a terminal when we can't do it **********/ + +static BOOL +is_stdout_tty(void) +{ +return FALSE; +} + +static BOOL +is_file_tty(FILE *f) +{ +return FALSE; +} + +#endif /* End of system-specific functions */ + + + +#ifndef HAVE_STRERROR +/************************************************* +* Provide strerror() for non-ANSI libraries * +*************************************************/ + +/* Some old-fashioned systems still around (e.g. SunOS4) don't have strerror() +in their libraries, but can provide the same facility by this simple +alternative function. */ + +extern int sys_nerr; +extern char *sys_errlist[]; + +char * +strerror(int n) +{ +if (n < 0 || n >= sys_nerr) return "unknown error number"; +return sys_errlist[n]; +} +#endif /* HAVE_STRERROR */ + + + +/************************************************* +* Usage function * +*************************************************/ + +static int +usage(int rc) +{ +option_item *op; +fprintf(stderr, "Usage: pcregrep [-"); +for (op = optionlist; op->one_char != 0; op++) + { + if (op->one_char > 0) fprintf(stderr, "%c", op->one_char); + } +fprintf(stderr, "] [long options] [pattern] [files]\n"); +fprintf(stderr, "Type `pcregrep --help' for more information and the long " + "options.\n"); +return rc; +} + + + +/************************************************* +* Help function * +*************************************************/ + +static void +help(void) +{ +option_item *op; + +printf("Usage: pcregrep [OPTION]... [PATTERN] [FILE1 FILE2 ...]\n"); +printf("Search for PATTERN in each FILE or standard input.\n"); +printf("PATTERN must be present if neither -e nor -f is used.\n"); +printf("\"-\" can be used as a file name to mean STDIN.\n"); + +#ifdef SUPPORT_LIBZ +printf("Files whose names end in .gz are read using zlib.\n"); +#endif + +#ifdef SUPPORT_LIBBZ2 +printf("Files whose names end in .bz2 are read using bzlib2.\n"); +#endif + +#if defined SUPPORT_LIBZ || defined SUPPORT_LIBBZ2 +printf("Other files and the standard input are read as plain files.\n\n"); +#else +printf("All files are read as plain files, without any interpretation.\n\n"); +#endif + +printf("Example: pcregrep -i 'hello.*world' menu.h main.c\n\n"); +printf("Options:\n"); + +for (op = optionlist; op->one_char != 0; op++) + { + int n; + char s[4]; + + /* Two options were accidentally implemented and documented with underscores + instead of hyphens in their names, something that was not noticed for quite a + few releases. When fixing this, I left the underscored versions in the list + in case people were using them. However, we don't want to display them in the + help data. There are no other options that contain underscores, and we do not + expect ever to implement such options. Therefore, just omit any option that + contains an underscore. */ + + if (strchr(op->long_name, '_') != NULL) continue; + + if (op->one_char > 0 && (op->long_name)[0] == 0) + n = 31 - printf(" -%c", op->one_char); + else + { + if (op->one_char > 0) sprintf(s, "-%c,", op->one_char); + else strcpy(s, " "); + n = 31 - printf(" %s --%s", s, op->long_name); + } + + if (n < 1) n = 1; + printf("%.*s%s\n", n, " ", op->help_text); + } + +printf("\nNumbers may be followed by K or M, e.g. --buffer-size=100K.\n"); +printf("The default value for --buffer-size is %d.\n", PCREGREP_BUFSIZE); +printf("When reading patterns or file names from a file, trailing white\n"); +printf("space is removed and blank lines are ignored.\n"); +printf("The maximum size of any pattern is %d bytes.\n", MAXPATLEN); + +printf("\nWith no FILEs, read standard input. If fewer than two FILEs given, assume -h.\n"); +printf("Exit status is 0 if any matches, 1 if no matches, and 2 if trouble.\n"); +} + + + +/************************************************* +* Test exclude/includes * +*************************************************/ + +/* If any exclude pattern matches, the path is excluded. Otherwise, unless +there are no includes, the path must match an include pattern. + +Arguments: + path the path to be matched + ip the chain of include patterns + ep the chain of exclude patterns + +Returns: TRUE if the path is not excluded +*/ + +static BOOL +test_incexc(char *path, patstr *ip, patstr *ep) +{ +int plen = strlen(path); + +for (; ep != NULL; ep = ep->next) + { + if (pcre_exec(ep->compiled, NULL, path, plen, 0, 0, NULL, 0) >= 0) + return FALSE; + } + +if (ip == NULL) return TRUE; + +for (; ip != NULL; ip = ip->next) + { + if (pcre_exec(ip->compiled, NULL, path, plen, 0, 0, NULL, 0) >= 0) + return TRUE; + } + +return FALSE; +} + + + +/************************************************* +* Decode integer argument value * +*************************************************/ + +/* Integer arguments can be followed by K or M. Avoid the use of strtoul() +because SunOS4 doesn't have it. This is used only for unpicking arguments, so +just keep it simple. + +Arguments: + option_data the option data string + op the option item (for error messages) + longop TRUE if option given in long form + +Returns: a long integer +*/ + +static long int +decode_number(char *option_data, option_item *op, BOOL longop) +{ +unsigned long int n = 0; +char *endptr = option_data; +while (*endptr != 0 && isspace((unsigned char)(*endptr))) endptr++; +while (isdigit((unsigned char)(*endptr))) + n = n * 10 + (int)(*endptr++ - '0'); +if (toupper(*endptr) == 'K') + { + n *= 1024; + endptr++; + } +else if (toupper(*endptr) == 'M') + { + n *= 1024*1024; + endptr++; + } + +if (*endptr != 0) /* Error */ + { + if (longop) + { + char *equals = strchr(op->long_name, '='); + int nlen = (equals == NULL)? (int)strlen(op->long_name) : + (int)(equals - op->long_name); + fprintf(stderr, "pcregrep: Malformed number \"%s\" after --%.*s\n", + option_data, nlen, op->long_name); + } + else + fprintf(stderr, "pcregrep: Malformed number \"%s\" after -%c\n", + option_data, op->one_char); + pcregrep_exit(usage(2)); + } + +return n; +} + + + +/************************************************* +* Add item to a chain of numbers * +*************************************************/ + +/* Used to add an item onto a chain, or just return an unconnected item if the +"after" argument is NULL. + +Arguments: + n the number to add + after if not NULL points to item to insert after + +Returns: new number block +*/ + +static omstr * +add_number(int n, omstr *after) +{ +omstr *om = (omstr *)malloc(sizeof(omstr)); + +if (om == NULL) + { + fprintf(stderr, "pcregrep: malloc failed\n"); + pcregrep_exit(2); + } +om->next = NULL; +om->groupnum = n; + +if (after != NULL) + { + om->next = after->next; + after->next = om; + } +return om; +} + + + +/************************************************* +* Read one line of input * +*************************************************/ + +/* Normally, input is read using fread() into a large buffer, so many lines may +be read at once. However, doing this for tty input means that no output appears +until a lot of input has been typed. Instead, tty input is handled line by +line. We cannot use fgets() for this, because it does not stop at a binary +zero, and therefore there is no way of telling how many characters it has read, +because there may be binary zeros embedded in the data. + +Arguments: + buffer the buffer to read into + length the maximum number of characters to read + f the file + +Returns: the number of characters read, zero at end of file +*/ + +static unsigned int +read_one_line(char *buffer, int length, FILE *f) +{ +int c; +int yield = 0; +while ((c = fgetc(f)) != EOF) + { + buffer[yield++] = c; + if (c == '\n' || yield >= length) break; + } +return yield; +} + + + +/************************************************* +* Find end of line * +*************************************************/ + +/* The length of the endline sequence that is found is set via lenptr. This may +be zero at the very end of the file if there is no line-ending sequence there. + +Arguments: + p current position in line + endptr end of available data + lenptr where to put the length of the eol sequence + +Returns: pointer after the last byte of the line, + including the newline byte(s) +*/ + +static char * +end_of_line(char *p, char *endptr, int *lenptr) +{ +switch(endlinetype) + { + default: /* Just in case */ + case EL_LF: + while (p < endptr && *p != '\n') p++; + if (p < endptr) + { + *lenptr = 1; + return p + 1; + } + *lenptr = 0; + return endptr; + + case EL_CR: + while (p < endptr && *p != '\r') p++; + if (p < endptr) + { + *lenptr = 1; + return p + 1; + } + *lenptr = 0; + return endptr; + + case EL_CRLF: + for (;;) + { + while (p < endptr && *p != '\r') p++; + if (++p >= endptr) + { + *lenptr = 0; + return endptr; + } + if (*p == '\n') + { + *lenptr = 2; + return p + 1; + } + } + break; + + case EL_ANYCRLF: + while (p < endptr) + { + int extra = 0; + register int c = *((unsigned char *)p); + + if (utf8 && c >= 0xc0) + { + int gcii, gcss; + extra = utf8_table4[c & 0x3f]; /* Number of additional bytes */ + gcss = 6*extra; + c = (c & utf8_table3[extra]) << gcss; + for (gcii = 1; gcii <= extra; gcii++) + { + gcss -= 6; + c |= (p[gcii] & 0x3f) << gcss; + } + } + + p += 1 + extra; + + switch (c) + { + case '\n': + *lenptr = 1; + return p; + + case '\r': + if (p < endptr && *p == '\n') + { + *lenptr = 2; + p++; + } + else *lenptr = 1; + return p; + + default: + break; + } + } /* End of loop for ANYCRLF case */ + + *lenptr = 0; /* Must have hit the end */ + return endptr; + + case EL_ANY: + while (p < endptr) + { + int extra = 0; + register int c = *((unsigned char *)p); + + if (utf8 && c >= 0xc0) + { + int gcii, gcss; + extra = utf8_table4[c & 0x3f]; /* Number of additional bytes */ + gcss = 6*extra; + c = (c & utf8_table3[extra]) << gcss; + for (gcii = 1; gcii <= extra; gcii++) + { + gcss -= 6; + c |= (p[gcii] & 0x3f) << gcss; + } + } + + p += 1 + extra; + + switch (c) + { + case '\n': /* LF */ + case '\v': /* VT */ + case '\f': /* FF */ + *lenptr = 1; + return p; + + case '\r': /* CR */ + if (p < endptr && *p == '\n') + { + *lenptr = 2; + p++; + } + else *lenptr = 1; + return p; + +#ifndef EBCDIC + case 0x85: /* Unicode NEL */ + *lenptr = utf8? 2 : 1; + return p; + + case 0x2028: /* Unicode LS */ + case 0x2029: /* Unicode PS */ + *lenptr = 3; + return p; +#endif /* Not EBCDIC */ + + default: + break; + } + } /* End of loop for ANY case */ + + *lenptr = 0; /* Must have hit the end */ + return endptr; + } /* End of overall switch */ +} + + + +/************************************************* +* Find start of previous line * +*************************************************/ + +/* This is called when looking back for before lines to print. + +Arguments: + p start of the subsequent line + startptr start of available data + +Returns: pointer to the start of the previous line +*/ + +static char * +previous_line(char *p, char *startptr) +{ +switch(endlinetype) + { + default: /* Just in case */ + case EL_LF: + p--; + while (p > startptr && p[-1] != '\n') p--; + return p; + + case EL_CR: + p--; + while (p > startptr && p[-1] != '\n') p--; + return p; + + case EL_CRLF: + for (;;) + { + p -= 2; + while (p > startptr && p[-1] != '\n') p--; + if (p <= startptr + 1 || p[-2] == '\r') return p; + } + /* Control can never get here */ + + case EL_ANY: + case EL_ANYCRLF: + if (*(--p) == '\n' && p > startptr && p[-1] == '\r') p--; + if (utf8) while ((*p & 0xc0) == 0x80) p--; + + while (p > startptr) + { + register unsigned int c; + char *pp = p - 1; + + if (utf8) + { + int extra = 0; + while ((*pp & 0xc0) == 0x80) pp--; + c = *((unsigned char *)pp); + if (c >= 0xc0) + { + int gcii, gcss; + extra = utf8_table4[c & 0x3f]; /* Number of additional bytes */ + gcss = 6*extra; + c = (c & utf8_table3[extra]) << gcss; + for (gcii = 1; gcii <= extra; gcii++) + { + gcss -= 6; + c |= (pp[gcii] & 0x3f) << gcss; + } + } + } + else c = *((unsigned char *)pp); + + if (endlinetype == EL_ANYCRLF) switch (c) + { + case '\n': /* LF */ + case '\r': /* CR */ + return p; + + default: + break; + } + + else switch (c) + { + case '\n': /* LF */ + case '\v': /* VT */ + case '\f': /* FF */ + case '\r': /* CR */ +#ifndef EBCDIE + case 0x85: /* Unicode NEL */ + case 0x2028: /* Unicode LS */ + case 0x2029: /* Unicode PS */ +#endif /* Not EBCDIC */ + return p; + + default: + break; + } + + p = pp; /* Back one character */ + } /* End of loop for ANY case */ + + return startptr; /* Hit start of data */ + } /* End of overall switch */ +} + + + + + +/************************************************* +* Print the previous "after" lines * +*************************************************/ + +/* This is called if we are about to lose said lines because of buffer filling, +and at the end of the file. The data in the line is written using fwrite() so +that a binary zero does not terminate it. + +Arguments: + lastmatchnumber the number of the last matching line, plus one + lastmatchrestart where we restarted after the last match + endptr end of available data + printname filename for printing + +Returns: nothing +*/ + +static void +do_after_lines(unsigned long int lastmatchnumber, char *lastmatchrestart, + char *endptr, char *printname) +{ +if (after_context > 0 && lastmatchnumber > 0) + { + int count = 0; + while (lastmatchrestart < endptr && count++ < after_context) + { + int ellength; + char *pp = lastmatchrestart; + if (printname != NULL) fprintf(stdout, "%s-", printname); + if (number) fprintf(stdout, "%lu-", lastmatchnumber++); + pp = end_of_line(pp, endptr, &ellength); + FWRITE(lastmatchrestart, 1, pp - lastmatchrestart, stdout); + lastmatchrestart = pp; + } + hyphenpending = TRUE; + } +} + + + +/************************************************* +* Apply patterns to subject till one matches * +*************************************************/ + +/* This function is called to run through all patterns, looking for a match. It +is used multiple times for the same subject when colouring is enabled, in order +to find all possible matches. + +Arguments: + matchptr the start of the subject + length the length of the subject to match + options options for pcre_exec + startoffset where to start matching + offsets the offets vector to fill in + mrc address of where to put the result of pcre_exec() + +Returns: TRUE if there was a match + FALSE if there was no match + invert if there was a non-fatal error +*/ + +static BOOL +match_patterns(char *matchptr, size_t length, unsigned int options, + int startoffset, int *offsets, int *mrc) +{ +int i; +size_t slen = length; +patstr *p = patterns; +const char *msg = "this text:\n\n"; + +if (slen > 200) + { + slen = 200; + msg = "text that starts:\n\n"; + } +for (i = 1; p != NULL; p = p->next, i++) + { + *mrc = pcre_exec(p->compiled, p->hint, matchptr, (int)length, + startoffset, options, offsets, OFFSET_SIZE); + if (*mrc >= 0) return TRUE; + if (*mrc == PCRE_ERROR_NOMATCH) continue; + fprintf(stderr, "pcregrep: pcre_exec() gave error %d while matching ", *mrc); + if (patterns->next != NULL) fprintf(stderr, "pattern number %d to ", i); + fprintf(stderr, "%s", msg); + FWRITE(matchptr, 1, slen, stderr); /* In case binary zero included */ + fprintf(stderr, "\n\n"); + if (*mrc == PCRE_ERROR_MATCHLIMIT || *mrc == PCRE_ERROR_RECURSIONLIMIT || + *mrc == PCRE_ERROR_JIT_STACKLIMIT) + resource_error = TRUE; + if (error_count++ > 20) + { + fprintf(stderr, "pcregrep: Too many errors - abandoned.\n"); + pcregrep_exit(2); + } + return invert; /* No more matching; don't show the line again */ + } + +return FALSE; /* No match, no errors */ +} + + + +/************************************************* +* Grep an individual file * +*************************************************/ + +/* This is called from grep_or_recurse() below. It uses a buffer that is three +times the value of bufthird. The matching point is never allowed to stray into +the top third of the buffer, thus keeping more of the file available for +context printing or for multiline scanning. For large files, the pointer will +be in the middle third most of the time, so the bottom third is available for +"before" context printing. + +Arguments: + handle the fopened FILE stream for a normal file + the gzFile pointer when reading is via libz + the BZFILE pointer when reading is via libbz2 + frtype FR_PLAIN, FR_LIBZ, or FR_LIBBZ2 + filename the file name or NULL (for errors) + printname the file name if it is to be printed for each match + or NULL if the file name is not to be printed + it cannot be NULL if filenames[_nomatch]_only is set + +Returns: 0 if there was at least one match + 1 otherwise (no matches) + 2 if an overlong line is encountered + 3 if there is a read error on a .bz2 file +*/ + +static int +pcregrep(void *handle, int frtype, char *filename, char *printname) +{ +int rc = 1; +int filepos = 0; +int offsets[OFFSET_SIZE]; +unsigned long int linenumber = 1; +unsigned long int lastmatchnumber = 0; +unsigned long int count = 0; +char *lastmatchrestart = NULL; +char *ptr = main_buffer; +char *endptr; +size_t bufflength; +BOOL binary = FALSE; +BOOL endhyphenpending = FALSE; +BOOL input_line_buffered = line_buffered; +FILE *in = NULL; /* Ensure initialized */ + +#ifdef SUPPORT_LIBZ +gzFile ingz = NULL; +#endif + +#ifdef SUPPORT_LIBBZ2 +BZFILE *inbz2 = NULL; +#endif + + +/* Do the first read into the start of the buffer and set up the pointer to end +of what we have. In the case of libz, a non-zipped .gz file will be read as a +plain file. However, if a .bz2 file isn't actually bzipped, the first read will +fail. */ + +(void)frtype; + +#ifdef SUPPORT_LIBZ +if (frtype == FR_LIBZ) + { + ingz = (gzFile)handle; + bufflength = gzread (ingz, main_buffer, bufsize); + } +else +#endif + +#ifdef SUPPORT_LIBBZ2 +if (frtype == FR_LIBBZ2) + { + inbz2 = (BZFILE *)handle; + bufflength = BZ2_bzread(inbz2, main_buffer, bufsize); + if ((int)bufflength < 0) return 2; /* Gotcha: bufflength is size_t; */ + } /* without the cast it is unsigned. */ +else +#endif + + { + in = (FILE *)handle; + if (is_file_tty(in)) input_line_buffered = TRUE; + bufflength = input_line_buffered? + read_one_line(main_buffer, bufsize, in) : + fread(main_buffer, 1, bufsize, in); + } + +endptr = main_buffer + bufflength; + +/* Unless binary-files=text, see if we have a binary file. This uses the same +rule as GNU grep, namely, a search for a binary zero byte near the start of the +file. */ + +if (binary_files != BIN_TEXT) + { + binary = + memchr(main_buffer, 0, (bufflength > 1024)? 1024 : bufflength) != NULL; + if (binary && binary_files == BIN_NOMATCH) return 1; + } + +/* Loop while the current pointer is not at the end of the file. For large +files, endptr will be at the end of the buffer when we are in the middle of the +file, but ptr will never get there, because as soon as it gets over 2/3 of the +way, the buffer is shifted left and re-filled. */ + +while (ptr < endptr) + { + int endlinelength; + int mrc = 0; + int startoffset = 0; + int prevoffsets[2]; + unsigned int options = 0; + BOOL match; + char *matchptr = ptr; + char *t = ptr; + size_t length, linelength; + + prevoffsets[0] = prevoffsets[1] = -1; + + /* At this point, ptr is at the start of a line. We need to find the length + of the subject string to pass to pcre_exec(). In multiline mode, it is the + length remainder of the data in the buffer. Otherwise, it is the length of + the next line, excluding the terminating newline. After matching, we always + advance by the length of the next line. In multiline mode the PCRE_FIRSTLINE + option is used for compiling, so that any match is constrained to be in the + first line. */ + + t = end_of_line(t, endptr, &endlinelength); + linelength = t - ptr - endlinelength; + length = multiline? (size_t)(endptr - ptr) : linelength; + + /* Check to see if the line we are looking at extends right to the very end + of the buffer without a line terminator. This means the line is too long to + handle. */ + + if (endlinelength == 0 && t == main_buffer + bufsize) + { + fprintf(stderr, "pcregrep: line %lu%s%s is too long for the internal buffer\n" + "pcregrep: check the --buffer-size option\n", + linenumber, + (filename == NULL)? "" : " of file ", + (filename == NULL)? "" : filename); + return 2; + } + + /* Extra processing for Jeffrey Friedl's debugging. */ + +#ifdef JFRIEDL_DEBUG + if (jfriedl_XT || jfriedl_XR) + { +# include +# include + struct timeval start_time, end_time; + struct timezone dummy; + int i; + + if (jfriedl_XT) + { + unsigned long newlen = length * jfriedl_XT + strlen(jfriedl_prefix) + strlen(jfriedl_postfix); + const char *orig = ptr; + ptr = malloc(newlen + 1); + if (!ptr) { + printf("out of memory"); + pcregrep_exit(2); + } + endptr = ptr; + strcpy(endptr, jfriedl_prefix); endptr += strlen(jfriedl_prefix); + for (i = 0; i < jfriedl_XT; i++) { + strncpy(endptr, orig, length); + endptr += length; + } + strcpy(endptr, jfriedl_postfix); endptr += strlen(jfriedl_postfix); + length = newlen; + } + + if (gettimeofday(&start_time, &dummy) != 0) + perror("bad gettimeofday"); + + + for (i = 0; i < jfriedl_XR; i++) + match = (pcre_exec(patterns->compiled, patterns->hint, ptr, length, 0, + PCRE_NOTEMPTY, offsets, OFFSET_SIZE) >= 0); + + if (gettimeofday(&end_time, &dummy) != 0) + perror("bad gettimeofday"); + + double delta = ((end_time.tv_sec + (end_time.tv_usec / 1000000.0)) + - + (start_time.tv_sec + (start_time.tv_usec / 1000000.0))); + + printf("%s TIMER[%.4f]\n", match ? "MATCH" : "FAIL", delta); + return 0; + } +#endif + + /* We come back here after a match when show_only_matching is set, in order + to find any further matches in the same line. This applies to + --only-matching, --file-offsets, and --line-offsets. */ + + ONLY_MATCHING_RESTART: + + /* Run through all the patterns until one matches or there is an error other + than NOMATCH. This code is in a subroutine so that it can be re-used for + finding subsequent matches when colouring matched lines. After finding one + match, set PCRE_NOTEMPTY to disable any further matches of null strings in + this line. */ + + match = match_patterns(matchptr, length, options, startoffset, offsets, &mrc); + options = PCRE_NOTEMPTY; + + /* If it's a match or a not-match (as required), do what's wanted. */ + + if (match != invert) + { + BOOL hyphenprinted = FALSE; + + /* We've failed if we want a file that doesn't have any matches. */ + + if (filenames == FN_NOMATCH_ONLY) return 1; + + /* If all we want is a yes/no answer, stop now. */ + + if (quiet) return 0; + + /* Just count if just counting is wanted. */ + + else if (count_only) count++; + + /* When handling a binary file and binary-files==binary, the "binary" + variable will be set true (it's false in all other cases). In this + situation we just want to output the file name. No need to scan further. */ + + else if (binary) + { + fprintf(stdout, "Binary file %s matches\n", filename); + return 0; + } + + /* If all we want is a file name, there is no need to scan any more lines + in the file. */ + + else if (filenames == FN_MATCH_ONLY) + { + fprintf(stdout, "%s\n", printname); + return 0; + } + + /* The --only-matching option prints just the substring that matched, + and/or one or more captured portions of it, as long as these strings are + not empty. The --file-offsets and --line-offsets options output offsets for + the matching substring (all three set show_only_matching). None of these + mutually exclusive options prints any context. Afterwards, adjust the start + and then jump back to look for further matches in the same line. If we are + in invert mode, however, nothing is printed and we do not restart - this + could still be useful because the return code is set. */ + + else if (show_only_matching) + { + if (!invert) + { + int oldstartoffset = startoffset; + + /* It is possible, when a lookbehind assertion contains \K, for the + same string to be found again. The code below advances startoffset, but + until it is past the "bumpalong" offset that gave the match, the same + substring will be returned. The PCRE1 library does not return the + bumpalong offset, so all we can do is ignore repeated strings. (PCRE2 + does this better.) */ + + if (prevoffsets[0] != offsets[0] || prevoffsets[1] != offsets[1]) + { + prevoffsets[0] = offsets[0]; + prevoffsets[1] = offsets[1]; + + if (printname != NULL) fprintf(stdout, "%s:", printname); + if (number) fprintf(stdout, "%lu:", linenumber); + + /* Handle --line-offsets */ + + if (line_offsets) + fprintf(stdout, "%d,%d\n", (int)(matchptr + offsets[0] - ptr), + offsets[1] - offsets[0]); + + /* Handle --file-offsets */ + + else if (file_offsets) + fprintf(stdout, "%d,%d\n", + (int)(filepos + matchptr + offsets[0] - ptr), + offsets[1] - offsets[0]); + + /* Handle --only-matching, which may occur many times */ + + else + { + BOOL printed = FALSE; + omstr *om; + + for (om = only_matching; om != NULL; om = om->next) + { + int n = om->groupnum; + if (n < mrc) + { + int plen = offsets[2*n + 1] - offsets[2*n]; + if (plen > 0) + { + if (printed) fprintf(stdout, "%s", om_separator); + if (do_colour) fprintf(stdout, "%c[%sm", 0x1b, colour_string); + FWRITE(matchptr + offsets[n*2], 1, plen, stdout); + if (do_colour) fprintf(stdout, "%c[00m", 0x1b); + printed = TRUE; + } + } + } + + if (printed || printname != NULL || number) fprintf(stdout, "\n"); + } + } + + /* Prepare to repeat to find the next match. If the patterned contained + a lookbehind tht included \K, it is possible that the end of the match + might be at or before the actual strting offset we have just used. We + need to start one character further on. Unfortunately, for unanchored + patterns, the actual start offset can be greater that the one that was + set as a result of "bumpalong". PCRE1 does not return the actual start + offset, so we have to check against the original start offset. This may + lead to duplicates - we we need the fudge above to avoid printing them. + (PCRE2 does this better.) */ + + match = FALSE; + if (line_buffered) fflush(stdout); + rc = 0; /* Had some success */ + + startoffset = offsets[1]; /* Restart after the match */ + if (startoffset <= oldstartoffset) + { + if ((size_t)startoffset >= length) + goto END_ONE_MATCH; /* We were at the end */ + startoffset = oldstartoffset + 1; + if (utf8) + while ((matchptr[startoffset] & 0xc0) == 0x80) startoffset++; + } + + /* If the current match ended past the end of the line (only possible + in multiline mode), we must move on to the line in which it did end + before searching for more matches. */ + + while (startoffset > (int)linelength) + { + matchptr = ptr += linelength + endlinelength; + filepos += (int)(linelength + endlinelength); + linenumber++; + startoffset -= (int)(linelength + endlinelength); + t = end_of_line(ptr, endptr, &endlinelength); + linelength = t - ptr - endlinelength; + length = (size_t)(endptr - ptr); + } + + goto ONLY_MATCHING_RESTART; + } + } + + /* This is the default case when none of the above options is set. We print + the matching lines(s), possibly preceded and/or followed by other lines of + context. */ + + else + { + /* See if there is a requirement to print some "after" lines from a + previous match. We never print any overlaps. */ + + if (after_context > 0 && lastmatchnumber > 0) + { + int ellength; + int linecount = 0; + char *p = lastmatchrestart; + + while (p < ptr && linecount < after_context) + { + p = end_of_line(p, ptr, &ellength); + linecount++; + } + + /* It is important to advance lastmatchrestart during this printing so + that it interacts correctly with any "before" printing below. Print + each line's data using fwrite() in case there are binary zeroes. */ + + while (lastmatchrestart < p) + { + char *pp = lastmatchrestart; + if (printname != NULL) fprintf(stdout, "%s-", printname); + if (number) fprintf(stdout, "%lu-", lastmatchnumber++); + pp = end_of_line(pp, endptr, &ellength); + FWRITE(lastmatchrestart, 1, pp - lastmatchrestart, stdout); + lastmatchrestart = pp; + } + if (lastmatchrestart != ptr) hyphenpending = TRUE; + } + + /* If there were non-contiguous lines printed above, insert hyphens. */ + + if (hyphenpending) + { + fprintf(stdout, "--\n"); + hyphenpending = FALSE; + hyphenprinted = TRUE; + } + + /* See if there is a requirement to print some "before" lines for this + match. Again, don't print overlaps. */ + + if (before_context > 0) + { + int linecount = 0; + char *p = ptr; + + while (p > main_buffer && (lastmatchnumber == 0 || p > lastmatchrestart) && + linecount < before_context) + { + linecount++; + p = previous_line(p, main_buffer); + } + + if (lastmatchnumber > 0 && p > lastmatchrestart && !hyphenprinted) + fprintf(stdout, "--\n"); + + while (p < ptr) + { + int ellength; + char *pp = p; + if (printname != NULL) fprintf(stdout, "%s-", printname); + if (number) fprintf(stdout, "%lu-", linenumber - linecount--); + pp = end_of_line(pp, endptr, &ellength); + FWRITE(p, 1, pp - p, stdout); + p = pp; + } + } + + /* Now print the matching line(s); ensure we set hyphenpending at the end + of the file if any context lines are being output. */ + + if (after_context > 0 || before_context > 0) + endhyphenpending = TRUE; + + if (printname != NULL) fprintf(stdout, "%s:", printname); + if (number) fprintf(stdout, "%lu:", linenumber); + + /* In multiline mode, we want to print to the end of the line in which + the end of the matched string is found, so we adjust linelength and the + line number appropriately, but only when there actually was a match + (invert not set). Because the PCRE_FIRSTLINE option is set, the start of + the match will always be before the first newline sequence. */ + + if (multiline & !invert) + { + char *endmatch = ptr + offsets[1]; + t = ptr; + while (t <= endmatch) + { + t = end_of_line(t, endptr, &endlinelength); + if (t < endmatch) linenumber++; else break; + } + linelength = t - ptr - endlinelength; + } + + /*** NOTE: Use only fwrite() to output the data line, so that binary + zeroes are treated as just another data character. */ + + /* This extra option, for Jeffrey Friedl's debugging requirements, + replaces the matched string, or a specific captured string if it exists, + with X. When this happens, colouring is ignored. */ + +#ifdef JFRIEDL_DEBUG + if (S_arg >= 0 && S_arg < mrc) + { + int first = S_arg * 2; + int last = first + 1; + FWRITE(ptr, 1, offsets[first], stdout); + fprintf(stdout, "X"); + FWRITE(ptr + offsets[last], 1, linelength - offsets[last], stdout); + } + else +#endif + + /* We have to split the line(s) up if colouring, and search for further + matches, but not of course if the line is a non-match. */ + + if (do_colour && !invert) + { + int plength; + FWRITE(ptr, 1, offsets[0], stdout); + fprintf(stdout, "%c[%sm", 0x1b, colour_string); + FWRITE(ptr + offsets[0], 1, offsets[1] - offsets[0], stdout); + fprintf(stdout, "%c[00m", 0x1b); + for (;;) + { + startoffset = offsets[1]; + if (startoffset >= (int)linelength + endlinelength || + !match_patterns(matchptr, length, options, startoffset, offsets, + &mrc)) + break; + FWRITE(matchptr + startoffset, 1, offsets[0] - startoffset, stdout); + fprintf(stdout, "%c[%sm", 0x1b, colour_string); + FWRITE(matchptr + offsets[0], 1, offsets[1] - offsets[0], stdout); + fprintf(stdout, "%c[00m", 0x1b); + } + + /* In multiline mode, we may have already printed the complete line + and its line-ending characters (if they matched the pattern), so there + may be no more to print. */ + + plength = (int)((linelength + endlinelength) - startoffset); + if (plength > 0) FWRITE(ptr + startoffset, 1, plength, stdout); + } + + /* Not colouring; no need to search for further matches */ + + else FWRITE(ptr, 1, linelength + endlinelength, stdout); + } + + /* End of doing what has to be done for a match. If --line-buffered was + given, flush the output. */ + + if (line_buffered) fflush(stdout); + rc = 0; /* Had some success */ + + /* Remember where the last match happened for after_context. We remember + where we are about to restart, and that line's number. */ + + lastmatchrestart = ptr + linelength + endlinelength; + lastmatchnumber = linenumber + 1; + } + + /* For a match in multiline inverted mode (which of course did not cause + anything to be printed), we have to move on to the end of the match before + proceeding. */ + + if (multiline && invert && match) + { + int ellength; + char *endmatch = ptr + offsets[1]; + t = ptr; + while (t < endmatch) + { + t = end_of_line(t, endptr, &ellength); + if (t <= endmatch) linenumber++; else break; + } + endmatch = end_of_line(endmatch, endptr, &ellength); + linelength = endmatch - ptr - ellength; + } + + /* Advance to after the newline and increment the line number. The file + offset to the current line is maintained in filepos. */ + + END_ONE_MATCH: + ptr += linelength + endlinelength; + filepos += (int)(linelength + endlinelength); + linenumber++; + + /* If input is line buffered, and the buffer is not yet full, read another + line and add it into the buffer. */ + + if (input_line_buffered && bufflength < (size_t)bufsize) + { + int add = read_one_line(ptr, bufsize - (int)(ptr - main_buffer), in); + bufflength += add; + endptr += add; + } + + /* If we haven't yet reached the end of the file (the buffer is full), and + the current point is in the top 1/3 of the buffer, slide the buffer down by + 1/3 and refill it. Before we do this, if some unprinted "after" lines are + about to be lost, print them. */ + + if (bufflength >= (size_t)bufsize && ptr > main_buffer + 2*bufthird) + { + if (after_context > 0 && + lastmatchnumber > 0 && + lastmatchrestart < main_buffer + bufthird) + { + do_after_lines(lastmatchnumber, lastmatchrestart, endptr, printname); + lastmatchnumber = 0; + } + + /* Now do the shuffle */ + + memmove(main_buffer, main_buffer + bufthird, 2*bufthird); + ptr -= bufthird; + +#ifdef SUPPORT_LIBZ + if (frtype == FR_LIBZ) + bufflength = 2*bufthird + + gzread (ingz, main_buffer + 2*bufthird, bufthird); + else +#endif + +#ifdef SUPPORT_LIBBZ2 + if (frtype == FR_LIBBZ2) + bufflength = 2*bufthird + + BZ2_bzread(inbz2, main_buffer + 2*bufthird, bufthird); + else +#endif + + bufflength = 2*bufthird + + (input_line_buffered? + read_one_line(main_buffer + 2*bufthird, bufthird, in) : + fread(main_buffer + 2*bufthird, 1, bufthird, in)); + endptr = main_buffer + bufflength; + + /* Adjust any last match point */ + + if (lastmatchnumber > 0) lastmatchrestart -= bufthird; + } + } /* Loop through the whole file */ + +/* End of file; print final "after" lines if wanted; do_after_lines sets +hyphenpending if it prints something. */ + +if (!show_only_matching && !count_only) + { + do_after_lines(lastmatchnumber, lastmatchrestart, endptr, printname); + hyphenpending |= endhyphenpending; + } + +/* Print the file name if we are looking for those without matches and there +were none. If we found a match, we won't have got this far. */ + +if (filenames == FN_NOMATCH_ONLY) + { + fprintf(stdout, "%s\n", printname); + return 0; + } + +/* Print the match count if wanted */ + +if (count_only && !quiet) + { + if (count > 0 || !omit_zero_count) + { + if (printname != NULL && filenames != FN_NONE) + fprintf(stdout, "%s:", printname); + fprintf(stdout, "%lu\n", count); + } + } + +return rc; +} + + + +/************************************************* +* Grep a file or recurse into a directory * +*************************************************/ + +/* Given a path name, if it's a directory, scan all the files if we are +recursing; if it's a file, grep it. + +Arguments: + pathname the path to investigate + dir_recurse TRUE if recursing is wanted (-r or -drecurse) + only_one_at_top TRUE if the path is the only one at toplevel + +Returns: -1 the file/directory was skipped + 0 if there was at least one match + 1 if there were no matches + 2 there was some kind of error + +However, file opening failures are suppressed if "silent" is set. +*/ + +static int +grep_or_recurse(char *pathname, BOOL dir_recurse, BOOL only_one_at_top) +{ +int rc = 1; +int frtype; +void *handle; +char *lastcomp; +FILE *in = NULL; /* Ensure initialized */ + +#ifdef SUPPORT_LIBZ +gzFile ingz = NULL; +#endif + +#ifdef SUPPORT_LIBBZ2 +BZFILE *inbz2 = NULL; +#endif + +#if defined SUPPORT_LIBZ || defined SUPPORT_LIBBZ2 +int pathlen; +#endif + +#if defined NATIVE_ZOS +int zos_type; +FILE *zos_test_file; +#endif + +/* If the file name is "-" we scan stdin */ + +if (strcmp(pathname, "-") == 0) + { + return pcregrep(stdin, FR_PLAIN, stdin_name, + (filenames > FN_DEFAULT || (filenames == FN_DEFAULT && !only_one_at_top))? + stdin_name : NULL); + } + +/* Inclusion and exclusion: --include-dir and --exclude-dir apply only to +directories, whereas --include and --exclude apply to everything else. The test +is against the final component of the path. */ + +lastcomp = strrchr(pathname, FILESEP); +lastcomp = (lastcomp == NULL)? pathname : lastcomp + 1; + +/* If the file is a directory, skip if not recursing or if explicitly excluded. +Otherwise, scan the directory and recurse for each path within it. The scanning +code is localized so it can be made system-specific. */ + + +/* For z/OS, determine the file type. */ + +#if defined NATIVE_ZOS +zos_test_file = fopen(pathname,"rb"); + +if (zos_test_file == NULL) + { + if (!silent) fprintf(stderr, "pcregrep: failed to test next file %s\n", + pathname, strerror(errno)); + return -1; + } +zos_type = identifyzosfiletype (zos_test_file); +fclose (zos_test_file); + +/* Handle a PDS in separate code */ + +if (zos_type == __ZOS_PDS || zos_type == __ZOS_PDSE) + { + return travelonpdsdir (pathname, only_one_at_top); + } + +/* Deal with regular files in the normal way below. These types are: + zos_type == __ZOS_PDS_MEMBER + zos_type == __ZOS_PS + zos_type == __ZOS_VSAM_KSDS + zos_type == __ZOS_VSAM_ESDS + zos_type == __ZOS_VSAM_RRDS +*/ + +/* Handle a z/OS directory using common code. */ + +else if (zos_type == __ZOS_HFS) + { +#endif /* NATIVE_ZOS */ + + +/* Handle directories: common code for all OS */ + +if (isdirectory(pathname)) + { + if (dee_action == dee_SKIP || + !test_incexc(lastcomp, include_dir_patterns, exclude_dir_patterns)) + return -1; + + if (dee_action == dee_RECURSE) + { + char buffer[2048]; + char *nextfile; + directory_type *dir = opendirectory(pathname); + + if (dir == NULL) + { + if (!silent) + fprintf(stderr, "pcregrep: Failed to open directory %s: %s\n", pathname, + strerror(errno)); + return 2; + } + + while ((nextfile = readdirectory(dir)) != NULL) + { + int frc; + int fnlength = strlen(pathname) + strlen(nextfile) + 2; + if (fnlength > 2048) + { + fprintf(stderr, "pcregrep: recursive filename is too long\n"); + rc = 2; + break; + } + sprintf(buffer, "%s%c%s", pathname, FILESEP, nextfile); + frc = grep_or_recurse(buffer, dir_recurse, FALSE); + if (frc > 1) rc = frc; + else if (frc == 0 && rc == 1) rc = 0; + } + + closedirectory(dir); + return rc; + } + } + +#if defined NATIVE_ZOS + } +#endif + +/* If the file is not a directory, check for a regular file, and if it is not, +skip it if that's been requested. Otherwise, check for an explicit inclusion or +exclusion. */ + +else if ( +#if defined NATIVE_ZOS + (zos_type == __ZOS_NOFILE && DEE_action == DEE_SKIP) || +#else /* all other OS */ + (!isregfile(pathname) && DEE_action == DEE_SKIP) || +#endif + !test_incexc(lastcomp, include_patterns, exclude_patterns)) + return -1; /* File skipped */ + +/* Control reaches here if we have a regular file, or if we have a directory +and recursion or skipping was not requested, or if we have anything else and +skipping was not requested. The scan proceeds. If this is the first and only +argument at top level, we don't show the file name, unless we are only showing +the file name, or the filename was forced (-H). */ + +#if defined SUPPORT_LIBZ || defined SUPPORT_LIBBZ2 +pathlen = (int)(strlen(pathname)); +#endif + +/* Open using zlib if it is supported and the file name ends with .gz. */ + +#ifdef SUPPORT_LIBZ +if (pathlen > 3 && strcmp(pathname + pathlen - 3, ".gz") == 0) + { + ingz = gzopen(pathname, "rb"); + if (ingz == NULL) + { + if (!silent) + fprintf(stderr, "pcregrep: Failed to open %s: %s\n", pathname, + strerror(errno)); + return 2; + } + handle = (void *)ingz; + frtype = FR_LIBZ; + } +else +#endif + +/* Otherwise open with bz2lib if it is supported and the name ends with .bz2. */ + +#ifdef SUPPORT_LIBBZ2 +if (pathlen > 4 && strcmp(pathname + pathlen - 4, ".bz2") == 0) + { + inbz2 = BZ2_bzopen(pathname, "rb"); + handle = (void *)inbz2; + frtype = FR_LIBBZ2; + } +else +#endif + +/* Otherwise use plain fopen(). The label is so that we can come back here if +an attempt to read a .bz2 file indicates that it really is a plain file. */ + +#ifdef SUPPORT_LIBBZ2 +PLAIN_FILE: +#endif + { + in = fopen(pathname, "rb"); + handle = (void *)in; + frtype = FR_PLAIN; + } + +/* All the opening methods return errno when they fail. */ + +if (handle == NULL) + { + if (!silent) + fprintf(stderr, "pcregrep: Failed to open %s: %s\n", pathname, + strerror(errno)); + return 2; + } + +/* Now grep the file */ + +rc = pcregrep(handle, frtype, pathname, (filenames > FN_DEFAULT || + (filenames == FN_DEFAULT && !only_one_at_top))? pathname : NULL); + +/* Close in an appropriate manner. */ + +#ifdef SUPPORT_LIBZ +if (frtype == FR_LIBZ) + gzclose(ingz); +else +#endif + +/* If it is a .bz2 file and the result is 3, it means that the first attempt to +read failed. If the error indicates that the file isn't in fact bzipped, try +again as a normal file. */ + +#ifdef SUPPORT_LIBBZ2 +if (frtype == FR_LIBBZ2) + { + if (rc == 3) + { + int errnum; + const char *err = BZ2_bzerror(inbz2, &errnum); + if (errnum == BZ_DATA_ERROR_MAGIC) + { + BZ2_bzclose(inbz2); + goto PLAIN_FILE; + } + else if (!silent) + fprintf(stderr, "pcregrep: Failed to read %s using bzlib: %s\n", + pathname, err); + rc = 2; /* The normal "something went wrong" code */ + } + BZ2_bzclose(inbz2); + } +else +#endif + +/* Normal file close */ + +fclose(in); + +/* Pass back the yield from pcregrep(). */ + +return rc; +} + + + +/************************************************* +* Handle a single-letter, no data option * +*************************************************/ + +static int +handle_option(int letter, int options) +{ +switch(letter) + { + case N_FOFFSETS: file_offsets = TRUE; break; + case N_HELP: help(); pcregrep_exit(0); + case N_LBUFFER: line_buffered = TRUE; break; + case N_LOFFSETS: line_offsets = number = TRUE; break; + case N_NOJIT: study_options &= ~PCRE_STUDY_JIT_COMPILE; break; + case 'a': binary_files = BIN_TEXT; break; + case 'c': count_only = TRUE; break; + case 'F': process_options |= PO_FIXED_STRINGS; break; + case 'H': filenames = FN_FORCE; break; + case 'I': binary_files = BIN_NOMATCH; break; + case 'h': filenames = FN_NONE; break; + case 'i': options |= PCRE_CASELESS; break; + case 'l': omit_zero_count = TRUE; filenames = FN_MATCH_ONLY; break; + case 'L': filenames = FN_NOMATCH_ONLY; break; + case 'M': multiline = TRUE; options |= PCRE_MULTILINE|PCRE_FIRSTLINE; break; + case 'n': number = TRUE; break; + + case 'o': + only_matching_last = add_number(0, only_matching_last); + if (only_matching == NULL) only_matching = only_matching_last; + break; + + case 'q': quiet = TRUE; break; + case 'r': dee_action = dee_RECURSE; break; + case 's': silent = TRUE; break; + case 'u': options |= PCRE_UTF8; utf8 = TRUE; break; + case 'v': invert = TRUE; break; + case 'w': process_options |= PO_WORD_MATCH; break; + case 'x': process_options |= PO_LINE_MATCH; break; + + case 'V': + fprintf(stdout, "pcregrep version %s\n", pcre_version()); + pcregrep_exit(0); + break; + + default: + fprintf(stderr, "pcregrep: Unknown option -%c\n", letter); + pcregrep_exit(usage(2)); + } + +return options; +} + + + + +/************************************************* +* Construct printed ordinal * +*************************************************/ + +/* This turns a number into "1st", "3rd", etc. */ + +static char * +ordin(int n) +{ +static char buffer[14]; +char *p = buffer; +sprintf(p, "%d", n); +while (*p != 0) p++; +switch (n%10) + { + case 1: strcpy(p, "st"); break; + case 2: strcpy(p, "nd"); break; + case 3: strcpy(p, "rd"); break; + default: strcpy(p, "th"); break; + } +return buffer; +} + + + +/************************************************* +* Compile a single pattern * +*************************************************/ + +/* Do nothing if the pattern has already been compiled. This is the case for +include/exclude patterns read from a file. + +When the -F option has been used, each "pattern" may be a list of strings, +separated by line breaks. They will be matched literally. We split such a +string and compile the first substring, inserting an additional block into the +pattern chain. + +Arguments: + p points to the pattern block + options the PCRE options + popts the processing options + fromfile TRUE if the pattern was read from a file + fromtext file name or identifying text (e.g. "include") + count 0 if this is the only command line pattern, or + number of the command line pattern, or + linenumber for a pattern from a file + +Returns: TRUE on success, FALSE after an error +*/ + +static BOOL +compile_pattern(patstr *p, int options, int popts, int fromfile, + const char *fromtext, int count) +{ +char buffer[PATBUFSIZE]; +const char *error; +char *ps = p->string; +int patlen = strlen(ps); +int errptr; + +if (p->compiled != NULL) return TRUE; + +if ((popts & PO_FIXED_STRINGS) != 0) + { + int ellength; + char *eop = ps + patlen; + char *pe = end_of_line(ps, eop, &ellength); + + if (ellength != 0) + { + if (add_pattern(pe, p) == NULL) return FALSE; + patlen = (int)(pe - ps - ellength); + } + } + +if (snprintf(buffer, PATBUFSIZE, "%s%.*s%s", prefix[popts], patlen, ps, + suffix[popts]) > PATBUFSIZE) + { + fprintf(stderr, "pcregrep: Buffer overflow while compiling \"%s\"\n", + ps); + return FALSE; + } + +p->compiled = pcre_compile(buffer, options, &error, &errptr, pcretables); +if (p->compiled != NULL) return TRUE; + +/* Handle compile errors */ + +errptr -= (int)strlen(prefix[popts]); +if (errptr > patlen) errptr = patlen; + +if (fromfile) + { + fprintf(stderr, "pcregrep: Error in regex in line %d of %s " + "at offset %d: %s\n", count, fromtext, errptr, error); + } +else + { + if (count == 0) + fprintf(stderr, "pcregrep: Error in %s regex at offset %d: %s\n", + fromtext, errptr, error); + else + fprintf(stderr, "pcregrep: Error in %s %s regex at offset %d: %s\n", + ordin(count), fromtext, errptr, error); + } + +return FALSE; +} + + + +/************************************************* +* Read and compile a file of patterns * +*************************************************/ + +/* This is used for --filelist, --include-from, and --exclude-from. + +Arguments: + name the name of the file; "-" is stdin + patptr pointer to the pattern chain anchor + patlastptr pointer to the last pattern pointer + popts the process options to pass to pattern_compile() + +Returns: TRUE if all went well +*/ + +static BOOL +read_pattern_file(char *name, patstr **patptr, patstr **patlastptr, int popts) +{ +int linenumber = 0; +FILE *f; +char *filename; +char buffer[PATBUFSIZE]; + +if (strcmp(name, "-") == 0) + { + f = stdin; + filename = stdin_name; + } +else + { + f = fopen(name, "r"); + if (f == NULL) + { + fprintf(stderr, "pcregrep: Failed to open %s: %s\n", name, strerror(errno)); + return FALSE; + } + filename = name; + } + +while (fgets(buffer, PATBUFSIZE, f) != NULL) + { + char *s = buffer + (int)strlen(buffer); + while (s > buffer && isspace((unsigned char)(s[-1]))) s--; + *s = 0; + linenumber++; + if (buffer[0] == 0) continue; /* Skip blank lines */ + + /* Note: this call to add_pattern() puts a pointer to the local variable + "buffer" into the pattern chain. However, that pointer is used only when + compiling the pattern, which happens immediately below, so we flatten it + afterwards, as a precaution against any later code trying to use it. */ + + *patlastptr = add_pattern(buffer, *patlastptr); + if (*patlastptr == NULL) + { + if (f != stdin) fclose(f); + return FALSE; + } + if (*patptr == NULL) *patptr = *patlastptr; + + /* This loop is needed because compiling a "pattern" when -F is set may add + on additional literal patterns if the original contains a newline. In the + common case, it never will, because fgets() stops at a newline. However, + the -N option can be used to give pcregrep a different newline setting. */ + + for(;;) + { + if (!compile_pattern(*patlastptr, pcre_options, popts, TRUE, filename, + linenumber)) + { + if (f != stdin) fclose(f); + return FALSE; + } + (*patlastptr)->string = NULL; /* Insurance */ + if ((*patlastptr)->next == NULL) break; + *patlastptr = (*patlastptr)->next; + } + } + +if (f != stdin) fclose(f); +return TRUE; +} + + + +/************************************************* +* Main program * +*************************************************/ + +/* Returns 0 if something matched, 1 if nothing matched, 2 after an error. */ + +int +main(int argc, char **argv) +{ +int i, j; +int rc = 1; +BOOL only_one_at_top; +patstr *cp; +fnstr *fn; +const char *locale_from = "--locale"; +const char *error; + +#ifdef SUPPORT_PCREGREP_JIT +pcre_jit_stack *jit_stack = NULL; +#endif + +/* Set the default line ending value from the default in the PCRE library; +"lf", "cr", "crlf", and "any" are supported. Anything else is treated as "lf". +Note that the return values from pcre_config(), though derived from the ASCII +codes, are the same in EBCDIC environments, so we must use the actual values +rather than escapes such as as '\r'. */ + +(void)pcre_config(PCRE_CONFIG_NEWLINE, &i); +switch(i) + { + default: newline = (char *)"lf"; break; + case 13: newline = (char *)"cr"; break; + case (13 << 8) | 10: newline = (char *)"crlf"; break; + case -1: newline = (char *)"any"; break; + case -2: newline = (char *)"anycrlf"; break; + } + +/* Process the options */ + +for (i = 1; i < argc; i++) + { + option_item *op = NULL; + char *option_data = (char *)""; /* default to keep compiler happy */ + BOOL longop; + BOOL longopwasequals = FALSE; + + if (argv[i][0] != '-') break; + + /* If we hit an argument that is just "-", it may be a reference to STDIN, + but only if we have previously had -e or -f to define the patterns. */ + + if (argv[i][1] == 0) + { + if (pattern_files != NULL || patterns != NULL) break; + else pcregrep_exit(usage(2)); + } + + /* Handle a long name option, or -- to terminate the options */ + + if (argv[i][1] == '-') + { + char *arg = argv[i] + 2; + char *argequals = strchr(arg, '='); + + if (*arg == 0) /* -- terminates options */ + { + i++; + break; /* out of the options-handling loop */ + } + + longop = TRUE; + + /* Some long options have data that follows after =, for example file=name. + Some options have variations in the long name spelling: specifically, we + allow "regexp" because GNU grep allows it, though I personally go along + with Jeffrey Friedl and Larry Wall in preferring "regex" without the "p". + These options are entered in the table as "regex(p)". Options can be in + both these categories. */ + + for (op = optionlist; op->one_char != 0; op++) + { + char *opbra = strchr(op->long_name, '('); + char *equals = strchr(op->long_name, '='); + + /* Handle options with only one spelling of the name */ + + if (opbra == NULL) /* Does not contain '(' */ + { + if (equals == NULL) /* Not thing=data case */ + { + if (strcmp(arg, op->long_name) == 0) break; + } + else /* Special case xxx=data */ + { + int oplen = (int)(equals - op->long_name); + int arglen = (argequals == NULL)? + (int)strlen(arg) : (int)(argequals - arg); + if (oplen == arglen && strncmp(arg, op->long_name, oplen) == 0) + { + option_data = arg + arglen; + if (*option_data == '=') + { + option_data++; + longopwasequals = TRUE; + } + break; + } + } + } + + /* Handle options with an alternate spelling of the name */ + + else + { + char buff1[24]; + char buff2[24]; + + int baselen = (int)(opbra - op->long_name); + int fulllen = (int)(strchr(op->long_name, ')') - op->long_name + 1); + int arglen = (argequals == NULL || equals == NULL)? + (int)strlen(arg) : (int)(argequals - arg); + + if (snprintf(buff1, sizeof(buff1), "%.*s", baselen, op->long_name) > + (int)sizeof(buff1) || + snprintf(buff2, sizeof(buff2), "%s%.*s", buff1, + fulllen - baselen - 2, opbra + 1) > (int)sizeof(buff2)) + { + fprintf(stderr, "pcregrep: Buffer overflow when parsing %s option\n", + op->long_name); + pcregrep_exit(2); + } + + if (strncmp(arg, buff1, arglen) == 0 || + strncmp(arg, buff2, arglen) == 0) + { + if (equals != NULL && argequals != NULL) + { + option_data = argequals; + if (*option_data == '=') + { + option_data++; + longopwasequals = TRUE; + } + } + break; + } + } + } + + if (op->one_char == 0) + { + fprintf(stderr, "pcregrep: Unknown option %s\n", argv[i]); + pcregrep_exit(usage(2)); + } + } + + /* Jeffrey Friedl's debugging harness uses these additional options which + are not in the right form for putting in the option table because they use + only one hyphen, yet are more than one character long. By putting them + separately here, they will not get displayed as part of the help() output, + but I don't think Jeffrey will care about that. */ + +#ifdef JFRIEDL_DEBUG + else if (strcmp(argv[i], "-pre") == 0) { + jfriedl_prefix = argv[++i]; + continue; + } else if (strcmp(argv[i], "-post") == 0) { + jfriedl_postfix = argv[++i]; + continue; + } else if (strcmp(argv[i], "-XT") == 0) { + sscanf(argv[++i], "%d", &jfriedl_XT); + continue; + } else if (strcmp(argv[i], "-XR") == 0) { + sscanf(argv[++i], "%d", &jfriedl_XR); + continue; + } +#endif + + + /* One-char options; many that have no data may be in a single argument; we + continue till we hit the last one or one that needs data. */ + + else + { + char *s = argv[i] + 1; + longop = FALSE; + + while (*s != 0) + { + for (op = optionlist; op->one_char != 0; op++) + { + if (*s == op->one_char) break; + } + if (op->one_char == 0) + { + fprintf(stderr, "pcregrep: Unknown option letter '%c' in \"%s\"\n", + *s, argv[i]); + pcregrep_exit(usage(2)); + } + + option_data = s+1; + + /* Break out if this is the last character in the string; it's handled + below like a single multi-char option. */ + + if (*option_data == 0) break; + + /* Check for a single-character option that has data: OP_OP_NUMBER(S) + are used for ones that either have a numerical number or defaults, i.e. + the data is optional. If a digit follows, there is data; if not, carry on + with other single-character options in the same string. */ + + if (op->type == OP_OP_NUMBER || op->type == OP_OP_NUMBERS) + { + if (isdigit((unsigned char)s[1])) break; + } + else /* Check for an option with data */ + { + if (op->type != OP_NODATA) break; + } + + /* Handle a single-character option with no data, then loop for the + next character in the string. */ + + pcre_options = handle_option(*s++, pcre_options); + } + } + + /* At this point we should have op pointing to a matched option. If the type + is NO_DATA, it means that there is no data, and the option might set + something in the PCRE options. */ + + if (op->type == OP_NODATA) + { + pcre_options = handle_option(op->one_char, pcre_options); + continue; + } + + /* If the option type is OP_OP_STRING or OP_OP_NUMBER(S), it's an option that + either has a value or defaults to something. It cannot have data in a + separate item. At the moment, the only such options are "colo(u)r", + "only-matching", and Jeffrey Friedl's special -S debugging option. */ + + if (*option_data == 0 && + (op->type == OP_OP_STRING || op->type == OP_OP_NUMBER || + op->type == OP_OP_NUMBERS)) + { + switch (op->one_char) + { + case N_COLOUR: + colour_option = (char *)"auto"; + break; + + case 'o': + only_matching_last = add_number(0, only_matching_last); + if (only_matching == NULL) only_matching = only_matching_last; + break; + +#ifdef JFRIEDL_DEBUG + case 'S': + S_arg = 0; + break; +#endif + } + continue; + } + + /* Otherwise, find the data string for the option. */ + + if (*option_data == 0) + { + if (i >= argc - 1 || longopwasequals) + { + fprintf(stderr, "pcregrep: Data missing after %s\n", argv[i]); + pcregrep_exit(usage(2)); + } + option_data = argv[++i]; + } + + /* If the option type is OP_OP_NUMBERS, the value is a number that is to be + added to a chain of numbers. */ + + if (op->type == OP_OP_NUMBERS) + { + unsigned long int n = decode_number(option_data, op, longop); + omdatastr *omd = (omdatastr *)op->dataptr; + *(omd->lastptr) = add_number((int)n, *(omd->lastptr)); + if (*(omd->anchor) == NULL) *(omd->anchor) = *(omd->lastptr); + } + + /* If the option type is OP_PATLIST, it's the -e option, or one of the + include/exclude options, which can be called multiple times to create lists + of patterns. */ + + else if (op->type == OP_PATLIST) + { + patdatastr *pd = (patdatastr *)op->dataptr; + *(pd->lastptr) = add_pattern(option_data, *(pd->lastptr)); + if (*(pd->lastptr) == NULL) goto EXIT2; + if (*(pd->anchor) == NULL) *(pd->anchor) = *(pd->lastptr); + } + + /* If the option type is OP_FILELIST, it's one of the options that names a + file. */ + + else if (op->type == OP_FILELIST) + { + fndatastr *fd = (fndatastr *)op->dataptr; + fn = (fnstr *)malloc(sizeof(fnstr)); + if (fn == NULL) + { + fprintf(stderr, "pcregrep: malloc failed\n"); + goto EXIT2; + } + fn->next = NULL; + fn->name = option_data; + if (*(fd->anchor) == NULL) + *(fd->anchor) = fn; + else + (*(fd->lastptr))->next = fn; + *(fd->lastptr) = fn; + } + + /* Handle OP_BINARY_FILES */ + + else if (op->type == OP_BINFILES) + { + if (strcmp(option_data, "binary") == 0) + binary_files = BIN_BINARY; + else if (strcmp(option_data, "without-match") == 0) + binary_files = BIN_NOMATCH; + else if (strcmp(option_data, "text") == 0) + binary_files = BIN_TEXT; + else + { + fprintf(stderr, "pcregrep: unknown value \"%s\" for binary-files\n", + option_data); + pcregrep_exit(usage(2)); + } + } + + /* Otherwise, deal with a single string or numeric data value. */ + + else if (op->type != OP_NUMBER && op->type != OP_LONGNUMBER && + op->type != OP_OP_NUMBER) + { + *((char **)op->dataptr) = option_data; + } + else + { + unsigned long int n = decode_number(option_data, op, longop); + if (op->type == OP_LONGNUMBER) *((unsigned long int *)op->dataptr) = n; + else *((int *)op->dataptr) = n; + } + } + +/* Options have been decoded. If -C was used, its value is used as a default +for -A and -B. */ + +if (both_context > 0) + { + if (after_context == 0) after_context = both_context; + if (before_context == 0) before_context = both_context; + } + +/* Only one of --only-matching, --file-offsets, or --line-offsets is permitted. +However, all three set show_only_matching because they display, each in their +own way, only the data that has matched. */ + +if ((only_matching != NULL && (file_offsets || line_offsets)) || + (file_offsets && line_offsets)) + { + fprintf(stderr, "pcregrep: Cannot mix --only-matching, --file-offsets " + "and/or --line-offsets\n"); + pcregrep_exit(usage(2)); + } + +if (only_matching != NULL || file_offsets || line_offsets) + show_only_matching = TRUE; + +/* If a locale has not been provided as an option, see if the LC_CTYPE or +LC_ALL environment variable is set, and if so, use it. */ + +if (locale == NULL) + { + locale = getenv("LC_ALL"); + locale_from = "LC_ALL"; + } + +if (locale == NULL) + { + locale = getenv("LC_CTYPE"); + locale_from = "LC_CTYPE"; + } + +/* If a locale is set, use it to generate the tables the PCRE needs. Otherwise, +pcretables==NULL, which causes the use of default tables. */ + +if (locale != NULL) + { + if (setlocale(LC_CTYPE, locale) == NULL) + { + fprintf(stderr, "pcregrep: Failed to set locale %s (obtained from %s)\n", + locale, locale_from); + goto EXIT2; + } + pcretables = pcre_maketables(); + } + +/* Sort out colouring */ + +if (colour_option != NULL && strcmp(colour_option, "never") != 0) + { + if (strcmp(colour_option, "always") == 0) do_colour = TRUE; + else if (strcmp(colour_option, "auto") == 0) do_colour = is_stdout_tty(); + else + { + fprintf(stderr, "pcregrep: Unknown colour setting \"%s\"\n", + colour_option); + goto EXIT2; + } + if (do_colour) + { + char *cs = getenv("PCREGREP_COLOUR"); + if (cs == NULL) cs = getenv("PCREGREP_COLOR"); + if (cs != NULL) colour_string = cs; + } + } + +/* Interpret the newline type; the default settings are Unix-like. */ + +if (strcmp(newline, "cr") == 0 || strcmp(newline, "CR") == 0) + { + pcre_options |= PCRE_NEWLINE_CR; + endlinetype = EL_CR; + } +else if (strcmp(newline, "lf") == 0 || strcmp(newline, "LF") == 0) + { + pcre_options |= PCRE_NEWLINE_LF; + endlinetype = EL_LF; + } +else if (strcmp(newline, "crlf") == 0 || strcmp(newline, "CRLF") == 0) + { + pcre_options |= PCRE_NEWLINE_CRLF; + endlinetype = EL_CRLF; + } +else if (strcmp(newline, "any") == 0 || strcmp(newline, "ANY") == 0) + { + pcre_options |= PCRE_NEWLINE_ANY; + endlinetype = EL_ANY; + } +else if (strcmp(newline, "anycrlf") == 0 || strcmp(newline, "ANYCRLF") == 0) + { + pcre_options |= PCRE_NEWLINE_ANYCRLF; + endlinetype = EL_ANYCRLF; + } +else + { + fprintf(stderr, "pcregrep: Invalid newline specifier \"%s\"\n", newline); + goto EXIT2; + } + +/* Interpret the text values for -d and -D */ + +if (dee_option != NULL) + { + if (strcmp(dee_option, "read") == 0) dee_action = dee_READ; + else if (strcmp(dee_option, "recurse") == 0) dee_action = dee_RECURSE; + else if (strcmp(dee_option, "skip") == 0) dee_action = dee_SKIP; + else + { + fprintf(stderr, "pcregrep: Invalid value \"%s\" for -d\n", dee_option); + goto EXIT2; + } + } + +if (DEE_option != NULL) + { + if (strcmp(DEE_option, "read") == 0) DEE_action = DEE_READ; + else if (strcmp(DEE_option, "skip") == 0) DEE_action = DEE_SKIP; + else + { + fprintf(stderr, "pcregrep: Invalid value \"%s\" for -D\n", DEE_option); + goto EXIT2; + } + } + +/* Check the values for Jeffrey Friedl's debugging options. */ + +#ifdef JFRIEDL_DEBUG +if (S_arg > 9) + { + fprintf(stderr, "pcregrep: bad value for -S option\n"); + return 2; + } +if (jfriedl_XT != 0 || jfriedl_XR != 0) + { + if (jfriedl_XT == 0) jfriedl_XT = 1; + if (jfriedl_XR == 0) jfriedl_XR = 1; + } +#endif + +/* Get memory for the main buffer. */ + +bufsize = 3*bufthird; +main_buffer = (char *)malloc(bufsize); + +if (main_buffer == NULL) + { + fprintf(stderr, "pcregrep: malloc failed\n"); + goto EXIT2; + } + +/* If no patterns were provided by -e, and there are no files provided by -f, +the first argument is the one and only pattern, and it must exist. */ + +if (patterns == NULL && pattern_files == NULL) + { + if (i >= argc) return usage(2); + patterns = patterns_last = add_pattern(argv[i++], NULL); + if (patterns == NULL) goto EXIT2; + } + +/* Compile the patterns that were provided on the command line, either by +multiple uses of -e or as a single unkeyed pattern. We cannot do this until +after all the command-line options are read so that we know which PCRE options +to use. When -F is used, compile_pattern() may add another block into the +chain, so we must not access the next pointer till after the compile. */ + +for (j = 1, cp = patterns; cp != NULL; j++, cp = cp->next) + { + if (!compile_pattern(cp, pcre_options, process_options, FALSE, "command-line", + (j == 1 && patterns->next == NULL)? 0 : j)) + goto EXIT2; + } + +/* Read and compile the regular expressions that are provided in files. */ + +for (fn = pattern_files; fn != NULL; fn = fn->next) + { + if (!read_pattern_file(fn->name, &patterns, &patterns_last, process_options)) + goto EXIT2; + } + +/* Study the regular expressions, as we will be running them many times. If an +extra block is needed for a limit, set PCRE_STUDY_EXTRA_NEEDED so that one is +returned, even if studying produces no data. */ + +if (match_limit > 0 || match_limit_recursion > 0) + study_options |= PCRE_STUDY_EXTRA_NEEDED; + +/* Unless JIT has been explicitly disabled, arrange a stack for it to use. */ + +#ifdef SUPPORT_PCREGREP_JIT +if ((study_options & PCRE_STUDY_JIT_COMPILE) != 0) + jit_stack = pcre_jit_stack_alloc(32*1024, 1024*1024); +#endif + +for (j = 1, cp = patterns; cp != NULL; j++, cp = cp->next) + { + cp->hint = pcre_study(cp->compiled, study_options, &error); + if (error != NULL) + { + if (patterns->next == NULL) + fprintf(stderr, "pcregrep: Error while studying regex: %s\n", error); + else + fprintf(stderr, "pcregrep: Error while studying regex number %d: %s\n", + j, error); + goto EXIT2; + } +#ifdef SUPPORT_PCREGREP_JIT + if (jit_stack != NULL && cp->hint != NULL) + pcre_assign_jit_stack(cp->hint, NULL, jit_stack); +#endif + } + +/* If --match-limit or --recursion-limit was set, put the value(s) into the +pcre_extra block for each pattern. There will always be an extra block because +of the use of PCRE_STUDY_EXTRA_NEEDED above. */ + +for (cp = patterns; cp != NULL; cp = cp->next) + { + if (match_limit > 0) + { + cp->hint->flags |= PCRE_EXTRA_MATCH_LIMIT; + cp->hint->match_limit = match_limit; + } + + if (match_limit_recursion > 0) + { + cp->hint->flags |= PCRE_EXTRA_MATCH_LIMIT_RECURSION; + cp->hint->match_limit_recursion = match_limit_recursion; + } + } + +/* If there are include or exclude patterns read from the command line, compile +them. -F, -w, and -x do not apply, so the third argument of compile_pattern is +0. */ + +for (j = 0; j < 4; j++) + { + int k; + for (k = 1, cp = *(incexlist[j]); cp != NULL; k++, cp = cp->next) + { + if (!compile_pattern(cp, pcre_options, 0, FALSE, incexname[j], + (k == 1 && cp->next == NULL)? 0 : k)) + goto EXIT2; + } + } + +/* Read and compile include/exclude patterns from files. */ + +for (fn = include_from; fn != NULL; fn = fn->next) + { + if (!read_pattern_file(fn->name, &include_patterns, &include_patterns_last, 0)) + goto EXIT2; + } + +for (fn = exclude_from; fn != NULL; fn = fn->next) + { + if (!read_pattern_file(fn->name, &exclude_patterns, &exclude_patterns_last, 0)) + goto EXIT2; + } + +/* If there are no files that contain lists of files to search, and there are +no file arguments, search stdin, and then exit. */ + +if (file_lists == NULL && i >= argc) + { + rc = pcregrep(stdin, FR_PLAIN, stdin_name, + (filenames > FN_DEFAULT)? stdin_name : NULL); + goto EXIT; + } + +/* If any files that contains a list of files to search have been specified, +read them line by line and search the given files. */ + +for (fn = file_lists; fn != NULL; fn = fn->next) + { + char buffer[PATBUFSIZE]; + FILE *fl; + if (strcmp(fn->name, "-") == 0) fl = stdin; else + { + fl = fopen(fn->name, "rb"); + if (fl == NULL) + { + fprintf(stderr, "pcregrep: Failed to open %s: %s\n", fn->name, + strerror(errno)); + goto EXIT2; + } + } + while (fgets(buffer, PATBUFSIZE, fl) != NULL) + { + int frc; + char *end = buffer + (int)strlen(buffer); + while (end > buffer && isspace(end[-1])) end--; + *end = 0; + if (*buffer != 0) + { + frc = grep_or_recurse(buffer, dee_action == dee_RECURSE, FALSE); + if (frc > 1) rc = frc; + else if (frc == 0 && rc == 1) rc = 0; + } + } + if (fl != stdin) fclose(fl); + } + +/* After handling file-list, work through remaining arguments. Pass in the fact +that there is only one argument at top level - this suppresses the file name if +the argument is not a directory and filenames are not otherwise forced. */ + +only_one_at_top = i == argc - 1 && file_lists == NULL; + +for (; i < argc; i++) + { + int frc = grep_or_recurse(argv[i], dee_action == dee_RECURSE, + only_one_at_top); + if (frc > 1) rc = frc; + else if (frc == 0 && rc == 1) rc = 0; + } + +EXIT: +#ifdef SUPPORT_PCREGREP_JIT +if (jit_stack != NULL) pcre_jit_stack_free(jit_stack); +#endif + +free(main_buffer); +free((void *)pcretables); + +free_pattern_chain(patterns); +free_pattern_chain(include_patterns); +free_pattern_chain(include_dir_patterns); +free_pattern_chain(exclude_patterns); +free_pattern_chain(exclude_dir_patterns); + +free_file_chain(exclude_from); +free_file_chain(include_from); +free_file_chain(pattern_files); +free_file_chain(file_lists); + +while (only_matching != NULL) + { + omstr *this = only_matching; + only_matching = this->next; + free(this); + } + +pcregrep_exit(rc); + +EXIT2: +rc = 2; +goto EXIT; +} + +/* End of pcregrep */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcreposix.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcreposix.c new file mode 100755 index 000000000..3042d7635 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcreposix.c @@ -0,0 +1,431 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2020 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + + +/* This module is a wrapper that provides a POSIX API to the underlying PCRE +functions. */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + + +/* Ensure that the PCREPOSIX_EXP_xxx macros are set appropriately for +compiling these functions. This must come before including pcreposix.h, where +they are set for an application (using these functions) if they have not +previously been set. */ + +#if defined(_WIN32) && !defined(PCRE_STATIC) +# define PCREPOSIX_EXP_DECL extern __declspec(dllexport) +# define PCREPOSIX_EXP_DEFN __declspec(dllexport) +#endif + +/* We include pcre.h before pcre_internal.h so that the PCRE library functions +are declared as "import" for Windows by defining PCRE_EXP_DECL as "import". +This is needed even though pcre_internal.h itself includes pcre.h, because it +does so after it has set PCRE_EXP_DECL to "export" if it is not already set. */ + +#include "pcre.h" +#include "pcre_internal.h" +#include "pcreposix.h" + + +/* Table to translate PCRE compile time error codes into POSIX error codes. */ + +static const int eint[] = { + 0, /* no error */ + REG_EESCAPE, /* \ at end of pattern */ + REG_EESCAPE, /* \c at end of pattern */ + REG_EESCAPE, /* unrecognized character follows \ */ + REG_BADBR, /* numbers out of order in {} quantifier */ + /* 5 */ + REG_BADBR, /* number too big in {} quantifier */ + REG_EBRACK, /* missing terminating ] for character class */ + REG_ECTYPE, /* invalid escape sequence in character class */ + REG_ERANGE, /* range out of order in character class */ + REG_BADRPT, /* nothing to repeat */ + /* 10 */ + REG_BADRPT, /* operand of unlimited repeat could match the empty string */ + REG_ASSERT, /* internal error: unexpected repeat */ + REG_BADPAT, /* unrecognized character after (? */ + REG_BADPAT, /* POSIX named classes are supported only within a class */ + REG_EPAREN, /* missing ) */ + /* 15 */ + REG_ESUBREG, /* reference to non-existent subpattern */ + REG_INVARG, /* erroffset passed as NULL */ + REG_INVARG, /* unknown option bit(s) set */ + REG_EPAREN, /* missing ) after comment */ + REG_ESIZE, /* parentheses nested too deeply */ + /* 20 */ + REG_ESIZE, /* regular expression too large */ + REG_ESPACE, /* failed to get memory */ + REG_EPAREN, /* unmatched parentheses */ + REG_ASSERT, /* internal error: code overflow */ + REG_BADPAT, /* unrecognized character after (?< */ + /* 25 */ + REG_BADPAT, /* lookbehind assertion is not fixed length */ + REG_BADPAT, /* malformed number or name after (?( */ + REG_BADPAT, /* conditional group contains more than two branches */ + REG_BADPAT, /* assertion expected after (?( */ + REG_BADPAT, /* (?R or (?[+-]digits must be followed by ) */ + /* 30 */ + REG_ECTYPE, /* unknown POSIX class name */ + REG_BADPAT, /* POSIX collating elements are not supported */ + REG_INVARG, /* this version of PCRE is not compiled with PCRE_UTF8 support */ + REG_BADPAT, /* spare error */ + REG_BADPAT, /* character value in \x{} or \o{} is too large */ + /* 35 */ + REG_BADPAT, /* invalid condition (?(0) */ + REG_BADPAT, /* \C not allowed in lookbehind assertion */ + REG_EESCAPE, /* PCRE does not support \L, \l, \N, \U, or \u */ + REG_BADPAT, /* number after (?C is > 255 */ + REG_BADPAT, /* closing ) for (?C expected */ + /* 40 */ + REG_BADPAT, /* recursive call could loop indefinitely */ + REG_BADPAT, /* unrecognized character after (?P */ + REG_BADPAT, /* syntax error in subpattern name (missing terminator) */ + REG_BADPAT, /* two named subpatterns have the same name */ + REG_BADPAT, /* invalid UTF-8 string */ + /* 45 */ + REG_BADPAT, /* support for \P, \p, and \X has not been compiled */ + REG_BADPAT, /* malformed \P or \p sequence */ + REG_BADPAT, /* unknown property name after \P or \p */ + REG_BADPAT, /* subpattern name is too long (maximum 32 characters) */ + REG_BADPAT, /* too many named subpatterns (maximum 10,000) */ + /* 50 */ + REG_BADPAT, /* repeated subpattern is too long */ + REG_BADPAT, /* octal value is greater than \377 (not in UTF-8 mode) */ + REG_BADPAT, /* internal error: overran compiling workspace */ + REG_BADPAT, /* internal error: previously-checked referenced subpattern not found */ + REG_BADPAT, /* DEFINE group contains more than one branch */ + /* 55 */ + REG_BADPAT, /* repeating a DEFINE group is not allowed */ + REG_INVARG, /* inconsistent NEWLINE options */ + REG_BADPAT, /* \g is not followed followed by an (optionally braced) non-zero number */ + REG_BADPAT, /* a numbered reference must not be zero */ + REG_BADPAT, /* an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT) */ + /* 60 */ + REG_BADPAT, /* (*VERB) not recognized */ + REG_BADPAT, /* number is too big */ + REG_BADPAT, /* subpattern name expected */ + REG_BADPAT, /* digit expected after (?+ */ + REG_BADPAT, /* ] is an invalid data character in JavaScript compatibility mode */ + /* 65 */ + REG_BADPAT, /* different names for subpatterns of the same number are not allowed */ + REG_BADPAT, /* (*MARK) must have an argument */ + REG_INVARG, /* this version of PCRE is not compiled with PCRE_UCP support */ + REG_BADPAT, /* \c must be followed by an ASCII character */ + REG_BADPAT, /* \k is not followed by a braced, angle-bracketed, or quoted name */ + /* 70 */ + REG_BADPAT, /* internal error: unknown opcode in find_fixedlength() */ + REG_BADPAT, /* \N is not supported in a class */ + REG_BADPAT, /* too many forward references */ + REG_BADPAT, /* disallowed UTF-8/16/32 code point (>= 0xd800 && <= 0xdfff) */ + REG_BADPAT, /* invalid UTF-16 string (should not occur) */ + /* 75 */ + REG_BADPAT, /* overlong MARK name */ + REG_BADPAT, /* character value in \u.... sequence is too large */ + REG_BADPAT, /* invalid UTF-32 string (should not occur) */ + REG_BADPAT, /* setting UTF is disabled by the application */ + REG_BADPAT, /* non-hex character in \\x{} (closing brace missing?) */ + /* 80 */ + REG_BADPAT, /* non-octal character in \o{} (closing brace missing?) */ + REG_BADPAT, /* missing opening brace after \o */ + REG_BADPAT, /* parentheses too deeply nested */ + REG_BADPAT, /* invalid range in character class */ + REG_BADPAT, /* group name must start with a non-digit */ + /* 85 */ + REG_BADPAT, /* parentheses too deeply nested (stack check) */ + REG_BADPAT, /* missing digits in \x{} or \o{} */ + REG_BADPAT /* pattern too complicated */ +}; + +/* Table of texts corresponding to POSIX error codes */ + +static const char *const pstring[] = { + "", /* Dummy for value 0 */ + "internal error", /* REG_ASSERT */ + "invalid repeat counts in {}", /* BADBR */ + "pattern error", /* BADPAT */ + "? * + invalid", /* BADRPT */ + "unbalanced {}", /* EBRACE */ + "unbalanced []", /* EBRACK */ + "collation error - not relevant", /* ECOLLATE */ + "bad class", /* ECTYPE */ + "bad escape sequence", /* EESCAPE */ + "empty expression", /* EMPTY */ + "unbalanced ()", /* EPAREN */ + "bad range inside []", /* ERANGE */ + "expression too big", /* ESIZE */ + "failed to get memory", /* ESPACE */ + "bad back reference", /* ESUBREG */ + "bad argument", /* INVARG */ + "match failed" /* NOMATCH */ +}; + + + + +/************************************************* +* Translate error code to string * +*************************************************/ + +PCREPOSIX_EXP_DEFN size_t PCRE_CALL_CONVENTION +regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size) +{ +const char *message, *addmessage; +size_t length, addlength; + +message = (errcode >= (int)(sizeof(pstring)/sizeof(char *)))? + "unknown error code" : pstring[errcode]; +length = strlen(message) + 1; + +addmessage = " at offset "; +addlength = (preg != NULL && (int)preg->re_erroffset != -1)? + strlen(addmessage) + 6 : 0; + +if (errbuf_size > 0) + { + if (addlength > 0 && errbuf_size >= length + addlength) + sprintf(errbuf, "%s%s%-6d", message, addmessage, (int)preg->re_erroffset); + else + { + strncpy(errbuf, message, errbuf_size - 1); + errbuf[errbuf_size-1] = 0; + } + } + +return length + addlength; +} + + + + +/************************************************* +* Free store held by a regex * +*************************************************/ + +PCREPOSIX_EXP_DEFN void PCRE_CALL_CONVENTION +regfree(regex_t *preg) +{ +(PUBL(free))(preg->re_pcre); +} + + + + +/************************************************* +* Compile a regular expression * +*************************************************/ + +/* +Arguments: + preg points to a structure for recording the compiled expression + pattern the pattern to compile + cflags compilation flags + +Returns: 0 on success + various non-zero codes on failure +*/ + +PCREPOSIX_EXP_DEFN int PCRE_CALL_CONVENTION +regcomp(regex_t *preg, const char *pattern, int cflags) +{ +const char *errorptr; +int erroffset; +int errorcode; +int options = 0; +int re_nsub = 0; + +if ((cflags & REG_ICASE) != 0) options |= PCRE_CASELESS; +if ((cflags & REG_NEWLINE) != 0) options |= PCRE_MULTILINE; +if ((cflags & REG_DOTALL) != 0) options |= PCRE_DOTALL; +if ((cflags & REG_NOSUB) != 0) options |= PCRE_NO_AUTO_CAPTURE; +if ((cflags & REG_UTF8) != 0) options |= PCRE_UTF8; +if ((cflags & REG_UCP) != 0) options |= PCRE_UCP; +if ((cflags & REG_UNGREEDY) != 0) options |= PCRE_UNGREEDY; + +preg->re_pcre = pcre_compile2(pattern, options, &errorcode, &errorptr, + &erroffset, NULL); +preg->re_erroffset = erroffset; + +/* Safety: if the error code is too big for the translation vector (which +should not happen, but we all make mistakes), return REG_BADPAT. */ + +if (preg->re_pcre == NULL) + { + return (errorcode < (int)(sizeof(eint)/sizeof(const int)))? + eint[errorcode] : REG_BADPAT; + } + +(void)pcre_fullinfo((const pcre *)preg->re_pcre, NULL, PCRE_INFO_CAPTURECOUNT, + &re_nsub); +preg->re_nsub = (size_t)re_nsub; +preg->re_erroffset = (size_t)(-1); /* No meaning after successful compile */ +return 0; +} + + + + +/************************************************* +* Match a regular expression * +*************************************************/ + +/* Unfortunately, PCRE requires 3 ints of working space for each captured +substring, so we have to get and release working store instead of just using +the POSIX structures as was done in earlier releases when PCRE needed only 2 +ints. However, if the number of possible capturing brackets is small, use a +block of store on the stack, to reduce the use of malloc/free. The threshold is +in a macro that can be changed at configure time. + +If REG_NOSUB was specified at compile time, the PCRE_NO_AUTO_CAPTURE flag will +be set. When this is the case, the nmatch and pmatch arguments are ignored, and +the only result is yes/no/error. */ + +PCREPOSIX_EXP_DEFN int PCRE_CALL_CONVENTION +regexec(const regex_t *preg, const char *string, size_t nmatch, + regmatch_t pmatch[], int eflags) +{ +int rc, so, eo; +int options = 0; +int *ovector = NULL; +int small_ovector[POSIX_MALLOC_THRESHOLD * 3]; +BOOL allocated_ovector = FALSE; +BOOL nosub = + (REAL_PCRE_OPTIONS((const pcre *)preg->re_pcre) & PCRE_NO_AUTO_CAPTURE) != 0; + +if ((eflags & REG_NOTBOL) != 0) options |= PCRE_NOTBOL; +if ((eflags & REG_NOTEOL) != 0) options |= PCRE_NOTEOL; +if ((eflags & REG_NOTEMPTY) != 0) options |= PCRE_NOTEMPTY; + +/* When no string data is being returned, or no vector has been passed in which +to put it, ensure that nmatch is zero. Otherwise, ensure the vector for holding +the return data is large enough. */ + +if (nosub || pmatch == NULL) nmatch = 0; + +else if (nmatch > 0) + { + if (nmatch <= POSIX_MALLOC_THRESHOLD) + { + ovector = &(small_ovector[0]); + } + else + { + if (nmatch > INT_MAX/(sizeof(int) * 3)) return REG_ESPACE; + ovector = (int *)malloc(sizeof(int) * nmatch * 3); + if (ovector == NULL) return REG_ESPACE; + allocated_ovector = TRUE; + } + } + +/* REG_STARTEND is a BSD extension, to allow for non-NUL-terminated strings. +The man page from OS X says "REG_STARTEND affects only the location of the +string, not how it is matched". That is why the "so" value is used to bump the +start location rather than being passed as a PCRE "starting offset". */ + +if ((eflags & REG_STARTEND) != 0) + { + if (pmatch == NULL) return REG_INVARG; + so = pmatch[0].rm_so; + eo = pmatch[0].rm_eo; + } +else + { + so = 0; + eo = (int)strlen(string); + } + +rc = pcre_exec((const pcre *)preg->re_pcre, NULL, string + so, (eo - so), + 0, options, ovector, (int)(nmatch * 3)); + +if (rc == 0) rc = (int)nmatch; /* All captured slots were filled in */ + +/* Successful match */ + +if (rc >= 0) + { + size_t i; + if (!nosub) + { + for (i = 0; i < (size_t)rc; i++) + { + pmatch[i].rm_so = (ovector[i*2] < 0)? -1 : ovector[i*2] + so; + pmatch[i].rm_eo = (ovector[i*2+1] < 0)? -1: ovector[i*2+1] + so; + } + if (allocated_ovector) free(ovector); + for (; i < nmatch; i++) pmatch[i].rm_so = pmatch[i].rm_eo = -1; + } + return 0; + } + +/* Unsuccessful match */ + +if (allocated_ovector) free(ovector); +switch(rc) + { +/* ========================================================================== */ + /* These cases are never obeyed. This is a fudge that causes a compile-time + error if the vector eint, which is indexed by compile-time error number, is + not the correct length. It seems to be the only way to do such a check at + compile time, as the sizeof() operator does not work in the C preprocessor. + As all the PCRE_ERROR_xxx values are negative, we can use 0 and 1. */ + + case 0: + case (sizeof(eint)/sizeof(int) == ERRCOUNT): + return REG_ASSERT; +/* ========================================================================== */ + + case PCRE_ERROR_NOMATCH: return REG_NOMATCH; + case PCRE_ERROR_NULL: return REG_INVARG; + case PCRE_ERROR_BADOPTION: return REG_INVARG; + case PCRE_ERROR_BADMAGIC: return REG_INVARG; + case PCRE_ERROR_UNKNOWN_NODE: return REG_ASSERT; + case PCRE_ERROR_NOMEMORY: return REG_ESPACE; + case PCRE_ERROR_MATCHLIMIT: return REG_ESPACE; + case PCRE_ERROR_BADUTF8: return REG_INVARG; + case PCRE_ERROR_BADUTF8_OFFSET: return REG_INVARG; + case PCRE_ERROR_BADMODE: return REG_INVARG; + default: return REG_ASSERT; + } +} + +/* End of pcreposix.c */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcreposix.h b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcreposix.h new file mode 100755 index 000000000..c77c0b052 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcreposix.h @@ -0,0 +1,146 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +#ifndef _PCREPOSIX_H +#define _PCREPOSIX_H + +/* This is the header for the POSIX wrapper interface to the PCRE Perl- +Compatible Regular Expression library. It defines the things POSIX says should +be there. I hope. + + Copyright (c) 1997-2012 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +/* Have to include stdlib.h in order to ensure that size_t is defined. */ + +#include + +/* Allow for C++ users */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Options, mostly defined by POSIX, but with some extras. */ + +#define REG_ICASE 0x0001 /* Maps to PCRE_CASELESS */ +#define REG_NEWLINE 0x0002 /* Maps to PCRE_MULTILINE */ +#define REG_NOTBOL 0x0004 /* Maps to PCRE_NOTBOL */ +#define REG_NOTEOL 0x0008 /* Maps to PCRE_NOTEOL */ +#define REG_DOTALL 0x0010 /* NOT defined by POSIX; maps to PCRE_DOTALL */ +#define REG_NOSUB 0x0020 /* Maps to PCRE_NO_AUTO_CAPTURE */ +#define REG_UTF8 0x0040 /* NOT defined by POSIX; maps to PCRE_UTF8 */ +#define REG_STARTEND 0x0080 /* BSD feature: pass subject string by so,eo */ +#define REG_NOTEMPTY 0x0100 /* NOT defined by POSIX; maps to PCRE_NOTEMPTY */ +#define REG_UNGREEDY 0x0200 /* NOT defined by POSIX; maps to PCRE_UNGREEDY */ +#define REG_UCP 0x0400 /* NOT defined by POSIX; maps to PCRE_UCP */ + +/* This is not used by PCRE, but by defining it we make it easier +to slot PCRE into existing programs that make POSIX calls. */ + +#define REG_EXTENDED 0 + +/* Error values. Not all these are relevant or used by the wrapper. */ + +enum { + REG_ASSERT = 1, /* internal error ? */ + REG_BADBR, /* invalid repeat counts in {} */ + REG_BADPAT, /* pattern error */ + REG_BADRPT, /* ? * + invalid */ + REG_EBRACE, /* unbalanced {} */ + REG_EBRACK, /* unbalanced [] */ + REG_ECOLLATE, /* collation error - not relevant */ + REG_ECTYPE, /* bad class */ + REG_EESCAPE, /* bad escape sequence */ + REG_EMPTY, /* empty expression */ + REG_EPAREN, /* unbalanced () */ + REG_ERANGE, /* bad range inside [] */ + REG_ESIZE, /* expression too big */ + REG_ESPACE, /* failed to get memory */ + REG_ESUBREG, /* bad back reference */ + REG_INVARG, /* bad argument */ + REG_NOMATCH /* match failed */ +}; + + +/* The structure representing a compiled regular expression. */ + +typedef struct { + void *re_pcre; + size_t re_nsub; + size_t re_erroffset; +} regex_t; + +/* The structure in which a captured offset is returned. */ + +typedef int regoff_t; + +typedef struct { + regoff_t rm_so; + regoff_t rm_eo; +} regmatch_t; + +/* When an application links to a PCRE DLL in Windows, the symbols that are +imported have to be identified as such. When building PCRE, the appropriate +export settings are needed, and are set in pcreposix.c before including this +file. */ + +#if defined(_WIN32) && !defined(PCRE_STATIC) && !defined(PCREPOSIX_EXP_DECL) +# define PCREPOSIX_EXP_DECL extern __declspec(dllimport) +# define PCREPOSIX_EXP_DEFN __declspec(dllimport) +#endif + +/* By default, we use the standard "extern" declarations. */ + +#ifndef PCREPOSIX_EXP_DECL +# ifdef __cplusplus +# define PCREPOSIX_EXP_DECL extern "C" +# define PCREPOSIX_EXP_DEFN extern "C" +# else +# define PCREPOSIX_EXP_DECL extern +# define PCREPOSIX_EXP_DEFN extern +# endif +#endif + +/* The functions */ + +PCREPOSIX_EXP_DECL int regcomp(regex_t *, const char *, int); +PCREPOSIX_EXP_DECL int regexec(const regex_t *, const char *, size_t, + regmatch_t *, int); +PCREPOSIX_EXP_DECL size_t regerror(int, const regex_t *, char *, size_t); +PCREPOSIX_EXP_DECL void regfree(regex_t *); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* End of pcreposix.h */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcretest.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcretest.c new file mode 100755 index 000000000..c1ee128b6 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/pcretest.c @@ -0,0 +1,5773 @@ +/************************************************* +* PCRE testing program * +*************************************************/ + +/* This program was hacked up as a tester for PCRE. I really should have +written it more tidily in the first place. Will I ever learn? It has grown and +been extended and consequently is now rather, er, *very* untidy in places. The +addition of 16-bit support has made it even worse. :-( + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +/* This program now supports the testing of all of the 8-bit, 16-bit, and +32-bit PCRE libraries in a single program. This is different from the modules +such as pcre_compile.c in the library itself, which are compiled separately for +each mode. If two modes are enabled, for example, pcre_compile.c is compiled +twice. By contrast, pcretest.c is compiled only once. Therefore, it must not +make use of any of the macros from pcre_internal.h that depend on +COMPILE_PCRE8, COMPILE_PCRE16, or COMPILE_PCRE32. It does, however, make use of +SUPPORT_PCRE8, SUPPORT_PCRE16, and SUPPORT_PCRE32 to ensure that it calls only +supported library functions. */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include +#include +#include +#include + +/* Both libreadline and libedit are optionally supported. The user-supplied +original patch uses readline/readline.h for libedit, but in at least one system +it is installed as editline/readline.h, so the configuration code now looks for +that first, falling back to readline/readline.h. */ + +#if defined(SUPPORT_LIBREADLINE) || defined(SUPPORT_LIBEDIT) +#ifdef HAVE_UNISTD_H +#include +#endif +#if defined(SUPPORT_LIBREADLINE) +#include +#include +#else +#if defined(HAVE_EDITLINE_READLINE_H) +#include +#else +#include +#endif +#endif +#endif + +/* A number of things vary for Windows builds. Originally, pcretest opened its +input and output without "b"; then I was told that "b" was needed in some +environments, so it was added for release 5.0 to both the input and output. (It +makes no difference on Unix-like systems.) Later I was told that it is wrong +for the input on Windows. I've now abstracted the modes into two macros that +are set here, to make it easier to fiddle with them, and removed "b" from the +input mode under Windows. */ + +#if defined(_WIN32) || defined(WIN32) +#include /* For _setmode() */ +#include /* For _O_BINARY */ +#define INPUT_MODE "r" +#define OUTPUT_MODE "wb" + +#ifndef isatty +#define isatty _isatty /* This is what Windows calls them, I'm told, */ +#endif /* though in some environments they seem to */ + /* be already defined, hence the #ifndefs. */ +#ifndef fileno +#define fileno _fileno +#endif + +/* A user sent this fix for Borland Builder 5 under Windows. */ + +#ifdef __BORLANDC__ +#define _setmode(handle, mode) setmode(handle, mode) +#endif + +/* Not Windows */ + +#else +#include /* These two includes are needed */ +#include /* for setrlimit(). */ +#if defined NATIVE_ZOS /* z/OS uses non-binary I/O */ +#define INPUT_MODE "r" +#define OUTPUT_MODE "w" +#else +#define INPUT_MODE "rb" +#define OUTPUT_MODE "wb" +#endif +#endif + +#ifdef __VMS +#include +void vms_setsymbol( char *, char *, int ); +#endif + + +#define PRIV(name) name + +/* We have to include pcre_internal.h because we need the internal info for +displaying the results of pcre_study() and we also need to know about the +internal macros, structures, and other internal data values; pcretest has +"inside information" compared to a program that strictly follows the PCRE API. + +Although pcre_internal.h does itself include pcre.h, we explicitly include it +here before pcre_internal.h so that the PCRE_EXP_xxx macros get set +appropriately for an application, not for building PCRE. */ + +#include "pcre.h" +#include "pcre_internal.h" + +/* The pcre_printint() function, which prints the internal form of a compiled +regex, is held in a separate file so that (a) it can be compiled in either +8-, 16- or 32-bit mode, and (b) it can be #included directly in pcre_compile.c +when that is compiled in debug mode. */ + +#ifdef SUPPORT_PCRE8 +void pcre_printint(pcre *external_re, FILE *f, BOOL print_lengths); +#endif +#ifdef SUPPORT_PCRE16 +void pcre16_printint(pcre *external_re, FILE *f, BOOL print_lengths); +#endif +#ifdef SUPPORT_PCRE32 +void pcre32_printint(pcre *external_re, FILE *f, BOOL print_lengths); +#endif + +/* We need access to some of the data tables that PCRE uses. So as not to have +to keep two copies, we include the source files here, changing the names of the +external symbols to prevent clashes. */ + +#define PCRE_INCLUDED + +#include "pcre_tables.c" +#include "pcre_ucd.c" + +/* The definition of the macro PRINTABLE, which determines whether to print an +output character as-is or as a hex value when showing compiled patterns, is +the same as in the printint.src file. We uses it here in cases when the locale +has not been explicitly changed, so as to get consistent output from systems +that differ in their output from isprint() even in the "C" locale. */ + +#ifdef EBCDIC +#define PRINTABLE(c) ((c) >= 64 && (c) < 255) +#else +#define PRINTABLE(c) ((c) >= 32 && (c) < 127) +#endif + +#define PRINTOK(c) (locale_set? (((c) < 256) && isprint(c)) : PRINTABLE(c)) + +/* Posix support is disabled in 16 or 32 bit only mode. */ +#if !defined SUPPORT_PCRE8 && !defined NOPOSIX +#define NOPOSIX +#endif + +/* It is possible to compile this test program without including support for +testing the POSIX interface, though this is not available via the standard +Makefile. */ + +#if !defined NOPOSIX +#include "pcreposix.h" +#endif + +/* It is also possible, originally for the benefit of a version that was +imported into Exim, to build pcretest without support for UTF8 or UTF16 (define +NOUTF), without the interface to the DFA matcher (NODFA). In fact, we +automatically cut out the UTF support if PCRE is built without it. */ + +#ifndef SUPPORT_UTF +#ifndef NOUTF +#define NOUTF +#endif +#endif + +/* To make the code a bit tidier for 8/16/32-bit support, we define macros +for all the pcre[16]_xxx functions (except pcre16_fullinfo, which is called +only from one place and is handled differently). I couldn't dream up any way of +using a single macro to do this in a generic way, because of the many different +argument requirements. We know that at least one of SUPPORT_PCRE8 and +SUPPORT_PCRE16 must be set. First define macros for each individual mode; then +use these in the definitions of generic macros. + +**** Special note about the PCHARSxxx macros: the address of the string to be +printed is always given as two arguments: a base address followed by an offset. +The base address is cast to the correct data size for 8 or 16 bit data; the +offset is in units of this size. If the string were given as base+offset in one +argument, the casting might be incorrectly applied. */ + +#ifdef SUPPORT_PCRE8 + +#define PCHARS8(lv, p, offset, len, f) \ + lv = pchars((pcre_uint8 *)(p) + offset, len, f) + +#define PCHARSV8(p, offset, len, f) \ + (void)pchars((pcre_uint8 *)(p) + offset, len, f) + +#define READ_CAPTURE_NAME8(p, cn8, cn16, cn32, re) \ + p = read_capture_name8(p, cn8, re) + +#define STRLEN8(p) ((int)strlen((char *)p)) + +#define SET_PCRE_CALLOUT8(callout) \ + pcre_callout = callout + +#define SET_PCRE_STACK_GUARD8(stack_guard) \ + pcre_stack_guard = stack_guard + +#define PCRE_ASSIGN_JIT_STACK8(extra, callback, userdata) \ + pcre_assign_jit_stack(extra, callback, userdata) + +#define PCRE_COMPILE8(re, pat, options, error, erroffset, tables) \ + re = pcre_compile((char *)pat, options, error, erroffset, tables) + +#define PCRE_COPY_NAMED_SUBSTRING8(rc, re, bptr, offsets, count, \ + namesptr, cbuffer, size) \ + rc = pcre_copy_named_substring(re, (char *)bptr, offsets, count, \ + (char *)namesptr, cbuffer, size) + +#define PCRE_COPY_SUBSTRING8(rc, bptr, offsets, count, i, cbuffer, size) \ + rc = pcre_copy_substring((char *)bptr, offsets, count, i, cbuffer, size) + +#define PCRE_DFA_EXEC8(count, re, extra, bptr, len, start_offset, options, \ + offsets, size_offsets, workspace, size_workspace) \ + count = pcre_dfa_exec(re, extra, (char *)bptr, len, start_offset, options, \ + offsets, size_offsets, workspace, size_workspace) + +#define PCRE_EXEC8(count, re, extra, bptr, len, start_offset, options, \ + offsets, size_offsets) \ + count = pcre_exec(re, extra, (char *)bptr, len, start_offset, options, \ + offsets, size_offsets) + +#define PCRE_FREE_STUDY8(extra) \ + pcre_free_study(extra) + +#define PCRE_FREE_SUBSTRING8(substring) \ + pcre_free_substring(substring) + +#define PCRE_FREE_SUBSTRING_LIST8(listptr) \ + pcre_free_substring_list(listptr) + +#define PCRE_GET_NAMED_SUBSTRING8(rc, re, bptr, offsets, count, \ + getnamesptr, subsptr) \ + rc = pcre_get_named_substring(re, (char *)bptr, offsets, count, \ + (char *)getnamesptr, subsptr) + +#define PCRE_GET_STRINGNUMBER8(n, rc, ptr) \ + n = pcre_get_stringnumber(re, (char *)ptr) + +#define PCRE_GET_SUBSTRING8(rc, bptr, offsets, count, i, subsptr) \ + rc = pcre_get_substring((char *)bptr, offsets, count, i, subsptr) + +#define PCRE_GET_SUBSTRING_LIST8(rc, bptr, offsets, count, listptr) \ + rc = pcre_get_substring_list((const char *)bptr, offsets, count, listptr) + +#define PCRE_PATTERN_TO_HOST_BYTE_ORDER8(rc, re, extra, tables) \ + rc = pcre_pattern_to_host_byte_order(re, extra, tables) + +#define PCRE_PRINTINT8(re, outfile, debug_lengths) \ + pcre_printint(re, outfile, debug_lengths) + +#define PCRE_STUDY8(extra, re, options, error) \ + extra = pcre_study(re, options, error) + +#define PCRE_JIT_STACK_ALLOC8(startsize, maxsize) \ + pcre_jit_stack_alloc(startsize, maxsize) + +#define PCRE_JIT_STACK_FREE8(stack) \ + pcre_jit_stack_free(stack) + +#define pcre8_maketables pcre_maketables + +#endif /* SUPPORT_PCRE8 */ + +/* -----------------------------------------------------------*/ + +#ifdef SUPPORT_PCRE16 + +#define PCHARS16(lv, p, offset, len, f) \ + lv = pchars16((PCRE_SPTR16)(p) + offset, len, f) + +#define PCHARSV16(p, offset, len, f) \ + (void)pchars16((PCRE_SPTR16)(p) + offset, len, f) + +#define READ_CAPTURE_NAME16(p, cn8, cn16, cn32, re) \ + p = read_capture_name16(p, cn16, re) + +#define STRLEN16(p) ((int)strlen16((PCRE_SPTR16)p)) + +#define SET_PCRE_CALLOUT16(callout) \ + pcre16_callout = (int (*)(pcre16_callout_block *))callout + +#define SET_PCRE_STACK_GUARD16(stack_guard) \ + pcre16_stack_guard = (int (*)(void))stack_guard + +#define PCRE_ASSIGN_JIT_STACK16(extra, callback, userdata) \ + pcre16_assign_jit_stack((pcre16_extra *)extra, \ + (pcre16_jit_callback)callback, userdata) + +#define PCRE_COMPILE16(re, pat, options, error, erroffset, tables) \ + re = (pcre *)pcre16_compile((PCRE_SPTR16)pat, options, error, erroffset, \ + tables) + +#define PCRE_COPY_NAMED_SUBSTRING16(rc, re, bptr, offsets, count, \ + namesptr, cbuffer, size) \ + rc = pcre16_copy_named_substring((pcre16 *)re, (PCRE_SPTR16)bptr, offsets, \ + count, (PCRE_SPTR16)namesptr, (PCRE_UCHAR16 *)cbuffer, size/2) + +#define PCRE_COPY_SUBSTRING16(rc, bptr, offsets, count, i, cbuffer, size) \ + rc = pcre16_copy_substring((PCRE_SPTR16)bptr, offsets, count, i, \ + (PCRE_UCHAR16 *)cbuffer, size/2) + +#define PCRE_DFA_EXEC16(count, re, extra, bptr, len, start_offset, options, \ + offsets, size_offsets, workspace, size_workspace) \ + count = pcre16_dfa_exec((pcre16 *)re, (pcre16_extra *)extra, \ + (PCRE_SPTR16)bptr, len, start_offset, options, offsets, size_offsets, \ + workspace, size_workspace) + +#define PCRE_EXEC16(count, re, extra, bptr, len, start_offset, options, \ + offsets, size_offsets) \ + count = pcre16_exec((pcre16 *)re, (pcre16_extra *)extra, (PCRE_SPTR16)bptr, \ + len, start_offset, options, offsets, size_offsets) + +#define PCRE_FREE_STUDY16(extra) \ + pcre16_free_study((pcre16_extra *)extra) + +#define PCRE_FREE_SUBSTRING16(substring) \ + pcre16_free_substring((PCRE_SPTR16)substring) + +#define PCRE_FREE_SUBSTRING_LIST16(listptr) \ + pcre16_free_substring_list((PCRE_SPTR16 *)listptr) + +#define PCRE_GET_NAMED_SUBSTRING16(rc, re, bptr, offsets, count, \ + getnamesptr, subsptr) \ + rc = pcre16_get_named_substring((pcre16 *)re, (PCRE_SPTR16)bptr, offsets, \ + count, (PCRE_SPTR16)getnamesptr, (PCRE_SPTR16 *)(void*)subsptr) + +#define PCRE_GET_STRINGNUMBER16(n, rc, ptr) \ + n = pcre16_get_stringnumber(re, (PCRE_SPTR16)ptr) + +#define PCRE_GET_SUBSTRING16(rc, bptr, offsets, count, i, subsptr) \ + rc = pcre16_get_substring((PCRE_SPTR16)bptr, offsets, count, i, \ + (PCRE_SPTR16 *)(void*)subsptr) + +#define PCRE_GET_SUBSTRING_LIST16(rc, bptr, offsets, count, listptr) \ + rc = pcre16_get_substring_list((PCRE_SPTR16)bptr, offsets, count, \ + (PCRE_SPTR16 **)(void*)listptr) + +#define PCRE_PATTERN_TO_HOST_BYTE_ORDER16(rc, re, extra, tables) \ + rc = pcre16_pattern_to_host_byte_order((pcre16 *)re, (pcre16_extra *)extra, \ + tables) + +#define PCRE_PRINTINT16(re, outfile, debug_lengths) \ + pcre16_printint(re, outfile, debug_lengths) + +#define PCRE_STUDY16(extra, re, options, error) \ + extra = (pcre_extra *)pcre16_study((pcre16 *)re, options, error) + +#define PCRE_JIT_STACK_ALLOC16(startsize, maxsize) \ + (pcre_jit_stack *)pcre16_jit_stack_alloc(startsize, maxsize) + +#define PCRE_JIT_STACK_FREE16(stack) \ + pcre16_jit_stack_free((pcre16_jit_stack *)stack) + +#endif /* SUPPORT_PCRE16 */ + +/* -----------------------------------------------------------*/ + +#ifdef SUPPORT_PCRE32 + +#define PCHARS32(lv, p, offset, len, f) \ + lv = pchars32((PCRE_SPTR32)(p) + offset, len, use_utf, f) + +#define PCHARSV32(p, offset, len, f) \ + (void)pchars32((PCRE_SPTR32)(p) + offset, len, use_utf, f) + +#define READ_CAPTURE_NAME32(p, cn8, cn16, cn32, re) \ + p = read_capture_name32(p, cn32, re) + +#define STRLEN32(p) ((int)strlen32((PCRE_SPTR32)p)) + +#define SET_PCRE_CALLOUT32(callout) \ + pcre32_callout = (int (*)(pcre32_callout_block *))callout + +#define SET_PCRE_STACK_GUARD32(stack_guard) \ + pcre32_stack_guard = (int (*)(void))stack_guard + +#define PCRE_ASSIGN_JIT_STACK32(extra, callback, userdata) \ + pcre32_assign_jit_stack((pcre32_extra *)extra, \ + (pcre32_jit_callback)callback, userdata) + +#define PCRE_COMPILE32(re, pat, options, error, erroffset, tables) \ + re = (pcre *)pcre32_compile((PCRE_SPTR32)pat, options, error, erroffset, \ + tables) + +#define PCRE_COPY_NAMED_SUBSTRING32(rc, re, bptr, offsets, count, \ + namesptr, cbuffer, size) \ + rc = pcre32_copy_named_substring((pcre32 *)re, (PCRE_SPTR32)bptr, offsets, \ + count, (PCRE_SPTR32)namesptr, (PCRE_UCHAR32 *)cbuffer, size/4) + +#define PCRE_COPY_SUBSTRING32(rc, bptr, offsets, count, i, cbuffer, size) \ + rc = pcre32_copy_substring((PCRE_SPTR32)bptr, offsets, count, i, \ + (PCRE_UCHAR32 *)cbuffer, size/4) + +#define PCRE_DFA_EXEC32(count, re, extra, bptr, len, start_offset, options, \ + offsets, size_offsets, workspace, size_workspace) \ + count = pcre32_dfa_exec((pcre32 *)re, (pcre32_extra *)extra, \ + (PCRE_SPTR32)bptr, len, start_offset, options, offsets, size_offsets, \ + workspace, size_workspace) + +#define PCRE_EXEC32(count, re, extra, bptr, len, start_offset, options, \ + offsets, size_offsets) \ + count = pcre32_exec((pcre32 *)re, (pcre32_extra *)extra, (PCRE_SPTR32)bptr, \ + len, start_offset, options, offsets, size_offsets) + +#define PCRE_FREE_STUDY32(extra) \ + pcre32_free_study((pcre32_extra *)extra) + +#define PCRE_FREE_SUBSTRING32(substring) \ + pcre32_free_substring((PCRE_SPTR32)substring) + +#define PCRE_FREE_SUBSTRING_LIST32(listptr) \ + pcre32_free_substring_list((PCRE_SPTR32 *)listptr) + +#define PCRE_GET_NAMED_SUBSTRING32(rc, re, bptr, offsets, count, \ + getnamesptr, subsptr) \ + rc = pcre32_get_named_substring((pcre32 *)re, (PCRE_SPTR32)bptr, offsets, \ + count, (PCRE_SPTR32)getnamesptr, (PCRE_SPTR32 *)(void*)subsptr) + +#define PCRE_GET_STRINGNUMBER32(n, rc, ptr) \ + n = pcre32_get_stringnumber(re, (PCRE_SPTR32)ptr) + +#define PCRE_GET_SUBSTRING32(rc, bptr, offsets, count, i, subsptr) \ + rc = pcre32_get_substring((PCRE_SPTR32)bptr, offsets, count, i, \ + (PCRE_SPTR32 *)(void*)subsptr) + +#define PCRE_GET_SUBSTRING_LIST32(rc, bptr, offsets, count, listptr) \ + rc = pcre32_get_substring_list((PCRE_SPTR32)bptr, offsets, count, \ + (PCRE_SPTR32 **)(void*)listptr) + +#define PCRE_PATTERN_TO_HOST_BYTE_ORDER32(rc, re, extra, tables) \ + rc = pcre32_pattern_to_host_byte_order((pcre32 *)re, (pcre32_extra *)extra, \ + tables) + +#define PCRE_PRINTINT32(re, outfile, debug_lengths) \ + pcre32_printint(re, outfile, debug_lengths) + +#define PCRE_STUDY32(extra, re, options, error) \ + extra = (pcre_extra *)pcre32_study((pcre32 *)re, options, error) + +#define PCRE_JIT_STACK_ALLOC32(startsize, maxsize) \ + (pcre_jit_stack *)pcre32_jit_stack_alloc(startsize, maxsize) + +#define PCRE_JIT_STACK_FREE32(stack) \ + pcre32_jit_stack_free((pcre32_jit_stack *)stack) + +#endif /* SUPPORT_PCRE32 */ + + +/* ----- More than one mode is supported; a runtime test is needed, except for +pcre_config(), and the JIT stack functions, when it doesn't matter which +available version is called. ----- */ + +enum { + PCRE8_MODE, + PCRE16_MODE, + PCRE32_MODE +}; + +#if (defined (SUPPORT_PCRE8) + defined (SUPPORT_PCRE16) + \ + defined (SUPPORT_PCRE32)) >= 2 + +#define CHAR_SIZE (1U << pcre_mode) + +/* There doesn't seem to be an easy way of writing these macros that can cope +with the 3 pairs of bit sizes plus all three bit sizes. So just handle all the +cases separately. */ + +/* ----- All three modes supported ----- */ + +#if defined(SUPPORT_PCRE8) && defined(SUPPORT_PCRE16) && defined(SUPPORT_PCRE32) + +#define PCHARS(lv, p, offset, len, f) \ + if (pcre_mode == PCRE32_MODE) \ + PCHARS32(lv, p, offset, len, f); \ + else if (pcre_mode == PCRE16_MODE) \ + PCHARS16(lv, p, offset, len, f); \ + else \ + PCHARS8(lv, p, offset, len, f) + +#define PCHARSV(p, offset, len, f) \ + if (pcre_mode == PCRE32_MODE) \ + PCHARSV32(p, offset, len, f); \ + else if (pcre_mode == PCRE16_MODE) \ + PCHARSV16(p, offset, len, f); \ + else \ + PCHARSV8(p, offset, len, f) + +#define READ_CAPTURE_NAME(p, cn8, cn16, cn32, re) \ + if (pcre_mode == PCRE32_MODE) \ + READ_CAPTURE_NAME32(p, cn8, cn16, cn32, re); \ + else if (pcre_mode == PCRE16_MODE) \ + READ_CAPTURE_NAME16(p, cn8, cn16, cn32, re); \ + else \ + READ_CAPTURE_NAME8(p, cn8, cn16, cn32, re) + +#define SET_PCRE_CALLOUT(callout) \ + if (pcre_mode == PCRE32_MODE) \ + SET_PCRE_CALLOUT32(callout); \ + else if (pcre_mode == PCRE16_MODE) \ + SET_PCRE_CALLOUT16(callout); \ + else \ + SET_PCRE_CALLOUT8(callout) + +#define SET_PCRE_STACK_GUARD(stack_guard) \ + if (pcre_mode == PCRE32_MODE) \ + SET_PCRE_STACK_GUARD32(stack_guard); \ + else if (pcre_mode == PCRE16_MODE) \ + SET_PCRE_STACK_GUARD16(stack_guard); \ + else \ + SET_PCRE_STACK_GUARD8(stack_guard) + +#define STRLEN(p) (pcre_mode == PCRE32_MODE ? STRLEN32(p) : pcre_mode == PCRE16_MODE ? STRLEN16(p) : STRLEN8(p)) + +#define PCRE_ASSIGN_JIT_STACK(extra, callback, userdata) \ + if (pcre_mode == PCRE32_MODE) \ + PCRE_ASSIGN_JIT_STACK32(extra, callback, userdata); \ + else if (pcre_mode == PCRE16_MODE) \ + PCRE_ASSIGN_JIT_STACK16(extra, callback, userdata); \ + else \ + PCRE_ASSIGN_JIT_STACK8(extra, callback, userdata) + +#define PCRE_COMPILE(re, pat, options, error, erroffset, tables) \ + if (pcre_mode == PCRE32_MODE) \ + PCRE_COMPILE32(re, pat, options, error, erroffset, tables); \ + else if (pcre_mode == PCRE16_MODE) \ + PCRE_COMPILE16(re, pat, options, error, erroffset, tables); \ + else \ + PCRE_COMPILE8(re, pat, options, error, erroffset, tables) + +#define PCRE_CONFIG pcre_config + +#define PCRE_COPY_NAMED_SUBSTRING(rc, re, bptr, offsets, count, \ + namesptr, cbuffer, size) \ + if (pcre_mode == PCRE32_MODE) \ + PCRE_COPY_NAMED_SUBSTRING32(rc, re, bptr, offsets, count, \ + namesptr, cbuffer, size); \ + else if (pcre_mode == PCRE16_MODE) \ + PCRE_COPY_NAMED_SUBSTRING16(rc, re, bptr, offsets, count, \ + namesptr, cbuffer, size); \ + else \ + PCRE_COPY_NAMED_SUBSTRING8(rc, re, bptr, offsets, count, \ + namesptr, cbuffer, size) + +#define PCRE_COPY_SUBSTRING(rc, bptr, offsets, count, i, cbuffer, size) \ + if (pcre_mode == PCRE32_MODE) \ + PCRE_COPY_SUBSTRING32(rc, bptr, offsets, count, i, cbuffer, size); \ + else if (pcre_mode == PCRE16_MODE) \ + PCRE_COPY_SUBSTRING16(rc, bptr, offsets, count, i, cbuffer, size); \ + else \ + PCRE_COPY_SUBSTRING8(rc, bptr, offsets, count, i, cbuffer, size) + +#define PCRE_DFA_EXEC(count, re, extra, bptr, len, start_offset, options, \ + offsets, size_offsets, workspace, size_workspace) \ + if (pcre_mode == PCRE32_MODE) \ + PCRE_DFA_EXEC32(count, re, extra, bptr, len, start_offset, options, \ + offsets, size_offsets, workspace, size_workspace); \ + else if (pcre_mode == PCRE16_MODE) \ + PCRE_DFA_EXEC16(count, re, extra, bptr, len, start_offset, options, \ + offsets, size_offsets, workspace, size_workspace); \ + else \ + PCRE_DFA_EXEC8(count, re, extra, bptr, len, start_offset, options, \ + offsets, size_offsets, workspace, size_workspace) + +#define PCRE_EXEC(count, re, extra, bptr, len, start_offset, options, \ + offsets, size_offsets) \ + if (pcre_mode == PCRE32_MODE) \ + PCRE_EXEC32(count, re, extra, bptr, len, start_offset, options, \ + offsets, size_offsets); \ + else if (pcre_mode == PCRE16_MODE) \ + PCRE_EXEC16(count, re, extra, bptr, len, start_offset, options, \ + offsets, size_offsets); \ + else \ + PCRE_EXEC8(count, re, extra, bptr, len, start_offset, options, \ + offsets, size_offsets) + +#define PCRE_FREE_STUDY(extra) \ + if (pcre_mode == PCRE32_MODE) \ + PCRE_FREE_STUDY32(extra); \ + else if (pcre_mode == PCRE16_MODE) \ + PCRE_FREE_STUDY16(extra); \ + else \ + PCRE_FREE_STUDY8(extra) + +#define PCRE_FREE_SUBSTRING(substring) \ + if (pcre_mode == PCRE32_MODE) \ + PCRE_FREE_SUBSTRING32(substring); \ + else if (pcre_mode == PCRE16_MODE) \ + PCRE_FREE_SUBSTRING16(substring); \ + else \ + PCRE_FREE_SUBSTRING8(substring) + +#define PCRE_FREE_SUBSTRING_LIST(listptr) \ + if (pcre_mode == PCRE32_MODE) \ + PCRE_FREE_SUBSTRING_LIST32(listptr); \ + else if (pcre_mode == PCRE16_MODE) \ + PCRE_FREE_SUBSTRING_LIST16(listptr); \ + else \ + PCRE_FREE_SUBSTRING_LIST8(listptr) + +#define PCRE_GET_NAMED_SUBSTRING(rc, re, bptr, offsets, count, \ + getnamesptr, subsptr) \ + if (pcre_mode == PCRE32_MODE) \ + PCRE_GET_NAMED_SUBSTRING32(rc, re, bptr, offsets, count, \ + getnamesptr, subsptr); \ + else if (pcre_mode == PCRE16_MODE) \ + PCRE_GET_NAMED_SUBSTRING16(rc, re, bptr, offsets, count, \ + getnamesptr, subsptr); \ + else \ + PCRE_GET_NAMED_SUBSTRING8(rc, re, bptr, offsets, count, \ + getnamesptr, subsptr) + +#define PCRE_GET_STRINGNUMBER(n, rc, ptr) \ + if (pcre_mode == PCRE32_MODE) \ + PCRE_GET_STRINGNUMBER32(n, rc, ptr); \ + else if (pcre_mode == PCRE16_MODE) \ + PCRE_GET_STRINGNUMBER16(n, rc, ptr); \ + else \ + PCRE_GET_STRINGNUMBER8(n, rc, ptr) + +#define PCRE_GET_SUBSTRING(rc, bptr, use_offsets, count, i, subsptr) \ + if (pcre_mode == PCRE32_MODE) \ + PCRE_GET_SUBSTRING32(rc, bptr, use_offsets, count, i, subsptr); \ + else if (pcre_mode == PCRE16_MODE) \ + PCRE_GET_SUBSTRING16(rc, bptr, use_offsets, count, i, subsptr); \ + else \ + PCRE_GET_SUBSTRING8(rc, bptr, use_offsets, count, i, subsptr) + +#define PCRE_GET_SUBSTRING_LIST(rc, bptr, offsets, count, listptr) \ + if (pcre_mode == PCRE32_MODE) \ + PCRE_GET_SUBSTRING_LIST32(rc, bptr, offsets, count, listptr); \ + else if (pcre_mode == PCRE16_MODE) \ + PCRE_GET_SUBSTRING_LIST16(rc, bptr, offsets, count, listptr); \ + else \ + PCRE_GET_SUBSTRING_LIST8(rc, bptr, offsets, count, listptr) + +#define PCRE_JIT_STACK_ALLOC(startsize, maxsize) \ + (pcre_mode == PCRE32_MODE ? \ + PCRE_JIT_STACK_ALLOC32(startsize, maxsize) \ + : pcre_mode == PCRE16_MODE ? \ + PCRE_JIT_STACK_ALLOC16(startsize, maxsize) \ + : PCRE_JIT_STACK_ALLOC8(startsize, maxsize)) + +#define PCRE_JIT_STACK_FREE(stack) \ + if (pcre_mode == PCRE32_MODE) \ + PCRE_JIT_STACK_FREE32(stack); \ + else if (pcre_mode == PCRE16_MODE) \ + PCRE_JIT_STACK_FREE16(stack); \ + else \ + PCRE_JIT_STACK_FREE8(stack) + +#define PCRE_MAKETABLES \ + (pcre_mode == PCRE32_MODE ? pcre32_maketables() : pcre_mode == PCRE16_MODE ? pcre16_maketables() : pcre_maketables()) + +#define PCRE_PATTERN_TO_HOST_BYTE_ORDER(rc, re, extra, tables) \ + if (pcre_mode == PCRE32_MODE) \ + PCRE_PATTERN_TO_HOST_BYTE_ORDER32(rc, re, extra, tables); \ + else if (pcre_mode == PCRE16_MODE) \ + PCRE_PATTERN_TO_HOST_BYTE_ORDER16(rc, re, extra, tables); \ + else \ + PCRE_PATTERN_TO_HOST_BYTE_ORDER8(rc, re, extra, tables) + +#define PCRE_PRINTINT(re, outfile, debug_lengths) \ + if (pcre_mode == PCRE32_MODE) \ + PCRE_PRINTINT32(re, outfile, debug_lengths); \ + else if (pcre_mode == PCRE16_MODE) \ + PCRE_PRINTINT16(re, outfile, debug_lengths); \ + else \ + PCRE_PRINTINT8(re, outfile, debug_lengths) + +#define PCRE_STUDY(extra, re, options, error) \ + if (pcre_mode == PCRE32_MODE) \ + PCRE_STUDY32(extra, re, options, error); \ + else if (pcre_mode == PCRE16_MODE) \ + PCRE_STUDY16(extra, re, options, error); \ + else \ + PCRE_STUDY8(extra, re, options, error) + + +/* ----- Two out of three modes are supported ----- */ + +#else + +/* We can use some macro trickery to make a single set of definitions work in +the three different cases. */ + +/* ----- 32-bit and 16-bit but not 8-bit supported ----- */ + +#if defined(SUPPORT_PCRE32) && defined(SUPPORT_PCRE16) +#define BITONE 32 +#define BITTWO 16 + +/* ----- 32-bit and 8-bit but not 16-bit supported ----- */ + +#elif defined(SUPPORT_PCRE32) && defined(SUPPORT_PCRE8) +#define BITONE 32 +#define BITTWO 8 + +/* ----- 16-bit and 8-bit but not 32-bit supported ----- */ + +#else +#define BITONE 16 +#define BITTWO 8 +#endif + +#define glue(a,b) a##b +#define G(a,b) glue(a,b) + + +/* ----- Common macros for two-mode cases ----- */ + +#define PCHARS(lv, p, offset, len, f) \ + if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \ + G(PCHARS,BITONE)(lv, p, offset, len, f); \ + else \ + G(PCHARS,BITTWO)(lv, p, offset, len, f) + +#define PCHARSV(p, offset, len, f) \ + if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \ + G(PCHARSV,BITONE)(p, offset, len, f); \ + else \ + G(PCHARSV,BITTWO)(p, offset, len, f) + +#define READ_CAPTURE_NAME(p, cn8, cn16, cn32, re) \ + if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \ + G(READ_CAPTURE_NAME,BITONE)(p, cn8, cn16, cn32, re); \ + else \ + G(READ_CAPTURE_NAME,BITTWO)(p, cn8, cn16, cn32, re) + +#define SET_PCRE_CALLOUT(callout) \ + if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \ + G(SET_PCRE_CALLOUT,BITONE)(callout); \ + else \ + G(SET_PCRE_CALLOUT,BITTWO)(callout) + +#define SET_PCRE_STACK_GUARD(stack_guard) \ + if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \ + G(SET_PCRE_STACK_GUARD,BITONE)(stack_guard); \ + else \ + G(SET_PCRE_STACK_GUARD,BITTWO)(stack_guard) + +#define STRLEN(p) ((pcre_mode == G(G(PCRE,BITONE),_MODE)) ? \ + G(STRLEN,BITONE)(p) : G(STRLEN,BITTWO)(p)) + +#define PCRE_ASSIGN_JIT_STACK(extra, callback, userdata) \ + if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \ + G(PCRE_ASSIGN_JIT_STACK,BITONE)(extra, callback, userdata); \ + else \ + G(PCRE_ASSIGN_JIT_STACK,BITTWO)(extra, callback, userdata) + +#define PCRE_COMPILE(re, pat, options, error, erroffset, tables) \ + if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \ + G(PCRE_COMPILE,BITONE)(re, pat, options, error, erroffset, tables); \ + else \ + G(PCRE_COMPILE,BITTWO)(re, pat, options, error, erroffset, tables) + +#define PCRE_CONFIG G(G(pcre,BITONE),_config) + +#define PCRE_COPY_NAMED_SUBSTRING(rc, re, bptr, offsets, count, \ + namesptr, cbuffer, size) \ + if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \ + G(PCRE_COPY_NAMED_SUBSTRING,BITONE)(rc, re, bptr, offsets, count, \ + namesptr, cbuffer, size); \ + else \ + G(PCRE_COPY_NAMED_SUBSTRING,BITTWO)(rc, re, bptr, offsets, count, \ + namesptr, cbuffer, size) + +#define PCRE_COPY_SUBSTRING(rc, bptr, offsets, count, i, cbuffer, size) \ + if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \ + G(PCRE_COPY_SUBSTRING,BITONE)(rc, bptr, offsets, count, i, cbuffer, size); \ + else \ + G(PCRE_COPY_SUBSTRING,BITTWO)(rc, bptr, offsets, count, i, cbuffer, size) + +#define PCRE_DFA_EXEC(count, re, extra, bptr, len, start_offset, options, \ + offsets, size_offsets, workspace, size_workspace) \ + if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \ + G(PCRE_DFA_EXEC,BITONE)(count, re, extra, bptr, len, start_offset, options, \ + offsets, size_offsets, workspace, size_workspace); \ + else \ + G(PCRE_DFA_EXEC,BITTWO)(count, re, extra, bptr, len, start_offset, options, \ + offsets, size_offsets, workspace, size_workspace) + +#define PCRE_EXEC(count, re, extra, bptr, len, start_offset, options, \ + offsets, size_offsets) \ + if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \ + G(PCRE_EXEC,BITONE)(count, re, extra, bptr, len, start_offset, options, \ + offsets, size_offsets); \ + else \ + G(PCRE_EXEC,BITTWO)(count, re, extra, bptr, len, start_offset, options, \ + offsets, size_offsets) + +#define PCRE_FREE_STUDY(extra) \ + if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \ + G(PCRE_FREE_STUDY,BITONE)(extra); \ + else \ + G(PCRE_FREE_STUDY,BITTWO)(extra) + +#define PCRE_FREE_SUBSTRING(substring) \ + if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \ + G(PCRE_FREE_SUBSTRING,BITONE)(substring); \ + else \ + G(PCRE_FREE_SUBSTRING,BITTWO)(substring) + +#define PCRE_FREE_SUBSTRING_LIST(listptr) \ + if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \ + G(PCRE_FREE_SUBSTRING_LIST,BITONE)(listptr); \ + else \ + G(PCRE_FREE_SUBSTRING_LIST,BITTWO)(listptr) + +#define PCRE_GET_NAMED_SUBSTRING(rc, re, bptr, offsets, count, \ + getnamesptr, subsptr) \ + if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \ + G(PCRE_GET_NAMED_SUBSTRING,BITONE)(rc, re, bptr, offsets, count, \ + getnamesptr, subsptr); \ + else \ + G(PCRE_GET_NAMED_SUBSTRING,BITTWO)(rc, re, bptr, offsets, count, \ + getnamesptr, subsptr) + +#define PCRE_GET_STRINGNUMBER(n, rc, ptr) \ + if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \ + G(PCRE_GET_STRINGNUMBER,BITONE)(n, rc, ptr); \ + else \ + G(PCRE_GET_STRINGNUMBER,BITTWO)(n, rc, ptr) + +#define PCRE_GET_SUBSTRING(rc, bptr, use_offsets, count, i, subsptr) \ + if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \ + G(PCRE_GET_SUBSTRING,BITONE)(rc, bptr, use_offsets, count, i, subsptr); \ + else \ + G(PCRE_GET_SUBSTRING,BITTWO)(rc, bptr, use_offsets, count, i, subsptr) + +#define PCRE_GET_SUBSTRING_LIST(rc, bptr, offsets, count, listptr) \ + if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \ + G(PCRE_GET_SUBSTRING_LIST,BITONE)(rc, bptr, offsets, count, listptr); \ + else \ + G(PCRE_GET_SUBSTRING_LIST,BITTWO)(rc, bptr, offsets, count, listptr) + +#define PCRE_JIT_STACK_ALLOC(startsize, maxsize) \ + (pcre_mode == G(G(PCRE,BITONE),_MODE)) ? \ + G(PCRE_JIT_STACK_ALLOC,BITONE)(startsize, maxsize) \ + : G(PCRE_JIT_STACK_ALLOC,BITTWO)(startsize, maxsize) + +#define PCRE_JIT_STACK_FREE(stack) \ + if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \ + G(PCRE_JIT_STACK_FREE,BITONE)(stack); \ + else \ + G(PCRE_JIT_STACK_FREE,BITTWO)(stack) + +#define PCRE_MAKETABLES \ + (pcre_mode == G(G(PCRE,BITONE),_MODE)) ? \ + G(G(pcre,BITONE),_maketables)() : G(G(pcre,BITTWO),_maketables)() + +#define PCRE_PATTERN_TO_HOST_BYTE_ORDER(rc, re, extra, tables) \ + if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \ + G(PCRE_PATTERN_TO_HOST_BYTE_ORDER,BITONE)(rc, re, extra, tables); \ + else \ + G(PCRE_PATTERN_TO_HOST_BYTE_ORDER,BITTWO)(rc, re, extra, tables) + +#define PCRE_PRINTINT(re, outfile, debug_lengths) \ + if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \ + G(PCRE_PRINTINT,BITONE)(re, outfile, debug_lengths); \ + else \ + G(PCRE_PRINTINT,BITTWO)(re, outfile, debug_lengths) + +#define PCRE_STUDY(extra, re, options, error) \ + if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \ + G(PCRE_STUDY,BITONE)(extra, re, options, error); \ + else \ + G(PCRE_STUDY,BITTWO)(extra, re, options, error) + +#endif /* Two out of three modes */ + +/* ----- End of cases where more than one mode is supported ----- */ + + +/* ----- Only 8-bit mode is supported ----- */ + +#elif defined SUPPORT_PCRE8 +#define CHAR_SIZE 1 +#define PCHARS PCHARS8 +#define PCHARSV PCHARSV8 +#define READ_CAPTURE_NAME READ_CAPTURE_NAME8 +#define SET_PCRE_CALLOUT SET_PCRE_CALLOUT8 +#define SET_PCRE_STACK_GUARD SET_PCRE_STACK_GUARD8 +#define STRLEN STRLEN8 +#define PCRE_ASSIGN_JIT_STACK PCRE_ASSIGN_JIT_STACK8 +#define PCRE_COMPILE PCRE_COMPILE8 +#define PCRE_CONFIG pcre_config +#define PCRE_COPY_NAMED_SUBSTRING PCRE_COPY_NAMED_SUBSTRING8 +#define PCRE_COPY_SUBSTRING PCRE_COPY_SUBSTRING8 +#define PCRE_DFA_EXEC PCRE_DFA_EXEC8 +#define PCRE_EXEC PCRE_EXEC8 +#define PCRE_FREE_STUDY PCRE_FREE_STUDY8 +#define PCRE_FREE_SUBSTRING PCRE_FREE_SUBSTRING8 +#define PCRE_FREE_SUBSTRING_LIST PCRE_FREE_SUBSTRING_LIST8 +#define PCRE_GET_NAMED_SUBSTRING PCRE_GET_NAMED_SUBSTRING8 +#define PCRE_GET_STRINGNUMBER PCRE_GET_STRINGNUMBER8 +#define PCRE_GET_SUBSTRING PCRE_GET_SUBSTRING8 +#define PCRE_GET_SUBSTRING_LIST PCRE_GET_SUBSTRING_LIST8 +#define PCRE_JIT_STACK_ALLOC PCRE_JIT_STACK_ALLOC8 +#define PCRE_JIT_STACK_FREE PCRE_JIT_STACK_FREE8 +#define PCRE_MAKETABLES pcre_maketables() +#define PCRE_PATTERN_TO_HOST_BYTE_ORDER PCRE_PATTERN_TO_HOST_BYTE_ORDER8 +#define PCRE_PRINTINT PCRE_PRINTINT8 +#define PCRE_STUDY PCRE_STUDY8 + +/* ----- Only 16-bit mode is supported ----- */ + +#elif defined SUPPORT_PCRE16 +#define CHAR_SIZE 2 +#define PCHARS PCHARS16 +#define PCHARSV PCHARSV16 +#define READ_CAPTURE_NAME READ_CAPTURE_NAME16 +#define SET_PCRE_CALLOUT SET_PCRE_CALLOUT16 +#define SET_PCRE_STACK_GUARD SET_PCRE_STACK_GUARD16 +#define STRLEN STRLEN16 +#define PCRE_ASSIGN_JIT_STACK PCRE_ASSIGN_JIT_STACK16 +#define PCRE_COMPILE PCRE_COMPILE16 +#define PCRE_CONFIG pcre16_config +#define PCRE_COPY_NAMED_SUBSTRING PCRE_COPY_NAMED_SUBSTRING16 +#define PCRE_COPY_SUBSTRING PCRE_COPY_SUBSTRING16 +#define PCRE_DFA_EXEC PCRE_DFA_EXEC16 +#define PCRE_EXEC PCRE_EXEC16 +#define PCRE_FREE_STUDY PCRE_FREE_STUDY16 +#define PCRE_FREE_SUBSTRING PCRE_FREE_SUBSTRING16 +#define PCRE_FREE_SUBSTRING_LIST PCRE_FREE_SUBSTRING_LIST16 +#define PCRE_GET_NAMED_SUBSTRING PCRE_GET_NAMED_SUBSTRING16 +#define PCRE_GET_STRINGNUMBER PCRE_GET_STRINGNUMBER16 +#define PCRE_GET_SUBSTRING PCRE_GET_SUBSTRING16 +#define PCRE_GET_SUBSTRING_LIST PCRE_GET_SUBSTRING_LIST16 +#define PCRE_JIT_STACK_ALLOC PCRE_JIT_STACK_ALLOC16 +#define PCRE_JIT_STACK_FREE PCRE_JIT_STACK_FREE16 +#define PCRE_MAKETABLES pcre16_maketables() +#define PCRE_PATTERN_TO_HOST_BYTE_ORDER PCRE_PATTERN_TO_HOST_BYTE_ORDER16 +#define PCRE_PRINTINT PCRE_PRINTINT16 +#define PCRE_STUDY PCRE_STUDY16 + +/* ----- Only 32-bit mode is supported ----- */ + +#elif defined SUPPORT_PCRE32 +#define CHAR_SIZE 4 +#define PCHARS PCHARS32 +#define PCHARSV PCHARSV32 +#define READ_CAPTURE_NAME READ_CAPTURE_NAME32 +#define SET_PCRE_CALLOUT SET_PCRE_CALLOUT32 +#define SET_PCRE_STACK_GUARD SET_PCRE_STACK_GUARD32 +#define STRLEN STRLEN32 +#define PCRE_ASSIGN_JIT_STACK PCRE_ASSIGN_JIT_STACK32 +#define PCRE_COMPILE PCRE_COMPILE32 +#define PCRE_CONFIG pcre32_config +#define PCRE_COPY_NAMED_SUBSTRING PCRE_COPY_NAMED_SUBSTRING32 +#define PCRE_COPY_SUBSTRING PCRE_COPY_SUBSTRING32 +#define PCRE_DFA_EXEC PCRE_DFA_EXEC32 +#define PCRE_EXEC PCRE_EXEC32 +#define PCRE_FREE_STUDY PCRE_FREE_STUDY32 +#define PCRE_FREE_SUBSTRING PCRE_FREE_SUBSTRING32 +#define PCRE_FREE_SUBSTRING_LIST PCRE_FREE_SUBSTRING_LIST32 +#define PCRE_GET_NAMED_SUBSTRING PCRE_GET_NAMED_SUBSTRING32 +#define PCRE_GET_STRINGNUMBER PCRE_GET_STRINGNUMBER32 +#define PCRE_GET_SUBSTRING PCRE_GET_SUBSTRING32 +#define PCRE_GET_SUBSTRING_LIST PCRE_GET_SUBSTRING_LIST32 +#define PCRE_JIT_STACK_ALLOC PCRE_JIT_STACK_ALLOC32 +#define PCRE_JIT_STACK_FREE PCRE_JIT_STACK_FREE32 +#define PCRE_MAKETABLES pcre32_maketables() +#define PCRE_PATTERN_TO_HOST_BYTE_ORDER PCRE_PATTERN_TO_HOST_BYTE_ORDER32 +#define PCRE_PRINTINT PCRE_PRINTINT32 +#define PCRE_STUDY PCRE_STUDY32 + +#endif + +/* ----- End of mode-specific function call macros ----- */ + + +/* Other parameters */ + +#ifndef CLOCKS_PER_SEC +#ifdef CLK_TCK +#define CLOCKS_PER_SEC CLK_TCK +#else +#define CLOCKS_PER_SEC 100 +#endif +#endif + +#if !defined NODFA +#define DFA_WS_DIMENSION 1000 +#endif + +/* This is the default loop count for timing. */ + +#define LOOPREPEAT 500000 + +/* Static variables */ + +static FILE *outfile; +static int log_store = 0; +static int callout_count; +static int callout_extra; +static int callout_fail_count; +static int callout_fail_id; +static int debug_lengths; +static int first_callout; +static int jit_was_used; +static int locale_set = 0; +static int show_malloc; +static int stack_guard_return; +static int use_utf; +static const unsigned char *last_callout_mark = NULL; + +/* The buffers grow automatically if very long input lines are encountered. */ + +static int buffer_size = 50000; +static pcre_uint8 *buffer = NULL; +static pcre_uint8 *pbuffer = NULL; + +/* Just as a safety check, make sure that COMPILE_PCRE[16|32] are *not* set. */ + +#ifdef COMPILE_PCRE16 +#error COMPILE_PCRE16 must not be set when compiling pcretest.c +#endif + +#ifdef COMPILE_PCRE32 +#error COMPILE_PCRE32 must not be set when compiling pcretest.c +#endif + +/* We need buffers for building 16/32-bit strings, and the tables of operator +lengths that are used for 16/32-bit compiling, in order to swap bytes in a +pattern for saving/reloading testing. Luckily, the data for these tables is +defined as a macro. However, we must ensure that LINK_SIZE and IMM2_SIZE (which +are used in the tables) are adjusted appropriately for the 16/32-bit world. +LINK_SIZE is also used later in this program. */ + +#ifdef SUPPORT_PCRE16 +#undef IMM2_SIZE +#define IMM2_SIZE 1 + +#if LINK_SIZE == 2 +#undef LINK_SIZE +#define LINK_SIZE 1 +#elif LINK_SIZE == 3 || LINK_SIZE == 4 +#undef LINK_SIZE +#define LINK_SIZE 2 +#else +#error LINK_SIZE must be either 2, 3, or 4 +#endif + +static int buffer16_size = 0; +static pcre_uint16 *buffer16 = NULL; +static const pcre_uint16 OP_lengths16[] = { OP_LENGTHS }; +#endif /* SUPPORT_PCRE16 */ + +#ifdef SUPPORT_PCRE32 +#undef IMM2_SIZE +#define IMM2_SIZE 1 +#undef LINK_SIZE +#define LINK_SIZE 1 + +static int buffer32_size = 0; +static pcre_uint32 *buffer32 = NULL; +static const pcre_uint32 OP_lengths32[] = { OP_LENGTHS }; +#endif /* SUPPORT_PCRE32 */ + +/* If we have 8-bit support, default to it; if there is also 16-or 32-bit +support, it can be changed by an option. If there is no 8-bit support, there +must be 16-or 32-bit support, so default it to 1. */ + +#if defined SUPPORT_PCRE8 +static int pcre_mode = PCRE8_MODE; +#elif defined SUPPORT_PCRE16 +static int pcre_mode = PCRE16_MODE; +#elif defined SUPPORT_PCRE32 +static int pcre_mode = PCRE32_MODE; +#endif + +/* JIT study options for -s+n and /S+n where '1' <= n <= '7'. */ + +static int jit_study_bits[] = + { + PCRE_STUDY_JIT_COMPILE, + PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE, + PCRE_STUDY_JIT_COMPILE + PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE, + PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE, + PCRE_STUDY_JIT_COMPILE + PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE, + PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE + PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE, + PCRE_STUDY_JIT_COMPILE + PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE + + PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE +}; + +#define PCRE_STUDY_ALLJIT (PCRE_STUDY_JIT_COMPILE | \ + PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE | PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE) + +/* Textual explanations for runtime error codes */ + +static const char *errtexts[] = { + NULL, /* 0 is no error */ + NULL, /* NOMATCH is handled specially */ + "NULL argument passed", + "bad option value", + "magic number missing", + "unknown opcode - pattern overwritten?", + "no more memory", + NULL, /* never returned by pcre_exec() or pcre_dfa_exec() */ + "match limit exceeded", + "callout error code", + NULL, /* BADUTF8/16 is handled specially */ + NULL, /* BADUTF8/16 offset is handled specially */ + NULL, /* PARTIAL is handled specially */ + "not used - internal error", + "internal error - pattern overwritten?", + "bad count value", + "item unsupported for DFA matching", + "backreference condition or recursion test not supported for DFA matching", + "match limit not supported for DFA matching", + "workspace size exceeded in DFA matching", + "too much recursion for DFA matching", + "recursion limit exceeded", + "not used - internal error", + "invalid combination of newline options", + "bad offset value", + NULL, /* SHORTUTF8/16 is handled specially */ + "nested recursion at the same subject position", + "JIT stack limit reached", + "pattern compiled in wrong mode: 8-bit/16-bit error", + "pattern compiled with other endianness", + "invalid data in workspace for DFA restart", + "bad JIT option", + "bad length" +}; + + +/************************************************* +* Alternate character tables * +*************************************************/ + +/* By default, the "tables" pointer when calling PCRE is set to NULL, thereby +using the default tables of the library. However, the T option can be used to +select alternate sets of tables, for different kinds of testing. Note also that +the L (locale) option also adjusts the tables. */ + +/* This is the set of tables distributed as default with PCRE. It recognizes +only ASCII characters. */ + +static const pcre_uint8 tables0[] = { + +/* This table is a lower casing table. */ + + 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, + 64, 97, 98, 99,100,101,102,103, + 104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119, + 120,121,122, 91, 92, 93, 94, 95, + 96, 97, 98, 99,100,101,102,103, + 104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119, + 120,121,122,123,124,125,126,127, + 128,129,130,131,132,133,134,135, + 136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151, + 152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167, + 168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183, + 184,185,186,187,188,189,190,191, + 192,193,194,195,196,197,198,199, + 200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215, + 216,217,218,219,220,221,222,223, + 224,225,226,227,228,229,230,231, + 232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,247, + 248,249,250,251,252,253,254,255, + +/* This table is a case flipping table. */ + + 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, + 64, 97, 98, 99,100,101,102,103, + 104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119, + 120,121,122, 91, 92, 93, 94, 95, + 96, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90,123,124,125,126,127, + 128,129,130,131,132,133,134,135, + 136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151, + 152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167, + 168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183, + 184,185,186,187,188,189,190,191, + 192,193,194,195,196,197,198,199, + 200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215, + 216,217,218,219,220,221,222,223, + 224,225,226,227,228,229,230,231, + 232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,247, + 248,249,250,251,252,253,254,255, + +/* This table contains bit maps for various character classes. Each map is 32 +bytes long and the bits run from the least significant end of each byte. The +classes that have their own maps are: space, xdigit, digit, upper, lower, word, +graph, print, punct, and cntrl. Other classes are built from combinations. */ + + 0x00,0x3e,0x00,0x00,0x01,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + + 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03, + 0x7e,0x00,0x00,0x00,0x7e,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + + 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xfe,0xff,0xff,0x07,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0x07, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + + 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03, + 0xfe,0xff,0xff,0x87,0xfe,0xff,0xff,0x07, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + + 0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + + 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + + 0x00,0x00,0x00,0x00,0xfe,0xff,0x00,0xfc, + 0x01,0x00,0x00,0xf8,0x01,0x00,0x00,0x78, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + + 0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +/* This table identifies various classes of character by individual bits: + 0x01 white space character + 0x02 letter + 0x04 decimal digit + 0x08 hexadecimal digit + 0x10 alphanumeric or '_' + 0x80 regular expression metacharacter or binary zero +*/ + + 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0- 7 */ + 0x00,0x01,0x01,0x01,0x01,0x01,0x00,0x00, /* 8- 15 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 16- 23 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 24- 31 */ + 0x01,0x00,0x00,0x00,0x80,0x00,0x00,0x00, /* - ' */ + 0x80,0x80,0x80,0x80,0x00,0x00,0x80,0x00, /* ( - / */ + 0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c, /* 0 - 7 */ + 0x1c,0x1c,0x00,0x00,0x00,0x00,0x00,0x80, /* 8 - ? */ + 0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /* @ - G */ + 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* H - O */ + 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* P - W */ + 0x12,0x12,0x12,0x80,0x80,0x00,0x80,0x10, /* X - _ */ + 0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /* ` - g */ + 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* h - o */ + 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* p - w */ + 0x12,0x12,0x12,0x80,0x80,0x00,0x00,0x00, /* x -127 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 128-135 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 136-143 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 144-151 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 152-159 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 160-167 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 168-175 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 176-183 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 184-191 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 192-199 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 200-207 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 208-215 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 216-223 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 224-231 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 232-239 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 240-247 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/* 248-255 */ + +/* This is a set of tables that came originally from a Windows user. It seems +to be at least an approximation of ISO 8859. In particular, there are +characters greater than 128 that are marked as spaces, letters, etc. */ + +static const pcre_uint8 tables1[] = { +0,1,2,3,4,5,6,7, +8,9,10,11,12,13,14,15, +16,17,18,19,20,21,22,23, +24,25,26,27,28,29,30,31, +32,33,34,35,36,37,38,39, +40,41,42,43,44,45,46,47, +48,49,50,51,52,53,54,55, +56,57,58,59,60,61,62,63, +64,97,98,99,100,101,102,103, +104,105,106,107,108,109,110,111, +112,113,114,115,116,117,118,119, +120,121,122,91,92,93,94,95, +96,97,98,99,100,101,102,103, +104,105,106,107,108,109,110,111, +112,113,114,115,116,117,118,119, +120,121,122,123,124,125,126,127, +128,129,130,131,132,133,134,135, +136,137,138,139,140,141,142,143, +144,145,146,147,148,149,150,151, +152,153,154,155,156,157,158,159, +160,161,162,163,164,165,166,167, +168,169,170,171,172,173,174,175, +176,177,178,179,180,181,182,183, +184,185,186,187,188,189,190,191, +224,225,226,227,228,229,230,231, +232,233,234,235,236,237,238,239, +240,241,242,243,244,245,246,215, +248,249,250,251,252,253,254,223, +224,225,226,227,228,229,230,231, +232,233,234,235,236,237,238,239, +240,241,242,243,244,245,246,247, +248,249,250,251,252,253,254,255, +0,1,2,3,4,5,6,7, +8,9,10,11,12,13,14,15, +16,17,18,19,20,21,22,23, +24,25,26,27,28,29,30,31, +32,33,34,35,36,37,38,39, +40,41,42,43,44,45,46,47, +48,49,50,51,52,53,54,55, +56,57,58,59,60,61,62,63, +64,97,98,99,100,101,102,103, +104,105,106,107,108,109,110,111, +112,113,114,115,116,117,118,119, +120,121,122,91,92,93,94,95, +96,65,66,67,68,69,70,71, +72,73,74,75,76,77,78,79, +80,81,82,83,84,85,86,87, +88,89,90,123,124,125,126,127, +128,129,130,131,132,133,134,135, +136,137,138,139,140,141,142,143, +144,145,146,147,148,149,150,151, +152,153,154,155,156,157,158,159, +160,161,162,163,164,165,166,167, +168,169,170,171,172,173,174,175, +176,177,178,179,180,181,182,183, +184,185,186,187,188,189,190,191, +224,225,226,227,228,229,230,231, +232,233,234,235,236,237,238,239, +240,241,242,243,244,245,246,215, +248,249,250,251,252,253,254,223, +192,193,194,195,196,197,198,199, +200,201,202,203,204,205,206,207, +208,209,210,211,212,213,214,247, +216,217,218,219,220,221,222,255, +0,62,0,0,1,0,0,0, +0,0,0,0,0,0,0,0, +32,0,0,0,1,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,255,3, +126,0,0,0,126,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,255,3, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,12,2, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +254,255,255,7,0,0,0,0, +0,0,0,0,0,0,0,0, +255,255,127,127,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,254,255,255,7, +0,0,0,0,0,4,32,4, +0,0,0,128,255,255,127,255, +0,0,0,0,0,0,255,3, +254,255,255,135,254,255,255,7, +0,0,0,0,0,4,44,6, +255,255,127,255,255,255,127,255, +0,0,0,0,254,255,255,255, +255,255,255,255,255,255,255,127, +0,0,0,0,254,255,255,255, +255,255,255,255,255,255,255,255, +0,2,0,0,255,255,255,255, +255,255,255,255,255,255,255,127, +0,0,0,0,255,255,255,255, +255,255,255,255,255,255,255,255, +0,0,0,0,254,255,0,252, +1,0,0,248,1,0,0,120, +0,0,0,0,254,255,255,255, +0,0,128,0,0,0,128,0, +255,255,255,255,0,0,0,0, +0,0,0,0,0,0,0,128, +255,255,255,255,0,0,0,0, +0,0,0,0,0,0,0,0, +128,0,0,0,0,0,0,0, +0,1,1,0,1,1,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +1,0,0,0,128,0,0,0, +128,128,128,128,0,0,128,0, +28,28,28,28,28,28,28,28, +28,28,0,0,0,0,0,128, +0,26,26,26,26,26,26,18, +18,18,18,18,18,18,18,18, +18,18,18,18,18,18,18,18, +18,18,18,128,128,0,128,16, +0,26,26,26,26,26,26,18, +18,18,18,18,18,18,18,18, +18,18,18,18,18,18,18,18, +18,18,18,128,128,0,0,0, +0,0,0,0,0,1,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0, +0,0,18,0,0,0,0,0, +0,0,20,20,0,18,0,0, +0,20,18,0,0,0,0,0, +18,18,18,18,18,18,18,18, +18,18,18,18,18,18,18,18, +18,18,18,18,18,18,18,0, +18,18,18,18,18,18,18,18, +18,18,18,18,18,18,18,18, +18,18,18,18,18,18,18,18, +18,18,18,18,18,18,18,0, +18,18,18,18,18,18,18,18 +}; + + + + +#ifndef HAVE_STRERROR +/************************************************* +* Provide strerror() for non-ANSI libraries * +*************************************************/ + +/* Some old-fashioned systems still around (e.g. SunOS4) don't have strerror() +in their libraries, but can provide the same facility by this simple +alternative function. */ + +extern int sys_nerr; +extern char *sys_errlist[]; + +char * +strerror(int n) +{ +if (n < 0 || n >= sys_nerr) return "unknown error number"; +return sys_errlist[n]; +} +#endif /* HAVE_STRERROR */ + + + +/************************************************* +* Print newline configuration * +*************************************************/ + +/* +Arguments: + rc the return code from PCRE_CONFIG_NEWLINE + isc TRUE if called from "-C newline" +Returns: nothing +*/ + +static void +print_newline_config(int rc, BOOL isc) +{ +const char *s = NULL; +if (!isc) printf(" Newline sequence is "); +switch(rc) + { + case CHAR_CR: s = "CR"; break; + case CHAR_LF: s = "LF"; break; + case (CHAR_CR<<8 | CHAR_LF): s = "CRLF"; break; + case -1: s = "ANY"; break; + case -2: s = "ANYCRLF"; break; + + default: + printf("a non-standard value: 0x%04x\n", rc); + return; + } + +printf("%s\n", s); +} + + + +/************************************************* +* JIT memory callback * +*************************************************/ + +static pcre_jit_stack* jit_callback(void *arg) +{ +jit_was_used = TRUE; +return (pcre_jit_stack *)arg; +} + + +#if !defined NOUTF || defined SUPPORT_PCRE16 || defined SUPPORT_PCRE32 +/************************************************* +* Convert UTF-8 string to value * +*************************************************/ + +/* This function takes one or more bytes that represents a UTF-8 character, +and returns the value of the character. + +Argument: + utf8bytes a pointer to the byte vector + vptr a pointer to an int to receive the value + +Returns: > 0 => the number of bytes consumed + -6 to 0 => malformed UTF-8 character at offset = (-return) +*/ + +static int +utf82ord(pcre_uint8 *utf8bytes, pcre_uint32 *vptr) +{ +pcre_uint32 c = *utf8bytes++; +pcre_uint32 d = c; +int i, j, s; + +for (i = -1; i < 6; i++) /* i is number of additional bytes */ + { + if ((d & 0x80) == 0) break; + d <<= 1; + } + +if (i == -1) { *vptr = c; return 1; } /* ascii character */ +if (i == 0 || i == 6) return 0; /* invalid UTF-8 */ + +/* i now has a value in the range 1-5 */ + +s = 6*i; +d = (c & utf8_table3[i]) << s; + +for (j = 0; j < i; j++) + { + c = *utf8bytes++; + if ((c & 0xc0) != 0x80) return -(j+1); + s -= 6; + d |= (c & 0x3f) << s; + } + +/* Check that encoding was the correct unique one */ + +for (j = 0; j < utf8_table1_size; j++) + if (d <= (pcre_uint32)utf8_table1[j]) break; +if (j != i) return -(i+1); + +/* Valid value */ + +*vptr = d; +return i+1; +} +#endif /* NOUTF || SUPPORT_PCRE16 */ + + + +#if defined SUPPORT_PCRE8 && !defined NOUTF +/************************************************* +* Convert character value to UTF-8 * +*************************************************/ + +/* This function takes an integer value in the range 0 - 0x7fffffff +and encodes it as a UTF-8 character in 0 to 6 bytes. + +Arguments: + cvalue the character value + utf8bytes pointer to buffer for result - at least 6 bytes long + +Returns: number of characters placed in the buffer +*/ + +static int +ord2utf8(pcre_uint32 cvalue, pcre_uint8 *utf8bytes) +{ +register int i, j; +if (cvalue > 0x7fffffffu) + return -1; +for (i = 0; i < utf8_table1_size; i++) + if (cvalue <= (pcre_uint32)utf8_table1[i]) break; +utf8bytes += i; +for (j = i; j > 0; j--) + { + *utf8bytes-- = 0x80 | (cvalue & 0x3f); + cvalue >>= 6; + } +*utf8bytes = utf8_table2[i] | cvalue; +return i + 1; +} +#endif + + +#ifdef SUPPORT_PCRE16 +/************************************************* +* Convert a string to 16-bit * +*************************************************/ + +/* In non-UTF mode, the space needed for a 16-bit string is exactly double the +8-bit size. For a UTF-8 string, the size needed for UTF-16 is no more than +double, because up to 0xffff uses no more than 3 bytes in UTF-8 but possibly 4 +in UTF-16. Higher values use 4 bytes in UTF-8 and up to 4 bytes in UTF-16. The +result is always left in buffer16. + +Note that this function does not object to surrogate values. This is +deliberate; it makes it possible to construct UTF-16 strings that are invalid, +for the purpose of testing that they are correctly faulted. + +Patterns to be converted are either plain ASCII or UTF-8; data lines are always +in UTF-8 so that values greater than 255 can be handled. + +Arguments: + data TRUE if converting a data line; FALSE for a regex + p points to a byte string + utf true if UTF-8 (to be converted to UTF-16) + len number of bytes in the string (excluding trailing zero) + +Returns: number of 16-bit data items used (excluding trailing zero) + OR -1 if a UTF-8 string is malformed + OR -2 if a value > 0x10ffff is encountered + OR -3 if a value > 0xffff is encountered when not in UTF mode +*/ + +static int +to16(int data, pcre_uint8 *p, int utf, int len) +{ +pcre_uint16 *pp; + +if (buffer16_size < 2*len + 2) + { + if (buffer16 != NULL) free(buffer16); + buffer16_size = 2*len + 2; + buffer16 = (pcre_uint16 *)malloc(buffer16_size); + if (buffer16 == NULL) + { + fprintf(stderr, "pcretest: malloc(%d) failed for buffer16\n", buffer16_size); + exit(1); + } + } + +pp = buffer16; + +if (!utf && !data) + { + while (len-- > 0) *pp++ = *p++; + } + +else + { + pcre_uint32 c = 0; + while (len > 0) + { + int chlen = utf82ord(p, &c); + if (chlen <= 0) return -1; + if (c > 0x10ffff) return -2; + p += chlen; + len -= chlen; + if (c < 0x10000) *pp++ = c; else + { + if (!utf) return -3; + c -= 0x10000; + *pp++ = 0xD800 | (c >> 10); + *pp++ = 0xDC00 | (c & 0x3ff); + } + } + } + +*pp = 0; +return pp - buffer16; +} +#endif + +#ifdef SUPPORT_PCRE32 +/************************************************* +* Convert a string to 32-bit * +*************************************************/ + +/* In non-UTF mode, the space needed for a 32-bit string is exactly four times the +8-bit size. For a UTF-8 string, the size needed for UTF-32 is no more than four +times, because up to 0xffff uses no more than 3 bytes in UTF-8 but possibly 4 +in UTF-32. Higher values use 4 bytes in UTF-8 and up to 4 bytes in UTF-32. The +result is always left in buffer32. + +Note that this function does not object to surrogate values. This is +deliberate; it makes it possible to construct UTF-32 strings that are invalid, +for the purpose of testing that they are correctly faulted. + +Patterns to be converted are either plain ASCII or UTF-8; data lines are always +in UTF-8 so that values greater than 255 can be handled. + +Arguments: + data TRUE if converting a data line; FALSE for a regex + p points to a byte string + utf true if UTF-8 (to be converted to UTF-32) + len number of bytes in the string (excluding trailing zero) + +Returns: number of 32-bit data items used (excluding trailing zero) + OR -1 if a UTF-8 string is malformed + OR -2 if a value > 0x10ffff is encountered + OR -3 if an ill-formed value is encountered (i.e. a surrogate) +*/ + +static int +to32(int data, pcre_uint8 *p, int utf, int len) +{ +pcre_uint32 *pp; + +if (buffer32_size < 4*len + 4) + { + if (buffer32 != NULL) free(buffer32); + buffer32_size = 4*len + 4; + buffer32 = (pcre_uint32 *)malloc(buffer32_size); + if (buffer32 == NULL) + { + fprintf(stderr, "pcretest: malloc(%d) failed for buffer32\n", buffer32_size); + exit(1); + } + } + +pp = buffer32; + +if (!utf && !data) + { + while (len-- > 0) *pp++ = *p++; + } + +else + { + pcre_uint32 c = 0; + while (len > 0) + { + int chlen = utf82ord(p, &c); + if (chlen <= 0) return -1; + if (utf) + { + if (c > 0x10ffff) return -2; + if (!data && (c & 0xfffff800u) == 0xd800u) return -3; + } + + p += chlen; + len -= chlen; + *pp++ = c; + } + } + +*pp = 0; +return pp - buffer32; +} + +/* Check that a 32-bit character string is valid UTF-32. + +Arguments: + string points to the string + length length of string, or -1 if the string is zero-terminated + +Returns: TRUE if the string is a valid UTF-32 string + FALSE otherwise +*/ + +#ifdef NEVER /* Not used */ +#ifdef SUPPORT_UTF +static BOOL +valid_utf32(pcre_uint32 *string, int length) +{ +register pcre_uint32 *p; +register pcre_uint32 c; + +for (p = string; length-- > 0; p++) + { + c = *p; + if (c > 0x10ffffu) return FALSE; /* Too big */ + if ((c & 0xfffff800u) == 0xd800u) return FALSE; /* Surrogate */ + } + +return TRUE; +} +#endif /* SUPPORT_UTF */ +#endif /* NEVER */ +#endif /* SUPPORT_PCRE32 */ + + +/************************************************* +* Read or extend an input line * +*************************************************/ + +/* Input lines are read into buffer, but both patterns and data lines can be +continued over multiple input lines. In addition, if the buffer fills up, we +want to automatically expand it so as to be able to handle extremely large +lines that are needed for certain stress tests. When the input buffer is +expanded, the other two buffers must also be expanded likewise, and the +contents of pbuffer, which are a copy of the input for callouts, must be +preserved (for when expansion happens for a data line). This is not the most +optimal way of handling this, but hey, this is just a test program! + +Arguments: + f the file to read + start where in buffer to start (this *must* be within buffer) + prompt for stdin or readline() + +Returns: pointer to the start of new data + could be a copy of start, or could be moved + NULL if no data read and EOF reached +*/ + +static pcre_uint8 * +extend_inputline(FILE *f, pcre_uint8 *start, const char *prompt) +{ +pcre_uint8 *here = start; + +for (;;) + { + size_t rlen = (size_t)(buffer_size - (here - buffer)); + + if (rlen > 1000) + { + int dlen; + + /* If libreadline or libedit support is required, use readline() to read a + line if the input is a terminal. Note that readline() removes the trailing + newline, so we must put it back again, to be compatible with fgets(). */ + +#if defined(SUPPORT_LIBREADLINE) || defined(SUPPORT_LIBEDIT) + if (isatty(fileno(f))) + { + size_t len; + char *s = readline(prompt); + if (s == NULL) return (here == start)? NULL : start; + len = strlen(s); + if (len > 0) add_history(s); + if (len > rlen - 1) len = rlen - 1; + memcpy(here, s, len); + here[len] = '\n'; + here[len+1] = 0; + free(s); + } + else +#endif + + /* Read the next line by normal means, prompting if the file is stdin. */ + + { + if (f == stdin) printf("%s", prompt); + if (fgets((char *)here, rlen, f) == NULL) + return (here == start)? NULL : start; + } + + dlen = (int)strlen((char *)here); + if (dlen > 0 && here[dlen - 1] == '\n') return start; + here += dlen; + } + + else + { + int new_buffer_size = 2*buffer_size; + pcre_uint8 *new_buffer = (pcre_uint8 *)malloc(new_buffer_size); + pcre_uint8 *new_pbuffer = (pcre_uint8 *)malloc(new_buffer_size); + + if (new_buffer == NULL || new_pbuffer == NULL) + { + fprintf(stderr, "pcretest: malloc(%d) failed\n", new_buffer_size); + exit(1); + } + + memcpy(new_buffer, buffer, buffer_size); + memcpy(new_pbuffer, pbuffer, buffer_size); + + buffer_size = new_buffer_size; + + start = new_buffer + (start - buffer); + here = new_buffer + (here - buffer); + + free(buffer); + free(pbuffer); + + buffer = new_buffer; + pbuffer = new_pbuffer; + } + } + +/* Control never gets here */ +} + + + +/************************************************* +* Read number from string * +*************************************************/ + +/* We don't use strtoul() because SunOS4 doesn't have it. Rather than mess +around with conditional compilation, just do the job by hand. It is only used +for unpicking arguments, so just keep it simple. + +Arguments: + str string to be converted + endptr where to put the end pointer + +Returns: the unsigned long +*/ + +static int +get_value(pcre_uint8 *str, pcre_uint8 **endptr) +{ +int result = 0; +while(*str != 0 && isspace(*str)) str++; +while (isdigit(*str)) result = result * 10 + (int)(*str++ - '0'); +*endptr = str; +return(result); +} + + + +/************************************************* +* Print one character * +*************************************************/ + +/* Print a single character either literally, or as a hex escape. */ + +static int pchar(pcre_uint32 c, FILE *f) +{ +int n = 0; +char tempbuffer[16]; +if (PRINTOK(c)) + { + if (f != NULL) fprintf(f, "%c", c); + return 1; + } + +if (c < 0x100) + { + if (use_utf) + { + if (f != NULL) fprintf(f, "\\x{%02x}", c); + return 6; + } + else + { + if (f != NULL) fprintf(f, "\\x%02x", c); + return 4; + } + } + +if (f != NULL) n = fprintf(f, "\\x{%02x}", c); + else n = sprintf(tempbuffer, "\\x{%02x}", c); + +return n >= 0 ? n : 0; +} + + + +#ifdef SUPPORT_PCRE8 +/************************************************* +* Print 8-bit character string * +*************************************************/ + +/* Must handle UTF-8 strings in utf8 mode. Yields number of characters printed. +If handed a NULL file, just counts chars without printing. */ + +static int pchars(pcre_uint8 *p, int length, FILE *f) +{ +pcre_uint32 c = 0; +int yield = 0; + +if (length < 0) + length = strlen((char *)p); + +while (length-- > 0) + { +#if !defined NOUTF + if (use_utf) + { + int rc = utf82ord(p, &c); + if (rc > 0 && rc <= length + 1) /* Mustn't run over the end */ + { + length -= rc - 1; + p += rc; + yield += pchar(c, f); + continue; + } + } +#endif + c = *p++; + yield += pchar(c, f); + } + +return yield; +} +#endif + + + +#ifdef SUPPORT_PCRE16 +/************************************************* +* Find length of 0-terminated 16-bit string * +*************************************************/ + +static int strlen16(PCRE_SPTR16 p) +{ +PCRE_SPTR16 pp = p; +while (*pp != 0) pp++; +return (int)(pp - p); +} +#endif /* SUPPORT_PCRE16 */ + + + +#ifdef SUPPORT_PCRE32 +/************************************************* +* Find length of 0-terminated 32-bit string * +*************************************************/ + +static int strlen32(PCRE_SPTR32 p) +{ +PCRE_SPTR32 pp = p; +while (*pp != 0) pp++; +return (int)(pp - p); +} +#endif /* SUPPORT_PCRE32 */ + + + +#ifdef SUPPORT_PCRE16 +/************************************************* +* Print 16-bit character string * +*************************************************/ + +/* Must handle UTF-16 strings in utf mode. Yields number of characters printed. +If handed a NULL file, just counts chars without printing. */ + +static int pchars16(PCRE_SPTR16 p, int length, FILE *f) +{ +int yield = 0; + +if (length < 0) + length = strlen16(p); + +while (length-- > 0) + { + pcre_uint32 c = *p++ & 0xffff; +#if !defined NOUTF + if (use_utf && c >= 0xD800 && c < 0xDC00 && length > 0) + { + int d = *p & 0xffff; + if (d >= 0xDC00 && d <= 0xDFFF) + { + c = ((c & 0x3ff) << 10) + (d & 0x3ff) + 0x10000; + length--; + p++; + } + } +#endif + yield += pchar(c, f); + } + +return yield; +} +#endif /* SUPPORT_PCRE16 */ + + + +#ifdef SUPPORT_PCRE32 +/************************************************* +* Print 32-bit character string * +*************************************************/ + +/* Must handle UTF-32 strings in utf mode. Yields number of characters printed. +If handed a NULL file, just counts chars without printing. */ + +static int pchars32(PCRE_SPTR32 p, int length, BOOL utf, FILE *f) +{ +int yield = 0; + +(void)(utf); /* Avoid compiler warning */ + +if (length < 0) + length = strlen32(p); + +while (length-- > 0) + { + pcre_uint32 c = *p++; + yield += pchar(c, f); + } + +return yield; +} +#endif /* SUPPORT_PCRE32 */ + + + +#ifdef SUPPORT_PCRE8 +/************************************************* +* Read a capture name (8-bit) and check it * +*************************************************/ + +static pcre_uint8 * +read_capture_name8(pcre_uint8 *p, pcre_uint8 **pp, pcre *re) +{ +pcre_uint8 *npp = *pp; +while (isalnum(*p)) *npp++ = *p++; +*npp++ = 0; +*npp = 0; +if (pcre_get_stringnumber(re, (char *)(*pp)) < 0) + { + fprintf(outfile, "no parentheses with name \""); + PCHARSV(*pp, 0, -1, outfile); + fprintf(outfile, "\"\n"); + } + +*pp = npp; +return p; +} +#endif /* SUPPORT_PCRE8 */ + + + +#ifdef SUPPORT_PCRE16 +/************************************************* +* Read a capture name (16-bit) and check it * +*************************************************/ + +/* Note that the text being read is 8-bit. */ + +static pcre_uint8 * +read_capture_name16(pcre_uint8 *p, pcre_uint16 **pp, pcre *re) +{ +pcre_uint16 *npp = *pp; +while (isalnum(*p)) *npp++ = *p++; +*npp++ = 0; +*npp = 0; +if (pcre16_get_stringnumber((pcre16 *)re, (PCRE_SPTR16)(*pp)) < 0) + { + fprintf(outfile, "no parentheses with name \""); + PCHARSV(*pp, 0, -1, outfile); + fprintf(outfile, "\"\n"); + } +*pp = npp; +return p; +} +#endif /* SUPPORT_PCRE16 */ + + + +#ifdef SUPPORT_PCRE32 +/************************************************* +* Read a capture name (32-bit) and check it * +*************************************************/ + +/* Note that the text being read is 8-bit. */ + +static pcre_uint8 * +read_capture_name32(pcre_uint8 *p, pcre_uint32 **pp, pcre *re) +{ +pcre_uint32 *npp = *pp; +while (isalnum(*p)) *npp++ = *p++; +*npp++ = 0; +*npp = 0; +if (pcre32_get_stringnumber((pcre32 *)re, (PCRE_SPTR32)(*pp)) < 0) + { + fprintf(outfile, "no parentheses with name \""); + PCHARSV(*pp, 0, -1, outfile); + fprintf(outfile, "\"\n"); + } +*pp = npp; +return p; +} +#endif /* SUPPORT_PCRE32 */ + + + +/************************************************* +* Stack guard function * +*************************************************/ + +/* Called from PCRE when set in pcre_stack_guard. We give an error (non-zero) +return when a count overflows. */ + +static int stack_guard(void) +{ +return stack_guard_return; +} + +/************************************************* +* Callout function * +*************************************************/ + +/* Called from PCRE as a result of the (?C) item. We print out where we are in +the match. Yield zero unless more callouts than the fail count, or the callout +data is not zero. */ + +static int callout(pcre_callout_block *cb) +{ +FILE *f = (first_callout | callout_extra)? outfile : NULL; +int i, current_position, pre_start, post_start, subject_length; + +if (callout_extra) + { + fprintf(f, "Callout %d: last capture = %d\n", + cb->callout_number, cb->capture_last); + + if (cb->offset_vector != NULL) + { + for (i = 0; i < cb->capture_top * 2; i += 2) + { + if (cb->offset_vector[i] < 0) + fprintf(f, "%2d: \n", i/2); + else + { + fprintf(f, "%2d: ", i/2); + PCHARSV(cb->subject, cb->offset_vector[i], + cb->offset_vector[i+1] - cb->offset_vector[i], f); + fprintf(f, "\n"); + } + } + } + } + +/* Re-print the subject in canonical form, the first time or if giving full +datails. On subsequent calls in the same match, we use pchars just to find the +printed lengths of the substrings. */ + +if (f != NULL) fprintf(f, "--->"); + +/* If a lookbehind is involved, the current position may be earlier than the +match start. If so, use the match start instead. */ + +current_position = (cb->current_position >= cb->start_match)? + cb->current_position : cb->start_match; + +PCHARS(pre_start, cb->subject, 0, cb->start_match, f); +PCHARS(post_start, cb->subject, cb->start_match, + current_position - cb->start_match, f); + +PCHARS(subject_length, cb->subject, 0, cb->subject_length, NULL); + +PCHARSV(cb->subject, current_position, cb->subject_length - current_position, f); + +if (f != NULL) fprintf(f, "\n"); + +/* Always print appropriate indicators, with callout number if not already +shown. For automatic callouts, show the pattern offset. */ + +if (cb->callout_number == 255) + { + fprintf(outfile, "%+3d ", cb->pattern_position); + if (cb->pattern_position > 99) fprintf(outfile, "\n "); + } +else + { + if (callout_extra) fprintf(outfile, " "); + else fprintf(outfile, "%3d ", cb->callout_number); + } + +for (i = 0; i < pre_start; i++) fprintf(outfile, " "); +fprintf(outfile, "^"); + +if (post_start > 0) + { + for (i = 0; i < post_start - 1; i++) fprintf(outfile, " "); + fprintf(outfile, "^"); + } + +for (i = 0; i < subject_length - pre_start - post_start + 4; i++) + fprintf(outfile, " "); + +fprintf(outfile, "%.*s", (cb->next_item_length == 0)? 1 : cb->next_item_length, + pbuffer + cb->pattern_position); + +fprintf(outfile, "\n"); +first_callout = 0; + +if (cb->mark != last_callout_mark) + { + if (cb->mark == NULL) + fprintf(outfile, "Latest Mark: \n"); + else + { + fprintf(outfile, "Latest Mark: "); + PCHARSV(cb->mark, 0, -1, outfile); + putc('\n', outfile); + } + last_callout_mark = cb->mark; + } + +if (cb->callout_data != NULL) + { + int callout_data = *((int *)(cb->callout_data)); + if (callout_data != 0) + { + fprintf(outfile, "Callout data = %d\n", callout_data); + return callout_data; + } + } + +return (cb->callout_number != callout_fail_id)? 0 : + (++callout_count >= callout_fail_count)? 1 : 0; +} + + +/************************************************* +* Local malloc functions * +*************************************************/ + +/* Alternative malloc function, to test functionality and save the size of a +compiled re, which is the first store request that pcre_compile() makes. The +show_malloc variable is set only during matching. */ + +static void *new_malloc(size_t size) +{ +void *block = malloc(size); +if (show_malloc) + fprintf(outfile, "malloc %3d %p\n", (int)size, block); +return block; +} + +static void new_free(void *block) +{ +if (show_malloc) + fprintf(outfile, "free %p\n", block); +free(block); +} + +/* For recursion malloc/free, to test stacking calls */ + +static void *stack_malloc(size_t size) +{ +void *block = malloc(size); +if (show_malloc) + fprintf(outfile, "stack_malloc %3d %p\n", (int)size, block); +return block; +} + +static void stack_free(void *block) +{ +if (show_malloc) + fprintf(outfile, "stack_free %p\n", block); +free(block); +} + + +/************************************************* +* Call pcre_fullinfo() * +*************************************************/ + +/* Get one piece of information from the pcre_fullinfo() function. When only +one of 8-, 16- or 32-bit is supported, pcre_mode should always have the correct +value, but the code is defensive. + +Arguments: + re compiled regex + study study data + option PCRE_INFO_xxx option + ptr where to put the data + +Returns: 0 when OK, < 0 on error +*/ + +static int +new_info(pcre *re, pcre_extra *study, int option, void *ptr) +{ +int rc; + +if (pcre_mode == PCRE32_MODE) +#ifdef SUPPORT_PCRE32 + rc = pcre32_fullinfo((pcre32 *)re, (pcre32_extra *)study, option, ptr); +#else + rc = PCRE_ERROR_BADMODE; +#endif +else if (pcre_mode == PCRE16_MODE) +#ifdef SUPPORT_PCRE16 + rc = pcre16_fullinfo((pcre16 *)re, (pcre16_extra *)study, option, ptr); +#else + rc = PCRE_ERROR_BADMODE; +#endif +else +#ifdef SUPPORT_PCRE8 + rc = pcre_fullinfo(re, study, option, ptr); +#else + rc = PCRE_ERROR_BADMODE; +#endif + +if (rc < 0 && rc != PCRE_ERROR_UNSET) + { + fprintf(outfile, "Error %d from pcre%s_fullinfo(%d)\n", rc, + pcre_mode == PCRE32_MODE ? "32" : pcre_mode == PCRE16_MODE ? "16" : "", option); + if (rc == PCRE_ERROR_BADMODE) + fprintf(outfile, "Running in %d-bit mode but pattern was compiled in " + "%d-bit mode\n", 8 * CHAR_SIZE, + 8 * (REAL_PCRE_FLAGS(re) & PCRE_MODE_MASK)); + } + +return rc; +} + + + +/************************************************* +* Swap byte functions * +*************************************************/ + +/* The following functions swap the bytes of a pcre_uint16 and pcre_uint32 +value, respectively. + +Arguments: + value any number + +Returns: the byte swapped value +*/ + +static pcre_uint32 +swap_uint32(pcre_uint32 value) +{ +return ((value & 0x000000ff) << 24) | + ((value & 0x0000ff00) << 8) | + ((value & 0x00ff0000) >> 8) | + (value >> 24); +} + +static pcre_uint16 +swap_uint16(pcre_uint16 value) +{ +return (value >> 8) | (value << 8); +} + + + +/************************************************* +* Flip bytes in a compiled pattern * +*************************************************/ + +/* This function is called if the 'F' option was present on a pattern that is +to be written to a file. We flip the bytes of all the integer fields in the +regex data block and the study block. In 16-bit mode this also flips relevant +bytes in the pattern itself. This is to make it possible to test PCRE's +ability to reload byte-flipped patterns, e.g. those compiled on a different +architecture. */ + +#if defined SUPPORT_PCRE8 || defined SUPPORT_PCRE16 +static void +regexflip8_or_16(pcre *ere, pcre_extra *extra) +{ +real_pcre8_or_16 *re = (real_pcre8_or_16 *)ere; +#ifdef SUPPORT_PCRE16 +int op; +pcre_uint16 *ptr = (pcre_uint16 *)re + re->name_table_offset; +int length = re->name_count * re->name_entry_size; +#ifdef SUPPORT_UTF +BOOL utf = (re->options & PCRE_UTF16) != 0; +BOOL utf16_char = FALSE; +#endif /* SUPPORT_UTF */ +#endif /* SUPPORT_PCRE16 */ + +/* Always flip the bytes in the main data block and study blocks. */ + +re->magic_number = REVERSED_MAGIC_NUMBER; +re->size = swap_uint32(re->size); +re->options = swap_uint32(re->options); +re->flags = swap_uint32(re->flags); +re->limit_match = swap_uint32(re->limit_match); +re->limit_recursion = swap_uint32(re->limit_recursion); +re->first_char = swap_uint16(re->first_char); +re->req_char = swap_uint16(re->req_char); +re->max_lookbehind = swap_uint16(re->max_lookbehind); +re->top_bracket = swap_uint16(re->top_bracket); +re->top_backref = swap_uint16(re->top_backref); +re->name_table_offset = swap_uint16(re->name_table_offset); +re->name_entry_size = swap_uint16(re->name_entry_size); +re->name_count = swap_uint16(re->name_count); +re->ref_count = swap_uint16(re->ref_count); + +if (extra != NULL && (extra->flags & PCRE_EXTRA_STUDY_DATA) != 0) + { + pcre_study_data *rsd = (pcre_study_data *)(extra->study_data); + rsd->size = swap_uint32(rsd->size); + rsd->flags = swap_uint32(rsd->flags); + rsd->minlength = swap_uint32(rsd->minlength); + } + +/* In 8-bit mode, that is all we need to do. In 16-bit mode we must swap bytes +in the name table, if present, and then in the pattern itself. */ + +#ifdef SUPPORT_PCRE16 +if (pcre_mode != PCRE16_MODE) return; + +while(TRUE) + { + /* Swap previous characters. */ + while (length-- > 0) + { + *ptr = swap_uint16(*ptr); + ptr++; + } +#ifdef SUPPORT_UTF + if (utf16_char) + { + if ((ptr[-1] & 0xfc00) == 0xd800) + { + /* We know that there is only one extra character in UTF-16. */ + *ptr = swap_uint16(*ptr); + ptr++; + } + } + utf16_char = FALSE; +#endif /* SUPPORT_UTF */ + + /* Get next opcode. */ + + length = 0; + op = *ptr; + *ptr++ = swap_uint16(op); + + switch (op) + { + case OP_END: + return; + +#ifdef SUPPORT_UTF + case OP_CHAR: + case OP_CHARI: + case OP_NOT: + case OP_NOTI: + case OP_STAR: + case OP_MINSTAR: + case OP_PLUS: + case OP_MINPLUS: + case OP_QUERY: + case OP_MINQUERY: + case OP_UPTO: + case OP_MINUPTO: + case OP_EXACT: + case OP_POSSTAR: + case OP_POSPLUS: + case OP_POSQUERY: + case OP_POSUPTO: + case OP_STARI: + case OP_MINSTARI: + case OP_PLUSI: + case OP_MINPLUSI: + case OP_QUERYI: + case OP_MINQUERYI: + case OP_UPTOI: + case OP_MINUPTOI: + case OP_EXACTI: + case OP_POSSTARI: + case OP_POSPLUSI: + case OP_POSQUERYI: + case OP_POSUPTOI: + case OP_NOTSTAR: + case OP_NOTMINSTAR: + case OP_NOTPLUS: + case OP_NOTMINPLUS: + case OP_NOTQUERY: + case OP_NOTMINQUERY: + case OP_NOTUPTO: + case OP_NOTMINUPTO: + case OP_NOTEXACT: + case OP_NOTPOSSTAR: + case OP_NOTPOSPLUS: + case OP_NOTPOSQUERY: + case OP_NOTPOSUPTO: + case OP_NOTSTARI: + case OP_NOTMINSTARI: + case OP_NOTPLUSI: + case OP_NOTMINPLUSI: + case OP_NOTQUERYI: + case OP_NOTMINQUERYI: + case OP_NOTUPTOI: + case OP_NOTMINUPTOI: + case OP_NOTEXACTI: + case OP_NOTPOSSTARI: + case OP_NOTPOSPLUSI: + case OP_NOTPOSQUERYI: + case OP_NOTPOSUPTOI: + if (utf) utf16_char = TRUE; +#endif + /* Fall through. */ + + default: + length = OP_lengths16[op] - 1; + break; + + case OP_CLASS: + case OP_NCLASS: + /* Skip the character bit map. */ + ptr += 32/sizeof(pcre_uint16); + length = 0; + break; + + case OP_XCLASS: + /* LINK_SIZE can be 1 or 2 in 16 bit mode. */ + if (LINK_SIZE > 1) + length = (int)((((unsigned int)(ptr[0]) << 16) | (unsigned int)(ptr[1])) + - (1 + LINK_SIZE + 1)); + else + length = (int)((unsigned int)(ptr[0]) - (1 + LINK_SIZE + 1)); + + /* Reverse the size of the XCLASS instance. */ + *ptr = swap_uint16(*ptr); + ptr++; + if (LINK_SIZE > 1) + { + *ptr = swap_uint16(*ptr); + ptr++; + } + + op = *ptr; + *ptr = swap_uint16(op); + ptr++; + if ((op & XCL_MAP) != 0) + { + /* Skip the character bit map. */ + ptr += 32/sizeof(pcre_uint16); + length -= 32/sizeof(pcre_uint16); + } + break; + } + } +/* Control should never reach here in 16 bit mode. */ +#endif /* SUPPORT_PCRE16 */ +} +#endif /* SUPPORT_PCRE[8|16] */ + + + +#if defined SUPPORT_PCRE32 +static void +regexflip_32(pcre *ere, pcre_extra *extra) +{ +real_pcre32 *re = (real_pcre32 *)ere; +int op; +pcre_uint32 *ptr = (pcre_uint32 *)re + re->name_table_offset; +int length = re->name_count * re->name_entry_size; + +/* Always flip the bytes in the main data block and study blocks. */ + +re->magic_number = REVERSED_MAGIC_NUMBER; +re->size = swap_uint32(re->size); +re->options = swap_uint32(re->options); +re->flags = swap_uint32(re->flags); +re->limit_match = swap_uint32(re->limit_match); +re->limit_recursion = swap_uint32(re->limit_recursion); +re->first_char = swap_uint32(re->first_char); +re->req_char = swap_uint32(re->req_char); +re->max_lookbehind = swap_uint16(re->max_lookbehind); +re->top_bracket = swap_uint16(re->top_bracket); +re->top_backref = swap_uint16(re->top_backref); +re->name_table_offset = swap_uint16(re->name_table_offset); +re->name_entry_size = swap_uint16(re->name_entry_size); +re->name_count = swap_uint16(re->name_count); +re->ref_count = swap_uint16(re->ref_count); + +if (extra != NULL && (extra->flags & PCRE_EXTRA_STUDY_DATA) != 0) + { + pcre_study_data *rsd = (pcre_study_data *)(extra->study_data); + rsd->size = swap_uint32(rsd->size); + rsd->flags = swap_uint32(rsd->flags); + rsd->minlength = swap_uint32(rsd->minlength); + } + +/* In 32-bit mode we must swap bytes in the name table, if present, and then in +the pattern itself. */ + +while(TRUE) + { + /* Swap previous characters. */ + while (length-- > 0) + { + *ptr = swap_uint32(*ptr); + ptr++; + } + + /* Get next opcode. */ + + length = 0; + op = *ptr; + *ptr++ = swap_uint32(op); + + switch (op) + { + case OP_END: + return; + + default: + length = OP_lengths32[op] - 1; + break; + + case OP_CLASS: + case OP_NCLASS: + /* Skip the character bit map. */ + ptr += 32/sizeof(pcre_uint32); + length = 0; + break; + + case OP_XCLASS: + /* LINK_SIZE can only be 1 in 32-bit mode. */ + length = (int)((unsigned int)(ptr[0]) - (1 + LINK_SIZE + 1)); + + /* Reverse the size of the XCLASS instance. */ + *ptr = swap_uint32(*ptr); + ptr++; + + op = *ptr; + *ptr = swap_uint32(op); + ptr++; + if ((op & XCL_MAP) != 0) + { + /* Skip the character bit map. */ + ptr += 32/sizeof(pcre_uint32); + length -= 32/sizeof(pcre_uint32); + } + break; + } + } +/* Control should never reach here in 32 bit mode. */ +} + +#endif /* SUPPORT_PCRE32 */ + + + +static void +regexflip(pcre *ere, pcre_extra *extra) +{ +#if defined SUPPORT_PCRE32 + if (REAL_PCRE_FLAGS(ere) & PCRE_MODE32) + regexflip_32(ere, extra); +#endif +#if defined SUPPORT_PCRE8 || defined SUPPORT_PCRE16 + if (REAL_PCRE_FLAGS(ere) & (PCRE_MODE8 | PCRE_MODE16)) + regexflip8_or_16(ere, extra); +#endif +} + + + +/************************************************* +* Check match or recursion limit * +*************************************************/ + +static int +check_match_limit(pcre *re, pcre_extra *extra, pcre_uint8 *bptr, int len, + int start_offset, int options, int *use_offsets, int use_size_offsets, + int flag, unsigned long int *limit, int errnumber, const char *msg) +{ +int count; +int min = 0; +int mid = 64; +int max = -1; + +extra->flags |= flag; + +for (;;) + { + *limit = mid; + + PCRE_EXEC(count, re, extra, bptr, len, start_offset, options, + use_offsets, use_size_offsets); + + if (count == errnumber) + { + /* fprintf(outfile, "Testing %s limit = %d\n", msg, mid); */ + min = mid; + mid = (mid == max - 1)? max : (max > 0)? (min + max)/2 : mid*2; + } + + else if (count >= 0 || count == PCRE_ERROR_NOMATCH || + count == PCRE_ERROR_PARTIAL) + { + if (mid == min + 1) + { + fprintf(outfile, "Minimum %s limit = %d\n", msg, mid); + break; + } + /* fprintf(outfile, "Testing %s limit = %d\n", msg, mid); */ + max = mid; + mid = (min + mid)/2; + } + else break; /* Some other error */ + } + +extra->flags &= ~flag; +return count; +} + + + +/************************************************* +* Case-independent strncmp() function * +*************************************************/ + +/* +Arguments: + s first string + t second string + n number of characters to compare + +Returns: < 0, = 0, or > 0, according to the comparison +*/ + +static int +strncmpic(pcre_uint8 *s, pcre_uint8 *t, int n) +{ +while (n--) + { + int c = tolower(*s++) - tolower(*t++); + if (c) return c; + } +return 0; +} + + + +/************************************************* +* Check multicharacter option * +*************************************************/ + +/* This is used both at compile and run-time to check for escapes. Print +a message and return 0 if there is no match. + +Arguments: + p points after the leading '<' + f file for error message + nl TRUE to check only for newline settings + stype "modifier" or "escape sequence" + +Returns: appropriate PCRE_NEWLINE_xxx flags, or 0 +*/ + +static int +check_mc_option(pcre_uint8 *p, FILE *f, BOOL nl, const char *stype) +{ +if (strncmpic(p, (pcre_uint8 *)"cr>", 3) == 0) return PCRE_NEWLINE_CR; +if (strncmpic(p, (pcre_uint8 *)"lf>", 3) == 0) return PCRE_NEWLINE_LF; +if (strncmpic(p, (pcre_uint8 *)"crlf>", 5) == 0) return PCRE_NEWLINE_CRLF; +if (strncmpic(p, (pcre_uint8 *)"anycrlf>", 8) == 0) return PCRE_NEWLINE_ANYCRLF; +if (strncmpic(p, (pcre_uint8 *)"any>", 4) == 0) return PCRE_NEWLINE_ANY; +if (strncmpic(p, (pcre_uint8 *)"bsr_anycrlf>", 12) == 0) return PCRE_BSR_ANYCRLF; +if (strncmpic(p, (pcre_uint8 *)"bsr_unicode>", 12) == 0) return PCRE_BSR_UNICODE; + +if (!nl) + { + if (strncmpic(p, (pcre_uint8 *)"JS>", 3) == 0) return PCRE_JAVASCRIPT_COMPAT; + } + +fprintf(f, "Unknown %s at: <%s\n", stype, p); +return 0; +} + + + +/************************************************* +* Usage function * +*************************************************/ + +static void +usage(void) +{ +printf("Usage: pcretest [options] [ []]\n\n"); +printf("Input and output default to stdin and stdout.\n"); +#if defined(SUPPORT_LIBREADLINE) || defined(SUPPORT_LIBEDIT) +printf("If input is a terminal, readline() is used to read from it.\n"); +#else +printf("This version of pcretest is not linked with readline().\n"); +#endif +printf("\nOptions:\n"); +#ifdef SUPPORT_PCRE16 +printf(" -16 use the 16-bit library\n"); +#endif +#ifdef SUPPORT_PCRE32 +printf(" -32 use the 32-bit library\n"); +#endif +printf(" -b show compiled code\n"); +printf(" -C show PCRE compile-time options and exit\n"); +printf(" -C arg show a specific compile-time option and exit\n"); +printf(" with its value if numeric (else 0). The arg can be:\n"); +printf(" linksize internal link size [2, 3, 4]\n"); +printf(" pcre8 8 bit library support enabled [0, 1]\n"); +printf(" pcre16 16 bit library support enabled [0, 1]\n"); +printf(" pcre32 32 bit library support enabled [0, 1]\n"); +printf(" utf Unicode Transformation Format supported [0, 1]\n"); +printf(" ucp Unicode Properties supported [0, 1]\n"); +printf(" jit Just-in-time compiler supported [0, 1]\n"); +printf(" newline Newline type [CR, LF, CRLF, ANYCRLF, ANY]\n"); +printf(" bsr \\R type [ANYCRLF, ANY]\n"); +printf(" -d debug: show compiled code and information (-b and -i)\n"); +#if !defined NODFA +printf(" -dfa force DFA matching for all subjects\n"); +#endif +printf(" -help show usage information\n"); +printf(" -i show information about compiled patterns\n" + " -M find MATCH_LIMIT minimum for each subject\n" + " -m output memory used information\n" + " -O set PCRE_NO_AUTO_POSSESS on each pattern\n" + " -o set size of offsets vector to \n"); +#if !defined NOPOSIX +printf(" -p use POSIX interface\n"); +#endif +printf(" -q quiet: do not output PCRE version number at start\n"); +printf(" -S set stack size to megabytes\n"); +printf(" -s force each pattern to be studied at basic level\n" + " -s+ force each pattern to be studied, using JIT if available\n" + " -s++ ditto, verifying when JIT was actually used\n" + " -s+n force each pattern to be studied, using JIT if available,\n" + " where 1 <= n <= 7 selects JIT options\n" + " -s++n ditto, verifying when JIT was actually used\n" + " -t time compilation and execution\n"); +printf(" -t time compilation and execution, repeating times\n"); +printf(" -tm time execution (matching) only\n"); +printf(" -tm time execution (matching) only, repeating times\n"); +printf(" -T same as -t, but show total times at the end\n"); +printf(" -TM same as -tm, but show total time at the end\n"); +} + + + +/************************************************* +* Main Program * +*************************************************/ + +/* Read lines from named file or stdin and write to named file or stdout; lines +consist of a regular expression, in delimiters and optionally followed by +options, followed by a set of test data, terminated by an empty line. */ + +int main(int argc, char **argv) +{ +FILE *infile = stdin; +const char *version; +int options = 0; +int study_options = 0; +int default_find_match_limit = FALSE; +pcre_uint32 default_options = 0; +int op = 1; +int timeit = 0; +int timeitm = 0; +int showtotaltimes = 0; +int showinfo = 0; +int showstore = 0; +int force_study = -1; +int force_study_options = 0; +int quiet = 0; +int size_offsets = 45; +int size_offsets_max; +int *offsets = NULL; +int debug = 0; +int done = 0; +int all_use_dfa = 0; +int verify_jit = 0; +int yield = 0; +int stack_size; +pcre_uint8 *dbuffer = NULL; +pcre_uint8 lockout[24] = { 0 }; +size_t dbuffer_size = 1u << 14; +clock_t total_compile_time = 0; +clock_t total_study_time = 0; +clock_t total_match_time = 0; + +#if !defined NOPOSIX +int posix = 0; +#endif +#if !defined NODFA +int *dfa_workspace = NULL; +#endif + +pcre_jit_stack *jit_stack = NULL; + +/* These vectors store, end-to-end, a list of zero-terminated captured +substring names, each list itself being terminated by an empty name. Assume +that 1024 is plenty long enough for the few names we'll be testing. It is +easiest to keep separate 8-, 16- and 32-bit versions, using the 32-bit version +for the actual memory, to ensure alignment. */ + +pcre_uint32 copynames[1024]; +pcre_uint32 getnames[1024]; + +#ifdef SUPPORT_PCRE32 +pcre_uint32 *cn32ptr; +pcre_uint32 *gn32ptr; +#endif + +#ifdef SUPPORT_PCRE16 +pcre_uint16 *copynames16 = (pcre_uint16 *)copynames; +pcre_uint16 *getnames16 = (pcre_uint16 *)getnames; +pcre_uint16 *cn16ptr; +pcre_uint16 *gn16ptr; +#endif + +#ifdef SUPPORT_PCRE8 +pcre_uint8 *copynames8 = (pcre_uint8 *)copynames; +pcre_uint8 *getnames8 = (pcre_uint8 *)getnames; +pcre_uint8 *cn8ptr; +pcre_uint8 *gn8ptr; +#endif + +/* Get buffers from malloc() so that valgrind will check their misuse when +debugging. They grow automatically when very long lines are read. The 16- +and 32-bit buffers (buffer16, buffer32) are obtained only if needed. */ + +buffer = (pcre_uint8 *)malloc(buffer_size); +pbuffer = (pcre_uint8 *)malloc(buffer_size); + +/* The outfile variable is static so that new_malloc can use it. */ + +outfile = stdout; + +/* The following _setmode() stuff is some Windows magic that tells its runtime +library to translate CRLF into a single LF character. At least, that's what +I've been told: never having used Windows I take this all on trust. Originally +it set 0x8000, but then I was advised that _O_BINARY was better. */ + +#if defined(_WIN32) || defined(WIN32) +_setmode( _fileno( stdout ), _O_BINARY ); +#endif + +/* Get the version number: both pcre_version() and pcre16_version() give the +same answer. We just need to ensure that we call one that is available. */ + +#if defined SUPPORT_PCRE8 +version = pcre_version(); +#elif defined SUPPORT_PCRE16 +version = pcre16_version(); +#elif defined SUPPORT_PCRE32 +version = pcre32_version(); +#endif + +/* Scan options */ + +while (argc > 1 && argv[op][0] == '-') + { + pcre_uint8 *endptr; + char *arg = argv[op]; + + if (strcmp(arg, "-m") == 0) showstore = 1; + else if (strcmp(arg, "-s") == 0) force_study = 0; + + else if (strncmp(arg, "-s+", 3) == 0) + { + arg += 3; + if (*arg == '+') { arg++; verify_jit = TRUE; } + force_study = 1; + if (*arg == 0) + force_study_options = jit_study_bits[6]; + else if (*arg >= '1' && *arg <= '7') + force_study_options = jit_study_bits[*arg - '1']; + else goto BAD_ARG; + } + else if (strcmp(arg, "-8") == 0) + { +#ifdef SUPPORT_PCRE8 + pcre_mode = PCRE8_MODE; +#else + printf("** This version of PCRE was built without 8-bit support\n"); + exit(1); +#endif + } + else if (strcmp(arg, "-16") == 0) + { +#ifdef SUPPORT_PCRE16 + pcre_mode = PCRE16_MODE; +#else + printf("** This version of PCRE was built without 16-bit support\n"); + exit(1); +#endif + } + else if (strcmp(arg, "-32") == 0) + { +#ifdef SUPPORT_PCRE32 + pcre_mode = PCRE32_MODE; +#else + printf("** This version of PCRE was built without 32-bit support\n"); + exit(1); +#endif + } + else if (strcmp(arg, "-q") == 0) quiet = 1; + else if (strcmp(arg, "-b") == 0) debug = 1; + else if (strcmp(arg, "-i") == 0) showinfo = 1; + else if (strcmp(arg, "-d") == 0) showinfo = debug = 1; + else if (strcmp(arg, "-M") == 0) default_find_match_limit = TRUE; + else if (strcmp(arg, "-O") == 0) default_options |= PCRE_NO_AUTO_POSSESS; +#if !defined NODFA + else if (strcmp(arg, "-dfa") == 0) all_use_dfa = 1; +#endif + else if (strcmp(arg, "-o") == 0 && argc > 2 && + ((size_offsets = get_value((pcre_uint8 *)argv[op+1], &endptr)), + *endptr == 0)) + { + op++; + argc--; + } + else if (strcmp(arg, "-t") == 0 || strcmp(arg, "-tm") == 0 || + strcmp(arg, "-T") == 0 || strcmp(arg, "-TM") == 0) + { + int temp; + int both = arg[2] == 0; + showtotaltimes = arg[1] == 'T'; + if (argc > 2 && (temp = get_value((pcre_uint8 *)argv[op+1], &endptr), + *endptr == 0)) + { + timeitm = temp; + op++; + argc--; + } + else timeitm = LOOPREPEAT; + if (both) timeit = timeitm; + } + else if (strcmp(arg, "-S") == 0 && argc > 2 && + ((stack_size = get_value((pcre_uint8 *)argv[op+1], &endptr)), + *endptr == 0)) + { +#if defined(_WIN32) || defined(WIN32) || defined(__minix) || defined(NATIVE_ZOS) || defined(__VMS) + printf("PCRE: -S not supported on this OS\n"); + exit(1); +#else + int rc; + struct rlimit rlim; + getrlimit(RLIMIT_STACK, &rlim); + rlim.rlim_cur = stack_size * 1024 * 1024; + rc = setrlimit(RLIMIT_STACK, &rlim); + if (rc != 0) + { + printf("PCRE: setrlimit() failed with error %d\n", rc); + exit(1); + } + op++; + argc--; +#endif + } +#if !defined NOPOSIX + else if (strcmp(arg, "-p") == 0) posix = 1; +#endif + else if (strcmp(arg, "-C") == 0) + { + int rc; + unsigned long int lrc; + + if (argc > 2) + { + if (strcmp(argv[op + 1], "linksize") == 0) + { + (void)PCRE_CONFIG(PCRE_CONFIG_LINK_SIZE, &rc); + printf("%d\n", rc); + yield = rc; + +#ifdef __VMS + vms_setsymbol("LINKSIZE",0,yield ); +#endif + } + else if (strcmp(argv[op + 1], "pcre8") == 0) + { +#ifdef SUPPORT_PCRE8 + printf("1\n"); + yield = 1; +#else + printf("0\n"); + yield = 0; +#endif +#ifdef __VMS + vms_setsymbol("PCRE8",0,yield ); +#endif + } + else if (strcmp(argv[op + 1], "pcre16") == 0) + { +#ifdef SUPPORT_PCRE16 + printf("1\n"); + yield = 1; +#else + printf("0\n"); + yield = 0; +#endif +#ifdef __VMS + vms_setsymbol("PCRE16",0,yield ); +#endif + } + else if (strcmp(argv[op + 1], "pcre32") == 0) + { +#ifdef SUPPORT_PCRE32 + printf("1\n"); + yield = 1; +#else + printf("0\n"); + yield = 0; +#endif +#ifdef __VMS + vms_setsymbol("PCRE32",0,yield ); +#endif + } + else if (strcmp(argv[op + 1], "utf") == 0) + { +#ifdef SUPPORT_PCRE8 + if (pcre_mode == PCRE8_MODE) + (void)pcre_config(PCRE_CONFIG_UTF8, &rc); +#endif +#ifdef SUPPORT_PCRE16 + if (pcre_mode == PCRE16_MODE) + (void)pcre16_config(PCRE_CONFIG_UTF16, &rc); +#endif +#ifdef SUPPORT_PCRE32 + if (pcre_mode == PCRE32_MODE) + (void)pcre32_config(PCRE_CONFIG_UTF32, &rc); +#endif + printf("%d\n", rc); + yield = rc; +#ifdef __VMS + vms_setsymbol("UTF",0,yield ); +#endif + } + else if (strcmp(argv[op + 1], "ucp") == 0) + { + (void)PCRE_CONFIG(PCRE_CONFIG_UNICODE_PROPERTIES, &rc); + printf("%d\n", rc); + yield = rc; + } + else if (strcmp(argv[op + 1], "jit") == 0) + { + (void)PCRE_CONFIG(PCRE_CONFIG_JIT, &rc); + printf("%d\n", rc); + yield = rc; + } + else if (strcmp(argv[op + 1], "newline") == 0) + { + (void)PCRE_CONFIG(PCRE_CONFIG_NEWLINE, &rc); + print_newline_config(rc, TRUE); + } + else if (strcmp(argv[op + 1], "bsr") == 0) + { + (void)PCRE_CONFIG(PCRE_CONFIG_BSR, &rc); + printf("%s\n", rc? "ANYCRLF" : "ANY"); + } + else if (strcmp(argv[op + 1], "ebcdic") == 0) + { +#ifdef EBCDIC + printf("1\n"); + yield = 1; +#else + printf("0\n"); +#endif + } + else if (strcmp(argv[op + 1], "ebcdic-nl") == 0) + { +#ifdef EBCDIC + printf("0x%02x\n", CHAR_LF); +#else + printf("0\n"); +#endif + } + else + { + printf("Unknown -C option: %s\n", argv[op + 1]); + } + goto EXIT; + } + + /* No argument for -C: output all configuration information. */ + + printf("PCRE version %s\n", version); + printf("Compiled with\n"); + +#ifdef EBCDIC + printf(" EBCDIC code support: LF is 0x%02x\n", CHAR_LF); +#endif + +/* At least one of SUPPORT_PCRE8 and SUPPORT_PCRE16 will be set. If both +are set, either both UTFs are supported or both are not supported. */ + +#ifdef SUPPORT_PCRE8 + printf(" 8-bit support\n"); + (void)pcre_config(PCRE_CONFIG_UTF8, &rc); + printf (" %sUTF-8 support\n", rc ? "" : "No "); +#endif +#ifdef SUPPORT_PCRE16 + printf(" 16-bit support\n"); + (void)pcre16_config(PCRE_CONFIG_UTF16, &rc); + printf (" %sUTF-16 support\n", rc ? "" : "No "); +#endif +#ifdef SUPPORT_PCRE32 + printf(" 32-bit support\n"); + (void)pcre32_config(PCRE_CONFIG_UTF32, &rc); + printf (" %sUTF-32 support\n", rc ? "" : "No "); +#endif + + (void)PCRE_CONFIG(PCRE_CONFIG_UNICODE_PROPERTIES, &rc); + printf(" %sUnicode properties support\n", rc? "" : "No "); + (void)PCRE_CONFIG(PCRE_CONFIG_JIT, &rc); + if (rc) + { + const char *arch; + (void)PCRE_CONFIG(PCRE_CONFIG_JITTARGET, (void *)(&arch)); + printf(" Just-in-time compiler support: %s\n", arch); + } + else + printf(" No just-in-time compiler support\n"); + (void)PCRE_CONFIG(PCRE_CONFIG_NEWLINE, &rc); + print_newline_config(rc, FALSE); + (void)PCRE_CONFIG(PCRE_CONFIG_BSR, &rc); + printf(" \\R matches %s\n", rc? "CR, LF, or CRLF only" : + "all Unicode newlines"); + (void)PCRE_CONFIG(PCRE_CONFIG_LINK_SIZE, &rc); + printf(" Internal link size = %d\n", rc); + (void)PCRE_CONFIG(PCRE_CONFIG_POSIX_MALLOC_THRESHOLD, &rc); + printf(" POSIX malloc threshold = %d\n", rc); + (void)PCRE_CONFIG(PCRE_CONFIG_PARENS_LIMIT, &lrc); + printf(" Parentheses nest limit = %ld\n", lrc); + (void)PCRE_CONFIG(PCRE_CONFIG_MATCH_LIMIT, &lrc); + printf(" Default match limit = %ld\n", lrc); + (void)PCRE_CONFIG(PCRE_CONFIG_MATCH_LIMIT_RECURSION, &lrc); + printf(" Default recursion depth limit = %ld\n", lrc); + (void)PCRE_CONFIG(PCRE_CONFIG_STACKRECURSE, &rc); + printf(" Match recursion uses %s", rc? "stack" : "heap"); + if (showstore) + { + PCRE_EXEC(stack_size, NULL, NULL, NULL, -999, -999, 0, NULL, 0); + printf(": %sframe size = %d bytes", rc? "approximate " : "", -stack_size); + } + printf("\n"); + goto EXIT; + } + else if (strcmp(arg, "-help") == 0 || + strcmp(arg, "--help") == 0) + { + usage(); + goto EXIT; + } + else + { + BAD_ARG: + printf("** Unknown or malformed option %s\n", arg); + usage(); + yield = 1; + goto EXIT; + } + op++; + argc--; + } + +/* Get the store for the offsets vector, and remember what it was */ + +size_offsets_max = size_offsets; +offsets = (int *)malloc(size_offsets_max * sizeof(int)); +if (offsets == NULL) + { + printf("** Failed to get %d bytes of memory for offsets vector\n", + (int)(size_offsets_max * sizeof(int))); + yield = 1; + goto EXIT; + } + +/* Sort out the input and output files */ + +if (argc > 1) + { + infile = fopen(argv[op], INPUT_MODE); + if (infile == NULL) + { + printf("** Failed to open %s\n", argv[op]); + yield = 1; + goto EXIT; + } + } + +if (argc > 2) + { + outfile = fopen(argv[op+1], OUTPUT_MODE); + if (outfile == NULL) + { + printf("** Failed to open %s\n", argv[op+1]); + yield = 1; + goto EXIT; + } + } + +/* Set alternative malloc function */ + +#ifdef SUPPORT_PCRE8 +pcre_malloc = new_malloc; +pcre_free = new_free; +pcre_stack_malloc = stack_malloc; +pcre_stack_free = stack_free; +#endif + +#ifdef SUPPORT_PCRE16 +pcre16_malloc = new_malloc; +pcre16_free = new_free; +pcre16_stack_malloc = stack_malloc; +pcre16_stack_free = stack_free; +#endif + +#ifdef SUPPORT_PCRE32 +pcre32_malloc = new_malloc; +pcre32_free = new_free; +pcre32_stack_malloc = stack_malloc; +pcre32_stack_free = stack_free; +#endif + +/* Heading line unless quiet */ + +if (!quiet) fprintf(outfile, "PCRE version %s\n\n", version); + +/* Main loop */ + +while (!done) + { + pcre *re = NULL; + pcre_extra *extra = NULL; + +#if !defined NOPOSIX /* There are still compilers that require no indent */ + regex_t preg = { NULL, 0, 0} ; + int do_posix = 0; +#endif + + const char *error; + pcre_uint8 *markptr; + pcre_uint8 *p, *pp, *ppp; + pcre_uint8 *to_file = NULL; + const pcre_uint8 *tables = NULL; + unsigned long int get_options; + unsigned long int true_size, true_study_size = 0; + size_t size; + int do_allcaps = 0; + int do_mark = 0; + int do_study = 0; + int no_force_study = 0; + int do_debug = debug; + int do_G = 0; + int do_g = 0; + int do_showinfo = showinfo; + int do_showrest = 0; + int do_showcaprest = 0; + int do_flip = 0; + int erroroffset, len, delimiter, poffset; + +#if !defined NODFA + int dfa_matched = 0; +#endif + + use_utf = 0; + debug_lengths = 1; + SET_PCRE_STACK_GUARD(NULL); + + if (extend_inputline(infile, buffer, " re> ") == NULL) break; + if (infile != stdin) fprintf(outfile, "%s", (char *)buffer); + fflush(outfile); + + p = buffer; + while (isspace(*p)) p++; + if (*p == 0) continue; + + /* Handle option lock-out setting */ + + if (*p == '<' && p[1] == ' ') + { + p += 2; + while (isspace(*p)) p++; + if (strncmp((char *)p, "forbid ", 7) == 0) + { + p += 7; + while (isspace(*p)) p++; + pp = lockout; + while (!isspace(*p) && pp < lockout + sizeof(lockout) - 1) + *pp++ = *p++; + *pp = 0; + } + else + { + printf("** Unrecognized special command '%s'\n", p); + yield = 1; + goto EXIT; + } + continue; + } + + /* See if the pattern is to be loaded pre-compiled from a file. */ + + if (*p == '<' && strchr((char *)(p+1), '<') == NULL) + { + pcre_uint32 magic; + pcre_uint8 sbuf[8]; + FILE *f; + + p++; + if (*p == '!') + { + do_debug = TRUE; + do_showinfo = TRUE; + p++; + } + + pp = p + (int)strlen((char *)p); + while (isspace(pp[-1])) pp--; + *pp = 0; + + f = fopen((char *)p, "rb"); + if (f == NULL) + { + fprintf(outfile, "Failed to open %s: %s\n", p, strerror(errno)); + continue; + } + if (fread(sbuf, 1, 8, f) != 8) goto FAIL_READ; + + true_size = + (sbuf[0] << 24) | (sbuf[1] << 16) | (sbuf[2] << 8) | sbuf[3]; + true_study_size = + (sbuf[4] << 24) | (sbuf[5] << 16) | (sbuf[6] << 8) | sbuf[7]; + + re = (pcre *)new_malloc(true_size); + if (re == NULL) + { + printf("** Failed to get %d bytes of memory for pcre object\n", + (int)true_size); + yield = 1; + goto EXIT; + } + if (fread(re, 1, true_size, f) != true_size) goto FAIL_READ; + + magic = REAL_PCRE_MAGIC(re); + if (magic != MAGIC_NUMBER) + { + if (swap_uint32(magic) == MAGIC_NUMBER) + { + do_flip = 1; + } + else + { + fprintf(outfile, "Data in %s is not a compiled PCRE regex\n", p); + new_free(re); + fclose(f); + continue; + } + } + + /* We hide the byte-invert info for little and big endian tests. */ + fprintf(outfile, "Compiled pattern%s loaded from %s\n", + do_flip && (p[-1] == '<') ? " (byte-inverted)" : "", p); + + /* Now see if there is any following study data. */ + + if (true_study_size != 0) + { + pcre_study_data *psd; + + extra = (pcre_extra *)new_malloc(sizeof(pcre_extra) + true_study_size); + extra->flags = PCRE_EXTRA_STUDY_DATA; + + psd = (pcre_study_data *)(((char *)extra) + sizeof(pcre_extra)); + extra->study_data = psd; + + if (fread(psd, 1, true_study_size, f) != true_study_size) + { + FAIL_READ: + fprintf(outfile, "Failed to read data from %s\n", p); + if (extra != NULL) + { + PCRE_FREE_STUDY(extra); + } + new_free(re); + fclose(f); + continue; + } + fprintf(outfile, "Study data loaded from %s\n", p); + do_study = 1; /* To get the data output if requested */ + } + else fprintf(outfile, "No study data\n"); + + /* Flip the necessary bytes. */ + if (do_flip) + { + int rc; + PCRE_PATTERN_TO_HOST_BYTE_ORDER(rc, re, extra, NULL); + if (rc == PCRE_ERROR_BADMODE) + { + pcre_uint32 flags_in_host_byte_order; + if (REAL_PCRE_MAGIC(re) == MAGIC_NUMBER) + flags_in_host_byte_order = REAL_PCRE_FLAGS(re); + else + flags_in_host_byte_order = swap_uint32(REAL_PCRE_FLAGS(re)); + /* Simulate the result of the function call below. */ + fprintf(outfile, "Error %d from pcre%s_fullinfo(%d)\n", rc, + pcre_mode == PCRE32_MODE ? "32" : pcre_mode == PCRE16_MODE ? "16" : "", + PCRE_INFO_OPTIONS); + fprintf(outfile, "Running in %d-bit mode but pattern was compiled in " + "%d-bit mode\n", 8 * CHAR_SIZE, 8 * (flags_in_host_byte_order & PCRE_MODE_MASK)); + new_free(re); + fclose(f); + continue; + } + } + + /* Need to know if UTF-8 for printing data strings. */ + + if (new_info(re, NULL, PCRE_INFO_OPTIONS, &get_options) < 0) + { + new_free(re); + fclose(f); + continue; + } + use_utf = (get_options & PCRE_UTF8) != 0; + + fclose(f); + goto SHOW_INFO; + } + + /* In-line pattern (the usual case). Get the delimiter and seek the end of + the pattern; if it isn't complete, read more. */ + + delimiter = *p++; + + if (isalnum(delimiter) || delimiter == '\\') + { + fprintf(outfile, "** Delimiter must not be alphanumeric or \\\n"); + goto SKIP_DATA; + } + + pp = p; + poffset = (int)(p - buffer); + + for(;;) + { + while (*pp != 0) + { + if (*pp == '\\' && pp[1] != 0) pp++; + else if (*pp == delimiter) break; + pp++; + } + if (*pp != 0) break; + if ((pp = extend_inputline(infile, pp, " > ")) == NULL) + { + fprintf(outfile, "** Unexpected EOF\n"); + done = 1; + goto CONTINUE; + } + if (infile != stdin) fprintf(outfile, "%s", (char *)pp); + } + + /* The buffer may have moved while being extended; reset the start of data + pointer to the correct relative point in the buffer. */ + + p = buffer + poffset; + + /* If the first character after the delimiter is backslash, make + the pattern end with backslash. This is purely to provide a way + of testing for the error message when a pattern ends with backslash. */ + + if (pp[1] == '\\') *pp++ = '\\'; + + /* Terminate the pattern at the delimiter, and save a copy of the pattern + for callouts. */ + + *pp++ = 0; + strcpy((char *)pbuffer, (char *)p); + + /* Look for modifiers and options after the final delimiter. */ + + options = default_options; + study_options = force_study_options; + log_store = showstore; /* default from command line */ + + while (*pp != 0) + { + /* Check to see whether this modifier has been locked out for this file. + This is complicated for the multi-character options that begin with '<'. + If there is no '>' in the lockout string, all multi-character modifiers are + locked out. */ + + if (strchr((char *)lockout, *pp) != NULL) + { + if (*pp == '<' && strchr((char *)lockout, '>') != NULL) + { + int x = check_mc_option(pp+1, outfile, FALSE, "modifier"); + if (x == 0) goto SKIP_DATA; + + for (ppp = lockout; *ppp != 0; ppp++) + { + if (*ppp == '<') + { + int y = check_mc_option(ppp+1, outfile, FALSE, "modifier"); + if (y == 0) + { + printf("** Error in modifier forbid data - giving up.\n"); + yield = 1; + goto EXIT; + } + if (x == y) + { + ppp = pp; + while (*ppp != '>') ppp++; + printf("** The %.*s modifier is locked out - giving up.\n", + (int)(ppp - pp + 1), pp); + yield = 1; + goto EXIT; + } + } + } + } + + /* The single-character modifiers are straightforward. */ + + else + { + printf("** The /%c modifier is locked out - giving up.\n", *pp); + yield = 1; + goto EXIT; + } + } + + /* The modifier is not locked out; handle it. */ + + switch (*pp++) + { + case 'f': options |= PCRE_FIRSTLINE; break; + case 'g': do_g = 1; break; + case 'i': options |= PCRE_CASELESS; break; + case 'm': options |= PCRE_MULTILINE; break; + case 's': options |= PCRE_DOTALL; break; + case 'x': options |= PCRE_EXTENDED; break; + + case '+': + if (do_showrest) do_showcaprest = 1; else do_showrest = 1; + break; + + case '=': do_allcaps = 1; break; + case 'A': options |= PCRE_ANCHORED; break; + case 'B': do_debug = 1; break; + case 'C': options |= PCRE_AUTO_CALLOUT; break; + case 'D': do_debug = do_showinfo = 1; break; + case 'E': options |= PCRE_DOLLAR_ENDONLY; break; + case 'F': do_flip = 1; break; + case 'G': do_G = 1; break; + case 'I': do_showinfo = 1; break; + case 'J': options |= PCRE_DUPNAMES; break; + case 'K': do_mark = 1; break; + case 'M': log_store = 1; break; + case 'N': options |= PCRE_NO_AUTO_CAPTURE; break; + case 'O': options |= PCRE_NO_AUTO_POSSESS; break; + +#if !defined NOPOSIX + case 'P': do_posix = 1; break; +#endif + + case 'Q': + switch (*pp) + { + case '0': + case '1': + stack_guard_return = *pp++ - '0'; + break; + + default: + fprintf(outfile, "** Missing 0 or 1 after /Q\n"); + goto SKIP_DATA; + } + SET_PCRE_STACK_GUARD(stack_guard); + break; + + case 'S': + do_study = 1; + for (;;) + { + switch (*pp++) + { + case 'S': + do_study = 0; + no_force_study = 1; + break; + + case '!': + study_options |= PCRE_STUDY_EXTRA_NEEDED; + break; + + case '+': + if (*pp == '+') + { + verify_jit = TRUE; + pp++; + } + if (*pp >= '1' && *pp <= '7') + study_options |= jit_study_bits[*pp++ - '1']; + else + study_options |= jit_study_bits[6]; + break; + + case '-': + study_options &= ~PCRE_STUDY_ALLJIT; + break; + + default: + pp--; + goto ENDLOOP; + } + } + ENDLOOP: + break; + + case 'U': options |= PCRE_UNGREEDY; break; + case 'W': options |= PCRE_UCP; break; + case 'X': options |= PCRE_EXTRA; break; + case 'Y': options |= PCRE_NO_START_OPTIMISE; break; + case 'Z': debug_lengths = 0; break; + case '8': options |= PCRE_UTF8; use_utf = 1; break; + case '9': options |= PCRE_NEVER_UTF; break; + case '?': options |= PCRE_NO_UTF8_CHECK; break; + + case 'T': + switch (*pp++) + { + case '0': tables = tables0; break; + case '1': tables = tables1; break; + + case '\r': + case '\n': + case ' ': + case 0: + fprintf(outfile, "** Missing table number after /T\n"); + goto SKIP_DATA; + + default: + fprintf(outfile, "** Bad table number \"%c\" after /T\n", pp[-1]); + goto SKIP_DATA; + } + break; + + case 'L': + ppp = pp; + /* The '\r' test here is so that it works on Windows. */ + /* The '0' test is just in case this is an unterminated line. */ + while (*ppp != 0 && *ppp != '\n' && *ppp != '\r' && *ppp != ' ') ppp++; + *ppp = 0; + if (setlocale(LC_CTYPE, (const char *)pp) == NULL) + { + fprintf(outfile, "** Failed to set locale \"%s\"\n", pp); + goto SKIP_DATA; + } + locale_set = 1; + tables = PCRE_MAKETABLES; + pp = ppp; + break; + + case '>': + to_file = pp; + while (*pp != 0) pp++; + while (isspace(pp[-1])) pp--; + *pp = 0; + break; + + case '<': + { + int x = check_mc_option(pp, outfile, FALSE, "modifier"); + if (x == 0) goto SKIP_DATA; + options |= x; + while (*pp++ != '>'); + } + break; + + case '\r': /* So that it works in Windows */ + case '\n': + case ' ': + break; + + default: + fprintf(outfile, "** Unknown modifier '%c'\n", pp[-1]); + goto SKIP_DATA; + } + } + + /* Handle compiling via the POSIX interface, which doesn't support the + timing, showing, or debugging options, nor the ability to pass over + local character tables. Neither does it have 16-bit support. */ + +#if !defined NOPOSIX + if (posix || do_posix) + { + int rc; + int cflags = 0; + + if ((options & PCRE_CASELESS) != 0) cflags |= REG_ICASE; + if ((options & PCRE_MULTILINE) != 0) cflags |= REG_NEWLINE; + if ((options & PCRE_DOTALL) != 0) cflags |= REG_DOTALL; + if ((options & PCRE_NO_AUTO_CAPTURE) != 0) cflags |= REG_NOSUB; + if ((options & PCRE_UTF8) != 0) cflags |= REG_UTF8; + if ((options & PCRE_UCP) != 0) cflags |= REG_UCP; + if ((options & PCRE_UNGREEDY) != 0) cflags |= REG_UNGREEDY; + + rc = regcomp(&preg, (char *)p, cflags); + + /* Compilation failed; go back for another re, skipping to blank line + if non-interactive. */ + + if (rc != 0) + { + (void)regerror(rc, &preg, (char *)buffer, buffer_size); + fprintf(outfile, "Failed: POSIX code %d: %s\n", rc, buffer); + goto SKIP_DATA; + } + } + + /* Handle compiling via the native interface */ + + else +#endif /* !defined NOPOSIX */ + + { + /* In 16- or 32-bit mode, convert the input. */ + +#ifdef SUPPORT_PCRE16 + if (pcre_mode == PCRE16_MODE) + { + switch(to16(FALSE, p, options & PCRE_UTF8, (int)strlen((char *)p))) + { + case -1: + fprintf(outfile, "**Failed: invalid UTF-8 string cannot be " + "converted to UTF-16\n"); + goto SKIP_DATA; + + case -2: + fprintf(outfile, "**Failed: character value greater than 0x10ffff " + "cannot be converted to UTF-16\n"); + goto SKIP_DATA; + + case -3: /* "Impossible error" when to16 is called arg1 FALSE */ + fprintf(outfile, "**Failed: character value greater than 0xffff " + "cannot be converted to 16-bit in non-UTF mode\n"); + goto SKIP_DATA; + + default: + break; + } + p = (pcre_uint8 *)buffer16; + } +#endif + +#ifdef SUPPORT_PCRE32 + if (pcre_mode == PCRE32_MODE) + { + switch(to32(FALSE, p, options & PCRE_UTF32, (int)strlen((char *)p))) + { + case -1: + fprintf(outfile, "**Failed: invalid UTF-8 string cannot be " + "converted to UTF-32\n"); + goto SKIP_DATA; + + case -2: + fprintf(outfile, "**Failed: character value greater than 0x10ffff " + "cannot be converted to UTF-32\n"); + goto SKIP_DATA; + + case -3: + fprintf(outfile, "**Failed: character value is ill-formed UTF-32\n"); + goto SKIP_DATA; + + default: + break; + } + p = (pcre_uint8 *)buffer32; + } +#endif + + /* Compile many times when timing */ + + if (timeit > 0) + { + register int i; + clock_t time_taken; + clock_t start_time = clock(); + for (i = 0; i < timeit; i++) + { + PCRE_COMPILE(re, p, options, &error, &erroroffset, tables); + if (re != NULL) free(re); + } + total_compile_time += (time_taken = clock() - start_time); + fprintf(outfile, "Compile time %.4f milliseconds\n", + (((double)time_taken * 1000.0) / (double)timeit) / + (double)CLOCKS_PER_SEC); + } + + PCRE_COMPILE(re, p, options, &error, &erroroffset, tables); + + /* Compilation failed; go back for another re, skipping to blank line + if non-interactive. */ + + if (re == NULL) + { + fprintf(outfile, "Failed: %s at offset %d\n", error, erroroffset); + SKIP_DATA: + if (infile != stdin) + { + for (;;) + { + if (extend_inputline(infile, buffer, NULL) == NULL) + { + done = 1; + goto CONTINUE; + } + len = (int)strlen((char *)buffer); + while (len > 0 && isspace(buffer[len-1])) len--; + if (len == 0) break; + } + fprintf(outfile, "\n"); + } + goto CONTINUE; + } + + /* Compilation succeeded. It is now possible to set the UTF-8 option from + within the regex; check for this so that we know how to process the data + lines. */ + + if (new_info(re, NULL, PCRE_INFO_OPTIONS, &get_options) < 0) + goto SKIP_DATA; + if ((get_options & PCRE_UTF8) != 0) use_utf = 1; + + /* Extract the size for possible writing before possibly flipping it, + and remember the store that was got. */ + + true_size = REAL_PCRE_SIZE(re); + + /* Output code size information if requested */ + + if (log_store) + { + int name_count, name_entry_size, real_pcre_size; + + new_info(re, NULL, PCRE_INFO_NAMECOUNT, &name_count); + new_info(re, NULL, PCRE_INFO_NAMEENTRYSIZE, &name_entry_size); + real_pcre_size = 0; +#ifdef SUPPORT_PCRE8 + if (REAL_PCRE_FLAGS(re) & PCRE_MODE8) + real_pcre_size = sizeof(real_pcre); +#endif +#ifdef SUPPORT_PCRE16 + if (REAL_PCRE_FLAGS(re) & PCRE_MODE16) + real_pcre_size = sizeof(real_pcre16); +#endif +#ifdef SUPPORT_PCRE32 + if (REAL_PCRE_FLAGS(re) & PCRE_MODE32) + real_pcre_size = sizeof(real_pcre32); +#endif + new_info(re, NULL, PCRE_INFO_SIZE, &size); + fprintf(outfile, "Memory allocation (code space): %d\n", + (int)(size - real_pcre_size - name_count * name_entry_size)); + } + + /* If -s or /S was present, study the regex to generate additional info to + help with the matching, unless the pattern has the SS option, which + suppresses the effect of /S (used for a few test patterns where studying is + never sensible). */ + + if (do_study || (force_study >= 0 && !no_force_study)) + { + if (timeit > 0) + { + register int i; + clock_t time_taken; + clock_t start_time = clock(); + for (i = 0; i < timeit; i++) + { + PCRE_STUDY(extra, re, study_options, &error); + } + total_study_time = (time_taken = clock() - start_time); + if (extra != NULL) + { + PCRE_FREE_STUDY(extra); + } + fprintf(outfile, " Study time %.4f milliseconds\n", + (((double)time_taken * 1000.0) / (double)timeit) / + (double)CLOCKS_PER_SEC); + } + PCRE_STUDY(extra, re, study_options, &error); + if (error != NULL) + fprintf(outfile, "Failed to study: %s\n", error); + else if (extra != NULL) + { + true_study_size = ((pcre_study_data *)(extra->study_data))->size; + if (log_store) + { + size_t jitsize; + if (new_info(re, extra, PCRE_INFO_JITSIZE, &jitsize) == 0 && + jitsize != 0) + fprintf(outfile, "Memory allocation (JIT code): %d\n", (int)jitsize); + } + } + } + + /* If /K was present, we set up for handling MARK data. */ + + if (do_mark) + { + if (extra == NULL) + { + extra = (pcre_extra *)malloc(sizeof(pcre_extra)); + extra->flags = 0; + } + extra->mark = &markptr; + extra->flags |= PCRE_EXTRA_MARK; + } + + /* Extract and display information from the compiled data if required. */ + + SHOW_INFO: + + if (do_debug) + { + fprintf(outfile, "------------------------------------------------------------------\n"); + PCRE_PRINTINT(re, outfile, debug_lengths); + } + + /* We already have the options in get_options (see above) */ + + if (do_showinfo) + { + unsigned long int all_options; + pcre_uint32 first_char, need_char; + pcre_uint32 match_limit, recursion_limit; + int count, backrefmax, first_char_set, need_char_set, okpartial, jchanged, + hascrorlf, maxlookbehind, match_empty; + int nameentrysize, namecount; + const pcre_uint8 *nametable; + + if (new_info(re, NULL, PCRE_INFO_CAPTURECOUNT, &count) + + new_info(re, NULL, PCRE_INFO_BACKREFMAX, &backrefmax) + + new_info(re, NULL, PCRE_INFO_FIRSTCHARACTER, &first_char) + + new_info(re, NULL, PCRE_INFO_FIRSTCHARACTERFLAGS, &first_char_set) + + new_info(re, NULL, PCRE_INFO_REQUIREDCHAR, &need_char) + + new_info(re, NULL, PCRE_INFO_REQUIREDCHARFLAGS, &need_char_set) + + new_info(re, NULL, PCRE_INFO_NAMEENTRYSIZE, &nameentrysize) + + new_info(re, NULL, PCRE_INFO_NAMECOUNT, &namecount) + + new_info(re, NULL, PCRE_INFO_NAMETABLE, (void *)&nametable) + + new_info(re, NULL, PCRE_INFO_OKPARTIAL, &okpartial) + + new_info(re, NULL, PCRE_INFO_JCHANGED, &jchanged) + + new_info(re, NULL, PCRE_INFO_HASCRORLF, &hascrorlf) + + new_info(re, NULL, PCRE_INFO_MATCH_EMPTY, &match_empty) + + new_info(re, NULL, PCRE_INFO_MAXLOOKBEHIND, &maxlookbehind) + != 0) + goto SKIP_DATA; + + fprintf(outfile, "Capturing subpattern count = %d\n", count); + + if (backrefmax > 0) + fprintf(outfile, "Max back reference = %d\n", backrefmax); + + if (maxlookbehind > 0) + fprintf(outfile, "Max lookbehind = %d\n", maxlookbehind); + + if (new_info(re, NULL, PCRE_INFO_MATCHLIMIT, &match_limit) == 0) + fprintf(outfile, "Match limit = %u\n", match_limit); + + if (new_info(re, NULL, PCRE_INFO_RECURSIONLIMIT, &recursion_limit) == 0) + fprintf(outfile, "Recursion limit = %u\n", recursion_limit); + + if (namecount > 0) + { + fprintf(outfile, "Named capturing subpatterns:\n"); + while (namecount-- > 0) + { + int imm2_size = pcre_mode == PCRE8_MODE ? 2 : 1; + int length = (int)STRLEN(nametable + imm2_size); + fprintf(outfile, " "); + PCHARSV(nametable, imm2_size, length, outfile); + while (length++ < nameentrysize - imm2_size) putc(' ', outfile); +#ifdef SUPPORT_PCRE32 + if (pcre_mode == PCRE32_MODE) + fprintf(outfile, "%3d\n", (int)(((PCRE_SPTR32)nametable)[0])); +#endif +#ifdef SUPPORT_PCRE16 + if (pcre_mode == PCRE16_MODE) + fprintf(outfile, "%3d\n", (int)(((PCRE_SPTR16)nametable)[0])); +#endif +#ifdef SUPPORT_PCRE8 + if (pcre_mode == PCRE8_MODE) + fprintf(outfile, "%3d\n", ((int)nametable[0] << 8) | (int)nametable[1]); +#endif + nametable += nameentrysize * CHAR_SIZE; + } + } + + if (!okpartial) fprintf(outfile, "Partial matching not supported\n"); + if (hascrorlf) fprintf(outfile, "Contains explicit CR or LF match\n"); + if (match_empty) fprintf(outfile, "May match empty string\n"); + + all_options = REAL_PCRE_OPTIONS(re); + if (do_flip) all_options = swap_uint32(all_options); + + if (get_options == 0) fprintf(outfile, "No options\n"); + else fprintf(outfile, "Options:%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n", + ((get_options & PCRE_ANCHORED) != 0)? " anchored" : "", + ((get_options & PCRE_CASELESS) != 0)? " caseless" : "", + ((get_options & PCRE_EXTENDED) != 0)? " extended" : "", + ((get_options & PCRE_MULTILINE) != 0)? " multiline" : "", + ((get_options & PCRE_FIRSTLINE) != 0)? " firstline" : "", + ((get_options & PCRE_DOTALL) != 0)? " dotall" : "", + ((get_options & PCRE_BSR_ANYCRLF) != 0)? " bsr_anycrlf" : "", + ((get_options & PCRE_BSR_UNICODE) != 0)? " bsr_unicode" : "", + ((get_options & PCRE_DOLLAR_ENDONLY) != 0)? " dollar_endonly" : "", + ((get_options & PCRE_EXTRA) != 0)? " extra" : "", + ((get_options & PCRE_UNGREEDY) != 0)? " ungreedy" : "", + ((get_options & PCRE_NO_AUTO_CAPTURE) != 0)? " no_auto_capture" : "", + ((get_options & PCRE_NO_AUTO_POSSESS) != 0)? " no_auto_possessify" : "", + ((get_options & PCRE_UTF8) != 0)? " utf" : "", + ((get_options & PCRE_UCP) != 0)? " ucp" : "", + ((get_options & PCRE_NO_UTF8_CHECK) != 0)? " no_utf_check" : "", + ((get_options & PCRE_NO_START_OPTIMIZE) != 0)? " no_start_optimize" : "", + ((get_options & PCRE_DUPNAMES) != 0)? " dupnames" : "", + ((get_options & PCRE_NEVER_UTF) != 0)? " never_utf" : ""); + + if (jchanged) fprintf(outfile, "Duplicate name status changes\n"); + + switch (get_options & PCRE_NEWLINE_BITS) + { + case PCRE_NEWLINE_CR: + fprintf(outfile, "Forced newline sequence: CR\n"); + break; + + case PCRE_NEWLINE_LF: + fprintf(outfile, "Forced newline sequence: LF\n"); + break; + + case PCRE_NEWLINE_CRLF: + fprintf(outfile, "Forced newline sequence: CRLF\n"); + break; + + case PCRE_NEWLINE_ANYCRLF: + fprintf(outfile, "Forced newline sequence: ANYCRLF\n"); + break; + + case PCRE_NEWLINE_ANY: + fprintf(outfile, "Forced newline sequence: ANY\n"); + break; + + default: + break; + } + + if (first_char_set == 2) + { + fprintf(outfile, "First char at start or follows newline\n"); + } + else if (first_char_set == 1) + { + const char *caseless = + ((REAL_PCRE_FLAGS(re) & PCRE_FCH_CASELESS) == 0)? + "" : " (caseless)"; + + if (PRINTOK(first_char)) + fprintf(outfile, "First char = \'%c\'%s\n", first_char, caseless); + else + { + fprintf(outfile, "First char = "); + pchar(first_char, outfile); + fprintf(outfile, "%s\n", caseless); + } + } + else + { + fprintf(outfile, "No first char\n"); + } + + if (need_char_set == 0) + { + fprintf(outfile, "No need char\n"); + } + else + { + const char *caseless = + ((REAL_PCRE_FLAGS(re) & PCRE_RCH_CASELESS) == 0)? + "" : " (caseless)"; + + if (PRINTOK(need_char)) + fprintf(outfile, "Need char = \'%c\'%s\n", need_char, caseless); + else + { + fprintf(outfile, "Need char = "); + pchar(need_char, outfile); + fprintf(outfile, "%s\n", caseless); + } + } + + /* Don't output study size; at present it is in any case a fixed + value, but it varies, depending on the computer architecture, and + so messes up the test suite. (And with the /F option, it might be + flipped.) If study was forced by an external -s, don't show this + information unless -i or -d was also present. This means that, except + when auto-callouts are involved, the output from runs with and without + -s should be identical. */ + + if (do_study || (force_study >= 0 && showinfo && !no_force_study)) + { + if (extra == NULL) + fprintf(outfile, "Study returned NULL\n"); + else + { + pcre_uint8 *start_bits = NULL; + int minlength; + + if (new_info(re, extra, PCRE_INFO_MINLENGTH, &minlength) == 0) + fprintf(outfile, "Subject length lower bound = %d\n", minlength); + + if (new_info(re, extra, PCRE_INFO_FIRSTTABLE, &start_bits) == 0) + { + if (start_bits == NULL) + fprintf(outfile, "No starting char list\n"); + else + { + int i; + int c = 24; + fprintf(outfile, "Starting chars: "); + for (i = 0; i < 256; i++) + { + if ((start_bits[i/8] & (1<<(i&7))) != 0) + { + if (c > 75) + { + fprintf(outfile, "\n "); + c = 2; + } + if (PRINTOK(i) && i != ' ') + { + fprintf(outfile, "%c ", i); + c += 2; + } + else + { + fprintf(outfile, "\\x%02x ", i); + c += 5; + } + } + } + fprintf(outfile, "\n"); + } + } + } + + /* Show this only if the JIT was set by /S, not by -s. */ + + if ((study_options & PCRE_STUDY_ALLJIT) != 0 && + (force_study_options & PCRE_STUDY_ALLJIT) == 0) + { + int jit; + if (new_info(re, extra, PCRE_INFO_JIT, &jit) == 0) + { + if (jit) + fprintf(outfile, "JIT study was successful\n"); + else +#ifdef SUPPORT_JIT + fprintf(outfile, "JIT study was not successful\n"); +#else + fprintf(outfile, "JIT support is not available in this version of PCRE\n"); +#endif + } + } + } + } + + /* If the '>' option was present, we write out the regex to a file, and + that is all. The first 8 bytes of the file are the regex length and then + the study length, in big-endian order. */ + + if (to_file != NULL) + { + FILE *f = fopen((char *)to_file, "wb"); + if (f == NULL) + { + fprintf(outfile, "Unable to open %s: %s\n", to_file, strerror(errno)); + } + else + { + pcre_uint8 sbuf[8]; + + if (do_flip) regexflip(re, extra); + sbuf[0] = (pcre_uint8)((true_size >> 24) & 255); + sbuf[1] = (pcre_uint8)((true_size >> 16) & 255); + sbuf[2] = (pcre_uint8)((true_size >> 8) & 255); + sbuf[3] = (pcre_uint8)((true_size) & 255); + sbuf[4] = (pcre_uint8)((true_study_size >> 24) & 255); + sbuf[5] = (pcre_uint8)((true_study_size >> 16) & 255); + sbuf[6] = (pcre_uint8)((true_study_size >> 8) & 255); + sbuf[7] = (pcre_uint8)((true_study_size) & 255); + + if (fwrite(sbuf, 1, 8, f) < 8 || + fwrite(re, 1, true_size, f) < true_size) + { + fprintf(outfile, "Write error on %s: %s\n", to_file, strerror(errno)); + } + else + { + fprintf(outfile, "Compiled pattern written to %s\n", to_file); + + /* If there is study data, write it. */ + + if (extra != NULL && (extra->flags & PCRE_EXTRA_STUDY_DATA) != 0) + { + if (fwrite(extra->study_data, 1, true_study_size, f) < + true_study_size) + { + fprintf(outfile, "Write error on %s: %s\n", to_file, + strerror(errno)); + } + else fprintf(outfile, "Study data written to %s\n", to_file); + } + } + fclose(f); + } + + new_free(re); + if (extra != NULL) + { + PCRE_FREE_STUDY(extra); + } + if (locale_set) + { + new_free((void *)tables); + setlocale(LC_CTYPE, "C"); + locale_set = 0; + } + continue; /* With next regex */ + } + } /* End of non-POSIX compile */ + + /* Read data lines and test them */ + + for (;;) + { +#ifdef SUPPORT_PCRE8 + pcre_uint8 *q8; +#endif +#ifdef SUPPORT_PCRE16 + pcre_uint16 *q16; +#endif +#ifdef SUPPORT_PCRE32 + pcre_uint32 *q32; +#endif + pcre_uint8 *bptr; + int *use_offsets = offsets; + int use_size_offsets = size_offsets; + int callout_data = 0; + int callout_data_set = 0; + int count; + pcre_uint32 c; + int copystrings = 0; + int find_match_limit = default_find_match_limit; + int getstrings = 0; + int getlist = 0; + int gmatched = 0; + int start_offset = 0; + int start_offset_sign = 1; + int g_notempty = 0; + int use_dfa = 0; + + *copynames = 0; + *getnames = 0; + +#ifdef SUPPORT_PCRE32 + cn32ptr = copynames; + gn32ptr = getnames; +#endif +#ifdef SUPPORT_PCRE16 + cn16ptr = copynames16; + gn16ptr = getnames16; +#endif +#ifdef SUPPORT_PCRE8 + cn8ptr = copynames8; + gn8ptr = getnames8; +#endif + + SET_PCRE_CALLOUT(callout); + first_callout = 1; + last_callout_mark = NULL; + callout_extra = 0; + callout_count = 0; + callout_fail_count = 999999; + callout_fail_id = -1; + show_malloc = 0; + options = 0; + + if (extra != NULL) extra->flags &= + ~(PCRE_EXTRA_MATCH_LIMIT|PCRE_EXTRA_MATCH_LIMIT_RECURSION); + + len = 0; + for (;;) + { + if (extend_inputline(infile, buffer + len, "data> ") == NULL) + { + if (len > 0) /* Reached EOF without hitting a newline */ + { + fprintf(outfile, "\n"); + break; + } + done = 1; + goto CONTINUE; + } + if (infile != stdin) fprintf(outfile, "%s", (char *)buffer); + len = (int)strlen((char *)buffer); + if (buffer[len-1] == '\n') break; + } + + while (len > 0 && isspace(buffer[len-1])) len--; + buffer[len] = 0; + if (len == 0) break; + + p = buffer; + while (isspace(*p)) p++; + +#ifndef NOUTF + /* Check that the data is well-formed UTF-8 if we're in UTF mode. To create + invalid input to pcre_exec, you must use \x?? or \x{} sequences. */ + + if (use_utf) + { + pcre_uint8 *q; + pcre_uint32 cc; + int n = 1; + + for (q = p; n > 0 && *q; q += n) n = utf82ord(q, &cc); + if (n <= 0) + { + fprintf(outfile, "**Failed: invalid UTF-8 string cannot be used as input in UTF mode\n"); + goto NEXT_DATA; + } + } +#endif + +#ifdef SUPPORT_VALGRIND + /* Mark the dbuffer as addressable but undefined again. */ + + if (dbuffer != NULL) + { + VALGRIND_MAKE_MEM_UNDEFINED(dbuffer, dbuffer_size * CHAR_SIZE); + } +#endif + + /* Allocate a buffer to hold the data line; len+1 is an upper bound on + the number of pcre_uchar units that will be needed. */ + + while (dbuffer == NULL || (size_t)len >= dbuffer_size) + { + dbuffer_size *= 2; + dbuffer = (pcre_uint8 *)realloc(dbuffer, dbuffer_size * CHAR_SIZE); + if (dbuffer == NULL) + { + fprintf(stderr, "pcretest: realloc(%d) failed\n", (int)dbuffer_size); + exit(1); + } + } + +#ifdef SUPPORT_PCRE8 + q8 = (pcre_uint8 *) dbuffer; +#endif +#ifdef SUPPORT_PCRE16 + q16 = (pcre_uint16 *) dbuffer; +#endif +#ifdef SUPPORT_PCRE32 + q32 = (pcre_uint32 *) dbuffer; +#endif + + while ((c = *p++) != 0) + { + int i = 0; + int n = 0; + + /* In UTF mode, input can be UTF-8, so just copy all non-backslash bytes. + In non-UTF mode, allow the value of the byte to fall through to later, + where values greater than 127 are turned into UTF-8 when running in + 16-bit or 32-bit mode. */ + + if (c != '\\') + { +#ifndef NOUTF + if (use_utf && HASUTF8EXTRALEN(c)) { GETUTF8INC(c, p); } +#endif + } + + /* Handle backslash escapes */ + + else switch ((c = *p++)) + { + case 'a': c = CHAR_BEL; break; + case 'b': c = '\b'; break; + case 'e': c = CHAR_ESC; break; + case 'f': c = '\f'; break; + case 'n': c = '\n'; break; + case 'r': c = '\r'; break; + case 't': c = '\t'; break; + case 'v': c = '\v'; break; + + case '0': case '1': case '2': case '3': + case '4': case '5': case '6': case '7': + c -= '0'; + while (i++ < 2 && isdigit(*p) && *p != '8' && *p != '9') + c = c * 8 + *p++ - '0'; + break; + + case 'o': + if (*p == '{') + { + pcre_uint8 *pt = p; + c = 0; + for (pt++; isdigit(*pt) && *pt != '8' && *pt != '9'; pt++) + { + if (++i == 12) + fprintf(outfile, "** Too many octal digits in \\o{...} item; " + "using only the first twelve.\n"); + else c = c * 8 + *pt - '0'; + } + if (*pt == '}') p = pt + 1; + else fprintf(outfile, "** Missing } after \\o{ (assumed)\n"); + } + break; + + case 'x': + if (*p == '{') + { + pcre_uint8 *pt = p; + c = 0; + + /* We used to have "while (isxdigit(*(++pt)))" here, but it fails + when isxdigit() is a macro that refers to its argument more than + once. This is banned by the C Standard, but apparently happens in at + least one MacOS environment. */ + + for (pt++; isxdigit(*pt); pt++) + { + if (++i == 9) + fprintf(outfile, "** Too many hex digits in \\x{...} item; " + "using only the first eight.\n"); + else c = c * 16 + tolower(*pt) - ((isdigit(*pt))? '0' : 'a' - 10); + } + if (*pt == '}') + { + p = pt + 1; + break; + } + /* Not correct form for \x{...}; fall through */ + } + + /* \x without {} always defines just one byte in 8-bit mode. This + allows UTF-8 characters to be constructed byte by byte, and also allows + invalid UTF-8 sequences to be made. Just copy the byte in UTF mode. + Otherwise, pass it down to later code so that it can be turned into + UTF-8 when running in 16/32-bit mode. */ + + c = 0; + while (i++ < 2 && isxdigit(*p)) + { + c = c * 16 + tolower(*p) - ((isdigit(*p))? '0' : 'a' - 10); + p++; + } +#if !defined NOUTF && defined SUPPORT_PCRE8 + if (use_utf && (pcre_mode == PCRE8_MODE)) + { + *q8++ = c; + continue; + } +#endif + break; + + case 0: /* \ followed by EOF allows for an empty line */ + p--; + continue; + + case '>': + if (*p == '-') + { + start_offset_sign = -1; + p++; + } + while(isdigit(*p)) start_offset = start_offset * 10 + *p++ - '0'; + start_offset *= start_offset_sign; + continue; + + case 'A': /* Option setting */ + options |= PCRE_ANCHORED; + continue; + + case 'B': + options |= PCRE_NOTBOL; + continue; + + case 'C': + if (isdigit(*p)) /* Set copy string */ + { + while(isdigit(*p)) n = n * 10 + *p++ - '0'; + copystrings |= 1U << n; + } + else if (isalnum(*p)) + { + READ_CAPTURE_NAME(p, &cn8ptr, &cn16ptr, &cn32ptr, re); + } + else if (*p == '+') + { + callout_extra = 1; + p++; + } + else if (*p == '-') + { + SET_PCRE_CALLOUT(NULL); + p++; + } + else if (*p == '!') + { + callout_fail_id = 0; + p++; + while(isdigit(*p)) + callout_fail_id = callout_fail_id * 10 + *p++ - '0'; + callout_fail_count = 0; + if (*p == '!') + { + p++; + while(isdigit(*p)) + callout_fail_count = callout_fail_count * 10 + *p++ - '0'; + } + } + else if (*p == '*') + { + int sign = 1; + callout_data = 0; + if (*(++p) == '-') { sign = -1; p++; } + while(isdigit(*p)) + callout_data = callout_data * 10 + *p++ - '0'; + callout_data *= sign; + callout_data_set = 1; + } + continue; + +#if !defined NODFA + case 'D': +#if !defined NOPOSIX + if (posix || do_posix) + printf("** Can't use dfa matching in POSIX mode: \\D ignored\n"); + else +#endif + use_dfa = 1; + continue; +#endif + +#if !defined NODFA + case 'F': + options |= PCRE_DFA_SHORTEST; + continue; +#endif + + case 'G': + if (isdigit(*p)) + { + while(isdigit(*p)) n = n * 10 + *p++ - '0'; + getstrings |= 1U << n; + } + else if (isalnum(*p)) + { + READ_CAPTURE_NAME(p, &gn8ptr, &gn16ptr, &gn32ptr, re); + } + continue; + + case 'J': + while(isdigit(*p)) n = n * 10 + *p++ - '0'; + if (extra != NULL + && (extra->flags & PCRE_EXTRA_EXECUTABLE_JIT) != 0 + && extra->executable_jit != NULL) + { + if (jit_stack != NULL) { PCRE_JIT_STACK_FREE(jit_stack); } + jit_stack = PCRE_JIT_STACK_ALLOC(1, n * 1024); + PCRE_ASSIGN_JIT_STACK(extra, jit_callback, jit_stack); + } + continue; + + case 'L': + getlist = 1; + continue; + + case 'M': + find_match_limit = 1; + continue; + + case 'N': + if ((options & PCRE_NOTEMPTY) != 0) + options = (options & ~PCRE_NOTEMPTY) | PCRE_NOTEMPTY_ATSTART; + else + options |= PCRE_NOTEMPTY; + continue; + + case 'O': + while(isdigit(*p)) + { + if (n > (INT_MAX-10)/10) /* Hack to stop fuzzers */ + { + printf("** \\O argument is too big\n"); + yield = 1; + goto EXIT; + } + n = n * 10 + *p++ - '0'; + } + if (n > size_offsets_max) + { + size_offsets_max = n; + free(offsets); + use_offsets = offsets = (int *)malloc(size_offsets_max * sizeof(int)); + if (offsets == NULL) + { + printf("** Failed to get %d bytes of memory for offsets vector\n", + (int)(size_offsets_max * sizeof(int))); + yield = 1; + goto EXIT; + } + } + use_size_offsets = n; + if (n == 0) use_offsets = NULL; /* Ensures it can't write to it */ + else use_offsets = offsets + size_offsets_max - n; /* To catch overruns */ + continue; + + case 'P': + options |= ((options & PCRE_PARTIAL_SOFT) == 0)? + PCRE_PARTIAL_SOFT : PCRE_PARTIAL_HARD; + continue; + + case 'Q': + while(isdigit(*p)) n = n * 10 + *p++ - '0'; + if (extra == NULL) + { + extra = (pcre_extra *)malloc(sizeof(pcre_extra)); + extra->flags = 0; + } + extra->flags |= PCRE_EXTRA_MATCH_LIMIT_RECURSION; + extra->match_limit_recursion = n; + continue; + + case 'q': + while(isdigit(*p)) n = n * 10 + *p++ - '0'; + if (extra == NULL) + { + extra = (pcre_extra *)malloc(sizeof(pcre_extra)); + extra->flags = 0; + } + extra->flags |= PCRE_EXTRA_MATCH_LIMIT; + extra->match_limit = n; + continue; + +#if !defined NODFA + case 'R': + options |= PCRE_DFA_RESTART; + continue; +#endif + + case 'S': + show_malloc = 1; + continue; + + case 'Y': + options |= PCRE_NO_START_OPTIMIZE; + continue; + + case 'Z': + options |= PCRE_NOTEOL; + continue; + + case '?': + options |= PCRE_NO_UTF8_CHECK; + continue; + + case '<': + { + int x = check_mc_option(p, outfile, TRUE, "escape sequence"); + if (x == 0) goto NEXT_DATA; + options |= x; + while (*p++ != '>'); + } + continue; + } + + /* We now have a character value in c that may be greater than 255. + In 8-bit mode we convert to UTF-8 if we are in UTF mode. Values greater + than 127 in UTF mode must have come from \x{...} or octal constructs + because values from \x.. get this far only in non-UTF mode. */ + +#ifdef SUPPORT_PCRE8 + if (pcre_mode == PCRE8_MODE) + { +#ifndef NOUTF + if (use_utf) + { + if (c > 0x7fffffff) + { + fprintf(outfile, "** Character \\x{%x} is greater than 0x7fffffff " + "and so cannot be converted to UTF-8\n", c); + goto NEXT_DATA; + } + q8 += ord2utf8(c, q8); + } + else +#endif + { + if (c > 0xffu) + { + fprintf(outfile, "** Character \\x{%x} is greater than 255 " + "and UTF-8 mode is not enabled.\n", c); + fprintf(outfile, "** Truncation will probably give the wrong " + "result.\n"); + } + *q8++ = c; + } + } +#endif +#ifdef SUPPORT_PCRE16 + if (pcre_mode == PCRE16_MODE) + { +#ifndef NOUTF + if (use_utf) + { + if (c > 0x10ffffu) + { + fprintf(outfile, "** Failed: character \\x{%x} is greater than " + "0x10ffff and so cannot be converted to UTF-16\n", c); + goto NEXT_DATA; + } + else if (c >= 0x10000u) + { + c-= 0x10000u; + *q16++ = 0xD800 | (c >> 10); + *q16++ = 0xDC00 | (c & 0x3ff); + } + else + *q16++ = c; + } + else +#endif + { + if (c > 0xffffu) + { + fprintf(outfile, "** Character \\x{%x} is greater than 0xffff " + "and UTF-16 mode is not enabled.\n", c); + fprintf(outfile, "** Truncation will probably give the wrong " + "result.\n"); + } + + *q16++ = c; + } + } +#endif +#ifdef SUPPORT_PCRE32 + if (pcre_mode == PCRE32_MODE) + { + *q32++ = c; + } +#endif + + } + + /* Reached end of subject string */ + +#ifdef SUPPORT_PCRE8 + if (pcre_mode == PCRE8_MODE) + { + *q8 = 0; + len = (int)(q8 - (pcre_uint8 *)dbuffer); + } +#endif +#ifdef SUPPORT_PCRE16 + if (pcre_mode == PCRE16_MODE) + { + *q16 = 0; + len = (int)(q16 - (pcre_uint16 *)dbuffer); + } +#endif +#ifdef SUPPORT_PCRE32 + if (pcre_mode == PCRE32_MODE) + { + *q32 = 0; + len = (int)(q32 - (pcre_uint32 *)dbuffer); + } +#endif + + /* If we're compiling with explicit valgrind support, Mark the data from after + its end to the end of the buffer as unaddressable, so that a read over the end + of the buffer will be seen by valgrind, even if it doesn't cause a crash. + If we're not building with valgrind support, at least move the data to the end + of the buffer so that it might at least cause a crash. + If we are using the POSIX interface, we must include the terminating zero. */ + + bptr = dbuffer; + +#if !defined NOPOSIX + if (posix || do_posix) + { +#ifdef SUPPORT_VALGRIND + VALGRIND_MAKE_MEM_NOACCESS(dbuffer + len + 1, dbuffer_size - (len + 1)); +#else + memmove(bptr + dbuffer_size - len - 1, bptr, len + 1); + bptr += dbuffer_size - len - 1; +#endif + } + else +#endif + { +#ifdef SUPPORT_VALGRIND + VALGRIND_MAKE_MEM_NOACCESS(dbuffer + len * CHAR_SIZE, (dbuffer_size - len) * CHAR_SIZE); +#else + bptr = memmove(bptr + (dbuffer_size - len) * CHAR_SIZE, bptr, len * CHAR_SIZE); +#endif + } + + if ((all_use_dfa || use_dfa) && find_match_limit) + { + printf("** Match limit not relevant for DFA matching: ignored\n"); + find_match_limit = 0; + } + + /* Handle matching via the POSIX interface, which does not + support timing or playing with the match limit or callout data. */ + +#if !defined NOPOSIX + if (posix || do_posix) + { + int rc; + int eflags = 0; + regmatch_t *pmatch = NULL; + if (use_size_offsets > 0) + pmatch = (regmatch_t *)malloc(sizeof(regmatch_t) * use_size_offsets); + if ((options & PCRE_NOTBOL) != 0) eflags |= REG_NOTBOL; + if ((options & PCRE_NOTEOL) != 0) eflags |= REG_NOTEOL; + if ((options & PCRE_NOTEMPTY) != 0) eflags |= REG_NOTEMPTY; + + rc = regexec(&preg, (const char *)bptr, use_size_offsets, pmatch, eflags); + + if (rc != 0) + { + (void)regerror(rc, &preg, (char *)buffer, buffer_size); + fprintf(outfile, "No match: POSIX code %d: %s\n", rc, buffer); + } + else if ((REAL_PCRE_OPTIONS(preg.re_pcre) & PCRE_NO_AUTO_CAPTURE) != 0) + { + fprintf(outfile, "Matched with REG_NOSUB\n"); + } + else + { + size_t i; + for (i = 0; i < (size_t)use_size_offsets; i++) + { + if (pmatch[i].rm_so >= 0) + { + fprintf(outfile, "%2d: ", (int)i); + PCHARSV(dbuffer, pmatch[i].rm_so, + pmatch[i].rm_eo - pmatch[i].rm_so, outfile); + fprintf(outfile, "\n"); + if (do_showcaprest || (i == 0 && do_showrest)) + { + fprintf(outfile, "%2d+ ", (int)i); + PCHARSV(dbuffer, pmatch[i].rm_eo, len - pmatch[i].rm_eo, + outfile); + fprintf(outfile, "\n"); + } + } + } + } + free(pmatch); + goto NEXT_DATA; + } + +#endif /* !defined NOPOSIX */ + + /* Handle matching via the native interface - repeats for /g and /G */ + + /* Ensure that there is a JIT callback if we want to verify that JIT was + actually used. If jit_stack == NULL, no stack has yet been assigned. */ + + if (verify_jit && jit_stack == NULL && extra != NULL) + { PCRE_ASSIGN_JIT_STACK(extra, jit_callback, jit_stack); } + + for (;; gmatched++) /* Loop for /g or /G */ + { + markptr = NULL; + jit_was_used = FALSE; + + if (timeitm > 0) + { + register int i; + clock_t time_taken; + clock_t start_time = clock(); + +#if !defined NODFA + if (all_use_dfa || use_dfa) + { + if ((options & PCRE_DFA_RESTART) != 0) + { + fprintf(outfile, "Timing DFA restarts is not supported\n"); + break; + } + if (dfa_workspace == NULL) + dfa_workspace = (int *)malloc(DFA_WS_DIMENSION*sizeof(int)); + for (i = 0; i < timeitm; i++) + { + PCRE_DFA_EXEC(count, re, extra, bptr, len, start_offset, + (options | g_notempty), use_offsets, use_size_offsets, + dfa_workspace, DFA_WS_DIMENSION); + } + } + else +#endif + + for (i = 0; i < timeitm; i++) + { + PCRE_EXEC(count, re, extra, bptr, len, start_offset, + (options | g_notempty), use_offsets, use_size_offsets); + } + total_match_time += (time_taken = clock() - start_time); + fprintf(outfile, "Execute time %.4f milliseconds\n", + (((double)time_taken * 1000.0) / (double)timeitm) / + (double)CLOCKS_PER_SEC); + } + + /* If find_match_limit is set, we want to do repeated matches with + varying limits in order to find the minimum value for the match limit and + for the recursion limit. The match limits are relevant only to the normal + running of pcre_exec(), so disable the JIT optimization. This makes it + possible to run the same set of tests with and without JIT externally + requested. */ + + if (find_match_limit) + { + if (extra != NULL) { PCRE_FREE_STUDY(extra); } + extra = (pcre_extra *)malloc(sizeof(pcre_extra)); + extra->flags = 0; + + (void)check_match_limit(re, extra, bptr, len, start_offset, + options|g_notempty, use_offsets, use_size_offsets, + PCRE_EXTRA_MATCH_LIMIT, &(extra->match_limit), + PCRE_ERROR_MATCHLIMIT, "match()"); + + count = check_match_limit(re, extra, bptr, len, start_offset, + options|g_notempty, use_offsets, use_size_offsets, + PCRE_EXTRA_MATCH_LIMIT_RECURSION, &(extra->match_limit_recursion), + PCRE_ERROR_RECURSIONLIMIT, "match() recursion"); + } + + /* If callout_data is set, use the interface with additional data */ + + else if (callout_data_set) + { + if (extra == NULL) + { + extra = (pcre_extra *)malloc(sizeof(pcre_extra)); + extra->flags = 0; + } + extra->flags |= PCRE_EXTRA_CALLOUT_DATA; + extra->callout_data = &callout_data; + PCRE_EXEC(count, re, extra, bptr, len, start_offset, + options | g_notempty, use_offsets, use_size_offsets); + extra->flags &= ~PCRE_EXTRA_CALLOUT_DATA; + } + + /* The normal case is just to do the match once, with the default + value of match_limit. */ + +#if !defined NODFA + else if (all_use_dfa || use_dfa) + { + if (dfa_workspace == NULL) + dfa_workspace = (int *)malloc(DFA_WS_DIMENSION*sizeof(int)); + if (dfa_matched++ == 0) + dfa_workspace[0] = -1; /* To catch bad restart */ + PCRE_DFA_EXEC(count, re, extra, bptr, len, start_offset, + (options | g_notempty), use_offsets, use_size_offsets, dfa_workspace, + DFA_WS_DIMENSION); + if (count == 0) + { + fprintf(outfile, "Matched, but offsets vector is too small to show all matches\n"); + count = use_size_offsets/2; + } + } +#endif + + else + { + PCRE_EXEC(count, re, extra, bptr, len, start_offset, + options | g_notempty, use_offsets, use_size_offsets); + if (count == 0) + { + fprintf(outfile, "Matched, but too many substrings\n"); + /* 2 is a special case; match can be returned */ + count = (use_size_offsets == 2)? 1 : use_size_offsets/3; + } + } + + /* Matched */ + + if (count >= 0) + { + int i, maxcount; + void *cnptr, *gnptr; + +#if !defined NODFA + if (all_use_dfa || use_dfa) maxcount = use_size_offsets/2; else +#endif + /* 2 is a special case; match can be returned */ + maxcount = (use_size_offsets == 2)? 1 : use_size_offsets/3; + + /* This is a check against a lunatic return value. */ + + if (count > maxcount) + { + fprintf(outfile, + "** PCRE error: returned count %d is too big for offset size %d\n", + count, use_size_offsets); + count = use_size_offsets/3; + if (do_g || do_G) + { + fprintf(outfile, "** /%c loop abandoned\n", do_g? 'g' : 'G'); + do_g = do_G = FALSE; /* Break g/G loop */ + } + } + + /* do_allcaps requests showing of all captures in the pattern, to check + unset ones at the end. */ + + if (do_allcaps) + { + if (all_use_dfa || use_dfa) + { + fprintf(outfile, "** Show all captures ignored after DFA matching\n"); + } + else + { + if (new_info(re, NULL, PCRE_INFO_CAPTURECOUNT, &count) < 0) + goto SKIP_DATA; + count++; /* Allow for full match */ + if (count * 2 > use_size_offsets) count = use_size_offsets/2; + } + } + + /* Output the captured substrings. Note that, for the matched string, + the use of \K in an assertion can make the start later than the end. */ + + for (i = 0; i < count * 2; i += 2) + { + if (use_offsets[i] < 0) + { + if (use_offsets[i] != -1) + fprintf(outfile, "ERROR: bad negative value %d for offset %d\n", + use_offsets[i], i); + if (use_offsets[i+1] != -1) + fprintf(outfile, "ERROR: bad negative value %d for offset %d\n", + use_offsets[i+1], i+1); + fprintf(outfile, "%2d: \n", i/2); + } + else + { + int start = use_offsets[i]; + int end = use_offsets[i+1]; + + if (start > end) + { + start = use_offsets[i+1]; + end = use_offsets[i]; + fprintf(outfile, "Start of matched string is beyond its end - " + "displaying from end to start.\n"); + } + + fprintf(outfile, "%2d: ", i/2); + PCHARSV(bptr, start, end - start, outfile); + if (verify_jit && jit_was_used) fprintf(outfile, " (JIT)"); + fprintf(outfile, "\n"); + + /* Note: don't use the start/end variables here because we want to + show the text from what is reported as the end. */ + + if (do_showcaprest || (i == 0 && do_showrest)) + { + fprintf(outfile, "%2d+ ", i/2); + PCHARSV(bptr, use_offsets[i+1], len - use_offsets[i+1], + outfile); + fprintf(outfile, "\n"); + } + } + } + + if (markptr != NULL) + { + fprintf(outfile, "MK: "); + PCHARSV(markptr, 0, -1, outfile); + fprintf(outfile, "\n"); + } + + for (i = 0; i < 32; i++) + { + if ((copystrings & (1U << i)) != 0) + { + int rc; + char copybuffer[256]; + PCRE_COPY_SUBSTRING(rc, bptr, use_offsets, count, i, + copybuffer, sizeof(copybuffer)); + if (rc < 0) + fprintf(outfile, "copy substring %d failed %d\n", i, rc); + else + { + fprintf(outfile, "%2dC ", i); + PCHARSV(copybuffer, 0, rc, outfile); + fprintf(outfile, " (%d)\n", rc); + } + } + } + + cnptr = copynames; + for (;;) + { + int rc; + char copybuffer[256]; + +#ifdef SUPPORT_PCRE32 + if (pcre_mode == PCRE32_MODE) + { + if (*(pcre_uint32 *)cnptr == 0) break; + } +#endif +#ifdef SUPPORT_PCRE16 + if (pcre_mode == PCRE16_MODE) + { + if (*(pcre_uint16 *)cnptr == 0) break; + } +#endif +#ifdef SUPPORT_PCRE8 + if (pcre_mode == PCRE8_MODE) + { + if (*(pcre_uint8 *)cnptr == 0) break; + } +#endif + + PCRE_COPY_NAMED_SUBSTRING(rc, re, bptr, use_offsets, count, + cnptr, copybuffer, sizeof(copybuffer)); + + if (rc < 0) + { + fprintf(outfile, "copy substring "); + PCHARSV(cnptr, 0, -1, outfile); + fprintf(outfile, " failed %d\n", rc); + } + else + { + fprintf(outfile, " C "); + PCHARSV(copybuffer, 0, rc, outfile); + fprintf(outfile, " (%d) ", rc); + PCHARSV(cnptr, 0, -1, outfile); + putc('\n', outfile); + } + + cnptr = (char *)cnptr + (STRLEN(cnptr) + 1) * CHAR_SIZE; + } + + for (i = 0; i < 32; i++) + { + if ((getstrings & (1U << i)) != 0) + { + int rc; + const char *substring; + PCRE_GET_SUBSTRING(rc, bptr, use_offsets, count, i, &substring); + if (rc < 0) + fprintf(outfile, "get substring %d failed %d\n", i, rc); + else + { + fprintf(outfile, "%2dG ", i); + PCHARSV(substring, 0, rc, outfile); + fprintf(outfile, " (%d)\n", rc); + PCRE_FREE_SUBSTRING(substring); + } + } + } + + gnptr = getnames; + for (;;) + { + int rc; + const char *substring; + +#ifdef SUPPORT_PCRE32 + if (pcre_mode == PCRE32_MODE) + { + if (*(pcre_uint32 *)gnptr == 0) break; + } +#endif +#ifdef SUPPORT_PCRE16 + if (pcre_mode == PCRE16_MODE) + { + if (*(pcre_uint16 *)gnptr == 0) break; + } +#endif +#ifdef SUPPORT_PCRE8 + if (pcre_mode == PCRE8_MODE) + { + if (*(pcre_uint8 *)gnptr == 0) break; + } +#endif + + PCRE_GET_NAMED_SUBSTRING(rc, re, bptr, use_offsets, count, + gnptr, &substring); + if (rc < 0) + { + fprintf(outfile, "get substring "); + PCHARSV(gnptr, 0, -1, outfile); + fprintf(outfile, " failed %d\n", rc); + } + else + { + fprintf(outfile, " G "); + PCHARSV(substring, 0, rc, outfile); + fprintf(outfile, " (%d) ", rc); + PCHARSV(gnptr, 0, -1, outfile); + PCRE_FREE_SUBSTRING(substring); + putc('\n', outfile); + } + + gnptr = (char *)gnptr + (STRLEN(gnptr) + 1) * CHAR_SIZE; + } + + if (getlist) + { + int rc; + const char **stringlist; + PCRE_GET_SUBSTRING_LIST(rc, bptr, use_offsets, count, &stringlist); + if (rc < 0) + fprintf(outfile, "get substring list failed %d\n", rc); + else + { + for (i = 0; i < count; i++) + { + fprintf(outfile, "%2dL ", i); + PCHARSV(stringlist[i], 0, -1, outfile); + putc('\n', outfile); + } + if (stringlist[i] != NULL) + fprintf(outfile, "string list not terminated by NULL\n"); + PCRE_FREE_SUBSTRING_LIST(stringlist); + } + } + } + + /* There was a partial match. If the bumpalong point is not the same as + the first inspected character, show the offset explicitly. */ + + else if (count == PCRE_ERROR_PARTIAL) + { + fprintf(outfile, "Partial match"); + if (use_size_offsets > 2 && use_offsets[0] != use_offsets[2]) + fprintf(outfile, " at offset %d", use_offsets[2]); + if (markptr != NULL) + { + fprintf(outfile, ", mark="); + PCHARSV(markptr, 0, -1, outfile); + } + if (use_size_offsets > 1) + { + fprintf(outfile, ": "); + PCHARSV(bptr, use_offsets[0], use_offsets[1] - use_offsets[0], + outfile); + } + if (verify_jit && jit_was_used) fprintf(outfile, " (JIT)"); + fprintf(outfile, "\n"); + break; /* Out of the /g loop */ + } + + /* Failed to match. If this is a /g or /G loop and we previously set + g_notempty after a null match, this is not necessarily the end. We want + to advance the start offset, and continue. We won't be at the end of the + string - that was checked before setting g_notempty. + + Complication arises in the case when the newline convention is "any", + "crlf", or "anycrlf". If the previous match was at the end of a line + terminated by CRLF, an advance of one character just passes the \r, + whereas we should prefer the longer newline sequence, as does the code in + pcre_exec(). Fudge the offset value to achieve this. We check for a + newline setting in the pattern; if none was set, use PCRE_CONFIG() to + find the default. + + Otherwise, in the case of UTF-8 matching, the advance must be one + character, not one byte. */ + + else + { + if (g_notempty != 0) + { + int onechar = 1; + unsigned int obits = REAL_PCRE_OPTIONS(re); + use_offsets[0] = start_offset; + if ((obits & PCRE_NEWLINE_BITS) == 0) + { + int d; + (void)PCRE_CONFIG(PCRE_CONFIG_NEWLINE, &d); + /* Note that these values are always the ASCII ones, even in + EBCDIC environments. CR = 13, NL = 10. */ + obits = (d == 13)? PCRE_NEWLINE_CR : + (d == 10)? PCRE_NEWLINE_LF : + (d == (13<<8 | 10))? PCRE_NEWLINE_CRLF : + (d == -2)? PCRE_NEWLINE_ANYCRLF : + (d == -1)? PCRE_NEWLINE_ANY : 0; + } + if (((obits & PCRE_NEWLINE_BITS) == PCRE_NEWLINE_ANY || + (obits & PCRE_NEWLINE_BITS) == PCRE_NEWLINE_CRLF || + (obits & PCRE_NEWLINE_BITS) == PCRE_NEWLINE_ANYCRLF) + && + start_offset < len - 1 && ( +#ifdef SUPPORT_PCRE8 + (pcre_mode == PCRE8_MODE && + bptr[start_offset] == '\r' && + bptr[start_offset + 1] == '\n') || +#endif +#ifdef SUPPORT_PCRE16 + (pcre_mode == PCRE16_MODE && + ((PCRE_SPTR16)bptr)[start_offset] == '\r' && + ((PCRE_SPTR16)bptr)[start_offset + 1] == '\n') || +#endif +#ifdef SUPPORT_PCRE32 + (pcre_mode == PCRE32_MODE && + ((PCRE_SPTR32)bptr)[start_offset] == '\r' && + ((PCRE_SPTR32)bptr)[start_offset + 1] == '\n') || +#endif + 0)) + onechar++; + else if (use_utf) + { + while (start_offset + onechar < len) + { + if ((bptr[start_offset+onechar] & 0xc0) != 0x80) break; + onechar++; + } + } + use_offsets[1] = start_offset + onechar; + } + else + { + switch(count) + { + case PCRE_ERROR_NOMATCH: + if (gmatched == 0) + { + if (markptr == NULL) + { + fprintf(outfile, "No match"); + } + else + { + fprintf(outfile, "No match, mark = "); + PCHARSV(markptr, 0, -1, outfile); + } + if (verify_jit && jit_was_used) fprintf(outfile, " (JIT)"); + putc('\n', outfile); + } + break; + + case PCRE_ERROR_BADUTF8: + case PCRE_ERROR_SHORTUTF8: + fprintf(outfile, "Error %d (%s UTF-%d string)", count, + (count == PCRE_ERROR_BADUTF8)? "bad" : "short", + 8 * CHAR_SIZE); + if (use_size_offsets >= 2) + fprintf(outfile, " offset=%d reason=%d", use_offsets[0], + use_offsets[1]); + fprintf(outfile, "\n"); + break; + + case PCRE_ERROR_BADUTF8_OFFSET: + fprintf(outfile, "Error %d (bad UTF-%d offset)\n", count, + 8 * CHAR_SIZE); + break; + + default: + if (count < 0 && + (-count) < (int)(sizeof(errtexts)/sizeof(const char *))) + fprintf(outfile, "Error %d (%s)\n", count, errtexts[-count]); + else + fprintf(outfile, "Error %d (Unexpected value)\n", count); + break; + } + + break; /* Out of the /g loop */ + } + } + + /* If not /g or /G we are done */ + + if (!do_g && !do_G) break; + + if (use_offsets == NULL) + { + fprintf(outfile, "Cannot do global matching without an ovector\n"); + break; + } + + if (use_size_offsets < 2) + { + fprintf(outfile, "Cannot do global matching with an ovector size < 2\n"); + break; + } + + /* If we have matched an empty string, first check to see if we are at + the end of the subject. If so, the /g loop is over. Otherwise, mimic what + Perl's /g options does. This turns out to be rather cunning. First we set + PCRE_NOTEMPTY_ATSTART and PCRE_ANCHORED and try the match again at the + same point. If this fails (picked up above) we advance to the next + character. */ + + g_notempty = 0; + + if (use_offsets[0] == use_offsets[1]) + { + if (use_offsets[0] == len) break; + g_notempty = PCRE_NOTEMPTY_ATSTART | PCRE_ANCHORED; + } + + /* For /g, update the start offset, leaving the rest alone. There is a + tricky case when \K is used in a positive lookbehind assertion. This can + cause the end of the match to be less than or equal to the start offset. + In this case we restart at one past the start offset. This may return the + same match if the original start offset was bumped along during the + match, but eventually the new start offset will hit the actual start + offset. (In PCRE2 the true start offset is available, and this can be + done better. It is not worth doing more than making sure we do not loop + at this stage in the life of PCRE1.) */ + + if (do_g) + { + if (g_notempty == 0 && use_offsets[1] <= start_offset) + { + if (start_offset >= len) break; /* End of subject */ + start_offset++; + if (use_utf) + { + while (start_offset < len) + { + if ((bptr[start_offset] & 0xc0) != 0x80) break; + start_offset++; + } + } + } + else start_offset = use_offsets[1]; + } + + /* For /G, update the pointer and length */ + + else + { + bptr += use_offsets[1] * CHAR_SIZE; + len -= use_offsets[1]; + } + } /* End of loop for /g and /G */ + + NEXT_DATA: continue; + } /* End of loop for data lines */ + + CONTINUE: + +#if !defined NOPOSIX + if ((posix || do_posix) && preg.re_pcre != 0) regfree(&preg); +#endif + + if (re != NULL) new_free(re); + if (extra != NULL) + { + PCRE_FREE_STUDY(extra); + } + if (locale_set) + { + new_free((void *)tables); + setlocale(LC_CTYPE, "C"); + locale_set = 0; + } + if (jit_stack != NULL) + { + PCRE_JIT_STACK_FREE(jit_stack); + jit_stack = NULL; + } + } + +if (infile == stdin) fprintf(outfile, "\n"); + +if (showtotaltimes) + { + fprintf(outfile, "--------------------------------------\n"); + if (timeit > 0) + { + fprintf(outfile, "Total compile time %.4f milliseconds\n", + (((double)total_compile_time * 1000.0) / (double)timeit) / + (double)CLOCKS_PER_SEC); + fprintf(outfile, "Total study time %.4f milliseconds\n", + (((double)total_study_time * 1000.0) / (double)timeit) / + (double)CLOCKS_PER_SEC); + } + fprintf(outfile, "Total execute time %.4f milliseconds\n", + (((double)total_match_time * 1000.0) / (double)timeitm) / + (double)CLOCKS_PER_SEC); + } + +EXIT: + +if (infile != NULL && infile != stdin) fclose(infile); +if (outfile != NULL && outfile != stdout) fclose(outfile); + +free(buffer); +free(dbuffer); +free(pbuffer); +free(offsets); + +#ifdef SUPPORT_PCRE16 +if (buffer16 != NULL) free(buffer16); +#endif +#ifdef SUPPORT_PCRE32 +if (buffer32 != NULL) free(buffer32); +#endif + +#if !defined NODFA +if (dfa_workspace != NULL) + free(dfa_workspace); +#endif + +#if defined(__VMS) + yield = SS$_NORMAL; /* Return values via DCL symbols */ +#endif + +return yield; +} + +/* End of pcretest.c */ + diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/perltest.pl b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/perltest.pl new file mode 100755 index 000000000..29b808b52 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/perltest.pl @@ -0,0 +1,242 @@ +#! /usr/bin/env perl + +# Program for testing regular expressions with perl to check that PCRE handles +# them the same. This version needs to have "use utf8" at the start for running +# the UTF-8 tests, but *not* for the other tests. The only way I've found for +# doing this is to cat this line in explicitly in the RunPerlTest script. I've +# also used this method to supply "require Encode" for the UTF-8 tests, so that +# the main test will still run where Encode is not installed. + +#use utf8; +#require Encode; + +# Function for turning a string into a string of printing chars. + +sub pchars { +my($t) = ""; + +if ($utf8) + { + @p = unpack('U*', $_[0]); + foreach $c (@p) + { + if ($c >= 32 && $c < 127) { $t .= chr $c; } + else { $t .= sprintf("\\x{%02x}", $c); + } + } + } +else + { + foreach $c (split(//, $_[0])) + { + if (ord $c >= 32 && ord $c < 127) { $t .= $c; } + else { $t .= sprintf("\\x%02x", ord $c); } + } + } + +$t; +} + + +# Read lines from named file or stdin and write to named file or stdout; lines +# consist of a regular expression, in delimiters and optionally followed by +# options, followed by a set of test data, terminated by an empty line. + +# Sort out the input and output files + +if (@ARGV > 0) + { + open(INFILE, "<$ARGV[0]") || die "Failed to open $ARGV[0]\n"; + $infile = "INFILE"; + } +else { $infile = "STDIN"; } + +if (@ARGV > 1) + { + open(OUTFILE, ">$ARGV[1]") || die "Failed to open $ARGV[1]\n"; + $outfile = "OUTFILE"; + } +else { $outfile = "STDOUT"; } + +printf($outfile "Perl $] Regular Expressions\n\n"); + +# Main loop + +NEXT_RE: +for (;;) + { + printf " re> " if $infile eq "STDIN"; + last if ! ($_ = <$infile>); + printf $outfile "$_" if $infile ne "STDIN"; + next if ($_ =~ /^\s*$/ || $_ =~ /^< forbid/); + + $pattern = $_; + + while ($pattern !~ /^\s*(.).*\1/s) + { + printf " > " if $infile eq "STDIN"; + last if ! ($_ = <$infile>); + printf $outfile "$_" if $infile ne "STDIN"; + $pattern .= $_; + } + + chomp($pattern); + $pattern =~ s/\s+$//; + + # The private /+ modifier means "print $' afterwards". + + $showrest = ($pattern =~ s/\+(?=[a-zA-Z]*$)//); + + # A doubled version is used by pcretest to print remainders after captures + + $pattern =~ s/\+(?=[a-zA-Z]*$)//; + + # Remove /8 from a UTF-8 pattern. + + $utf8 = $pattern =~ s/8(?=[a-zA-Z]*$)//; + + # Remove /J from a pattern with duplicate names. + + $pattern =~ s/J(?=[a-zA-Z]*$)//; + + # Remove /K from a pattern (asks pcretest to check MARK data) */ + + $pattern =~ s/K(?=[a-zA-Z]*$)//; + + # /W asks pcretest to set PCRE_UCP; change this to /u for Perl + + $pattern =~ s/W(?=[a-zA-Z]*$)/u/; + + # Remove /S or /SS from a pattern (asks pcretest to study or not to study) + + $pattern =~ s/S(?=[a-zA-Z]*$)//g; + + # Remove /Y and /O from a pattern (disable PCRE optimizations) + + $pattern =~ s/[YO](?=[a-zA-Z]*$)//; + + # Check that the pattern is valid + + eval "\$_ =~ ${pattern}"; + if ($@) + { + printf $outfile "Error: $@"; + if ($infile != "STDIN") + { + for (;;) + { + last if ! ($_ = <$infile>); + last if $_ =~ /^\s*$/; + } + } + next NEXT_RE; + } + + # If the /g modifier is present, we want to put a loop round the matching; + # otherwise just a single "if". + + $cmd = ($pattern =~ /g[a-z]*$/)? "while" : "if"; + + # If the pattern is actually the null string, Perl uses the most recently + # executed (and successfully compiled) regex is used instead. This is a + # nasty trap for the unwary! The PCRE test suite does contain null strings + # in places - if they are allowed through here all sorts of weird and + # unexpected effects happen. To avoid this, we replace such patterns with + # a non-null pattern that has the same effect. + + $pattern = "/(?#)/$2" if ($pattern =~ /^(.)\1(.*)$/); + + # Read data lines and test them + + for (;;) + { + printf "data> " if $infile eq "STDIN"; + last NEXT_RE if ! ($_ = <$infile>); + chomp; + printf $outfile "$_\n" if $infile ne "STDIN"; + + s/\s+$//; # Remove trailing space + s/^\s+//; # Remove leading space + s/\\Y//g; # Remove \Y (pcretest flag to set PCRE_NO_START_OPTIMIZE) + + last if ($_ eq ""); + $x = eval "\"$_\""; # To get escapes processed + + # Empty array for holding results, ensure $REGERROR and $REGMARK are + # unset, then do the matching. + + @subs = (); + + $pushes = "push \@subs,\$&;" . + "push \@subs,\$1;" . + "push \@subs,\$2;" . + "push \@subs,\$3;" . + "push \@subs,\$4;" . + "push \@subs,\$5;" . + "push \@subs,\$6;" . + "push \@subs,\$7;" . + "push \@subs,\$8;" . + "push \@subs,\$9;" . + "push \@subs,\$10;" . + "push \@subs,\$11;" . + "push \@subs,\$12;" . + "push \@subs,\$13;" . + "push \@subs,\$14;" . + "push \@subs,\$15;" . + "push \@subs,\$16;" . + "push \@subs,\$'; }"; + + undef $REGERROR; + undef $REGMARK; + + eval "${cmd} (\$x =~ ${pattern}) {" . $pushes; + + if ($@) + { + printf $outfile "Error: $@\n"; + next NEXT_RE; + } + elsif (scalar(@subs) == 0) + { + printf $outfile "No match"; + if (defined $REGERROR && $REGERROR != 1) + { printf $outfile (", mark = %s", &pchars($REGERROR)); } + printf $outfile "\n"; + } + else + { + while (scalar(@subs) != 0) + { + printf $outfile (" 0: %s\n", &pchars($subs[0])); + printf $outfile (" 0+ %s\n", &pchars($subs[17])) if $showrest; + $last_printed = 0; + for ($i = 1; $i <= 16; $i++) + { + if (defined $subs[$i]) + { + while ($last_printed++ < $i-1) + { printf $outfile ("%2d: \n", $last_printed); } + printf $outfile ("%2d: %s\n", $i, &pchars($subs[$i])); + $last_printed = $i; + } + } + splice(@subs, 0, 18); + } + + # It seems that $REGMARK is not marked as UTF-8 even when use utf8 is + # set and the input pattern was a UTF-8 string. We can, however, force + # it to be so marked. + + if (defined $REGMARK && $REGMARK != 1) + { + $xx = $REGMARK; + $xx = Encode::decode_utf8($xx) if $utf8; + printf $outfile ("MK: %s\n", &pchars($xx)); + } + } + } + } + +# printf $outfile "\n"; + +# End diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitConfig.h b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitConfig.h new file mode 100755 index 000000000..d54b5e6f5 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitConfig.h @@ -0,0 +1,147 @@ +/* + * Stack-less Just-In-Time compiler + * + * Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _SLJIT_CONFIG_H_ +#define _SLJIT_CONFIG_H_ + +/* --------------------------------------------------------------------- */ +/* Custom defines */ +/* --------------------------------------------------------------------- */ + +/* Put your custom defines here. This empty section will never change + which helps maintaining patches (with diff / patch utilities). */ + +/* --------------------------------------------------------------------- */ +/* Architecture */ +/* --------------------------------------------------------------------- */ + +/* Architecture selection. */ +/* #define SLJIT_CONFIG_X86_32 1 */ +/* #define SLJIT_CONFIG_X86_64 1 */ +/* #define SLJIT_CONFIG_ARM_V5 1 */ +/* #define SLJIT_CONFIG_ARM_V7 1 */ +/* #define SLJIT_CONFIG_ARM_THUMB2 1 */ +/* #define SLJIT_CONFIG_ARM_64 1 */ +/* #define SLJIT_CONFIG_PPC_32 1 */ +/* #define SLJIT_CONFIG_PPC_64 1 */ +/* #define SLJIT_CONFIG_MIPS_32 1 */ +/* #define SLJIT_CONFIG_MIPS_64 1 */ +/* #define SLJIT_CONFIG_SPARC_32 1 */ +/* #define SLJIT_CONFIG_TILEGX 1 */ + +/* #define SLJIT_CONFIG_AUTO 1 */ +/* #define SLJIT_CONFIG_UNSUPPORTED 1 */ + +/* --------------------------------------------------------------------- */ +/* Utilities */ +/* --------------------------------------------------------------------- */ + +/* Useful for thread-safe compiling of global functions. */ +#ifndef SLJIT_UTIL_GLOBAL_LOCK +/* Enabled by default */ +#define SLJIT_UTIL_GLOBAL_LOCK 1 +#endif + +/* Implements a stack like data structure (by using mmap / VirtualAlloc). */ +#ifndef SLJIT_UTIL_STACK +/* Enabled by default */ +#define SLJIT_UTIL_STACK 1 +#endif + +/* Single threaded application. Does not require any locks. */ +#ifndef SLJIT_SINGLE_THREADED +/* Disabled by default. */ +#define SLJIT_SINGLE_THREADED 0 +#endif + +/* --------------------------------------------------------------------- */ +/* Configuration */ +/* --------------------------------------------------------------------- */ + +/* If SLJIT_STD_MACROS_DEFINED is not defined, the application should + define SLJIT_MALLOC, SLJIT_FREE, SLJIT_MEMCPY, and NULL. */ +#ifndef SLJIT_STD_MACROS_DEFINED +/* Disabled by default. */ +#define SLJIT_STD_MACROS_DEFINED 0 +#endif + +/* Executable code allocation: + If SLJIT_EXECUTABLE_ALLOCATOR is not defined, the application should + define SLJIT_MALLOC_EXEC, SLJIT_FREE_EXEC, and SLJIT_EXEC_OFFSET. */ +#ifndef SLJIT_EXECUTABLE_ALLOCATOR +/* Enabled by default. */ +#define SLJIT_EXECUTABLE_ALLOCATOR 1 + +/* When SLJIT_PROT_EXECUTABLE_ALLOCATOR is enabled SLJIT uses + an allocator which does not set writable and executable + permission flags at the same time. The trade-of is increased + memory consumption and disabled dynamic code modifications. */ +#ifndef SLJIT_PROT_EXECUTABLE_ALLOCATOR +/* Disabled by default. */ +#define SLJIT_PROT_EXECUTABLE_ALLOCATOR 0 +#endif + +#endif + +/* Force cdecl calling convention even if a better calling + convention (e.g. fastcall) is supported by the C compiler. + If this option is disabled (this is the default), functions + called from JIT should be defined with SLJIT_FUNC attribute. + Standard C functions can still be called by using the + SLJIT_CALL_CDECL jump type. */ +#ifndef SLJIT_USE_CDECL_CALLING_CONVENTION +/* Disabled by default */ +#define SLJIT_USE_CDECL_CALLING_CONVENTION 0 +#endif + +/* Return with error when an invalid argument is passed. */ +#ifndef SLJIT_ARGUMENT_CHECKS +/* Disabled by default */ +#define SLJIT_ARGUMENT_CHECKS 0 +#endif + +/* Debug checks (assertions, etc.). */ +#ifndef SLJIT_DEBUG +/* Enabled by default */ +#define SLJIT_DEBUG 1 +#endif + +/* Verbose operations. */ +#ifndef SLJIT_VERBOSE +/* Enabled by default */ +#define SLJIT_VERBOSE 1 +#endif + +/* + SLJIT_IS_FPU_AVAILABLE + The availability of the FPU can be controlled by SLJIT_IS_FPU_AVAILABLE. + zero value - FPU is NOT present. + nonzero value - FPU is present. +*/ + +/* For further configurations, see the beginning of sljitConfigInternal.h */ + +#endif diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitConfigInternal.h b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitConfigInternal.h new file mode 100755 index 000000000..acba9da4b --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitConfigInternal.h @@ -0,0 +1,745 @@ +/* + * Stack-less Just-In-Time compiler + * + * Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _SLJIT_CONFIG_INTERNAL_H_ +#define _SLJIT_CONFIG_INTERNAL_H_ + +/* + SLJIT defines the following architecture dependent types and macros: + + Types: + sljit_s8, sljit_u8 : signed and unsigned 8 bit integer type + sljit_s16, sljit_u16 : signed and unsigned 16 bit integer type + sljit_s32, sljit_u32 : signed and unsigned 32 bit integer type + sljit_sw, sljit_uw : signed and unsigned machine word, enough to store a pointer + sljit_p : unsgined pointer value (usually the same as sljit_uw, but + some 64 bit ABIs may use 32 bit pointers) + sljit_f32 : 32 bit single precision floating point value + sljit_f64 : 64 bit double precision floating point value + + Macros for feature detection (boolean): + SLJIT_32BIT_ARCHITECTURE : 32 bit architecture + SLJIT_64BIT_ARCHITECTURE : 64 bit architecture + SLJIT_LITTLE_ENDIAN : little endian architecture + SLJIT_BIG_ENDIAN : big endian architecture + SLJIT_UNALIGNED : allows unaligned memory accesses for non-fpu operations (only!) + SLJIT_INDIRECT_CALL : see SLJIT_FUNC_OFFSET() for more information + + Constants: + SLJIT_NUMBER_OF_REGISTERS : number of available registers + SLJIT_NUMBER_OF_SCRATCH_REGISTERS : number of available scratch registers + SLJIT_NUMBER_OF_SAVED_REGISTERS : number of available saved registers + SLJIT_NUMBER_OF_FLOAT_REGISTERS : number of available floating point registers + SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS : number of available floating point scratch registers + SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS : number of available floating point saved registers + SLJIT_WORD_SHIFT : the shift required to apply when accessing a sljit_sw/sljit_uw array by index + SLJIT_F32_SHIFT : the shift required to apply when accessing + a single precision floating point array by index + SLJIT_F64_SHIFT : the shift required to apply when accessing + a double precision floating point array by index + SLJIT_PREF_SHIFT_REG : x86 systems prefers ecx for shifting by register + the scratch register index of ecx is stored in this variable + SLJIT_LOCALS_OFFSET : local space starting offset (SLJIT_SP + SLJIT_LOCALS_OFFSET) + SLJIT_RETURN_ADDRESS_OFFSET : a return instruction always adds this offset to the return address + + Other macros: + SLJIT_FUNC : calling convention attribute for both calling JIT from C and C calling back from JIT + SLJIT_W(number) : defining 64 bit constants on 64 bit architectures (compiler independent helper) +*/ + +/*****************/ +/* Sanity check. */ +/*****************/ + +#if !((defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) \ + || (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) \ + || (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) \ + || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) \ + || (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) \ + || (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \ + || (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) \ + || (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) \ + || (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) \ + || (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) \ + || (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) \ + || (defined SLJIT_CONFIG_TILEGX && SLJIT_CONFIG_TILEGX) \ + || (defined SLJIT_CONFIG_AUTO && SLJIT_CONFIG_AUTO) \ + || (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)) +#error "An architecture must be selected" +#endif + +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) \ + + (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) \ + + (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) \ + + (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) \ + + (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) \ + + (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \ + + (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) \ + + (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) \ + + (defined SLJIT_CONFIG_TILEGX && SLJIT_CONFIG_TILEGX) \ + + (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) \ + + (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) \ + + (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) \ + + (defined SLJIT_CONFIG_AUTO && SLJIT_CONFIG_AUTO) \ + + (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED) >= 2 +#error "Multiple architectures are selected" +#endif + +/********************************************************/ +/* Automatic CPU detection (requires compiler support). */ +/********************************************************/ + +#if (defined SLJIT_CONFIG_AUTO && SLJIT_CONFIG_AUTO) + +#ifndef _WIN32 + +#if defined(__i386__) || defined(__i386) +#define SLJIT_CONFIG_X86_32 1 +#elif defined(__x86_64__) +#define SLJIT_CONFIG_X86_64 1 +#elif defined(__arm__) || defined(__ARM__) +#ifdef __thumb2__ +#define SLJIT_CONFIG_ARM_THUMB2 1 +#elif defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) +#define SLJIT_CONFIG_ARM_V7 1 +#else +#define SLJIT_CONFIG_ARM_V5 1 +#endif +#elif defined (__aarch64__) +#define SLJIT_CONFIG_ARM_64 1 +#elif defined(__ppc64__) || defined(__powerpc64__) || defined(_ARCH_PPC64) || (defined(_POWER) && defined(__64BIT__)) +#define SLJIT_CONFIG_PPC_64 1 +#elif defined(__ppc__) || defined(__powerpc__) || defined(_ARCH_PPC) || defined(_ARCH_PWR) || defined(_ARCH_PWR2) || defined(_POWER) +#define SLJIT_CONFIG_PPC_32 1 +#elif defined(__mips__) && !defined(_LP64) +#define SLJIT_CONFIG_MIPS_32 1 +#elif defined(__mips64) +#define SLJIT_CONFIG_MIPS_64 1 +#elif defined(__sparc__) || defined(__sparc) +#define SLJIT_CONFIG_SPARC_32 1 +#elif defined(__tilegx__) +#define SLJIT_CONFIG_TILEGX 1 +#else +/* Unsupported architecture */ +#define SLJIT_CONFIG_UNSUPPORTED 1 +#endif + +#else /* _WIN32 */ + +#if defined(_M_X64) || defined(__x86_64__) +#define SLJIT_CONFIG_X86_64 1 +#elif (defined(_M_ARM) && _M_ARM >= 7 && defined(_M_ARMT)) || defined(__thumb2__) +#define SLJIT_CONFIG_ARM_THUMB2 1 +#elif (defined(_M_ARM) && _M_ARM >= 7) +#define SLJIT_CONFIG_ARM_V7 1 +#elif defined(_ARM_) +#define SLJIT_CONFIG_ARM_V5 1 +#elif defined(_M_ARM64) || defined(__aarch64__) +#define SLJIT_CONFIG_ARM_64 1 +#else +#define SLJIT_CONFIG_X86_32 1 +#endif + +#endif /* !_WIN32 */ +#endif /* SLJIT_CONFIG_AUTO */ + +#if (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED) +#undef SLJIT_EXECUTABLE_ALLOCATOR +#endif + +/******************************/ +/* CPU family type detection. */ +/******************************/ + +#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) \ + || (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) +#define SLJIT_CONFIG_ARM_32 1 +#endif + +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) || (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) +#define SLJIT_CONFIG_X86 1 +#elif (defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32) || (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) +#define SLJIT_CONFIG_ARM 1 +#elif (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) || (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) +#define SLJIT_CONFIG_PPC 1 +#elif (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) || (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) +#define SLJIT_CONFIG_MIPS 1 +#elif (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) || (defined SLJIT_CONFIG_SPARC_64 && SLJIT_CONFIG_SPARC_64) +#define SLJIT_CONFIG_SPARC 1 +#endif + +/**********************************/ +/* External function definitions. */ +/**********************************/ + +/* General macros: + Note: SLJIT is designed to be independent from them as possible. + + In release mode (SLJIT_DEBUG is not defined) only the following + external functions are needed: +*/ + +#ifndef SLJIT_MALLOC +#define SLJIT_MALLOC(size, allocator_data) malloc(size) +#endif + +#ifndef SLJIT_FREE +#define SLJIT_FREE(ptr, allocator_data) free(ptr) +#endif + +#ifndef SLJIT_MEMCPY +#define SLJIT_MEMCPY(dest, src, len) memcpy(dest, src, len) +#endif + +#ifndef SLJIT_MEMMOVE +#define SLJIT_MEMMOVE(dest, src, len) memmove(dest, src, len) +#endif + +#ifndef SLJIT_ZEROMEM +#define SLJIT_ZEROMEM(dest, len) memset(dest, 0, len) +#endif + +/***************************/ +/* Compiler helper macros. */ +/***************************/ + +#if !defined(SLJIT_LIKELY) && !defined(SLJIT_UNLIKELY) + +#if defined(__GNUC__) && (__GNUC__ >= 3) +#define SLJIT_LIKELY(x) __builtin_expect((x), 1) +#define SLJIT_UNLIKELY(x) __builtin_expect((x), 0) +#else +#define SLJIT_LIKELY(x) (x) +#define SLJIT_UNLIKELY(x) (x) +#endif + +#endif /* !defined(SLJIT_LIKELY) && !defined(SLJIT_UNLIKELY) */ + +#ifndef SLJIT_INLINE +/* Inline functions. Some old compilers do not support them. */ +#if defined(__SUNPRO_C) && __SUNPRO_C <= 0x510 +#define SLJIT_INLINE +#else +#define SLJIT_INLINE __inline +#endif +#endif /* !SLJIT_INLINE */ + +#ifndef SLJIT_NOINLINE +/* Not inline functions. */ +#if defined(__GNUC__) +#define SLJIT_NOINLINE __attribute__ ((noinline)) +#else +#define SLJIT_NOINLINE +#endif +#endif /* !SLJIT_INLINE */ + +#ifndef SLJIT_UNUSED_ARG +/* Unused arguments. */ +#define SLJIT_UNUSED_ARG(arg) (void)arg +#endif + +/*********************************/ +/* Type of public API functions. */ +/*********************************/ + +#if (defined SLJIT_CONFIG_STATIC && SLJIT_CONFIG_STATIC) +/* Static ABI functions. For all-in-one programs. */ + +#if defined(__GNUC__) +/* Disable unused warnings in gcc. */ +#define SLJIT_API_FUNC_ATTRIBUTE static __attribute__((unused)) +#else +#define SLJIT_API_FUNC_ATTRIBUTE static +#endif + +#else +#define SLJIT_API_FUNC_ATTRIBUTE +#endif /* (defined SLJIT_CONFIG_STATIC && SLJIT_CONFIG_STATIC) */ + +/****************************/ +/* Instruction cache flush. */ +/****************************/ + +#if (!defined SLJIT_CACHE_FLUSH && defined __has_builtin) +#if __has_builtin(__builtin___clear_cache) + +#define SLJIT_CACHE_FLUSH(from, to) \ + __builtin___clear_cache((char*)from, (char*)to) + +#endif /* __has_builtin(__builtin___clear_cache) */ +#endif /* (!defined SLJIT_CACHE_FLUSH && defined __has_builtin) */ + +#ifndef SLJIT_CACHE_FLUSH + +#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) + +/* Not required to implement on archs with unified caches. */ +#define SLJIT_CACHE_FLUSH(from, to) + +#elif defined __APPLE__ + +/* Supported by all macs since Mac OS 10.5. + However, it does not work on non-jailbroken iOS devices, + although the compilation is successful. */ + +#define SLJIT_CACHE_FLUSH(from, to) \ + sys_icache_invalidate((char*)(from), (char*)(to) - (char*)(from)) + +#elif (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC) + +/* The __clear_cache() implementation of GCC is a dummy function on PowerPC. */ +#define SLJIT_CACHE_FLUSH(from, to) \ + ppc_cache_flush((from), (to)) +#define SLJIT_CACHE_FLUSH_OWN_IMPL 1 + +#elif (defined(__GNUC__) && (__GNUC__ >= 5 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))) + +#define SLJIT_CACHE_FLUSH(from, to) \ + __builtin___clear_cache((char*)from, (char*)to) + +#elif defined __ANDROID__ + +/* Android lacks __clear_cache; instead, cacheflush should be used. */ + +#define SLJIT_CACHE_FLUSH(from, to) \ + cacheflush((long)(from), (long)(to), 0) + +#elif (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) + +/* The __clear_cache() implementation of GCC is a dummy function on Sparc. */ +#define SLJIT_CACHE_FLUSH(from, to) \ + sparc_cache_flush((from), (to)) +#define SLJIT_CACHE_FLUSH_OWN_IMPL 1 + +#elif defined _WIN32 + +#define SLJIT_CACHE_FLUSH(from, to) \ + FlushInstructionCache(GetCurrentProcess(), (char*)(from), (char*)(to) - (char*)(from)) + +#else + +/* Calls __ARM_NR_cacheflush on ARM-Linux. */ +#define SLJIT_CACHE_FLUSH(from, to) \ + __clear_cache((char*)(from), (char*)(to)) + +#endif + +#endif /* !SLJIT_CACHE_FLUSH */ + +/******************************************************/ +/* Integer and floating point type definitions. */ +/******************************************************/ + +/* 8 bit byte type. */ +typedef unsigned char sljit_u8; +typedef signed char sljit_s8; + +/* 16 bit half-word type. */ +typedef unsigned short int sljit_u16; +typedef signed short int sljit_s16; + +/* 32 bit integer type. */ +typedef unsigned int sljit_u32; +typedef signed int sljit_s32; + +/* Machine word type. Enough for storing a pointer. + 32 bit for 32 bit machines. + 64 bit for 64 bit machines. */ +#if (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED) +/* Just to have something. */ +#define SLJIT_WORD_SHIFT 0 +typedef unsigned long int sljit_uw; +typedef long int sljit_sw; +#elif !(defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) \ + && !(defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \ + && !(defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) \ + && !(defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) \ + && !(defined SLJIT_CONFIG_TILEGX && SLJIT_CONFIG_TILEGX) +#define SLJIT_32BIT_ARCHITECTURE 1 +#define SLJIT_WORD_SHIFT 2 +typedef unsigned int sljit_uw; +typedef int sljit_sw; +#else +#define SLJIT_64BIT_ARCHITECTURE 1 +#define SLJIT_WORD_SHIFT 3 +#ifdef _WIN32 +#ifdef __GNUC__ +/* These types do not require windows.h */ +typedef unsigned long long sljit_uw; +typedef long long sljit_sw; +#else +typedef unsigned __int64 sljit_uw; +typedef __int64 sljit_sw; +#endif +#else /* !_WIN32 */ +typedef unsigned long int sljit_uw; +typedef long int sljit_sw; +#endif /* _WIN32 */ +#endif + +typedef sljit_uw sljit_p; + +/* Floating point types. */ +typedef float sljit_f32; +typedef double sljit_f64; + +/* Shift for pointer sized data. */ +#define SLJIT_POINTER_SHIFT SLJIT_WORD_SHIFT + +/* Shift for double precision sized data. */ +#define SLJIT_F32_SHIFT 2 +#define SLJIT_F64_SHIFT 3 + +#ifndef SLJIT_W + +/* Defining long constants. */ +#if (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED) +#define SLJIT_W(w) (w##l) +#elif (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) +#define SLJIT_W(w) (w##ll) +#else +#define SLJIT_W(w) (w) +#endif + +#endif /* !SLJIT_W */ + +/*************************/ +/* Endianness detection. */ +/*************************/ + +#if !defined(SLJIT_BIG_ENDIAN) && !defined(SLJIT_LITTLE_ENDIAN) + +/* These macros are mostly useful for the applications. */ +#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) \ + || (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) + +#ifdef __LITTLE_ENDIAN__ +#define SLJIT_LITTLE_ENDIAN 1 +#else +#define SLJIT_BIG_ENDIAN 1 +#endif + +#elif (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) \ + || (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) + +#ifdef __MIPSEL__ +#define SLJIT_LITTLE_ENDIAN 1 +#else +#define SLJIT_BIG_ENDIAN 1 +#endif + +#elif (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) + +#define SLJIT_BIG_ENDIAN 1 + +#else +#define SLJIT_LITTLE_ENDIAN 1 +#endif + +#endif /* !defined(SLJIT_BIG_ENDIAN) && !defined(SLJIT_LITTLE_ENDIAN) */ + +/* Sanity check. */ +#if (defined SLJIT_BIG_ENDIAN && SLJIT_BIG_ENDIAN) && (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN) +#error "Exactly one endianness must be selected" +#endif + +#if !(defined SLJIT_BIG_ENDIAN && SLJIT_BIG_ENDIAN) && !(defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN) +#error "Exactly one endianness must be selected" +#endif + +#ifndef SLJIT_UNALIGNED + +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) \ + || (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) \ + || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) \ + || (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) \ + || (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \ + || (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) \ + || (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) +#define SLJIT_UNALIGNED 1 +#endif + +#endif /* !SLJIT_UNALIGNED */ + +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) +/* Auto detect SSE2 support using CPUID. + On 64 bit x86 cpus, sse2 must be present. */ +#define SLJIT_DETECT_SSE2 1 +#endif + +/*****************************************************************************************/ +/* Calling convention of functions generated by SLJIT or called from the generated code. */ +/*****************************************************************************************/ + +#ifndef SLJIT_FUNC + +#if (defined SLJIT_USE_CDECL_CALLING_CONVENTION && SLJIT_USE_CDECL_CALLING_CONVENTION) + +/* Force cdecl. */ +#define SLJIT_FUNC + +#elif (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + +#if defined(__GNUC__) && !defined(__APPLE__) + +#define SLJIT_FUNC __attribute__ ((fastcall)) +#define SLJIT_X86_32_FASTCALL 1 + +#elif defined(_MSC_VER) + +#define SLJIT_FUNC __fastcall +#define SLJIT_X86_32_FASTCALL 1 + +#elif defined(__BORLANDC__) + +#define SLJIT_FUNC __msfastcall +#define SLJIT_X86_32_FASTCALL 1 + +#else /* Unknown compiler. */ + +/* The cdecl attribute is the default. */ +#define SLJIT_FUNC + +#endif + +#else /* Non x86-32 architectures. */ + +#define SLJIT_FUNC + +#endif /* SLJIT_CONFIG_X86_32 */ + +#endif /* !SLJIT_FUNC */ + +#ifndef SLJIT_INDIRECT_CALL +#if ((defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) && (!defined _CALL_ELF || _CALL_ELF == 1)) \ + || ((defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) && defined _AIX) +/* It seems certain ppc compilers use an indirect addressing for functions + which makes things complicated. */ +#define SLJIT_INDIRECT_CALL 1 +#endif +#endif /* SLJIT_INDIRECT_CALL */ + +/* The offset which needs to be substracted from the return address to +determine the next executed instruction after return. */ +#ifndef SLJIT_RETURN_ADDRESS_OFFSET +#if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) +#define SLJIT_RETURN_ADDRESS_OFFSET 8 +#else +#define SLJIT_RETURN_ADDRESS_OFFSET 0 +#endif +#endif /* SLJIT_RETURN_ADDRESS_OFFSET */ + +/***************************************************/ +/* Functions of the built-in executable allocator. */ +/***************************************************/ + +#if (defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR) +SLJIT_API_FUNC_ATTRIBUTE void* sljit_malloc_exec(sljit_uw size); +SLJIT_API_FUNC_ATTRIBUTE void sljit_free_exec(void* ptr); +SLJIT_API_FUNC_ATTRIBUTE void sljit_free_unused_memory_exec(void); +#define SLJIT_MALLOC_EXEC(size) sljit_malloc_exec(size) +#define SLJIT_FREE_EXEC(ptr) sljit_free_exec(ptr) + +#if (defined SLJIT_PROT_EXECUTABLE_ALLOCATOR && SLJIT_PROT_EXECUTABLE_ALLOCATOR) +SLJIT_API_FUNC_ATTRIBUTE sljit_sw sljit_exec_offset(void* ptr); +#define SLJIT_EXEC_OFFSET(ptr) sljit_exec_offset(ptr) +#else +#define SLJIT_EXEC_OFFSET(ptr) 0 +#endif + +#endif + +/**********************************************/ +/* Registers and locals offset determination. */ +/**********************************************/ + +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + +#define SLJIT_NUMBER_OF_REGISTERS 12 +#define SLJIT_NUMBER_OF_SAVED_REGISTERS 9 +#define SLJIT_LOCALS_OFFSET_BASE (compiler->locals_offset) +#define SLJIT_PREF_SHIFT_REG SLJIT_R2 + +#elif (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + +#define SLJIT_NUMBER_OF_REGISTERS 13 +#ifndef _WIN64 +#define SLJIT_NUMBER_OF_SAVED_REGISTERS 6 +#define SLJIT_LOCALS_OFFSET_BASE 0 +#else /* _WIN64 */ +#define SLJIT_NUMBER_OF_SAVED_REGISTERS 8 +#define SLJIT_LOCALS_OFFSET_BASE (compiler->locals_offset) +#endif /* !_WIN64 */ +#define SLJIT_PREF_SHIFT_REG SLJIT_R3 + +#elif (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) + +#define SLJIT_NUMBER_OF_REGISTERS 12 +#define SLJIT_NUMBER_OF_SAVED_REGISTERS 8 +#define SLJIT_LOCALS_OFFSET_BASE 0 + +#elif (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) + +#define SLJIT_NUMBER_OF_REGISTERS 12 +#define SLJIT_NUMBER_OF_SAVED_REGISTERS 8 +#define SLJIT_LOCALS_OFFSET_BASE 0 + +#elif (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) + +#define SLJIT_NUMBER_OF_REGISTERS 26 +#define SLJIT_NUMBER_OF_SAVED_REGISTERS 10 +#define SLJIT_LOCALS_OFFSET_BASE 0 + +#elif (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC) + +#define SLJIT_NUMBER_OF_REGISTERS 23 +#define SLJIT_NUMBER_OF_SAVED_REGISTERS 17 +#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) || (defined _AIX) +#define SLJIT_LOCALS_OFFSET_BASE ((6 + 8) * sizeof(sljit_sw)) +#elif (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) +/* Add +1 for double alignment. */ +#define SLJIT_LOCALS_OFFSET_BASE ((3 + 1) * sizeof(sljit_sw)) +#else +#define SLJIT_LOCALS_OFFSET_BASE (3 * sizeof(sljit_sw)) +#endif /* SLJIT_CONFIG_PPC_64 || _AIX */ + +#elif (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS) + +#define SLJIT_NUMBER_OF_REGISTERS 21 +#define SLJIT_NUMBER_OF_SAVED_REGISTERS 8 +#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) +#define SLJIT_LOCALS_OFFSET_BASE (4 * sizeof(sljit_sw)) +#else +#define SLJIT_LOCALS_OFFSET_BASE 0 +#endif + +#elif (defined SLJIT_CONFIG_SPARC && SLJIT_CONFIG_SPARC) + +#define SLJIT_NUMBER_OF_REGISTERS 18 +#define SLJIT_NUMBER_OF_SAVED_REGISTERS 14 +#if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) +/* saved registers (16), return struct pointer (1), space for 6 argument words (1), + 4th double arg (2), double alignment (1). */ +#define SLJIT_LOCALS_OFFSET_BASE ((16 + 1 + 6 + 2 + 1) * sizeof(sljit_sw)) +#endif + +#elif (defined SLJIT_CONFIG_TILEGX && SLJIT_CONFIG_TILEGX) + +#define SLJIT_NUMBER_OF_REGISTERS 10 +#define SLJIT_NUMBER_OF_SAVED_REGISTERS 5 +#define SLJIT_LOCALS_OFFSET_BASE 0 + +#elif (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED) + +#define SLJIT_NUMBER_OF_REGISTERS 0 +#define SLJIT_NUMBER_OF_SAVED_REGISTERS 0 +#define SLJIT_LOCALS_OFFSET_BASE 0 + +#endif + +#define SLJIT_LOCALS_OFFSET (SLJIT_LOCALS_OFFSET_BASE) + +#define SLJIT_NUMBER_OF_SCRATCH_REGISTERS \ + (SLJIT_NUMBER_OF_REGISTERS - SLJIT_NUMBER_OF_SAVED_REGISTERS) + +#define SLJIT_NUMBER_OF_FLOAT_REGISTERS 6 +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) && (defined _WIN64) +#define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 1 +#else +#define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 0 +#endif + +#define SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS \ + (SLJIT_NUMBER_OF_FLOAT_REGISTERS - SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS) + +/*************************************/ +/* Debug and verbose related macros. */ +/*************************************/ + +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) +#include +#endif + +#if (defined SLJIT_DEBUG && SLJIT_DEBUG) + +#if !defined(SLJIT_ASSERT) || !defined(SLJIT_UNREACHABLE) + +/* SLJIT_HALT_PROCESS must halt the process. */ +#ifndef SLJIT_HALT_PROCESS +#include + +#define SLJIT_HALT_PROCESS() \ + abort(); +#endif /* !SLJIT_HALT_PROCESS */ + +#include + +#endif /* !SLJIT_ASSERT || !SLJIT_UNREACHABLE */ + +/* Feel free to redefine these two macros. */ +#ifndef SLJIT_ASSERT + +#define SLJIT_ASSERT(x) \ + do { \ + if (SLJIT_UNLIKELY(!(x))) { \ + printf("Assertion failed at " __FILE__ ":%d\n", __LINE__); \ + SLJIT_HALT_PROCESS(); \ + } \ + } while (0) + +#endif /* !SLJIT_ASSERT */ + +#ifndef SLJIT_UNREACHABLE + +#define SLJIT_UNREACHABLE() \ + do { \ + printf("Should never been reached " __FILE__ ":%d\n", __LINE__); \ + SLJIT_HALT_PROCESS(); \ + } while (0) + +#endif /* !SLJIT_UNREACHABLE */ + +#else /* (defined SLJIT_DEBUG && SLJIT_DEBUG) */ + +/* Forcing empty, but valid statements. */ +#undef SLJIT_ASSERT +#undef SLJIT_UNREACHABLE + +#define SLJIT_ASSERT(x) \ + do { } while (0) +#define SLJIT_UNREACHABLE() \ + do { } while (0) + +#endif /* (defined SLJIT_DEBUG && SLJIT_DEBUG) */ + +#ifndef SLJIT_COMPILE_ASSERT + +#define SLJIT_COMPILE_ASSERT(x, description) \ + switch(0) { case 0: case ((x) ? 1 : 0): break; } + +#endif /* !SLJIT_COMPILE_ASSERT */ + +#endif diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitExecAllocator.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitExecAllocator.c new file mode 100755 index 000000000..92ddb9491 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitExecAllocator.c @@ -0,0 +1,379 @@ +/* + * Stack-less Just-In-Time compiler + * + * Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + This file contains a simple executable memory allocator + + It is assumed, that executable code blocks are usually medium (or sometimes + large) memory blocks, and the allocator is not too frequently called (less + optimized than other allocators). Thus, using it as a generic allocator is + not suggested. + + How does it work: + Memory is allocated in continuous memory areas called chunks by alloc_chunk() + Chunk format: + [ block ][ block ] ... [ block ][ block terminator ] + + All blocks and the block terminator is started with block_header. The block + header contains the size of the previous and the next block. These sizes + can also contain special values. + Block size: + 0 - The block is a free_block, with a different size member. + 1 - The block is a block terminator. + n - The block is used at the moment, and the value contains its size. + Previous block size: + 0 - This is the first block of the memory chunk. + n - The size of the previous block. + + Using these size values we can go forward or backward on the block chain. + The unused blocks are stored in a chain list pointed by free_blocks. This + list is useful if we need to find a suitable memory area when the allocator + is called. + + When a block is freed, the new free block is connected to its adjacent free + blocks if possible. + + [ free block ][ used block ][ free block ] + and "used block" is freed, the three blocks are connected together: + [ one big free block ] +*/ + +/* --------------------------------------------------------------------- */ +/* System (OS) functions */ +/* --------------------------------------------------------------------- */ + +/* 64 KByte. */ +#define CHUNK_SIZE 0x10000 + +/* + alloc_chunk / free_chunk : + * allocate executable system memory chunks + * the size is always divisible by CHUNK_SIZE + allocator_grab_lock / allocator_release_lock : + * make the allocator thread safe + * can be empty if the OS (or the application) does not support threading + * only the allocator requires this lock, sljit is fully thread safe + as it only uses local variables +*/ + +#ifdef _WIN32 + +static SLJIT_INLINE void* alloc_chunk(sljit_uw size) +{ + return VirtualAlloc(NULL, size, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); +} + +static SLJIT_INLINE void free_chunk(void *chunk, sljit_uw size) +{ + SLJIT_UNUSED_ARG(size); + VirtualFree(chunk, 0, MEM_RELEASE); +} + +#else + +#ifdef __APPLE__ +/* Configures TARGET_OS_OSX when appropriate */ +#include + +#if TARGET_OS_OSX && defined(MAP_JIT) +#include +#endif /* TARGET_OS_OSX && MAP_JIT */ + +#ifdef MAP_JIT + +static SLJIT_INLINE int get_map_jit_flag() +{ +#if TARGET_OS_OSX + /* On macOS systems, returns MAP_JIT if it is defined _and_ we're running on a version + of macOS where it's OK to have more than one JIT block. On non-macOS systems, returns + MAP_JIT if it is defined. */ + static int map_jit_flag = -1; + + /* The following code is thread safe because multiple initialization + sets map_jit_flag to the same value and the code has no side-effects. + Changing the kernel version witout system restart is (very) unlikely. */ + if (map_jit_flag == -1) { + struct utsname name; + + map_jit_flag = 0; + uname(&name); + + /* Kernel version for 10.14.0 (Mojave) */ + if (atoi(name.release) >= 18) { + /* Only use MAP_JIT if a hardened runtime is used, because MAP_JIT is incompatible with fork(). */ + void *ptr = mmap(NULL, getpagesize(), PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); + + if (ptr == MAP_FAILED) { + map_jit_flag = MAP_JIT; + } else { + munmap(ptr, getpagesize()); + } + } + } + + return map_jit_flag; +#else /* !TARGET_OS_OSX */ + return MAP_JIT; +#endif /* TARGET_OS_OSX */ +} + +#endif /* MAP_JIT */ + +#endif /* __APPLE__ */ + +static SLJIT_INLINE void* alloc_chunk(sljit_uw size) +{ + void *retval; + const int prot = PROT_READ | PROT_WRITE | PROT_EXEC; + +#ifdef MAP_ANON + + int flags = MAP_PRIVATE | MAP_ANON; + +#ifdef MAP_JIT + flags |= get_map_jit_flag(); +#endif + + retval = mmap(NULL, size, prot, flags, -1, 0); +#else /* !MAP_ANON */ + if (dev_zero < 0) { + if (open_dev_zero()) + return NULL; + } + retval = mmap(NULL, size, prot, MAP_PRIVATE, dev_zero, 0); +#endif /* MAP_ANON */ + + if (retval == MAP_FAILED) + retval = NULL; + else { + if (mprotect(retval, size, prot) < 0) { + munmap(retval, size); + retval = NULL; + } + } + + return retval; +} + +static SLJIT_INLINE void free_chunk(void *chunk, sljit_uw size) +{ + munmap(chunk, size); +} + +#endif + +/* --------------------------------------------------------------------- */ +/* Common functions */ +/* --------------------------------------------------------------------- */ + +#define CHUNK_MASK (~(CHUNK_SIZE - 1)) + +struct block_header { + sljit_uw size; + sljit_uw prev_size; +}; + +struct free_block { + struct block_header header; + struct free_block *next; + struct free_block *prev; + sljit_uw size; +}; + +#define AS_BLOCK_HEADER(base, offset) \ + ((struct block_header*)(((sljit_u8*)base) + offset)) +#define AS_FREE_BLOCK(base, offset) \ + ((struct free_block*)(((sljit_u8*)base) + offset)) +#define MEM_START(base) ((void*)(((sljit_u8*)base) + sizeof(struct block_header))) +#define ALIGN_SIZE(size) (((size) + sizeof(struct block_header) + 7) & ~7) + +static struct free_block* free_blocks; +static sljit_uw allocated_size; +static sljit_uw total_size; + +static SLJIT_INLINE void sljit_insert_free_block(struct free_block *free_block, sljit_uw size) +{ + free_block->header.size = 0; + free_block->size = size; + + free_block->next = free_blocks; + free_block->prev = NULL; + if (free_blocks) + free_blocks->prev = free_block; + free_blocks = free_block; +} + +static SLJIT_INLINE void sljit_remove_free_block(struct free_block *free_block) +{ + if (free_block->next) + free_block->next->prev = free_block->prev; + + if (free_block->prev) + free_block->prev->next = free_block->next; + else { + SLJIT_ASSERT(free_blocks == free_block); + free_blocks = free_block->next; + } +} + +SLJIT_API_FUNC_ATTRIBUTE void* sljit_malloc_exec(sljit_uw size) +{ + struct block_header *header; + struct block_header *next_header; + struct free_block *free_block; + sljit_uw chunk_size; + + allocator_grab_lock(); + if (size < (64 - sizeof(struct block_header))) + size = (64 - sizeof(struct block_header)); + size = ALIGN_SIZE(size); + + free_block = free_blocks; + while (free_block) { + if (free_block->size >= size) { + chunk_size = free_block->size; + if (chunk_size > size + 64) { + /* We just cut a block from the end of the free block. */ + chunk_size -= size; + free_block->size = chunk_size; + header = AS_BLOCK_HEADER(free_block, chunk_size); + header->prev_size = chunk_size; + AS_BLOCK_HEADER(header, size)->prev_size = size; + } + else { + sljit_remove_free_block(free_block); + header = (struct block_header*)free_block; + size = chunk_size; + } + allocated_size += size; + header->size = size; + allocator_release_lock(); + return MEM_START(header); + } + free_block = free_block->next; + } + + chunk_size = (size + sizeof(struct block_header) + CHUNK_SIZE - 1) & CHUNK_MASK; + header = (struct block_header*)alloc_chunk(chunk_size); + if (!header) { + allocator_release_lock(); + return NULL; + } + + chunk_size -= sizeof(struct block_header); + total_size += chunk_size; + + header->prev_size = 0; + if (chunk_size > size + 64) { + /* Cut the allocated space into a free and a used block. */ + allocated_size += size; + header->size = size; + chunk_size -= size; + + free_block = AS_FREE_BLOCK(header, size); + free_block->header.prev_size = size; + sljit_insert_free_block(free_block, chunk_size); + next_header = AS_BLOCK_HEADER(free_block, chunk_size); + } + else { + /* All space belongs to this allocation. */ + allocated_size += chunk_size; + header->size = chunk_size; + next_header = AS_BLOCK_HEADER(header, chunk_size); + } + next_header->size = 1; + next_header->prev_size = chunk_size; + allocator_release_lock(); + return MEM_START(header); +} + +SLJIT_API_FUNC_ATTRIBUTE void sljit_free_exec(void* ptr) +{ + struct block_header *header; + struct free_block* free_block; + + allocator_grab_lock(); + header = AS_BLOCK_HEADER(ptr, -(sljit_sw)sizeof(struct block_header)); + allocated_size -= header->size; + + /* Connecting free blocks together if possible. */ + + /* If header->prev_size == 0, free_block will equal to header. + In this case, free_block->header.size will be > 0. */ + free_block = AS_FREE_BLOCK(header, -(sljit_sw)header->prev_size); + if (SLJIT_UNLIKELY(!free_block->header.size)) { + free_block->size += header->size; + header = AS_BLOCK_HEADER(free_block, free_block->size); + header->prev_size = free_block->size; + } + else { + free_block = (struct free_block*)header; + sljit_insert_free_block(free_block, header->size); + } + + header = AS_BLOCK_HEADER(free_block, free_block->size); + if (SLJIT_UNLIKELY(!header->size)) { + free_block->size += ((struct free_block*)header)->size; + sljit_remove_free_block((struct free_block*)header); + header = AS_BLOCK_HEADER(free_block, free_block->size); + header->prev_size = free_block->size; + } + + /* The whole chunk is free. */ + if (SLJIT_UNLIKELY(!free_block->header.prev_size && header->size == 1)) { + /* If this block is freed, we still have (allocated_size / 2) free space. */ + if (total_size - free_block->size > (allocated_size * 3 / 2)) { + total_size -= free_block->size; + sljit_remove_free_block(free_block); + free_chunk(free_block, free_block->size + sizeof(struct block_header)); + } + } + + allocator_release_lock(); +} + +SLJIT_API_FUNC_ATTRIBUTE void sljit_free_unused_memory_exec(void) +{ + struct free_block* free_block; + struct free_block* next_free_block; + + allocator_grab_lock(); + + free_block = free_blocks; + while (free_block) { + next_free_block = free_block->next; + if (!free_block->header.prev_size && + AS_BLOCK_HEADER(free_block, free_block->size)->size == 1) { + total_size -= free_block->size; + sljit_remove_free_block(free_block); + free_chunk(free_block, free_block->size + sizeof(struct block_header)); + } + free_block = next_free_block; + } + + SLJIT_ASSERT((total_size && free_blocks) || (!total_size && !free_blocks)); + allocator_release_lock(); +} diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitLir.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitLir.c new file mode 100755 index 000000000..9bab0c3ec --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitLir.c @@ -0,0 +1,2667 @@ +/* + * Stack-less Just-In-Time compiler + * + * Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "sljitLir.h" + +#ifdef _WIN32 + +/* For SLJIT_CACHE_FLUSH, which can expand to FlushInstructionCache. */ +#include + +#endif /* _WIN32 */ + +#if !(defined SLJIT_STD_MACROS_DEFINED && SLJIT_STD_MACROS_DEFINED) + +/* These libraries are needed for the macros below. */ +#include +#include + +#endif /* SLJIT_STD_MACROS_DEFINED */ + +#define CHECK_ERROR() \ + do { \ + if (SLJIT_UNLIKELY(compiler->error)) \ + return compiler->error; \ + } while (0) + +#define CHECK_ERROR_PTR() \ + do { \ + if (SLJIT_UNLIKELY(compiler->error)) \ + return NULL; \ + } while (0) + +#define FAIL_IF(expr) \ + do { \ + if (SLJIT_UNLIKELY(expr)) \ + return compiler->error; \ + } while (0) + +#define PTR_FAIL_IF(expr) \ + do { \ + if (SLJIT_UNLIKELY(expr)) \ + return NULL; \ + } while (0) + +#define FAIL_IF_NULL(ptr) \ + do { \ + if (SLJIT_UNLIKELY(!(ptr))) { \ + compiler->error = SLJIT_ERR_ALLOC_FAILED; \ + return SLJIT_ERR_ALLOC_FAILED; \ + } \ + } while (0) + +#define PTR_FAIL_IF_NULL(ptr) \ + do { \ + if (SLJIT_UNLIKELY(!(ptr))) { \ + compiler->error = SLJIT_ERR_ALLOC_FAILED; \ + return NULL; \ + } \ + } while (0) + +#define PTR_FAIL_WITH_EXEC_IF(ptr) \ + do { \ + if (SLJIT_UNLIKELY(!(ptr))) { \ + compiler->error = SLJIT_ERR_EX_ALLOC_FAILED; \ + return NULL; \ + } \ + } while (0) + +#if !(defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED) + +#define VARIABLE_FLAG_SHIFT (10) +#define VARIABLE_FLAG_MASK (0x3f << VARIABLE_FLAG_SHIFT) +#define GET_FLAG_TYPE(op) ((op) >> VARIABLE_FLAG_SHIFT) + +#define GET_OPCODE(op) \ + ((op) & ~(SLJIT_I32_OP | SLJIT_SET_Z | VARIABLE_FLAG_MASK)) + +#define HAS_FLAGS(op) \ + ((op) & (SLJIT_SET_Z | VARIABLE_FLAG_MASK)) + +#define GET_ALL_FLAGS(op) \ + ((op) & (SLJIT_I32_OP | SLJIT_SET_Z | VARIABLE_FLAG_MASK)) + +#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) +#define TYPE_CAST_NEEDED(op) \ + ((op) >= SLJIT_MOV_U8 && (op) <= SLJIT_MOV_S32) +#else +#define TYPE_CAST_NEEDED(op) \ + ((op) >= SLJIT_MOV_U8 && (op) <= SLJIT_MOV_S16) +#endif + +#define BUF_SIZE 4096 + +#if (defined SLJIT_32BIT_ARCHITECTURE && SLJIT_32BIT_ARCHITECTURE) +#define ABUF_SIZE 2048 +#else +#define ABUF_SIZE 4096 +#endif + +/* Parameter parsing. */ +#define REG_MASK 0x3f +#define OFFS_REG(reg) (((reg) >> 8) & REG_MASK) +#define OFFS_REG_MASK (REG_MASK << 8) +#define TO_OFFS_REG(reg) ((reg) << 8) +/* When reg cannot be unused. */ +#define FAST_IS_REG(reg) ((reg) <= REG_MASK) +/* When reg can be unused. */ +#define SLOW_IS_REG(reg) ((reg) > 0 && (reg) <= REG_MASK) + +/* Mask for argument types. */ +#define SLJIT_DEF_MASK ((1 << SLJIT_DEF_SHIFT) - 1) + +/* Jump flags. */ +#define JUMP_LABEL 0x1 +#define JUMP_ADDR 0x2 +/* SLJIT_REWRITABLE_JUMP is 0x1000. */ + +#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) +# define PATCH_MB 0x4 +# define PATCH_MW 0x8 +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) +# define PATCH_MD 0x10 +#endif +# define TYPE_SHIFT 13 +#endif + +#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) +# define IS_BL 0x4 +# define PATCH_B 0x8 +#endif + +#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) +# define CPOOL_SIZE 512 +#endif + +#if (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) +# define IS_COND 0x04 +# define IS_BL 0x08 + /* conditional + imm8 */ +# define PATCH_TYPE1 0x10 + /* conditional + imm20 */ +# define PATCH_TYPE2 0x20 + /* IT + imm24 */ +# define PATCH_TYPE3 0x30 + /* imm11 */ +# define PATCH_TYPE4 0x40 + /* imm24 */ +# define PATCH_TYPE5 0x50 + /* BL + imm24 */ +# define PATCH_BL 0x60 + /* 0xf00 cc code for branches */ +#endif + +#if (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) +# define IS_COND 0x004 +# define IS_CBZ 0x008 +# define IS_BL 0x010 +# define PATCH_B 0x020 +# define PATCH_COND 0x040 +# define PATCH_ABS48 0x080 +# define PATCH_ABS64 0x100 +#endif + +#if (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC) +# define IS_COND 0x004 +# define IS_CALL 0x008 +# define PATCH_B 0x010 +# define PATCH_ABS_B 0x020 +#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) +# define PATCH_ABS32 0x040 +# define PATCH_ABS48 0x080 +#endif +# define REMOVE_COND 0x100 +#endif + +#if (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS) +# define IS_MOVABLE 0x004 +# define IS_JAL 0x008 +# define IS_CALL 0x010 +# define IS_BIT26_COND 0x020 +# define IS_BIT16_COND 0x040 +# define IS_BIT23_COND 0x080 + +# define IS_COND (IS_BIT26_COND | IS_BIT16_COND | IS_BIT23_COND) + +# define PATCH_B 0x100 +# define PATCH_J 0x200 + +#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) +# define PATCH_ABS32 0x400 +# define PATCH_ABS48 0x800 +#endif + + /* instruction types */ +# define MOVABLE_INS 0 + /* 1 - 31 last destination register */ + /* no destination (i.e: store) */ +# define UNMOVABLE_INS 32 + /* FPU status register */ +# define FCSR_FCC 33 +#endif + +#if (defined SLJIT_CONFIG_TILEGX && SLJIT_CONFIG_TILEGX) +# define IS_JAL 0x04 +# define IS_COND 0x08 + +# define PATCH_B 0x10 +# define PATCH_J 0x20 +#endif + +#if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) +# define IS_MOVABLE 0x04 +# define IS_COND 0x08 +# define IS_CALL 0x10 + +# define PATCH_B 0x20 +# define PATCH_CALL 0x40 + + /* instruction types */ +# define MOVABLE_INS 0 + /* 1 - 31 last destination register */ + /* no destination (i.e: store) */ +# define UNMOVABLE_INS 32 + +# define DST_INS_MASK 0xff + + /* ICC_SET is the same as SET_FLAGS. */ +# define ICC_IS_SET (1 << 23) +# define FCC_IS_SET (1 << 24) +#endif + +/* Stack management. */ + +#define GET_SAVED_REGISTERS_SIZE(scratches, saveds, extra) \ + (((scratches < SLJIT_NUMBER_OF_SCRATCH_REGISTERS ? 0 : (scratches - SLJIT_NUMBER_OF_SCRATCH_REGISTERS)) + \ + (saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? saveds : SLJIT_NUMBER_OF_SAVED_REGISTERS) + \ + extra) * sizeof(sljit_sw)) + +#define ADJUST_LOCAL_OFFSET(p, i) \ + if ((p) == (SLJIT_MEM1(SLJIT_SP))) \ + (i) += SLJIT_LOCALS_OFFSET; + +#endif /* !(defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED) */ + +/* Utils can still be used even if SLJIT_CONFIG_UNSUPPORTED is set. */ +#include "sljitUtils.c" + +#if !(defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED) + +#if (defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR) + +#if (defined SLJIT_PROT_EXECUTABLE_ALLOCATOR && SLJIT_PROT_EXECUTABLE_ALLOCATOR) +#include "sljitProtExecAllocator.c" +#else +#include "sljitExecAllocator.c" +#endif + +#endif + +#if (defined SLJIT_PROT_EXECUTABLE_ALLOCATOR && SLJIT_PROT_EXECUTABLE_ALLOCATOR) +#define SLJIT_ADD_EXEC_OFFSET(ptr, exec_offset) ((sljit_u8 *)(ptr) + (exec_offset)) +#else +#define SLJIT_ADD_EXEC_OFFSET(ptr, exec_offset) ((sljit_u8 *)(ptr)) +#endif + +/* Argument checking features. */ + +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + +/* Returns with error when an invalid argument is passed. */ + +#define CHECK_ARGUMENT(x) \ + do { \ + if (SLJIT_UNLIKELY(!(x))) \ + return 1; \ + } while (0) + +#define CHECK_RETURN_TYPE sljit_s32 +#define CHECK_RETURN_OK return 0 + +#define CHECK(x) \ + do { \ + if (SLJIT_UNLIKELY(x)) { \ + compiler->error = SLJIT_ERR_BAD_ARGUMENT; \ + return SLJIT_ERR_BAD_ARGUMENT; \ + } \ + } while (0) + +#define CHECK_PTR(x) \ + do { \ + if (SLJIT_UNLIKELY(x)) { \ + compiler->error = SLJIT_ERR_BAD_ARGUMENT; \ + return NULL; \ + } \ + } while (0) + +#define CHECK_REG_INDEX(x) \ + do { \ + if (SLJIT_UNLIKELY(x)) { \ + return -2; \ + } \ + } while (0) + +#elif (defined SLJIT_DEBUG && SLJIT_DEBUG) + +/* Assertion failure occures if an invalid argument is passed. */ +#undef SLJIT_ARGUMENT_CHECKS +#define SLJIT_ARGUMENT_CHECKS 1 + +#define CHECK_ARGUMENT(x) SLJIT_ASSERT(x) +#define CHECK_RETURN_TYPE void +#define CHECK_RETURN_OK return +#define CHECK(x) x +#define CHECK_PTR(x) x +#define CHECK_REG_INDEX(x) x + +#elif (defined SLJIT_VERBOSE && SLJIT_VERBOSE) + +/* Arguments are not checked. */ +#define CHECK_RETURN_TYPE void +#define CHECK_RETURN_OK return +#define CHECK(x) x +#define CHECK_PTR(x) x +#define CHECK_REG_INDEX(x) x + +#else + +/* Arguments are not checked. */ +#define CHECK(x) +#define CHECK_PTR(x) +#define CHECK_REG_INDEX(x) + +#endif /* SLJIT_ARGUMENT_CHECKS */ + +/* --------------------------------------------------------------------- */ +/* Public functions */ +/* --------------------------------------------------------------------- */ + +#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) +#define SLJIT_NEEDS_COMPILER_INIT 1 +static sljit_s32 compiler_initialized = 0; +/* A thread safe initialization. */ +static void init_compiler(void); +#endif + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_compiler* sljit_create_compiler(void *allocator_data) +{ + struct sljit_compiler *compiler = (struct sljit_compiler*)SLJIT_MALLOC(sizeof(struct sljit_compiler), allocator_data); + if (!compiler) + return NULL; + SLJIT_ZEROMEM(compiler, sizeof(struct sljit_compiler)); + + SLJIT_COMPILE_ASSERT( + sizeof(sljit_s8) == 1 && sizeof(sljit_u8) == 1 + && sizeof(sljit_s16) == 2 && sizeof(sljit_u16) == 2 + && sizeof(sljit_s32) == 4 && sizeof(sljit_u32) == 4 + && (sizeof(sljit_p) == 4 || sizeof(sljit_p) == 8) + && sizeof(sljit_p) <= sizeof(sljit_sw) + && (sizeof(sljit_sw) == 4 || sizeof(sljit_sw) == 8) + && (sizeof(sljit_uw) == 4 || sizeof(sljit_uw) == 8), + invalid_integer_types); + SLJIT_COMPILE_ASSERT(SLJIT_I32_OP == SLJIT_F32_OP, + int_op_and_single_op_must_be_the_same); + SLJIT_COMPILE_ASSERT(SLJIT_REWRITABLE_JUMP != SLJIT_F32_OP, + rewritable_jump_and_single_op_must_not_be_the_same); + SLJIT_COMPILE_ASSERT(!(SLJIT_EQUAL & 0x1) && !(SLJIT_LESS & 0x1) && !(SLJIT_EQUAL_F64 & 0x1) && !(SLJIT_JUMP & 0x1), + conditional_flags_must_be_even_numbers); + + /* Only the non-zero members must be set. */ + compiler->error = SLJIT_SUCCESS; + + compiler->allocator_data = allocator_data; + compiler->buf = (struct sljit_memory_fragment*)SLJIT_MALLOC(BUF_SIZE, allocator_data); + compiler->abuf = (struct sljit_memory_fragment*)SLJIT_MALLOC(ABUF_SIZE, allocator_data); + + if (!compiler->buf || !compiler->abuf) { + if (compiler->buf) + SLJIT_FREE(compiler->buf, allocator_data); + if (compiler->abuf) + SLJIT_FREE(compiler->abuf, allocator_data); + SLJIT_FREE(compiler, allocator_data); + return NULL; + } + + compiler->buf->next = NULL; + compiler->buf->used_size = 0; + compiler->abuf->next = NULL; + compiler->abuf->used_size = 0; + + compiler->scratches = -1; + compiler->saveds = -1; + compiler->fscratches = -1; + compiler->fsaveds = -1; + compiler->local_size = -1; + +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + compiler->args = -1; +#endif + +#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) + compiler->cpool = (sljit_uw*)SLJIT_MALLOC(CPOOL_SIZE * sizeof(sljit_uw) + + CPOOL_SIZE * sizeof(sljit_u8), allocator_data); + if (!compiler->cpool) { + SLJIT_FREE(compiler->buf, allocator_data); + SLJIT_FREE(compiler->abuf, allocator_data); + SLJIT_FREE(compiler, allocator_data); + return NULL; + } + compiler->cpool_unique = (sljit_u8*)(compiler->cpool + CPOOL_SIZE); + compiler->cpool_diff = 0xffffffff; +#endif + +#if (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS) + compiler->delay_slot = UNMOVABLE_INS; +#endif + +#if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) + compiler->delay_slot = UNMOVABLE_INS; +#endif + +#if (defined SLJIT_NEEDS_COMPILER_INIT && SLJIT_NEEDS_COMPILER_INIT) + if (!compiler_initialized) { + init_compiler(); + compiler_initialized = 1; + } +#endif + + return compiler; +} + +SLJIT_API_FUNC_ATTRIBUTE void sljit_free_compiler(struct sljit_compiler *compiler) +{ + struct sljit_memory_fragment *buf; + struct sljit_memory_fragment *curr; + void *allocator_data = compiler->allocator_data; + SLJIT_UNUSED_ARG(allocator_data); + + buf = compiler->buf; + while (buf) { + curr = buf; + buf = buf->next; + SLJIT_FREE(curr, allocator_data); + } + + buf = compiler->abuf; + while (buf) { + curr = buf; + buf = buf->next; + SLJIT_FREE(curr, allocator_data); + } + +#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) + SLJIT_FREE(compiler->cpool, allocator_data); +#endif + SLJIT_FREE(compiler, allocator_data); +} + +SLJIT_API_FUNC_ATTRIBUTE void sljit_set_compiler_memory_error(struct sljit_compiler *compiler) +{ + if (compiler->error == SLJIT_SUCCESS) + compiler->error = SLJIT_ERR_ALLOC_FAILED; +} + +#if (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) +SLJIT_API_FUNC_ATTRIBUTE void sljit_free_code(void* code) +{ + /* Remove thumb mode flag. */ + SLJIT_FREE_EXEC((void*)((sljit_uw)code & ~0x1)); +} +#elif (defined SLJIT_INDIRECT_CALL && SLJIT_INDIRECT_CALL) +SLJIT_API_FUNC_ATTRIBUTE void sljit_free_code(void* code) +{ + /* Resolve indirection. */ + code = (void*)(*(sljit_uw*)code); + SLJIT_FREE_EXEC(code); +} +#else +SLJIT_API_FUNC_ATTRIBUTE void sljit_free_code(void* code) +{ + SLJIT_FREE_EXEC(code); +} +#endif + +SLJIT_API_FUNC_ATTRIBUTE void sljit_set_label(struct sljit_jump *jump, struct sljit_label* label) +{ + if (SLJIT_LIKELY(!!jump) && SLJIT_LIKELY(!!label)) { + jump->flags &= ~JUMP_ADDR; + jump->flags |= JUMP_LABEL; + jump->u.label = label; + } +} + +SLJIT_API_FUNC_ATTRIBUTE void sljit_set_target(struct sljit_jump *jump, sljit_uw target) +{ + if (SLJIT_LIKELY(!!jump)) { + jump->flags &= ~JUMP_LABEL; + jump->flags |= JUMP_ADDR; + jump->u.target = target; + } +} + +SLJIT_API_FUNC_ATTRIBUTE void sljit_set_put_label(struct sljit_put_label *put_label, struct sljit_label *label) +{ + if (SLJIT_LIKELY(!!put_label)) + put_label->label = label; +} + +SLJIT_API_FUNC_ATTRIBUTE void sljit_set_current_flags(struct sljit_compiler *compiler, sljit_s32 current_flags) +{ + SLJIT_UNUSED_ARG(compiler); + SLJIT_UNUSED_ARG(current_flags); + +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + if ((current_flags & ~(VARIABLE_FLAG_MASK | SLJIT_I32_OP | SLJIT_SET_Z)) == 0) { + compiler->last_flags = GET_FLAG_TYPE(current_flags) | (current_flags & (SLJIT_I32_OP | SLJIT_SET_Z)); + } +#endif +} + +/* --------------------------------------------------------------------- */ +/* Private functions */ +/* --------------------------------------------------------------------- */ + +static void* ensure_buf(struct sljit_compiler *compiler, sljit_uw size) +{ + sljit_u8 *ret; + struct sljit_memory_fragment *new_frag; + + SLJIT_ASSERT(size <= 256); + if (compiler->buf->used_size + size <= (BUF_SIZE - (sljit_uw)SLJIT_OFFSETOF(struct sljit_memory_fragment, memory))) { + ret = compiler->buf->memory + compiler->buf->used_size; + compiler->buf->used_size += size; + return ret; + } + new_frag = (struct sljit_memory_fragment*)SLJIT_MALLOC(BUF_SIZE, compiler->allocator_data); + PTR_FAIL_IF_NULL(new_frag); + new_frag->next = compiler->buf; + compiler->buf = new_frag; + new_frag->used_size = size; + return new_frag->memory; +} + +static void* ensure_abuf(struct sljit_compiler *compiler, sljit_uw size) +{ + sljit_u8 *ret; + struct sljit_memory_fragment *new_frag; + + SLJIT_ASSERT(size <= 256); + if (compiler->abuf->used_size + size <= (ABUF_SIZE - (sljit_uw)SLJIT_OFFSETOF(struct sljit_memory_fragment, memory))) { + ret = compiler->abuf->memory + compiler->abuf->used_size; + compiler->abuf->used_size += size; + return ret; + } + new_frag = (struct sljit_memory_fragment*)SLJIT_MALLOC(ABUF_SIZE, compiler->allocator_data); + PTR_FAIL_IF_NULL(new_frag); + new_frag->next = compiler->abuf; + compiler->abuf = new_frag; + new_frag->used_size = size; + return new_frag->memory; +} + +SLJIT_API_FUNC_ATTRIBUTE void* sljit_alloc_memory(struct sljit_compiler *compiler, sljit_s32 size) +{ + CHECK_ERROR_PTR(); + +#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) + if (size <= 0 || size > 128) + return NULL; + size = (size + 7) & ~7; +#else + if (size <= 0 || size > 64) + return NULL; + size = (size + 3) & ~3; +#endif + return ensure_abuf(compiler, size); +} + +static SLJIT_INLINE void reverse_buf(struct sljit_compiler *compiler) +{ + struct sljit_memory_fragment *buf = compiler->buf; + struct sljit_memory_fragment *prev = NULL; + struct sljit_memory_fragment *tmp; + + do { + tmp = buf->next; + buf->next = prev; + prev = buf; + buf = tmp; + } while (buf != NULL); + + compiler->buf = prev; +} + +static SLJIT_INLINE sljit_s32 get_arg_count(sljit_s32 arg_types) +{ + sljit_s32 arg_count = 0; + + arg_types >>= SLJIT_DEF_SHIFT; + while (arg_types) { + arg_count++; + arg_types >>= SLJIT_DEF_SHIFT; + } + + return arg_count; +} + +#if !(defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) + +static SLJIT_INLINE sljit_uw compute_next_addr(struct sljit_label *label, struct sljit_jump *jump, + struct sljit_const *const_, struct sljit_put_label *put_label) +{ + sljit_uw result = ~(sljit_uw)0; + + if (label) + result = label->size; + + if (jump && jump->addr < result) + result = jump->addr; + + if (const_ && const_->addr < result) + result = const_->addr; + + if (put_label && put_label->addr < result) + result = put_label->addr; + + return result; +} + +#endif /* !SLJIT_CONFIG_X86 */ + +static SLJIT_INLINE void set_emit_enter(struct sljit_compiler *compiler, + sljit_s32 options, sljit_s32 args, sljit_s32 scratches, sljit_s32 saveds, + sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size) +{ + SLJIT_UNUSED_ARG(args); + SLJIT_UNUSED_ARG(local_size); + + compiler->options = options; + compiler->scratches = scratches; + compiler->saveds = saveds; + compiler->fscratches = fscratches; + compiler->fsaveds = fsaveds; +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + compiler->logical_local_size = local_size; +#endif +} + +static SLJIT_INLINE void set_set_context(struct sljit_compiler *compiler, + sljit_s32 options, sljit_s32 args, sljit_s32 scratches, sljit_s32 saveds, + sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size) +{ + SLJIT_UNUSED_ARG(args); + SLJIT_UNUSED_ARG(local_size); + + compiler->options = options; + compiler->scratches = scratches; + compiler->saveds = saveds; + compiler->fscratches = fscratches; + compiler->fsaveds = fsaveds; +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + compiler->logical_local_size = local_size; +#endif +} + +static SLJIT_INLINE void set_label(struct sljit_label *label, struct sljit_compiler *compiler) +{ + label->next = NULL; + label->size = compiler->size; + if (compiler->last_label) + compiler->last_label->next = label; + else + compiler->labels = label; + compiler->last_label = label; +} + +static SLJIT_INLINE void set_jump(struct sljit_jump *jump, struct sljit_compiler *compiler, sljit_s32 flags) +{ + jump->next = NULL; + jump->flags = flags; + if (compiler->last_jump) + compiler->last_jump->next = jump; + else + compiler->jumps = jump; + compiler->last_jump = jump; +} + +static SLJIT_INLINE void set_const(struct sljit_const *const_, struct sljit_compiler *compiler) +{ + const_->next = NULL; + const_->addr = compiler->size; + if (compiler->last_const) + compiler->last_const->next = const_; + else + compiler->consts = const_; + compiler->last_const = const_; +} + +static SLJIT_INLINE void set_put_label(struct sljit_put_label *put_label, struct sljit_compiler *compiler, sljit_uw offset) +{ + put_label->next = NULL; + put_label->label = NULL; + put_label->addr = compiler->size - offset; + put_label->flags = 0; + if (compiler->last_put_label) + compiler->last_put_label->next = put_label; + else + compiler->put_labels = put_label; + compiler->last_put_label = put_label; +} + +#define ADDRESSING_DEPENDS_ON(exp, reg) \ + (((exp) & SLJIT_MEM) && (((exp) & REG_MASK) == reg || OFFS_REG(exp) == reg)) + +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + +#define FUNCTION_CHECK_IS_REG(r) \ + (((r) >= SLJIT_R0 && (r) < (SLJIT_R0 + compiler->scratches)) \ + || ((r) > (SLJIT_S0 - compiler->saveds) && (r) <= SLJIT_S0)) + +#define FUNCTION_CHECK_IS_FREG(fr) \ + (((fr) >= SLJIT_FR0 && (fr) < (SLJIT_FR0 + compiler->fscratches)) \ + || ((fr) > (SLJIT_FS0 - compiler->fsaveds) && (fr) <= SLJIT_FS0)) + +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) +#define CHECK_IF_VIRTUAL_REGISTER(p) ((p) <= SLJIT_S3 && (p) >= SLJIT_S8) +#else +#define CHECK_IF_VIRTUAL_REGISTER(p) 0 +#endif + +static sljit_s32 function_check_src_mem(struct sljit_compiler *compiler, sljit_s32 p, sljit_sw i) +{ + if (compiler->scratches == -1 || compiler->saveds == -1) + return 0; + + if (!(p & SLJIT_MEM)) + return 0; + + if (!((p & REG_MASK) == SLJIT_UNUSED || FUNCTION_CHECK_IS_REG(p & REG_MASK))) + return 0; + + if (CHECK_IF_VIRTUAL_REGISTER(p & REG_MASK)) + return 0; + + if (p & OFFS_REG_MASK) { + if ((p & REG_MASK) == SLJIT_UNUSED) + return 0; + + if (!(FUNCTION_CHECK_IS_REG(OFFS_REG(p)))) + return 0; + + if (CHECK_IF_VIRTUAL_REGISTER(OFFS_REG(p))) + return 0; + + if ((i & ~0x3) != 0) + return 0; + } + + return (p & ~(SLJIT_MEM | REG_MASK | OFFS_REG_MASK)) == 0; +} + +#define FUNCTION_CHECK_SRC_MEM(p, i) \ + CHECK_ARGUMENT(function_check_src_mem(compiler, p, i)); + +static sljit_s32 function_check_src(struct sljit_compiler *compiler, sljit_s32 p, sljit_sw i) +{ + if (compiler->scratches == -1 || compiler->saveds == -1) + return 0; + + if (FUNCTION_CHECK_IS_REG(p)) + return (i == 0); + + if (p == SLJIT_IMM) + return 1; + + if (p == SLJIT_MEM1(SLJIT_SP)) + return (i >= 0 && i < compiler->logical_local_size); + + return function_check_src_mem(compiler, p, i); +} + +#define FUNCTION_CHECK_SRC(p, i) \ + CHECK_ARGUMENT(function_check_src(compiler, p, i)); + +static sljit_s32 function_check_dst(struct sljit_compiler *compiler, sljit_s32 p, sljit_sw i, sljit_s32 unused) +{ + if (compiler->scratches == -1 || compiler->saveds == -1) + return 0; + + if (FUNCTION_CHECK_IS_REG(p) || ((unused) && (p) == SLJIT_UNUSED)) + return (i == 0); + + if (p == SLJIT_MEM1(SLJIT_SP)) + return (i >= 0 && i < compiler->logical_local_size); + + return function_check_src_mem(compiler, p, i); +} + +#define FUNCTION_CHECK_DST(p, i, unused) \ + CHECK_ARGUMENT(function_check_dst(compiler, p, i, unused)); + +static sljit_s32 function_fcheck(struct sljit_compiler *compiler, sljit_s32 p, sljit_sw i) +{ + if (compiler->scratches == -1 || compiler->saveds == -1) + return 0; + + if (FUNCTION_CHECK_IS_FREG(p)) + return (i == 0); + + if (p == SLJIT_MEM1(SLJIT_SP)) + return (i >= 0 && i < compiler->logical_local_size); + + return function_check_src_mem(compiler, p, i); +} + +#define FUNCTION_FCHECK(p, i) \ + CHECK_ARGUMENT(function_fcheck(compiler, p, i)); + +#endif /* SLJIT_ARGUMENT_CHECKS */ + +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) + +SLJIT_API_FUNC_ATTRIBUTE void sljit_compiler_verbose(struct sljit_compiler *compiler, FILE* verbose) +{ + compiler->verbose = verbose; +} + +#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) +#ifdef _WIN64 +# define SLJIT_PRINT_D "I64" +#else +# define SLJIT_PRINT_D "l" +#endif +#else +# define SLJIT_PRINT_D "" +#endif + +static void sljit_verbose_reg(struct sljit_compiler *compiler, sljit_s32 r) +{ + if (r < (SLJIT_R0 + compiler->scratches)) + fprintf(compiler->verbose, "r%d", r - SLJIT_R0); + else if (r != SLJIT_SP) + fprintf(compiler->verbose, "s%d", SLJIT_NUMBER_OF_REGISTERS - r); + else + fprintf(compiler->verbose, "sp"); +} + +static void sljit_verbose_freg(struct sljit_compiler *compiler, sljit_s32 r) +{ + if (r < (SLJIT_FR0 + compiler->fscratches)) + fprintf(compiler->verbose, "fr%d", r - SLJIT_FR0); + else + fprintf(compiler->verbose, "fs%d", SLJIT_NUMBER_OF_FLOAT_REGISTERS - r); +} + +static void sljit_verbose_param(struct sljit_compiler *compiler, sljit_s32 p, sljit_sw i) +{ + if ((p) & SLJIT_IMM) + fprintf(compiler->verbose, "#%" SLJIT_PRINT_D "d", (i)); + else if ((p) & SLJIT_MEM) { + if ((p) & REG_MASK) { + fputc('[', compiler->verbose); + sljit_verbose_reg(compiler, (p) & REG_MASK); + if ((p) & OFFS_REG_MASK) { + fprintf(compiler->verbose, " + "); + sljit_verbose_reg(compiler, OFFS_REG(p)); + if (i) + fprintf(compiler->verbose, " * %d", 1 << (i)); + } + else if (i) + fprintf(compiler->verbose, " + %" SLJIT_PRINT_D "d", (i)); + fputc(']', compiler->verbose); + } + else + fprintf(compiler->verbose, "[#%" SLJIT_PRINT_D "d]", (i)); + } else if (p) + sljit_verbose_reg(compiler, p); + else + fprintf(compiler->verbose, "unused"); +} + +static void sljit_verbose_fparam(struct sljit_compiler *compiler, sljit_s32 p, sljit_sw i) +{ + if ((p) & SLJIT_MEM) { + if ((p) & REG_MASK) { + fputc('[', compiler->verbose); + sljit_verbose_reg(compiler, (p) & REG_MASK); + if ((p) & OFFS_REG_MASK) { + fprintf(compiler->verbose, " + "); + sljit_verbose_reg(compiler, OFFS_REG(p)); + if (i) + fprintf(compiler->verbose, "%d", 1 << (i)); + } + else if (i) + fprintf(compiler->verbose, " + %" SLJIT_PRINT_D "d", (i)); + fputc(']', compiler->verbose); + } + else + fprintf(compiler->verbose, "[#%" SLJIT_PRINT_D "d]", (i)); + } + else + sljit_verbose_freg(compiler, p); +} + +static const char* op0_names[] = { + (char*)"breakpoint", (char*)"nop", (char*)"lmul.uw", (char*)"lmul.sw", + (char*)"divmod.u", (char*)"divmod.s", (char*)"div.u", (char*)"div.s" +}; + +static const char* op1_names[] = { + (char*)"", (char*)".u8", (char*)".s8", (char*)".u16", + (char*)".s16", (char*)".u32", (char*)".s32", (char*)".p", + (char*)"", (char*)".u8", (char*)".s8", (char*)".u16", + (char*)".s16", (char*)".u32", (char*)".s32", (char*)".p", + (char*)"not", (char*)"neg", (char*)"clz", +}; + +static const char* op2_names[] = { + (char*)"add", (char*)"addc", (char*)"sub", (char*)"subc", + (char*)"mul", (char*)"and", (char*)"or", (char*)"xor", + (char*)"shl", (char*)"lshr", (char*)"ashr", +}; + +static const char* fop1_names[] = { + (char*)"mov", (char*)"conv", (char*)"conv", (char*)"conv", + (char*)"conv", (char*)"conv", (char*)"cmp", (char*)"neg", + (char*)"abs", +}; + +static const char* fop2_names[] = { + (char*)"add", (char*)"sub", (char*)"mul", (char*)"div" +}; + +#define JUMP_POSTFIX(type) \ + ((type & 0xff) <= SLJIT_MUL_NOT_OVERFLOW ? ((type & SLJIT_I32_OP) ? "32" : "") \ + : ((type & 0xff) <= SLJIT_ORDERED_F64 ? ((type & SLJIT_F32_OP) ? ".f32" : ".f64") : "")) + +static char* jump_names[] = { + (char*)"equal", (char*)"not_equal", + (char*)"less", (char*)"greater_equal", + (char*)"greater", (char*)"less_equal", + (char*)"sig_less", (char*)"sig_greater_equal", + (char*)"sig_greater", (char*)"sig_less_equal", + (char*)"overflow", (char*)"not_overflow", + (char*)"mul_overflow", (char*)"mul_not_overflow", + (char*)"carry", (char*)"", + (char*)"equal", (char*)"not_equal", + (char*)"less", (char*)"greater_equal", + (char*)"greater", (char*)"less_equal", + (char*)"unordered", (char*)"ordered", + (char*)"jump", (char*)"fast_call", + (char*)"call", (char*)"call.cdecl" +}; + +static char* call_arg_names[] = { + (char*)"void", (char*)"sw", (char*)"uw", (char*)"s32", (char*)"u32", (char*)"f32", (char*)"f64" +}; + +#endif /* SLJIT_VERBOSE */ + +/* --------------------------------------------------------------------- */ +/* Arch dependent */ +/* --------------------------------------------------------------------- */ + +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) \ + || (defined SLJIT_VERBOSE && SLJIT_VERBOSE) + +static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_generate_code(struct sljit_compiler *compiler) +{ +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + struct sljit_jump *jump; +#endif + + SLJIT_UNUSED_ARG(compiler); + +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + CHECK_ARGUMENT(compiler->size > 0); + jump = compiler->jumps; + while (jump) { + /* All jumps have target. */ + CHECK_ARGUMENT(jump->flags & (JUMP_LABEL | JUMP_ADDR)); + jump = jump->next; + } +#endif + CHECK_RETURN_OK; +} + +static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_enter(struct sljit_compiler *compiler, + sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds, + sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size) +{ +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + sljit_s32 types, arg_count, curr_type; +#endif + + SLJIT_UNUSED_ARG(compiler); + +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + CHECK_ARGUMENT(!(options & ~SLJIT_F64_ALIGNMENT)); + CHECK_ARGUMENT(scratches >= 0 && scratches <= SLJIT_NUMBER_OF_REGISTERS); + CHECK_ARGUMENT(saveds >= 0 && saveds <= SLJIT_NUMBER_OF_REGISTERS); + CHECK_ARGUMENT(scratches + saveds <= SLJIT_NUMBER_OF_REGISTERS); + CHECK_ARGUMENT(fscratches >= 0 && fscratches <= SLJIT_NUMBER_OF_FLOAT_REGISTERS); + CHECK_ARGUMENT(fsaveds >= 0 && fsaveds <= SLJIT_NUMBER_OF_FLOAT_REGISTERS); + CHECK_ARGUMENT(fscratches + fsaveds <= SLJIT_NUMBER_OF_FLOAT_REGISTERS); + CHECK_ARGUMENT(local_size >= 0 && local_size <= SLJIT_MAX_LOCAL_SIZE); + CHECK_ARGUMENT((arg_types & SLJIT_DEF_MASK) == 0); + + types = (arg_types >> SLJIT_DEF_SHIFT); + arg_count = 0; + while (types != 0 && arg_count < 3) { + curr_type = (types & SLJIT_DEF_MASK); + CHECK_ARGUMENT(curr_type == SLJIT_ARG_TYPE_SW || curr_type == SLJIT_ARG_TYPE_UW); + arg_count++; + types >>= SLJIT_DEF_SHIFT; + } + CHECK_ARGUMENT(arg_count <= saveds && types == 0); + + compiler->last_flags = 0; +#endif +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) + if (SLJIT_UNLIKELY(!!compiler->verbose)) { + fprintf(compiler->verbose, " enter options:%s args[", (options & SLJIT_F64_ALIGNMENT) ? "f64_align" : ""); + + arg_types >>= SLJIT_DEF_SHIFT; + while (arg_types) { + fprintf(compiler->verbose, "%s", call_arg_names[arg_types & SLJIT_DEF_MASK]); + arg_types >>= SLJIT_DEF_SHIFT; + if (arg_types) + fprintf(compiler->verbose, ","); + } + + fprintf(compiler->verbose, "] scratches:%d saveds:%d fscratches:%d fsaveds:%d local_size:%d\n", + scratches, saveds, fscratches, fsaveds, local_size); + } +#endif + CHECK_RETURN_OK; +} + +static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_set_context(struct sljit_compiler *compiler, + sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds, + sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size) +{ +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + sljit_s32 types, arg_count, curr_type; +#endif + + SLJIT_UNUSED_ARG(compiler); + +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + CHECK_ARGUMENT(!(options & ~SLJIT_F64_ALIGNMENT)); + CHECK_ARGUMENT(scratches >= 0 && scratches <= SLJIT_NUMBER_OF_REGISTERS); + CHECK_ARGUMENT(saveds >= 0 && saveds <= SLJIT_NUMBER_OF_REGISTERS); + CHECK_ARGUMENT(scratches + saveds <= SLJIT_NUMBER_OF_REGISTERS); + CHECK_ARGUMENT(fscratches >= 0 && fscratches <= SLJIT_NUMBER_OF_FLOAT_REGISTERS); + CHECK_ARGUMENT(fsaveds >= 0 && fsaveds <= SLJIT_NUMBER_OF_FLOAT_REGISTERS); + CHECK_ARGUMENT(fscratches + fsaveds <= SLJIT_NUMBER_OF_FLOAT_REGISTERS); + CHECK_ARGUMENT(local_size >= 0 && local_size <= SLJIT_MAX_LOCAL_SIZE); + + types = (arg_types >> SLJIT_DEF_SHIFT); + arg_count = 0; + while (types != 0 && arg_count < 3) { + curr_type = (types & SLJIT_DEF_MASK); + CHECK_ARGUMENT(curr_type == SLJIT_ARG_TYPE_SW || curr_type == SLJIT_ARG_TYPE_UW); + arg_count++; + types >>= SLJIT_DEF_SHIFT; + } + CHECK_ARGUMENT(arg_count <= saveds && types == 0); + + compiler->last_flags = 0; +#endif +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) + if (SLJIT_UNLIKELY(!!compiler->verbose)) { + fprintf(compiler->verbose, " set_context options:%s args[", (options & SLJIT_F64_ALIGNMENT) ? "f64_align" : ""); + + arg_types >>= SLJIT_DEF_SHIFT; + while (arg_types) { + fprintf(compiler->verbose, "%s", call_arg_names[arg_types & SLJIT_DEF_MASK]); + arg_types >>= SLJIT_DEF_SHIFT; + if (arg_types) + fprintf(compiler->verbose, ","); + } + + fprintf(compiler->verbose, "] scratches:%d saveds:%d fscratches:%d fsaveds:%d local_size:%d\n", + scratches, saveds, fscratches, fsaveds, local_size); + } +#endif + CHECK_RETURN_OK; +} + +static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_return(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw) +{ +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + CHECK_ARGUMENT(compiler->scratches >= 0); + if (op != SLJIT_UNUSED) { + CHECK_ARGUMENT(op >= SLJIT_MOV && op <= SLJIT_MOV_P); + FUNCTION_CHECK_SRC(src, srcw); + } + else + CHECK_ARGUMENT(src == 0 && srcw == 0); + compiler->last_flags = 0; +#endif +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) + if (SLJIT_UNLIKELY(!!compiler->verbose)) { + if (op == SLJIT_UNUSED) + fprintf(compiler->verbose, " return\n"); + else { + fprintf(compiler->verbose, " return%s ", op1_names[op - SLJIT_OP1_BASE]); + sljit_verbose_param(compiler, src, srcw); + fprintf(compiler->verbose, "\n"); + } + } +#endif + CHECK_RETURN_OK; +} + +static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw) +{ +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + FUNCTION_CHECK_DST(dst, dstw, 0); + compiler->last_flags = 0; +#endif +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) + if (SLJIT_UNLIKELY(!!compiler->verbose)) { + fprintf(compiler->verbose, " fast_enter "); + sljit_verbose_param(compiler, dst, dstw); + fprintf(compiler->verbose, "\n"); + } +#endif + CHECK_RETURN_OK; +} + +static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw) +{ +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + FUNCTION_CHECK_SRC(src, srcw); + CHECK_ARGUMENT(src != SLJIT_IMM); + compiler->last_flags = 0; +#endif +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) + if (SLJIT_UNLIKELY(!!compiler->verbose)) { + fprintf(compiler->verbose, " fast_return "); + sljit_verbose_param(compiler, src, srcw); + fprintf(compiler->verbose, "\n"); + } +#endif + CHECK_RETURN_OK; +} + +static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_op0(struct sljit_compiler *compiler, sljit_s32 op) +{ +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + CHECK_ARGUMENT((op >= SLJIT_BREAKPOINT && op <= SLJIT_LMUL_SW) + || ((op & ~SLJIT_I32_OP) >= SLJIT_DIVMOD_UW && (op & ~SLJIT_I32_OP) <= SLJIT_DIV_SW)); + CHECK_ARGUMENT(op < SLJIT_LMUL_UW || compiler->scratches >= 2); + if (op >= SLJIT_LMUL_UW) + compiler->last_flags = 0; +#endif +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) + if (SLJIT_UNLIKELY(!!compiler->verbose)) + { + fprintf(compiler->verbose, " %s", op0_names[GET_OPCODE(op) - SLJIT_OP0_BASE]); + if (GET_OPCODE(op) >= SLJIT_DIVMOD_UW) { + fprintf(compiler->verbose, (op & SLJIT_I32_OP) ? "32" : "w"); + } + fprintf(compiler->verbose, "\n"); + } +#endif + CHECK_RETURN_OK; +} + +static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_op1(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + if (SLJIT_UNLIKELY(compiler->skip_checks)) { + compiler->skip_checks = 0; + CHECK_RETURN_OK; + } + +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + CHECK_ARGUMENT(GET_OPCODE(op) >= SLJIT_MOV && GET_OPCODE(op) <= SLJIT_CLZ); + + switch (GET_OPCODE(op)) { + case SLJIT_NOT: + /* Only SLJIT_I32_OP and SLJIT_SET_Z are allowed. */ + CHECK_ARGUMENT(!(op & VARIABLE_FLAG_MASK)); + break; + case SLJIT_NEG: + CHECK_ARGUMENT(!(op & VARIABLE_FLAG_MASK) + || GET_FLAG_TYPE(op) == SLJIT_OVERFLOW); + break; + case SLJIT_MOV: + case SLJIT_MOV_U32: + case SLJIT_MOV_P: + /* Nothing allowed */ + CHECK_ARGUMENT(!(op & (SLJIT_I32_OP | SLJIT_SET_Z | VARIABLE_FLAG_MASK))); + break; + default: + /* Only SLJIT_I32_OP is allowed. */ + CHECK_ARGUMENT(!(op & (SLJIT_SET_Z | VARIABLE_FLAG_MASK))); + break; + } + + FUNCTION_CHECK_DST(dst, dstw, 1); + FUNCTION_CHECK_SRC(src, srcw); + + if (GET_OPCODE(op) >= SLJIT_NOT) { + CHECK_ARGUMENT(src != SLJIT_IMM); + compiler->last_flags = GET_FLAG_TYPE(op) | (op & (SLJIT_I32_OP | SLJIT_SET_Z)); + } +#endif +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) + if (SLJIT_UNLIKELY(!!compiler->verbose)) { + if (GET_OPCODE(op) <= SLJIT_MOV_P) + { + fprintf(compiler->verbose, " mov%s%s ", !(op & SLJIT_I32_OP) ? "" : "32", + (op != SLJIT_MOV32) ? op1_names[GET_OPCODE(op) - SLJIT_OP1_BASE] : ""); + } + else + { + fprintf(compiler->verbose, " %s%s%s%s%s ", op1_names[GET_OPCODE(op) - SLJIT_OP1_BASE], !(op & SLJIT_I32_OP) ? "" : "32", + !(op & SLJIT_SET_Z) ? "" : ".z", !(op & VARIABLE_FLAG_MASK) ? "" : ".", + !(op & VARIABLE_FLAG_MASK) ? "" : jump_names[GET_FLAG_TYPE(op)]); + } + + sljit_verbose_param(compiler, dst, dstw); + fprintf(compiler->verbose, ", "); + sljit_verbose_param(compiler, src, srcw); + fprintf(compiler->verbose, "\n"); + } +#endif + CHECK_RETURN_OK; +} + +static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_op2(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + if (SLJIT_UNLIKELY(compiler->skip_checks)) { + compiler->skip_checks = 0; + CHECK_RETURN_OK; + } + +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + CHECK_ARGUMENT(GET_OPCODE(op) >= SLJIT_ADD && GET_OPCODE(op) <= SLJIT_ASHR); + + switch (GET_OPCODE(op)) { + case SLJIT_AND: + case SLJIT_OR: + case SLJIT_XOR: + case SLJIT_SHL: + case SLJIT_LSHR: + case SLJIT_ASHR: + CHECK_ARGUMENT(!(op & VARIABLE_FLAG_MASK)); + break; + case SLJIT_MUL: + CHECK_ARGUMENT(!(op & SLJIT_SET_Z)); + CHECK_ARGUMENT(!(op & VARIABLE_FLAG_MASK) + || GET_FLAG_TYPE(op) == SLJIT_MUL_OVERFLOW); + break; + case SLJIT_ADD: + CHECK_ARGUMENT(!(op & VARIABLE_FLAG_MASK) + || GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY) + || GET_FLAG_TYPE(op) == SLJIT_OVERFLOW); + break; + case SLJIT_SUB: + CHECK_ARGUMENT(!(op & VARIABLE_FLAG_MASK) + || (GET_FLAG_TYPE(op) >= SLJIT_LESS && GET_FLAG_TYPE(op) <= SLJIT_OVERFLOW) + || GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY)); + break; + case SLJIT_ADDC: + case SLJIT_SUBC: + CHECK_ARGUMENT(!(op & VARIABLE_FLAG_MASK) + || GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY)); + CHECK_ARGUMENT((compiler->last_flags & 0xff) == GET_FLAG_TYPE(SLJIT_SET_CARRY)); + CHECK_ARGUMENT((op & SLJIT_I32_OP) == (compiler->last_flags & SLJIT_I32_OP)); + break; + default: + SLJIT_UNREACHABLE(); + break; + } + + FUNCTION_CHECK_DST(dst, dstw, 1); + FUNCTION_CHECK_SRC(src1, src1w); + FUNCTION_CHECK_SRC(src2, src2w); + compiler->last_flags = GET_FLAG_TYPE(op) | (op & (SLJIT_I32_OP | SLJIT_SET_Z)); +#endif +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) + if (SLJIT_UNLIKELY(!!compiler->verbose)) { + fprintf(compiler->verbose, " %s%s%s%s%s ", op2_names[GET_OPCODE(op) - SLJIT_OP2_BASE], !(op & SLJIT_I32_OP) ? "" : "32", + !(op & SLJIT_SET_Z) ? "" : ".z", !(op & VARIABLE_FLAG_MASK) ? "" : ".", + !(op & VARIABLE_FLAG_MASK) ? "" : jump_names[GET_FLAG_TYPE(op)]); + sljit_verbose_param(compiler, dst, dstw); + fprintf(compiler->verbose, ", "); + sljit_verbose_param(compiler, src1, src1w); + fprintf(compiler->verbose, ", "); + sljit_verbose_param(compiler, src2, src2w); + fprintf(compiler->verbose, "\n"); + } +#endif + CHECK_RETURN_OK; +} + +static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_get_register_index(sljit_s32 reg) +{ + SLJIT_UNUSED_ARG(reg); +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + CHECK_ARGUMENT(reg > 0 && reg <= SLJIT_NUMBER_OF_REGISTERS); +#endif + CHECK_RETURN_OK; +} + +static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_get_float_register_index(sljit_s32 reg) +{ + SLJIT_UNUSED_ARG(reg); +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + CHECK_ARGUMENT(reg > 0 && reg <= SLJIT_NUMBER_OF_FLOAT_REGISTERS); +#endif + CHECK_RETURN_OK; +} + +static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_op_custom(struct sljit_compiler *compiler, + void *instruction, sljit_s32 size) +{ +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) + int i; +#endif + + SLJIT_UNUSED_ARG(compiler); + +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + CHECK_ARGUMENT(instruction); + +#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) + CHECK_ARGUMENT(size > 0 && size < 16); +#elif (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) + CHECK_ARGUMENT((size == 2 && (((sljit_sw)instruction) & 0x1) == 0) + || (size == 4 && (((sljit_sw)instruction) & 0x3) == 0)); +#else + CHECK_ARGUMENT(size == 4 && (((sljit_sw)instruction) & 0x3) == 0); +#endif + + compiler->last_flags = 0; +#endif +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) + if (SLJIT_UNLIKELY(!!compiler->verbose)) { + fprintf(compiler->verbose, " op_custom"); + for (i = 0; i < size; i++) + fprintf(compiler->verbose, " 0x%x", ((sljit_u8*)instruction)[i]); + fprintf(compiler->verbose, "\n"); + } +#endif + CHECK_RETURN_OK; +} + +static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fop1(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + if (SLJIT_UNLIKELY(compiler->skip_checks)) { + compiler->skip_checks = 0; + CHECK_RETURN_OK; + } + +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU)); + CHECK_ARGUMENT(GET_OPCODE(op) >= SLJIT_MOV_F64 && GET_OPCODE(op) <= SLJIT_ABS_F64); + CHECK_ARGUMENT(!(op & (SLJIT_SET_Z | VARIABLE_FLAG_MASK))); + FUNCTION_FCHECK(src, srcw); + FUNCTION_FCHECK(dst, dstw); +#endif +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) + if (SLJIT_UNLIKELY(!!compiler->verbose)) { + if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_F32) + fprintf(compiler->verbose, " %s%s ", fop1_names[SLJIT_CONV_F64_FROM_F32 - SLJIT_FOP1_BASE], + (op & SLJIT_F32_OP) ? ".f32.from.f64" : ".f64.from.f32"); + else + fprintf(compiler->verbose, " %s%s ", fop1_names[GET_OPCODE(op) - SLJIT_FOP1_BASE], + (op & SLJIT_F32_OP) ? ".f32" : ".f64"); + + sljit_verbose_fparam(compiler, dst, dstw); + fprintf(compiler->verbose, ", "); + sljit_verbose_fparam(compiler, src, srcw); + fprintf(compiler->verbose, "\n"); + } +#endif + CHECK_RETURN_OK; +} + +static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fop1_cmp(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + compiler->last_flags = GET_FLAG_TYPE(op) | (op & (SLJIT_I32_OP | SLJIT_SET_Z)); +#endif + + if (SLJIT_UNLIKELY(compiler->skip_checks)) { + compiler->skip_checks = 0; + CHECK_RETURN_OK; + } + +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU)); + CHECK_ARGUMENT(GET_OPCODE(op) == SLJIT_CMP_F64); + CHECK_ARGUMENT(!(op & SLJIT_SET_Z)); + CHECK_ARGUMENT((op & VARIABLE_FLAG_MASK) + || (GET_FLAG_TYPE(op) >= SLJIT_EQUAL_F64 && GET_FLAG_TYPE(op) <= SLJIT_ORDERED_F64)); + FUNCTION_FCHECK(src1, src1w); + FUNCTION_FCHECK(src2, src2w); +#endif +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) + if (SLJIT_UNLIKELY(!!compiler->verbose)) { + fprintf(compiler->verbose, " %s%s", fop1_names[SLJIT_CMP_F64 - SLJIT_FOP1_BASE], (op & SLJIT_F32_OP) ? ".f32" : ".f64"); + if (op & VARIABLE_FLAG_MASK) { + fprintf(compiler->verbose, ".%s_f", jump_names[GET_FLAG_TYPE(op)]); + } + fprintf(compiler->verbose, " "); + sljit_verbose_fparam(compiler, src1, src1w); + fprintf(compiler->verbose, ", "); + sljit_verbose_fparam(compiler, src2, src2w); + fprintf(compiler->verbose, "\n"); + } +#endif + CHECK_RETURN_OK; +} + +static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fop1_conv_sw_from_f64(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + if (SLJIT_UNLIKELY(compiler->skip_checks)) { + compiler->skip_checks = 0; + CHECK_RETURN_OK; + } + +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU)); + CHECK_ARGUMENT(GET_OPCODE(op) >= SLJIT_CONV_SW_FROM_F64 && GET_OPCODE(op) <= SLJIT_CONV_S32_FROM_F64); + CHECK_ARGUMENT(!(op & (SLJIT_SET_Z | VARIABLE_FLAG_MASK))); + FUNCTION_FCHECK(src, srcw); + FUNCTION_CHECK_DST(dst, dstw, 0); +#endif +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) + if (SLJIT_UNLIKELY(!!compiler->verbose)) { + fprintf(compiler->verbose, " %s%s.from%s ", fop1_names[GET_OPCODE(op) - SLJIT_FOP1_BASE], + (GET_OPCODE(op) == SLJIT_CONV_S32_FROM_F64) ? ".s32" : ".sw", + (op & SLJIT_F32_OP) ? ".f32" : ".f64"); + sljit_verbose_param(compiler, dst, dstw); + fprintf(compiler->verbose, ", "); + sljit_verbose_fparam(compiler, src, srcw); + fprintf(compiler->verbose, "\n"); + } +#endif + CHECK_RETURN_OK; +} + +static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + if (SLJIT_UNLIKELY(compiler->skip_checks)) { + compiler->skip_checks = 0; + CHECK_RETURN_OK; + } + +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU)); + CHECK_ARGUMENT(GET_OPCODE(op) >= SLJIT_CONV_F64_FROM_SW && GET_OPCODE(op) <= SLJIT_CONV_F64_FROM_S32); + CHECK_ARGUMENT(!(op & (SLJIT_SET_Z | VARIABLE_FLAG_MASK))); + FUNCTION_CHECK_SRC(src, srcw); + FUNCTION_FCHECK(dst, dstw); +#endif +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) + if (SLJIT_UNLIKELY(!!compiler->verbose)) { + fprintf(compiler->verbose, " %s%s.from%s ", fop1_names[GET_OPCODE(op) - SLJIT_FOP1_BASE], + (op & SLJIT_F32_OP) ? ".f32" : ".f64", + (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32) ? ".s32" : ".sw"); + sljit_verbose_fparam(compiler, dst, dstw); + fprintf(compiler->verbose, ", "); + sljit_verbose_param(compiler, src, srcw); + fprintf(compiler->verbose, "\n"); + } +#endif + CHECK_RETURN_OK; +} + +static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fop2(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU)); + CHECK_ARGUMENT(GET_OPCODE(op) >= SLJIT_ADD_F64 && GET_OPCODE(op) <= SLJIT_DIV_F64); + CHECK_ARGUMENT(!(op & (SLJIT_SET_Z | VARIABLE_FLAG_MASK))); + FUNCTION_FCHECK(src1, src1w); + FUNCTION_FCHECK(src2, src2w); + FUNCTION_FCHECK(dst, dstw); +#endif +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) + if (SLJIT_UNLIKELY(!!compiler->verbose)) { + fprintf(compiler->verbose, " %s%s ", fop2_names[GET_OPCODE(op) - SLJIT_FOP2_BASE], (op & SLJIT_F32_OP) ? ".f32" : ".f64"); + sljit_verbose_fparam(compiler, dst, dstw); + fprintf(compiler->verbose, ", "); + sljit_verbose_fparam(compiler, src1, src1w); + fprintf(compiler->verbose, ", "); + sljit_verbose_fparam(compiler, src2, src2w); + fprintf(compiler->verbose, "\n"); + } +#endif + CHECK_RETURN_OK; +} + +static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_label(struct sljit_compiler *compiler) +{ + SLJIT_UNUSED_ARG(compiler); + + if (SLJIT_UNLIKELY(compiler->skip_checks)) { + compiler->skip_checks = 0; + CHECK_RETURN_OK; + } + +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + compiler->last_flags = 0; +#endif + +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) + if (SLJIT_UNLIKELY(!!compiler->verbose)) + fprintf(compiler->verbose, "label:\n"); +#endif + CHECK_RETURN_OK; +} + +static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_jump(struct sljit_compiler *compiler, sljit_s32 type) +{ + if (SLJIT_UNLIKELY(compiler->skip_checks)) { + compiler->skip_checks = 0; + CHECK_RETURN_OK; + } + +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + CHECK_ARGUMENT(!(type & ~(0xff | SLJIT_REWRITABLE_JUMP | SLJIT_I32_OP))); + CHECK_ARGUMENT((type & 0xff) != GET_FLAG_TYPE(SLJIT_SET_CARRY) && (type & 0xff) != (GET_FLAG_TYPE(SLJIT_SET_CARRY) + 1)); + CHECK_ARGUMENT((type & 0xff) >= SLJIT_EQUAL && (type & 0xff) <= SLJIT_FAST_CALL); + CHECK_ARGUMENT((type & 0xff) < SLJIT_JUMP || !(type & SLJIT_I32_OP)); + + if ((type & 0xff) < SLJIT_JUMP) { + if ((type & 0xff) <= SLJIT_NOT_ZERO) + CHECK_ARGUMENT(compiler->last_flags & SLJIT_SET_Z); + else + CHECK_ARGUMENT((type & 0xff) == (compiler->last_flags & 0xff) + || ((type & 0xff) == SLJIT_NOT_OVERFLOW && (compiler->last_flags & 0xff) == SLJIT_OVERFLOW) + || ((type & 0xff) == SLJIT_MUL_NOT_OVERFLOW && (compiler->last_flags & 0xff) == SLJIT_MUL_OVERFLOW)); + CHECK_ARGUMENT((type & SLJIT_I32_OP) == (compiler->last_flags & SLJIT_I32_OP)); + } +#endif +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) + if (SLJIT_UNLIKELY(!!compiler->verbose)) + fprintf(compiler->verbose, " jump%s %s%s\n", !(type & SLJIT_REWRITABLE_JUMP) ? "" : ".r", + jump_names[type & 0xff], JUMP_POSTFIX(type)); +#endif + CHECK_RETURN_OK; +} + +static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_call(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 arg_types) +{ +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + sljit_s32 i, types, curr_type, scratches, fscratches; + + CHECK_ARGUMENT(!(type & ~(0xff | SLJIT_REWRITABLE_JUMP))); + CHECK_ARGUMENT((type & 0xff) == SLJIT_CALL || (type & 0xff) == SLJIT_CALL_CDECL); + + types = arg_types; + scratches = 0; + fscratches = 0; + for (i = 0; i < 5; i++) { + curr_type = (types & SLJIT_DEF_MASK); + CHECK_ARGUMENT(curr_type <= SLJIT_ARG_TYPE_F64); + if (i > 0) { + if (curr_type == 0) { + break; + } + if (curr_type >= SLJIT_ARG_TYPE_F32) + fscratches++; + else + scratches++; + } else { + if (curr_type >= SLJIT_ARG_TYPE_F32) { + CHECK_ARGUMENT(compiler->fscratches > 0); + } else if (curr_type >= SLJIT_ARG_TYPE_SW) { + CHECK_ARGUMENT(compiler->scratches > 0); + } + } + types >>= SLJIT_DEF_SHIFT; + } + CHECK_ARGUMENT(compiler->scratches >= scratches); + CHECK_ARGUMENT(compiler->fscratches >= fscratches); + CHECK_ARGUMENT(types == 0); +#endif +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) + if (SLJIT_UNLIKELY(!!compiler->verbose)) { + fprintf(compiler->verbose, " %s%s ret[%s", jump_names[type & 0xff], + !(type & SLJIT_REWRITABLE_JUMP) ? "" : ".r", call_arg_names[arg_types & SLJIT_DEF_MASK]); + + arg_types >>= SLJIT_DEF_SHIFT; + if (arg_types) { + fprintf(compiler->verbose, "], args["); + do { + fprintf(compiler->verbose, "%s", call_arg_names[arg_types & SLJIT_DEF_MASK]); + arg_types >>= SLJIT_DEF_SHIFT; + if (arg_types) + fprintf(compiler->verbose, ","); + } while (arg_types); + } + fprintf(compiler->verbose, "]\n"); + } +#endif + CHECK_RETURN_OK; +} + +static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_cmp(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + CHECK_ARGUMENT(!(type & ~(0xff | SLJIT_REWRITABLE_JUMP | SLJIT_I32_OP))); + CHECK_ARGUMENT((type & 0xff) >= SLJIT_EQUAL && (type & 0xff) <= SLJIT_SIG_LESS_EQUAL); + FUNCTION_CHECK_SRC(src1, src1w); + FUNCTION_CHECK_SRC(src2, src2w); + compiler->last_flags = 0; +#endif +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) + if (SLJIT_UNLIKELY(!!compiler->verbose)) { + fprintf(compiler->verbose, " cmp%s %s%s, ", !(type & SLJIT_REWRITABLE_JUMP) ? "" : ".r", + jump_names[type & 0xff], (type & SLJIT_I32_OP) ? "32" : ""); + sljit_verbose_param(compiler, src1, src1w); + fprintf(compiler->verbose, ", "); + sljit_verbose_param(compiler, src2, src2w); + fprintf(compiler->verbose, "\n"); + } +#endif + CHECK_RETURN_OK; +} + +static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fcmp(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + CHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU)); + CHECK_ARGUMENT(!(type & ~(0xff | SLJIT_REWRITABLE_JUMP | SLJIT_F32_OP))); + CHECK_ARGUMENT((type & 0xff) >= SLJIT_EQUAL_F64 && (type & 0xff) <= SLJIT_ORDERED_F64); + FUNCTION_FCHECK(src1, src1w); + FUNCTION_FCHECK(src2, src2w); + compiler->last_flags = 0; +#endif +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) + if (SLJIT_UNLIKELY(!!compiler->verbose)) { + fprintf(compiler->verbose, " fcmp%s %s%s, ", !(type & SLJIT_REWRITABLE_JUMP) ? "" : ".r", + jump_names[type & 0xff], (type & SLJIT_F32_OP) ? ".f32" : ".f64"); + sljit_verbose_fparam(compiler, src1, src1w); + fprintf(compiler->verbose, ", "); + sljit_verbose_fparam(compiler, src2, src2w); + fprintf(compiler->verbose, "\n"); + } +#endif + CHECK_RETURN_OK; +} + +static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_ijump(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 src, sljit_sw srcw) +{ + if (SLJIT_UNLIKELY(compiler->skip_checks)) { + compiler->skip_checks = 0; + CHECK_RETURN_OK; + } + +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + CHECK_ARGUMENT(type >= SLJIT_JUMP && type <= SLJIT_FAST_CALL); + FUNCTION_CHECK_SRC(src, srcw); +#endif +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) + if (SLJIT_UNLIKELY(!!compiler->verbose)) { + fprintf(compiler->verbose, " ijump.%s ", jump_names[type]); + sljit_verbose_param(compiler, src, srcw); + fprintf(compiler->verbose, "\n"); + } +#endif + CHECK_RETURN_OK; +} + +static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_icall(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 arg_types, + sljit_s32 src, sljit_sw srcw) +{ +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + sljit_s32 i, types, curr_type, scratches, fscratches; + + CHECK_ARGUMENT(type == SLJIT_CALL || type == SLJIT_CALL_CDECL); + FUNCTION_CHECK_SRC(src, srcw); + + types = arg_types; + scratches = 0; + fscratches = 0; + for (i = 0; i < 5; i++) { + curr_type = (types & SLJIT_DEF_MASK); + CHECK_ARGUMENT(curr_type <= SLJIT_ARG_TYPE_F64); + if (i > 0) { + if (curr_type == 0) { + break; + } + if (curr_type >= SLJIT_ARG_TYPE_F32) + fscratches++; + else + scratches++; + } else { + if (curr_type >= SLJIT_ARG_TYPE_F32) { + CHECK_ARGUMENT(compiler->fscratches > 0); + } else if (curr_type >= SLJIT_ARG_TYPE_SW) { + CHECK_ARGUMENT(compiler->scratches > 0); + } + } + types >>= SLJIT_DEF_SHIFT; + } + CHECK_ARGUMENT(compiler->scratches >= scratches); + CHECK_ARGUMENT(compiler->fscratches >= fscratches); + CHECK_ARGUMENT(types == 0); +#endif +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) + if (SLJIT_UNLIKELY(!!compiler->verbose)) { + fprintf(compiler->verbose, " i%s%s ret[%s", jump_names[type & 0xff], + !(type & SLJIT_REWRITABLE_JUMP) ? "" : ".r", call_arg_names[arg_types & SLJIT_DEF_MASK]); + + arg_types >>= SLJIT_DEF_SHIFT; + if (arg_types) { + fprintf(compiler->verbose, "], args["); + do { + fprintf(compiler->verbose, "%s", call_arg_names[arg_types & SLJIT_DEF_MASK]); + arg_types >>= SLJIT_DEF_SHIFT; + if (arg_types) + fprintf(compiler->verbose, ","); + } while (arg_types); + } + fprintf(compiler->verbose, "], "); + sljit_verbose_param(compiler, src, srcw); + fprintf(compiler->verbose, "\n"); + } +#endif + CHECK_RETURN_OK; +} + +static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 type) +{ +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + CHECK_ARGUMENT(!(type & ~(0xff | SLJIT_I32_OP))); + CHECK_ARGUMENT((type & 0xff) >= SLJIT_EQUAL && (type & 0xff) <= SLJIT_ORDERED_F64); + CHECK_ARGUMENT((type & 0xff) != GET_FLAG_TYPE(SLJIT_SET_CARRY) && (type & 0xff) != (GET_FLAG_TYPE(SLJIT_SET_CARRY) + 1)); + CHECK_ARGUMENT(op == SLJIT_MOV || op == SLJIT_MOV32 + || (GET_OPCODE(op) >= SLJIT_AND && GET_OPCODE(op) <= SLJIT_XOR)); + CHECK_ARGUMENT(!(op & VARIABLE_FLAG_MASK)); + + if ((type & 0xff) <= SLJIT_NOT_ZERO) + CHECK_ARGUMENT(compiler->last_flags & SLJIT_SET_Z); + else + CHECK_ARGUMENT((type & 0xff) == (compiler->last_flags & 0xff) + || ((type & 0xff) == SLJIT_NOT_OVERFLOW && (compiler->last_flags & 0xff) == SLJIT_OVERFLOW) + || ((type & 0xff) == SLJIT_MUL_NOT_OVERFLOW && (compiler->last_flags & 0xff) == SLJIT_MUL_OVERFLOW)); + + FUNCTION_CHECK_DST(dst, dstw, 0); + + if (GET_OPCODE(op) >= SLJIT_ADD) + compiler->last_flags = GET_FLAG_TYPE(op) | (op & (SLJIT_I32_OP | SLJIT_SET_Z)); +#endif +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) + if (SLJIT_UNLIKELY(!!compiler->verbose)) { + fprintf(compiler->verbose, " flags%s %s%s, ", + !(op & SLJIT_SET_Z) ? "" : ".z", + GET_OPCODE(op) < SLJIT_OP2_BASE ? "mov" : op2_names[GET_OPCODE(op) - SLJIT_OP2_BASE], + GET_OPCODE(op) < SLJIT_OP2_BASE ? op1_names[GET_OPCODE(op) - SLJIT_OP1_BASE] : ((op & SLJIT_I32_OP) ? "32" : "")); + sljit_verbose_param(compiler, dst, dstw); + fprintf(compiler->verbose, ", %s%s\n", jump_names[type & 0xff], JUMP_POSTFIX(type)); + } +#endif + CHECK_RETURN_OK; +} + +static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_cmov(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 dst_reg, + sljit_s32 src, sljit_sw srcw) +{ +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + CHECK_ARGUMENT(!(type & ~(0xff | SLJIT_I32_OP))); + CHECK_ARGUMENT((type & 0xff) >= SLJIT_EQUAL && (type & 0xff) <= SLJIT_ORDERED_F64); + + CHECK_ARGUMENT(compiler->scratches != -1 && compiler->saveds != -1); + CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(dst_reg & ~SLJIT_I32_OP)); + if (src != SLJIT_IMM) { + CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(src)); + CHECK_ARGUMENT(srcw == 0); + } + + if ((type & 0xff) <= SLJIT_NOT_ZERO) + CHECK_ARGUMENT(compiler->last_flags & SLJIT_SET_Z); + else + CHECK_ARGUMENT((type & 0xff) == (compiler->last_flags & 0xff) + || ((type & 0xff) == SLJIT_NOT_OVERFLOW && (compiler->last_flags & 0xff) == SLJIT_OVERFLOW) + || ((type & 0xff) == SLJIT_MUL_NOT_OVERFLOW && (compiler->last_flags & 0xff) == SLJIT_MUL_OVERFLOW)); +#endif +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) + if (SLJIT_UNLIKELY(!!compiler->verbose)) { + fprintf(compiler->verbose, " cmov%s %s%s, ", + !(dst_reg & SLJIT_I32_OP) ? "" : "32", + jump_names[type & 0xff], JUMP_POSTFIX(type)); + sljit_verbose_reg(compiler, dst_reg & ~SLJIT_I32_OP); + fprintf(compiler->verbose, ", "); + sljit_verbose_param(compiler, src, srcw); + fprintf(compiler->verbose, "\n"); + } +#endif + CHECK_RETURN_OK; +} + +static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_mem(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 reg, + sljit_s32 mem, sljit_sw memw) +{ +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + CHECK_ARGUMENT((type & 0xff) >= SLJIT_MOV && (type & 0xff) <= SLJIT_MOV_P); + CHECK_ARGUMENT(!(type & SLJIT_I32_OP) || ((type & 0xff) != SLJIT_MOV && (type & 0xff) != SLJIT_MOV_U32 && (type & 0xff) != SLJIT_MOV_P)); + CHECK_ARGUMENT((type & SLJIT_MEM_PRE) || (type & SLJIT_MEM_POST)); + CHECK_ARGUMENT((type & (SLJIT_MEM_PRE | SLJIT_MEM_POST)) != (SLJIT_MEM_PRE | SLJIT_MEM_POST)); + CHECK_ARGUMENT((type & ~(0xff | SLJIT_I32_OP | SLJIT_MEM_STORE | SLJIT_MEM_SUPP | SLJIT_MEM_PRE | SLJIT_MEM_POST)) == 0); + + FUNCTION_CHECK_SRC_MEM(mem, memw); + CHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(reg)); + + CHECK_ARGUMENT((mem & REG_MASK) != SLJIT_UNUSED && (mem & REG_MASK) != reg); +#endif +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) + if (!(type & SLJIT_MEM_SUPP) && SLJIT_UNLIKELY(!!compiler->verbose)) { + if (sljit_emit_mem(compiler, type | SLJIT_MEM_SUPP, reg, mem, memw) == SLJIT_ERR_UNSUPPORTED) + fprintf(compiler->verbose, " //"); + + fprintf(compiler->verbose, " mem%s.%s%s%s ", + !(type & SLJIT_I32_OP) ? "" : "32", + (type & SLJIT_MEM_STORE) ? "st" : "ld", + op1_names[(type & 0xff) - SLJIT_OP1_BASE], + (type & SLJIT_MEM_PRE) ? ".pre" : ".post"); + sljit_verbose_reg(compiler, reg); + fprintf(compiler->verbose, ", "); + sljit_verbose_param(compiler, mem, memw); + fprintf(compiler->verbose, "\n"); + } +#endif + CHECK_RETURN_OK; +} + +static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fmem(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, + sljit_s32 mem, sljit_sw memw) +{ +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + CHECK_ARGUMENT((type & 0xff) == SLJIT_MOV_F64); + CHECK_ARGUMENT((type & SLJIT_MEM_PRE) || (type & SLJIT_MEM_POST)); + CHECK_ARGUMENT((type & (SLJIT_MEM_PRE | SLJIT_MEM_POST)) != (SLJIT_MEM_PRE | SLJIT_MEM_POST)); + CHECK_ARGUMENT((type & ~(0xff | SLJIT_I32_OP | SLJIT_MEM_STORE | SLJIT_MEM_SUPP | SLJIT_MEM_PRE | SLJIT_MEM_POST)) == 0); + + FUNCTION_CHECK_SRC_MEM(mem, memw); + CHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg)); +#endif +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) + if (!(type & SLJIT_MEM_SUPP) && SLJIT_UNLIKELY(!!compiler->verbose)) { + if (sljit_emit_fmem(compiler, type | SLJIT_MEM_SUPP, freg, mem, memw) == SLJIT_ERR_UNSUPPORTED) + fprintf(compiler->verbose, " //"); + + fprintf(compiler->verbose, " fmem.%s%s%s ", + (type & SLJIT_MEM_STORE) ? "st" : "ld", + !(type & SLJIT_I32_OP) ? ".f64" : ".f32", + (type & SLJIT_MEM_PRE) ? ".pre" : ".post"); + sljit_verbose_freg(compiler, freg); + fprintf(compiler->verbose, ", "); + sljit_verbose_param(compiler, mem, memw); + fprintf(compiler->verbose, "\n"); + } +#endif + CHECK_RETURN_OK; +} + +static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_get_local_base(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw offset) +{ + /* Any offset is allowed. */ + SLJIT_UNUSED_ARG(offset); + +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + FUNCTION_CHECK_DST(dst, dstw, 0); +#endif +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) + if (SLJIT_UNLIKELY(!!compiler->verbose)) { + fprintf(compiler->verbose, " local_base "); + sljit_verbose_param(compiler, dst, dstw); + fprintf(compiler->verbose, ", #%" SLJIT_PRINT_D "d\n", offset); + } +#endif + CHECK_RETURN_OK; +} + +static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw init_value) +{ + SLJIT_UNUSED_ARG(init_value); + +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + FUNCTION_CHECK_DST(dst, dstw, 0); +#endif +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) + if (SLJIT_UNLIKELY(!!compiler->verbose)) { + fprintf(compiler->verbose, " const "); + sljit_verbose_param(compiler, dst, dstw); + fprintf(compiler->verbose, ", #%" SLJIT_PRINT_D "d\n", init_value); + } +#endif + CHECK_RETURN_OK; +} + +static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_put_label(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw) +{ +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + FUNCTION_CHECK_DST(dst, dstw, 0); +#endif +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) + if (SLJIT_UNLIKELY(!!compiler->verbose)) { + fprintf(compiler->verbose, " put_label "); + sljit_verbose_param(compiler, dst, dstw); + fprintf(compiler->verbose, "\n"); + } +#endif + CHECK_RETURN_OK; +} + +#endif /* SLJIT_ARGUMENT_CHECKS || SLJIT_VERBOSE */ + +#define SELECT_FOP1_OPERATION_WITH_CHECKS(compiler, op, dst, dstw, src, srcw) \ + SLJIT_COMPILE_ASSERT(!(SLJIT_CONV_SW_FROM_F64 & 0x1) && !(SLJIT_CONV_F64_FROM_SW & 0x1), \ + invalid_float_opcodes); \ + if (GET_OPCODE(op) >= SLJIT_CONV_SW_FROM_F64 && GET_OPCODE(op) <= SLJIT_CMP_F64) { \ + if (GET_OPCODE(op) == SLJIT_CMP_F64) { \ + CHECK(check_sljit_emit_fop1_cmp(compiler, op, dst, dstw, src, srcw)); \ + ADJUST_LOCAL_OFFSET(dst, dstw); \ + ADJUST_LOCAL_OFFSET(src, srcw); \ + return sljit_emit_fop1_cmp(compiler, op, dst, dstw, src, srcw); \ + } \ + if ((GET_OPCODE(op) | 0x1) == SLJIT_CONV_S32_FROM_F64) { \ + CHECK(check_sljit_emit_fop1_conv_sw_from_f64(compiler, op, dst, dstw, src, srcw)); \ + ADJUST_LOCAL_OFFSET(dst, dstw); \ + ADJUST_LOCAL_OFFSET(src, srcw); \ + return sljit_emit_fop1_conv_sw_from_f64(compiler, op, dst, dstw, src, srcw); \ + } \ + CHECK(check_sljit_emit_fop1_conv_f64_from_sw(compiler, op, dst, dstw, src, srcw)); \ + ADJUST_LOCAL_OFFSET(dst, dstw); \ + ADJUST_LOCAL_OFFSET(src, srcw); \ + return sljit_emit_fop1_conv_f64_from_sw(compiler, op, dst, dstw, src, srcw); \ + } \ + CHECK(check_sljit_emit_fop1(compiler, op, dst, dstw, src, srcw)); \ + ADJUST_LOCAL_OFFSET(dst, dstw); \ + ADJUST_LOCAL_OFFSET(src, srcw); + +static SLJIT_INLINE sljit_s32 emit_mov_before_return(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw) +{ + /* Return if don't need to do anything. */ + if (op == SLJIT_UNUSED) + return SLJIT_SUCCESS; + +#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) + /* At the moment the pointer size is always equal to sljit_sw. May be changed in the future. */ + if (src == SLJIT_RETURN_REG && (op == SLJIT_MOV || op == SLJIT_MOV_P)) + return SLJIT_SUCCESS; +#else + if (src == SLJIT_RETURN_REG && (op == SLJIT_MOV || op == SLJIT_MOV_U32 || op == SLJIT_MOV_S32 || op == SLJIT_MOV_P)) + return SLJIT_SUCCESS; +#endif + +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) \ + || (defined SLJIT_VERBOSE && SLJIT_VERBOSE) + compiler->skip_checks = 1; +#endif + return sljit_emit_op1(compiler, op, SLJIT_RETURN_REG, 0, src, srcw); +} + +#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) \ + || (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC) \ + || (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) \ + || ((defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS) && !(defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1)) + +static SLJIT_INLINE sljit_s32 sljit_emit_cmov_generic(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 dst_reg, + sljit_s32 src, sljit_sw srcw) +{ + struct sljit_label *label; + struct sljit_jump *jump; + sljit_s32 op = (dst_reg & SLJIT_I32_OP) ? SLJIT_MOV32 : SLJIT_MOV; + +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \ + || (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + compiler->skip_checks = 1; +#endif + jump = sljit_emit_jump(compiler, type ^ 0x1); + FAIL_IF(!jump); + +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \ + || (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + compiler->skip_checks = 1; +#endif + FAIL_IF(sljit_emit_op1(compiler, op, dst_reg & ~SLJIT_I32_OP, 0, src, srcw)); + +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \ + || (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + compiler->skip_checks = 1; +#endif + label = sljit_emit_label(compiler); + FAIL_IF(!label); + sljit_set_label(jump, label); + return SLJIT_SUCCESS; +} + +#endif + +/* CPU description section */ + +#if (defined SLJIT_32BIT_ARCHITECTURE && SLJIT_32BIT_ARCHITECTURE) +#define SLJIT_CPUINFO_PART1 " 32bit (" +#elif (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE) +#define SLJIT_CPUINFO_PART1 " 64bit (" +#else +#error "Internal error: CPU type info missing" +#endif + +#if (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN) +#define SLJIT_CPUINFO_PART2 "little endian + " +#elif (defined SLJIT_BIG_ENDIAN && SLJIT_BIG_ENDIAN) +#define SLJIT_CPUINFO_PART2 "big endian + " +#else +#error "Internal error: CPU type info missing" +#endif + +#if (defined SLJIT_UNALIGNED && SLJIT_UNALIGNED) +#define SLJIT_CPUINFO_PART3 "unaligned)" +#else +#define SLJIT_CPUINFO_PART3 "aligned)" +#endif + +#define SLJIT_CPUINFO SLJIT_CPUINFO_PART1 SLJIT_CPUINFO_PART2 SLJIT_CPUINFO_PART3 + +#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) +# include "sljitNativeX86_common.c" +#elif (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) +# include "sljitNativeARM_32.c" +#elif (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) +# include "sljitNativeARM_32.c" +#elif (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) +# include "sljitNativeARM_T2_32.c" +#elif (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) +# include "sljitNativeARM_64.c" +#elif (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC) +# include "sljitNativePPC_common.c" +#elif (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS) +# include "sljitNativeMIPS_common.c" +#elif (defined SLJIT_CONFIG_SPARC && SLJIT_CONFIG_SPARC) +# include "sljitNativeSPARC_common.c" +#elif (defined SLJIT_CONFIG_TILEGX && SLJIT_CONFIG_TILEGX) +# include "sljitNativeTILEGX_64.c" +#endif + +#if !(defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS) + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + /* Default compare for most architectures. */ + sljit_s32 flags, tmp_src, condition; + sljit_sw tmp_srcw; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_cmp(compiler, type, src1, src1w, src2, src2w)); + + condition = type & 0xff; +#if (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) + if ((condition == SLJIT_EQUAL || condition == SLJIT_NOT_EQUAL)) { + if ((src1 & SLJIT_IMM) && !src1w) { + src1 = src2; + src1w = src2w; + src2 = SLJIT_IMM; + src2w = 0; + } + if ((src2 & SLJIT_IMM) && !src2w) + return emit_cmp_to0(compiler, type, src1, src1w); + } +#endif + + if (SLJIT_UNLIKELY((src1 & SLJIT_IMM) && !(src2 & SLJIT_IMM))) { + /* Immediate is prefered as second argument by most architectures. */ + switch (condition) { + case SLJIT_LESS: + condition = SLJIT_GREATER; + break; + case SLJIT_GREATER_EQUAL: + condition = SLJIT_LESS_EQUAL; + break; + case SLJIT_GREATER: + condition = SLJIT_LESS; + break; + case SLJIT_LESS_EQUAL: + condition = SLJIT_GREATER_EQUAL; + break; + case SLJIT_SIG_LESS: + condition = SLJIT_SIG_GREATER; + break; + case SLJIT_SIG_GREATER_EQUAL: + condition = SLJIT_SIG_LESS_EQUAL; + break; + case SLJIT_SIG_GREATER: + condition = SLJIT_SIG_LESS; + break; + case SLJIT_SIG_LESS_EQUAL: + condition = SLJIT_SIG_GREATER_EQUAL; + break; + } + + type = condition | (type & (SLJIT_I32_OP | SLJIT_REWRITABLE_JUMP)); + tmp_src = src1; + src1 = src2; + src2 = tmp_src; + tmp_srcw = src1w; + src1w = src2w; + src2w = tmp_srcw; + } + + if (condition <= SLJIT_NOT_ZERO) + flags = SLJIT_SET_Z; + else + flags = condition << VARIABLE_FLAG_SHIFT; + +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \ + || (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + compiler->skip_checks = 1; +#endif + PTR_FAIL_IF(sljit_emit_op2(compiler, SLJIT_SUB | flags | (type & SLJIT_I32_OP), + SLJIT_UNUSED, 0, src1, src1w, src2, src2w)); +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \ + || (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + compiler->skip_checks = 1; +#endif + return sljit_emit_jump(compiler, condition | (type & (SLJIT_REWRITABLE_JUMP | SLJIT_I32_OP))); +} + +#endif + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_fcmp(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_fcmp(compiler, type, src1, src1w, src2, src2w)); + +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \ + || (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + compiler->skip_checks = 1; +#endif + sljit_emit_fop1(compiler, SLJIT_CMP_F64 | ((type & 0xff) << VARIABLE_FLAG_SHIFT) | (type & SLJIT_I32_OP), src1, src1w, src2, src2w); + +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \ + || (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + compiler->skip_checks = 1; +#endif + return sljit_emit_jump(compiler, type); +} + +#if !(defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32) \ + && !(defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \ + && !(defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC) + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 reg, + sljit_s32 mem, sljit_sw memw) +{ + SLJIT_UNUSED_ARG(compiler); + SLJIT_UNUSED_ARG(type); + SLJIT_UNUSED_ARG(reg); + SLJIT_UNUSED_ARG(mem); + SLJIT_UNUSED_ARG(memw); + + CHECK_ERROR(); + CHECK(check_sljit_emit_mem(compiler, type, reg, mem, memw)); + + return SLJIT_ERR_UNSUPPORTED; +} + +#endif + +#if !(defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \ + && !(defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC) + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fmem(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, + sljit_s32 mem, sljit_sw memw) +{ + SLJIT_UNUSED_ARG(compiler); + SLJIT_UNUSED_ARG(type); + SLJIT_UNUSED_ARG(freg); + SLJIT_UNUSED_ARG(mem); + SLJIT_UNUSED_ARG(memw); + + CHECK_ERROR(); + CHECK(check_sljit_emit_fmem(compiler, type, freg, mem, memw)); + + return SLJIT_ERR_UNSUPPORTED; +} + +#endif + +#if !(defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) \ + && !(defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_local_base(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw offset) +{ + CHECK_ERROR(); + CHECK(check_sljit_get_local_base(compiler, dst, dstw, offset)); + + ADJUST_LOCAL_OFFSET(SLJIT_MEM1(SLJIT_SP), offset); +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \ + || (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + compiler->skip_checks = 1; +#endif + if (offset != 0) + return sljit_emit_op2(compiler, SLJIT_ADD, dst, dstw, SLJIT_SP, 0, SLJIT_IMM, offset); + return sljit_emit_op1(compiler, SLJIT_MOV, dst, dstw, SLJIT_SP, 0); +} + +#endif + +#else /* SLJIT_CONFIG_UNSUPPORTED */ + +/* Empty function bodies for those machines, which are not (yet) supported. */ + +SLJIT_API_FUNC_ATTRIBUTE const char* sljit_get_platform_name(void) +{ + return "unsupported"; +} + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_compiler* sljit_create_compiler(void *allocator_data) +{ + SLJIT_UNUSED_ARG(allocator_data); + SLJIT_UNREACHABLE(); + return NULL; +} + +SLJIT_API_FUNC_ATTRIBUTE void sljit_free_compiler(struct sljit_compiler *compiler) +{ + SLJIT_UNUSED_ARG(compiler); + SLJIT_UNREACHABLE(); +} + +SLJIT_API_FUNC_ATTRIBUTE void sljit_set_compiler_memory_error(struct sljit_compiler *compiler) +{ + SLJIT_UNUSED_ARG(compiler); + SLJIT_UNREACHABLE(); +} + +SLJIT_API_FUNC_ATTRIBUTE void* sljit_alloc_memory(struct sljit_compiler *compiler, sljit_s32 size) +{ + SLJIT_UNUSED_ARG(compiler); + SLJIT_UNUSED_ARG(size); + SLJIT_UNREACHABLE(); + return NULL; +} + +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) +SLJIT_API_FUNC_ATTRIBUTE void sljit_compiler_verbose(struct sljit_compiler *compiler, FILE* verbose) +{ + SLJIT_UNUSED_ARG(compiler); + SLJIT_UNUSED_ARG(verbose); + SLJIT_UNREACHABLE(); +} +#endif + +SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler) +{ + SLJIT_UNUSED_ARG(compiler); + SLJIT_UNREACHABLE(); + return NULL; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type) +{ + SLJIT_UNUSED_ARG(feature_type); + SLJIT_UNREACHABLE(); + return 0; +} + +SLJIT_API_FUNC_ATTRIBUTE void sljit_free_code(void* code) +{ + SLJIT_UNUSED_ARG(code); + SLJIT_UNREACHABLE(); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compiler, + sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds, + sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size) +{ + SLJIT_UNUSED_ARG(compiler); + SLJIT_UNUSED_ARG(options); + SLJIT_UNUSED_ARG(arg_types); + SLJIT_UNUSED_ARG(scratches); + SLJIT_UNUSED_ARG(saveds); + SLJIT_UNUSED_ARG(fscratches); + SLJIT_UNUSED_ARG(fsaveds); + SLJIT_UNUSED_ARG(local_size); + SLJIT_UNREACHABLE(); + return SLJIT_ERR_UNSUPPORTED; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_set_context(struct sljit_compiler *compiler, + sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds, + sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size) +{ + SLJIT_UNUSED_ARG(compiler); + SLJIT_UNUSED_ARG(options); + SLJIT_UNUSED_ARG(arg_types); + SLJIT_UNUSED_ARG(scratches); + SLJIT_UNUSED_ARG(saveds); + SLJIT_UNUSED_ARG(fscratches); + SLJIT_UNUSED_ARG(fsaveds); + SLJIT_UNUSED_ARG(local_size); + SLJIT_UNREACHABLE(); + return SLJIT_ERR_UNSUPPORTED; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw) +{ + SLJIT_UNUSED_ARG(compiler); + SLJIT_UNUSED_ARG(op); + SLJIT_UNUSED_ARG(src); + SLJIT_UNUSED_ARG(srcw); + SLJIT_UNREACHABLE(); + return SLJIT_ERR_UNSUPPORTED; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw) +{ + SLJIT_UNUSED_ARG(compiler); + SLJIT_UNUSED_ARG(dst); + SLJIT_UNUSED_ARG(dstw); + SLJIT_UNREACHABLE(); + return SLJIT_ERR_UNSUPPORTED; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw) +{ + SLJIT_UNUSED_ARG(compiler); + SLJIT_UNUSED_ARG(src); + SLJIT_UNUSED_ARG(srcw); + SLJIT_UNREACHABLE(); + return SLJIT_ERR_UNSUPPORTED; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compiler, sljit_s32 op) +{ + SLJIT_UNUSED_ARG(compiler); + SLJIT_UNUSED_ARG(op); + SLJIT_UNREACHABLE(); + return SLJIT_ERR_UNSUPPORTED; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + SLJIT_UNUSED_ARG(compiler); + SLJIT_UNUSED_ARG(op); + SLJIT_UNUSED_ARG(dst); + SLJIT_UNUSED_ARG(dstw); + SLJIT_UNUSED_ARG(src); + SLJIT_UNUSED_ARG(srcw); + SLJIT_UNREACHABLE(); + return SLJIT_ERR_UNSUPPORTED; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + SLJIT_UNUSED_ARG(compiler); + SLJIT_UNUSED_ARG(op); + SLJIT_UNUSED_ARG(dst); + SLJIT_UNUSED_ARG(dstw); + SLJIT_UNUSED_ARG(src1); + SLJIT_UNUSED_ARG(src1w); + SLJIT_UNUSED_ARG(src2); + SLJIT_UNUSED_ARG(src2w); + SLJIT_UNREACHABLE(); + return SLJIT_ERR_UNSUPPORTED; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg) +{ + SLJIT_UNREACHABLE(); + return reg; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler, + void *instruction, sljit_s32 size) +{ + SLJIT_UNUSED_ARG(compiler); + SLJIT_UNUSED_ARG(instruction); + SLJIT_UNUSED_ARG(size); + SLJIT_UNREACHABLE(); + return SLJIT_ERR_UNSUPPORTED; +} + +SLJIT_API_FUNC_ATTRIBUTE void sljit_set_current_flags(struct sljit_compiler *compiler, sljit_s32 current_flags) +{ + SLJIT_UNUSED_ARG(compiler); + SLJIT_UNUSED_ARG(current_flags); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + SLJIT_UNUSED_ARG(compiler); + SLJIT_UNUSED_ARG(op); + SLJIT_UNUSED_ARG(dst); + SLJIT_UNUSED_ARG(dstw); + SLJIT_UNUSED_ARG(src); + SLJIT_UNUSED_ARG(srcw); + SLJIT_UNREACHABLE(); + return SLJIT_ERR_UNSUPPORTED; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + SLJIT_UNUSED_ARG(compiler); + SLJIT_UNUSED_ARG(op); + SLJIT_UNUSED_ARG(dst); + SLJIT_UNUSED_ARG(dstw); + SLJIT_UNUSED_ARG(src1); + SLJIT_UNUSED_ARG(src1w); + SLJIT_UNUSED_ARG(src2); + SLJIT_UNUSED_ARG(src2w); + SLJIT_UNREACHABLE(); + return SLJIT_ERR_UNSUPPORTED; +} + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compiler *compiler) +{ + SLJIT_UNUSED_ARG(compiler); + SLJIT_UNREACHABLE(); + return NULL; +} + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, sljit_s32 type) +{ + SLJIT_UNUSED_ARG(compiler); + SLJIT_UNUSED_ARG(type); + SLJIT_UNREACHABLE(); + return NULL; +} + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_call(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 arg_types) +{ + SLJIT_UNUSED_ARG(compiler); + SLJIT_UNUSED_ARG(type); + SLJIT_UNUSED_ARG(arg_types); + SLJIT_UNREACHABLE(); + return NULL; +} + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + SLJIT_UNUSED_ARG(compiler); + SLJIT_UNUSED_ARG(type); + SLJIT_UNUSED_ARG(src1); + SLJIT_UNUSED_ARG(src1w); + SLJIT_UNUSED_ARG(src2); + SLJIT_UNUSED_ARG(src2w); + SLJIT_UNREACHABLE(); + return NULL; +} + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_fcmp(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + SLJIT_UNUSED_ARG(compiler); + SLJIT_UNUSED_ARG(type); + SLJIT_UNUSED_ARG(src1); + SLJIT_UNUSED_ARG(src1w); + SLJIT_UNUSED_ARG(src2); + SLJIT_UNUSED_ARG(src2w); + SLJIT_UNREACHABLE(); + return NULL; +} + +SLJIT_API_FUNC_ATTRIBUTE void sljit_set_label(struct sljit_jump *jump, struct sljit_label* label) +{ + SLJIT_UNUSED_ARG(jump); + SLJIT_UNUSED_ARG(label); + SLJIT_UNREACHABLE(); +} + +SLJIT_API_FUNC_ATTRIBUTE void sljit_set_target(struct sljit_jump *jump, sljit_uw target) +{ + SLJIT_UNUSED_ARG(jump); + SLJIT_UNUSED_ARG(target); + SLJIT_UNREACHABLE(); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 src, sljit_sw srcw) +{ + SLJIT_UNUSED_ARG(compiler); + SLJIT_UNUSED_ARG(type); + SLJIT_UNUSED_ARG(src); + SLJIT_UNUSED_ARG(srcw); + SLJIT_UNREACHABLE(); + return SLJIT_ERR_UNSUPPORTED; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_icall(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 arg_types, + sljit_s32 src, sljit_sw srcw) +{ + SLJIT_UNUSED_ARG(compiler); + SLJIT_UNUSED_ARG(type); + SLJIT_UNUSED_ARG(arg_types); + SLJIT_UNUSED_ARG(src); + SLJIT_UNUSED_ARG(srcw); + SLJIT_UNREACHABLE(); + return SLJIT_ERR_UNSUPPORTED; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 type) +{ + SLJIT_UNUSED_ARG(compiler); + SLJIT_UNUSED_ARG(op); + SLJIT_UNUSED_ARG(dst); + SLJIT_UNUSED_ARG(dstw); + SLJIT_UNUSED_ARG(type); + SLJIT_UNREACHABLE(); + return SLJIT_ERR_UNSUPPORTED; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 dst_reg, + sljit_s32 src, sljit_sw srcw) +{ + SLJIT_UNUSED_ARG(compiler); + SLJIT_UNUSED_ARG(type); + SLJIT_UNUSED_ARG(dst_reg); + SLJIT_UNUSED_ARG(src); + SLJIT_UNUSED_ARG(srcw); + SLJIT_UNREACHABLE(); + return SLJIT_ERR_UNSUPPORTED; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 reg, sljit_s32 mem, sljit_sw memw) +{ + SLJIT_UNUSED_ARG(compiler); + SLJIT_UNUSED_ARG(type); + SLJIT_UNUSED_ARG(reg); + SLJIT_UNUSED_ARG(mem); + SLJIT_UNUSED_ARG(memw); + SLJIT_UNREACHABLE(); + return SLJIT_ERR_UNSUPPORTED; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fmem(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 freg, sljit_s32 mem, sljit_sw memw) +{ + SLJIT_UNUSED_ARG(compiler); + SLJIT_UNUSED_ARG(type); + SLJIT_UNUSED_ARG(freg); + SLJIT_UNUSED_ARG(mem); + SLJIT_UNUSED_ARG(memw); + SLJIT_UNREACHABLE(); + return SLJIT_ERR_UNSUPPORTED; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_local_base(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw offset) +{ + SLJIT_UNUSED_ARG(compiler); + SLJIT_UNUSED_ARG(dst); + SLJIT_UNUSED_ARG(dstw); + SLJIT_UNUSED_ARG(offset); + SLJIT_UNREACHABLE(); + return SLJIT_ERR_UNSUPPORTED; +} + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw initval) +{ + SLJIT_UNUSED_ARG(compiler); + SLJIT_UNUSED_ARG(dst); + SLJIT_UNUSED_ARG(dstw); + SLJIT_UNUSED_ARG(initval); + SLJIT_UNREACHABLE(); + return NULL; +} + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_put_label* sljit_emit_put_label(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw) +{ + SLJIT_UNUSED_ARG(compiler); + SLJIT_UNUSED_ARG(dst); + SLJIT_UNUSED_ARG(dstw); + return NULL; +} + +SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset) +{ + SLJIT_UNUSED_ARG(addr); + SLJIT_UNUSED_ARG(new_target); + SLJIT_UNUSED_ARG(executable_offset); + SLJIT_UNREACHABLE(); +} + +SLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_constant, sljit_sw executable_offset) +{ + SLJIT_UNUSED_ARG(addr); + SLJIT_UNUSED_ARG(new_constant); + SLJIT_UNUSED_ARG(executable_offset); + SLJIT_UNREACHABLE(); +} + +#endif /* !SLJIT_CONFIG_UNSUPPORTED */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitLir.h b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitLir.h new file mode 100755 index 000000000..836d25cf7 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitLir.h @@ -0,0 +1,1493 @@ +/* + * Stack-less Just-In-Time compiler + * + * Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _SLJIT_LIR_H_ +#define _SLJIT_LIR_H_ + +/* + ------------------------------------------------------------------------ + Stack-Less JIT compiler for multiple architectures (x86, ARM, PowerPC) + ------------------------------------------------------------------------ + + Short description + Advantages: + - The execution can be continued from any LIR instruction. In other + words, it is possible to jump to any label from anywhere, even from + a code fragment, which is compiled later, if both compiled code + shares the same context. See sljit_emit_enter for more details + - Supports self modifying code: target of (conditional) jump and call + instructions and some constant values can be dynamically modified + during runtime + - although it is not suggested to do it frequently + - can be used for inline caching: save an important value once + in the instruction stream + - since this feature limits the optimization possibilities, a + special flag must be passed at compile time when these + instructions are emitted + - A fixed stack space can be allocated for local variables + - The compiler is thread-safe + - The compiler is highly configurable through preprocessor macros. + You can disable unneeded features (multithreading in single + threaded applications), and you can use your own system functions + (including memory allocators). See sljitConfig.h + Disadvantages: + - No automatic register allocation, and temporary results are + not stored on the stack. (hence the name comes) + In practice: + - This approach is very effective for interpreters + - One of the saved registers typically points to a stack interface + - It can jump to any exception handler anytime (even if it belongs + to another function) + - Hot paths can be modified during runtime reflecting the changes + of the fastest execution path of the dynamic language + - SLJIT supports complex memory addressing modes + - mainly position and context independent code (except some cases) + + For valgrind users: + - pass --smc-check=all argument to valgrind, since JIT is a "self-modifying code" +*/ + +#if !(defined SLJIT_NO_DEFAULT_CONFIG && SLJIT_NO_DEFAULT_CONFIG) +#include "sljitConfig.h" +#endif + +/* The following header file defines useful macros for fine tuning +sljit based code generators. They are listed in the beginning +of sljitConfigInternal.h */ + +#include "sljitConfigInternal.h" + +/* --------------------------------------------------------------------- */ +/* Error codes */ +/* --------------------------------------------------------------------- */ + +/* Indicates no error. */ +#define SLJIT_SUCCESS 0 +/* After the call of sljit_generate_code(), the error code of the compiler + is set to this value to avoid future sljit calls (in debug mode at least). + The complier should be freed after sljit_generate_code(). */ +#define SLJIT_ERR_COMPILED 1 +/* Cannot allocate non executable memory. */ +#define SLJIT_ERR_ALLOC_FAILED 2 +/* Cannot allocate executable memory. + Only for sljit_generate_code() */ +#define SLJIT_ERR_EX_ALLOC_FAILED 3 +/* Return value for SLJIT_CONFIG_UNSUPPORTED placeholder architecture. */ +#define SLJIT_ERR_UNSUPPORTED 4 +/* An ivalid argument is passed to any SLJIT function. */ +#define SLJIT_ERR_BAD_ARGUMENT 5 +/* Dynamic code modification is not enabled. */ +#define SLJIT_ERR_DYN_CODE_MOD 6 + +/* --------------------------------------------------------------------- */ +/* Registers */ +/* --------------------------------------------------------------------- */ + +/* + Scratch (R) registers: registers whose may not preserve their values + across function calls. + + Saved (S) registers: registers whose preserve their values across + function calls. + + The scratch and saved register sets are overlap. The last scratch register + is the first saved register, the one before the last is the second saved + register, and so on. + + If an architecture provides two scratch and three saved registers, + its scratch and saved register sets are the following: + + R0 | | R0 is always a scratch register + R1 | | R1 is always a scratch register + [R2] | S2 | R2 and S2 represent the same physical register + [R3] | S1 | R3 and S1 represent the same physical register + [R4] | S0 | R4 and S0 represent the same physical register + + Note: SLJIT_NUMBER_OF_SCRATCH_REGISTERS would be 2 and + SLJIT_NUMBER_OF_SAVED_REGISTERS would be 3 for this architecture. + + Note: On all supported architectures SLJIT_NUMBER_OF_REGISTERS >= 12 + and SLJIT_NUMBER_OF_SAVED_REGISTERS >= 6. However, 6 registers + are virtual on x86-32. See below. + + The purpose of this definition is convenience: saved registers can + be used as extra scratch registers. For example four registers can + be specified as scratch registers and the fifth one as saved register + on the CPU above and any user code which requires four scratch + registers can run unmodified. The SLJIT compiler automatically saves + the content of the two extra scratch register on the stack. Scratch + registers can also be preserved by saving their value on the stack + but this needs to be done manually. + + Note: To emphasize that registers assigned to R2-R4 are saved + registers, they are enclosed by square brackets. + + Note: sljit_emit_enter and sljit_set_context defines whether a register + is S or R register. E.g: when 3 scratches and 1 saved is mapped + by sljit_emit_enter, the allowed register set will be: R0-R2 and + S0. Although S2 is mapped to the same position as R2, it does not + available in the current configuration. Furthermore the S1 register + is not available at all. +*/ + +/* When SLJIT_UNUSED is specified as the destination of sljit_emit_op1 + or sljit_emit_op2 operations the result is discarded. If no status + flags are set, no instructions are emitted for these operations. Data + prefetch is a special exception, see SLJIT_MOV operation. Other SLJIT + operations do not support SLJIT_UNUSED as a destination operand. */ +#define SLJIT_UNUSED 0 + +/* Scratch registers. */ +#define SLJIT_R0 1 +#define SLJIT_R1 2 +#define SLJIT_R2 3 +/* Note: on x86-32, R3 - R6 (same as S3 - S6) are emulated (they + are allocated on the stack). These registers are called virtual + and cannot be used for memory addressing (cannot be part of + any SLJIT_MEM1, SLJIT_MEM2 construct). There is no such + limitation on other CPUs. See sljit_get_register_index(). */ +#define SLJIT_R3 4 +#define SLJIT_R4 5 +#define SLJIT_R5 6 +#define SLJIT_R6 7 +#define SLJIT_R7 8 +#define SLJIT_R8 9 +#define SLJIT_R9 10 +/* All R registers provided by the architecture can be accessed by SLJIT_R(i) + The i parameter must be >= 0 and < SLJIT_NUMBER_OF_REGISTERS. */ +#define SLJIT_R(i) (1 + (i)) + +/* Saved registers. */ +#define SLJIT_S0 (SLJIT_NUMBER_OF_REGISTERS) +#define SLJIT_S1 (SLJIT_NUMBER_OF_REGISTERS - 1) +#define SLJIT_S2 (SLJIT_NUMBER_OF_REGISTERS - 2) +/* Note: on x86-32, S3 - S6 (same as R3 - R6) are emulated (they + are allocated on the stack). These registers are called virtual + and cannot be used for memory addressing (cannot be part of + any SLJIT_MEM1, SLJIT_MEM2 construct). There is no such + limitation on other CPUs. See sljit_get_register_index(). */ +#define SLJIT_S3 (SLJIT_NUMBER_OF_REGISTERS - 3) +#define SLJIT_S4 (SLJIT_NUMBER_OF_REGISTERS - 4) +#define SLJIT_S5 (SLJIT_NUMBER_OF_REGISTERS - 5) +#define SLJIT_S6 (SLJIT_NUMBER_OF_REGISTERS - 6) +#define SLJIT_S7 (SLJIT_NUMBER_OF_REGISTERS - 7) +#define SLJIT_S8 (SLJIT_NUMBER_OF_REGISTERS - 8) +#define SLJIT_S9 (SLJIT_NUMBER_OF_REGISTERS - 9) +/* All S registers provided by the architecture can be accessed by SLJIT_S(i) + The i parameter must be >= 0 and < SLJIT_NUMBER_OF_SAVED_REGISTERS. */ +#define SLJIT_S(i) (SLJIT_NUMBER_OF_REGISTERS - (i)) + +/* Registers >= SLJIT_FIRST_SAVED_REG are saved registers. */ +#define SLJIT_FIRST_SAVED_REG (SLJIT_S0 - SLJIT_NUMBER_OF_SAVED_REGISTERS + 1) + +/* The SLJIT_SP provides direct access to the linear stack space allocated by + sljit_emit_enter. It can only be used in the following form: SLJIT_MEM1(SLJIT_SP). + The immediate offset is extended by the relative stack offset automatically. + The sljit_get_local_base can be used to obtain the absolute offset. */ +#define SLJIT_SP (SLJIT_NUMBER_OF_REGISTERS + 1) + +/* Return with machine word. */ + +#define SLJIT_RETURN_REG SLJIT_R0 + +/* --------------------------------------------------------------------- */ +/* Floating point registers */ +/* --------------------------------------------------------------------- */ + +/* Each floating point register can store a 32 or a 64 bit precision + value. The FR and FS register sets are overlap in the same way as R + and S register sets. See above. */ + +/* Note: SLJIT_UNUSED as destination is not valid for floating point + operations, since they cannot be used for setting flags. */ + +/* Floating point scratch registers. */ +#define SLJIT_FR0 1 +#define SLJIT_FR1 2 +#define SLJIT_FR2 3 +#define SLJIT_FR3 4 +#define SLJIT_FR4 5 +#define SLJIT_FR5 6 +/* All FR registers provided by the architecture can be accessed by SLJIT_FR(i) + The i parameter must be >= 0 and < SLJIT_NUMBER_OF_FLOAT_REGISTERS. */ +#define SLJIT_FR(i) (1 + (i)) + +/* Floating point saved registers. */ +#define SLJIT_FS0 (SLJIT_NUMBER_OF_FLOAT_REGISTERS) +#define SLJIT_FS1 (SLJIT_NUMBER_OF_FLOAT_REGISTERS - 1) +#define SLJIT_FS2 (SLJIT_NUMBER_OF_FLOAT_REGISTERS - 2) +#define SLJIT_FS3 (SLJIT_NUMBER_OF_FLOAT_REGISTERS - 3) +#define SLJIT_FS4 (SLJIT_NUMBER_OF_FLOAT_REGISTERS - 4) +#define SLJIT_FS5 (SLJIT_NUMBER_OF_FLOAT_REGISTERS - 5) +/* All S registers provided by the architecture can be accessed by SLJIT_FS(i) + The i parameter must be >= 0 and < SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS. */ +#define SLJIT_FS(i) (SLJIT_NUMBER_OF_FLOAT_REGISTERS - (i)) + +/* Float registers >= SLJIT_FIRST_SAVED_FLOAT_REG are saved registers. */ +#define SLJIT_FIRST_SAVED_FLOAT_REG (SLJIT_FS0 - SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS + 1) + +/* --------------------------------------------------------------------- */ +/* Argument type definitions */ +/* --------------------------------------------------------------------- */ + +/* Argument type definitions. + Used by SLJIT_[DEF_]ARGx and SLJIT_[DEF]_RET macros. */ + +#define SLJIT_ARG_TYPE_VOID 0 +#define SLJIT_ARG_TYPE_SW 1 +#define SLJIT_ARG_TYPE_UW 2 +#define SLJIT_ARG_TYPE_S32 3 +#define SLJIT_ARG_TYPE_U32 4 +#define SLJIT_ARG_TYPE_F32 5 +#define SLJIT_ARG_TYPE_F64 6 + +/* The following argument type definitions are used by sljit_emit_enter, + sljit_set_context, sljit_emit_call, and sljit_emit_icall functions. + The following return type definitions are used by sljit_emit_call + and sljit_emit_icall functions. + + When a function is called, the first integer argument must be placed + in SLJIT_R0, the second in SLJIT_R1, and so on. Similarly the first + floating point argument must be placed in SLJIT_FR0, the second in + SLJIT_FR1, and so on. + + Example function definition: + sljit_f32 SLJIT_FUNC example_c_callback(sljit_sw arg_a, + sljit_f64 arg_b, sljit_u32 arg_c, sljit_f32 arg_d); + + Argument type definition: + SLJIT_DEF_RET(SLJIT_ARG_TYPE_F32) + | SLJIT_DEF_ARG1(SLJIT_ARG_TYPE_SW) | SLJIT_DEF_ARG2(SLJIT_ARG_TYPE_F64) + | SLJIT_DEF_ARG3(SLJIT_ARG_TYPE_U32) | SLJIT_DEF_ARG2(SLJIT_ARG_TYPE_F32) + + Short form of argument type definition: + SLJIT_RET(F32) | SLJIT_ARG1(SW) | SLJIT_ARG2(F64) + | SLJIT_ARG3(S32) | SLJIT_ARG4(F32) + + Argument passing: + arg_a must be placed in SLJIT_R0 + arg_c must be placed in SLJIT_R1 + arg_b must be placed in SLJIT_FR0 + arg_d must be placed in SLJIT_FR1 + +Note: + The SLJIT_ARG_TYPE_VOID type is only supported by + SLJIT_DEF_RET, and SLJIT_ARG_TYPE_VOID is also the + default value when SLJIT_DEF_RET is not specified. */ +#define SLJIT_DEF_SHIFT 4 +#define SLJIT_DEF_RET(type) (type) +#define SLJIT_DEF_ARG1(type) ((type) << SLJIT_DEF_SHIFT) +#define SLJIT_DEF_ARG2(type) ((type) << (2 * SLJIT_DEF_SHIFT)) +#define SLJIT_DEF_ARG3(type) ((type) << (3 * SLJIT_DEF_SHIFT)) +#define SLJIT_DEF_ARG4(type) ((type) << (4 * SLJIT_DEF_SHIFT)) + +/* Short form of the macros above. + + For example the following definition: + SLJIT_DEF_RET(SLJIT_ARG_TYPE_SW) | SLJIT_DEF_ARG1(SLJIT_ARG_TYPE_F32) + + can be shortened to: + SLJIT_RET(SW) | SLJIT_ARG1(F32) + +Note: + The VOID type is only supported by SLJIT_RET, and + VOID is also the default value when SLJIT_RET is + not specified. */ +#define SLJIT_RET(type) SLJIT_DEF_RET(SLJIT_ARG_TYPE_ ## type) +#define SLJIT_ARG1(type) SLJIT_DEF_ARG1(SLJIT_ARG_TYPE_ ## type) +#define SLJIT_ARG2(type) SLJIT_DEF_ARG2(SLJIT_ARG_TYPE_ ## type) +#define SLJIT_ARG3(type) SLJIT_DEF_ARG3(SLJIT_ARG_TYPE_ ## type) +#define SLJIT_ARG4(type) SLJIT_DEF_ARG4(SLJIT_ARG_TYPE_ ## type) + +/* --------------------------------------------------------------------- */ +/* Main structures and functions */ +/* --------------------------------------------------------------------- */ + +/* + The following structures are private, and can be changed in the + future. Keeping them here allows code inlining. +*/ + +struct sljit_memory_fragment { + struct sljit_memory_fragment *next; + sljit_uw used_size; + /* Must be aligned to sljit_sw. */ + sljit_u8 memory[1]; +}; + +struct sljit_label { + struct sljit_label *next; + sljit_uw addr; + /* The maximum size difference. */ + sljit_uw size; +}; + +struct sljit_jump { + struct sljit_jump *next; + sljit_uw addr; + sljit_uw flags; + union { + sljit_uw target; + struct sljit_label *label; + } u; +}; + +struct sljit_put_label { + struct sljit_put_label *next; + struct sljit_label *label; + sljit_uw addr; + sljit_uw flags; +}; + +struct sljit_const { + struct sljit_const *next; + sljit_uw addr; +}; + +struct sljit_compiler { + sljit_s32 error; + sljit_s32 options; + + struct sljit_label *labels; + struct sljit_jump *jumps; + struct sljit_put_label *put_labels; + struct sljit_const *consts; + struct sljit_label *last_label; + struct sljit_jump *last_jump; + struct sljit_const *last_const; + struct sljit_put_label *last_put_label; + + void *allocator_data; + struct sljit_memory_fragment *buf; + struct sljit_memory_fragment *abuf; + + /* Used scratch registers. */ + sljit_s32 scratches; + /* Used saved registers. */ + sljit_s32 saveds; + /* Used float scratch registers. */ + sljit_s32 fscratches; + /* Used float saved registers. */ + sljit_s32 fsaveds; + /* Local stack size. */ + sljit_s32 local_size; + /* Code size. */ + sljit_uw size; + /* Relative offset of the executable mapping from the writable mapping. */ + sljit_uw executable_offset; + /* Executable size for statistical purposes. */ + sljit_uw executable_size; + +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + sljit_s32 args; + sljit_s32 locals_offset; + sljit_s32 saveds_offset; + sljit_s32 stack_tmp_size; +#endif + +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + sljit_s32 mode32; +#ifdef _WIN64 + sljit_s32 locals_offset; +#endif +#endif + +#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) + /* Constant pool handling. */ + sljit_uw *cpool; + sljit_u8 *cpool_unique; + sljit_uw cpool_diff; + sljit_uw cpool_fill; + /* Other members. */ + /* Contains pointer, "ldr pc, [...]" pairs. */ + sljit_uw patches; +#endif + +#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) + /* Temporary fields. */ + sljit_uw shift_imm; +#endif + +#if (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC) + sljit_sw imm; +#endif + +#if (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS) + sljit_s32 delay_slot; + sljit_s32 cache_arg; + sljit_sw cache_argw; +#endif + +#if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) + sljit_s32 delay_slot; + sljit_s32 cache_arg; + sljit_sw cache_argw; +#endif + +#if (defined SLJIT_CONFIG_TILEGX && SLJIT_CONFIG_TILEGX) + sljit_s32 cache_arg; + sljit_sw cache_argw; +#endif + +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) + FILE* verbose; +#endif + +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) \ + || (defined SLJIT_DEBUG && SLJIT_DEBUG) + /* Flags specified by the last arithmetic instruction. + It contains the type of the variable flag. */ + sljit_s32 last_flags; + /* Local size passed to the functions. */ + sljit_s32 logical_local_size; +#endif + +#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) \ + || (defined SLJIT_DEBUG && SLJIT_DEBUG) \ + || (defined SLJIT_VERBOSE && SLJIT_VERBOSE) + /* Trust arguments when the API function is called. */ + sljit_s32 skip_checks; +#endif +}; + +/* --------------------------------------------------------------------- */ +/* Main functions */ +/* --------------------------------------------------------------------- */ + +/* Creates an sljit compiler. The allocator_data is required by some + custom memory managers. This pointer is passed to SLJIT_MALLOC + and SLJIT_FREE macros. Most allocators (including the default + one) ignores this value, and it is recommended to pass NULL + as a dummy value for allocator_data. + + Returns NULL if failed. */ +SLJIT_API_FUNC_ATTRIBUTE struct sljit_compiler* sljit_create_compiler(void *allocator_data); + +/* Frees everything except the compiled machine code. */ +SLJIT_API_FUNC_ATTRIBUTE void sljit_free_compiler(struct sljit_compiler *compiler); + +/* Returns the current error code. If an error is occurred, future sljit + calls which uses the same compiler argument returns early with the same + error code. Thus there is no need for checking the error after every + call, it is enough to do it before the code is compiled. Removing + these checks increases the performance of the compiling process. */ +static SLJIT_INLINE sljit_s32 sljit_get_compiler_error(struct sljit_compiler *compiler) { return compiler->error; } + +/* Sets the compiler error code to SLJIT_ERR_ALLOC_FAILED except + if an error was detected before. After the error code is set + the compiler behaves as if the allocation failure happened + during an sljit function call. This can greatly simplify error + checking, since only the compiler status needs to be checked + after the compilation. */ +SLJIT_API_FUNC_ATTRIBUTE void sljit_set_compiler_memory_error(struct sljit_compiler *compiler); + +/* + Allocate a small amount of memory. The size must be <= 64 bytes on 32 bit, + and <= 128 bytes on 64 bit architectures. The memory area is owned by the + compiler, and freed by sljit_free_compiler. The returned pointer is + sizeof(sljit_sw) aligned. Excellent for allocating small blocks during + the compiling, and no need to worry about freeing them. The size is + enough to contain at most 16 pointers. If the size is outside of the range, + the function will return with NULL. However, this return value does not + indicate that there is no more memory (does not set the current error code + of the compiler to out-of-memory status). +*/ +SLJIT_API_FUNC_ATTRIBUTE void* sljit_alloc_memory(struct sljit_compiler *compiler, sljit_s32 size); + +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) +/* Passing NULL disables verbose. */ +SLJIT_API_FUNC_ATTRIBUTE void sljit_compiler_verbose(struct sljit_compiler *compiler, FILE* verbose); +#endif + +/* + Create executable code from the sljit instruction stream. This is the final step + of the code generation so no more instructions can be added after this call. +*/ + +SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler); + +/* Free executable code. */ + +SLJIT_API_FUNC_ATTRIBUTE void sljit_free_code(void* code); + +/* + When the protected executable allocator is used the JIT code is mapped + twice. The first mapping has read/write and the second mapping has read/exec + permissions. This function returns with the relative offset of the executable + mapping using the writable mapping as the base after the machine code is + successfully generated. The returned value is always 0 for the normal executable + allocator, since it uses only one mapping with read/write/exec permissions. + Dynamic code modifications requires this value. + + Before a successful code generation, this function returns with 0. +*/ +static SLJIT_INLINE sljit_sw sljit_get_executable_offset(struct sljit_compiler *compiler) { return compiler->executable_offset; } + +/* + The executable memory consumption of the generated code can be retrieved by + this function. The returned value can be used for statistical purposes. + + Before a successful code generation, this function returns with 0. +*/ +static SLJIT_INLINE sljit_uw sljit_get_generated_code_size(struct sljit_compiler *compiler) { return compiler->executable_size; } + +/* Returns with non-zero if the feature or limitation type passed as its + argument is present on the current CPU. + + Some features (e.g. floating point operations) require hardware (CPU) + support while others (e.g. move with update) are emulated if not available. + However even if a feature is emulated, specialized code paths can be faster + than the emulation. Some limitations are emulated as well so their general + case is supported but it has extra performance costs. */ + +/* [Not emulated] Floating-point support is available. */ +#define SLJIT_HAS_FPU 0 +/* [Limitation] Some registers are virtual registers. */ +#define SLJIT_HAS_VIRTUAL_REGISTERS 1 +/* [Emulated] Count leading zero is supported. */ +#define SLJIT_HAS_CLZ 2 +/* [Emulated] Conditional move is supported. */ +#define SLJIT_HAS_CMOV 3 + +#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) +/* [Not emulated] SSE2 support is available on x86. */ +#define SLJIT_HAS_SSE2 100 +#endif + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type); + +/* Instruction generation. Returns with any error code. If there is no + error, they return with SLJIT_SUCCESS. */ + +/* + The executable code is a function from the viewpoint of the C + language. The function calls must obey to the ABI (Application + Binary Interface) of the platform, which specify the purpose of + machine registers and stack handling among other things. The + sljit_emit_enter function emits the necessary instructions for + setting up a new context for the executable code and moves function + arguments to the saved registers. Furthermore the options argument + can be used to pass configuration options to the compiler. The + available options are listed before sljit_emit_enter. + + The function argument list is the combination of SLJIT_ARGx + (SLJIT_DEF_ARG1) macros. Currently maximum 3 SW / UW + (SLJIT_ARG_TYPE_SW / LJIT_ARG_TYPE_UW) arguments are supported. + The first argument goes to SLJIT_S0, the second goes to SLJIT_S1 + and so on. The register set used by the function must be declared + as well. The number of scratch and saved registers used by the + function must be passed to sljit_emit_enter. Only R registers + between R0 and "scratches" argument can be used later. E.g. if + "scratches" is set to 2, the scratch register set will be limited + to SLJIT_R0 and SLJIT_R1. The S registers and the floating point + registers ("fscratches" and "fsaveds") are specified in a similar + manner. The sljit_emit_enter is also capable of allocating a stack + space for local variables. The "local_size" argument contains the + size in bytes of this local area and its staring address is stored + in SLJIT_SP. The memory area between SLJIT_SP (inclusive) and + SLJIT_SP + local_size (exclusive) can be modified freely until + the function returns. The stack space is not initialized. + + Note: the following conditions must met: + 0 <= scratches <= SLJIT_NUMBER_OF_REGISTERS + 0 <= saveds <= SLJIT_NUMBER_OF_REGISTERS + scratches + saveds <= SLJIT_NUMBER_OF_REGISTERS + 0 <= fscratches <= SLJIT_NUMBER_OF_FLOAT_REGISTERS + 0 <= fsaveds <= SLJIT_NUMBER_OF_FLOAT_REGISTERS + fscratches + fsaveds <= SLJIT_NUMBER_OF_FLOAT_REGISTERS + + Note: every call of sljit_emit_enter and sljit_set_context + overwrites the previous context. +*/ + +/* The absolute address returned by sljit_get_local_base with +offset 0 is aligned to sljit_f64. Otherwise it is aligned to sljit_sw. */ +#define SLJIT_F64_ALIGNMENT 0x00000001 + +/* The local_size must be >= 0 and <= SLJIT_MAX_LOCAL_SIZE. */ +#define SLJIT_MAX_LOCAL_SIZE 65536 + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compiler, + sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds, + sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size); + +/* The machine code has a context (which contains the local stack space size, + number of used registers, etc.) which initialized by sljit_emit_enter. Several + functions (like sljit_emit_return) requres this context to be able to generate + the appropriate code. However, some code fragments (like inline cache) may have + no normal entry point so their context is unknown for the compiler. Their context + can be provided to the compiler by the sljit_set_context function. + + Note: every call of sljit_emit_enter and sljit_set_context overwrites + the previous context. */ + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_set_context(struct sljit_compiler *compiler, + sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds, + sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size); + +/* Return from machine code. The op argument can be SLJIT_UNUSED which means the + function does not return with anything or any opcode between SLJIT_MOV and + SLJIT_MOV_P (see sljit_emit_op1). As for src and srcw they must be 0 if op + is SLJIT_UNUSED, otherwise see below the description about source and + destination arguments. */ + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 src, sljit_sw srcw); + +/* Generating entry and exit points for fast call functions (see SLJIT_FAST_CALL). + Both sljit_emit_fast_enter and sljit_emit_fast_return functions preserve the + values of all registers and stack frame. The return address is stored in the + dst argument of sljit_emit_fast_enter, and this return address can be passed + to sljit_emit_fast_return to continue the execution after the fast call. + + Fast calls are cheap operations (usually only a single call instruction is + emitted) but they do not preserve any registers. However the callee function + can freely use / update any registers and stack values which can be + efficiently exploited by various optimizations. Registers can be saved + manually by the callee function if needed. + + Although returning to different address by sljit_emit_fast_return is possible, + this address usually cannot be predicted by the return address predictor of + modern CPUs which may reduce performance. Furthermore using sljit_emit_ijump + to return is also inefficient since return address prediction is usually + triggered by a specific form of ijump. + + Flags: - (does not modify flags). */ + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw); +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw); + +/* + Source and destination operands for arithmetical instructions + imm - a simple immediate value (cannot be used as a destination) + reg - any of the registers (immediate argument must be 0) + [imm] - absolute immediate memory address + [reg+imm] - indirect memory address + [reg+(reg<addr; } +static SLJIT_INLINE sljit_uw sljit_get_jump_addr(struct sljit_jump *jump) { return jump->addr; } +static SLJIT_INLINE sljit_uw sljit_get_const_addr(struct sljit_const *const_) { return const_->addr; } + +/* Only the address and executable offset are required to perform dynamic + code modifications. See sljit_get_executable_offset function. */ +SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset); +SLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_constant, sljit_sw executable_offset); + +/* --------------------------------------------------------------------- */ +/* Miscellaneous utility functions */ +/* --------------------------------------------------------------------- */ + +#define SLJIT_MAJOR_VERSION 0 +#define SLJIT_MINOR_VERSION 94 + +/* Get the human readable name of the platform. Can be useful on platforms + like ARM, where ARM and Thumb2 functions can be mixed, and + it is useful to know the type of the code generator. */ +SLJIT_API_FUNC_ATTRIBUTE const char* sljit_get_platform_name(void); + +/* Portable helper function to get an offset of a member. */ +#define SLJIT_OFFSETOF(base, member) ((sljit_sw)(&((base*)0x10)->member) - 0x10) + +#if (defined SLJIT_UTIL_GLOBAL_LOCK && SLJIT_UTIL_GLOBAL_LOCK) +/* This global lock is useful to compile common functions. */ +SLJIT_API_FUNC_ATTRIBUTE void SLJIT_FUNC sljit_grab_lock(void); +SLJIT_API_FUNC_ATTRIBUTE void SLJIT_FUNC sljit_release_lock(void); +#endif + +#if (defined SLJIT_UTIL_STACK && SLJIT_UTIL_STACK) + +/* The sljit_stack structure and its manipulation functions provides + an implementation for a top-down stack. The stack top is stored + in the end field of the sljit_stack structure and the stack goes + down to the min_start field, so the memory region reserved for + this stack is between min_start (inclusive) and end (exclusive) + fields. However the application can only use the region between + start (inclusive) and end (exclusive) fields. The sljit_stack_resize + function can be used to extend this region up to min_start. + + This feature uses the "address space reserve" feature of modern + operating systems. Instead of allocating a large memory block + applications can allocate a small memory region and extend it + later without moving the content of the memory area. Therefore + after a successful resize by sljit_stack_resize all pointers into + this region are still valid. + + Note: + this structure may not be supported by all operating systems. + end and max_limit fields are aligned to PAGE_SIZE bytes (usually + 4 Kbyte or more). + stack should grow in larger steps, e.g. 4Kbyte, 16Kbyte or more. */ + +struct sljit_stack { + /* User data, anything can be stored here. + Initialized to the same value as the end field. */ + sljit_u8 *top; +/* These members are read only. */ + /* End address of the stack */ + sljit_u8 *end; + /* Current start address of the stack. */ + sljit_u8 *start; + /* Lowest start address of the stack. */ + sljit_u8 *min_start; +}; + +/* Allocates a new stack. Returns NULL if unsuccessful. + Note: see sljit_create_compiler for the explanation of allocator_data. */ +SLJIT_API_FUNC_ATTRIBUTE struct sljit_stack* SLJIT_FUNC sljit_allocate_stack(sljit_uw start_size, sljit_uw max_size, void *allocator_data); +SLJIT_API_FUNC_ATTRIBUTE void SLJIT_FUNC sljit_free_stack(struct sljit_stack *stack, void *allocator_data); + +/* Can be used to increase (extend) or decrease (shrink) the stack + memory area. Returns with new_start if successful and NULL otherwise. + It always fails if new_start is less than min_start or greater or equal + than end fields. The fields of the stack are not changed if the returned + value is NULL (the current memory content is never lost). */ +SLJIT_API_FUNC_ATTRIBUTE sljit_u8 *SLJIT_FUNC sljit_stack_resize(struct sljit_stack *stack, sljit_u8 *new_start); + +#endif /* (defined SLJIT_UTIL_STACK && SLJIT_UTIL_STACK) */ + +#if !(defined SLJIT_INDIRECT_CALL && SLJIT_INDIRECT_CALL) + +/* Get the entry address of a given function. */ +#define SLJIT_FUNC_OFFSET(func_name) ((sljit_sw)func_name) + +#else /* !(defined SLJIT_INDIRECT_CALL && SLJIT_INDIRECT_CALL) */ + +/* All JIT related code should be placed in the same context (library, binary, etc.). */ + +#define SLJIT_FUNC_OFFSET(func_name) (*(sljit_sw*)(void*)func_name) + +/* For powerpc64, the function pointers point to a context descriptor. */ +struct sljit_function_context { + sljit_sw addr; + sljit_sw r2; + sljit_sw r11; +}; + +/* Fill the context arguments using the addr and the function. + If func_ptr is NULL, it will not be set to the address of context + If addr is NULL, the function address also comes from the func pointer. */ +SLJIT_API_FUNC_ATTRIBUTE void sljit_set_function_context(void** func_ptr, struct sljit_function_context* context, sljit_sw addr, void* func); + +#endif /* !(defined SLJIT_INDIRECT_CALL && SLJIT_INDIRECT_CALL) */ + +#if (defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR) +/* Free unused executable memory. The allocator keeps some free memory + around to reduce the number of OS executable memory allocations. + This improves performance since these calls are costly. However + it is sometimes desired to free all unused memory regions, e.g. + before the application terminates. */ +SLJIT_API_FUNC_ATTRIBUTE void sljit_free_unused_memory_exec(void); +#endif + +/* --------------------------------------------------------------------- */ +/* CPU specific functions */ +/* --------------------------------------------------------------------- */ + +/* The following function is a helper function for sljit_emit_op_custom. + It returns with the real machine register index ( >=0 ) of any SLJIT_R, + SLJIT_S and SLJIT_SP registers. + + Note: it returns with -1 for virtual registers (only on x86-32). */ + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg); + +/* The following function is a helper function for sljit_emit_op_custom. + It returns with the real machine register index of any SLJIT_FLOAT register. + + Note: the index is always an even number on ARM (except ARM-64), MIPS, and SPARC. */ + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_float_register_index(sljit_s32 reg); + +/* Any instruction can be inserted into the instruction stream by + sljit_emit_op_custom. It has a similar purpose as inline assembly. + The size parameter must match to the instruction size of the target + architecture: + + x86: 0 < size <= 15. The instruction argument can be byte aligned. + Thumb2: if size == 2, the instruction argument must be 2 byte aligned. + if size == 4, the instruction argument must be 4 byte aligned. + Otherwise: size must be 4 and instruction argument must be 4 byte aligned. */ + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler, + void *instruction, sljit_s32 size); + +/* Define the currently available CPU status flags. It is usually used after an + sljit_emit_op_custom call to define which flags are set. */ + +SLJIT_API_FUNC_ATTRIBUTE void sljit_set_current_flags(struct sljit_compiler *compiler, + sljit_s32 current_flags); + +#endif /* _SLJIT_LIR_H_ */ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeARM_32.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeARM_32.c new file mode 100755 index 000000000..8da0d0935 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeARM_32.c @@ -0,0 +1,2734 @@ +/* + * Stack-less Just-In-Time compiler + * + * Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifdef __SOFTFP__ +#define ARM_ABI_INFO " ABI:softfp" +#else +#define ARM_ABI_INFO " ABI:hardfp" +#endif + +SLJIT_API_FUNC_ATTRIBUTE const char* sljit_get_platform_name(void) +{ +#if (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) + return "ARMv7" SLJIT_CPUINFO ARM_ABI_INFO; +#elif (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) + return "ARMv5" SLJIT_CPUINFO ARM_ABI_INFO; +#else +#error "Internal error: Unknown ARM architecture" +#endif +} + +/* Last register + 1. */ +#define TMP_REG1 (SLJIT_NUMBER_OF_REGISTERS + 2) +#define TMP_REG2 (SLJIT_NUMBER_OF_REGISTERS + 3) +#define TMP_PC (SLJIT_NUMBER_OF_REGISTERS + 4) + +#define TMP_FREG1 (SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1) +#define TMP_FREG2 (SLJIT_NUMBER_OF_FLOAT_REGISTERS + 2) + +/* In ARM instruction words. + Cache lines are usually 32 byte aligned. */ +#define CONST_POOL_ALIGNMENT 8 +#define CONST_POOL_EMPTY 0xffffffff + +#define ALIGN_INSTRUCTION(ptr) \ + (sljit_uw*)(((sljit_uw)(ptr) + (CONST_POOL_ALIGNMENT * sizeof(sljit_uw)) - 1) & ~((CONST_POOL_ALIGNMENT * sizeof(sljit_uw)) - 1)) +#define MAX_DIFFERENCE(max_diff) \ + (((max_diff) / (sljit_s32)sizeof(sljit_uw)) - (CONST_POOL_ALIGNMENT - 1)) + +/* See sljit_emit_enter and sljit_emit_op0 if you want to change them. */ +static const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 5] = { + 0, 0, 1, 2, 3, 11, 10, 9, 8, 7, 6, 5, 4, 13, 12, 14, 15 +}; + +static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 3] = { + 0, 0, 1, 2, 3, 4, 5, 6, 7 +}; + +#define RM(rm) (reg_map[rm]) +#define RD(rd) (reg_map[rd] << 12) +#define RN(rn) (reg_map[rn] << 16) + +/* --------------------------------------------------------------------- */ +/* Instrucion forms */ +/* --------------------------------------------------------------------- */ + +/* The instruction includes the AL condition. + INST_NAME - CONDITIONAL remove this flag. */ +#define COND_MASK 0xf0000000 +#define CONDITIONAL 0xe0000000 +#define PUSH_POOL 0xff000000 + +#define ADC 0xe0a00000 +#define ADD 0xe0800000 +#define AND 0xe0000000 +#define B 0xea000000 +#define BIC 0xe1c00000 +#define BL 0xeb000000 +#define BLX 0xe12fff30 +#define BX 0xe12fff10 +#define CLZ 0xe16f0f10 +#define CMN 0xe1600000 +#define CMP 0xe1400000 +#define BKPT 0xe1200070 +#define EOR 0xe0200000 +#define MOV 0xe1a00000 +#define MUL 0xe0000090 +#define MVN 0xe1e00000 +#define NOP 0xe1a00000 +#define ORR 0xe1800000 +#define PUSH 0xe92d0000 +#define POP 0xe8bd0000 +#define RSB 0xe0600000 +#define RSC 0xe0e00000 +#define SBC 0xe0c00000 +#define SMULL 0xe0c00090 +#define SUB 0xe0400000 +#define UMULL 0xe0800090 +#define VABS_F32 0xeeb00ac0 +#define VADD_F32 0xee300a00 +#define VCMP_F32 0xeeb40a40 +#define VCVT_F32_S32 0xeeb80ac0 +#define VCVT_F64_F32 0xeeb70ac0 +#define VCVT_S32_F32 0xeebd0ac0 +#define VDIV_F32 0xee800a00 +#define VMOV_F32 0xeeb00a40 +#define VMOV 0xee000a10 +#define VMOV2 0xec400a10 +#define VMRS 0xeef1fa10 +#define VMUL_F32 0xee200a00 +#define VNEG_F32 0xeeb10a40 +#define VSTR_F32 0xed000a00 +#define VSUB_F32 0xee300a40 + +#if (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) +/* Arm v7 specific instructions. */ +#define MOVW 0xe3000000 +#define MOVT 0xe3400000 +#define SXTB 0xe6af0070 +#define SXTH 0xe6bf0070 +#define UXTB 0xe6ef0070 +#define UXTH 0xe6ff0070 +#endif + +#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) + +static sljit_s32 push_cpool(struct sljit_compiler *compiler) +{ + /* Pushing the constant pool into the instruction stream. */ + sljit_uw* inst; + sljit_uw* cpool_ptr; + sljit_uw* cpool_end; + sljit_s32 i; + + /* The label could point the address after the constant pool. */ + if (compiler->last_label && compiler->last_label->size == compiler->size) + compiler->last_label->size += compiler->cpool_fill + (CONST_POOL_ALIGNMENT - 1) + 1; + + SLJIT_ASSERT(compiler->cpool_fill > 0 && compiler->cpool_fill <= CPOOL_SIZE); + inst = (sljit_uw*)ensure_buf(compiler, sizeof(sljit_uw)); + FAIL_IF(!inst); + compiler->size++; + *inst = 0xff000000 | compiler->cpool_fill; + + for (i = 0; i < CONST_POOL_ALIGNMENT - 1; i++) { + inst = (sljit_uw*)ensure_buf(compiler, sizeof(sljit_uw)); + FAIL_IF(!inst); + compiler->size++; + *inst = 0; + } + + cpool_ptr = compiler->cpool; + cpool_end = cpool_ptr + compiler->cpool_fill; + while (cpool_ptr < cpool_end) { + inst = (sljit_uw*)ensure_buf(compiler, sizeof(sljit_uw)); + FAIL_IF(!inst); + compiler->size++; + *inst = *cpool_ptr++; + } + compiler->cpool_diff = CONST_POOL_EMPTY; + compiler->cpool_fill = 0; + return SLJIT_SUCCESS; +} + +static sljit_s32 push_inst(struct sljit_compiler *compiler, sljit_uw inst) +{ + sljit_uw* ptr; + + if (SLJIT_UNLIKELY(compiler->cpool_diff != CONST_POOL_EMPTY && compiler->size - compiler->cpool_diff >= MAX_DIFFERENCE(4092))) + FAIL_IF(push_cpool(compiler)); + + ptr = (sljit_uw*)ensure_buf(compiler, sizeof(sljit_uw)); + FAIL_IF(!ptr); + compiler->size++; + *ptr = inst; + return SLJIT_SUCCESS; +} + +static sljit_s32 push_inst_with_literal(struct sljit_compiler *compiler, sljit_uw inst, sljit_uw literal) +{ + sljit_uw* ptr; + sljit_uw cpool_index = CPOOL_SIZE; + sljit_uw* cpool_ptr; + sljit_uw* cpool_end; + sljit_u8* cpool_unique_ptr; + + if (SLJIT_UNLIKELY(compiler->cpool_diff != CONST_POOL_EMPTY && compiler->size - compiler->cpool_diff >= MAX_DIFFERENCE(4092))) + FAIL_IF(push_cpool(compiler)); + else if (compiler->cpool_fill > 0) { + cpool_ptr = compiler->cpool; + cpool_end = cpool_ptr + compiler->cpool_fill; + cpool_unique_ptr = compiler->cpool_unique; + do { + if ((*cpool_ptr == literal) && !(*cpool_unique_ptr)) { + cpool_index = cpool_ptr - compiler->cpool; + break; + } + cpool_ptr++; + cpool_unique_ptr++; + } while (cpool_ptr < cpool_end); + } + + if (cpool_index == CPOOL_SIZE) { + /* Must allocate a new entry in the literal pool. */ + if (compiler->cpool_fill < CPOOL_SIZE) { + cpool_index = compiler->cpool_fill; + compiler->cpool_fill++; + } + else { + FAIL_IF(push_cpool(compiler)); + cpool_index = 0; + compiler->cpool_fill = 1; + } + } + + SLJIT_ASSERT((inst & 0xfff) == 0); + ptr = (sljit_uw*)ensure_buf(compiler, sizeof(sljit_uw)); + FAIL_IF(!ptr); + compiler->size++; + *ptr = inst | cpool_index; + + compiler->cpool[cpool_index] = literal; + compiler->cpool_unique[cpool_index] = 0; + if (compiler->cpool_diff == CONST_POOL_EMPTY) + compiler->cpool_diff = compiler->size; + return SLJIT_SUCCESS; +} + +static sljit_s32 push_inst_with_unique_literal(struct sljit_compiler *compiler, sljit_uw inst, sljit_uw literal) +{ + sljit_uw* ptr; + if (SLJIT_UNLIKELY((compiler->cpool_diff != CONST_POOL_EMPTY && compiler->size - compiler->cpool_diff >= MAX_DIFFERENCE(4092)) || compiler->cpool_fill >= CPOOL_SIZE)) + FAIL_IF(push_cpool(compiler)); + + SLJIT_ASSERT(compiler->cpool_fill < CPOOL_SIZE && (inst & 0xfff) == 0); + ptr = (sljit_uw*)ensure_buf(compiler, sizeof(sljit_uw)); + FAIL_IF(!ptr); + compiler->size++; + *ptr = inst | compiler->cpool_fill; + + compiler->cpool[compiler->cpool_fill] = literal; + compiler->cpool_unique[compiler->cpool_fill] = 1; + compiler->cpool_fill++; + if (compiler->cpool_diff == CONST_POOL_EMPTY) + compiler->cpool_diff = compiler->size; + return SLJIT_SUCCESS; +} + +static SLJIT_INLINE sljit_s32 prepare_blx(struct sljit_compiler *compiler) +{ + /* Place for at least two instruction (doesn't matter whether the first has a literal). */ + if (SLJIT_UNLIKELY(compiler->cpool_diff != CONST_POOL_EMPTY && compiler->size - compiler->cpool_diff >= MAX_DIFFERENCE(4088))) + return push_cpool(compiler); + return SLJIT_SUCCESS; +} + +static SLJIT_INLINE sljit_s32 emit_blx(struct sljit_compiler *compiler) +{ + /* Must follow tightly the previous instruction (to be able to convert it to bl instruction). */ + SLJIT_ASSERT(compiler->cpool_diff == CONST_POOL_EMPTY || compiler->size - compiler->cpool_diff < MAX_DIFFERENCE(4092)); + SLJIT_ASSERT(reg_map[TMP_REG1] != 14); + + return push_inst(compiler, BLX | RM(TMP_REG1)); +} + +static sljit_uw patch_pc_relative_loads(sljit_uw *last_pc_patch, sljit_uw *code_ptr, sljit_uw* const_pool, sljit_uw cpool_size) +{ + sljit_uw diff; + sljit_uw ind; + sljit_uw counter = 0; + sljit_uw* clear_const_pool = const_pool; + sljit_uw* clear_const_pool_end = const_pool + cpool_size; + + SLJIT_ASSERT(const_pool - code_ptr <= CONST_POOL_ALIGNMENT); + /* Set unused flag for all literals in the constant pool. + I.e.: unused literals can belong to branches, which can be encoded as B or BL. + We can "compress" the constant pool by discarding these literals. */ + while (clear_const_pool < clear_const_pool_end) + *clear_const_pool++ = (sljit_uw)(-1); + + while (last_pc_patch < code_ptr) { + /* Data transfer instruction with Rn == r15. */ + if ((*last_pc_patch & 0x0c0f0000) == 0x040f0000) { + diff = const_pool - last_pc_patch; + ind = (*last_pc_patch) & 0xfff; + + /* Must be a load instruction with immediate offset. */ + SLJIT_ASSERT(ind < cpool_size && !(*last_pc_patch & (1 << 25)) && (*last_pc_patch & (1 << 20))); + if ((sljit_s32)const_pool[ind] < 0) { + const_pool[ind] = counter; + ind = counter; + counter++; + } + else + ind = const_pool[ind]; + + SLJIT_ASSERT(diff >= 1); + if (diff >= 2 || ind > 0) { + diff = (diff + ind - 2) << 2; + SLJIT_ASSERT(diff <= 0xfff); + *last_pc_patch = (*last_pc_patch & ~0xfff) | diff; + } + else + *last_pc_patch = (*last_pc_patch & ~(0xfff | (1 << 23))) | 0x004; + } + last_pc_patch++; + } + return counter; +} + +/* In some rare ocasions we may need future patches. The probability is close to 0 in practice. */ +struct future_patch { + struct future_patch* next; + sljit_s32 index; + sljit_s32 value; +}; + +static sljit_s32 resolve_const_pool_index(struct sljit_compiler *compiler, struct future_patch **first_patch, sljit_uw cpool_current_index, sljit_uw *cpool_start_address, sljit_uw *buf_ptr) +{ + sljit_s32 value; + struct future_patch *curr_patch, *prev_patch; + + SLJIT_UNUSED_ARG(compiler); + + /* Using the values generated by patch_pc_relative_loads. */ + if (!*first_patch) + value = (sljit_s32)cpool_start_address[cpool_current_index]; + else { + curr_patch = *first_patch; + prev_patch = NULL; + while (1) { + if (!curr_patch) { + value = (sljit_s32)cpool_start_address[cpool_current_index]; + break; + } + if ((sljit_uw)curr_patch->index == cpool_current_index) { + value = curr_patch->value; + if (prev_patch) + prev_patch->next = curr_patch->next; + else + *first_patch = curr_patch->next; + SLJIT_FREE(curr_patch, compiler->allocator_data); + break; + } + prev_patch = curr_patch; + curr_patch = curr_patch->next; + } + } + + if (value >= 0) { + if ((sljit_uw)value > cpool_current_index) { + curr_patch = (struct future_patch*)SLJIT_MALLOC(sizeof(struct future_patch), compiler->allocator_data); + if (!curr_patch) { + while (*first_patch) { + curr_patch = *first_patch; + *first_patch = (*first_patch)->next; + SLJIT_FREE(curr_patch, compiler->allocator_data); + } + return SLJIT_ERR_ALLOC_FAILED; + } + curr_patch->next = *first_patch; + curr_patch->index = value; + curr_patch->value = cpool_start_address[value]; + *first_patch = curr_patch; + } + cpool_start_address[value] = *buf_ptr; + } + return SLJIT_SUCCESS; +} + +#else + +static sljit_s32 push_inst(struct sljit_compiler *compiler, sljit_uw inst) +{ + sljit_uw* ptr; + + ptr = (sljit_uw*)ensure_buf(compiler, sizeof(sljit_uw)); + FAIL_IF(!ptr); + compiler->size++; + *ptr = inst; + return SLJIT_SUCCESS; +} + +static SLJIT_INLINE sljit_s32 emit_imm(struct sljit_compiler *compiler, sljit_s32 reg, sljit_sw imm) +{ + FAIL_IF(push_inst(compiler, MOVW | RD(reg) | ((imm << 4) & 0xf0000) | (imm & 0xfff))); + return push_inst(compiler, MOVT | RD(reg) | ((imm >> 12) & 0xf0000) | ((imm >> 16) & 0xfff)); +} + +#endif + +static SLJIT_INLINE sljit_s32 detect_jump_type(struct sljit_jump *jump, sljit_uw *code_ptr, sljit_uw *code, sljit_sw executable_offset) +{ + sljit_sw diff; + + if (jump->flags & SLJIT_REWRITABLE_JUMP) + return 0; + +#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) + if (jump->flags & IS_BL) + code_ptr--; + + if (jump->flags & JUMP_ADDR) + diff = ((sljit_sw)jump->u.target - (sljit_sw)(code_ptr + 2) - executable_offset); + else { + SLJIT_ASSERT(jump->flags & JUMP_LABEL); + diff = ((sljit_sw)(code + jump->u.label->size) - (sljit_sw)(code_ptr + 2)); + } + + /* Branch to Thumb code has not been optimized yet. */ + if (diff & 0x3) + return 0; + + if (jump->flags & IS_BL) { + if (diff <= 0x01ffffff && diff >= -0x02000000) { + *code_ptr = (BL - CONDITIONAL) | (*(code_ptr + 1) & COND_MASK); + jump->flags |= PATCH_B; + return 1; + } + } + else { + if (diff <= 0x01ffffff && diff >= -0x02000000) { + *code_ptr = (B - CONDITIONAL) | (*code_ptr & COND_MASK); + jump->flags |= PATCH_B; + } + } +#else + if (jump->flags & JUMP_ADDR) + diff = ((sljit_sw)jump->u.target - (sljit_sw)code_ptr - executable_offset); + else { + SLJIT_ASSERT(jump->flags & JUMP_LABEL); + diff = ((sljit_sw)(code + jump->u.label->size) - (sljit_sw)code_ptr); + } + + /* Branch to Thumb code has not been optimized yet. */ + if (diff & 0x3) + return 0; + + if (diff <= 0x01ffffff && diff >= -0x02000000) { + code_ptr -= 2; + *code_ptr = ((jump->flags & IS_BL) ? (BL - CONDITIONAL) : (B - CONDITIONAL)) | (code_ptr[2] & COND_MASK); + jump->flags |= PATCH_B; + return 1; + } +#endif + return 0; +} + +static SLJIT_INLINE void inline_set_jump_addr(sljit_uw jump_ptr, sljit_sw executable_offset, sljit_uw new_addr, sljit_s32 flush_cache) +{ +#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) + sljit_uw *ptr = (sljit_uw *)jump_ptr; + sljit_uw *inst = (sljit_uw *)ptr[0]; + sljit_uw mov_pc = ptr[1]; + sljit_s32 bl = (mov_pc & 0x0000f000) != RD(TMP_PC); + sljit_sw diff = (sljit_sw)(((sljit_sw)new_addr - (sljit_sw)(inst + 2) - executable_offset) >> 2); + + if (diff <= 0x7fffff && diff >= -0x800000) { + /* Turn to branch. */ + if (!bl) { + inst[0] = (mov_pc & COND_MASK) | (B - CONDITIONAL) | (diff & 0xffffff); + if (flush_cache) { + inst = (sljit_uw *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset); + SLJIT_CACHE_FLUSH(inst, inst + 1); + } + } else { + inst[0] = (mov_pc & COND_MASK) | (BL - CONDITIONAL) | (diff & 0xffffff); + inst[1] = NOP; + if (flush_cache) { + inst = (sljit_uw *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset); + SLJIT_CACHE_FLUSH(inst, inst + 2); + } + } + } else { + /* Get the position of the constant. */ + if (mov_pc & (1 << 23)) + ptr = inst + ((mov_pc & 0xfff) >> 2) + 2; + else + ptr = inst + 1; + + if (*inst != mov_pc) { + inst[0] = mov_pc; + if (!bl) { + if (flush_cache) { + inst = (sljit_uw *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset); + SLJIT_CACHE_FLUSH(inst, inst + 1); + } + } else { + inst[1] = BLX | RM(TMP_REG1); + if (flush_cache) { + inst = (sljit_uw *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset); + SLJIT_CACHE_FLUSH(inst, inst + 2); + } + } + } + *ptr = new_addr; + } +#else + sljit_uw *inst = (sljit_uw*)jump_ptr; + SLJIT_ASSERT((inst[0] & 0xfff00000) == MOVW && (inst[1] & 0xfff00000) == MOVT); + inst[0] = MOVW | (inst[0] & 0xf000) | ((new_addr << 4) & 0xf0000) | (new_addr & 0xfff); + inst[1] = MOVT | (inst[1] & 0xf000) | ((new_addr >> 12) & 0xf0000) | ((new_addr >> 16) & 0xfff); + if (flush_cache) { + inst = (sljit_uw *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset); + SLJIT_CACHE_FLUSH(inst, inst + 2); + } +#endif +} + +static sljit_uw get_imm(sljit_uw imm); + +static SLJIT_INLINE void inline_set_const(sljit_uw addr, sljit_sw executable_offset, sljit_sw new_constant, sljit_s32 flush_cache) +{ +#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) + sljit_uw *ptr = (sljit_uw*)addr; + sljit_uw *inst = (sljit_uw*)ptr[0]; + sljit_uw ldr_literal = ptr[1]; + sljit_uw src2; + + src2 = get_imm(new_constant); + if (src2) { + *inst = 0xe3a00000 | (ldr_literal & 0xf000) | src2; + if (flush_cache) { + inst = (sljit_uw *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset); + SLJIT_CACHE_FLUSH(inst, inst + 1); + } + return; + } + + src2 = get_imm(~new_constant); + if (src2) { + *inst = 0xe3e00000 | (ldr_literal & 0xf000) | src2; + if (flush_cache) { + inst = (sljit_uw *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset); + SLJIT_CACHE_FLUSH(inst, inst + 1); + } + return; + } + + if (ldr_literal & (1 << 23)) + ptr = inst + ((ldr_literal & 0xfff) >> 2) + 2; + else + ptr = inst + 1; + + if (*inst != ldr_literal) { + *inst = ldr_literal; + if (flush_cache) { + inst = (sljit_uw *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset); + SLJIT_CACHE_FLUSH(inst, inst + 1); + } + } + *ptr = new_constant; +#else + sljit_uw *inst = (sljit_uw*)addr; + SLJIT_ASSERT((inst[0] & 0xfff00000) == MOVW && (inst[1] & 0xfff00000) == MOVT); + inst[0] = MOVW | (inst[0] & 0xf000) | ((new_constant << 4) & 0xf0000) | (new_constant & 0xfff); + inst[1] = MOVT | (inst[1] & 0xf000) | ((new_constant >> 12) & 0xf0000) | ((new_constant >> 16) & 0xfff); + if (flush_cache) { + inst = (sljit_uw *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset); + SLJIT_CACHE_FLUSH(inst, inst + 2); + } +#endif +} + +SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler) +{ + struct sljit_memory_fragment *buf; + sljit_uw *code; + sljit_uw *code_ptr; + sljit_uw *buf_ptr; + sljit_uw *buf_end; + sljit_uw size; + sljit_uw word_count; + sljit_uw next_addr; + sljit_sw executable_offset; + sljit_sw addr; +#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) + sljit_uw cpool_size; + sljit_uw cpool_skip_alignment; + sljit_uw cpool_current_index; + sljit_uw *cpool_start_address; + sljit_uw *last_pc_patch; + struct future_patch *first_patch; +#endif + + struct sljit_label *label; + struct sljit_jump *jump; + struct sljit_const *const_; + struct sljit_put_label *put_label; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_generate_code(compiler)); + reverse_buf(compiler); + + /* Second code generation pass. */ +#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) + size = compiler->size + (compiler->patches << 1); + if (compiler->cpool_fill > 0) + size += compiler->cpool_fill + CONST_POOL_ALIGNMENT - 1; +#else + size = compiler->size; +#endif + code = (sljit_uw*)SLJIT_MALLOC_EXEC(size * sizeof(sljit_uw)); + PTR_FAIL_WITH_EXEC_IF(code); + buf = compiler->buf; + +#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) + cpool_size = 0; + cpool_skip_alignment = 0; + cpool_current_index = 0; + cpool_start_address = NULL; + first_patch = NULL; + last_pc_patch = code; +#endif + + code_ptr = code; + word_count = 0; + next_addr = 1; + executable_offset = SLJIT_EXEC_OFFSET(code); + + label = compiler->labels; + jump = compiler->jumps; + const_ = compiler->consts; + put_label = compiler->put_labels; + + if (label && label->size == 0) { + label->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code, executable_offset); + label = label->next; + } + + do { + buf_ptr = (sljit_uw*)buf->memory; + buf_end = buf_ptr + (buf->used_size >> 2); + do { + word_count++; +#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) + if (cpool_size > 0) { + if (cpool_skip_alignment > 0) { + buf_ptr++; + cpool_skip_alignment--; + } + else { + if (SLJIT_UNLIKELY(resolve_const_pool_index(compiler, &first_patch, cpool_current_index, cpool_start_address, buf_ptr))) { + SLJIT_FREE_EXEC(code); + compiler->error = SLJIT_ERR_ALLOC_FAILED; + return NULL; + } + buf_ptr++; + if (++cpool_current_index >= cpool_size) { + SLJIT_ASSERT(!first_patch); + cpool_size = 0; + if (label && label->size == word_count) { + /* Points after the current instruction. */ + label->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); + label->size = code_ptr - code; + label = label->next; + + next_addr = compute_next_addr(label, jump, const_, put_label); + } + } + } + } + else if ((*buf_ptr & 0xff000000) != PUSH_POOL) { +#endif + *code_ptr = *buf_ptr++; + if (next_addr == word_count) { + SLJIT_ASSERT(!label || label->size >= word_count); + SLJIT_ASSERT(!jump || jump->addr >= word_count); + SLJIT_ASSERT(!const_ || const_->addr >= word_count); + SLJIT_ASSERT(!put_label || put_label->addr >= word_count); + + /* These structures are ordered by their address. */ + if (jump && jump->addr == word_count) { +#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) + if (detect_jump_type(jump, code_ptr, code, executable_offset)) + code_ptr--; + jump->addr = (sljit_uw)code_ptr; +#else + jump->addr = (sljit_uw)(code_ptr - 2); + if (detect_jump_type(jump, code_ptr, code, executable_offset)) + code_ptr -= 2; +#endif + jump = jump->next; + } + if (label && label->size == word_count) { + /* code_ptr can be affected above. */ + label->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr + 1, executable_offset); + label->size = (code_ptr + 1) - code; + label = label->next; + } + if (const_ && const_->addr == word_count) { +#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) + const_->addr = (sljit_uw)code_ptr; +#else + const_->addr = (sljit_uw)(code_ptr - 1); +#endif + const_ = const_->next; + } + if (put_label && put_label->addr == word_count) { + SLJIT_ASSERT(put_label->label); + put_label->addr = (sljit_uw)code_ptr; + put_label = put_label->next; + } + next_addr = compute_next_addr(label, jump, const_, put_label); + } + code_ptr++; +#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) + } + else { + /* Fortunately, no need to shift. */ + cpool_size = *buf_ptr++ & ~PUSH_POOL; + SLJIT_ASSERT(cpool_size > 0); + cpool_start_address = ALIGN_INSTRUCTION(code_ptr + 1); + cpool_current_index = patch_pc_relative_loads(last_pc_patch, code_ptr, cpool_start_address, cpool_size); + if (cpool_current_index > 0) { + /* Unconditional branch. */ + *code_ptr = B | (((cpool_start_address - code_ptr) + cpool_current_index - 2) & ~PUSH_POOL); + code_ptr = cpool_start_address + cpool_current_index; + } + cpool_skip_alignment = CONST_POOL_ALIGNMENT - 1; + cpool_current_index = 0; + last_pc_patch = code_ptr; + } +#endif + } while (buf_ptr < buf_end); + buf = buf->next; + } while (buf); + + SLJIT_ASSERT(!label); + SLJIT_ASSERT(!jump); + SLJIT_ASSERT(!const_); + SLJIT_ASSERT(!put_label); + +#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) + SLJIT_ASSERT(cpool_size == 0); + if (compiler->cpool_fill > 0) { + cpool_start_address = ALIGN_INSTRUCTION(code_ptr); + cpool_current_index = patch_pc_relative_loads(last_pc_patch, code_ptr, cpool_start_address, compiler->cpool_fill); + if (cpool_current_index > 0) + code_ptr = cpool_start_address + cpool_current_index; + + buf_ptr = compiler->cpool; + buf_end = buf_ptr + compiler->cpool_fill; + cpool_current_index = 0; + while (buf_ptr < buf_end) { + if (SLJIT_UNLIKELY(resolve_const_pool_index(compiler, &first_patch, cpool_current_index, cpool_start_address, buf_ptr))) { + SLJIT_FREE_EXEC(code); + compiler->error = SLJIT_ERR_ALLOC_FAILED; + return NULL; + } + buf_ptr++; + cpool_current_index++; + } + SLJIT_ASSERT(!first_patch); + } +#endif + + jump = compiler->jumps; + while (jump) { + buf_ptr = (sljit_uw *)jump->addr; + + if (jump->flags & PATCH_B) { + addr = (sljit_sw)SLJIT_ADD_EXEC_OFFSET(buf_ptr + 2, executable_offset); + if (!(jump->flags & JUMP_ADDR)) { + SLJIT_ASSERT(jump->flags & JUMP_LABEL); + SLJIT_ASSERT(((sljit_sw)jump->u.label->addr - addr) <= 0x01ffffff && ((sljit_sw)jump->u.label->addr - addr) >= -0x02000000); + *buf_ptr |= (((sljit_sw)jump->u.label->addr - addr) >> 2) & 0x00ffffff; + } + else { + SLJIT_ASSERT(((sljit_sw)jump->u.target - addr) <= 0x01ffffff && ((sljit_sw)jump->u.target - addr) >= -0x02000000); + *buf_ptr |= (((sljit_sw)jump->u.target - addr) >> 2) & 0x00ffffff; + } + } + else if (jump->flags & SLJIT_REWRITABLE_JUMP) { +#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) + jump->addr = (sljit_uw)code_ptr; + code_ptr[0] = (sljit_uw)buf_ptr; + code_ptr[1] = *buf_ptr; + inline_set_jump_addr((sljit_uw)code_ptr, executable_offset, (jump->flags & JUMP_LABEL) ? jump->u.label->addr : jump->u.target, 0); + code_ptr += 2; +#else + inline_set_jump_addr((sljit_uw)buf_ptr, executable_offset, (jump->flags & JUMP_LABEL) ? jump->u.label->addr : jump->u.target, 0); +#endif + } + else { +#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) + if (jump->flags & IS_BL) + buf_ptr--; + if (*buf_ptr & (1 << 23)) + buf_ptr += ((*buf_ptr & 0xfff) >> 2) + 2; + else + buf_ptr += 1; + *buf_ptr = (jump->flags & JUMP_LABEL) ? jump->u.label->addr : jump->u.target; +#else + inline_set_jump_addr((sljit_uw)buf_ptr, executable_offset, (jump->flags & JUMP_LABEL) ? jump->u.label->addr : jump->u.target, 0); +#endif + } + jump = jump->next; + } + +#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) + const_ = compiler->consts; + while (const_) { + buf_ptr = (sljit_uw*)const_->addr; + const_->addr = (sljit_uw)code_ptr; + + code_ptr[0] = (sljit_uw)buf_ptr; + code_ptr[1] = *buf_ptr; + if (*buf_ptr & (1 << 23)) + buf_ptr += ((*buf_ptr & 0xfff) >> 2) + 2; + else + buf_ptr += 1; + /* Set the value again (can be a simple constant). */ + inline_set_const((sljit_uw)code_ptr, executable_offset, *buf_ptr, 0); + code_ptr += 2; + + const_ = const_->next; + } +#endif + + put_label = compiler->put_labels; + while (put_label) { + addr = put_label->label->addr; + buf_ptr = (sljit_uw*)put_label->addr; + +#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) + SLJIT_ASSERT((buf_ptr[0] & 0xffff0000) == 0xe59f0000); + buf_ptr[((buf_ptr[0] & 0xfff) >> 2) + 2] = addr; +#else + SLJIT_ASSERT((buf_ptr[-1] & 0xfff00000) == MOVW && (buf_ptr[0] & 0xfff00000) == MOVT); + buf_ptr[-1] |= ((addr << 4) & 0xf0000) | (addr & 0xfff); + buf_ptr[0] |= ((addr >> 12) & 0xf0000) | ((addr >> 16) & 0xfff); +#endif + put_label = put_label->next; + } + + SLJIT_ASSERT(code_ptr - code <= (sljit_s32)size); + + compiler->error = SLJIT_ERR_COMPILED; + compiler->executable_offset = executable_offset; + compiler->executable_size = (code_ptr - code) * sizeof(sljit_uw); + + code = (sljit_uw *)SLJIT_ADD_EXEC_OFFSET(code, executable_offset); + code_ptr = (sljit_uw *)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); + + SLJIT_CACHE_FLUSH(code, code_ptr); + return code; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type) +{ + switch (feature_type) { + case SLJIT_HAS_FPU: +#ifdef SLJIT_IS_FPU_AVAILABLE + return SLJIT_IS_FPU_AVAILABLE; +#else + /* Available by default. */ + return 1; +#endif + + case SLJIT_HAS_CLZ: + case SLJIT_HAS_CMOV: + return 1; + + default: + return 0; + } +} + +/* --------------------------------------------------------------------- */ +/* Entry, exit */ +/* --------------------------------------------------------------------- */ + +/* Creates an index in data_transfer_insts array. */ +#define WORD_SIZE 0x00 +#define BYTE_SIZE 0x01 +#define HALF_SIZE 0x02 +#define PRELOAD 0x03 +#define SIGNED 0x04 +#define LOAD_DATA 0x08 + +/* Flag bits for emit_op. */ +#define ALLOW_IMM 0x10 +#define ALLOW_INV_IMM 0x20 +#define ALLOW_ANY_IMM (ALLOW_IMM | ALLOW_INV_IMM) + +/* s/l - store/load (1 bit) + u/s - signed/unsigned (1 bit) + w/b/h/N - word/byte/half/NOT allowed (2 bit) + Storing signed and unsigned values are the same operations. */ + +static const sljit_uw data_transfer_insts[16] = { +/* s u w */ 0xe5000000 /* str */, +/* s u b */ 0xe5400000 /* strb */, +/* s u h */ 0xe10000b0 /* strh */, +/* s u N */ 0x00000000 /* not allowed */, +/* s s w */ 0xe5000000 /* str */, +/* s s b */ 0xe5400000 /* strb */, +/* s s h */ 0xe10000b0 /* strh */, +/* s s N */ 0x00000000 /* not allowed */, + +/* l u w */ 0xe5100000 /* ldr */, +/* l u b */ 0xe5500000 /* ldrb */, +/* l u h */ 0xe11000b0 /* ldrh */, +/* l u p */ 0xf5500000 /* preload */, +/* l s w */ 0xe5100000 /* ldr */, +/* l s b */ 0xe11000d0 /* ldrsb */, +/* l s h */ 0xe11000f0 /* ldrsh */, +/* l s N */ 0x00000000 /* not allowed */, +}; + +#define EMIT_DATA_TRANSFER(type, add, target_reg, base_reg, arg) \ + (data_transfer_insts[(type) & 0xf] | ((add) << 23) | RD(target_reg) | RN(base_reg) | (arg)) + +/* Normal ldr/str instruction. + Type2: ldrsb, ldrh, ldrsh */ +#define IS_TYPE1_TRANSFER(type) \ + (data_transfer_insts[(type) & 0xf] & 0x04000000) +#define TYPE2_TRANSFER_IMM(imm) \ + (((imm) & 0xf) | (((imm) & 0xf0) << 4) | (1 << 22)) + +static sljit_s32 emit_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 inp_flags, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w); + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compiler, + sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds, + sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size) +{ + sljit_s32 args, size, i, tmp; + sljit_uw push; + + CHECK_ERROR(); + CHECK(check_sljit_emit_enter(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size)); + set_emit_enter(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size); + + /* Push saved registers, temporary registers + stmdb sp!, {..., lr} */ + push = PUSH | (1 << 14); + + tmp = saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? (SLJIT_S0 + 1 - saveds) : SLJIT_FIRST_SAVED_REG; + for (i = SLJIT_S0; i >= tmp; i--) + push |= 1 << reg_map[i]; + + for (i = scratches; i >= SLJIT_FIRST_SAVED_REG; i--) + push |= 1 << reg_map[i]; + + FAIL_IF(push_inst(compiler, push)); + + /* Stack must be aligned to 8 bytes: */ + size = GET_SAVED_REGISTERS_SIZE(scratches, saveds, 1); + local_size = ((size + local_size + 7) & ~7) - size; + compiler->local_size = local_size; + if (local_size > 0) + FAIL_IF(emit_op(compiler, SLJIT_SUB, ALLOW_IMM, SLJIT_SP, 0, SLJIT_SP, 0, SLJIT_IMM, local_size)); + + args = get_arg_count(arg_types); + + if (args >= 1) + FAIL_IF(push_inst(compiler, MOV | RD(SLJIT_S0) | RM(SLJIT_R0))); + if (args >= 2) + FAIL_IF(push_inst(compiler, MOV | RD(SLJIT_S1) | RM(SLJIT_R1))); + if (args >= 3) + FAIL_IF(push_inst(compiler, MOV | RD(SLJIT_S2) | RM(SLJIT_R2))); + + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_set_context(struct sljit_compiler *compiler, + sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds, + sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size) +{ + sljit_s32 size; + + CHECK_ERROR(); + CHECK(check_sljit_set_context(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size)); + set_set_context(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size); + + size = GET_SAVED_REGISTERS_SIZE(scratches, saveds, 1); + compiler->local_size = ((size + local_size + 7) & ~7) - size; + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw) +{ + sljit_s32 i, tmp; + sljit_uw pop; + + CHECK_ERROR(); + CHECK(check_sljit_emit_return(compiler, op, src, srcw)); + + FAIL_IF(emit_mov_before_return(compiler, op, src, srcw)); + + if (compiler->local_size > 0) + FAIL_IF(emit_op(compiler, SLJIT_ADD, ALLOW_IMM, SLJIT_SP, 0, SLJIT_SP, 0, SLJIT_IMM, compiler->local_size)); + + /* Push saved registers, temporary registers + ldmia sp!, {..., pc} */ + pop = POP | (1 << 15); + + tmp = compiler->saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? (SLJIT_S0 + 1 - compiler->saveds) : SLJIT_FIRST_SAVED_REG; + for (i = SLJIT_S0; i >= tmp; i--) + pop |= 1 << reg_map[i]; + + for (i = compiler->scratches; i >= SLJIT_FIRST_SAVED_REG; i--) + pop |= 1 << reg_map[i]; + + return push_inst(compiler, pop); +} + +/* --------------------------------------------------------------------- */ +/* Operators */ +/* --------------------------------------------------------------------- */ + +/* flags: */ + /* Arguments are swapped. */ +#define ARGS_SWAPPED 0x01 + /* Inverted immediate. */ +#define INV_IMM 0x02 + /* Source and destination is register. */ +#define MOVE_REG_CONV 0x04 + /* Unused return value. */ +#define UNUSED_RETURN 0x08 +/* SET_FLAGS must be (1 << 20) as it is also the value of S bit (can be used for optimization). */ +#define SET_FLAGS (1 << 20) +/* dst: reg + src1: reg + src2: reg or imm (if allowed) + SRC2_IMM must be (1 << 25) as it is also the value of I bit (can be used for optimization). */ +#define SRC2_IMM (1 << 25) + +#define EMIT_SHIFT_INS_AND_RETURN(opcode) \ + SLJIT_ASSERT(!(flags & INV_IMM) && !(src2 & SRC2_IMM)); \ + if (compiler->shift_imm != 0x20) { \ + SLJIT_ASSERT(src1 == TMP_REG1); \ + SLJIT_ASSERT(!(flags & ARGS_SWAPPED)); \ + \ + if (compiler->shift_imm != 0) \ + return push_inst(compiler, MOV | (flags & SET_FLAGS) | \ + RD(dst) | (compiler->shift_imm << 7) | (opcode << 5) | RM(src2)); \ + return push_inst(compiler, MOV | (flags & SET_FLAGS) | RD(dst) | RM(src2)); \ + } \ + return push_inst(compiler, MOV | (flags & SET_FLAGS) | RD(dst) | \ + (reg_map[(flags & ARGS_SWAPPED) ? src1 : src2] << 8) | (opcode << 5) | 0x10 | RM((flags & ARGS_SWAPPED) ? src2 : src1)); + +static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 flags, + sljit_s32 dst, sljit_s32 src1, sljit_s32 src2) +{ + switch (GET_OPCODE(op)) { + case SLJIT_MOV: + SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & ARGS_SWAPPED)); + if (dst != src2) { + if (src2 & SRC2_IMM) { + return push_inst(compiler, ((flags & INV_IMM) ? MVN : MOV) | RD(dst) | src2); + } + return push_inst(compiler, MOV | RD(dst) | RM(src2)); + } + return SLJIT_SUCCESS; + + case SLJIT_MOV_U8: + case SLJIT_MOV_S8: + SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & ARGS_SWAPPED)); + if (flags & MOVE_REG_CONV) { +#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) + if (op == SLJIT_MOV_U8) + return push_inst(compiler, AND | RD(dst) | RN(src2) | SRC2_IMM | 0xff); + FAIL_IF(push_inst(compiler, MOV | RD(dst) | (24 << 7) | RM(src2))); + return push_inst(compiler, MOV | RD(dst) | (24 << 7) | (op == SLJIT_MOV_U8 ? 0x20 : 0x40) | RM(dst)); +#else + return push_inst(compiler, (op == SLJIT_MOV_U8 ? UXTB : SXTB) | RD(dst) | RM(src2)); +#endif + } + else if (dst != src2) { + SLJIT_ASSERT(src2 & SRC2_IMM); + return push_inst(compiler, ((flags & INV_IMM) ? MVN : MOV) | RD(dst) | src2); + } + return SLJIT_SUCCESS; + + case SLJIT_MOV_U16: + case SLJIT_MOV_S16: + SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & ARGS_SWAPPED)); + if (flags & MOVE_REG_CONV) { +#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) + FAIL_IF(push_inst(compiler, MOV | RD(dst) | (16 << 7) | RM(src2))); + return push_inst(compiler, MOV | RD(dst) | (16 << 7) | (op == SLJIT_MOV_U16 ? 0x20 : 0x40) | RM(dst)); +#else + return push_inst(compiler, (op == SLJIT_MOV_U16 ? UXTH : SXTH) | RD(dst) | RM(src2)); +#endif + } + else if (dst != src2) { + SLJIT_ASSERT(src2 & SRC2_IMM); + return push_inst(compiler, ((flags & INV_IMM) ? MVN : MOV) | RD(dst) | src2); + } + return SLJIT_SUCCESS; + + case SLJIT_NOT: + if (src2 & SRC2_IMM) { + return push_inst(compiler, ((flags & INV_IMM) ? MOV : MVN) | (flags & SET_FLAGS) | RD(dst) | src2); + } + return push_inst(compiler, MVN | (flags & SET_FLAGS) | RD(dst) | RM(src2)); + + case SLJIT_CLZ: + SLJIT_ASSERT(!(flags & INV_IMM)); + SLJIT_ASSERT(!(src2 & SRC2_IMM)); + FAIL_IF(push_inst(compiler, CLZ | RD(dst) | RM(src2))); + return SLJIT_SUCCESS; + + case SLJIT_ADD: + SLJIT_ASSERT(!(flags & INV_IMM)); + if ((flags & (UNUSED_RETURN | SET_FLAGS)) == (UNUSED_RETURN | SET_FLAGS) && !(flags & ARGS_SWAPPED)) + return push_inst(compiler, CMN | SET_FLAGS | RN(src1) | ((src2 & SRC2_IMM) ? src2 : RM(src2))); + return push_inst(compiler, ADD | (flags & SET_FLAGS) | RD(dst) | RN(src1) | ((src2 & SRC2_IMM) ? src2 : RM(src2))); + + case SLJIT_ADDC: + SLJIT_ASSERT(!(flags & INV_IMM)); + return push_inst(compiler, ADC | (flags & SET_FLAGS) | RD(dst) | RN(src1) | ((src2 & SRC2_IMM) ? src2 : RM(src2))); + + case SLJIT_SUB: + SLJIT_ASSERT(!(flags & INV_IMM)); + if ((flags & (UNUSED_RETURN | SET_FLAGS)) == (UNUSED_RETURN | SET_FLAGS) && !(flags & ARGS_SWAPPED)) + return push_inst(compiler, CMP | SET_FLAGS | RN(src1) | ((src2 & SRC2_IMM) ? src2 : RM(src2))); + return push_inst(compiler, (!(flags & ARGS_SWAPPED) ? SUB : RSB) | (flags & SET_FLAGS) + | RD(dst) | RN(src1) | ((src2 & SRC2_IMM) ? src2 : RM(src2))); + + case SLJIT_SUBC: + SLJIT_ASSERT(!(flags & INV_IMM)); + return push_inst(compiler, (!(flags & ARGS_SWAPPED) ? SBC : RSC) | (flags & SET_FLAGS) + | RD(dst) | RN(src1) | ((src2 & SRC2_IMM) ? src2 : RM(src2))); + + case SLJIT_MUL: + SLJIT_ASSERT(!(flags & INV_IMM)); + SLJIT_ASSERT(!(src2 & SRC2_IMM)); + + if (!HAS_FLAGS(op)) + return push_inst(compiler, MUL | (reg_map[dst] << 16) | (reg_map[src2] << 8) | reg_map[src1]); + + FAIL_IF(push_inst(compiler, SMULL | (reg_map[TMP_REG1] << 16) | (reg_map[dst] << 12) | (reg_map[src2] << 8) | reg_map[src1])); + + /* cmp TMP_REG1, dst asr #31. */ + return push_inst(compiler, CMP | SET_FLAGS | RN(TMP_REG1) | RM(dst) | 0xfc0); + + case SLJIT_AND: + return push_inst(compiler, (!(flags & INV_IMM) ? AND : BIC) | (flags & SET_FLAGS) + | RD(dst) | RN(src1) | ((src2 & SRC2_IMM) ? src2 : RM(src2))); + + case SLJIT_OR: + SLJIT_ASSERT(!(flags & INV_IMM)); + return push_inst(compiler, ORR | (flags & SET_FLAGS) | RD(dst) | RN(src1) | ((src2 & SRC2_IMM) ? src2 : RM(src2))); + + case SLJIT_XOR: + SLJIT_ASSERT(!(flags & INV_IMM)); + return push_inst(compiler, EOR | (flags & SET_FLAGS) | RD(dst) | RN(src1) | ((src2 & SRC2_IMM) ? src2 : RM(src2))); + + case SLJIT_SHL: + EMIT_SHIFT_INS_AND_RETURN(0); + + case SLJIT_LSHR: + EMIT_SHIFT_INS_AND_RETURN(1); + + case SLJIT_ASHR: + EMIT_SHIFT_INS_AND_RETURN(2); + } + + SLJIT_UNREACHABLE(); + return SLJIT_SUCCESS; +} + +#undef EMIT_SHIFT_INS_AND_RETURN + +/* Tests whether the immediate can be stored in the 12 bit imm field. + Returns with 0 if not possible. */ +static sljit_uw get_imm(sljit_uw imm) +{ + sljit_s32 rol; + + if (imm <= 0xff) + return SRC2_IMM | imm; + + if (!(imm & 0xff000000)) { + imm <<= 8; + rol = 8; + } + else { + imm = (imm << 24) | (imm >> 8); + rol = 0; + } + + if (!(imm & 0xff000000)) { + imm <<= 8; + rol += 4; + } + + if (!(imm & 0xf0000000)) { + imm <<= 4; + rol += 2; + } + + if (!(imm & 0xc0000000)) { + imm <<= 2; + rol += 1; + } + + if (!(imm & 0x00ffffff)) + return SRC2_IMM | (imm >> 24) | (rol << 8); + else + return 0; +} + +#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) +static sljit_s32 generate_int(struct sljit_compiler *compiler, sljit_s32 reg, sljit_uw imm, sljit_s32 positive) +{ + sljit_uw mask; + sljit_uw imm1; + sljit_uw imm2; + sljit_s32 rol; + + /* Step1: Search a zero byte (8 continous zero bit). */ + mask = 0xff000000; + rol = 8; + while(1) { + if (!(imm & mask)) { + /* Rol imm by rol. */ + imm = (imm << rol) | (imm >> (32 - rol)); + /* Calculate arm rol. */ + rol = 4 + (rol >> 1); + break; + } + rol += 2; + mask >>= 2; + if (mask & 0x3) { + /* rol by 8. */ + imm = (imm << 8) | (imm >> 24); + mask = 0xff00; + rol = 24; + while (1) { + if (!(imm & mask)) { + /* Rol imm by rol. */ + imm = (imm << rol) | (imm >> (32 - rol)); + /* Calculate arm rol. */ + rol = (rol >> 1) - 8; + break; + } + rol += 2; + mask >>= 2; + if (mask & 0x3) + return 0; + } + break; + } + } + + /* The low 8 bit must be zero. */ + SLJIT_ASSERT(!(imm & 0xff)); + + if (!(imm & 0xff000000)) { + imm1 = SRC2_IMM | ((imm >> 16) & 0xff) | (((rol + 4) & 0xf) << 8); + imm2 = SRC2_IMM | ((imm >> 8) & 0xff) | (((rol + 8) & 0xf) << 8); + } + else if (imm & 0xc0000000) { + imm1 = SRC2_IMM | ((imm >> 24) & 0xff) | ((rol & 0xf) << 8); + imm <<= 8; + rol += 4; + + if (!(imm & 0xff000000)) { + imm <<= 8; + rol += 4; + } + + if (!(imm & 0xf0000000)) { + imm <<= 4; + rol += 2; + } + + if (!(imm & 0xc0000000)) { + imm <<= 2; + rol += 1; + } + + if (!(imm & 0x00ffffff)) + imm2 = SRC2_IMM | (imm >> 24) | ((rol & 0xf) << 8); + else + return 0; + } + else { + if (!(imm & 0xf0000000)) { + imm <<= 4; + rol += 2; + } + + if (!(imm & 0xc0000000)) { + imm <<= 2; + rol += 1; + } + + imm1 = SRC2_IMM | ((imm >> 24) & 0xff) | ((rol & 0xf) << 8); + imm <<= 8; + rol += 4; + + if (!(imm & 0xf0000000)) { + imm <<= 4; + rol += 2; + } + + if (!(imm & 0xc0000000)) { + imm <<= 2; + rol += 1; + } + + if (!(imm & 0x00ffffff)) + imm2 = SRC2_IMM | (imm >> 24) | ((rol & 0xf) << 8); + else + return 0; + } + + FAIL_IF(push_inst(compiler, (positive ? MOV : MVN) | RD(reg) | imm1)); + FAIL_IF(push_inst(compiler, (positive ? ORR : BIC) | RD(reg) | RN(reg) | imm2)); + return 1; +} +#endif + +static sljit_s32 load_immediate(struct sljit_compiler *compiler, sljit_s32 reg, sljit_uw imm) +{ + sljit_uw tmp; + +#if (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) + if (!(imm & ~0xffff)) + return push_inst(compiler, MOVW | RD(reg) | ((imm << 4) & 0xf0000) | (imm & 0xfff)); +#endif + + /* Create imm by 1 inst. */ + tmp = get_imm(imm); + if (tmp) + return push_inst(compiler, MOV | RD(reg) | tmp); + + tmp = get_imm(~imm); + if (tmp) + return push_inst(compiler, MVN | RD(reg) | tmp); + +#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) + /* Create imm by 2 inst. */ + FAIL_IF(generate_int(compiler, reg, imm, 1)); + FAIL_IF(generate_int(compiler, reg, ~imm, 0)); + + /* Load integer. */ + return push_inst_with_literal(compiler, EMIT_DATA_TRANSFER(WORD_SIZE | LOAD_DATA, 1, reg, TMP_PC, 0), imm); +#else + FAIL_IF(push_inst(compiler, MOVW | RD(reg) | ((imm << 4) & 0xf0000) | (imm & 0xfff))); + if (imm <= 0xffff) + return SLJIT_SUCCESS; + return push_inst(compiler, MOVT | RD(reg) | ((imm >> 12) & 0xf0000) | ((imm >> 16) & 0xfff)); +#endif +} + +static SLJIT_INLINE sljit_s32 emit_op_mem(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg, + sljit_s32 arg, sljit_sw argw, sljit_s32 tmp_reg) +{ + sljit_uw imm, offset_reg; + sljit_uw is_type1_transfer = IS_TYPE1_TRANSFER(flags); + + SLJIT_ASSERT (arg & SLJIT_MEM); + SLJIT_ASSERT((arg & REG_MASK) != tmp_reg); + + if ((arg & REG_MASK) == SLJIT_UNUSED) { + if (is_type1_transfer) { + FAIL_IF(load_immediate(compiler, tmp_reg, argw & ~0xfff)); + argw &= 0xfff; + } + else { + FAIL_IF(load_immediate(compiler, tmp_reg, argw & ~0xff)); + argw &= 0xff; + } + + return push_inst(compiler, EMIT_DATA_TRANSFER(flags, 1, reg, tmp_reg, + is_type1_transfer ? argw : TYPE2_TRANSFER_IMM(argw))); + } + + if (arg & OFFS_REG_MASK) { + offset_reg = OFFS_REG(arg); + arg &= REG_MASK; + argw &= 0x3; + + if (argw != 0 && !is_type1_transfer) { + FAIL_IF(push_inst(compiler, ADD | RD(tmp_reg) | RN(arg) | RM(offset_reg) | (argw << 7))); + return push_inst(compiler, EMIT_DATA_TRANSFER(flags, 1, reg, tmp_reg, TYPE2_TRANSFER_IMM(0))); + } + + /* Bit 25: RM is offset. */ + return push_inst(compiler, EMIT_DATA_TRANSFER(flags, 1, reg, arg, + RM(offset_reg) | (is_type1_transfer ? (1 << 25) : 0) | (argw << 7))); + } + + arg &= REG_MASK; + + if (is_type1_transfer) { + if (argw > 0xfff) { + imm = get_imm(argw & ~0xfff); + if (imm) { + FAIL_IF(push_inst(compiler, ADD | RD(tmp_reg) | RN(arg) | imm)); + argw = argw & 0xfff; + arg = tmp_reg; + } + } + else if (argw < -0xfff) { + imm = get_imm(-argw & ~0xfff); + if (imm) { + FAIL_IF(push_inst(compiler, SUB | RD(tmp_reg) | RN(arg) | imm)); + argw = -(-argw & 0xfff); + arg = tmp_reg; + } + } + + if (argw >= 0 && argw <= 0xfff) + return push_inst(compiler, EMIT_DATA_TRANSFER(flags, 1, reg, arg, argw)); + + if (argw < 0 && argw >= -0xfff) + return push_inst(compiler, EMIT_DATA_TRANSFER(flags, 0, reg, arg, -argw)); + } + else { + if (argw > 0xff) { + imm = get_imm(argw & ~0xff); + if (imm) { + FAIL_IF(push_inst(compiler, ADD | RD(tmp_reg) | RN(arg) | imm)); + argw = argw & 0xff; + arg = tmp_reg; + } + } + else if (argw < -0xff) { + imm = get_imm(-argw & ~0xff); + if (imm) { + FAIL_IF(push_inst(compiler, SUB | RD(tmp_reg) | RN(arg) | imm)); + argw = -(-argw & 0xff); + arg = tmp_reg; + } + } + + if (argw >= 0 && argw <= 0xff) + return push_inst(compiler, EMIT_DATA_TRANSFER(flags, 1, reg, arg, TYPE2_TRANSFER_IMM(argw))); + + if (argw < 0 && argw >= -0xff) { + argw = -argw; + return push_inst(compiler, EMIT_DATA_TRANSFER(flags, 0, reg, arg, TYPE2_TRANSFER_IMM(argw))); + } + } + + FAIL_IF(load_immediate(compiler, tmp_reg, argw)); + return push_inst(compiler, EMIT_DATA_TRANSFER(flags, 1, reg, arg, + RM(tmp_reg) | (is_type1_transfer ? (1 << 25) : 0))); +} + +static sljit_s32 emit_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 inp_flags, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + /* src1 is reg or TMP_REG1 + src2 is reg, TMP_REG2, or imm + result goes to TMP_REG2, so put result can use TMP_REG1. */ + + /* We prefers register and simple consts. */ + sljit_s32 dst_reg; + sljit_s32 src1_reg; + sljit_s32 src2_reg; + sljit_s32 flags = HAS_FLAGS(op) ? SET_FLAGS : 0; + + /* Destination check. */ + if (SLJIT_UNLIKELY(dst == SLJIT_UNUSED)) + flags |= UNUSED_RETURN; + + SLJIT_ASSERT(!(inp_flags & ALLOW_INV_IMM) || (inp_flags & ALLOW_IMM)); + + src2_reg = 0; + + do { + if (!(inp_flags & ALLOW_IMM)) + break; + + if (src2 & SLJIT_IMM) { + src2_reg = get_imm(src2w); + if (src2_reg) + break; + if (inp_flags & ALLOW_INV_IMM) { + src2_reg = get_imm(~src2w); + if (src2_reg) { + flags |= INV_IMM; + break; + } + } + if (GET_OPCODE(op) == SLJIT_ADD) { + src2_reg = get_imm(-src2w); + if (src2_reg) { + op = SLJIT_SUB | GET_ALL_FLAGS(op); + break; + } + } + if (GET_OPCODE(op) == SLJIT_SUB) { + src2_reg = get_imm(-src2w); + if (src2_reg) { + op = SLJIT_ADD | GET_ALL_FLAGS(op); + break; + } + } + } + + if (src1 & SLJIT_IMM) { + src2_reg = get_imm(src1w); + if (src2_reg) { + flags |= ARGS_SWAPPED; + src1 = src2; + src1w = src2w; + break; + } + if (inp_flags & ALLOW_INV_IMM) { + src2_reg = get_imm(~src1w); + if (src2_reg) { + flags |= ARGS_SWAPPED | INV_IMM; + src1 = src2; + src1w = src2w; + break; + } + } + if (GET_OPCODE(op) == SLJIT_ADD) { + src2_reg = get_imm(-src1w); + if (src2_reg) { + /* Note: add is commutative operation. */ + src1 = src2; + src1w = src2w; + op = SLJIT_SUB | GET_ALL_FLAGS(op); + break; + } + } + } + } while(0); + + /* Source 1. */ + if (FAST_IS_REG(src1)) + src1_reg = src1; + else if (src1 & SLJIT_MEM) { + FAIL_IF(emit_op_mem(compiler, inp_flags | LOAD_DATA, TMP_REG1, src1, src1w, TMP_REG1)); + src1_reg = TMP_REG1; + } + else { + FAIL_IF(load_immediate(compiler, TMP_REG1, src1w)); + src1_reg = TMP_REG1; + } + + /* Destination. */ + dst_reg = SLOW_IS_REG(dst) ? dst : TMP_REG2; + + if (op <= SLJIT_MOV_P) { + if (dst & SLJIT_MEM) { + if (inp_flags & BYTE_SIZE) + inp_flags &= ~SIGNED; + + if (FAST_IS_REG(src2)) + return emit_op_mem(compiler, inp_flags, src2, dst, dstw, TMP_REG2); + } + + if (FAST_IS_REG(src2) && dst_reg != TMP_REG2) + flags |= MOVE_REG_CONV; + } + + /* Source 2. */ + if (src2_reg == 0) { + src2_reg = (op <= SLJIT_MOV_P) ? dst_reg : TMP_REG2; + + if (FAST_IS_REG(src2)) + src2_reg = src2; + else if (src2 & SLJIT_MEM) + FAIL_IF(emit_op_mem(compiler, inp_flags | LOAD_DATA, src2_reg, src2, src2w, TMP_REG2)); + else + FAIL_IF(load_immediate(compiler, src2_reg, src2w)); + } + + FAIL_IF(emit_single_op(compiler, op, flags, dst_reg, src1_reg, src2_reg)); + + if (!(dst & SLJIT_MEM)) + return SLJIT_SUCCESS; + + return emit_op_mem(compiler, inp_flags, dst_reg, dst, dstw, TMP_REG1); +} + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(__GNUC__) +extern unsigned int __aeabi_uidivmod(unsigned int numerator, unsigned int denominator); +extern int __aeabi_idivmod(int numerator, int denominator); +#else +#error "Software divmod functions are needed" +#endif + +#ifdef __cplusplus +} +#endif + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compiler, sljit_s32 op) +{ + sljit_sw saved_reg_list[3]; + sljit_sw saved_reg_count; + + CHECK_ERROR(); + CHECK(check_sljit_emit_op0(compiler, op)); + + op = GET_OPCODE(op); + switch (op) { + case SLJIT_BREAKPOINT: + FAIL_IF(push_inst(compiler, BKPT)); + break; + case SLJIT_NOP: + FAIL_IF(push_inst(compiler, NOP)); + break; + case SLJIT_LMUL_UW: + case SLJIT_LMUL_SW: + return push_inst(compiler, (op == SLJIT_LMUL_UW ? UMULL : SMULL) + | (reg_map[SLJIT_R1] << 16) + | (reg_map[SLJIT_R0] << 12) + | (reg_map[SLJIT_R0] << 8) + | reg_map[SLJIT_R1]); + case SLJIT_DIVMOD_UW: + case SLJIT_DIVMOD_SW: + case SLJIT_DIV_UW: + case SLJIT_DIV_SW: + SLJIT_COMPILE_ASSERT((SLJIT_DIVMOD_UW & 0x2) == 0 && SLJIT_DIV_UW - 0x2 == SLJIT_DIVMOD_UW, bad_div_opcode_assignments); + SLJIT_ASSERT(reg_map[2] == 1 && reg_map[3] == 2 && reg_map[4] == 3); + + saved_reg_count = 0; + if (compiler->scratches >= 4) + saved_reg_list[saved_reg_count++] = 3; + if (compiler->scratches >= 3) + saved_reg_list[saved_reg_count++] = 2; + if (op >= SLJIT_DIV_UW) + saved_reg_list[saved_reg_count++] = 1; + + if (saved_reg_count > 0) { + FAIL_IF(push_inst(compiler, 0xe52d0000 | (saved_reg_count >= 3 ? 16 : 8) + | (saved_reg_list[0] << 12) /* str rX, [sp, #-8/-16]! */)); + if (saved_reg_count >= 2) { + SLJIT_ASSERT(saved_reg_list[1] < 8); + FAIL_IF(push_inst(compiler, 0xe58d0004 | (saved_reg_list[1] << 12) /* str rX, [sp, #4] */)); + } + if (saved_reg_count >= 3) { + SLJIT_ASSERT(saved_reg_list[2] < 8); + FAIL_IF(push_inst(compiler, 0xe58d0008 | (saved_reg_list[2] << 12) /* str rX, [sp, #8] */)); + } + } + +#if defined(__GNUC__) + FAIL_IF(sljit_emit_ijump(compiler, SLJIT_FAST_CALL, SLJIT_IMM, + ((op | 0x2) == SLJIT_DIV_UW ? SLJIT_FUNC_OFFSET(__aeabi_uidivmod) : SLJIT_FUNC_OFFSET(__aeabi_idivmod)))); +#else +#error "Software divmod functions are needed" +#endif + + if (saved_reg_count > 0) { + if (saved_reg_count >= 3) { + SLJIT_ASSERT(saved_reg_list[2] < 8); + FAIL_IF(push_inst(compiler, 0xe59d0008 | (saved_reg_list[2] << 12) /* ldr rX, [sp, #8] */)); + } + if (saved_reg_count >= 2) { + SLJIT_ASSERT(saved_reg_list[1] < 8); + FAIL_IF(push_inst(compiler, 0xe59d0004 | (saved_reg_list[1] << 12) /* ldr rX, [sp, #4] */)); + } + return push_inst(compiler, 0xe49d0000 | (saved_reg_count >= 3 ? 16 : 8) + | (saved_reg_list[0] << 12) /* ldr rX, [sp], #8/16 */); + } + return SLJIT_SUCCESS; + } + + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw)); + ADJUST_LOCAL_OFFSET(dst, dstw); + ADJUST_LOCAL_OFFSET(src, srcw); + + if (dst == SLJIT_UNUSED && !HAS_FLAGS(op)) { +#if (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) + if (op <= SLJIT_MOV_P && (src & SLJIT_MEM)) + return emit_op_mem(compiler, PRELOAD | LOAD_DATA, TMP_PC, src, srcw, TMP_REG1); +#endif + return SLJIT_SUCCESS; + } + + switch (GET_OPCODE(op)) { + case SLJIT_MOV: + case SLJIT_MOV_U32: + case SLJIT_MOV_S32: + case SLJIT_MOV_P: + return emit_op(compiler, SLJIT_MOV, ALLOW_ANY_IMM, dst, dstw, TMP_REG1, 0, src, srcw); + + case SLJIT_MOV_U8: + return emit_op(compiler, SLJIT_MOV_U8, ALLOW_ANY_IMM | BYTE_SIZE, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u8)srcw : srcw); + + case SLJIT_MOV_S8: + return emit_op(compiler, SLJIT_MOV_S8, ALLOW_ANY_IMM | SIGNED | BYTE_SIZE, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s8)srcw : srcw); + + case SLJIT_MOV_U16: + return emit_op(compiler, SLJIT_MOV_U16, ALLOW_ANY_IMM | HALF_SIZE, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u16)srcw : srcw); + + case SLJIT_MOV_S16: + return emit_op(compiler, SLJIT_MOV_S16, ALLOW_ANY_IMM | SIGNED | HALF_SIZE, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s16)srcw : srcw); + + case SLJIT_NOT: + return emit_op(compiler, op, ALLOW_ANY_IMM, dst, dstw, TMP_REG1, 0, src, srcw); + + case SLJIT_NEG: +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \ + || (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + compiler->skip_checks = 1; +#endif + return sljit_emit_op2(compiler, SLJIT_SUB | GET_ALL_FLAGS(op), dst, dstw, SLJIT_IMM, 0, src, srcw); + + case SLJIT_CLZ: + return emit_op(compiler, op, 0, dst, dstw, TMP_REG1, 0, src, srcw); + } + + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_op2(compiler, op, dst, dstw, src1, src1w, src2, src2w)); + ADJUST_LOCAL_OFFSET(dst, dstw); + ADJUST_LOCAL_OFFSET(src1, src1w); + ADJUST_LOCAL_OFFSET(src2, src2w); + + if (dst == SLJIT_UNUSED && !HAS_FLAGS(op)) + return SLJIT_SUCCESS; + + switch (GET_OPCODE(op)) { + case SLJIT_ADD: + case SLJIT_ADDC: + case SLJIT_SUB: + case SLJIT_SUBC: + case SLJIT_OR: + case SLJIT_XOR: + return emit_op(compiler, op, ALLOW_IMM, dst, dstw, src1, src1w, src2, src2w); + + case SLJIT_MUL: + return emit_op(compiler, op, 0, dst, dstw, src1, src1w, src2, src2w); + + case SLJIT_AND: + return emit_op(compiler, op, ALLOW_ANY_IMM, dst, dstw, src1, src1w, src2, src2w); + + case SLJIT_SHL: + case SLJIT_LSHR: + case SLJIT_ASHR: + if (src2 & SLJIT_IMM) { + compiler->shift_imm = src2w & 0x1f; + return emit_op(compiler, op, 0, dst, dstw, TMP_REG1, 0, src1, src1w); + } + else { + compiler->shift_imm = 0x20; + return emit_op(compiler, op, 0, dst, dstw, src1, src1w, src2, src2w); + } + } + + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg) +{ + CHECK_REG_INDEX(check_sljit_get_register_index(reg)); + return reg_map[reg]; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_float_register_index(sljit_s32 reg) +{ + CHECK_REG_INDEX(check_sljit_get_float_register_index(reg)); + return (freg_map[reg] << 1); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler, + void *instruction, sljit_s32 size) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_op_custom(compiler, instruction, size)); + + return push_inst(compiler, *(sljit_uw*)instruction); +} + +/* --------------------------------------------------------------------- */ +/* Floating point operators */ +/* --------------------------------------------------------------------- */ + + +#define FPU_LOAD (1 << 20) +#define EMIT_FPU_DATA_TRANSFER(inst, add, base, freg, offs) \ + ((inst) | ((add) << 23) | (reg_map[base] << 16) | (freg_map[freg] << 12) | (offs)) +#define EMIT_FPU_OPERATION(opcode, mode, dst, src1, src2) \ + ((opcode) | (mode) | (freg_map[dst] << 12) | freg_map[src1] | (freg_map[src2] << 16)) + +static sljit_s32 emit_fop_mem(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg, sljit_s32 arg, sljit_sw argw) +{ + sljit_uw imm; + sljit_sw inst = VSTR_F32 | (flags & (SLJIT_F32_OP | FPU_LOAD)); + + SLJIT_ASSERT(arg & SLJIT_MEM); + arg &= ~SLJIT_MEM; + + if (SLJIT_UNLIKELY(arg & OFFS_REG_MASK)) { + FAIL_IF(push_inst(compiler, ADD | RD(TMP_REG2) | RN(arg & REG_MASK) | RM(OFFS_REG(arg)) | ((argw & 0x3) << 7))); + arg = TMP_REG2; + argw = 0; + } + + /* Fast loads and stores. */ + if (arg) { + if (!(argw & ~0x3fc)) + return push_inst(compiler, EMIT_FPU_DATA_TRANSFER(inst, 1, arg & REG_MASK, reg, argw >> 2)); + if (!(-argw & ~0x3fc)) + return push_inst(compiler, EMIT_FPU_DATA_TRANSFER(inst, 0, arg & REG_MASK, reg, (-argw) >> 2)); + + imm = get_imm(argw & ~0x3fc); + if (imm) { + FAIL_IF(push_inst(compiler, ADD | RD(TMP_REG2) | RN(arg & REG_MASK) | imm)); + return push_inst(compiler, EMIT_FPU_DATA_TRANSFER(inst, 1, TMP_REG2, reg, (argw & 0x3fc) >> 2)); + } + imm = get_imm(-argw & ~0x3fc); + if (imm) { + argw = -argw; + FAIL_IF(push_inst(compiler, SUB | RD(TMP_REG2) | RN(arg & REG_MASK) | imm)); + return push_inst(compiler, EMIT_FPU_DATA_TRANSFER(inst, 0, TMP_REG2, reg, (argw & 0x3fc) >> 2)); + } + } + + if (arg) { + FAIL_IF(load_immediate(compiler, TMP_REG2, argw)); + FAIL_IF(push_inst(compiler, ADD | RD(TMP_REG2) | RN(arg & REG_MASK) | RM(TMP_REG2))); + } + else + FAIL_IF(load_immediate(compiler, TMP_REG2, argw)); + + return push_inst(compiler, EMIT_FPU_DATA_TRANSFER(inst, 1, TMP_REG2, reg, 0)); +} + +static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_sw_from_f64(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + op ^= SLJIT_F32_OP; + + if (src & SLJIT_MEM) { + FAIL_IF(emit_fop_mem(compiler, (op & SLJIT_F32_OP) | FPU_LOAD, TMP_FREG1, src, srcw)); + src = TMP_FREG1; + } + + FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VCVT_S32_F32, op & SLJIT_F32_OP, TMP_FREG1, src, 0))); + + if (FAST_IS_REG(dst)) + return push_inst(compiler, VMOV | (1 << 20) | RD(dst) | (freg_map[TMP_FREG1] << 16)); + + /* Store the integer value from a VFP register. */ + return emit_fop_mem(compiler, 0, TMP_FREG1, dst, dstw); +} + +static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1; + + op ^= SLJIT_F32_OP; + + if (FAST_IS_REG(src)) + FAIL_IF(push_inst(compiler, VMOV | RD(src) | (freg_map[TMP_FREG1] << 16))); + else if (src & SLJIT_MEM) { + /* Load the integer value into a VFP register. */ + FAIL_IF(emit_fop_mem(compiler, FPU_LOAD, TMP_FREG1, src, srcw)); + } + else { + FAIL_IF(load_immediate(compiler, TMP_REG1, srcw)); + FAIL_IF(push_inst(compiler, VMOV | RD(TMP_REG1) | (freg_map[TMP_FREG1] << 16))); + } + + FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VCVT_F32_S32, op & SLJIT_F32_OP, dst_r, TMP_FREG1, 0))); + + if (dst & SLJIT_MEM) + return emit_fop_mem(compiler, (op & SLJIT_F32_OP), TMP_FREG1, dst, dstw); + return SLJIT_SUCCESS; +} + +static SLJIT_INLINE sljit_s32 sljit_emit_fop1_cmp(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + op ^= SLJIT_F32_OP; + + if (src1 & SLJIT_MEM) { + FAIL_IF(emit_fop_mem(compiler, (op & SLJIT_F32_OP) | FPU_LOAD, TMP_FREG1, src1, src1w)); + src1 = TMP_FREG1; + } + + if (src2 & SLJIT_MEM) { + FAIL_IF(emit_fop_mem(compiler, (op & SLJIT_F32_OP) | FPU_LOAD, TMP_FREG2, src2, src2w)); + src2 = TMP_FREG2; + } + + FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VCMP_F32, op & SLJIT_F32_OP, src1, src2, 0))); + return push_inst(compiler, VMRS); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + sljit_s32 dst_r; + + CHECK_ERROR(); + + SLJIT_COMPILE_ASSERT((SLJIT_F32_OP == 0x100), float_transfer_bit_error); + SELECT_FOP1_OPERATION_WITH_CHECKS(compiler, op, dst, dstw, src, srcw); + + dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1; + + if (GET_OPCODE(op) != SLJIT_CONV_F64_FROM_F32) + op ^= SLJIT_F32_OP; + + if (src & SLJIT_MEM) { + FAIL_IF(emit_fop_mem(compiler, (op & SLJIT_F32_OP) | FPU_LOAD, dst_r, src, srcw)); + src = dst_r; + } + + switch (GET_OPCODE(op)) { + case SLJIT_MOV_F64: + if (src != dst_r) { + if (dst_r != TMP_FREG1) + FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VMOV_F32, op & SLJIT_F32_OP, dst_r, src, 0))); + else + dst_r = src; + } + break; + case SLJIT_NEG_F64: + FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VNEG_F32, op & SLJIT_F32_OP, dst_r, src, 0))); + break; + case SLJIT_ABS_F64: + FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VABS_F32, op & SLJIT_F32_OP, dst_r, src, 0))); + break; + case SLJIT_CONV_F64_FROM_F32: + FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VCVT_F64_F32, op & SLJIT_F32_OP, dst_r, src, 0))); + op ^= SLJIT_F32_OP; + break; + } + + if (dst & SLJIT_MEM) + return emit_fop_mem(compiler, (op & SLJIT_F32_OP), dst_r, dst, dstw); + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + sljit_s32 dst_r; + + CHECK_ERROR(); + CHECK(check_sljit_emit_fop2(compiler, op, dst, dstw, src1, src1w, src2, src2w)); + ADJUST_LOCAL_OFFSET(dst, dstw); + ADJUST_LOCAL_OFFSET(src1, src1w); + ADJUST_LOCAL_OFFSET(src2, src2w); + + op ^= SLJIT_F32_OP; + + dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1; + + if (src2 & SLJIT_MEM) { + FAIL_IF(emit_fop_mem(compiler, (op & SLJIT_F32_OP) | FPU_LOAD, TMP_FREG2, src2, src2w)); + src2 = TMP_FREG2; + } + + if (src1 & SLJIT_MEM) { + FAIL_IF(emit_fop_mem(compiler, (op & SLJIT_F32_OP) | FPU_LOAD, TMP_FREG1, src1, src1w)); + src1 = TMP_FREG1; + } + + switch (GET_OPCODE(op)) { + case SLJIT_ADD_F64: + FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VADD_F32, op & SLJIT_F32_OP, dst_r, src2, src1))); + break; + + case SLJIT_SUB_F64: + FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VSUB_F32, op & SLJIT_F32_OP, dst_r, src2, src1))); + break; + + case SLJIT_MUL_F64: + FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VMUL_F32, op & SLJIT_F32_OP, dst_r, src2, src1))); + break; + + case SLJIT_DIV_F64: + FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VDIV_F32, op & SLJIT_F32_OP, dst_r, src2, src1))); + break; + } + + if (dst_r == TMP_FREG1) + FAIL_IF(emit_fop_mem(compiler, (op & SLJIT_F32_OP), TMP_FREG1, dst, dstw)); + + return SLJIT_SUCCESS; +} + +#undef FPU_LOAD +#undef EMIT_FPU_DATA_TRANSFER + +/* --------------------------------------------------------------------- */ +/* Other instructions */ +/* --------------------------------------------------------------------- */ + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_fast_enter(compiler, dst, dstw)); + ADJUST_LOCAL_OFFSET(dst, dstw); + + SLJIT_ASSERT(reg_map[TMP_REG2] == 14); + + if (FAST_IS_REG(dst)) + return push_inst(compiler, MOV | RD(dst) | RM(TMP_REG2)); + + /* Memory. */ + return emit_op_mem(compiler, WORD_SIZE, TMP_REG2, dst, dstw, TMP_REG1); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_fast_return(compiler, src, srcw)); + ADJUST_LOCAL_OFFSET(src, srcw); + + SLJIT_ASSERT(reg_map[TMP_REG2] == 14); + + if (FAST_IS_REG(src)) + FAIL_IF(push_inst(compiler, MOV | RD(TMP_REG2) | RM(src))); + else + FAIL_IF(emit_op_mem(compiler, WORD_SIZE | LOAD_DATA, TMP_REG2, src, srcw, TMP_REG1)); + + return push_inst(compiler, BX | RM(TMP_REG2)); +} + +/* --------------------------------------------------------------------- */ +/* Conditional instructions */ +/* --------------------------------------------------------------------- */ + +static sljit_uw get_cc(sljit_s32 type) +{ + switch (type) { + case SLJIT_EQUAL: + case SLJIT_MUL_NOT_OVERFLOW: + case SLJIT_EQUAL_F64: + return 0x00000000; + + case SLJIT_NOT_EQUAL: + case SLJIT_MUL_OVERFLOW: + case SLJIT_NOT_EQUAL_F64: + return 0x10000000; + + case SLJIT_LESS: + case SLJIT_LESS_F64: + return 0x30000000; + + case SLJIT_GREATER_EQUAL: + case SLJIT_GREATER_EQUAL_F64: + return 0x20000000; + + case SLJIT_GREATER: + case SLJIT_GREATER_F64: + return 0x80000000; + + case SLJIT_LESS_EQUAL: + case SLJIT_LESS_EQUAL_F64: + return 0x90000000; + + case SLJIT_SIG_LESS: + return 0xb0000000; + + case SLJIT_SIG_GREATER_EQUAL: + return 0xa0000000; + + case SLJIT_SIG_GREATER: + return 0xc0000000; + + case SLJIT_SIG_LESS_EQUAL: + return 0xd0000000; + + case SLJIT_OVERFLOW: + case SLJIT_UNORDERED_F64: + return 0x60000000; + + case SLJIT_NOT_OVERFLOW: + case SLJIT_ORDERED_F64: + return 0x70000000; + + default: + SLJIT_ASSERT(type >= SLJIT_JUMP && type <= SLJIT_CALL_CDECL); + return 0xe0000000; + } +} + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compiler *compiler) +{ + struct sljit_label *label; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_label(compiler)); + + if (compiler->last_label && compiler->last_label->size == compiler->size) + return compiler->last_label; + + label = (struct sljit_label*)ensure_abuf(compiler, sizeof(struct sljit_label)); + PTR_FAIL_IF(!label); + set_label(label, compiler); + return label; +} + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, sljit_s32 type) +{ + struct sljit_jump *jump; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_jump(compiler, type)); + + jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump)); + PTR_FAIL_IF(!jump); + set_jump(jump, compiler, type & SLJIT_REWRITABLE_JUMP); + type &= 0xff; + + SLJIT_ASSERT(reg_map[TMP_REG1] != 14); + +#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) + if (type >= SLJIT_FAST_CALL) + PTR_FAIL_IF(prepare_blx(compiler)); + PTR_FAIL_IF(push_inst_with_unique_literal(compiler, ((EMIT_DATA_TRANSFER(WORD_SIZE | LOAD_DATA, 1, + type <= SLJIT_JUMP ? TMP_PC : TMP_REG1, TMP_PC, 0)) & ~COND_MASK) | get_cc(type), 0)); + + if (jump->flags & SLJIT_REWRITABLE_JUMP) { + jump->addr = compiler->size; + compiler->patches++; + } + + if (type >= SLJIT_FAST_CALL) { + jump->flags |= IS_BL; + PTR_FAIL_IF(emit_blx(compiler)); + } + + if (!(jump->flags & SLJIT_REWRITABLE_JUMP)) + jump->addr = compiler->size; +#else + if (type >= SLJIT_FAST_CALL) + jump->flags |= IS_BL; + PTR_FAIL_IF(emit_imm(compiler, TMP_REG1, 0)); + PTR_FAIL_IF(push_inst(compiler, (((type <= SLJIT_JUMP ? BX : BLX) | RM(TMP_REG1)) & ~COND_MASK) | get_cc(type))); + jump->addr = compiler->size; +#endif + return jump; +} + +#ifdef __SOFTFP__ + +static sljit_s32 softfloat_call_with_args(struct sljit_compiler *compiler, sljit_s32 arg_types, sljit_s32 *src) +{ + sljit_s32 stack_offset = 0; + sljit_s32 arg_count = 0; + sljit_s32 word_arg_offset = 0; + sljit_s32 float_arg_count = 0; + sljit_s32 types = 0; + sljit_s32 src_offset = 4 * sizeof(sljit_sw); + sljit_u8 offsets[4]; + + if (src && FAST_IS_REG(*src)) + src_offset = reg_map[*src] * sizeof(sljit_sw); + + arg_types >>= SLJIT_DEF_SHIFT; + + while (arg_types) { + types = (types << SLJIT_DEF_SHIFT) | (arg_types & SLJIT_DEF_MASK); + + switch (arg_types & SLJIT_DEF_MASK) { + case SLJIT_ARG_TYPE_F32: + offsets[arg_count] = (sljit_u8)stack_offset; + stack_offset += sizeof(sljit_f32); + arg_count++; + float_arg_count++; + break; + case SLJIT_ARG_TYPE_F64: + if (stack_offset & 0x7) + stack_offset += sizeof(sljit_sw); + offsets[arg_count] = (sljit_u8)stack_offset; + stack_offset += sizeof(sljit_f64); + arg_count++; + float_arg_count++; + break; + default: + offsets[arg_count] = (sljit_u8)stack_offset; + stack_offset += sizeof(sljit_sw); + arg_count++; + word_arg_offset += sizeof(sljit_sw); + break; + } + + arg_types >>= SLJIT_DEF_SHIFT; + } + + if (stack_offset > 16) + FAIL_IF(push_inst(compiler, SUB | RD(SLJIT_SP) | RN(SLJIT_SP) | SRC2_IMM | (((stack_offset - 16) + 0x7) & ~0x7))); + + /* Process arguments in reversed direction. */ + while (types) { + switch (types & SLJIT_DEF_MASK) { + case SLJIT_ARG_TYPE_F32: + arg_count--; + float_arg_count--; + stack_offset = offsets[arg_count]; + + if (stack_offset < 16) { + if (src_offset == stack_offset) { + FAIL_IF(push_inst(compiler, MOV | RD(TMP_REG1) | (src_offset >> 2))); + *src = TMP_REG1; + } + FAIL_IF(push_inst(compiler, VMOV | 0x100000 | (float_arg_count << 16) | (stack_offset << 10))); + } else + FAIL_IF(push_inst(compiler, VSTR_F32 | 0x800000 | RN(SLJIT_SP) | (float_arg_count << 12) | ((stack_offset - 16) >> 2))); + break; + case SLJIT_ARG_TYPE_F64: + arg_count--; + float_arg_count--; + stack_offset = offsets[arg_count]; + + SLJIT_ASSERT((stack_offset & 0x7) == 0); + + if (stack_offset < 16) { + if (src_offset == stack_offset || src_offset == stack_offset + sizeof(sljit_sw)) { + FAIL_IF(push_inst(compiler, MOV | RD(TMP_REG1) | (src_offset >> 2))); + *src = TMP_REG1; + } + FAIL_IF(push_inst(compiler, VMOV2 | 0x100000 | (stack_offset << 10) | ((stack_offset + sizeof(sljit_sw)) << 14) | float_arg_count)); + } else + FAIL_IF(push_inst(compiler, VSTR_F32 | 0x800100 | RN(SLJIT_SP) | (float_arg_count << 12) | ((stack_offset - 16) >> 2))); + break; + default: + arg_count--; + word_arg_offset -= sizeof(sljit_sw); + stack_offset = offsets[arg_count]; + + SLJIT_ASSERT(stack_offset >= word_arg_offset); + + if (stack_offset != word_arg_offset) { + if (stack_offset < 16) { + if (src_offset == stack_offset) { + FAIL_IF(push_inst(compiler, MOV | RD(TMP_REG1) | (src_offset >> 2))); + *src = TMP_REG1; + } + else if (src_offset == word_arg_offset) { + *src = 1 + (stack_offset >> 2); + src_offset = stack_offset; + } + FAIL_IF(push_inst(compiler, MOV | (stack_offset << 10) | (word_arg_offset >> 2))); + } else + FAIL_IF(push_inst(compiler, data_transfer_insts[WORD_SIZE] | 0x800000 | RN(SLJIT_SP) | (word_arg_offset << 10) | (stack_offset - 16))); + } + break; + } + + types >>= SLJIT_DEF_SHIFT; + } + + return SLJIT_SUCCESS; +} + +static sljit_s32 softfloat_post_call_with_args(struct sljit_compiler *compiler, sljit_s32 arg_types) +{ + sljit_s32 stack_size = 0; + + if ((arg_types & SLJIT_DEF_MASK) == SLJIT_ARG_TYPE_F32) + FAIL_IF(push_inst(compiler, VMOV | (0 << 16) | (0 << 12))); + if ((arg_types & SLJIT_DEF_MASK) == SLJIT_ARG_TYPE_F64) + FAIL_IF(push_inst(compiler, VMOV2 | (1 << 16) | (0 << 12) | 0)); + + arg_types >>= SLJIT_DEF_SHIFT; + + while (arg_types) { + switch (arg_types & SLJIT_DEF_MASK) { + case SLJIT_ARG_TYPE_F32: + stack_size += sizeof(sljit_f32); + break; + case SLJIT_ARG_TYPE_F64: + if (stack_size & 0x7) + stack_size += sizeof(sljit_sw); + stack_size += sizeof(sljit_f64); + break; + default: + stack_size += sizeof(sljit_sw); + break; + } + + arg_types >>= SLJIT_DEF_SHIFT; + } + + if (stack_size <= 16) + return SLJIT_SUCCESS; + + return push_inst(compiler, ADD | RD(SLJIT_SP) | RN(SLJIT_SP) | SRC2_IMM | (((stack_size - 16) + 0x7) & ~0x7)); +} + +#else /* !__SOFTFP__ */ + +static sljit_s32 hardfloat_call_with_args(struct sljit_compiler *compiler, sljit_s32 arg_types) +{ + sljit_u32 remap = 0; + sljit_u32 offset = 0; + sljit_u32 new_offset, mask; + + /* Remove return value. */ + arg_types >>= SLJIT_DEF_SHIFT; + + while (arg_types) { + if ((arg_types & SLJIT_DEF_MASK) == SLJIT_ARG_TYPE_F32) { + new_offset = 0; + mask = 1; + + while (remap & mask) { + new_offset++; + mask <<= 1; + } + remap |= mask; + + if (offset != new_offset) + FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VMOV_F32, + 0, (new_offset >> 1) + 1, (offset >> 1) + 1, 0) | ((new_offset & 0x1) ? 0x400000 : 0))); + + offset += 2; + } + else if ((arg_types & SLJIT_DEF_MASK) == SLJIT_ARG_TYPE_F64) { + new_offset = 0; + mask = 3; + + while (remap & mask) { + new_offset += 2; + mask <<= 2; + } + remap |= mask; + + if (offset != new_offset) + FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VMOV_F32, SLJIT_F32_OP, (new_offset >> 1) + 1, (offset >> 1) + 1, 0))); + + offset += 2; + } + arg_types >>= SLJIT_DEF_SHIFT; + } + + return SLJIT_SUCCESS; +} + +#endif /* __SOFTFP__ */ + +#undef EMIT_FPU_OPERATION + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_call(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 arg_types) +{ +#ifdef __SOFTFP__ + struct sljit_jump *jump; +#endif + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_call(compiler, type, arg_types)); + +#ifdef __SOFTFP__ + PTR_FAIL_IF(softfloat_call_with_args(compiler, arg_types, NULL)); + +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \ + || (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + compiler->skip_checks = 1; +#endif + + jump = sljit_emit_jump(compiler, type); + PTR_FAIL_IF(jump == NULL); + + PTR_FAIL_IF(softfloat_post_call_with_args(compiler, arg_types)); + return jump; +#else /* !__SOFTFP__ */ + PTR_FAIL_IF(hardfloat_call_with_args(compiler, arg_types)); + +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \ + || (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + compiler->skip_checks = 1; +#endif + + return sljit_emit_jump(compiler, type); +#endif /* __SOFTFP__ */ +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 src, sljit_sw srcw) +{ + struct sljit_jump *jump; + + CHECK_ERROR(); + CHECK(check_sljit_emit_ijump(compiler, type, src, srcw)); + ADJUST_LOCAL_OFFSET(src, srcw); + + SLJIT_ASSERT(reg_map[TMP_REG1] != 14); + + if (!(src & SLJIT_IMM)) { + if (FAST_IS_REG(src)) { + SLJIT_ASSERT(reg_map[src] != 14); + return push_inst(compiler, (type <= SLJIT_JUMP ? BX : BLX) | RM(src)); + } + + SLJIT_ASSERT(src & SLJIT_MEM); + FAIL_IF(emit_op_mem(compiler, WORD_SIZE | LOAD_DATA, TMP_REG1, src, srcw, TMP_REG1)); + return push_inst(compiler, (type <= SLJIT_JUMP ? BX : BLX) | RM(TMP_REG1)); + } + + /* These jumps are converted to jump/call instructions when possible. */ + jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump)); + FAIL_IF(!jump); + set_jump(jump, compiler, JUMP_ADDR | ((type >= SLJIT_FAST_CALL) ? IS_BL : 0)); + jump->u.target = srcw; + +#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) + if (type >= SLJIT_FAST_CALL) + FAIL_IF(prepare_blx(compiler)); + FAIL_IF(push_inst_with_unique_literal(compiler, EMIT_DATA_TRANSFER(WORD_SIZE | LOAD_DATA, 1, type <= SLJIT_JUMP ? TMP_PC : TMP_REG1, TMP_PC, 0), 0)); + if (type >= SLJIT_FAST_CALL) + FAIL_IF(emit_blx(compiler)); +#else + FAIL_IF(emit_imm(compiler, TMP_REG1, 0)); + FAIL_IF(push_inst(compiler, (type <= SLJIT_JUMP ? BX : BLX) | RM(TMP_REG1))); +#endif + jump->addr = compiler->size; + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_icall(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 arg_types, + sljit_s32 src, sljit_sw srcw) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_icall(compiler, type, arg_types, src, srcw)); + +#ifdef __SOFTFP__ + if (src & SLJIT_MEM) { + FAIL_IF(emit_op_mem(compiler, WORD_SIZE | LOAD_DATA, TMP_REG1, src, srcw, TMP_REG1)); + src = TMP_REG1; + } + + FAIL_IF(softfloat_call_with_args(compiler, arg_types, &src)); + +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \ + || (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + compiler->skip_checks = 1; +#endif + + FAIL_IF(sljit_emit_ijump(compiler, type, src, srcw)); + + return softfloat_post_call_with_args(compiler, arg_types); +#else /* !__SOFTFP__ */ + FAIL_IF(hardfloat_call_with_args(compiler, arg_types)); + +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \ + || (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + compiler->skip_checks = 1; +#endif + + return sljit_emit_ijump(compiler, type, src, srcw); +#endif /* __SOFTFP__ */ +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 type) +{ + sljit_s32 dst_reg, flags = GET_ALL_FLAGS(op); + sljit_uw cc, ins; + + CHECK_ERROR(); + CHECK(check_sljit_emit_op_flags(compiler, op, dst, dstw, type)); + ADJUST_LOCAL_OFFSET(dst, dstw); + + op = GET_OPCODE(op); + cc = get_cc(type & 0xff); + dst_reg = FAST_IS_REG(dst) ? dst : TMP_REG1; + + if (op < SLJIT_ADD) { + FAIL_IF(push_inst(compiler, MOV | RD(dst_reg) | SRC2_IMM | 0)); + FAIL_IF(push_inst(compiler, ((MOV | RD(dst_reg) | SRC2_IMM | 1) & ~COND_MASK) | cc)); + if (dst & SLJIT_MEM) + return emit_op_mem(compiler, WORD_SIZE, TMP_REG1, dst, dstw, TMP_REG2); + return SLJIT_SUCCESS; + } + + ins = (op == SLJIT_AND ? AND : (op == SLJIT_OR ? ORR : EOR)); + + if (dst & SLJIT_MEM) + FAIL_IF(emit_op_mem(compiler, WORD_SIZE | LOAD_DATA, TMP_REG1, dst, dstw, TMP_REG2)); + + FAIL_IF(push_inst(compiler, ((ins | RD(dst_reg) | RN(dst_reg) | SRC2_IMM | 1) & ~COND_MASK) | cc)); + + if (op == SLJIT_AND) + FAIL_IF(push_inst(compiler, ((ins | RD(dst_reg) | RN(dst_reg) | SRC2_IMM | 0) & ~COND_MASK) | (cc ^ 0x10000000))); + + if (dst & SLJIT_MEM) + FAIL_IF(emit_op_mem(compiler, WORD_SIZE, TMP_REG1, dst, dstw, TMP_REG2)); + + if (flags & SLJIT_SET_Z) + return push_inst(compiler, MOV | SET_FLAGS | RD(TMP_REG2) | RM(dst_reg)); + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 dst_reg, + sljit_s32 src, sljit_sw srcw) +{ + sljit_uw cc, tmp; + + CHECK_ERROR(); + CHECK(check_sljit_emit_cmov(compiler, type, dst_reg, src, srcw)); + + dst_reg &= ~SLJIT_I32_OP; + + cc = get_cc(type & 0xff); + + if (SLJIT_UNLIKELY(src & SLJIT_IMM)) { + tmp = get_imm(srcw); + if (tmp) + return push_inst(compiler, ((MOV | RD(dst_reg) | tmp) & ~COND_MASK) | cc); + + tmp = get_imm(~srcw); + if (tmp) + return push_inst(compiler, ((MVN | RD(dst_reg) | tmp) & ~COND_MASK) | cc); + +#if (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) + tmp = (sljit_uw) srcw; + FAIL_IF(push_inst(compiler, (MOVW & ~COND_MASK) | cc | RD(dst_reg) | ((tmp << 4) & 0xf0000) | (tmp & 0xfff))); + if (tmp <= 0xffff) + return SLJIT_SUCCESS; + return push_inst(compiler, (MOVT & ~COND_MASK) | cc | RD(dst_reg) | ((tmp >> 12) & 0xf0000) | ((tmp >> 16) & 0xfff)); +#else + FAIL_IF(load_immediate(compiler, TMP_REG1, srcw)); + src = TMP_REG1; +#endif + } + + return push_inst(compiler, ((MOV | RD(dst_reg) | RM(src)) & ~COND_MASK) | cc); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 reg, + sljit_s32 mem, sljit_sw memw) +{ + sljit_s32 flags; + sljit_uw is_type1_transfer, inst; + + CHECK_ERROR(); + CHECK(check_sljit_emit_mem(compiler, type, reg, mem, memw)); + + is_type1_transfer = 1; + + switch (type & 0xff) { + case SLJIT_MOV: + case SLJIT_MOV_U32: + case SLJIT_MOV_S32: + case SLJIT_MOV_P: + flags = WORD_SIZE; + break; + case SLJIT_MOV_U8: + flags = BYTE_SIZE; + break; + case SLJIT_MOV_S8: + if (!(type & SLJIT_MEM_STORE)) + is_type1_transfer = 0; + flags = BYTE_SIZE | SIGNED; + break; + case SLJIT_MOV_U16: + is_type1_transfer = 0; + flags = HALF_SIZE; + break; + case SLJIT_MOV_S16: + is_type1_transfer = 0; + flags = HALF_SIZE | SIGNED; + break; + default: + SLJIT_UNREACHABLE(); + flags = WORD_SIZE; + break; + } + + if (!(type & SLJIT_MEM_STORE)) + flags |= LOAD_DATA; + + SLJIT_ASSERT(is_type1_transfer == !!IS_TYPE1_TRANSFER(flags)); + + if (SLJIT_UNLIKELY(mem & OFFS_REG_MASK)) { + if (!is_type1_transfer && memw != 0) + return SLJIT_ERR_UNSUPPORTED; + } + else { + if (is_type1_transfer) { + if (memw > 4095 && memw < -4095) + return SLJIT_ERR_UNSUPPORTED; + } + else { + if (memw > 255 && memw < -255) + return SLJIT_ERR_UNSUPPORTED; + } + } + + if (type & SLJIT_MEM_SUPP) + return SLJIT_SUCCESS; + + if (SLJIT_UNLIKELY(mem & OFFS_REG_MASK)) { + memw &= 0x3; + + inst = EMIT_DATA_TRANSFER(flags, 1, reg, mem & REG_MASK, RM(OFFS_REG(mem)) | (memw << 7)); + + if (is_type1_transfer) + inst |= (1 << 25); + + if (type & SLJIT_MEM_PRE) + inst |= (1 << 21); + else + inst ^= (1 << 24); + + return push_inst(compiler, inst); + } + + inst = EMIT_DATA_TRANSFER(flags, 0, reg, mem & REG_MASK, 0); + + if (type & SLJIT_MEM_PRE) + inst |= (1 << 21); + else + inst ^= (1 << 24); + + if (is_type1_transfer) { + if (memw >= 0) + inst |= (1 << 23); + else + memw = -memw; + + return push_inst(compiler, inst | memw); + } + + if (memw >= 0) + inst |= (1 << 23); + else + memw = -memw; + + return push_inst(compiler, inst | TYPE2_TRANSFER_IMM(memw)); +} + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw init_value) +{ + struct sljit_const *const_; + sljit_s32 dst_r; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value)); + ADJUST_LOCAL_OFFSET(dst, dstw); + + dst_r = SLOW_IS_REG(dst) ? dst : TMP_REG2; + +#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) + PTR_FAIL_IF(push_inst_with_unique_literal(compiler, EMIT_DATA_TRANSFER(WORD_SIZE | LOAD_DATA, 1, dst_r, TMP_PC, 0), init_value)); + compiler->patches++; +#else + PTR_FAIL_IF(emit_imm(compiler, dst_r, init_value)); +#endif + + const_ = (struct sljit_const*)ensure_abuf(compiler, sizeof(struct sljit_const)); + PTR_FAIL_IF(!const_); + set_const(const_, compiler); + + if (dst & SLJIT_MEM) + PTR_FAIL_IF(emit_op_mem(compiler, WORD_SIZE, TMP_REG2, dst, dstw, TMP_REG1)); + return const_; +} + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_put_label* sljit_emit_put_label(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw) +{ + struct sljit_put_label *put_label; + sljit_s32 dst_r; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_put_label(compiler, dst, dstw)); + ADJUST_LOCAL_OFFSET(dst, dstw); + + dst_r = SLOW_IS_REG(dst) ? dst : TMP_REG2; + +#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) + PTR_FAIL_IF(push_inst_with_unique_literal(compiler, EMIT_DATA_TRANSFER(WORD_SIZE | LOAD_DATA, 1, dst_r, TMP_PC, 0), 0)); + compiler->patches++; +#else + PTR_FAIL_IF(emit_imm(compiler, dst_r, 0)); +#endif + + put_label = (struct sljit_put_label*)ensure_abuf(compiler, sizeof(struct sljit_put_label)); + PTR_FAIL_IF(!put_label); + set_put_label(put_label, compiler, 0); + + if (dst & SLJIT_MEM) + PTR_FAIL_IF(emit_op_mem(compiler, WORD_SIZE, TMP_REG2, dst, dstw, TMP_REG1)); + return put_label; +} + +SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset) +{ + inline_set_jump_addr(addr, executable_offset, new_target, 1); +} + +SLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_constant, sljit_sw executable_offset) +{ + inline_set_const(addr, executable_offset, new_constant, 1); +} diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeARM_64.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeARM_64.c new file mode 100755 index 000000000..e15b3451e --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeARM_64.c @@ -0,0 +1,2035 @@ +/* + * Stack-less Just-In-Time compiler + * + * Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +SLJIT_API_FUNC_ATTRIBUTE const char* sljit_get_platform_name(void) +{ + return "ARM-64" SLJIT_CPUINFO; +} + +/* Length of an instruction word */ +typedef sljit_u32 sljit_ins; + +#define TMP_ZERO (0) + +#define TMP_REG1 (SLJIT_NUMBER_OF_REGISTERS + 2) +#define TMP_REG2 (SLJIT_NUMBER_OF_REGISTERS + 3) +#define TMP_LR (SLJIT_NUMBER_OF_REGISTERS + 4) +#define TMP_FP (SLJIT_NUMBER_OF_REGISTERS + 5) + +#define TMP_FREG1 (SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1) +#define TMP_FREG2 (SLJIT_NUMBER_OF_FLOAT_REGISTERS + 2) + +/* r18 - platform register, currently not used */ +static const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 8] = { + 31, 0, 1, 2, 3, 4, 5, 6, 7, 11, 12, 13, 14, 15, 16, 17, 8, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 31, 9, 10, 30, 29 +}; + +static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 3] = { + 0, 0, 1, 2, 3, 4, 5, 6, 7 +}; + +#define W_OP (1u << 31) +#define RD(rd) (reg_map[rd]) +#define RT(rt) (reg_map[rt]) +#define RN(rn) (reg_map[rn] << 5) +#define RT2(rt2) (reg_map[rt2] << 10) +#define RM(rm) (reg_map[rm] << 16) +#define VD(vd) (freg_map[vd]) +#define VT(vt) (freg_map[vt]) +#define VN(vn) (freg_map[vn] << 5) +#define VM(vm) (freg_map[vm] << 16) + +/* --------------------------------------------------------------------- */ +/* Instrucion forms */ +/* --------------------------------------------------------------------- */ + +#define ADC 0x9a000000 +#define ADD 0x8b000000 +#define ADDE 0x8b200000 +#define ADDI 0x91000000 +#define AND 0x8a000000 +#define ANDI 0x92000000 +#define ASRV 0x9ac02800 +#define B 0x14000000 +#define B_CC 0x54000000 +#define BL 0x94000000 +#define BLR 0xd63f0000 +#define BR 0xd61f0000 +#define BRK 0xd4200000 +#define CBZ 0xb4000000 +#define CLZ 0xdac01000 +#define CSEL 0x9a800000 +#define CSINC 0x9a800400 +#define EOR 0xca000000 +#define EORI 0xd2000000 +#define FABS 0x1e60c000 +#define FADD 0x1e602800 +#define FCMP 0x1e602000 +#define FCVT 0x1e224000 +#define FCVTZS 0x9e780000 +#define FDIV 0x1e601800 +#define FMOV 0x1e604000 +#define FMUL 0x1e600800 +#define FNEG 0x1e614000 +#define FSUB 0x1e603800 +#define LDRI 0xf9400000 +#define LDP 0xa9400000 +#define LDP_PRE 0xa9c00000 +#define LDR_PRE 0xf8400c00 +#define LSLV 0x9ac02000 +#define LSRV 0x9ac02400 +#define MADD 0x9b000000 +#define MOVK 0xf2800000 +#define MOVN 0x92800000 +#define MOVZ 0xd2800000 +#define NOP 0xd503201f +#define ORN 0xaa200000 +#define ORR 0xaa000000 +#define ORRI 0xb2000000 +#define RET 0xd65f0000 +#define SBC 0xda000000 +#define SBFM 0x93000000 +#define SCVTF 0x9e620000 +#define SDIV 0x9ac00c00 +#define SMADDL 0x9b200000 +#define SMULH 0x9b403c00 +#define STP 0xa9000000 +#define STP_PRE 0xa9800000 +#define STRB 0x38206800 +#define STRBI 0x39000000 +#define STRI 0xf9000000 +#define STR_FI 0x3d000000 +#define STR_FR 0x3c206800 +#define STUR_FI 0x3c000000 +#define STURBI 0x38000000 +#define SUB 0xcb000000 +#define SUBI 0xd1000000 +#define SUBS 0xeb000000 +#define UBFM 0xd3000000 +#define UDIV 0x9ac00800 +#define UMULH 0x9bc03c00 + +/* dest_reg is the absolute name of the register + Useful for reordering instructions in the delay slot. */ +static sljit_s32 push_inst(struct sljit_compiler *compiler, sljit_ins ins) +{ + sljit_ins *ptr = (sljit_ins*)ensure_buf(compiler, sizeof(sljit_ins)); + FAIL_IF(!ptr); + *ptr = ins; + compiler->size++; + return SLJIT_SUCCESS; +} + +static SLJIT_INLINE sljit_s32 emit_imm64_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_uw imm) +{ + FAIL_IF(push_inst(compiler, MOVZ | RD(dst) | ((imm & 0xffff) << 5))); + FAIL_IF(push_inst(compiler, MOVK | RD(dst) | (((imm >> 16) & 0xffff) << 5) | (1 << 21))); + FAIL_IF(push_inst(compiler, MOVK | RD(dst) | (((imm >> 32) & 0xffff) << 5) | (2 << 21))); + return push_inst(compiler, MOVK | RD(dst) | ((imm >> 48) << 5) | (3 << 21)); +} + +static SLJIT_INLINE void modify_imm64_const(sljit_ins* inst, sljit_uw new_imm) +{ + sljit_s32 dst = inst[0] & 0x1f; + SLJIT_ASSERT((inst[0] & 0xffe00000) == MOVZ && (inst[1] & 0xffe00000) == (MOVK | (1 << 21))); + inst[0] = MOVZ | dst | ((new_imm & 0xffff) << 5); + inst[1] = MOVK | dst | (((new_imm >> 16) & 0xffff) << 5) | (1 << 21); + inst[2] = MOVK | dst | (((new_imm >> 32) & 0xffff) << 5) | (2 << 21); + inst[3] = MOVK | dst | ((new_imm >> 48) << 5) | (3 << 21); +} + +static SLJIT_INLINE sljit_sw detect_jump_type(struct sljit_jump *jump, sljit_ins *code_ptr, sljit_ins *code, sljit_sw executable_offset) +{ + sljit_sw diff; + sljit_uw target_addr; + + if (jump->flags & SLJIT_REWRITABLE_JUMP) { + jump->flags |= PATCH_ABS64; + return 0; + } + + if (jump->flags & JUMP_ADDR) + target_addr = jump->u.target; + else { + SLJIT_ASSERT(jump->flags & JUMP_LABEL); + target_addr = (sljit_uw)(code + jump->u.label->size) + (sljit_uw)executable_offset; + } + + diff = (sljit_sw)target_addr - (sljit_sw)(code_ptr + 4) - executable_offset; + + if (jump->flags & IS_COND) { + diff += sizeof(sljit_ins); + if (diff <= 0xfffff && diff >= -0x100000) { + code_ptr[-5] ^= (jump->flags & IS_CBZ) ? (0x1 << 24) : 0x1; + jump->addr -= sizeof(sljit_ins); + jump->flags |= PATCH_COND; + return 5; + } + diff -= sizeof(sljit_ins); + } + + if (diff <= 0x7ffffff && diff >= -0x8000000) { + jump->flags |= PATCH_B; + return 4; + } + + if (target_addr < 0x100000000l) { + if (jump->flags & IS_COND) + code_ptr[-5] -= (2 << 5); + code_ptr[-2] = code_ptr[0]; + return 2; + } + + if (target_addr < 0x1000000000000l) { + if (jump->flags & IS_COND) + code_ptr[-5] -= (1 << 5); + jump->flags |= PATCH_ABS48; + code_ptr[-1] = code_ptr[0]; + return 1; + } + + jump->flags |= PATCH_ABS64; + return 0; +} + +static SLJIT_INLINE sljit_sw put_label_get_length(struct sljit_put_label *put_label, sljit_uw max_label) +{ + if (max_label < 0x100000000l) { + put_label->flags = 0; + return 2; + } + + if (max_label < 0x1000000000000l) { + put_label->flags = 1; + return 1; + } + + put_label->flags = 2; + return 0; +} + +SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler) +{ + struct sljit_memory_fragment *buf; + sljit_ins *code; + sljit_ins *code_ptr; + sljit_ins *buf_ptr; + sljit_ins *buf_end; + sljit_uw word_count; + sljit_uw next_addr; + sljit_sw executable_offset; + sljit_uw addr; + sljit_s32 dst; + + struct sljit_label *label; + struct sljit_jump *jump; + struct sljit_const *const_; + struct sljit_put_label *put_label; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_generate_code(compiler)); + reverse_buf(compiler); + + code = (sljit_ins*)SLJIT_MALLOC_EXEC(compiler->size * sizeof(sljit_ins)); + PTR_FAIL_WITH_EXEC_IF(code); + buf = compiler->buf; + + code_ptr = code; + word_count = 0; + next_addr = 0; + executable_offset = SLJIT_EXEC_OFFSET(code); + + label = compiler->labels; + jump = compiler->jumps; + const_ = compiler->consts; + put_label = compiler->put_labels; + + do { + buf_ptr = (sljit_ins*)buf->memory; + buf_end = buf_ptr + (buf->used_size >> 2); + do { + *code_ptr = *buf_ptr++; + if (next_addr == word_count) { + SLJIT_ASSERT(!label || label->size >= word_count); + SLJIT_ASSERT(!jump || jump->addr >= word_count); + SLJIT_ASSERT(!const_ || const_->addr >= word_count); + SLJIT_ASSERT(!put_label || put_label->addr >= word_count); + + /* These structures are ordered by their address. */ + if (label && label->size == word_count) { + label->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); + label->size = code_ptr - code; + label = label->next; + } + if (jump && jump->addr == word_count) { + jump->addr = (sljit_uw)(code_ptr - 4); + code_ptr -= detect_jump_type(jump, code_ptr, code, executable_offset); + jump = jump->next; + } + if (const_ && const_->addr == word_count) { + const_->addr = (sljit_uw)code_ptr; + const_ = const_->next; + } + if (put_label && put_label->addr == word_count) { + SLJIT_ASSERT(put_label->label); + put_label->addr = (sljit_uw)(code_ptr - 3); + code_ptr -= put_label_get_length(put_label, (sljit_uw)(SLJIT_ADD_EXEC_OFFSET(code, executable_offset) + put_label->label->size)); + put_label = put_label->next; + } + next_addr = compute_next_addr(label, jump, const_, put_label); + } + code_ptr ++; + word_count ++; + } while (buf_ptr < buf_end); + + buf = buf->next; + } while (buf); + + if (label && label->size == word_count) { + label->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); + label->size = code_ptr - code; + label = label->next; + } + + SLJIT_ASSERT(!label); + SLJIT_ASSERT(!jump); + SLJIT_ASSERT(!const_); + SLJIT_ASSERT(!put_label); + SLJIT_ASSERT(code_ptr - code <= (sljit_sw)compiler->size); + + jump = compiler->jumps; + while (jump) { + do { + addr = (jump->flags & JUMP_LABEL) ? jump->u.label->addr : jump->u.target; + buf_ptr = (sljit_ins *)jump->addr; + + if (jump->flags & PATCH_B) { + addr = (sljit_sw)(addr - (sljit_uw)SLJIT_ADD_EXEC_OFFSET(buf_ptr, executable_offset)) >> 2; + SLJIT_ASSERT((sljit_sw)addr <= 0x1ffffff && (sljit_sw)addr >= -0x2000000); + buf_ptr[0] = ((jump->flags & IS_BL) ? BL : B) | (addr & 0x3ffffff); + if (jump->flags & IS_COND) + buf_ptr[-1] -= (4 << 5); + break; + } + if (jump->flags & PATCH_COND) { + addr = (sljit_sw)(addr - (sljit_uw)SLJIT_ADD_EXEC_OFFSET(buf_ptr, executable_offset)) >> 2; + SLJIT_ASSERT((sljit_sw)addr <= 0x3ffff && (sljit_sw)addr >= -0x40000); + buf_ptr[0] = (buf_ptr[0] & ~0xffffe0) | ((addr & 0x7ffff) << 5); + break; + } + + SLJIT_ASSERT((jump->flags & (PATCH_ABS48 | PATCH_ABS64)) || addr <= 0xffffffffl); + SLJIT_ASSERT((jump->flags & PATCH_ABS64) || addr <= 0xffffffffffffl); + + dst = buf_ptr[0] & 0x1f; + buf_ptr[0] = MOVZ | dst | ((addr & 0xffff) << 5); + buf_ptr[1] = MOVK | dst | (((addr >> 16) & 0xffff) << 5) | (1 << 21); + if (jump->flags & (PATCH_ABS48 | PATCH_ABS64)) + buf_ptr[2] = MOVK | dst | (((addr >> 32) & 0xffff) << 5) | (2 << 21); + if (jump->flags & PATCH_ABS64) + buf_ptr[3] = MOVK | dst | (((addr >> 48) & 0xffff) << 5) | (3 << 21); + } while (0); + jump = jump->next; + } + + put_label = compiler->put_labels; + while (put_label) { + addr = put_label->label->addr; + buf_ptr = (sljit_ins *)put_label->addr; + + buf_ptr[0] |= (addr & 0xffff) << 5; + buf_ptr[1] |= ((addr >> 16) & 0xffff) << 5; + + if (put_label->flags >= 1) + buf_ptr[2] |= ((addr >> 32) & 0xffff) << 5; + + if (put_label->flags >= 2) + buf_ptr[3] |= ((addr >> 48) & 0xffff) << 5; + + put_label = put_label->next; + } + + compiler->error = SLJIT_ERR_COMPILED; + compiler->executable_offset = executable_offset; + compiler->executable_size = (code_ptr - code) * sizeof(sljit_ins); + + code = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(code, executable_offset); + code_ptr = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); + + SLJIT_CACHE_FLUSH(code, code_ptr); + return code; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type) +{ + switch (feature_type) { + case SLJIT_HAS_FPU: +#ifdef SLJIT_IS_FPU_AVAILABLE + return SLJIT_IS_FPU_AVAILABLE; +#else + /* Available by default. */ + return 1; +#endif + + case SLJIT_HAS_CLZ: + case SLJIT_HAS_CMOV: + return 1; + + default: + return 0; + } +} + +/* --------------------------------------------------------------------- */ +/* Core code generator functions. */ +/* --------------------------------------------------------------------- */ + +#define COUNT_TRAILING_ZERO(value, result) \ + result = 0; \ + if (!(value & 0xffffffff)) { \ + result += 32; \ + value >>= 32; \ + } \ + if (!(value & 0xffff)) { \ + result += 16; \ + value >>= 16; \ + } \ + if (!(value & 0xff)) { \ + result += 8; \ + value >>= 8; \ + } \ + if (!(value & 0xf)) { \ + result += 4; \ + value >>= 4; \ + } \ + if (!(value & 0x3)) { \ + result += 2; \ + value >>= 2; \ + } \ + if (!(value & 0x1)) { \ + result += 1; \ + value >>= 1; \ + } + +#define LOGICAL_IMM_CHECK 0x100 + +static sljit_ins logical_imm(sljit_sw imm, sljit_s32 len) +{ + sljit_s32 negated, ones, right; + sljit_uw mask, uimm; + sljit_ins ins; + + if (len & LOGICAL_IMM_CHECK) { + len &= ~LOGICAL_IMM_CHECK; + if (len == 32 && (imm == 0 || imm == -1)) + return 0; + if (len == 16 && ((sljit_s32)imm == 0 || (sljit_s32)imm == -1)) + return 0; + } + + SLJIT_ASSERT((len == 32 && imm != 0 && imm != -1) + || (len == 16 && (sljit_s32)imm != 0 && (sljit_s32)imm != -1)); + + uimm = (sljit_uw)imm; + while (1) { + if (len <= 0) { + SLJIT_UNREACHABLE(); + return 0; + } + + mask = ((sljit_uw)1 << len) - 1; + if ((uimm & mask) != ((uimm >> len) & mask)) + break; + len >>= 1; + } + + len <<= 1; + + negated = 0; + if (uimm & 0x1) { + negated = 1; + uimm = ~uimm; + } + + if (len < 64) + uimm &= ((sljit_uw)1 << len) - 1; + + /* Unsigned right shift. */ + COUNT_TRAILING_ZERO(uimm, right); + + /* Signed shift. We also know that the highest bit is set. */ + imm = (sljit_sw)~uimm; + SLJIT_ASSERT(imm < 0); + + COUNT_TRAILING_ZERO(imm, ones); + + if (~imm) + return 0; + + if (len == 64) + ins = 1 << 22; + else + ins = (0x3f - ((len << 1) - 1)) << 10; + + if (negated) + return ins | ((len - ones - 1) << 10) | ((len - ones - right) << 16); + + return ins | ((ones - 1) << 10) | ((len - right) << 16); +} + +#undef COUNT_TRAILING_ZERO + +static sljit_s32 load_immediate(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw simm) +{ + sljit_uw imm = (sljit_uw)simm; + sljit_s32 i, zeros, ones, first; + sljit_ins bitmask; + + /* Handling simple immediates first. */ + if (imm <= 0xffff) + return push_inst(compiler, MOVZ | RD(dst) | (imm << 5)); + + if (simm < 0 && simm >= -0x10000) + return push_inst(compiler, MOVN | RD(dst) | ((~imm & 0xffff) << 5)); + + if (imm <= 0xffffffffl) { + if ((imm & 0xffff) == 0) + return push_inst(compiler, MOVZ | RD(dst) | ((imm >> 16) << 5) | (1 << 21)); + if ((imm & 0xffff0000l) == 0xffff0000) + return push_inst(compiler, (MOVN ^ W_OP) | RD(dst) | ((~imm & 0xffff) << 5)); + if ((imm & 0xffff) == 0xffff) + return push_inst(compiler, (MOVN ^ W_OP) | RD(dst) | ((~imm & 0xffff0000l) >> (16 - 5)) | (1 << 21)); + + bitmask = logical_imm(simm, 16); + if (bitmask != 0) + return push_inst(compiler, (ORRI ^ W_OP) | RD(dst) | RN(TMP_ZERO) | bitmask); + + FAIL_IF(push_inst(compiler, MOVZ | RD(dst) | ((imm & 0xffff) << 5))); + return push_inst(compiler, MOVK | RD(dst) | ((imm & 0xffff0000l) >> (16 - 5)) | (1 << 21)); + } + + bitmask = logical_imm(simm, 32); + if (bitmask != 0) + return push_inst(compiler, ORRI | RD(dst) | RN(TMP_ZERO) | bitmask); + + if (simm < 0 && simm >= -0x100000000l) { + if ((imm & 0xffff) == 0xffff) + return push_inst(compiler, MOVN | RD(dst) | ((~imm & 0xffff0000l) >> (16 - 5)) | (1 << 21)); + + FAIL_IF(push_inst(compiler, MOVN | RD(dst) | ((~imm & 0xffff) << 5))); + return push_inst(compiler, MOVK | RD(dst) | ((imm & 0xffff0000l) >> (16 - 5)) | (1 << 21)); + } + + /* A large amount of number can be constructed from ORR and MOVx, but computing them is costly. */ + + zeros = 0; + ones = 0; + for (i = 4; i > 0; i--) { + if ((simm & 0xffff) == 0) + zeros++; + if ((simm & 0xffff) == 0xffff) + ones++; + simm >>= 16; + } + + simm = (sljit_sw)imm; + first = 1; + if (ones > zeros) { + simm = ~simm; + for (i = 0; i < 4; i++) { + if (!(simm & 0xffff)) { + simm >>= 16; + continue; + } + if (first) { + first = 0; + FAIL_IF(push_inst(compiler, MOVN | RD(dst) | ((simm & 0xffff) << 5) | (i << 21))); + } + else + FAIL_IF(push_inst(compiler, MOVK | RD(dst) | ((~simm & 0xffff) << 5) | (i << 21))); + simm >>= 16; + } + return SLJIT_SUCCESS; + } + + for (i = 0; i < 4; i++) { + if (!(simm & 0xffff)) { + simm >>= 16; + continue; + } + if (first) { + first = 0; + FAIL_IF(push_inst(compiler, MOVZ | RD(dst) | ((simm & 0xffff) << 5) | (i << 21))); + } + else + FAIL_IF(push_inst(compiler, MOVK | RD(dst) | ((simm & 0xffff) << 5) | (i << 21))); + simm >>= 16; + } + return SLJIT_SUCCESS; +} + +#define ARG1_IMM 0x0010000 +#define ARG2_IMM 0x0020000 +#define INT_OP 0x0040000 +#define SET_FLAGS 0x0080000 +#define UNUSED_RETURN 0x0100000 + +#define CHECK_FLAGS(flag_bits) \ + if (flags & SET_FLAGS) { \ + inv_bits |= flag_bits; \ + if (flags & UNUSED_RETURN) \ + dst = TMP_ZERO; \ + } + +static sljit_s32 emit_op_imm(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 dst, sljit_sw arg1, sljit_sw arg2) +{ + /* dst must be register, TMP_REG1 + arg1 must be register, TMP_REG1, imm + arg2 must be register, TMP_REG2, imm */ + sljit_ins inv_bits = (flags & INT_OP) ? W_OP : 0; + sljit_ins inst_bits; + sljit_s32 op = (flags & 0xffff); + sljit_s32 reg; + sljit_sw imm, nimm; + + if (SLJIT_UNLIKELY((flags & (ARG1_IMM | ARG2_IMM)) == (ARG1_IMM | ARG2_IMM))) { + /* Both are immediates. */ + flags &= ~ARG1_IMM; + if (arg1 == 0 && op != SLJIT_ADD && op != SLJIT_SUB) + arg1 = TMP_ZERO; + else { + FAIL_IF(load_immediate(compiler, TMP_REG1, arg1)); + arg1 = TMP_REG1; + } + } + + if (flags & (ARG1_IMM | ARG2_IMM)) { + reg = (flags & ARG2_IMM) ? arg1 : arg2; + imm = (flags & ARG2_IMM) ? arg2 : arg1; + + switch (op) { + case SLJIT_MUL: + case SLJIT_NEG: + case SLJIT_CLZ: + case SLJIT_ADDC: + case SLJIT_SUBC: + /* No form with immediate operand (except imm 0, which + is represented by a ZERO register). */ + break; + case SLJIT_MOV: + SLJIT_ASSERT(!(flags & SET_FLAGS) && (flags & ARG2_IMM) && arg1 == TMP_REG1); + return load_immediate(compiler, dst, imm); + case SLJIT_NOT: + SLJIT_ASSERT(flags & ARG2_IMM); + FAIL_IF(load_immediate(compiler, dst, (flags & INT_OP) ? (~imm & 0xffffffff) : ~imm)); + goto set_flags; + case SLJIT_SUB: + if (flags & ARG1_IMM) + break; + imm = -imm; + /* Fall through. */ + case SLJIT_ADD: + if (imm == 0) { + CHECK_FLAGS(1 << 29); + return push_inst(compiler, ((op == SLJIT_ADD ? ADDI : SUBI) ^ inv_bits) | RD(dst) | RN(reg)); + } + if (imm > 0 && imm <= 0xfff) { + CHECK_FLAGS(1 << 29); + return push_inst(compiler, (ADDI ^ inv_bits) | RD(dst) | RN(reg) | (imm << 10)); + } + nimm = -imm; + if (nimm > 0 && nimm <= 0xfff) { + CHECK_FLAGS(1 << 29); + return push_inst(compiler, (SUBI ^ inv_bits) | RD(dst) | RN(reg) | (nimm << 10)); + } + if (imm > 0 && imm <= 0xffffff && !(imm & 0xfff)) { + CHECK_FLAGS(1 << 29); + return push_inst(compiler, (ADDI ^ inv_bits) | RD(dst) | RN(reg) | ((imm >> 12) << 10) | (1 << 22)); + } + if (nimm > 0 && nimm <= 0xffffff && !(nimm & 0xfff)) { + CHECK_FLAGS(1 << 29); + return push_inst(compiler, (SUBI ^ inv_bits) | RD(dst) | RN(reg) | ((nimm >> 12) << 10) | (1 << 22)); + } + if (imm > 0 && imm <= 0xffffff && !(flags & SET_FLAGS)) { + FAIL_IF(push_inst(compiler, (ADDI ^ inv_bits) | RD(dst) | RN(reg) | ((imm >> 12) << 10) | (1 << 22))); + return push_inst(compiler, (ADDI ^ inv_bits) | RD(dst) | RN(dst) | ((imm & 0xfff) << 10)); + } + if (nimm > 0 && nimm <= 0xffffff && !(flags & SET_FLAGS)) { + FAIL_IF(push_inst(compiler, (SUBI ^ inv_bits) | RD(dst) | RN(reg) | ((nimm >> 12) << 10) | (1 << 22))); + return push_inst(compiler, (SUBI ^ inv_bits) | RD(dst) | RN(dst) | ((nimm & 0xfff) << 10)); + } + break; + case SLJIT_AND: + inst_bits = logical_imm(imm, LOGICAL_IMM_CHECK | ((flags & INT_OP) ? 16 : 32)); + if (!inst_bits) + break; + CHECK_FLAGS(3 << 29); + return push_inst(compiler, (ANDI ^ inv_bits) | RD(dst) | RN(reg) | inst_bits); + case SLJIT_OR: + case SLJIT_XOR: + inst_bits = logical_imm(imm, LOGICAL_IMM_CHECK | ((flags & INT_OP) ? 16 : 32)); + if (!inst_bits) + break; + if (op == SLJIT_OR) + inst_bits |= ORRI; + else + inst_bits |= EORI; + FAIL_IF(push_inst(compiler, (inst_bits ^ inv_bits) | RD(dst) | RN(reg))); + goto set_flags; + case SLJIT_SHL: + if (flags & ARG1_IMM) + break; + if (flags & INT_OP) { + imm &= 0x1f; + FAIL_IF(push_inst(compiler, (UBFM ^ inv_bits) | RD(dst) | RN(arg1) | ((-imm & 0x1f) << 16) | ((31 - imm) << 10))); + } + else { + imm &= 0x3f; + FAIL_IF(push_inst(compiler, (UBFM ^ inv_bits) | RD(dst) | RN(arg1) | (1 << 22) | ((-imm & 0x3f) << 16) | ((63 - imm) << 10))); + } + goto set_flags; + case SLJIT_LSHR: + case SLJIT_ASHR: + if (flags & ARG1_IMM) + break; + if (op == SLJIT_ASHR) + inv_bits |= 1 << 30; + if (flags & INT_OP) { + imm &= 0x1f; + FAIL_IF(push_inst(compiler, (UBFM ^ inv_bits) | RD(dst) | RN(arg1) | (imm << 16) | (31 << 10))); + } + else { + imm &= 0x3f; + FAIL_IF(push_inst(compiler, (UBFM ^ inv_bits) | RD(dst) | RN(arg1) | (1 << 22) | (imm << 16) | (63 << 10))); + } + goto set_flags; + default: + SLJIT_UNREACHABLE(); + break; + } + + if (flags & ARG2_IMM) { + if (arg2 == 0) + arg2 = TMP_ZERO; + else { + FAIL_IF(load_immediate(compiler, TMP_REG2, arg2)); + arg2 = TMP_REG2; + } + } + else { + if (arg1 == 0) + arg1 = TMP_ZERO; + else { + FAIL_IF(load_immediate(compiler, TMP_REG1, arg1)); + arg1 = TMP_REG1; + } + } + } + + /* Both arguments are registers. */ + switch (op) { + case SLJIT_MOV: + case SLJIT_MOV_P: + SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1); + if (dst == arg2) + return SLJIT_SUCCESS; + return push_inst(compiler, ORR | RD(dst) | RN(TMP_ZERO) | RM(arg2)); + case SLJIT_MOV_U8: + SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1); + return push_inst(compiler, (UBFM ^ W_OP) | RD(dst) | RN(arg2) | (7 << 10)); + case SLJIT_MOV_S8: + SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1); + if (!(flags & INT_OP)) + inv_bits |= 1 << 22; + return push_inst(compiler, (SBFM ^ inv_bits) | RD(dst) | RN(arg2) | (7 << 10)); + case SLJIT_MOV_U16: + SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1); + return push_inst(compiler, (UBFM ^ W_OP) | RD(dst) | RN(arg2) | (15 << 10)); + case SLJIT_MOV_S16: + SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1); + if (!(flags & INT_OP)) + inv_bits |= 1 << 22; + return push_inst(compiler, (SBFM ^ inv_bits) | RD(dst) | RN(arg2) | (15 << 10)); + case SLJIT_MOV_U32: + SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1); + if ((flags & INT_OP) && dst == arg2) + return SLJIT_SUCCESS; + return push_inst(compiler, (ORR ^ W_OP) | RD(dst) | RN(TMP_ZERO) | RM(arg2)); + case SLJIT_MOV_S32: + SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1); + if ((flags & INT_OP) && dst == arg2) + return SLJIT_SUCCESS; + return push_inst(compiler, SBFM | (1 << 22) | RD(dst) | RN(arg2) | (31 << 10)); + case SLJIT_NOT: + SLJIT_ASSERT(arg1 == TMP_REG1); + FAIL_IF(push_inst(compiler, (ORN ^ inv_bits) | RD(dst) | RN(TMP_ZERO) | RM(arg2))); + break; /* Set flags. */ + case SLJIT_NEG: + SLJIT_ASSERT(arg1 == TMP_REG1); + if (flags & SET_FLAGS) + inv_bits |= 1 << 29; + return push_inst(compiler, (SUB ^ inv_bits) | RD(dst) | RN(TMP_ZERO) | RM(arg2)); + case SLJIT_CLZ: + SLJIT_ASSERT(arg1 == TMP_REG1); + return push_inst(compiler, (CLZ ^ inv_bits) | RD(dst) | RN(arg2)); + case SLJIT_ADD: + CHECK_FLAGS(1 << 29); + return push_inst(compiler, (ADD ^ inv_bits) | RD(dst) | RN(arg1) | RM(arg2)); + case SLJIT_ADDC: + CHECK_FLAGS(1 << 29); + return push_inst(compiler, (ADC ^ inv_bits) | RD(dst) | RN(arg1) | RM(arg2)); + case SLJIT_SUB: + CHECK_FLAGS(1 << 29); + return push_inst(compiler, (SUB ^ inv_bits) | RD(dst) | RN(arg1) | RM(arg2)); + case SLJIT_SUBC: + CHECK_FLAGS(1 << 29); + return push_inst(compiler, (SBC ^ inv_bits) | RD(dst) | RN(arg1) | RM(arg2)); + case SLJIT_MUL: + if (!(flags & SET_FLAGS)) + return push_inst(compiler, (MADD ^ inv_bits) | RD(dst) | RN(arg1) | RM(arg2) | RT2(TMP_ZERO)); + if (flags & INT_OP) { + FAIL_IF(push_inst(compiler, SMADDL | RD(dst) | RN(arg1) | RM(arg2) | (31 << 10))); + FAIL_IF(push_inst(compiler, ADD | RD(TMP_LR) | RN(TMP_ZERO) | RM(dst) | (2 << 22) | (31 << 10))); + return push_inst(compiler, SUBS | RD(TMP_ZERO) | RN(TMP_LR) | RM(dst) | (2 << 22) | (63 << 10)); + } + FAIL_IF(push_inst(compiler, SMULH | RD(TMP_LR) | RN(arg1) | RM(arg2))); + FAIL_IF(push_inst(compiler, MADD | RD(dst) | RN(arg1) | RM(arg2) | RT2(TMP_ZERO))); + return push_inst(compiler, SUBS | RD(TMP_ZERO) | RN(TMP_LR) | RM(dst) | (2 << 22) | (63 << 10)); + case SLJIT_AND: + CHECK_FLAGS(3 << 29); + return push_inst(compiler, (AND ^ inv_bits) | RD(dst) | RN(arg1) | RM(arg2)); + case SLJIT_OR: + FAIL_IF(push_inst(compiler, (ORR ^ inv_bits) | RD(dst) | RN(arg1) | RM(arg2))); + break; /* Set flags. */ + case SLJIT_XOR: + FAIL_IF(push_inst(compiler, (EOR ^ inv_bits) | RD(dst) | RN(arg1) | RM(arg2))); + break; /* Set flags. */ + case SLJIT_SHL: + FAIL_IF(push_inst(compiler, (LSLV ^ inv_bits) | RD(dst) | RN(arg1) | RM(arg2))); + break; /* Set flags. */ + case SLJIT_LSHR: + FAIL_IF(push_inst(compiler, (LSRV ^ inv_bits) | RD(dst) | RN(arg1) | RM(arg2))); + break; /* Set flags. */ + case SLJIT_ASHR: + FAIL_IF(push_inst(compiler, (ASRV ^ inv_bits) | RD(dst) | RN(arg1) | RM(arg2))); + break; /* Set flags. */ + default: + SLJIT_UNREACHABLE(); + return SLJIT_SUCCESS; + } + +set_flags: + if (flags & SET_FLAGS) + return push_inst(compiler, (SUBS ^ inv_bits) | RD(TMP_ZERO) | RN(dst) | RM(TMP_ZERO)); + return SLJIT_SUCCESS; +} + +#define STORE 0x10 +#define SIGNED 0x20 + +#define BYTE_SIZE 0x0 +#define HALF_SIZE 0x1 +#define INT_SIZE 0x2 +#define WORD_SIZE 0x3 + +#define MEM_SIZE_SHIFT(flags) ((flags) & 0x3) + +static sljit_s32 emit_op_mem(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg, + sljit_s32 arg, sljit_sw argw, sljit_s32 tmp_reg) +{ + sljit_u32 shift = MEM_SIZE_SHIFT(flags); + sljit_u32 type = (shift << 30); + + if (!(flags & STORE)) + type |= (flags & SIGNED) ? 0x00800000 : 0x00400000; + + SLJIT_ASSERT(arg & SLJIT_MEM); + + if (SLJIT_UNLIKELY(arg & OFFS_REG_MASK)) { + argw &= 0x3; + + if (argw == 0 || argw == shift) + return push_inst(compiler, STRB | type | RT(reg) + | RN(arg & REG_MASK) | RM(OFFS_REG(arg)) | (argw ? (1 << 12) : 0)); + + FAIL_IF(push_inst(compiler, ADD | RD(tmp_reg) | RN(arg & REG_MASK) | RM(OFFS_REG(arg)) | (argw << 10))); + return push_inst(compiler, STRBI | type | RT(reg) | RN(tmp_reg)); + } + + arg &= REG_MASK; + + if (arg == SLJIT_UNUSED) { + FAIL_IF(load_immediate(compiler, tmp_reg, argw & ~(0xfff << shift))); + + argw = (argw >> shift) & 0xfff; + + return push_inst(compiler, STRBI | type | RT(reg) | RN(tmp_reg) | (argw << 10)); + } + + if (argw >= 0 && (argw & ((1 << shift) - 1)) == 0) { + if ((argw >> shift) <= 0xfff) { + return push_inst(compiler, STRBI | type | RT(reg) | RN(arg) | (argw << (10 - shift))); + } + + if (argw <= 0xffffff) { + FAIL_IF(push_inst(compiler, ADDI | (1 << 22) | RD(tmp_reg) | RN(arg) | ((argw >> 12) << 10))); + + argw = ((argw & 0xfff) >> shift); + return push_inst(compiler, STRBI | type | RT(reg) | RN(tmp_reg) | (argw << 10)); + } + } + + if (argw <= 255 && argw >= -256) + return push_inst(compiler, STURBI | type | RT(reg) | RN(arg) | ((argw & 0x1ff) << 12)); + + FAIL_IF(load_immediate(compiler, tmp_reg, argw)); + + return push_inst(compiler, STRB | type | RT(reg) | RN(arg) | RM(tmp_reg)); +} + +/* --------------------------------------------------------------------- */ +/* Entry, exit */ +/* --------------------------------------------------------------------- */ + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compiler, + sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds, + sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size) +{ + sljit_s32 args, i, tmp, offs, prev, saved_regs_size; + + CHECK_ERROR(); + CHECK(check_sljit_emit_enter(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size)); + set_emit_enter(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size); + + saved_regs_size = GET_SAVED_REGISTERS_SIZE(scratches, saveds, 2); + if (saved_regs_size & 0x8) + saved_regs_size += sizeof(sljit_sw); + + local_size = (local_size + 15) & ~0xf; + compiler->local_size = local_size + saved_regs_size; + + FAIL_IF(push_inst(compiler, STP_PRE | RT(TMP_FP) | RT2(TMP_LR) + | RN(SLJIT_SP) | ((-(saved_regs_size >> 3) & 0x7f) << 15))); + +#ifdef _WIN32 + if (local_size >= 4096) + FAIL_IF(push_inst(compiler, SUBI | RD(TMP_REG1) | RN(SLJIT_SP) | (1 << 10) | (1 << 22))); + else if (local_size > 256) + FAIL_IF(push_inst(compiler, SUBI | RD(TMP_REG1) | RN(SLJIT_SP) | (local_size << 10))); +#endif + + tmp = saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? (SLJIT_S0 + 1 - saveds) : SLJIT_FIRST_SAVED_REG; + prev = -1; + offs = 2 << 15; + for (i = SLJIT_S0; i >= tmp; i--) { + if (prev == -1) { + prev = i; + continue; + } + FAIL_IF(push_inst(compiler, STP | RT(prev) | RT2(i) | RN(SLJIT_SP) | offs)); + offs += 2 << 15; + prev = -1; + } + + for (i = scratches; i >= SLJIT_FIRST_SAVED_REG; i--) { + if (prev == -1) { + prev = i; + continue; + } + FAIL_IF(push_inst(compiler, STP | RT(prev) | RT2(i) | RN(SLJIT_SP) | offs)); + offs += 2 << 15; + prev = -1; + } + + if (prev != -1) + FAIL_IF(push_inst(compiler, STRI | RT(prev) | RN(SLJIT_SP) | (offs >> 5))); + + + FAIL_IF(push_inst(compiler, ADDI | RD(TMP_FP) | RN(SLJIT_SP) | (0 << 10))); + + args = get_arg_count(arg_types); + + if (args >= 1) + FAIL_IF(push_inst(compiler, ORR | RD(SLJIT_S0) | RN(TMP_ZERO) | RM(SLJIT_R0))); + if (args >= 2) + FAIL_IF(push_inst(compiler, ORR | RD(SLJIT_S1) | RN(TMP_ZERO) | RM(SLJIT_R1))); + if (args >= 3) + FAIL_IF(push_inst(compiler, ORR | RD(SLJIT_S2) | RN(TMP_ZERO) | RM(SLJIT_R2))); + +#ifdef _WIN32 + if (local_size >= 4096) { + if (local_size < 4 * 4096) { + /* No need for a loop. */ + if (local_size >= 2 * 4096) { + FAIL_IF(push_inst(compiler, LDRI | RT(TMP_ZERO) | RN(TMP_REG1))); + FAIL_IF(push_inst(compiler, SUBI | RD(TMP_REG1) | RN(TMP_REG1) | (1 << 10) | (1 << 22))); + local_size -= 4096; + } + + if (local_size >= 2 * 4096) { + FAIL_IF(push_inst(compiler, LDRI | RT(TMP_ZERO) | RN(TMP_REG1))); + FAIL_IF(push_inst(compiler, SUBI | RD(TMP_REG1) | RN(TMP_REG1) | (1 << 10) | (1 << 22))); + local_size -= 4096; + } + + FAIL_IF(push_inst(compiler, LDRI | RT(TMP_ZERO) | RN(TMP_REG1))); + local_size -= 4096; + } + else { + FAIL_IF(push_inst(compiler, MOVZ | RD(TMP_REG2) | (((local_size >> 12) - 1) << 5))); + FAIL_IF(push_inst(compiler, LDRI | RT(TMP_ZERO) | RN(TMP_REG1))); + FAIL_IF(push_inst(compiler, SUBI | RD(TMP_REG1) | RN(TMP_REG1) | (1 << 10) | (1 << 22))); + FAIL_IF(push_inst(compiler, SUBI | (1 << 29) | RD(TMP_REG2) | RN(TMP_REG2) | (1 << 10))); + FAIL_IF(push_inst(compiler, B_CC | ((((sljit_ins) -3) & 0x7ffff) << 5) | 0x1 /* not-equal */)); + FAIL_IF(push_inst(compiler, LDRI | RT(TMP_ZERO) | RN(TMP_REG1))); + + local_size &= 0xfff; + } + + if (local_size > 256) { + FAIL_IF(push_inst(compiler, SUBI | RD(TMP_REG1) | RN(TMP_REG1) | (local_size << 10))); + FAIL_IF(push_inst(compiler, LDRI | RT(TMP_ZERO) | RN(TMP_REG1))); + } + else if (local_size > 0) + FAIL_IF(push_inst(compiler, LDR_PRE | RT(TMP_ZERO) | RN(TMP_REG1) | ((-local_size & 0x1ff) << 12))); + + FAIL_IF(push_inst(compiler, ADDI | RD(SLJIT_SP) | RN(TMP_REG1) | (0 << 10))); + } + else if (local_size > 256) { + FAIL_IF(push_inst(compiler, LDRI | RT(TMP_ZERO) | RN(TMP_REG1))); + FAIL_IF(push_inst(compiler, ADDI | RD(SLJIT_SP) | RN(TMP_REG1) | (0 << 10))); + } + else if (local_size > 0) + FAIL_IF(push_inst(compiler, LDR_PRE | RT(TMP_ZERO) | RN(SLJIT_SP) | ((-local_size & 0x1ff) << 12))); + +#else /* !_WIN32 */ + + /* The local_size does not include saved registers size. */ + if (local_size > 0xfff) { + FAIL_IF(push_inst(compiler, SUBI | RD(SLJIT_SP) | RN(SLJIT_SP) | ((local_size >> 12) << 10) | (1 << 22))); + local_size &= 0xfff; + } + if (local_size != 0) + FAIL_IF(push_inst(compiler, SUBI | RD(SLJIT_SP) | RN(SLJIT_SP) | (local_size << 10))); + +#endif /* _WIN32 */ + + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_set_context(struct sljit_compiler *compiler, + sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds, + sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size) +{ + sljit_s32 saved_regs_size; + + CHECK_ERROR(); + CHECK(check_sljit_set_context(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size)); + set_set_context(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size); + + saved_regs_size = GET_SAVED_REGISTERS_SIZE(scratches, saveds, 2); + if (saved_regs_size & 0x8) + saved_regs_size += sizeof(sljit_sw); + + compiler->local_size = saved_regs_size + ((local_size + 15) & ~0xf); + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw) +{ + sljit_s32 local_size; + sljit_s32 i, tmp, offs, prev, saved_regs_size; + + CHECK_ERROR(); + CHECK(check_sljit_emit_return(compiler, op, src, srcw)); + + FAIL_IF(emit_mov_before_return(compiler, op, src, srcw)); + + saved_regs_size = GET_SAVED_REGISTERS_SIZE(compiler->scratches, compiler->saveds, 2); + if (saved_regs_size & 0x8) + saved_regs_size += sizeof(sljit_sw); + + local_size = compiler->local_size - saved_regs_size; + + /* Load LR as early as possible. */ + if (local_size == 0) + FAIL_IF(push_inst(compiler, LDP | RT(TMP_FP) | RT2(TMP_LR) | RN(SLJIT_SP))); + else if (local_size < 63 * sizeof(sljit_sw)) { + FAIL_IF(push_inst(compiler, LDP_PRE | RT(TMP_FP) | RT2(TMP_LR) + | RN(SLJIT_SP) | (local_size << (15 - 3)))); + } + else { + if (local_size > 0xfff) { + FAIL_IF(push_inst(compiler, ADDI | RD(SLJIT_SP) | RN(SLJIT_SP) | ((local_size >> 12) << 10) | (1 << 22))); + local_size &= 0xfff; + } + if (local_size) + FAIL_IF(push_inst(compiler, ADDI | RD(SLJIT_SP) | RN(SLJIT_SP) | (local_size << 10))); + + FAIL_IF(push_inst(compiler, LDP | RT(TMP_FP) | RT2(TMP_LR) | RN(SLJIT_SP))); + } + + tmp = compiler->saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? (SLJIT_S0 + 1 - compiler->saveds) : SLJIT_FIRST_SAVED_REG; + prev = -1; + offs = 2 << 15; + for (i = SLJIT_S0; i >= tmp; i--) { + if (prev == -1) { + prev = i; + continue; + } + FAIL_IF(push_inst(compiler, LDP | RT(prev) | RT2(i) | RN(SLJIT_SP) | offs)); + offs += 2 << 15; + prev = -1; + } + + for (i = compiler->scratches; i >= SLJIT_FIRST_SAVED_REG; i--) { + if (prev == -1) { + prev = i; + continue; + } + FAIL_IF(push_inst(compiler, LDP | RT(prev) | RT2(i) | RN(SLJIT_SP) | offs)); + offs += 2 << 15; + prev = -1; + } + + if (prev != -1) + FAIL_IF(push_inst(compiler, LDRI | RT(prev) | RN(SLJIT_SP) | (offs >> 5))); + + /* These two can be executed in parallel. */ + FAIL_IF(push_inst(compiler, ADDI | RD(SLJIT_SP) | RN(SLJIT_SP) | (saved_regs_size << 10))); + return push_inst(compiler, RET | RN(TMP_LR)); +} + +/* --------------------------------------------------------------------- */ +/* Operators */ +/* --------------------------------------------------------------------- */ + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compiler, sljit_s32 op) +{ + sljit_ins inv_bits = (op & SLJIT_I32_OP) ? W_OP : 0; + + CHECK_ERROR(); + CHECK(check_sljit_emit_op0(compiler, op)); + + op = GET_OPCODE(op); + switch (op) { + case SLJIT_BREAKPOINT: + return push_inst(compiler, BRK); + case SLJIT_NOP: + return push_inst(compiler, NOP); + case SLJIT_LMUL_UW: + case SLJIT_LMUL_SW: + FAIL_IF(push_inst(compiler, ORR | RD(TMP_REG1) | RN(TMP_ZERO) | RM(SLJIT_R0))); + FAIL_IF(push_inst(compiler, MADD | RD(SLJIT_R0) | RN(SLJIT_R0) | RM(SLJIT_R1) | RT2(TMP_ZERO))); + return push_inst(compiler, (op == SLJIT_LMUL_UW ? UMULH : SMULH) | RD(SLJIT_R1) | RN(TMP_REG1) | RM(SLJIT_R1)); + case SLJIT_DIVMOD_UW: + case SLJIT_DIVMOD_SW: + FAIL_IF(push_inst(compiler, (ORR ^ inv_bits) | RD(TMP_REG1) | RN(TMP_ZERO) | RM(SLJIT_R0))); + FAIL_IF(push_inst(compiler, ((op == SLJIT_DIVMOD_UW ? UDIV : SDIV) ^ inv_bits) | RD(SLJIT_R0) | RN(SLJIT_R0) | RM(SLJIT_R1))); + FAIL_IF(push_inst(compiler, (MADD ^ inv_bits) | RD(SLJIT_R1) | RN(SLJIT_R0) | RM(SLJIT_R1) | RT2(TMP_ZERO))); + return push_inst(compiler, (SUB ^ inv_bits) | RD(SLJIT_R1) | RN(TMP_REG1) | RM(SLJIT_R1)); + case SLJIT_DIV_UW: + case SLJIT_DIV_SW: + return push_inst(compiler, ((op == SLJIT_DIV_UW ? UDIV : SDIV) ^ inv_bits) | RD(SLJIT_R0) | RN(SLJIT_R0) | RM(SLJIT_R1)); + } + + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + sljit_s32 dst_r, flags, mem_flags; + sljit_s32 op_flags = GET_ALL_FLAGS(op); + + CHECK_ERROR(); + CHECK(check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw)); + ADJUST_LOCAL_OFFSET(dst, dstw); + ADJUST_LOCAL_OFFSET(src, srcw); + + if (dst == SLJIT_UNUSED && !HAS_FLAGS(op)) { + if (op <= SLJIT_MOV_P && (src & SLJIT_MEM)) { + SLJIT_ASSERT(reg_map[1] == 0 && reg_map[3] == 2 && reg_map[5] == 4); + + if (op >= SLJIT_MOV_U8 && op <= SLJIT_MOV_S8) + dst = 5; + else if (op >= SLJIT_MOV_U16 && op <= SLJIT_MOV_S16) + dst = 3; + else + dst = 1; + + /* Signed word sized load is the prefetch instruction. */ + return emit_op_mem(compiler, WORD_SIZE | SIGNED, dst, src, srcw, TMP_REG1); + } + return SLJIT_SUCCESS; + } + + dst_r = SLOW_IS_REG(dst) ? dst : TMP_REG1; + + op = GET_OPCODE(op); + if (op >= SLJIT_MOV && op <= SLJIT_MOV_P) { + /* Both operands are registers. */ + if (dst_r != TMP_REG1 && FAST_IS_REG(src)) + return emit_op_imm(compiler, op | ((op_flags & SLJIT_I32_OP) ? INT_OP : 0), dst_r, TMP_REG1, src); + + switch (op) { + case SLJIT_MOV: + case SLJIT_MOV_P: + mem_flags = WORD_SIZE; + break; + case SLJIT_MOV_U8: + mem_flags = BYTE_SIZE; + if (src & SLJIT_IMM) + srcw = (sljit_u8)srcw; + break; + case SLJIT_MOV_S8: + mem_flags = BYTE_SIZE | SIGNED; + if (src & SLJIT_IMM) + srcw = (sljit_s8)srcw; + break; + case SLJIT_MOV_U16: + mem_flags = HALF_SIZE; + if (src & SLJIT_IMM) + srcw = (sljit_u16)srcw; + break; + case SLJIT_MOV_S16: + mem_flags = HALF_SIZE | SIGNED; + if (src & SLJIT_IMM) + srcw = (sljit_s16)srcw; + break; + case SLJIT_MOV_U32: + mem_flags = INT_SIZE; + if (src & SLJIT_IMM) + srcw = (sljit_u32)srcw; + break; + case SLJIT_MOV_S32: + mem_flags = INT_SIZE | SIGNED; + if (src & SLJIT_IMM) + srcw = (sljit_s32)srcw; + break; + default: + SLJIT_UNREACHABLE(); + mem_flags = 0; + break; + } + + if (src & SLJIT_IMM) + FAIL_IF(emit_op_imm(compiler, SLJIT_MOV | ARG2_IMM, dst_r, TMP_REG1, srcw)); + else if (!(src & SLJIT_MEM)) + dst_r = src; + else + FAIL_IF(emit_op_mem(compiler, mem_flags, dst_r, src, srcw, TMP_REG1)); + + if (dst & SLJIT_MEM) + return emit_op_mem(compiler, mem_flags | STORE, dst_r, dst, dstw, TMP_REG2); + return SLJIT_SUCCESS; + } + + flags = HAS_FLAGS(op_flags) ? SET_FLAGS : 0; + mem_flags = WORD_SIZE; + + if (op_flags & SLJIT_I32_OP) { + flags |= INT_OP; + mem_flags = INT_SIZE; + } + + if (dst == SLJIT_UNUSED) + flags |= UNUSED_RETURN; + + if (src & SLJIT_MEM) { + FAIL_IF(emit_op_mem(compiler, mem_flags, TMP_REG2, src, srcw, TMP_REG2)); + src = TMP_REG2; + } + + emit_op_imm(compiler, flags | op, dst_r, TMP_REG1, src); + + if (SLJIT_UNLIKELY(dst & SLJIT_MEM)) + return emit_op_mem(compiler, mem_flags | STORE, dst_r, dst, dstw, TMP_REG2); + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + sljit_s32 dst_r, flags, mem_flags; + + CHECK_ERROR(); + CHECK(check_sljit_emit_op2(compiler, op, dst, dstw, src1, src1w, src2, src2w)); + ADJUST_LOCAL_OFFSET(dst, dstw); + ADJUST_LOCAL_OFFSET(src1, src1w); + ADJUST_LOCAL_OFFSET(src2, src2w); + + if (dst == SLJIT_UNUSED && !HAS_FLAGS(op)) + return SLJIT_SUCCESS; + + dst_r = SLOW_IS_REG(dst) ? dst : TMP_REG1; + flags = HAS_FLAGS(op) ? SET_FLAGS : 0; + mem_flags = WORD_SIZE; + + if (op & SLJIT_I32_OP) { + flags |= INT_OP; + mem_flags = INT_SIZE; + } + + if (dst == SLJIT_UNUSED) + flags |= UNUSED_RETURN; + + if (src1 & SLJIT_MEM) { + FAIL_IF(emit_op_mem(compiler, mem_flags, TMP_REG1, src1, src1w, TMP_REG1)); + src1 = TMP_REG1; + } + + if (src2 & SLJIT_MEM) { + FAIL_IF(emit_op_mem(compiler, mem_flags, TMP_REG2, src2, src2w, TMP_REG2)); + src2 = TMP_REG2; + } + + if (src1 & SLJIT_IMM) + flags |= ARG1_IMM; + else + src1w = src1; + + if (src2 & SLJIT_IMM) + flags |= ARG2_IMM; + else + src2w = src2; + + emit_op_imm(compiler, flags | GET_OPCODE(op), dst_r, src1w, src2w); + + if (dst & SLJIT_MEM) + return emit_op_mem(compiler, mem_flags | STORE, dst_r, dst, dstw, TMP_REG2); + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg) +{ + CHECK_REG_INDEX(check_sljit_get_register_index(reg)); + return reg_map[reg]; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_float_register_index(sljit_s32 reg) +{ + CHECK_REG_INDEX(check_sljit_get_float_register_index(reg)); + return freg_map[reg]; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler, + void *instruction, sljit_s32 size) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_op_custom(compiler, instruction, size)); + + return push_inst(compiler, *(sljit_ins*)instruction); +} + +/* --------------------------------------------------------------------- */ +/* Floating point operators */ +/* --------------------------------------------------------------------- */ + +static sljit_s32 emit_fop_mem(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg, sljit_s32 arg, sljit_sw argw) +{ + sljit_u32 shift = MEM_SIZE_SHIFT(flags); + sljit_ins type = (shift << 30); + + SLJIT_ASSERT(arg & SLJIT_MEM); + + if (!(flags & STORE)) + type |= 0x00400000; + + if (arg & OFFS_REG_MASK) { + argw &= 3; + if (argw == 0 || argw == shift) + return push_inst(compiler, STR_FR | type | VT(reg) + | RN(arg & REG_MASK) | RM(OFFS_REG(arg)) | (argw ? (1 << 12) : 0)); + + FAIL_IF(push_inst(compiler, ADD | RD(TMP_REG1) | RN(arg & REG_MASK) | RM(OFFS_REG(arg)) | (argw << 10))); + return push_inst(compiler, STR_FI | type | VT(reg) | RN(TMP_REG1)); + } + + arg &= REG_MASK; + + if (arg == SLJIT_UNUSED) { + FAIL_IF(load_immediate(compiler, TMP_REG1, argw & ~(0xfff << shift))); + + argw = (argw >> shift) & 0xfff; + + return push_inst(compiler, STR_FI | type | VT(reg) | RN(TMP_REG1) | (argw << 10)); + } + + if (argw >= 0 && (argw & ((1 << shift) - 1)) == 0) { + if ((argw >> shift) <= 0xfff) + return push_inst(compiler, STR_FI | type | VT(reg) | RN(arg) | (argw << (10 - shift))); + + if (argw <= 0xffffff) { + FAIL_IF(push_inst(compiler, ADDI | (1 << 22) | RD(TMP_REG1) | RN(arg) | ((argw >> 12) << 10))); + + argw = ((argw & 0xfff) >> shift); + return push_inst(compiler, STR_FI | type | VT(reg) | RN(TMP_REG1) | (argw << 10)); + } + } + + if (argw <= 255 && argw >= -256) + return push_inst(compiler, STUR_FI | type | VT(reg) | RN(arg) | ((argw & 0x1ff) << 12)); + + FAIL_IF(load_immediate(compiler, TMP_REG1, argw)); + return push_inst(compiler, STR_FR | type | VT(reg) | RN(arg) | RM(TMP_REG1)); +} + +static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_sw_from_f64(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1; + sljit_ins inv_bits = (op & SLJIT_F32_OP) ? (1 << 22) : 0; + + if (GET_OPCODE(op) == SLJIT_CONV_S32_FROM_F64) + inv_bits |= W_OP; + + if (src & SLJIT_MEM) { + emit_fop_mem(compiler, (op & SLJIT_F32_OP) ? INT_SIZE : WORD_SIZE, TMP_FREG1, src, srcw); + src = TMP_FREG1; + } + + FAIL_IF(push_inst(compiler, (FCVTZS ^ inv_bits) | RD(dst_r) | VN(src))); + + if (dst & SLJIT_MEM) + return emit_op_mem(compiler, ((GET_OPCODE(op) == SLJIT_CONV_S32_FROM_F64) ? INT_SIZE : WORD_SIZE) | STORE, TMP_REG1, dst, dstw, TMP_REG2); + return SLJIT_SUCCESS; +} + +static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1; + sljit_ins inv_bits = (op & SLJIT_F32_OP) ? (1 << 22) : 0; + + if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32) + inv_bits |= W_OP; + + if (src & SLJIT_MEM) { + emit_op_mem(compiler, ((GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32) ? INT_SIZE : WORD_SIZE), TMP_REG1, src, srcw, TMP_REG1); + src = TMP_REG1; + } else if (src & SLJIT_IMM) { +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32) + srcw = (sljit_s32)srcw; +#endif + FAIL_IF(load_immediate(compiler, TMP_REG1, srcw)); + src = TMP_REG1; + } + + FAIL_IF(push_inst(compiler, (SCVTF ^ inv_bits) | VD(dst_r) | RN(src))); + + if (dst & SLJIT_MEM) + return emit_fop_mem(compiler, ((op & SLJIT_F32_OP) ? INT_SIZE : WORD_SIZE) | STORE, TMP_FREG1, dst, dstw); + return SLJIT_SUCCESS; +} + +static SLJIT_INLINE sljit_s32 sljit_emit_fop1_cmp(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + sljit_s32 mem_flags = (op & SLJIT_F32_OP) ? INT_SIZE : WORD_SIZE; + sljit_ins inv_bits = (op & SLJIT_F32_OP) ? (1 << 22) : 0; + + if (src1 & SLJIT_MEM) { + emit_fop_mem(compiler, mem_flags, TMP_FREG1, src1, src1w); + src1 = TMP_FREG1; + } + + if (src2 & SLJIT_MEM) { + emit_fop_mem(compiler, mem_flags, TMP_FREG2, src2, src2w); + src2 = TMP_FREG2; + } + + return push_inst(compiler, (FCMP ^ inv_bits) | VN(src1) | VM(src2)); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + sljit_s32 dst_r, mem_flags = (op & SLJIT_F32_OP) ? INT_SIZE : WORD_SIZE; + sljit_ins inv_bits; + + CHECK_ERROR(); + + SLJIT_COMPILE_ASSERT((INT_SIZE ^ 0x1) == WORD_SIZE, must_be_one_bit_difference); + SELECT_FOP1_OPERATION_WITH_CHECKS(compiler, op, dst, dstw, src, srcw); + + inv_bits = (op & SLJIT_F32_OP) ? (1 << 22) : 0; + dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1; + + if (src & SLJIT_MEM) { + emit_fop_mem(compiler, (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_F32) ? (mem_flags ^ 0x1) : mem_flags, dst_r, src, srcw); + src = dst_r; + } + + switch (GET_OPCODE(op)) { + case SLJIT_MOV_F64: + if (src != dst_r) { + if (dst_r != TMP_FREG1) + FAIL_IF(push_inst(compiler, (FMOV ^ inv_bits) | VD(dst_r) | VN(src))); + else + dst_r = src; + } + break; + case SLJIT_NEG_F64: + FAIL_IF(push_inst(compiler, (FNEG ^ inv_bits) | VD(dst_r) | VN(src))); + break; + case SLJIT_ABS_F64: + FAIL_IF(push_inst(compiler, (FABS ^ inv_bits) | VD(dst_r) | VN(src))); + break; + case SLJIT_CONV_F64_FROM_F32: + FAIL_IF(push_inst(compiler, FCVT | ((op & SLJIT_F32_OP) ? (1 << 22) : (1 << 15)) | VD(dst_r) | VN(src))); + break; + } + + if (dst & SLJIT_MEM) + return emit_fop_mem(compiler, mem_flags | STORE, dst_r, dst, dstw); + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + sljit_s32 dst_r, mem_flags = (op & SLJIT_F32_OP) ? INT_SIZE : WORD_SIZE; + sljit_ins inv_bits = (op & SLJIT_F32_OP) ? (1 << 22) : 0; + + CHECK_ERROR(); + CHECK(check_sljit_emit_fop2(compiler, op, dst, dstw, src1, src1w, src2, src2w)); + ADJUST_LOCAL_OFFSET(dst, dstw); + ADJUST_LOCAL_OFFSET(src1, src1w); + ADJUST_LOCAL_OFFSET(src2, src2w); + + dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1; + if (src1 & SLJIT_MEM) { + emit_fop_mem(compiler, mem_flags, TMP_FREG1, src1, src1w); + src1 = TMP_FREG1; + } + if (src2 & SLJIT_MEM) { + emit_fop_mem(compiler, mem_flags, TMP_FREG2, src2, src2w); + src2 = TMP_FREG2; + } + + switch (GET_OPCODE(op)) { + case SLJIT_ADD_F64: + FAIL_IF(push_inst(compiler, (FADD ^ inv_bits) | VD(dst_r) | VN(src1) | VM(src2))); + break; + case SLJIT_SUB_F64: + FAIL_IF(push_inst(compiler, (FSUB ^ inv_bits) | VD(dst_r) | VN(src1) | VM(src2))); + break; + case SLJIT_MUL_F64: + FAIL_IF(push_inst(compiler, (FMUL ^ inv_bits) | VD(dst_r) | VN(src1) | VM(src2))); + break; + case SLJIT_DIV_F64: + FAIL_IF(push_inst(compiler, (FDIV ^ inv_bits) | VD(dst_r) | VN(src1) | VM(src2))); + break; + } + + if (!(dst & SLJIT_MEM)) + return SLJIT_SUCCESS; + return emit_fop_mem(compiler, mem_flags | STORE, TMP_FREG1, dst, dstw); +} + +/* --------------------------------------------------------------------- */ +/* Other instructions */ +/* --------------------------------------------------------------------- */ + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_fast_enter(compiler, dst, dstw)); + ADJUST_LOCAL_OFFSET(dst, dstw); + + if (FAST_IS_REG(dst)) + return push_inst(compiler, ORR | RD(dst) | RN(TMP_ZERO) | RM(TMP_LR)); + + /* Memory. */ + return emit_op_mem(compiler, WORD_SIZE | STORE, TMP_LR, dst, dstw, TMP_REG1); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_fast_return(compiler, src, srcw)); + ADJUST_LOCAL_OFFSET(src, srcw); + + if (FAST_IS_REG(src)) + FAIL_IF(push_inst(compiler, ORR | RD(TMP_LR) | RN(TMP_ZERO) | RM(src))); + else + FAIL_IF(emit_op_mem(compiler, WORD_SIZE, TMP_LR, src, srcw, TMP_REG1)); + + return push_inst(compiler, RET | RN(TMP_LR)); +} + +/* --------------------------------------------------------------------- */ +/* Conditional instructions */ +/* --------------------------------------------------------------------- */ + +static sljit_uw get_cc(sljit_s32 type) +{ + switch (type) { + case SLJIT_EQUAL: + case SLJIT_MUL_NOT_OVERFLOW: + case SLJIT_EQUAL_F64: + return 0x1; + + case SLJIT_NOT_EQUAL: + case SLJIT_MUL_OVERFLOW: + case SLJIT_NOT_EQUAL_F64: + return 0x0; + + case SLJIT_LESS: + case SLJIT_LESS_F64: + return 0x2; + + case SLJIT_GREATER_EQUAL: + case SLJIT_GREATER_EQUAL_F64: + return 0x3; + + case SLJIT_GREATER: + case SLJIT_GREATER_F64: + return 0x9; + + case SLJIT_LESS_EQUAL: + case SLJIT_LESS_EQUAL_F64: + return 0x8; + + case SLJIT_SIG_LESS: + return 0xa; + + case SLJIT_SIG_GREATER_EQUAL: + return 0xb; + + case SLJIT_SIG_GREATER: + return 0xd; + + case SLJIT_SIG_LESS_EQUAL: + return 0xc; + + case SLJIT_OVERFLOW: + case SLJIT_UNORDERED_F64: + return 0x7; + + case SLJIT_NOT_OVERFLOW: + case SLJIT_ORDERED_F64: + return 0x6; + + default: + SLJIT_UNREACHABLE(); + return 0xe; + } +} + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compiler *compiler) +{ + struct sljit_label *label; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_label(compiler)); + + if (compiler->last_label && compiler->last_label->size == compiler->size) + return compiler->last_label; + + label = (struct sljit_label*)ensure_abuf(compiler, sizeof(struct sljit_label)); + PTR_FAIL_IF(!label); + set_label(label, compiler); + return label; +} + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, sljit_s32 type) +{ + struct sljit_jump *jump; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_jump(compiler, type)); + + jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump)); + PTR_FAIL_IF(!jump); + set_jump(jump, compiler, type & SLJIT_REWRITABLE_JUMP); + type &= 0xff; + + if (type < SLJIT_JUMP) { + jump->flags |= IS_COND; + PTR_FAIL_IF(push_inst(compiler, B_CC | (6 << 5) | get_cc(type))); + } + else if (type >= SLJIT_FAST_CALL) + jump->flags |= IS_BL; + + PTR_FAIL_IF(emit_imm64_const(compiler, TMP_REG1, 0)); + jump->addr = compiler->size; + PTR_FAIL_IF(push_inst(compiler, ((type >= SLJIT_FAST_CALL) ? BLR : BR) | RN(TMP_REG1))); + + return jump; +} + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_call(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 arg_types) +{ + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_call(compiler, type, arg_types)); + +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \ + || (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + compiler->skip_checks = 1; +#endif + + return sljit_emit_jump(compiler, type); +} + +static SLJIT_INLINE struct sljit_jump* emit_cmp_to0(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 src, sljit_sw srcw) +{ + struct sljit_jump *jump; + sljit_ins inv_bits = (type & SLJIT_I32_OP) ? W_OP : 0; + + SLJIT_ASSERT((type & 0xff) == SLJIT_EQUAL || (type & 0xff) == SLJIT_NOT_EQUAL); + ADJUST_LOCAL_OFFSET(src, srcw); + + jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump)); + PTR_FAIL_IF(!jump); + set_jump(jump, compiler, type & SLJIT_REWRITABLE_JUMP); + jump->flags |= IS_CBZ | IS_COND; + + if (src & SLJIT_MEM) { + PTR_FAIL_IF(emit_op_mem(compiler, inv_bits ? INT_SIZE : WORD_SIZE, TMP_REG1, src, srcw, TMP_REG1)); + src = TMP_REG1; + } + else if (src & SLJIT_IMM) { + PTR_FAIL_IF(load_immediate(compiler, TMP_REG1, srcw)); + src = TMP_REG1; + } + + SLJIT_ASSERT(FAST_IS_REG(src)); + + if ((type & 0xff) == SLJIT_EQUAL) + inv_bits |= 1 << 24; + + PTR_FAIL_IF(push_inst(compiler, (CBZ ^ inv_bits) | (6 << 5) | RT(src))); + PTR_FAIL_IF(emit_imm64_const(compiler, TMP_REG1, 0)); + jump->addr = compiler->size; + PTR_FAIL_IF(push_inst(compiler, BR | RN(TMP_REG1))); + return jump; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 src, sljit_sw srcw) +{ + struct sljit_jump *jump; + + CHECK_ERROR(); + CHECK(check_sljit_emit_ijump(compiler, type, src, srcw)); + ADJUST_LOCAL_OFFSET(src, srcw); + + if (!(src & SLJIT_IMM)) { + if (src & SLJIT_MEM) { + FAIL_IF(emit_op_mem(compiler, WORD_SIZE, TMP_REG1, src, srcw, TMP_REG1)); + src = TMP_REG1; + } + return push_inst(compiler, ((type >= SLJIT_FAST_CALL) ? BLR : BR) | RN(src)); + } + + /* These jumps are converted to jump/call instructions when possible. */ + jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump)); + FAIL_IF(!jump); + set_jump(jump, compiler, JUMP_ADDR | ((type >= SLJIT_FAST_CALL) ? IS_BL : 0)); + jump->u.target = srcw; + + FAIL_IF(emit_imm64_const(compiler, TMP_REG1, 0)); + jump->addr = compiler->size; + return push_inst(compiler, ((type >= SLJIT_FAST_CALL) ? BLR : BR) | RN(TMP_REG1)); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_icall(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 arg_types, + sljit_s32 src, sljit_sw srcw) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_icall(compiler, type, arg_types, src, srcw)); + +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \ + || (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + compiler->skip_checks = 1; +#endif + + return sljit_emit_ijump(compiler, type, src, srcw); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 type) +{ + sljit_s32 dst_r, src_r, flags, mem_flags; + sljit_ins cc; + + CHECK_ERROR(); + CHECK(check_sljit_emit_op_flags(compiler, op, dst, dstw, type)); + ADJUST_LOCAL_OFFSET(dst, dstw); + + cc = get_cc(type & 0xff); + dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1; + + if (GET_OPCODE(op) < SLJIT_ADD) { + FAIL_IF(push_inst(compiler, CSINC | (cc << 12) | RD(dst_r) | RN(TMP_ZERO) | RM(TMP_ZERO))); + + if (dst_r == TMP_REG1) { + mem_flags = (GET_OPCODE(op) == SLJIT_MOV ? WORD_SIZE : INT_SIZE) | STORE; + return emit_op_mem(compiler, mem_flags, TMP_REG1, dst, dstw, TMP_REG2); + } + + return SLJIT_SUCCESS; + } + + flags = HAS_FLAGS(op) ? SET_FLAGS : 0; + mem_flags = WORD_SIZE; + + if (op & SLJIT_I32_OP) { + flags |= INT_OP; + mem_flags = INT_SIZE; + } + + src_r = dst; + + if (dst & SLJIT_MEM) { + FAIL_IF(emit_op_mem(compiler, mem_flags, TMP_REG1, dst, dstw, TMP_REG1)); + src_r = TMP_REG1; + } + + FAIL_IF(push_inst(compiler, CSINC | (cc << 12) | RD(TMP_REG2) | RN(TMP_ZERO) | RM(TMP_ZERO))); + emit_op_imm(compiler, flags | GET_OPCODE(op), dst_r, src_r, TMP_REG2); + + if (dst & SLJIT_MEM) + return emit_op_mem(compiler, mem_flags | STORE, TMP_REG1, dst, dstw, TMP_REG2); + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 dst_reg, + sljit_s32 src, sljit_sw srcw) +{ + sljit_ins inv_bits = (dst_reg & SLJIT_I32_OP) ? W_OP : 0; + sljit_ins cc; + + CHECK_ERROR(); + CHECK(check_sljit_emit_cmov(compiler, type, dst_reg, src, srcw)); + + if (SLJIT_UNLIKELY(src & SLJIT_IMM)) { + if (dst_reg & SLJIT_I32_OP) + srcw = (sljit_s32)srcw; + FAIL_IF(load_immediate(compiler, TMP_REG1, srcw)); + src = TMP_REG1; + srcw = 0; + } + + cc = get_cc(type & 0xff); + dst_reg &= ~SLJIT_I32_OP; + + return push_inst(compiler, (CSEL ^ inv_bits) | (cc << 12) | RD(dst_reg) | RN(dst_reg) | RM(src)); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 reg, + sljit_s32 mem, sljit_sw memw) +{ + sljit_u32 sign = 0, inst; + + CHECK_ERROR(); + CHECK(check_sljit_emit_mem(compiler, type, reg, mem, memw)); + + if ((mem & OFFS_REG_MASK) || (memw > 255 && memw < -256)) + return SLJIT_ERR_UNSUPPORTED; + + if (type & SLJIT_MEM_SUPP) + return SLJIT_SUCCESS; + + switch (type & 0xff) { + case SLJIT_MOV: + case SLJIT_MOV_P: + inst = STURBI | (MEM_SIZE_SHIFT(WORD_SIZE) << 30) | 0x400; + break; + case SLJIT_MOV_S8: + sign = 1; + case SLJIT_MOV_U8: + inst = STURBI | (MEM_SIZE_SHIFT(BYTE_SIZE) << 30) | 0x400; + break; + case SLJIT_MOV_S16: + sign = 1; + case SLJIT_MOV_U16: + inst = STURBI | (MEM_SIZE_SHIFT(HALF_SIZE) << 30) | 0x400; + break; + case SLJIT_MOV_S32: + sign = 1; + case SLJIT_MOV_U32: + inst = STURBI | (MEM_SIZE_SHIFT(INT_SIZE) << 30) | 0x400; + break; + default: + SLJIT_UNREACHABLE(); + inst = STURBI | (MEM_SIZE_SHIFT(WORD_SIZE) << 30) | 0x400; + break; + } + + if (!(type & SLJIT_MEM_STORE)) + inst |= sign ? 0x00800000 : 0x00400000; + + if (type & SLJIT_MEM_PRE) + inst |= 0x800; + + return push_inst(compiler, inst | RT(reg) | RN(mem & REG_MASK) | ((memw & 0x1ff) << 12)); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fmem(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, + sljit_s32 mem, sljit_sw memw) +{ + sljit_u32 inst; + + CHECK_ERROR(); + CHECK(check_sljit_emit_fmem(compiler, type, freg, mem, memw)); + + if ((mem & OFFS_REG_MASK) || (memw > 255 && memw < -256)) + return SLJIT_ERR_UNSUPPORTED; + + if (type & SLJIT_MEM_SUPP) + return SLJIT_SUCCESS; + + inst = STUR_FI | 0x80000400; + + if (!(type & SLJIT_F32_OP)) + inst |= 0x40000000; + + if (!(type & SLJIT_MEM_STORE)) + inst |= 0x00400000; + + if (type & SLJIT_MEM_PRE) + inst |= 0x800; + + return push_inst(compiler, inst | VT(freg) | RN(mem & REG_MASK) | ((memw & 0x1ff) << 12)); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_local_base(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw offset) +{ + sljit_s32 dst_reg; + sljit_ins ins; + + CHECK_ERROR(); + CHECK(check_sljit_get_local_base(compiler, dst, dstw, offset)); + + SLJIT_ASSERT (SLJIT_LOCALS_OFFSET_BASE == 0); + + dst_reg = FAST_IS_REG(dst) ? dst : TMP_REG1; + + if (offset <= 0xffffff && offset >= -0xffffff) { + ins = ADDI; + if (offset < 0) { + offset = -offset; + ins = SUBI; + } + + if (offset <= 0xfff) + FAIL_IF(push_inst(compiler, ins | RD(dst_reg) | RN(SLJIT_SP) | (offset << 10))); + else { + FAIL_IF(push_inst(compiler, ins | RD(dst_reg) | RN(SLJIT_SP) | ((offset & 0xfff000) >> (12 - 10)) | (1 << 22))); + + offset &= 0xfff; + if (offset != 0) + FAIL_IF(push_inst(compiler, ins | RD(dst_reg) | RN(dst_reg) | (offset << 10))); + } + } + else { + FAIL_IF(load_immediate (compiler, dst_reg, offset)); + /* Add extended register form. */ + FAIL_IF(push_inst(compiler, ADDE | (0x3 << 13) | RD(dst_reg) | RN(SLJIT_SP) | RM(dst_reg))); + } + + if (SLJIT_UNLIKELY(dst & SLJIT_MEM)) + return emit_op_mem(compiler, WORD_SIZE | STORE, dst_reg, dst, dstw, TMP_REG1); + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw init_value) +{ + struct sljit_const *const_; + sljit_s32 dst_r; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value)); + ADJUST_LOCAL_OFFSET(dst, dstw); + + const_ = (struct sljit_const*)ensure_abuf(compiler, sizeof(struct sljit_const)); + PTR_FAIL_IF(!const_); + set_const(const_, compiler); + + dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1; + PTR_FAIL_IF(emit_imm64_const(compiler, dst_r, init_value)); + + if (dst & SLJIT_MEM) + PTR_FAIL_IF(emit_op_mem(compiler, WORD_SIZE | STORE, dst_r, dst, dstw, TMP_REG2)); + return const_; +} + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_put_label* sljit_emit_put_label(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw) +{ + struct sljit_put_label *put_label; + sljit_s32 dst_r; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_put_label(compiler, dst, dstw)); + ADJUST_LOCAL_OFFSET(dst, dstw); + + dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1; + PTR_FAIL_IF(emit_imm64_const(compiler, dst_r, 0)); + + put_label = (struct sljit_put_label*)ensure_abuf(compiler, sizeof(struct sljit_put_label)); + PTR_FAIL_IF(!put_label); + set_put_label(put_label, compiler, 1); + + if (dst & SLJIT_MEM) + PTR_FAIL_IF(emit_op_mem(compiler, WORD_SIZE | STORE, dst_r, dst, dstw, TMP_REG2)); + + return put_label; +} + +SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset) +{ + sljit_ins* inst = (sljit_ins*)addr; + modify_imm64_const(inst, new_target); + inst = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset); + SLJIT_CACHE_FLUSH(inst, inst + 4); +} + +SLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_constant, sljit_sw executable_offset) +{ + sljit_ins* inst = (sljit_ins*)addr; + modify_imm64_const(inst, new_constant); + inst = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset); + SLJIT_CACHE_FLUSH(inst, inst + 4); +} diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeARM_T2_32.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeARM_T2_32.c new file mode 100755 index 000000000..cdfe4a4d2 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeARM_T2_32.c @@ -0,0 +1,2370 @@ +/* + * Stack-less Just-In-Time compiler + * + * Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +SLJIT_API_FUNC_ATTRIBUTE const char* sljit_get_platform_name(void) +{ +#ifdef __SOFTFP__ + return "ARM-Thumb2" SLJIT_CPUINFO " ABI:softfp"; +#else + return "ARM-Thumb2" SLJIT_CPUINFO " ABI:hardfp"; +#endif +} + +/* Length of an instruction word. */ +typedef sljit_u32 sljit_ins; + +/* Last register + 1. */ +#define TMP_REG1 (SLJIT_NUMBER_OF_REGISTERS + 2) +#define TMP_REG2 (SLJIT_NUMBER_OF_REGISTERS + 3) +#define TMP_PC (SLJIT_NUMBER_OF_REGISTERS + 4) + +#define TMP_FREG1 (SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1) +#define TMP_FREG2 (SLJIT_NUMBER_OF_FLOAT_REGISTERS + 2) + +/* See sljit_emit_enter and sljit_emit_op0 if you want to change them. */ +static const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 5] = { + 0, 0, 1, 2, 3, 11, 10, 9, 8, 7, 6, 5, 4, 13, 12, 14, 15 +}; + +static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 3] = { + 0, 0, 1, 2, 3, 4, 5, 6, 7 +}; + +#define COPY_BITS(src, from, to, bits) \ + ((from >= to ? (src >> (from - to)) : (src << (to - from))) & (((1 << bits) - 1) << to)) + +/* Thumb16 encodings. */ +#define RD3(rd) (reg_map[rd]) +#define RN3(rn) (reg_map[rn] << 3) +#define RM3(rm) (reg_map[rm] << 6) +#define RDN3(rdn) (reg_map[rdn] << 8) +#define IMM3(imm) (imm << 6) +#define IMM8(imm) (imm) + +/* Thumb16 helpers. */ +#define SET_REGS44(rd, rn) \ + ((reg_map[rn] << 3) | (reg_map[rd] & 0x7) | ((reg_map[rd] & 0x8) << 4)) +#define IS_2_LO_REGS(reg1, reg2) \ + (reg_map[reg1] <= 7 && reg_map[reg2] <= 7) +#define IS_3_LO_REGS(reg1, reg2, reg3) \ + (reg_map[reg1] <= 7 && reg_map[reg2] <= 7 && reg_map[reg3] <= 7) + +/* Thumb32 encodings. */ +#define RD4(rd) (reg_map[rd] << 8) +#define RN4(rn) (reg_map[rn] << 16) +#define RM4(rm) (reg_map[rm]) +#define RT4(rt) (reg_map[rt] << 12) +#define DD4(dd) (freg_map[dd] << 12) +#define DN4(dn) (freg_map[dn] << 16) +#define DM4(dm) (freg_map[dm]) +#define IMM5(imm) \ + (COPY_BITS(imm, 2, 12, 3) | ((imm & 0x3) << 6)) +#define IMM12(imm) \ + (COPY_BITS(imm, 11, 26, 1) | COPY_BITS(imm, 8, 12, 3) | (imm & 0xff)) + +/* --------------------------------------------------------------------- */ +/* Instrucion forms */ +/* --------------------------------------------------------------------- */ + +/* dot '.' changed to _ + I immediate form (possibly followed by number of immediate bits). */ +#define ADCI 0xf1400000 +#define ADCS 0x4140 +#define ADC_W 0xeb400000 +#define ADD 0x4400 +#define ADDS 0x1800 +#define ADDSI3 0x1c00 +#define ADDSI8 0x3000 +#define ADD_W 0xeb000000 +#define ADDWI 0xf2000000 +#define ADD_SP 0xb000 +#define ADD_W 0xeb000000 +#define ADD_WI 0xf1000000 +#define ANDI 0xf0000000 +#define ANDS 0x4000 +#define AND_W 0xea000000 +#define ASRS 0x4100 +#define ASRSI 0x1000 +#define ASR_W 0xfa40f000 +#define ASR_WI 0xea4f0020 +#define BCC 0xd000 +#define BICI 0xf0200000 +#define BKPT 0xbe00 +#define BLX 0x4780 +#define BX 0x4700 +#define CLZ 0xfab0f080 +#define CMNI_W 0xf1100f00 +#define CMP 0x4280 +#define CMPI 0x2800 +#define CMPI_W 0xf1b00f00 +#define CMP_X 0x4500 +#define CMP_W 0xebb00f00 +#define EORI 0xf0800000 +#define EORS 0x4040 +#define EOR_W 0xea800000 +#define IT 0xbf00 +#define LDRI 0xf8500800 +#define LSLS 0x4080 +#define LSLSI 0x0000 +#define LSL_W 0xfa00f000 +#define LSL_WI 0xea4f0000 +#define LSRS 0x40c0 +#define LSRSI 0x0800 +#define LSR_W 0xfa20f000 +#define LSR_WI 0xea4f0010 +#define MOV 0x4600 +#define MOVS 0x0000 +#define MOVSI 0x2000 +#define MOVT 0xf2c00000 +#define MOVW 0xf2400000 +#define MOV_W 0xea4f0000 +#define MOV_WI 0xf04f0000 +#define MUL 0xfb00f000 +#define MVNS 0x43c0 +#define MVN_W 0xea6f0000 +#define MVN_WI 0xf06f0000 +#define NOP 0xbf00 +#define ORNI 0xf0600000 +#define ORRI 0xf0400000 +#define ORRS 0x4300 +#define ORR_W 0xea400000 +#define POP 0xbc00 +#define POP_W 0xe8bd0000 +#define PUSH 0xb400 +#define PUSH_W 0xe92d0000 +#define RSB_WI 0xf1c00000 +#define RSBSI 0x4240 +#define SBCI 0xf1600000 +#define SBCS 0x4180 +#define SBC_W 0xeb600000 +#define SDIV 0xfb90f0f0 +#define SMULL 0xfb800000 +#define STR_SP 0x9000 +#define SUBS 0x1a00 +#define SUBSI3 0x1e00 +#define SUBSI8 0x3800 +#define SUB_W 0xeba00000 +#define SUBWI 0xf2a00000 +#define SUB_SP 0xb080 +#define SUB_WI 0xf1a00000 +#define SXTB 0xb240 +#define SXTB_W 0xfa4ff080 +#define SXTH 0xb200 +#define SXTH_W 0xfa0ff080 +#define TST 0x4200 +#define UDIV 0xfbb0f0f0 +#define UMULL 0xfba00000 +#define UXTB 0xb2c0 +#define UXTB_W 0xfa5ff080 +#define UXTH 0xb280 +#define UXTH_W 0xfa1ff080 +#define VABS_F32 0xeeb00ac0 +#define VADD_F32 0xee300a00 +#define VCMP_F32 0xeeb40a40 +#define VCVT_F32_S32 0xeeb80ac0 +#define VCVT_F64_F32 0xeeb70ac0 +#define VCVT_S32_F32 0xeebd0ac0 +#define VDIV_F32 0xee800a00 +#define VMOV_F32 0xeeb00a40 +#define VMOV 0xee000a10 +#define VMOV2 0xec400a10 +#define VMRS 0xeef1fa10 +#define VMUL_F32 0xee200a00 +#define VNEG_F32 0xeeb10a40 +#define VSTR_F32 0xed000a00 +#define VSUB_F32 0xee300a40 + +static sljit_s32 push_inst16(struct sljit_compiler *compiler, sljit_ins inst) +{ + sljit_u16 *ptr; + SLJIT_ASSERT(!(inst & 0xffff0000)); + + ptr = (sljit_u16*)ensure_buf(compiler, sizeof(sljit_u16)); + FAIL_IF(!ptr); + *ptr = inst; + compiler->size++; + return SLJIT_SUCCESS; +} + +static sljit_s32 push_inst32(struct sljit_compiler *compiler, sljit_ins inst) +{ + sljit_u16 *ptr = (sljit_u16*)ensure_buf(compiler, sizeof(sljit_ins)); + FAIL_IF(!ptr); + *ptr++ = inst >> 16; + *ptr = inst; + compiler->size += 2; + return SLJIT_SUCCESS; +} + +static SLJIT_INLINE sljit_s32 emit_imm32_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_uw imm) +{ + FAIL_IF(push_inst32(compiler, MOVW | RD4(dst) + | COPY_BITS(imm, 12, 16, 4) | COPY_BITS(imm, 11, 26, 1) | COPY_BITS(imm, 8, 12, 3) | (imm & 0xff))); + return push_inst32(compiler, MOVT | RD4(dst) + | COPY_BITS(imm, 12 + 16, 16, 4) | COPY_BITS(imm, 11 + 16, 26, 1) | COPY_BITS(imm, 8 + 16, 12, 3) | ((imm & 0xff0000) >> 16)); +} + +static SLJIT_INLINE void modify_imm32_const(sljit_u16 *inst, sljit_uw new_imm) +{ + sljit_s32 dst = inst[1] & 0x0f00; + SLJIT_ASSERT(((inst[0] & 0xfbf0) == (MOVW >> 16)) && ((inst[2] & 0xfbf0) == (MOVT >> 16)) && dst == (inst[3] & 0x0f00)); + inst[0] = (MOVW >> 16) | COPY_BITS(new_imm, 12, 0, 4) | COPY_BITS(new_imm, 11, 10, 1); + inst[1] = dst | COPY_BITS(new_imm, 8, 12, 3) | (new_imm & 0xff); + inst[2] = (MOVT >> 16) | COPY_BITS(new_imm, 12 + 16, 0, 4) | COPY_BITS(new_imm, 11 + 16, 10, 1); + inst[3] = dst | COPY_BITS(new_imm, 8 + 16, 12, 3) | ((new_imm & 0xff0000) >> 16); +} + +static SLJIT_INLINE sljit_s32 detect_jump_type(struct sljit_jump *jump, sljit_u16 *code_ptr, sljit_u16 *code, sljit_sw executable_offset) +{ + sljit_sw diff; + + if (jump->flags & SLJIT_REWRITABLE_JUMP) + return 0; + + if (jump->flags & JUMP_ADDR) { + /* Branch to ARM code is not optimized yet. */ + if (!(jump->u.target & 0x1)) + return 0; + diff = ((sljit_sw)jump->u.target - (sljit_sw)(code_ptr + 2) - executable_offset) >> 1; + } + else { + SLJIT_ASSERT(jump->flags & JUMP_LABEL); + diff = ((sljit_sw)(code + jump->u.label->size) - (sljit_sw)(code_ptr + 2)) >> 1; + } + + if (jump->flags & IS_COND) { + SLJIT_ASSERT(!(jump->flags & IS_BL)); + if (diff <= 127 && diff >= -128) { + jump->flags |= PATCH_TYPE1; + return 5; + } + if (diff <= 524287 && diff >= -524288) { + jump->flags |= PATCH_TYPE2; + return 4; + } + /* +1 comes from the prefix IT instruction. */ + diff--; + if (diff <= 8388607 && diff >= -8388608) { + jump->flags |= PATCH_TYPE3; + return 3; + } + } + else if (jump->flags & IS_BL) { + if (diff <= 8388607 && diff >= -8388608) { + jump->flags |= PATCH_BL; + return 3; + } + } + else { + if (diff <= 1023 && diff >= -1024) { + jump->flags |= PATCH_TYPE4; + return 4; + } + if (diff <= 8388607 && diff >= -8388608) { + jump->flags |= PATCH_TYPE5; + return 3; + } + } + + return 0; +} + +static SLJIT_INLINE void set_jump_instruction(struct sljit_jump *jump, sljit_sw executable_offset) +{ + sljit_s32 type = (jump->flags >> 4) & 0xf; + sljit_sw diff; + sljit_u16 *jump_inst; + sljit_s32 s, j1, j2; + + if (SLJIT_UNLIKELY(type == 0)) { + modify_imm32_const((sljit_u16*)jump->addr, (jump->flags & JUMP_LABEL) ? jump->u.label->addr : jump->u.target); + return; + } + + if (jump->flags & JUMP_ADDR) { + SLJIT_ASSERT(jump->u.target & 0x1); + diff = ((sljit_sw)jump->u.target - (sljit_sw)(jump->addr + sizeof(sljit_u32)) - executable_offset) >> 1; + } + else { + SLJIT_ASSERT(jump->u.label->addr & 0x1); + diff = ((sljit_sw)(jump->u.label->addr) - (sljit_sw)(jump->addr + sizeof(sljit_u32)) - executable_offset) >> 1; + } + jump_inst = (sljit_u16*)jump->addr; + + switch (type) { + case 1: + /* Encoding T1 of 'B' instruction */ + SLJIT_ASSERT(diff <= 127 && diff >= -128 && (jump->flags & IS_COND)); + jump_inst[0] = 0xd000 | (jump->flags & 0xf00) | (diff & 0xff); + return; + case 2: + /* Encoding T3 of 'B' instruction */ + SLJIT_ASSERT(diff <= 524287 && diff >= -524288 && (jump->flags & IS_COND)); + jump_inst[0] = 0xf000 | COPY_BITS(jump->flags, 8, 6, 4) | COPY_BITS(diff, 11, 0, 6) | COPY_BITS(diff, 19, 10, 1); + jump_inst[1] = 0x8000 | COPY_BITS(diff, 17, 13, 1) | COPY_BITS(diff, 18, 11, 1) | (diff & 0x7ff); + return; + case 3: + SLJIT_ASSERT(jump->flags & IS_COND); + *jump_inst++ = IT | ((jump->flags >> 4) & 0xf0) | 0x8; + diff--; + type = 5; + break; + case 4: + /* Encoding T2 of 'B' instruction */ + SLJIT_ASSERT(diff <= 1023 && diff >= -1024 && !(jump->flags & IS_COND)); + jump_inst[0] = 0xe000 | (diff & 0x7ff); + return; + } + + SLJIT_ASSERT(diff <= 8388607 && diff >= -8388608); + + /* Really complex instruction form for branches. */ + s = (diff >> 23) & 0x1; + j1 = (~(diff >> 22) ^ s) & 0x1; + j2 = (~(diff >> 21) ^ s) & 0x1; + jump_inst[0] = 0xf000 | (s << 10) | COPY_BITS(diff, 11, 0, 10); + jump_inst[1] = (j1 << 13) | (j2 << 11) | (diff & 0x7ff); + + /* The others have a common form. */ + if (type == 5) /* Encoding T4 of 'B' instruction */ + jump_inst[1] |= 0x9000; + else if (type == 6) /* Encoding T1 of 'BL' instruction */ + jump_inst[1] |= 0xd000; + else + SLJIT_UNREACHABLE(); +} + +SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler) +{ + struct sljit_memory_fragment *buf; + sljit_u16 *code; + sljit_u16 *code_ptr; + sljit_u16 *buf_ptr; + sljit_u16 *buf_end; + sljit_uw half_count; + sljit_uw next_addr; + sljit_sw executable_offset; + + struct sljit_label *label; + struct sljit_jump *jump; + struct sljit_const *const_; + struct sljit_put_label *put_label; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_generate_code(compiler)); + reverse_buf(compiler); + + code = (sljit_u16*)SLJIT_MALLOC_EXEC(compiler->size * sizeof(sljit_u16)); + PTR_FAIL_WITH_EXEC_IF(code); + buf = compiler->buf; + + code_ptr = code; + half_count = 0; + next_addr = 0; + executable_offset = SLJIT_EXEC_OFFSET(code); + + label = compiler->labels; + jump = compiler->jumps; + const_ = compiler->consts; + put_label = compiler->put_labels; + + do { + buf_ptr = (sljit_u16*)buf->memory; + buf_end = buf_ptr + (buf->used_size >> 1); + do { + *code_ptr = *buf_ptr++; + if (next_addr == half_count) { + SLJIT_ASSERT(!label || label->size >= half_count); + SLJIT_ASSERT(!jump || jump->addr >= half_count); + SLJIT_ASSERT(!const_ || const_->addr >= half_count); + SLJIT_ASSERT(!put_label || put_label->addr >= half_count); + + /* These structures are ordered by their address. */ + if (label && label->size == half_count) { + label->addr = ((sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset)) | 0x1; + label->size = code_ptr - code; + label = label->next; + } + if (jump && jump->addr == half_count) { + jump->addr = (sljit_uw)code_ptr - ((jump->flags & IS_COND) ? 10 : 8); + code_ptr -= detect_jump_type(jump, code_ptr, code, executable_offset); + jump = jump->next; + } + if (const_ && const_->addr == half_count) { + const_->addr = (sljit_uw)code_ptr; + const_ = const_->next; + } + if (put_label && put_label->addr == half_count) { + SLJIT_ASSERT(put_label->label); + put_label->addr = (sljit_uw)code_ptr; + put_label = put_label->next; + } + next_addr = compute_next_addr(label, jump, const_, put_label); + } + code_ptr ++; + half_count ++; + } while (buf_ptr < buf_end); + + buf = buf->next; + } while (buf); + + if (label && label->size == half_count) { + label->addr = ((sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset)) | 0x1; + label->size = code_ptr - code; + label = label->next; + } + + SLJIT_ASSERT(!label); + SLJIT_ASSERT(!jump); + SLJIT_ASSERT(!const_); + SLJIT_ASSERT(!put_label); + SLJIT_ASSERT(code_ptr - code <= (sljit_sw)compiler->size); + + jump = compiler->jumps; + while (jump) { + set_jump_instruction(jump, executable_offset); + jump = jump->next; + } + + put_label = compiler->put_labels; + while (put_label) { + modify_imm32_const((sljit_u16 *)put_label->addr, put_label->label->addr); + put_label = put_label->next; + } + + compiler->error = SLJIT_ERR_COMPILED; + compiler->executable_offset = executable_offset; + compiler->executable_size = (code_ptr - code) * sizeof(sljit_u16); + + code = (sljit_u16 *)SLJIT_ADD_EXEC_OFFSET(code, executable_offset); + code_ptr = (sljit_u16 *)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); + + SLJIT_CACHE_FLUSH(code, code_ptr); + /* Set thumb mode flag. */ + return (void*)((sljit_uw)code | 0x1); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type) +{ + switch (feature_type) { + case SLJIT_HAS_FPU: +#ifdef SLJIT_IS_FPU_AVAILABLE + return SLJIT_IS_FPU_AVAILABLE; +#else + /* Available by default. */ + return 1; +#endif + + case SLJIT_HAS_CLZ: + case SLJIT_HAS_CMOV: + return 1; + + default: + return 0; + } +} + +/* --------------------------------------------------------------------- */ +/* Core code generator functions. */ +/* --------------------------------------------------------------------- */ + +#define INVALID_IMM 0x80000000 +static sljit_uw get_imm(sljit_uw imm) +{ + /* Thumb immediate form. */ + sljit_s32 counter; + + if (imm <= 0xff) + return imm; + + if ((imm & 0xffff) == (imm >> 16)) { + /* Some special cases. */ + if (!(imm & 0xff00)) + return (1 << 12) | (imm & 0xff); + if (!(imm & 0xff)) + return (2 << 12) | ((imm >> 8) & 0xff); + if ((imm & 0xff00) == ((imm & 0xff) << 8)) + return (3 << 12) | (imm & 0xff); + } + + /* Assembly optimization: count leading zeroes? */ + counter = 8; + if (!(imm & 0xffff0000)) { + counter += 16; + imm <<= 16; + } + if (!(imm & 0xff000000)) { + counter += 8; + imm <<= 8; + } + if (!(imm & 0xf0000000)) { + counter += 4; + imm <<= 4; + } + if (!(imm & 0xc0000000)) { + counter += 2; + imm <<= 2; + } + if (!(imm & 0x80000000)) { + counter += 1; + imm <<= 1; + } + /* Since imm >= 128, this must be true. */ + SLJIT_ASSERT(counter <= 31); + + if (imm & 0x00ffffff) + return INVALID_IMM; /* Cannot be encoded. */ + + return ((imm >> 24) & 0x7f) | COPY_BITS(counter, 4, 26, 1) | COPY_BITS(counter, 1, 12, 3) | COPY_BITS(counter, 0, 7, 1); +} + +static sljit_s32 load_immediate(struct sljit_compiler *compiler, sljit_s32 dst, sljit_uw imm) +{ + sljit_uw tmp; + + /* MOVS cannot be used since it destroy flags. */ + + if (imm >= 0x10000) { + tmp = get_imm(imm); + if (tmp != INVALID_IMM) + return push_inst32(compiler, MOV_WI | RD4(dst) | tmp); + tmp = get_imm(~imm); + if (tmp != INVALID_IMM) + return push_inst32(compiler, MVN_WI | RD4(dst) | tmp); + } + + /* set low 16 bits, set hi 16 bits to 0. */ + FAIL_IF(push_inst32(compiler, MOVW | RD4(dst) + | COPY_BITS(imm, 12, 16, 4) | COPY_BITS(imm, 11, 26, 1) | COPY_BITS(imm, 8, 12, 3) | (imm & 0xff))); + + /* set hi 16 bit if needed. */ + if (imm >= 0x10000) + return push_inst32(compiler, MOVT | RD4(dst) + | COPY_BITS(imm, 12 + 16, 16, 4) | COPY_BITS(imm, 11 + 16, 26, 1) | COPY_BITS(imm, 8 + 16, 12, 3) | ((imm & 0xff0000) >> 16)); + return SLJIT_SUCCESS; +} + +#define ARG1_IMM 0x0010000 +#define ARG2_IMM 0x0020000 +/* SET_FLAGS must be 0x100000 as it is also the value of S bit (can be used for optimization). */ +#define SET_FLAGS 0x0100000 +#define UNUSED_RETURN 0x0200000 + +static sljit_s32 emit_op_imm(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 dst, sljit_uw arg1, sljit_uw arg2) +{ + /* dst must be register, TMP_REG1 + arg1 must be register, imm + arg2 must be register, imm */ + sljit_s32 reg; + sljit_uw imm, nimm; + + if (SLJIT_UNLIKELY((flags & (ARG1_IMM | ARG2_IMM)) == (ARG1_IMM | ARG2_IMM))) { + /* Both are immediates, no temporaries are used. */ + flags &= ~ARG1_IMM; + FAIL_IF(load_immediate(compiler, TMP_REG1, arg1)); + arg1 = TMP_REG1; + } + + if (flags & (ARG1_IMM | ARG2_IMM)) { + reg = (flags & ARG2_IMM) ? arg1 : arg2; + imm = (flags & ARG2_IMM) ? arg2 : arg1; + + switch (flags & 0xffff) { + case SLJIT_CLZ: + case SLJIT_MUL: + /* No form with immediate operand. */ + break; + case SLJIT_MOV: + SLJIT_ASSERT(!(flags & SET_FLAGS) && (flags & ARG2_IMM) && arg1 == TMP_REG2); + return load_immediate(compiler, dst, imm); + case SLJIT_NOT: + if (!(flags & SET_FLAGS)) + return load_immediate(compiler, dst, ~imm); + /* Since the flags should be set, we just fallback to the register mode. + Although some clever things could be done here, "NOT IMM" does not worth the efforts. */ + break; + case SLJIT_ADD: + nimm = -imm; + if (IS_2_LO_REGS(reg, dst)) { + if (imm <= 0x7) + return push_inst16(compiler, ADDSI3 | IMM3(imm) | RD3(dst) | RN3(reg)); + if (nimm <= 0x7) + return push_inst16(compiler, SUBSI3 | IMM3(nimm) | RD3(dst) | RN3(reg)); + if (reg == dst) { + if (imm <= 0xff) + return push_inst16(compiler, ADDSI8 | IMM8(imm) | RDN3(dst)); + if (nimm <= 0xff) + return push_inst16(compiler, SUBSI8 | IMM8(nimm) | RDN3(dst)); + } + } + if (!(flags & SET_FLAGS)) { + if (imm <= 0xfff) + return push_inst32(compiler, ADDWI | RD4(dst) | RN4(reg) | IMM12(imm)); + if (nimm <= 0xfff) + return push_inst32(compiler, SUBWI | RD4(dst) | RN4(reg) | IMM12(nimm)); + } + nimm = get_imm(imm); + if (nimm != INVALID_IMM) + return push_inst32(compiler, ADD_WI | (flags & SET_FLAGS) | RD4(dst) | RN4(reg) | nimm); + nimm = get_imm(-imm); + if (nimm != INVALID_IMM) + return push_inst32(compiler, SUB_WI | (flags & SET_FLAGS) | RD4(dst) | RN4(reg) | nimm); + break; + case SLJIT_ADDC: + imm = get_imm(imm); + if (imm != INVALID_IMM) + return push_inst32(compiler, ADCI | (flags & SET_FLAGS) | RD4(dst) | RN4(reg) | imm); + break; + case SLJIT_SUB: + /* SUB operation can be replaced by ADD because of the negative carry flag. */ + if (flags & ARG1_IMM) { + if (imm == 0 && IS_2_LO_REGS(reg, dst)) + return push_inst16(compiler, RSBSI | RD3(dst) | RN3(reg)); + imm = get_imm(imm); + if (imm != INVALID_IMM) + return push_inst32(compiler, RSB_WI | (flags & SET_FLAGS) | RD4(dst) | RN4(reg) | imm); + break; + } + if (flags & UNUSED_RETURN) { + if (imm <= 0xff && reg_map[reg] <= 7) + return push_inst16(compiler, CMPI | IMM8(imm) | RDN3(reg)); + nimm = get_imm(imm); + if (nimm != INVALID_IMM) + return push_inst32(compiler, CMPI_W | RN4(reg) | nimm); + nimm = get_imm(-imm); + if (nimm != INVALID_IMM) + return push_inst32(compiler, CMNI_W | RN4(reg) | nimm); + } + nimm = -imm; + if (IS_2_LO_REGS(reg, dst)) { + if (imm <= 0x7) + return push_inst16(compiler, SUBSI3 | IMM3(imm) | RD3(dst) | RN3(reg)); + if (nimm <= 0x7) + return push_inst16(compiler, ADDSI3 | IMM3(nimm) | RD3(dst) | RN3(reg)); + if (reg == dst) { + if (imm <= 0xff) + return push_inst16(compiler, SUBSI8 | IMM8(imm) | RDN3(dst)); + if (nimm <= 0xff) + return push_inst16(compiler, ADDSI8 | IMM8(nimm) | RDN3(dst)); + } + } + if (!(flags & SET_FLAGS)) { + if (imm <= 0xfff) + return push_inst32(compiler, SUBWI | RD4(dst) | RN4(reg) | IMM12(imm)); + if (nimm <= 0xfff) + return push_inst32(compiler, ADDWI | RD4(dst) | RN4(reg) | IMM12(nimm)); + } + nimm = get_imm(imm); + if (nimm != INVALID_IMM) + return push_inst32(compiler, SUB_WI | (flags & SET_FLAGS) | RD4(dst) | RN4(reg) | nimm); + nimm = get_imm(-imm); + if (nimm != INVALID_IMM) + return push_inst32(compiler, ADD_WI | (flags & SET_FLAGS) | RD4(dst) | RN4(reg) | nimm); + break; + case SLJIT_SUBC: + if (flags & ARG1_IMM) + break; + imm = get_imm(imm); + if (imm != INVALID_IMM) + return push_inst32(compiler, SBCI | (flags & SET_FLAGS) | RD4(dst) | RN4(reg) | imm); + break; + case SLJIT_AND: + nimm = get_imm(imm); + if (nimm != INVALID_IMM) + return push_inst32(compiler, ANDI | (flags & SET_FLAGS) | RD4(dst) | RN4(reg) | nimm); + imm = get_imm(imm); + if (imm != INVALID_IMM) + return push_inst32(compiler, BICI | (flags & SET_FLAGS) | RD4(dst) | RN4(reg) | imm); + break; + case SLJIT_OR: + nimm = get_imm(imm); + if (nimm != INVALID_IMM) + return push_inst32(compiler, ORRI | (flags & SET_FLAGS) | RD4(dst) | RN4(reg) | nimm); + imm = get_imm(imm); + if (imm != INVALID_IMM) + return push_inst32(compiler, ORNI | (flags & SET_FLAGS) | RD4(dst) | RN4(reg) | imm); + break; + case SLJIT_XOR: + imm = get_imm(imm); + if (imm != INVALID_IMM) + return push_inst32(compiler, EORI | (flags & SET_FLAGS) | RD4(dst) | RN4(reg) | imm); + break; + case SLJIT_SHL: + case SLJIT_LSHR: + case SLJIT_ASHR: + if (flags & ARG1_IMM) + break; + imm &= 0x1f; + if (imm == 0) { + if (!(flags & SET_FLAGS)) + return push_inst16(compiler, MOV | SET_REGS44(dst, reg)); + if (IS_2_LO_REGS(dst, reg)) + return push_inst16(compiler, MOVS | RD3(dst) | RN3(reg)); + return push_inst32(compiler, MOV_W | SET_FLAGS | RD4(dst) | RM4(reg)); + } + switch (flags & 0xffff) { + case SLJIT_SHL: + if (IS_2_LO_REGS(dst, reg)) + return push_inst16(compiler, LSLSI | RD3(dst) | RN3(reg) | (imm << 6)); + return push_inst32(compiler, LSL_WI | (flags & SET_FLAGS) | RD4(dst) | RM4(reg) | IMM5(imm)); + case SLJIT_LSHR: + if (IS_2_LO_REGS(dst, reg)) + return push_inst16(compiler, LSRSI | RD3(dst) | RN3(reg) | (imm << 6)); + return push_inst32(compiler, LSR_WI | (flags & SET_FLAGS) | RD4(dst) | RM4(reg) | IMM5(imm)); + default: /* SLJIT_ASHR */ + if (IS_2_LO_REGS(dst, reg)) + return push_inst16(compiler, ASRSI | RD3(dst) | RN3(reg) | (imm << 6)); + return push_inst32(compiler, ASR_WI | (flags & SET_FLAGS) | RD4(dst) | RM4(reg) | IMM5(imm)); + } + default: + SLJIT_UNREACHABLE(); + break; + } + + if (flags & ARG2_IMM) { + imm = arg2; + arg2 = (arg1 == TMP_REG1) ? TMP_REG2 : TMP_REG1; + FAIL_IF(load_immediate(compiler, arg2, imm)); + } + else { + imm = arg1; + arg1 = (arg2 == TMP_REG1) ? TMP_REG2 : TMP_REG1; + FAIL_IF(load_immediate(compiler, arg1, imm)); + } + + SLJIT_ASSERT(arg1 != arg2); + } + + /* Both arguments are registers. */ + switch (flags & 0xffff) { + case SLJIT_MOV: + case SLJIT_MOV_U32: + case SLJIT_MOV_S32: + case SLJIT_MOV_P: + SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG2); + if (dst == arg2) + return SLJIT_SUCCESS; + return push_inst16(compiler, MOV | SET_REGS44(dst, arg2)); + case SLJIT_MOV_U8: + SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG2); + if (IS_2_LO_REGS(dst, arg2)) + return push_inst16(compiler, UXTB | RD3(dst) | RN3(arg2)); + return push_inst32(compiler, UXTB_W | RD4(dst) | RM4(arg2)); + case SLJIT_MOV_S8: + SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG2); + if (IS_2_LO_REGS(dst, arg2)) + return push_inst16(compiler, SXTB | RD3(dst) | RN3(arg2)); + return push_inst32(compiler, SXTB_W | RD4(dst) | RM4(arg2)); + case SLJIT_MOV_U16: + SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG2); + if (IS_2_LO_REGS(dst, arg2)) + return push_inst16(compiler, UXTH | RD3(dst) | RN3(arg2)); + return push_inst32(compiler, UXTH_W | RD4(dst) | RM4(arg2)); + case SLJIT_MOV_S16: + SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG2); + if (IS_2_LO_REGS(dst, arg2)) + return push_inst16(compiler, SXTH | RD3(dst) | RN3(arg2)); + return push_inst32(compiler, SXTH_W | RD4(dst) | RM4(arg2)); + case SLJIT_NOT: + SLJIT_ASSERT(arg1 == TMP_REG2); + if (IS_2_LO_REGS(dst, arg2)) + return push_inst16(compiler, MVNS | RD3(dst) | RN3(arg2)); + return push_inst32(compiler, MVN_W | (flags & SET_FLAGS) | RD4(dst) | RM4(arg2)); + case SLJIT_CLZ: + SLJIT_ASSERT(arg1 == TMP_REG2); + FAIL_IF(push_inst32(compiler, CLZ | RN4(arg2) | RD4(dst) | RM4(arg2))); + return SLJIT_SUCCESS; + case SLJIT_ADD: + if (IS_3_LO_REGS(dst, arg1, arg2)) + return push_inst16(compiler, ADDS | RD3(dst) | RN3(arg1) | RM3(arg2)); + if (dst == arg1 && !(flags & SET_FLAGS)) + return push_inst16(compiler, ADD | SET_REGS44(dst, arg2)); + return push_inst32(compiler, ADD_W | (flags & SET_FLAGS) | RD4(dst) | RN4(arg1) | RM4(arg2)); + case SLJIT_ADDC: + if (dst == arg1 && IS_2_LO_REGS(dst, arg2)) + return push_inst16(compiler, ADCS | RD3(dst) | RN3(arg2)); + return push_inst32(compiler, ADC_W | (flags & SET_FLAGS) | RD4(dst) | RN4(arg1) | RM4(arg2)); + case SLJIT_SUB: + if (flags & UNUSED_RETURN) { + if (IS_2_LO_REGS(arg1, arg2)) + return push_inst16(compiler, CMP | RD3(arg1) | RN3(arg2)); + return push_inst16(compiler, CMP_X | SET_REGS44(arg1, arg2)); + } + if (IS_3_LO_REGS(dst, arg1, arg2)) + return push_inst16(compiler, SUBS | RD3(dst) | RN3(arg1) | RM3(arg2)); + return push_inst32(compiler, SUB_W | (flags & SET_FLAGS) | RD4(dst) | RN4(arg1) | RM4(arg2)); + case SLJIT_SUBC: + if (dst == arg1 && IS_2_LO_REGS(dst, arg2)) + return push_inst16(compiler, SBCS | RD3(dst) | RN3(arg2)); + return push_inst32(compiler, SBC_W | (flags & SET_FLAGS) | RD4(dst) | RN4(arg1) | RM4(arg2)); + case SLJIT_MUL: + if (!(flags & SET_FLAGS)) + return push_inst32(compiler, MUL | RD4(dst) | RN4(arg1) | RM4(arg2)); + SLJIT_ASSERT(dst != TMP_REG2); + FAIL_IF(push_inst32(compiler, SMULL | RT4(dst) | RD4(TMP_REG2) | RN4(arg1) | RM4(arg2))); + /* cmp TMP_REG2, dst asr #31. */ + return push_inst32(compiler, CMP_W | RN4(TMP_REG2) | 0x70e0 | RM4(dst)); + case SLJIT_AND: + if (dst == arg1 && IS_2_LO_REGS(dst, arg2)) + return push_inst16(compiler, ANDS | RD3(dst) | RN3(arg2)); + if ((flags & UNUSED_RETURN) && IS_2_LO_REGS(arg1, arg2)) + return push_inst16(compiler, TST | RD3(arg1) | RN3(arg2)); + return push_inst32(compiler, AND_W | (flags & SET_FLAGS) | RD4(dst) | RN4(arg1) | RM4(arg2)); + case SLJIT_OR: + if (dst == arg1 && IS_2_LO_REGS(dst, arg2)) + return push_inst16(compiler, ORRS | RD3(dst) | RN3(arg2)); + return push_inst32(compiler, ORR_W | (flags & SET_FLAGS) | RD4(dst) | RN4(arg1) | RM4(arg2)); + case SLJIT_XOR: + if (dst == arg1 && IS_2_LO_REGS(dst, arg2)) + return push_inst16(compiler, EORS | RD3(dst) | RN3(arg2)); + return push_inst32(compiler, EOR_W | (flags & SET_FLAGS) | RD4(dst) | RN4(arg1) | RM4(arg2)); + case SLJIT_SHL: + if (dst == arg1 && IS_2_LO_REGS(dst, arg2)) + return push_inst16(compiler, LSLS | RD3(dst) | RN3(arg2)); + return push_inst32(compiler, LSL_W | (flags & SET_FLAGS) | RD4(dst) | RN4(arg1) | RM4(arg2)); + case SLJIT_LSHR: + if (dst == arg1 && IS_2_LO_REGS(dst, arg2)) + return push_inst16(compiler, LSRS | RD3(dst) | RN3(arg2)); + return push_inst32(compiler, LSR_W | (flags & SET_FLAGS) | RD4(dst) | RN4(arg1) | RM4(arg2)); + case SLJIT_ASHR: + if (dst == arg1 && IS_2_LO_REGS(dst, arg2)) + return push_inst16(compiler, ASRS | RD3(dst) | RN3(arg2)); + return push_inst32(compiler, ASR_W | (flags & SET_FLAGS) | RD4(dst) | RN4(arg1) | RM4(arg2)); + } + + SLJIT_UNREACHABLE(); + return SLJIT_SUCCESS; +} + +#define STORE 0x01 +#define SIGNED 0x02 + +#define WORD_SIZE 0x00 +#define BYTE_SIZE 0x04 +#define HALF_SIZE 0x08 +#define PRELOAD 0x0c + +#define IS_WORD_SIZE(flags) (!(flags & (BYTE_SIZE | HALF_SIZE))) +#define OFFSET_CHECK(imm, shift) (!(argw & ~(imm << shift))) + +/* + 1st letter: + w = word + b = byte + h = half + + 2nd letter: + s = signed + u = unsigned + + 3rd letter: + l = load + s = store +*/ + +static const sljit_ins sljit_mem16[12] = { +/* w u l */ 0x5800 /* ldr */, +/* w u s */ 0x5000 /* str */, +/* w s l */ 0x5800 /* ldr */, +/* w s s */ 0x5000 /* str */, + +/* b u l */ 0x5c00 /* ldrb */, +/* b u s */ 0x5400 /* strb */, +/* b s l */ 0x5600 /* ldrsb */, +/* b s s */ 0x5400 /* strb */, + +/* h u l */ 0x5a00 /* ldrh */, +/* h u s */ 0x5200 /* strh */, +/* h s l */ 0x5e00 /* ldrsh */, +/* h s s */ 0x5200 /* strh */, +}; + +static const sljit_ins sljit_mem16_imm5[12] = { +/* w u l */ 0x6800 /* ldr imm5 */, +/* w u s */ 0x6000 /* str imm5 */, +/* w s l */ 0x6800 /* ldr imm5 */, +/* w s s */ 0x6000 /* str imm5 */, + +/* b u l */ 0x7800 /* ldrb imm5 */, +/* b u s */ 0x7000 /* strb imm5 */, +/* b s l */ 0x0000 /* not allowed */, +/* b s s */ 0x7000 /* strb imm5 */, + +/* h u l */ 0x8800 /* ldrh imm5 */, +/* h u s */ 0x8000 /* strh imm5 */, +/* h s l */ 0x0000 /* not allowed */, +/* h s s */ 0x8000 /* strh imm5 */, +}; + +#define MEM_IMM8 0xc00 +#define MEM_IMM12 0x800000 +static const sljit_ins sljit_mem32[13] = { +/* w u l */ 0xf8500000 /* ldr.w */, +/* w u s */ 0xf8400000 /* str.w */, +/* w s l */ 0xf8500000 /* ldr.w */, +/* w s s */ 0xf8400000 /* str.w */, + +/* b u l */ 0xf8100000 /* ldrb.w */, +/* b u s */ 0xf8000000 /* strb.w */, +/* b s l */ 0xf9100000 /* ldrsb.w */, +/* b s s */ 0xf8000000 /* strb.w */, + +/* h u l */ 0xf8300000 /* ldrh.w */, +/* h u s */ 0xf8200000 /* strsh.w */, +/* h s l */ 0xf9300000 /* ldrsh.w */, +/* h s s */ 0xf8200000 /* strsh.w */, + +/* p u l */ 0xf8100000 /* pld */, +}; + +/* Helper function. Dst should be reg + value, using at most 1 instruction, flags does not set. */ +static sljit_s32 emit_set_delta(struct sljit_compiler *compiler, sljit_s32 dst, sljit_s32 reg, sljit_sw value) +{ + if (value >= 0) { + if (value <= 0xfff) + return push_inst32(compiler, ADDWI | RD4(dst) | RN4(reg) | IMM12(value)); + value = get_imm(value); + if (value != INVALID_IMM) + return push_inst32(compiler, ADD_WI | RD4(dst) | RN4(reg) | value); + } + else { + value = -value; + if (value <= 0xfff) + return push_inst32(compiler, SUBWI | RD4(dst) | RN4(reg) | IMM12(value)); + value = get_imm(value); + if (value != INVALID_IMM) + return push_inst32(compiler, SUB_WI | RD4(dst) | RN4(reg) | value); + } + return SLJIT_ERR_UNSUPPORTED; +} + +static SLJIT_INLINE sljit_s32 emit_op_mem(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg, + sljit_s32 arg, sljit_sw argw, sljit_s32 tmp_reg) +{ + sljit_s32 other_r; + sljit_uw tmp; + + SLJIT_ASSERT(arg & SLJIT_MEM); + SLJIT_ASSERT((arg & REG_MASK) != tmp_reg); + arg &= ~SLJIT_MEM; + + if (SLJIT_UNLIKELY(!(arg & REG_MASK))) { + tmp = get_imm(argw & ~0xfff); + if (tmp != INVALID_IMM) { + FAIL_IF(push_inst32(compiler, MOV_WI | RD4(tmp_reg) | tmp)); + return push_inst32(compiler, sljit_mem32[flags] | MEM_IMM12 | RT4(reg) | RN4(tmp_reg) | (argw & 0xfff)); + } + + FAIL_IF(load_immediate(compiler, tmp_reg, argw)); + if (IS_2_LO_REGS(reg, tmp_reg) && sljit_mem16_imm5[flags]) + return push_inst16(compiler, sljit_mem16_imm5[flags] | RD3(reg) | RN3(tmp_reg)); + return push_inst32(compiler, sljit_mem32[flags] | MEM_IMM12 | RT4(reg) | RN4(tmp_reg)); + } + + if (SLJIT_UNLIKELY(arg & OFFS_REG_MASK)) { + argw &= 0x3; + other_r = OFFS_REG(arg); + arg &= 0xf; + + if (!argw && IS_3_LO_REGS(reg, arg, other_r)) + return push_inst16(compiler, sljit_mem16[flags] | RD3(reg) | RN3(arg) | RM3(other_r)); + return push_inst32(compiler, sljit_mem32[flags] | RT4(reg) | RN4(arg) | RM4(other_r) | (argw << 4)); + } + + if (argw > 0xfff) { + tmp = get_imm(argw & ~0xfff); + if (tmp != INVALID_IMM) { + push_inst32(compiler, ADD_WI | RD4(tmp_reg) | RN4(arg) | tmp); + arg = tmp_reg; + argw = argw & 0xfff; + } + } + else if (argw < -0xff) { + tmp = get_imm(-argw & ~0xff); + if (tmp != INVALID_IMM) { + push_inst32(compiler, SUB_WI | RD4(tmp_reg) | RN4(arg) | tmp); + arg = tmp_reg; + argw = -(-argw & 0xff); + } + } + + if (IS_2_LO_REGS(reg, arg) && sljit_mem16_imm5[flags]) { + tmp = 3; + if (IS_WORD_SIZE(flags)) { + if (OFFSET_CHECK(0x1f, 2)) + tmp = 2; + } + else if (flags & BYTE_SIZE) + { + if (OFFSET_CHECK(0x1f, 0)) + tmp = 0; + } + else { + SLJIT_ASSERT(flags & HALF_SIZE); + if (OFFSET_CHECK(0x1f, 1)) + tmp = 1; + } + + if (tmp < 3) + return push_inst16(compiler, sljit_mem16_imm5[flags] | RD3(reg) | RN3(arg) | (argw << (6 - tmp))); + } + else if (SLJIT_UNLIKELY(arg == SLJIT_SP) && IS_WORD_SIZE(flags) && OFFSET_CHECK(0xff, 2) && reg_map[reg] <= 7) { + /* SP based immediate. */ + return push_inst16(compiler, STR_SP | ((flags & STORE) ? 0 : 0x800) | RDN3(reg) | (argw >> 2)); + } + + if (argw >= 0 && argw <= 0xfff) + return push_inst32(compiler, sljit_mem32[flags] | MEM_IMM12 | RT4(reg) | RN4(arg) | argw); + else if (argw < 0 && argw >= -0xff) + return push_inst32(compiler, sljit_mem32[flags] | MEM_IMM8 | RT4(reg) | RN4(arg) | -argw); + + SLJIT_ASSERT(arg != tmp_reg); + + FAIL_IF(load_immediate(compiler, tmp_reg, argw)); + if (IS_3_LO_REGS(reg, arg, tmp_reg)) + return push_inst16(compiler, sljit_mem16[flags] | RD3(reg) | RN3(arg) | RM3(tmp_reg)); + return push_inst32(compiler, sljit_mem32[flags] | RT4(reg) | RN4(arg) | RM4(tmp_reg)); +} + +/* --------------------------------------------------------------------- */ +/* Entry, exit */ +/* --------------------------------------------------------------------- */ + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compiler, + sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds, + sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size) +{ + sljit_s32 args, size, i, tmp; + sljit_ins push = 0; +#ifdef _WIN32 + sljit_uw imm; +#endif + + CHECK_ERROR(); + CHECK(check_sljit_emit_enter(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size)); + set_emit_enter(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size); + + tmp = saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? (SLJIT_S0 + 1 - saveds) : SLJIT_FIRST_SAVED_REG; + for (i = SLJIT_S0; i >= tmp; i--) + push |= 1 << reg_map[i]; + + for (i = scratches; i >= SLJIT_FIRST_SAVED_REG; i--) + push |= 1 << reg_map[i]; + + FAIL_IF((push & 0xff00) + ? push_inst32(compiler, PUSH_W | (1 << 14) | push) + : push_inst16(compiler, PUSH | (1 << 8) | push)); + + /* Stack must be aligned to 8 bytes: (LR, R4) */ + size = GET_SAVED_REGISTERS_SIZE(scratches, saveds, 1); + local_size = ((size + local_size + 7) & ~7) - size; + compiler->local_size = local_size; + +#ifdef _WIN32 + if (local_size >= 256) { + if (local_size > 4096) + imm = get_imm(4096); + else + imm = get_imm(local_size & ~0xff); + + SLJIT_ASSERT(imm != INVALID_IMM); + FAIL_IF(push_inst32(compiler, SUB_WI | RD4(TMP_REG1) | RN4(SLJIT_SP) | imm)); + } +#else + if (local_size > 0) { + if (local_size <= (127 << 2)) + FAIL_IF(push_inst16(compiler, SUB_SP | (local_size >> 2))); + else + FAIL_IF(emit_op_imm(compiler, SLJIT_SUB | ARG2_IMM, SLJIT_SP, SLJIT_SP, local_size)); + } +#endif + + args = get_arg_count(arg_types); + + if (args >= 1) + FAIL_IF(push_inst16(compiler, MOV | SET_REGS44(SLJIT_S0, SLJIT_R0))); + if (args >= 2) + FAIL_IF(push_inst16(compiler, MOV | SET_REGS44(SLJIT_S1, SLJIT_R1))); + if (args >= 3) + FAIL_IF(push_inst16(compiler, MOV | SET_REGS44(SLJIT_S2, SLJIT_R2))); + +#ifdef _WIN32 + if (local_size >= 256) { + if (local_size > 4096) { + imm = get_imm(4096); + SLJIT_ASSERT(imm != INVALID_IMM); + + if (local_size < 4 * 4096) { + if (local_size > 2 * 4096) { + FAIL_IF(push_inst32(compiler, LDRI | 0x400 | RT4(TMP_REG2) | RN4(TMP_REG1))); + FAIL_IF(push_inst32(compiler, SUB_WI | RD4(TMP_REG1) | RN4(TMP_REG1) | imm)); + local_size -= 4096; + } + + if (local_size > 2 * 4096) { + FAIL_IF(push_inst32(compiler, LDRI | 0x400 | RT4(TMP_REG2) | RN4(TMP_REG1))); + FAIL_IF(push_inst32(compiler, SUB_WI | RD4(TMP_REG1) | RN4(TMP_REG1) | imm)); + local_size -= 4096; + } + + FAIL_IF(push_inst32(compiler, LDRI | 0x400 | RT4(TMP_REG2) | RN4(TMP_REG1))); + local_size -= 4096; + + SLJIT_ASSERT(local_size > 0); + } + else { + FAIL_IF(load_immediate(compiler, SLJIT_R3, (local_size >> 12) - 1)); + FAIL_IF(push_inst32(compiler, LDRI | 0x400 | RT4(TMP_REG2) | RN4(TMP_REG1))); + FAIL_IF(push_inst32(compiler, SUB_WI | RD4(TMP_REG1) | RN4(TMP_REG1) | imm)); + SLJIT_ASSERT(reg_map[SLJIT_R3] < 7); + FAIL_IF(push_inst16(compiler, SUBSI8 | RDN3(SLJIT_R3) | 1)); + FAIL_IF(push_inst16(compiler, BCC | (0x1 << 8) /* not-equal */ | (-7 & 0xff))); + + local_size &= 0xfff; + + if (local_size != 0) + FAIL_IF(push_inst32(compiler, LDRI | 0x400 | RT4(TMP_REG2) | RN4(TMP_REG1))); + } + + if (local_size >= 256) { + imm = get_imm(local_size & ~0xff); + SLJIT_ASSERT(imm != INVALID_IMM); + + FAIL_IF(push_inst32(compiler, SUB_WI | RD4(TMP_REG1) | RN4(TMP_REG1) | imm)); + } + } + + local_size &= 0xff; + FAIL_IF(push_inst32(compiler, LDRI | 0x400 | (local_size > 0 ? 0x100 : 0) | RT4(TMP_REG2) | RN4(TMP_REG1) | local_size)); + + FAIL_IF(push_inst16(compiler, MOV | SET_REGS44(SLJIT_SP, TMP_REG1))); + } + else if (local_size > 0) + FAIL_IF(push_inst32(compiler, LDRI | 0x500 | RT4(TMP_REG1) | RN4(SLJIT_SP) | local_size)); +#endif + + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_set_context(struct sljit_compiler *compiler, + sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds, + sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size) +{ + sljit_s32 size; + + CHECK_ERROR(); + CHECK(check_sljit_set_context(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size)); + set_set_context(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size); + + size = GET_SAVED_REGISTERS_SIZE(scratches, saveds, 1); + compiler->local_size = ((size + local_size + 7) & ~7) - size; + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw) +{ + sljit_s32 i, tmp; + sljit_ins pop = 0; + + CHECK_ERROR(); + CHECK(check_sljit_emit_return(compiler, op, src, srcw)); + + FAIL_IF(emit_mov_before_return(compiler, op, src, srcw)); + + if (compiler->local_size > 0) { + if (compiler->local_size <= (127 << 2)) + FAIL_IF(push_inst16(compiler, ADD_SP | (compiler->local_size >> 2))); + else + FAIL_IF(emit_op_imm(compiler, SLJIT_ADD | ARG2_IMM, SLJIT_SP, SLJIT_SP, compiler->local_size)); + } + + tmp = compiler->saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? (SLJIT_S0 + 1 - compiler->saveds) : SLJIT_FIRST_SAVED_REG; + for (i = SLJIT_S0; i >= tmp; i--) + pop |= 1 << reg_map[i]; + + for (i = compiler->scratches; i >= SLJIT_FIRST_SAVED_REG; i--) + pop |= 1 << reg_map[i]; + + return (pop & 0xff00) + ? push_inst32(compiler, POP_W | (1 << 15) | pop) + : push_inst16(compiler, POP | (1 << 8) | pop); +} + +/* --------------------------------------------------------------------- */ +/* Operators */ +/* --------------------------------------------------------------------- */ + +#if !(defined __ARM_FEATURE_IDIV) && !(defined __ARM_ARCH_EXT_IDIV__) + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef _WIN32 +extern unsigned long long __rt_udiv(unsigned int denominator, unsigned int numerator); +extern long long __rt_sdiv(int denominator, int numerator); +#elif defined(__GNUC__) +extern unsigned int __aeabi_uidivmod(unsigned int numerator, int unsigned denominator); +extern int __aeabi_idivmod(int numerator, int denominator); +#else +#error "Software divmod functions are needed" +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* !__ARM_FEATURE_IDIV && !__ARM_ARCH_EXT_IDIV__ */ + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compiler, sljit_s32 op) +{ +#if !(defined __ARM_FEATURE_IDIV) && !(defined __ARM_ARCH_EXT_IDIV__) + sljit_sw saved_reg_list[3]; + sljit_sw saved_reg_count; +#endif + + CHECK_ERROR(); + CHECK(check_sljit_emit_op0(compiler, op)); + + op = GET_OPCODE(op); + switch (op) { + case SLJIT_BREAKPOINT: + return push_inst16(compiler, BKPT); + case SLJIT_NOP: + return push_inst16(compiler, NOP); + case SLJIT_LMUL_UW: + case SLJIT_LMUL_SW: + return push_inst32(compiler, (op == SLJIT_LMUL_UW ? UMULL : SMULL) + | (reg_map[SLJIT_R1] << 8) + | (reg_map[SLJIT_R0] << 12) + | (reg_map[SLJIT_R0] << 16) + | reg_map[SLJIT_R1]); +#if (defined __ARM_FEATURE_IDIV) || (defined __ARM_ARCH_EXT_IDIV__) + case SLJIT_DIVMOD_UW: + case SLJIT_DIVMOD_SW: + FAIL_IF(push_inst16(compiler, MOV | SET_REGS44(TMP_REG1, SLJIT_R0))); + FAIL_IF(push_inst32(compiler, (op == SLJIT_DIVMOD_UW ? UDIV : SDIV) | RD4(SLJIT_R0) | RN4(SLJIT_R0) | RM4(SLJIT_R1))); + FAIL_IF(push_inst32(compiler, MUL | RD4(SLJIT_R1) | RN4(SLJIT_R0) | RM4(SLJIT_R1))); + return push_inst32(compiler, SUB_W | RD4(SLJIT_R1) | RN4(TMP_REG1) | RM4(SLJIT_R1)); + case SLJIT_DIV_UW: + case SLJIT_DIV_SW: + return push_inst32(compiler, (op == SLJIT_DIV_UW ? UDIV : SDIV) | RD4(SLJIT_R0) | RN4(SLJIT_R0) | RM4(SLJIT_R1)); +#else /* !__ARM_FEATURE_IDIV && !__ARM_ARCH_EXT_IDIV__ */ + case SLJIT_DIVMOD_UW: + case SLJIT_DIVMOD_SW: + case SLJIT_DIV_UW: + case SLJIT_DIV_SW: + SLJIT_COMPILE_ASSERT((SLJIT_DIVMOD_UW & 0x2) == 0 && SLJIT_DIV_UW - 0x2 == SLJIT_DIVMOD_UW, bad_div_opcode_assignments); + SLJIT_ASSERT(reg_map[2] == 1 && reg_map[3] == 2 && reg_map[4] == 3); + + saved_reg_count = 0; + if (compiler->scratches >= 4) + saved_reg_list[saved_reg_count++] = 3; + if (compiler->scratches >= 3) + saved_reg_list[saved_reg_count++] = 2; + if (op >= SLJIT_DIV_UW) + saved_reg_list[saved_reg_count++] = 1; + + if (saved_reg_count > 0) { + FAIL_IF(push_inst32(compiler, 0xf84d0d00 | (saved_reg_count >= 3 ? 16 : 8) + | (saved_reg_list[0] << 12) /* str rX, [sp, #-8/-16]! */)); + if (saved_reg_count >= 2) { + SLJIT_ASSERT(saved_reg_list[1] < 8); + FAIL_IF(push_inst16(compiler, 0x9001 | (saved_reg_list[1] << 8) /* str rX, [sp, #4] */)); + } + if (saved_reg_count >= 3) { + SLJIT_ASSERT(saved_reg_list[2] < 8); + FAIL_IF(push_inst16(compiler, 0x9002 | (saved_reg_list[2] << 8) /* str rX, [sp, #8] */)); + } + } + +#ifdef _WIN32 + FAIL_IF(push_inst16(compiler, MOV | SET_REGS44(TMP_REG1, SLJIT_R0))); + FAIL_IF(push_inst16(compiler, MOV | SET_REGS44(SLJIT_R0, SLJIT_R1))); + FAIL_IF(push_inst16(compiler, MOV | SET_REGS44(SLJIT_R1, TMP_REG1))); + FAIL_IF(sljit_emit_ijump(compiler, SLJIT_FAST_CALL, SLJIT_IMM, + ((op | 0x2) == SLJIT_DIV_UW ? SLJIT_FUNC_OFFSET(__rt_udiv) : SLJIT_FUNC_OFFSET(__rt_sdiv)))); +#elif defined(__GNUC__) + FAIL_IF(sljit_emit_ijump(compiler, SLJIT_FAST_CALL, SLJIT_IMM, + ((op | 0x2) == SLJIT_DIV_UW ? SLJIT_FUNC_OFFSET(__aeabi_uidivmod) : SLJIT_FUNC_OFFSET(__aeabi_idivmod)))); +#else +#error "Software divmod functions are needed" +#endif + + if (saved_reg_count > 0) { + if (saved_reg_count >= 3) { + SLJIT_ASSERT(saved_reg_list[2] < 8); + FAIL_IF(push_inst16(compiler, 0x9802 | (saved_reg_list[2] << 8) /* ldr rX, [sp, #8] */)); + } + if (saved_reg_count >= 2) { + SLJIT_ASSERT(saved_reg_list[1] < 8); + FAIL_IF(push_inst16(compiler, 0x9801 | (saved_reg_list[1] << 8) /* ldr rX, [sp, #4] */)); + } + return push_inst32(compiler, 0xf85d0b00 | (saved_reg_count >= 3 ? 16 : 8) + | (saved_reg_list[0] << 12) /* ldr rX, [sp], #8/16 */); + } + return SLJIT_SUCCESS; +#endif /* __ARM_FEATURE_IDIV || __ARM_ARCH_EXT_IDIV__ */ + } + + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + sljit_s32 dst_r, flags; + sljit_s32 op_flags = GET_ALL_FLAGS(op); + + CHECK_ERROR(); + CHECK(check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw)); + ADJUST_LOCAL_OFFSET(dst, dstw); + ADJUST_LOCAL_OFFSET(src, srcw); + + if (dst == SLJIT_UNUSED && !HAS_FLAGS(op)) { + /* Since TMP_PC has index 15, IS_2_LO_REGS and IS_3_LO_REGS checks always fail. */ + if (op <= SLJIT_MOV_P && (src & SLJIT_MEM)) + return emit_op_mem(compiler, PRELOAD, TMP_PC, src, srcw, TMP_REG1); + return SLJIT_SUCCESS; + } + + dst_r = SLOW_IS_REG(dst) ? dst : TMP_REG1; + + op = GET_OPCODE(op); + if (op >= SLJIT_MOV && op <= SLJIT_MOV_P) { + switch (op) { + case SLJIT_MOV: + case SLJIT_MOV_U32: + case SLJIT_MOV_S32: + case SLJIT_MOV_P: + flags = WORD_SIZE; + break; + case SLJIT_MOV_U8: + flags = BYTE_SIZE; + if (src & SLJIT_IMM) + srcw = (sljit_u8)srcw; + break; + case SLJIT_MOV_S8: + flags = BYTE_SIZE | SIGNED; + if (src & SLJIT_IMM) + srcw = (sljit_s8)srcw; + break; + case SLJIT_MOV_U16: + flags = HALF_SIZE; + if (src & SLJIT_IMM) + srcw = (sljit_u16)srcw; + break; + case SLJIT_MOV_S16: + flags = HALF_SIZE | SIGNED; + if (src & SLJIT_IMM) + srcw = (sljit_s16)srcw; + break; + default: + SLJIT_UNREACHABLE(); + flags = 0; + break; + } + + if (src & SLJIT_IMM) + FAIL_IF(emit_op_imm(compiler, SLJIT_MOV | ARG2_IMM, dst_r, TMP_REG2, srcw)); + else if (src & SLJIT_MEM) { + FAIL_IF(emit_op_mem(compiler, flags, dst_r, src, srcw, TMP_REG1)); + } else { + if (dst_r != TMP_REG1) + return emit_op_imm(compiler, op, dst_r, TMP_REG2, src); + dst_r = src; + } + + if (!(dst & SLJIT_MEM)) + return SLJIT_SUCCESS; + + return emit_op_mem(compiler, flags | STORE, dst_r, dst, dstw, TMP_REG2); + } + + if (op == SLJIT_NEG) { +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \ + || (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + compiler->skip_checks = 1; +#endif + return sljit_emit_op2(compiler, SLJIT_SUB | op_flags, dst, dstw, SLJIT_IMM, 0, src, srcw); + } + + flags = HAS_FLAGS(op_flags) ? SET_FLAGS : 0; + + if (src & SLJIT_MEM) { + FAIL_IF(emit_op_mem(compiler, WORD_SIZE, TMP_REG1, src, srcw, TMP_REG1)); + src = TMP_REG1; + } + + emit_op_imm(compiler, flags | op, dst_r, TMP_REG2, src); + + if (SLJIT_UNLIKELY(dst & SLJIT_MEM)) + return emit_op_mem(compiler, flags | STORE, dst_r, dst, dstw, TMP_REG2); + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + sljit_s32 dst_reg, flags, src2_reg; + + CHECK_ERROR(); + CHECK(check_sljit_emit_op2(compiler, op, dst, dstw, src1, src1w, src2, src2w)); + ADJUST_LOCAL_OFFSET(dst, dstw); + ADJUST_LOCAL_OFFSET(src1, src1w); + ADJUST_LOCAL_OFFSET(src2, src2w); + + if (dst == SLJIT_UNUSED && !HAS_FLAGS(op)) + return SLJIT_SUCCESS; + + dst_reg = SLOW_IS_REG(dst) ? dst : TMP_REG1; + flags = HAS_FLAGS(op) ? SET_FLAGS : 0; + + if (src1 & SLJIT_IMM) + flags |= ARG1_IMM; + else if (src1 & SLJIT_MEM) { + emit_op_mem(compiler, WORD_SIZE, TMP_REG1, src1, src1w, TMP_REG1); + src1w = TMP_REG1; + } + else + src1w = src1; + + if (src2 & SLJIT_IMM) + flags |= ARG2_IMM; + else if (src2 & SLJIT_MEM) { + src2_reg = (!(flags & ARG1_IMM) && (src1w == TMP_REG1)) ? TMP_REG2 : TMP_REG1; + emit_op_mem(compiler, WORD_SIZE, src2_reg, src2, src2w, src2_reg); + src2w = src2_reg; + } + else + src2w = src2; + + if (dst == SLJIT_UNUSED) + flags |= UNUSED_RETURN; + + emit_op_imm(compiler, flags | GET_OPCODE(op), dst_reg, src1w, src2w); + + if (!(dst & SLJIT_MEM)) + return SLJIT_SUCCESS; + return emit_op_mem(compiler, WORD_SIZE | STORE, dst_reg, dst, dstw, TMP_REG2); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg) +{ + CHECK_REG_INDEX(check_sljit_get_register_index(reg)); + return reg_map[reg]; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_float_register_index(sljit_s32 reg) +{ + CHECK_REG_INDEX(check_sljit_get_float_register_index(reg)); + return (freg_map[reg] << 1); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler, + void *instruction, sljit_s32 size) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_op_custom(compiler, instruction, size)); + + if (size == 2) + return push_inst16(compiler, *(sljit_u16*)instruction); + return push_inst32(compiler, *(sljit_ins*)instruction); +} + +/* --------------------------------------------------------------------- */ +/* Floating point operators */ +/* --------------------------------------------------------------------- */ + +#define FPU_LOAD (1 << 20) + +static sljit_s32 emit_fop_mem(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg, sljit_s32 arg, sljit_sw argw) +{ + sljit_uw imm; + sljit_sw inst = VSTR_F32 | (flags & (SLJIT_F32_OP | FPU_LOAD)); + + SLJIT_ASSERT(arg & SLJIT_MEM); + + /* Fast loads and stores. */ + if (SLJIT_UNLIKELY(arg & OFFS_REG_MASK)) { + FAIL_IF(push_inst32(compiler, ADD_W | RD4(TMP_REG1) | RN4(arg & REG_MASK) | RM4(OFFS_REG(arg)) | ((argw & 0x3) << 6))); + arg = SLJIT_MEM | TMP_REG1; + argw = 0; + } + + if ((arg & REG_MASK) && (argw & 0x3) == 0) { + if (!(argw & ~0x3fc)) + return push_inst32(compiler, inst | 0x800000 | RN4(arg & REG_MASK) | DD4(reg) | (argw >> 2)); + if (!(-argw & ~0x3fc)) + return push_inst32(compiler, inst | RN4(arg & REG_MASK) | DD4(reg) | (-argw >> 2)); + } + + if (arg & REG_MASK) { + if (emit_set_delta(compiler, TMP_REG1, arg & REG_MASK, argw) != SLJIT_ERR_UNSUPPORTED) { + FAIL_IF(compiler->error); + return push_inst32(compiler, inst | 0x800000 | RN4(TMP_REG1) | DD4(reg)); + } + imm = get_imm(argw & ~0x3fc); + if (imm != INVALID_IMM) { + FAIL_IF(push_inst32(compiler, ADD_WI | RD4(TMP_REG1) | RN4(arg & REG_MASK) | imm)); + return push_inst32(compiler, inst | 0x800000 | RN4(TMP_REG1) | DD4(reg) | ((argw & 0x3fc) >> 2)); + } + imm = get_imm(-argw & ~0x3fc); + if (imm != INVALID_IMM) { + argw = -argw; + FAIL_IF(push_inst32(compiler, SUB_WI | RD4(TMP_REG1) | RN4(arg & REG_MASK) | imm)); + return push_inst32(compiler, inst | RN4(TMP_REG1) | DD4(reg) | ((argw & 0x3fc) >> 2)); + } + } + + FAIL_IF(load_immediate(compiler, TMP_REG1, argw)); + if (arg & REG_MASK) + FAIL_IF(push_inst16(compiler, ADD | SET_REGS44(TMP_REG1, (arg & REG_MASK)))); + return push_inst32(compiler, inst | 0x800000 | RN4(TMP_REG1) | DD4(reg)); +} + +static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_sw_from_f64(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + op ^= SLJIT_F32_OP; + + if (src & SLJIT_MEM) { + FAIL_IF(emit_fop_mem(compiler, (op & SLJIT_F32_OP) | FPU_LOAD, TMP_FREG1, src, srcw)); + src = TMP_FREG1; + } + + FAIL_IF(push_inst32(compiler, VCVT_S32_F32 | (op & SLJIT_F32_OP) | DD4(TMP_FREG1) | DM4(src))); + + if (FAST_IS_REG(dst)) + return push_inst32(compiler, VMOV | (1 << 20) | RT4(dst) | DN4(TMP_FREG1)); + + /* Store the integer value from a VFP register. */ + return emit_fop_mem(compiler, 0, TMP_FREG1, dst, dstw); +} + +static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1; + + op ^= SLJIT_F32_OP; + + if (FAST_IS_REG(src)) + FAIL_IF(push_inst32(compiler, VMOV | RT4(src) | DN4(TMP_FREG1))); + else if (src & SLJIT_MEM) { + /* Load the integer value into a VFP register. */ + FAIL_IF(emit_fop_mem(compiler, FPU_LOAD, TMP_FREG1, src, srcw)); + } + else { + FAIL_IF(load_immediate(compiler, TMP_REG1, srcw)); + FAIL_IF(push_inst32(compiler, VMOV | RT4(TMP_REG1) | DN4(TMP_FREG1))); + } + + FAIL_IF(push_inst32(compiler, VCVT_F32_S32 | (op & SLJIT_F32_OP) | DD4(dst_r) | DM4(TMP_FREG1))); + + if (dst & SLJIT_MEM) + return emit_fop_mem(compiler, (op & SLJIT_F32_OP), TMP_FREG1, dst, dstw); + return SLJIT_SUCCESS; +} + +static SLJIT_INLINE sljit_s32 sljit_emit_fop1_cmp(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + op ^= SLJIT_F32_OP; + + if (src1 & SLJIT_MEM) { + emit_fop_mem(compiler, (op & SLJIT_F32_OP) | FPU_LOAD, TMP_FREG1, src1, src1w); + src1 = TMP_FREG1; + } + + if (src2 & SLJIT_MEM) { + emit_fop_mem(compiler, (op & SLJIT_F32_OP) | FPU_LOAD, TMP_FREG2, src2, src2w); + src2 = TMP_FREG2; + } + + FAIL_IF(push_inst32(compiler, VCMP_F32 | (op & SLJIT_F32_OP) | DD4(src1) | DM4(src2))); + return push_inst32(compiler, VMRS); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + sljit_s32 dst_r; + + CHECK_ERROR(); + + SLJIT_COMPILE_ASSERT((SLJIT_F32_OP == 0x100), float_transfer_bit_error); + SELECT_FOP1_OPERATION_WITH_CHECKS(compiler, op, dst, dstw, src, srcw); + + dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1; + + if (GET_OPCODE(op) != SLJIT_CONV_F64_FROM_F32) + op ^= SLJIT_F32_OP; + + if (src & SLJIT_MEM) { + emit_fop_mem(compiler, (op & SLJIT_F32_OP) | FPU_LOAD, dst_r, src, srcw); + src = dst_r; + } + + switch (GET_OPCODE(op)) { + case SLJIT_MOV_F64: + if (src != dst_r) { + if (dst_r != TMP_FREG1) + FAIL_IF(push_inst32(compiler, VMOV_F32 | (op & SLJIT_F32_OP) | DD4(dst_r) | DM4(src))); + else + dst_r = src; + } + break; + case SLJIT_NEG_F64: + FAIL_IF(push_inst32(compiler, VNEG_F32 | (op & SLJIT_F32_OP) | DD4(dst_r) | DM4(src))); + break; + case SLJIT_ABS_F64: + FAIL_IF(push_inst32(compiler, VABS_F32 | (op & SLJIT_F32_OP) | DD4(dst_r) | DM4(src))); + break; + case SLJIT_CONV_F64_FROM_F32: + FAIL_IF(push_inst32(compiler, VCVT_F64_F32 | (op & SLJIT_F32_OP) | DD4(dst_r) | DM4(src))); + op ^= SLJIT_F32_OP; + break; + } + + if (dst & SLJIT_MEM) + return emit_fop_mem(compiler, (op & SLJIT_F32_OP), dst_r, dst, dstw); + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + sljit_s32 dst_r; + + CHECK_ERROR(); + CHECK(check_sljit_emit_fop2(compiler, op, dst, dstw, src1, src1w, src2, src2w)); + ADJUST_LOCAL_OFFSET(dst, dstw); + ADJUST_LOCAL_OFFSET(src1, src1w); + ADJUST_LOCAL_OFFSET(src2, src2w); + + op ^= SLJIT_F32_OP; + + dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1; + if (src1 & SLJIT_MEM) { + emit_fop_mem(compiler, (op & SLJIT_F32_OP) | FPU_LOAD, TMP_FREG1, src1, src1w); + src1 = TMP_FREG1; + } + if (src2 & SLJIT_MEM) { + emit_fop_mem(compiler, (op & SLJIT_F32_OP) | FPU_LOAD, TMP_FREG2, src2, src2w); + src2 = TMP_FREG2; + } + + switch (GET_OPCODE(op)) { + case SLJIT_ADD_F64: + FAIL_IF(push_inst32(compiler, VADD_F32 | (op & SLJIT_F32_OP) | DD4(dst_r) | DN4(src1) | DM4(src2))); + break; + case SLJIT_SUB_F64: + FAIL_IF(push_inst32(compiler, VSUB_F32 | (op & SLJIT_F32_OP) | DD4(dst_r) | DN4(src1) | DM4(src2))); + break; + case SLJIT_MUL_F64: + FAIL_IF(push_inst32(compiler, VMUL_F32 | (op & SLJIT_F32_OP) | DD4(dst_r) | DN4(src1) | DM4(src2))); + break; + case SLJIT_DIV_F64: + FAIL_IF(push_inst32(compiler, VDIV_F32 | (op & SLJIT_F32_OP) | DD4(dst_r) | DN4(src1) | DM4(src2))); + break; + } + + if (!(dst & SLJIT_MEM)) + return SLJIT_SUCCESS; + return emit_fop_mem(compiler, (op & SLJIT_F32_OP), TMP_FREG1, dst, dstw); +} + +#undef FPU_LOAD + +/* --------------------------------------------------------------------- */ +/* Other instructions */ +/* --------------------------------------------------------------------- */ + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_fast_enter(compiler, dst, dstw)); + ADJUST_LOCAL_OFFSET(dst, dstw); + + SLJIT_ASSERT(reg_map[TMP_REG2] == 14); + + if (FAST_IS_REG(dst)) + return push_inst16(compiler, MOV | SET_REGS44(dst, TMP_REG2)); + + /* Memory. */ + return emit_op_mem(compiler, WORD_SIZE | STORE, TMP_REG2, dst, dstw, TMP_REG1); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_fast_return(compiler, src, srcw)); + ADJUST_LOCAL_OFFSET(src, srcw); + + SLJIT_ASSERT(reg_map[TMP_REG2] == 14); + + if (FAST_IS_REG(src)) + FAIL_IF(push_inst16(compiler, MOV | SET_REGS44(TMP_REG2, src))); + else + FAIL_IF(emit_op_mem(compiler, WORD_SIZE, TMP_REG2, src, srcw, TMP_REG2)); + + return push_inst16(compiler, BX | RN3(TMP_REG2)); +} + +/* --------------------------------------------------------------------- */ +/* Conditional instructions */ +/* --------------------------------------------------------------------- */ + +static sljit_uw get_cc(sljit_s32 type) +{ + switch (type) { + case SLJIT_EQUAL: + case SLJIT_MUL_NOT_OVERFLOW: + case SLJIT_EQUAL_F64: + return 0x0; + + case SLJIT_NOT_EQUAL: + case SLJIT_MUL_OVERFLOW: + case SLJIT_NOT_EQUAL_F64: + return 0x1; + + case SLJIT_LESS: + case SLJIT_LESS_F64: + return 0x3; + + case SLJIT_GREATER_EQUAL: + case SLJIT_GREATER_EQUAL_F64: + return 0x2; + + case SLJIT_GREATER: + case SLJIT_GREATER_F64: + return 0x8; + + case SLJIT_LESS_EQUAL: + case SLJIT_LESS_EQUAL_F64: + return 0x9; + + case SLJIT_SIG_LESS: + return 0xb; + + case SLJIT_SIG_GREATER_EQUAL: + return 0xa; + + case SLJIT_SIG_GREATER: + return 0xc; + + case SLJIT_SIG_LESS_EQUAL: + return 0xd; + + case SLJIT_OVERFLOW: + case SLJIT_UNORDERED_F64: + return 0x6; + + case SLJIT_NOT_OVERFLOW: + case SLJIT_ORDERED_F64: + return 0x7; + + default: /* SLJIT_JUMP */ + SLJIT_UNREACHABLE(); + return 0xe; + } +} + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compiler *compiler) +{ + struct sljit_label *label; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_label(compiler)); + + if (compiler->last_label && compiler->last_label->size == compiler->size) + return compiler->last_label; + + label = (struct sljit_label*)ensure_abuf(compiler, sizeof(struct sljit_label)); + PTR_FAIL_IF(!label); + set_label(label, compiler); + return label; +} + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, sljit_s32 type) +{ + struct sljit_jump *jump; + sljit_ins cc; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_jump(compiler, type)); + + jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump)); + PTR_FAIL_IF(!jump); + set_jump(jump, compiler, type & SLJIT_REWRITABLE_JUMP); + type &= 0xff; + + PTR_FAIL_IF(emit_imm32_const(compiler, TMP_REG1, 0)); + if (type < SLJIT_JUMP) { + jump->flags |= IS_COND; + cc = get_cc(type); + jump->flags |= cc << 8; + PTR_FAIL_IF(push_inst16(compiler, IT | (cc << 4) | 0x8)); + } + + jump->addr = compiler->size; + if (type <= SLJIT_JUMP) + PTR_FAIL_IF(push_inst16(compiler, BX | RN3(TMP_REG1))); + else { + jump->flags |= IS_BL; + PTR_FAIL_IF(push_inst16(compiler, BLX | RN3(TMP_REG1))); + } + + return jump; +} + +#ifdef __SOFTFP__ + +static sljit_s32 softfloat_call_with_args(struct sljit_compiler *compiler, sljit_s32 arg_types, sljit_s32 *src) +{ + sljit_s32 stack_offset = 0; + sljit_s32 arg_count = 0; + sljit_s32 word_arg_offset = 0; + sljit_s32 float_arg_count = 0; + sljit_s32 types = 0; + sljit_s32 src_offset = 4 * sizeof(sljit_sw); + sljit_u8 offsets[4]; + + if (src && FAST_IS_REG(*src)) + src_offset = reg_map[*src] * sizeof(sljit_sw); + + arg_types >>= SLJIT_DEF_SHIFT; + + while (arg_types) { + types = (types << SLJIT_DEF_SHIFT) | (arg_types & SLJIT_DEF_MASK); + + switch (arg_types & SLJIT_DEF_MASK) { + case SLJIT_ARG_TYPE_F32: + offsets[arg_count] = (sljit_u8)stack_offset; + stack_offset += sizeof(sljit_f32); + arg_count++; + float_arg_count++; + break; + case SLJIT_ARG_TYPE_F64: + if (stack_offset & 0x7) + stack_offset += sizeof(sljit_sw); + offsets[arg_count] = (sljit_u8)stack_offset; + stack_offset += sizeof(sljit_f64); + arg_count++; + float_arg_count++; + break; + default: + offsets[arg_count] = (sljit_u8)stack_offset; + stack_offset += sizeof(sljit_sw); + arg_count++; + word_arg_offset += sizeof(sljit_sw); + break; + } + + arg_types >>= SLJIT_DEF_SHIFT; + } + + if (stack_offset > 16) + FAIL_IF(push_inst16(compiler, SUB_SP | (((stack_offset - 16) + 0x7) & ~0x7) >> 2)); + + SLJIT_ASSERT(reg_map[TMP_REG1] == 12); + + /* Process arguments in reversed direction. */ + while (types) { + switch (types & SLJIT_DEF_MASK) { + case SLJIT_ARG_TYPE_F32: + arg_count--; + float_arg_count--; + stack_offset = offsets[arg_count]; + + if (stack_offset < 16) { + if (src_offset == stack_offset) { + FAIL_IF(push_inst16(compiler, MOV | (src_offset << 1) | 4 | (1 << 7))); + *src = TMP_REG1; + } + FAIL_IF(push_inst32(compiler, VMOV | 0x100000 | (float_arg_count << 16) | (stack_offset << 10))); + } else + FAIL_IF(push_inst32(compiler, VSTR_F32 | 0x800000 | RN4(SLJIT_SP) | (float_arg_count << 12) | ((stack_offset - 16) >> 2))); + break; + case SLJIT_ARG_TYPE_F64: + arg_count--; + float_arg_count--; + stack_offset = offsets[arg_count]; + + SLJIT_ASSERT((stack_offset & 0x7) == 0); + + if (stack_offset < 16) { + if (src_offset == stack_offset || src_offset == stack_offset + sizeof(sljit_sw)) { + FAIL_IF(push_inst16(compiler, MOV | (src_offset << 1) | 4 | (1 << 7))); + *src = TMP_REG1; + } + FAIL_IF(push_inst32(compiler, VMOV2 | 0x100000 | (stack_offset << 10) | ((stack_offset + sizeof(sljit_sw)) << 14) | float_arg_count)); + } else + FAIL_IF(push_inst32(compiler, VSTR_F32 | 0x800100 | RN4(SLJIT_SP) | (float_arg_count << 12) | ((stack_offset - 16) >> 2))); + break; + default: + arg_count--; + word_arg_offset -= sizeof(sljit_sw); + stack_offset = offsets[arg_count]; + + SLJIT_ASSERT(stack_offset >= word_arg_offset); + + if (stack_offset != word_arg_offset) { + if (stack_offset < 16) { + if (src_offset == stack_offset) { + FAIL_IF(push_inst16(compiler, MOV | (src_offset << 1) | 4 | (1 << 7))); + *src = TMP_REG1; + } + else if (src_offset == word_arg_offset) { + *src = 1 + (stack_offset >> 2); + src_offset = stack_offset; + } + FAIL_IF(push_inst16(compiler, MOV | (stack_offset >> 2) | (word_arg_offset << 1))); + } else + FAIL_IF(push_inst16(compiler, STR_SP | (word_arg_offset << 6) | ((stack_offset - 16) >> 2))); + } + break; + } + + types >>= SLJIT_DEF_SHIFT; + } + + return SLJIT_SUCCESS; +} + +static sljit_s32 softfloat_post_call_with_args(struct sljit_compiler *compiler, sljit_s32 arg_types) +{ + sljit_s32 stack_size = 0; + + if ((arg_types & SLJIT_DEF_MASK) == SLJIT_ARG_TYPE_F32) + FAIL_IF(push_inst32(compiler, VMOV | (0 << 16) | (0 << 12))); + if ((arg_types & SLJIT_DEF_MASK) == SLJIT_ARG_TYPE_F64) + FAIL_IF(push_inst32(compiler, VMOV2 | (1 << 16) | (0 << 12) | 0)); + + arg_types >>= SLJIT_DEF_SHIFT; + + while (arg_types) { + switch (arg_types & SLJIT_DEF_MASK) { + case SLJIT_ARG_TYPE_F32: + stack_size += sizeof(sljit_f32); + break; + case SLJIT_ARG_TYPE_F64: + if (stack_size & 0x7) + stack_size += sizeof(sljit_sw); + stack_size += sizeof(sljit_f64); + break; + default: + stack_size += sizeof(sljit_sw); + break; + } + + arg_types >>= SLJIT_DEF_SHIFT; + } + + if (stack_size <= 16) + return SLJIT_SUCCESS; + + return push_inst16(compiler, ADD_SP | ((((stack_size - 16) + 0x7) & ~0x7) >> 2)); +} + +#else + +static sljit_s32 hardfloat_call_with_args(struct sljit_compiler *compiler, sljit_s32 arg_types) +{ + sljit_u32 remap = 0; + sljit_u32 offset = 0; + sljit_u32 new_offset, mask; + + /* Remove return value. */ + arg_types >>= SLJIT_DEF_SHIFT; + + while (arg_types) { + if ((arg_types & SLJIT_DEF_MASK) == SLJIT_ARG_TYPE_F32) { + new_offset = 0; + mask = 1; + + while (remap & mask) { + new_offset++; + mask <<= 1; + } + remap |= mask; + + if (offset != new_offset) + FAIL_IF(push_inst32(compiler, VMOV_F32 | DD4((new_offset >> 1) + 1) + | ((new_offset & 0x1) ? 0x400000 : 0) | DM4((offset >> 1) + 1))); + + offset += 2; + } + else if ((arg_types & SLJIT_DEF_MASK) == SLJIT_ARG_TYPE_F64) { + new_offset = 0; + mask = 3; + + while (remap & mask) { + new_offset += 2; + mask <<= 2; + } + remap |= mask; + + if (offset != new_offset) + FAIL_IF(push_inst32(compiler, VMOV_F32 | SLJIT_F32_OP | DD4((new_offset >> 1) + 1) | DM4((offset >> 1) + 1))); + + offset += 2; + } + arg_types >>= SLJIT_DEF_SHIFT; + } + + return SLJIT_SUCCESS; +} + +#endif + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_call(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 arg_types) +{ +#ifdef __SOFTFP__ + struct sljit_jump *jump; +#endif + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_call(compiler, type, arg_types)); + +#ifdef __SOFTFP__ + PTR_FAIL_IF(softfloat_call_with_args(compiler, arg_types, NULL)); + +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \ + || (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + compiler->skip_checks = 1; +#endif + + jump = sljit_emit_jump(compiler, type); + PTR_FAIL_IF(jump == NULL); + + PTR_FAIL_IF(softfloat_post_call_with_args(compiler, arg_types)); + return jump; +#else + PTR_FAIL_IF(hardfloat_call_with_args(compiler, arg_types)); + +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \ + || (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + compiler->skip_checks = 1; +#endif + + return sljit_emit_jump(compiler, type); +#endif +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 src, sljit_sw srcw) +{ + struct sljit_jump *jump; + + CHECK_ERROR(); + CHECK(check_sljit_emit_ijump(compiler, type, src, srcw)); + ADJUST_LOCAL_OFFSET(src, srcw); + + SLJIT_ASSERT(reg_map[TMP_REG1] != 14); + + if (!(src & SLJIT_IMM)) { + if (FAST_IS_REG(src)) { + SLJIT_ASSERT(reg_map[src] != 14); + return push_inst16(compiler, (type <= SLJIT_JUMP ? BX : BLX) | RN3(src)); + } + + FAIL_IF(emit_op_mem(compiler, WORD_SIZE, type <= SLJIT_JUMP ? TMP_PC : TMP_REG1, src, srcw, TMP_REG1)); + if (type >= SLJIT_FAST_CALL) + return push_inst16(compiler, BLX | RN3(TMP_REG1)); + } + + /* These jumps are converted to jump/call instructions when possible. */ + jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump)); + FAIL_IF(!jump); + set_jump(jump, compiler, JUMP_ADDR | ((type >= SLJIT_FAST_CALL) ? IS_BL : 0)); + jump->u.target = srcw; + + FAIL_IF(emit_imm32_const(compiler, TMP_REG1, 0)); + jump->addr = compiler->size; + return push_inst16(compiler, (type <= SLJIT_JUMP ? BX : BLX) | RN3(TMP_REG1)); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_icall(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 arg_types, + sljit_s32 src, sljit_sw srcw) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_icall(compiler, type, arg_types, src, srcw)); + +#ifdef __SOFTFP__ + if (src & SLJIT_MEM) { + FAIL_IF(emit_op_mem(compiler, WORD_SIZE, TMP_REG1, src, srcw, TMP_REG1)); + src = TMP_REG1; + } + + FAIL_IF(softfloat_call_with_args(compiler, arg_types, &src)); + +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \ + || (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + compiler->skip_checks = 1; +#endif + + FAIL_IF(sljit_emit_ijump(compiler, type, src, srcw)); + + return softfloat_post_call_with_args(compiler, arg_types); +#else /* !__SOFTFP__ */ + FAIL_IF(hardfloat_call_with_args(compiler, arg_types)); + +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \ + || (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + compiler->skip_checks = 1; +#endif + + return sljit_emit_ijump(compiler, type, src, srcw); +#endif /* __SOFTFP__ */ +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 type) +{ + sljit_s32 dst_r, flags = GET_ALL_FLAGS(op); + sljit_ins cc; + + CHECK_ERROR(); + CHECK(check_sljit_emit_op_flags(compiler, op, dst, dstw, type)); + ADJUST_LOCAL_OFFSET(dst, dstw); + + op = GET_OPCODE(op); + cc = get_cc(type & 0xff); + dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1; + + if (op < SLJIT_ADD) { + FAIL_IF(push_inst16(compiler, IT | (cc << 4) | (((cc & 0x1) ^ 0x1) << 3) | 0x4)); + if (reg_map[dst_r] > 7) { + FAIL_IF(push_inst32(compiler, MOV_WI | RD4(dst_r) | 1)); + FAIL_IF(push_inst32(compiler, MOV_WI | RD4(dst_r) | 0)); + } else { + /* The movsi (immediate) instruction does not set flags in IT block. */ + FAIL_IF(push_inst16(compiler, MOVSI | RDN3(dst_r) | 1)); + FAIL_IF(push_inst16(compiler, MOVSI | RDN3(dst_r) | 0)); + } + if (!(dst & SLJIT_MEM)) + return SLJIT_SUCCESS; + return emit_op_mem(compiler, WORD_SIZE | STORE, TMP_REG1, dst, dstw, TMP_REG2); + } + + if (dst & SLJIT_MEM) + FAIL_IF(emit_op_mem(compiler, WORD_SIZE, TMP_REG1, dst, dstw, TMP_REG2)); + + if (op == SLJIT_AND) { + FAIL_IF(push_inst16(compiler, IT | (cc << 4) | (((cc & 0x1) ^ 0x1) << 3) | 0x4)); + FAIL_IF(push_inst32(compiler, ANDI | RN4(dst_r) | RD4(dst_r) | 1)); + FAIL_IF(push_inst32(compiler, ANDI | RN4(dst_r) | RD4(dst_r) | 0)); + } + else { + FAIL_IF(push_inst16(compiler, IT | (cc << 4) | 0x8)); + FAIL_IF(push_inst32(compiler, ((op == SLJIT_OR) ? ORRI : EORI) | RN4(dst_r) | RD4(dst_r) | 1)); + } + + if (dst & SLJIT_MEM) + FAIL_IF(emit_op_mem(compiler, WORD_SIZE | STORE, TMP_REG1, dst, dstw, TMP_REG2)); + + if (!(flags & SLJIT_SET_Z)) + return SLJIT_SUCCESS; + + /* The condition must always be set, even if the ORR/EORI is not executed above. */ + return push_inst32(compiler, MOV_W | SET_FLAGS | RD4(TMP_REG1) | RM4(dst_r)); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 dst_reg, + sljit_s32 src, sljit_sw srcw) +{ + sljit_uw cc, tmp; + + CHECK_ERROR(); + CHECK(check_sljit_emit_cmov(compiler, type, dst_reg, src, srcw)); + + dst_reg &= ~SLJIT_I32_OP; + + cc = get_cc(type & 0xff); + + if (!(src & SLJIT_IMM)) { + FAIL_IF(push_inst16(compiler, IT | (cc << 4) | 0x8)); + return push_inst16(compiler, MOV | SET_REGS44(dst_reg, src)); + } + + tmp = (sljit_uw) srcw; + + if (tmp < 0x10000) { + /* set low 16 bits, set hi 16 bits to 0. */ + FAIL_IF(push_inst16(compiler, IT | (cc << 4) | 0x8)); + return push_inst32(compiler, MOVW | RD4(dst_reg) + | COPY_BITS(tmp, 12, 16, 4) | COPY_BITS(tmp, 11, 26, 1) | COPY_BITS(tmp, 8, 12, 3) | (tmp & 0xff)); + } + + tmp = get_imm(srcw); + if (tmp != INVALID_IMM) { + FAIL_IF(push_inst16(compiler, IT | (cc << 4) | 0x8)); + return push_inst32(compiler, MOV_WI | RD4(dst_reg) | tmp); + } + + tmp = get_imm(~srcw); + if (tmp != INVALID_IMM) { + FAIL_IF(push_inst16(compiler, IT | (cc << 4) | 0x8)); + return push_inst32(compiler, MVN_WI | RD4(dst_reg) | tmp); + } + + FAIL_IF(push_inst16(compiler, IT | (cc << 4) | ((cc & 0x1) << 3) | 0x4)); + + tmp = (sljit_uw) srcw; + FAIL_IF(push_inst32(compiler, MOVW | RD4(dst_reg) + | COPY_BITS(tmp, 12, 16, 4) | COPY_BITS(tmp, 11, 26, 1) | COPY_BITS(tmp, 8, 12, 3) | (tmp & 0xff))); + return push_inst32(compiler, MOVT | RD4(dst_reg) + | COPY_BITS(tmp, 12 + 16, 16, 4) | COPY_BITS(tmp, 11 + 16, 26, 1) | COPY_BITS(tmp, 8 + 16, 12, 3) | ((tmp & 0xff0000) >> 16)); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 reg, + sljit_s32 mem, sljit_sw memw) +{ + sljit_s32 flags; + sljit_ins inst; + + CHECK_ERROR(); + CHECK(check_sljit_emit_mem(compiler, type, reg, mem, memw)); + + if ((mem & OFFS_REG_MASK) || (memw > 255 && memw < -255)) + return SLJIT_ERR_UNSUPPORTED; + + if (type & SLJIT_MEM_SUPP) + return SLJIT_SUCCESS; + + switch (type & 0xff) { + case SLJIT_MOV: + case SLJIT_MOV_U32: + case SLJIT_MOV_S32: + case SLJIT_MOV_P: + flags = WORD_SIZE; + break; + case SLJIT_MOV_U8: + flags = BYTE_SIZE; + break; + case SLJIT_MOV_S8: + flags = BYTE_SIZE | SIGNED; + break; + case SLJIT_MOV_U16: + flags = HALF_SIZE; + break; + case SLJIT_MOV_S16: + flags = HALF_SIZE | SIGNED; + break; + default: + SLJIT_UNREACHABLE(); + flags = WORD_SIZE; + break; + } + + if (type & SLJIT_MEM_STORE) + flags |= STORE; + + inst = sljit_mem32[flags] | 0x900; + + if (type & SLJIT_MEM_PRE) + inst |= 0x400; + + if (memw >= 0) + inst |= 0x200; + else + memw = -memw; + + return push_inst32(compiler, inst | RT4(reg) | RN4(mem & REG_MASK) | memw); +} + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw init_value) +{ + struct sljit_const *const_; + sljit_s32 dst_r; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value)); + ADJUST_LOCAL_OFFSET(dst, dstw); + + const_ = (struct sljit_const*)ensure_abuf(compiler, sizeof(struct sljit_const)); + PTR_FAIL_IF(!const_); + set_const(const_, compiler); + + dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1; + PTR_FAIL_IF(emit_imm32_const(compiler, dst_r, init_value)); + + if (dst & SLJIT_MEM) + PTR_FAIL_IF(emit_op_mem(compiler, WORD_SIZE | STORE, dst_r, dst, dstw, TMP_REG2)); + return const_; +} + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_put_label* sljit_emit_put_label(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw) +{ + struct sljit_put_label *put_label; + sljit_s32 dst_r; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_put_label(compiler, dst, dstw)); + ADJUST_LOCAL_OFFSET(dst, dstw); + + put_label = (struct sljit_put_label*)ensure_abuf(compiler, sizeof(struct sljit_put_label)); + PTR_FAIL_IF(!put_label); + set_put_label(put_label, compiler, 0); + + dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1; + PTR_FAIL_IF(emit_imm32_const(compiler, dst_r, 0)); + + if (dst & SLJIT_MEM) + PTR_FAIL_IF(emit_op_mem(compiler, WORD_SIZE | STORE, dst_r, dst, dstw, TMP_REG2)); + return put_label; +} + +SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset) +{ + sljit_u16 *inst = (sljit_u16*)addr; + modify_imm32_const(inst, new_target); + inst = (sljit_u16 *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset); + SLJIT_CACHE_FLUSH(inst, inst + 4); +} + +SLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_constant, sljit_sw executable_offset) +{ + sljit_u16 *inst = (sljit_u16*)addr; + modify_imm32_const(inst, new_constant); + inst = (sljit_u16 *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset); + SLJIT_CACHE_FLUSH(inst, inst + 4); +} diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeMIPS_32.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeMIPS_32.c new file mode 100755 index 000000000..16dec052f --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeMIPS_32.c @@ -0,0 +1,673 @@ +/* + * Stack-less Just-In-Time compiler + * + * Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* mips 32-bit arch dependent functions. */ + +static sljit_s32 load_immediate(struct sljit_compiler *compiler, sljit_s32 dst_ar, sljit_sw imm) +{ + if (!(imm & ~0xffff)) + return push_inst(compiler, ORI | SA(0) | TA(dst_ar) | IMM(imm), dst_ar); + + if (imm < 0 && imm >= SIMM_MIN) + return push_inst(compiler, ADDIU | SA(0) | TA(dst_ar) | IMM(imm), dst_ar); + + FAIL_IF(push_inst(compiler, LUI | TA(dst_ar) | IMM(imm >> 16), dst_ar)); + return (imm & 0xffff) ? push_inst(compiler, ORI | SA(dst_ar) | TA(dst_ar) | IMM(imm), dst_ar) : SLJIT_SUCCESS; +} + +#define EMIT_LOGICAL(op_imm, op_norm) \ + if (flags & SRC2_IMM) { \ + if (op & SLJIT_SET_Z) \ + FAIL_IF(push_inst(compiler, op_imm | S(src1) | TA(EQUAL_FLAG) | IMM(src2), EQUAL_FLAG)); \ + if (!(flags & UNUSED_DEST)) \ + FAIL_IF(push_inst(compiler, op_imm | S(src1) | T(dst) | IMM(src2), DR(dst))); \ + } \ + else { \ + if (op & SLJIT_SET_Z) \ + FAIL_IF(push_inst(compiler, op_norm | S(src1) | T(src2) | DA(EQUAL_FLAG), EQUAL_FLAG)); \ + if (!(flags & UNUSED_DEST)) \ + FAIL_IF(push_inst(compiler, op_norm | S(src1) | T(src2) | D(dst), DR(dst))); \ + } + +#define EMIT_SHIFT(op_imm, op_v) \ + if (flags & SRC2_IMM) { \ + if (op & SLJIT_SET_Z) \ + FAIL_IF(push_inst(compiler, op_imm | T(src1) | DA(EQUAL_FLAG) | SH_IMM(src2), EQUAL_FLAG)); \ + if (!(flags & UNUSED_DEST)) \ + FAIL_IF(push_inst(compiler, op_imm | T(src1) | D(dst) | SH_IMM(src2), DR(dst))); \ + } \ + else { \ + if (op & SLJIT_SET_Z) \ + FAIL_IF(push_inst(compiler, op_v | S(src2) | T(src1) | DA(EQUAL_FLAG), EQUAL_FLAG)); \ + if (!(flags & UNUSED_DEST)) \ + FAIL_IF(push_inst(compiler, op_v | S(src2) | T(src1) | D(dst), DR(dst))); \ + } + +static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 flags, + sljit_s32 dst, sljit_s32 src1, sljit_sw src2) +{ + sljit_s32 is_overflow, is_carry, is_handled; + + switch (GET_OPCODE(op)) { + case SLJIT_MOV: + case SLJIT_MOV_U32: + case SLJIT_MOV_S32: + case SLJIT_MOV_P: + SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); + if (dst != src2) + return push_inst(compiler, ADDU | S(src2) | TA(0) | D(dst), DR(dst)); + return SLJIT_SUCCESS; + + case SLJIT_MOV_U8: + case SLJIT_MOV_S8: + SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); + if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) { + if (op == SLJIT_MOV_S8) { +#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1) + return push_inst(compiler, SEB | T(src2) | D(dst), DR(dst)); +#else + FAIL_IF(push_inst(compiler, SLL | T(src2) | D(dst) | SH_IMM(24), DR(dst))); + return push_inst(compiler, SRA | T(dst) | D(dst) | SH_IMM(24), DR(dst)); +#endif + } + return push_inst(compiler, ANDI | S(src2) | T(dst) | IMM(0xff), DR(dst)); + } + else { + SLJIT_ASSERT(dst == src2); + } + return SLJIT_SUCCESS; + + case SLJIT_MOV_U16: + case SLJIT_MOV_S16: + SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); + if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) { + if (op == SLJIT_MOV_S16) { +#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1) + return push_inst(compiler, SEH | T(src2) | D(dst), DR(dst)); +#else + FAIL_IF(push_inst(compiler, SLL | T(src2) | D(dst) | SH_IMM(16), DR(dst))); + return push_inst(compiler, SRA | T(dst) | D(dst) | SH_IMM(16), DR(dst)); +#endif + } + return push_inst(compiler, ANDI | S(src2) | T(dst) | IMM(0xffff), DR(dst)); + } + else { + SLJIT_ASSERT(dst == src2); + } + return SLJIT_SUCCESS; + + case SLJIT_NOT: + SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); + if (op & SLJIT_SET_Z) + FAIL_IF(push_inst(compiler, NOR | S(src2) | T(src2) | DA(EQUAL_FLAG), EQUAL_FLAG)); + if (!(flags & UNUSED_DEST)) + FAIL_IF(push_inst(compiler, NOR | S(src2) | T(src2) | D(dst), DR(dst))); + return SLJIT_SUCCESS; + + case SLJIT_CLZ: + SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); +#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1) + if (op & SLJIT_SET_Z) + FAIL_IF(push_inst(compiler, CLZ | S(src2) | TA(EQUAL_FLAG) | DA(EQUAL_FLAG), EQUAL_FLAG)); + if (!(flags & UNUSED_DEST)) + FAIL_IF(push_inst(compiler, CLZ | S(src2) | T(dst) | D(dst), DR(dst))); +#else + if (SLJIT_UNLIKELY(flags & UNUSED_DEST)) { + FAIL_IF(push_inst(compiler, SRL | T(src2) | DA(EQUAL_FLAG) | SH_IMM(31), EQUAL_FLAG)); + return push_inst(compiler, XORI | SA(EQUAL_FLAG) | TA(EQUAL_FLAG) | IMM(1), EQUAL_FLAG); + } + /* Nearly all instructions are unmovable in the following sequence. */ + FAIL_IF(push_inst(compiler, ADDU | S(src2) | TA(0) | D(TMP_REG1), DR(TMP_REG1))); + /* Check zero. */ + FAIL_IF(push_inst(compiler, BEQ | S(TMP_REG1) | TA(0) | IMM(5), UNMOVABLE_INS)); + FAIL_IF(push_inst(compiler, ORI | SA(0) | T(dst) | IMM(32), UNMOVABLE_INS)); + FAIL_IF(push_inst(compiler, ADDIU | SA(0) | T(dst) | IMM(-1), DR(dst))); + /* Loop for searching the highest bit. */ + FAIL_IF(push_inst(compiler, ADDIU | S(dst) | T(dst) | IMM(1), DR(dst))); + FAIL_IF(push_inst(compiler, BGEZ | S(TMP_REG1) | IMM(-2), UNMOVABLE_INS)); + FAIL_IF(push_inst(compiler, SLL | T(TMP_REG1) | D(TMP_REG1) | SH_IMM(1), UNMOVABLE_INS)); +#endif + return SLJIT_SUCCESS; + + case SLJIT_ADD: + is_overflow = GET_FLAG_TYPE(op) == SLJIT_OVERFLOW; + is_carry = GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY); + + if (flags & SRC2_IMM) { + if (is_overflow) { + if (src2 >= 0) + FAIL_IF(push_inst(compiler, OR | S(src1) | T(src1) | DA(EQUAL_FLAG), EQUAL_FLAG)); + else + FAIL_IF(push_inst(compiler, NOR | S(src1) | T(src1) | DA(EQUAL_FLAG), EQUAL_FLAG)); + } + else if (op & SLJIT_SET_Z) + FAIL_IF(push_inst(compiler, ADDIU | S(src1) | TA(EQUAL_FLAG) | IMM(src2), EQUAL_FLAG)); + + if (is_overflow || is_carry) { + if (src2 >= 0) + FAIL_IF(push_inst(compiler, ORI | S(src1) | TA(OTHER_FLAG) | IMM(src2), OTHER_FLAG)); + else { + FAIL_IF(push_inst(compiler, ADDIU | SA(0) | TA(OTHER_FLAG) | IMM(src2), OTHER_FLAG)); + FAIL_IF(push_inst(compiler, OR | S(src1) | TA(OTHER_FLAG) | DA(OTHER_FLAG), OTHER_FLAG)); + } + } + /* dst may be the same as src1 or src2. */ + if (!(flags & UNUSED_DEST) || (op & VARIABLE_FLAG_MASK)) + FAIL_IF(push_inst(compiler, ADDIU | S(src1) | T(dst) | IMM(src2), DR(dst))); + } + else { + if (is_overflow) + FAIL_IF(push_inst(compiler, XOR | S(src1) | T(src2) | DA(EQUAL_FLAG), EQUAL_FLAG)); + else if (op & SLJIT_SET_Z) + FAIL_IF(push_inst(compiler, ADDU | S(src1) | T(src2) | DA(EQUAL_FLAG), EQUAL_FLAG)); + + if (is_overflow || is_carry) + FAIL_IF(push_inst(compiler, OR | S(src1) | T(src2) | DA(OTHER_FLAG), OTHER_FLAG)); + /* dst may be the same as src1 or src2. */ + if (!(flags & UNUSED_DEST) || (op & VARIABLE_FLAG_MASK)) + FAIL_IF(push_inst(compiler, ADDU | S(src1) | T(src2) | D(dst), DR(dst))); + } + + /* a + b >= a | b (otherwise, the carry should be set to 1). */ + if (is_overflow || is_carry) + FAIL_IF(push_inst(compiler, SLTU | S(dst) | TA(OTHER_FLAG) | DA(OTHER_FLAG), OTHER_FLAG)); + if (!is_overflow) + return SLJIT_SUCCESS; + FAIL_IF(push_inst(compiler, SLL | TA(OTHER_FLAG) | D(TMP_REG1) | SH_IMM(31), DR(TMP_REG1))); + FAIL_IF(push_inst(compiler, XOR | S(TMP_REG1) | TA(EQUAL_FLAG) | DA(EQUAL_FLAG), EQUAL_FLAG)); + FAIL_IF(push_inst(compiler, XOR | S(dst) | TA(EQUAL_FLAG) | DA(OTHER_FLAG), OTHER_FLAG)); + if (op & SLJIT_SET_Z) + FAIL_IF(push_inst(compiler, ADDU | S(dst) | TA(0) | DA(EQUAL_FLAG), EQUAL_FLAG)); + return push_inst(compiler, SRL | TA(OTHER_FLAG) | DA(OTHER_FLAG) | SH_IMM(31), OTHER_FLAG); + + case SLJIT_ADDC: + is_carry = GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY); + + if (flags & SRC2_IMM) { + if (is_carry) { + if (src2 >= 0) + FAIL_IF(push_inst(compiler, ORI | S(src1) | TA(EQUAL_FLAG) | IMM(src2), EQUAL_FLAG)); + else { + FAIL_IF(push_inst(compiler, ADDIU | SA(0) | TA(EQUAL_FLAG) | IMM(src2), EQUAL_FLAG)); + FAIL_IF(push_inst(compiler, OR | S(src1) | TA(EQUAL_FLAG) | DA(EQUAL_FLAG), EQUAL_FLAG)); + } + } + FAIL_IF(push_inst(compiler, ADDIU | S(src1) | T(dst) | IMM(src2), DR(dst))); + } else { + if (is_carry) + FAIL_IF(push_inst(compiler, OR | S(src1) | T(src2) | DA(EQUAL_FLAG), EQUAL_FLAG)); + /* dst may be the same as src1 or src2. */ + FAIL_IF(push_inst(compiler, ADDU | S(src1) | T(src2) | D(dst), DR(dst))); + } + if (is_carry) + FAIL_IF(push_inst(compiler, SLTU | S(dst) | TA(EQUAL_FLAG) | DA(EQUAL_FLAG), EQUAL_FLAG)); + + FAIL_IF(push_inst(compiler, ADDU | S(dst) | TA(OTHER_FLAG) | D(dst), DR(dst))); + if (!is_carry) + return SLJIT_SUCCESS; + + /* Set ULESS_FLAG (dst == 0) && (OTHER_FLAG == 1). */ + FAIL_IF(push_inst(compiler, SLTU | S(dst) | TA(OTHER_FLAG) | DA(OTHER_FLAG), OTHER_FLAG)); + /* Set carry flag. */ + return push_inst(compiler, OR | SA(OTHER_FLAG) | TA(EQUAL_FLAG) | DA(OTHER_FLAG), OTHER_FLAG); + + case SLJIT_SUB: + if ((flags & SRC2_IMM) && src2 == SIMM_MIN) { + FAIL_IF(push_inst(compiler, ADDIU | SA(0) | T(TMP_REG2) | IMM(src2), DR(TMP_REG2))); + src2 = TMP_REG2; + flags &= ~SRC2_IMM; + } + + is_handled = 0; + + if (flags & SRC2_IMM) { + if (GET_FLAG_TYPE(op) == SLJIT_LESS || GET_FLAG_TYPE(op) == SLJIT_GREATER_EQUAL) { + FAIL_IF(push_inst(compiler, SLTIU | S(src1) | TA(OTHER_FLAG) | IMM(src2), OTHER_FLAG)); + is_handled = 1; + } + else if (GET_FLAG_TYPE(op) == SLJIT_SIG_LESS || GET_FLAG_TYPE(op) == SLJIT_SIG_GREATER_EQUAL) { + FAIL_IF(push_inst(compiler, SLTI | S(src1) | TA(OTHER_FLAG) | IMM(src2), OTHER_FLAG)); + is_handled = 1; + } + } + + if (!is_handled && GET_FLAG_TYPE(op) >= SLJIT_LESS && GET_FLAG_TYPE(op) <= SLJIT_SIG_LESS_EQUAL) { + is_handled = 1; + + if (flags & SRC2_IMM) { + FAIL_IF(push_inst(compiler, ADDIU | SA(0) | T(TMP_REG2) | IMM(src2), DR(TMP_REG2))); + src2 = TMP_REG2; + flags &= ~SRC2_IMM; + } + + if (GET_FLAG_TYPE(op) == SLJIT_LESS || GET_FLAG_TYPE(op) == SLJIT_GREATER_EQUAL) { + FAIL_IF(push_inst(compiler, SLTU | S(src1) | T(src2) | DA(OTHER_FLAG), OTHER_FLAG)); + } + else if (GET_FLAG_TYPE(op) == SLJIT_GREATER || GET_FLAG_TYPE(op) == SLJIT_LESS_EQUAL) + { + FAIL_IF(push_inst(compiler, SLTU | S(src2) | T(src1) | DA(OTHER_FLAG), OTHER_FLAG)); + } + else if (GET_FLAG_TYPE(op) == SLJIT_SIG_LESS || GET_FLAG_TYPE(op) == SLJIT_SIG_GREATER_EQUAL) { + FAIL_IF(push_inst(compiler, SLT | S(src1) | T(src2) | DA(OTHER_FLAG), OTHER_FLAG)); + } + else if (GET_FLAG_TYPE(op) == SLJIT_SIG_GREATER || GET_FLAG_TYPE(op) == SLJIT_SIG_LESS_EQUAL) + { + FAIL_IF(push_inst(compiler, SLT | S(src2) | T(src1) | DA(OTHER_FLAG), OTHER_FLAG)); + } + } + + if (is_handled) { + if (flags & SRC2_IMM) { + if (op & SLJIT_SET_Z) + FAIL_IF(push_inst(compiler, ADDIU | S(src1) | TA(EQUAL_FLAG) | IMM(-src2), EQUAL_FLAG)); + if (!(flags & UNUSED_DEST)) + return push_inst(compiler, ADDIU | S(src1) | T(dst) | IMM(-src2), DR(dst)); + } + else { + if (op & SLJIT_SET_Z) + FAIL_IF(push_inst(compiler, SUBU | S(src1) | T(src2) | DA(EQUAL_FLAG), EQUAL_FLAG)); + if (!(flags & UNUSED_DEST)) + return push_inst(compiler, SUBU | S(src1) | T(src2) | D(dst), DR(dst)); + } + return SLJIT_SUCCESS; + } + + is_overflow = GET_FLAG_TYPE(op) == SLJIT_OVERFLOW; + is_carry = GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY); + + if (flags & SRC2_IMM) { + if (is_overflow) { + if (src2 >= 0) + FAIL_IF(push_inst(compiler, OR | S(src1) | T(src1) | DA(EQUAL_FLAG), EQUAL_FLAG)); + else + FAIL_IF(push_inst(compiler, NOR | S(src1) | T(src1) | DA(EQUAL_FLAG), EQUAL_FLAG)); + } + else if (op & SLJIT_SET_Z) + FAIL_IF(push_inst(compiler, ADDIU | S(src1) | TA(EQUAL_FLAG) | IMM(-src2), EQUAL_FLAG)); + + if (is_overflow || is_carry) + FAIL_IF(push_inst(compiler, SLTIU | S(src1) | TA(OTHER_FLAG) | IMM(src2), OTHER_FLAG)); + /* dst may be the same as src1 or src2. */ + if (!(flags & UNUSED_DEST) || (op & VARIABLE_FLAG_MASK)) + FAIL_IF(push_inst(compiler, ADDIU | S(src1) | T(dst) | IMM(-src2), DR(dst))); + } + else { + if (is_overflow) + FAIL_IF(push_inst(compiler, XOR | S(src1) | T(src2) | DA(EQUAL_FLAG), EQUAL_FLAG)); + else if (op & SLJIT_SET_Z) + FAIL_IF(push_inst(compiler, SUBU | S(src1) | T(src2) | DA(EQUAL_FLAG), EQUAL_FLAG)); + + if (is_overflow || is_carry) + FAIL_IF(push_inst(compiler, SLTU | S(src1) | T(src2) | DA(OTHER_FLAG), OTHER_FLAG)); + /* dst may be the same as src1 or src2. */ + if (!(flags & UNUSED_DEST) || (op & VARIABLE_FLAG_MASK)) + FAIL_IF(push_inst(compiler, SUBU | S(src1) | T(src2) | D(dst), DR(dst))); + } + + if (!is_overflow) + return SLJIT_SUCCESS; + FAIL_IF(push_inst(compiler, SLL | TA(OTHER_FLAG) | D(TMP_REG1) | SH_IMM(31), DR(TMP_REG1))); + FAIL_IF(push_inst(compiler, XOR | S(TMP_REG1) | TA(EQUAL_FLAG) | DA(EQUAL_FLAG), EQUAL_FLAG)); + FAIL_IF(push_inst(compiler, XOR | S(dst) | TA(EQUAL_FLAG) | DA(OTHER_FLAG), OTHER_FLAG)); + if (op & SLJIT_SET_Z) + FAIL_IF(push_inst(compiler, ADDU | S(dst) | TA(0) | DA(EQUAL_FLAG), EQUAL_FLAG)); + return push_inst(compiler, SRL | TA(OTHER_FLAG) | DA(OTHER_FLAG) | SH_IMM(31), OTHER_FLAG); + + case SLJIT_SUBC: + if ((flags & SRC2_IMM) && src2 == SIMM_MIN) { + FAIL_IF(push_inst(compiler, ADDIU | SA(0) | T(TMP_REG2) | IMM(src2), DR(TMP_REG2))); + src2 = TMP_REG2; + flags &= ~SRC2_IMM; + } + + is_carry = GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY); + + if (flags & SRC2_IMM) { + if (is_carry) + FAIL_IF(push_inst(compiler, SLTIU | S(src1) | TA(EQUAL_FLAG) | IMM(src2), EQUAL_FLAG)); + /* dst may be the same as src1 or src2. */ + FAIL_IF(push_inst(compiler, ADDIU | S(src1) | T(dst) | IMM(-src2), DR(dst))); + } + else { + if (is_carry) + FAIL_IF(push_inst(compiler, SLTU | S(src1) | T(src2) | DA(EQUAL_FLAG), EQUAL_FLAG)); + /* dst may be the same as src1 or src2. */ + FAIL_IF(push_inst(compiler, SUBU | S(src1) | T(src2) | D(dst), DR(dst))); + } + + if (is_carry) + FAIL_IF(push_inst(compiler, SLTU | S(dst) | TA(OTHER_FLAG) | D(TMP_REG1), DR(TMP_REG1))); + + FAIL_IF(push_inst(compiler, SUBU | S(dst) | TA(OTHER_FLAG) | D(dst), DR(dst))); + return (is_carry) ? push_inst(compiler, OR | SA(EQUAL_FLAG) | T(TMP_REG1) | DA(OTHER_FLAG), OTHER_FLAG) : SLJIT_SUCCESS; + + case SLJIT_MUL: + SLJIT_ASSERT(!(flags & SRC2_IMM)); + + if (GET_FLAG_TYPE(op) != SLJIT_MUL_OVERFLOW) { +#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1) || (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) + return push_inst(compiler, MUL | S(src1) | T(src2) | D(dst), DR(dst)); +#else /* !SLJIT_MIPS_R1 && !SLJIT_MIPS_R6 */ + FAIL_IF(push_inst(compiler, MULT | S(src1) | T(src2), MOVABLE_INS)); + return push_inst(compiler, MFLO | D(dst), DR(dst)); +#endif /* SLJIT_MIPS_R1 || SLJIT_MIPS_R6 */ + } +#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) + FAIL_IF(push_inst(compiler, MUL | S(src1) | T(src2) | D(dst), DR(dst))); + FAIL_IF(push_inst(compiler, MUH | S(src1) | T(src2) | DA(EQUAL_FLAG), EQUAL_FLAG)); +#else /* !SLJIT_MIPS_R6 */ + FAIL_IF(push_inst(compiler, MULT | S(src1) | T(src2), MOVABLE_INS)); + FAIL_IF(push_inst(compiler, MFHI | DA(EQUAL_FLAG), EQUAL_FLAG)); + FAIL_IF(push_inst(compiler, MFLO | D(dst), DR(dst))); +#endif /* SLJIT_MIPS_R6 */ + FAIL_IF(push_inst(compiler, SRA | T(dst) | DA(OTHER_FLAG) | SH_IMM(31), OTHER_FLAG)); + return push_inst(compiler, SUBU | SA(EQUAL_FLAG) | TA(OTHER_FLAG) | DA(OTHER_FLAG), OTHER_FLAG); + + case SLJIT_AND: + EMIT_LOGICAL(ANDI, AND); + return SLJIT_SUCCESS; + + case SLJIT_OR: + EMIT_LOGICAL(ORI, OR); + return SLJIT_SUCCESS; + + case SLJIT_XOR: + EMIT_LOGICAL(XORI, XOR); + return SLJIT_SUCCESS; + + case SLJIT_SHL: + EMIT_SHIFT(SLL, SLLV); + return SLJIT_SUCCESS; + + case SLJIT_LSHR: + EMIT_SHIFT(SRL, SRLV); + return SLJIT_SUCCESS; + + case SLJIT_ASHR: + EMIT_SHIFT(SRA, SRAV); + return SLJIT_SUCCESS; + } + + SLJIT_UNREACHABLE(); + return SLJIT_SUCCESS; +} + +static SLJIT_INLINE sljit_s32 emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw init_value) +{ + FAIL_IF(push_inst(compiler, LUI | T(dst) | IMM(init_value >> 16), DR(dst))); + return push_inst(compiler, ORI | S(dst) | T(dst) | IMM(init_value), DR(dst)); +} + +SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset) +{ + sljit_ins *inst = (sljit_ins *)addr; + + SLJIT_ASSERT((inst[0] & 0xffe00000) == LUI && (inst[1] & 0xfc000000) == ORI); + inst[0] = (inst[0] & 0xffff0000) | ((new_target >> 16) & 0xffff); + inst[1] = (inst[1] & 0xffff0000) | (new_target & 0xffff); + inst = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset); + SLJIT_CACHE_FLUSH(inst, inst + 2); +} + +SLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_constant, sljit_sw executable_offset) +{ + sljit_ins *inst = (sljit_ins *)addr; + + SLJIT_ASSERT((inst[0] & 0xffe00000) == LUI && (inst[1] & 0xfc000000) == ORI); + inst[0] = (inst[0] & 0xffff0000) | ((new_constant >> 16) & 0xffff); + inst[1] = (inst[1] & 0xffff0000) | (new_constant & 0xffff); + inst = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset); + SLJIT_CACHE_FLUSH(inst, inst + 2); +} + +static sljit_s32 call_with_args(struct sljit_compiler *compiler, sljit_s32 arg_types, sljit_ins *ins_ptr) +{ + sljit_s32 stack_offset = 0; + sljit_s32 arg_count = 0; + sljit_s32 float_arg_count = 0; + sljit_s32 word_arg_count = 0; + sljit_s32 types = 0; + sljit_s32 arg_count_save, types_save; + sljit_ins prev_ins = NOP; + sljit_ins ins = NOP; + sljit_u8 offsets[4]; + + SLJIT_ASSERT(reg_map[TMP_REG1] == 4 && freg_map[TMP_FREG1] == 12); + + arg_types >>= SLJIT_DEF_SHIFT; + + while (arg_types) { + types = (types << SLJIT_DEF_SHIFT) | (arg_types & SLJIT_DEF_MASK); + + switch (arg_types & SLJIT_DEF_MASK) { + case SLJIT_ARG_TYPE_F32: + offsets[arg_count] = (sljit_u8)stack_offset; + + if (word_arg_count == 0 && arg_count <= 1) + offsets[arg_count] = 254 + arg_count; + + stack_offset += sizeof(sljit_f32); + arg_count++; + float_arg_count++; + break; + case SLJIT_ARG_TYPE_F64: + if (stack_offset & 0x7) + stack_offset += sizeof(sljit_sw); + offsets[arg_count] = (sljit_u8)stack_offset; + + if (word_arg_count == 0 && arg_count <= 1) + offsets[arg_count] = 254 + arg_count; + + stack_offset += sizeof(sljit_f64); + arg_count++; + float_arg_count++; + break; + default: + offsets[arg_count] = (sljit_u8)stack_offset; + stack_offset += sizeof(sljit_sw); + arg_count++; + word_arg_count++; + break; + } + + arg_types >>= SLJIT_DEF_SHIFT; + } + + /* Stack is aligned to 16 bytes, max two doubles can be placed on the stack. */ + if (stack_offset > 16) + FAIL_IF(push_inst(compiler, ADDIU | S(SLJIT_SP) | T(SLJIT_SP) | IMM(-16), DR(SLJIT_SP))); + + types_save = types; + arg_count_save = arg_count; + + while (types) { + switch (types & SLJIT_DEF_MASK) { + case SLJIT_ARG_TYPE_F32: + arg_count--; + if (offsets[arg_count] < 254) + ins = SWC1 | S(SLJIT_SP) | FT(float_arg_count) | IMM(offsets[arg_count]); + float_arg_count--; + break; + case SLJIT_ARG_TYPE_F64: + arg_count--; + if (offsets[arg_count] < 254) + ins = SDC1 | S(SLJIT_SP) | FT(float_arg_count) | IMM(offsets[arg_count]); + float_arg_count--; + break; + default: + if (offsets[arg_count - 1] >= 16) + ins = SW | S(SLJIT_SP) | T(word_arg_count) | IMM(offsets[arg_count - 1]); + else if (arg_count != word_arg_count) + ins = ADDU | S(word_arg_count) | TA(0) | DA(4 + (offsets[arg_count - 1] >> 2)); + else if (arg_count == 1) + ins = ADDU | S(SLJIT_R0) | TA(0) | DA(4); + + arg_count--; + word_arg_count--; + break; + } + + if (ins != NOP) { + if (prev_ins != NOP) + FAIL_IF(push_inst(compiler, prev_ins, MOVABLE_INS)); + prev_ins = ins; + ins = NOP; + } + + types >>= SLJIT_DEF_SHIFT; + } + + types = types_save; + arg_count = arg_count_save; + + while (types) { + switch (types & SLJIT_DEF_MASK) { + case SLJIT_ARG_TYPE_F32: + arg_count--; + if (offsets[arg_count] == 254) + ins = MOV_S | FMT_S | FS(SLJIT_FR0) | FD(TMP_FREG1); + else if (offsets[arg_count] < 16) + ins = LW | S(SLJIT_SP) | TA(4 + (offsets[arg_count] >> 2)) | IMM(offsets[arg_count]); + break; + case SLJIT_ARG_TYPE_F64: + arg_count--; + if (offsets[arg_count] == 254) + ins = MOV_S | FMT_D | FS(SLJIT_FR0) | FD(TMP_FREG1); + else if (offsets[arg_count] < 16) { + if (prev_ins != NOP) + FAIL_IF(push_inst(compiler, prev_ins, MOVABLE_INS)); + prev_ins = LW | S(SLJIT_SP) | TA(4 + (offsets[arg_count] >> 2)) | IMM(offsets[arg_count]); + ins = LW | S(SLJIT_SP) | TA(5 + (offsets[arg_count] >> 2)) | IMM(offsets[arg_count] + sizeof(sljit_sw)); + } + break; + default: + arg_count--; + break; + } + + if (ins != NOP) { + if (prev_ins != NOP) + FAIL_IF(push_inst(compiler, prev_ins, MOVABLE_INS)); + prev_ins = ins; + ins = NOP; + } + + types >>= SLJIT_DEF_SHIFT; + } + + *ins_ptr = prev_ins; + + return SLJIT_SUCCESS; +} + +static sljit_s32 post_call_with_args(struct sljit_compiler *compiler, sljit_s32 arg_types) +{ + sljit_s32 stack_offset = 0; + + arg_types >>= SLJIT_DEF_SHIFT; + + while (arg_types) { + switch (arg_types & SLJIT_DEF_MASK) { + case SLJIT_ARG_TYPE_F32: + stack_offset += sizeof(sljit_f32); + break; + case SLJIT_ARG_TYPE_F64: + if (stack_offset & 0x7) + stack_offset += sizeof(sljit_sw); + stack_offset += sizeof(sljit_f64); + break; + default: + stack_offset += sizeof(sljit_sw); + break; + } + + arg_types >>= SLJIT_DEF_SHIFT; + } + + /* Stack is aligned to 16 bytes, max two doubles can be placed on the stack. */ + if (stack_offset > 16) + return push_inst(compiler, ADDIU | S(SLJIT_SP) | T(SLJIT_SP) | IMM(16), DR(SLJIT_SP)); + + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_call(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 arg_types) +{ + struct sljit_jump *jump; + sljit_ins ins; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_call(compiler, type, arg_types)); + + jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump)); + PTR_FAIL_IF(!jump); + set_jump(jump, compiler, type & SLJIT_REWRITABLE_JUMP); + type &= 0xff; + + PTR_FAIL_IF(call_with_args(compiler, arg_types, &ins)); + + SLJIT_ASSERT(DR(PIC_ADDR_REG) == 25 && PIC_ADDR_REG == TMP_REG2); + + PTR_FAIL_IF(emit_const(compiler, PIC_ADDR_REG, 0)); + + jump->flags |= IS_JAL | IS_CALL; + PTR_FAIL_IF(push_inst(compiler, JALR | S(PIC_ADDR_REG) | DA(RETURN_ADDR_REG), UNMOVABLE_INS)); + jump->addr = compiler->size; + PTR_FAIL_IF(push_inst(compiler, ins, UNMOVABLE_INS)); + + PTR_FAIL_IF(post_call_with_args(compiler, arg_types)); + + return jump; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_icall(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 arg_types, + sljit_s32 src, sljit_sw srcw) +{ + sljit_ins ins; + + CHECK_ERROR(); + CHECK(check_sljit_emit_icall(compiler, type, arg_types, src, srcw)); + + SLJIT_ASSERT(DR(PIC_ADDR_REG) == 25 && PIC_ADDR_REG == TMP_REG2); + + if (src & SLJIT_IMM) + FAIL_IF(load_immediate(compiler, DR(PIC_ADDR_REG), srcw)); + else if (FAST_IS_REG(src)) + FAIL_IF(push_inst(compiler, ADDU | S(src) | TA(0) | D(PIC_ADDR_REG), DR(PIC_ADDR_REG))); + else if (src & SLJIT_MEM) { + ADJUST_LOCAL_OFFSET(src, srcw); + FAIL_IF(emit_op_mem(compiler, WORD_DATA | LOAD_DATA, DR(PIC_ADDR_REG), src, srcw)); + } + + FAIL_IF(call_with_args(compiler, arg_types, &ins)); + + /* Register input. */ + FAIL_IF(push_inst(compiler, JALR | S(PIC_ADDR_REG) | DA(RETURN_ADDR_REG), UNMOVABLE_INS)); + FAIL_IF(push_inst(compiler, ins, UNMOVABLE_INS)); + return post_call_with_args(compiler, arg_types); +} diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeMIPS_64.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeMIPS_64.c new file mode 100755 index 000000000..a6a2bcc0c --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeMIPS_64.c @@ -0,0 +1,675 @@ +/* + * Stack-less Just-In-Time compiler + * + * Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* mips 64-bit arch dependent functions. */ + +static sljit_s32 load_immediate(struct sljit_compiler *compiler, sljit_s32 dst_ar, sljit_sw imm) +{ + sljit_s32 shift = 32; + sljit_s32 shift2; + sljit_s32 inv = 0; + sljit_ins ins; + sljit_uw uimm; + + if (!(imm & ~0xffff)) + return push_inst(compiler, ORI | SA(0) | TA(dst_ar) | IMM(imm), dst_ar); + + if (imm < 0 && imm >= SIMM_MIN) + return push_inst(compiler, ADDIU | SA(0) | TA(dst_ar) | IMM(imm), dst_ar); + + if (imm <= 0x7fffffffl && imm >= -0x80000000l) { + FAIL_IF(push_inst(compiler, LUI | TA(dst_ar) | IMM(imm >> 16), dst_ar)); + return (imm & 0xffff) ? push_inst(compiler, ORI | SA(dst_ar) | TA(dst_ar) | IMM(imm), dst_ar) : SLJIT_SUCCESS; + } + + /* Zero extended number. */ + uimm = imm; + if (imm < 0) { + uimm = ~imm; + inv = 1; + } + + while (!(uimm & 0xff00000000000000l)) { + shift -= 8; + uimm <<= 8; + } + + if (!(uimm & 0xf000000000000000l)) { + shift -= 4; + uimm <<= 4; + } + + if (!(uimm & 0xc000000000000000l)) { + shift -= 2; + uimm <<= 2; + } + + if ((sljit_sw)uimm < 0) { + uimm >>= 1; + shift += 1; + } + SLJIT_ASSERT(((uimm & 0xc000000000000000l) == 0x4000000000000000l) && (shift > 0) && (shift <= 32)); + + if (inv) + uimm = ~uimm; + + FAIL_IF(push_inst(compiler, LUI | TA(dst_ar) | IMM(uimm >> 48), dst_ar)); + if (uimm & 0x0000ffff00000000l) + FAIL_IF(push_inst(compiler, ORI | SA(dst_ar) | TA(dst_ar) | IMM(uimm >> 32), dst_ar)); + + imm &= (1l << shift) - 1; + if (!(imm & ~0xffff)) { + ins = (shift == 32) ? DSLL32 : DSLL; + if (shift < 32) + ins |= SH_IMM(shift); + FAIL_IF(push_inst(compiler, ins | TA(dst_ar) | DA(dst_ar), dst_ar)); + return !(imm & 0xffff) ? SLJIT_SUCCESS : push_inst(compiler, ORI | SA(dst_ar) | TA(dst_ar) | IMM(imm), dst_ar); + } + + /* Double shifts needs to be performed. */ + uimm <<= 32; + shift2 = shift - 16; + + while (!(uimm & 0xf000000000000000l)) { + shift2 -= 4; + uimm <<= 4; + } + + if (!(uimm & 0xc000000000000000l)) { + shift2 -= 2; + uimm <<= 2; + } + + if (!(uimm & 0x8000000000000000l)) { + shift2--; + uimm <<= 1; + } + + SLJIT_ASSERT((uimm & 0x8000000000000000l) && (shift2 > 0) && (shift2 <= 16)); + + FAIL_IF(push_inst(compiler, DSLL | TA(dst_ar) | DA(dst_ar) | SH_IMM(shift - shift2), dst_ar)); + FAIL_IF(push_inst(compiler, ORI | SA(dst_ar) | TA(dst_ar) | IMM(uimm >> 48), dst_ar)); + FAIL_IF(push_inst(compiler, DSLL | TA(dst_ar) | DA(dst_ar) | SH_IMM(shift2), dst_ar)); + + imm &= (1l << shift2) - 1; + return !(imm & 0xffff) ? SLJIT_SUCCESS : push_inst(compiler, ORI | SA(dst_ar) | TA(dst_ar) | IMM(imm), dst_ar); +} + +#define SELECT_OP(a, b) \ + (!(op & SLJIT_I32_OP) ? a : b) + +#define EMIT_LOGICAL(op_imm, op_norm) \ + if (flags & SRC2_IMM) { \ + if (op & SLJIT_SET_Z) \ + FAIL_IF(push_inst(compiler, op_imm | S(src1) | TA(EQUAL_FLAG) | IMM(src2), EQUAL_FLAG)); \ + if (!(flags & UNUSED_DEST)) \ + FAIL_IF(push_inst(compiler, op_imm | S(src1) | T(dst) | IMM(src2), DR(dst))); \ + } \ + else { \ + if (op & SLJIT_SET_Z) \ + FAIL_IF(push_inst(compiler, op_norm | S(src1) | T(src2) | DA(EQUAL_FLAG), EQUAL_FLAG)); \ + if (!(flags & UNUSED_DEST)) \ + FAIL_IF(push_inst(compiler, op_norm | S(src1) | T(src2) | D(dst), DR(dst))); \ + } + +#define EMIT_SHIFT(op_dimm, op_dimm32, op_imm, op_dv, op_v) \ + if (flags & SRC2_IMM) { \ + if (src2 >= 32) { \ + SLJIT_ASSERT(!(op & SLJIT_I32_OP)); \ + ins = op_dimm32; \ + src2 -= 32; \ + } \ + else \ + ins = (op & SLJIT_I32_OP) ? op_imm : op_dimm; \ + if (op & SLJIT_SET_Z) \ + FAIL_IF(push_inst(compiler, ins | T(src1) | DA(EQUAL_FLAG) | SH_IMM(src2), EQUAL_FLAG)); \ + if (!(flags & UNUSED_DEST)) \ + FAIL_IF(push_inst(compiler, ins | T(src1) | D(dst) | SH_IMM(src2), DR(dst))); \ + } \ + else { \ + ins = (op & SLJIT_I32_OP) ? op_v : op_dv; \ + if (op & SLJIT_SET_Z) \ + FAIL_IF(push_inst(compiler, ins | S(src2) | T(src1) | DA(EQUAL_FLAG), EQUAL_FLAG)); \ + if (!(flags & UNUSED_DEST)) \ + FAIL_IF(push_inst(compiler, ins | S(src2) | T(src1) | D(dst), DR(dst))); \ + } + +static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 flags, + sljit_s32 dst, sljit_s32 src1, sljit_sw src2) +{ + sljit_ins ins; + sljit_s32 is_overflow, is_carry, is_handled; + + switch (GET_OPCODE(op)) { + case SLJIT_MOV: + case SLJIT_MOV_P: + SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); + if (dst != src2) + return push_inst(compiler, SELECT_OP(DADDU, ADDU) | S(src2) | TA(0) | D(dst), DR(dst)); + return SLJIT_SUCCESS; + + case SLJIT_MOV_U8: + case SLJIT_MOV_S8: + SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); + if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) { + if (op == SLJIT_MOV_S8) { + FAIL_IF(push_inst(compiler, DSLL32 | T(src2) | D(dst) | SH_IMM(24), DR(dst))); + return push_inst(compiler, DSRA32 | T(dst) | D(dst) | SH_IMM(24), DR(dst)); + } + return push_inst(compiler, ANDI | S(src2) | T(dst) | IMM(0xff), DR(dst)); + } + else { + SLJIT_ASSERT(dst == src2); + } + return SLJIT_SUCCESS; + + case SLJIT_MOV_U16: + case SLJIT_MOV_S16: + SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); + if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) { + if (op == SLJIT_MOV_S16) { + FAIL_IF(push_inst(compiler, DSLL32 | T(src2) | D(dst) | SH_IMM(16), DR(dst))); + return push_inst(compiler, DSRA32 | T(dst) | D(dst) | SH_IMM(16), DR(dst)); + } + return push_inst(compiler, ANDI | S(src2) | T(dst) | IMM(0xffff), DR(dst)); + } + else { + SLJIT_ASSERT(dst == src2); + } + return SLJIT_SUCCESS; + + case SLJIT_MOV_U32: + SLJIT_ASSERT(!(op & SLJIT_I32_OP)); + FAIL_IF(push_inst(compiler, DSLL32 | T(src2) | D(dst) | SH_IMM(0), DR(dst))); + return push_inst(compiler, DSRL32 | T(dst) | D(dst) | SH_IMM(0), DR(dst)); + + case SLJIT_MOV_S32: + SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); + return push_inst(compiler, SLL | T(src2) | D(dst) | SH_IMM(0), DR(dst)); + + case SLJIT_NOT: + SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); + if (op & SLJIT_SET_Z) + FAIL_IF(push_inst(compiler, NOR | S(src2) | T(src2) | DA(EQUAL_FLAG), EQUAL_FLAG)); + if (!(flags & UNUSED_DEST)) + FAIL_IF(push_inst(compiler, NOR | S(src2) | T(src2) | D(dst), DR(dst))); + return SLJIT_SUCCESS; + + case SLJIT_CLZ: + SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); +#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1) + if (op & SLJIT_SET_Z) + FAIL_IF(push_inst(compiler, SELECT_OP(DCLZ, CLZ) | S(src2) | TA(EQUAL_FLAG) | DA(EQUAL_FLAG), EQUAL_FLAG)); + if (!(flags & UNUSED_DEST)) + FAIL_IF(push_inst(compiler, SELECT_OP(DCLZ, CLZ) | S(src2) | T(dst) | D(dst), DR(dst))); +#else + if (SLJIT_UNLIKELY(flags & UNUSED_DEST)) { + FAIL_IF(push_inst(compiler, SELECT_OP(DSRL32, SRL) | T(src2) | DA(EQUAL_FLAG) | SH_IMM(31), EQUAL_FLAG)); + return push_inst(compiler, XORI | SA(EQUAL_FLAG) | TA(EQUAL_FLAG) | IMM(1), EQUAL_FLAG); + } + /* Nearly all instructions are unmovable in the following sequence. */ + FAIL_IF(push_inst(compiler, SELECT_OP(DADDU, ADDU) | S(src2) | TA(0) | D(TMP_REG1), DR(TMP_REG1))); + /* Check zero. */ + FAIL_IF(push_inst(compiler, BEQ | S(TMP_REG1) | TA(0) | IMM(5), UNMOVABLE_INS)); + FAIL_IF(push_inst(compiler, ORI | SA(0) | T(dst) | IMM((op & SLJIT_I32_OP) ? 32 : 64), UNMOVABLE_INS)); + FAIL_IF(push_inst(compiler, SELECT_OP(DADDIU, ADDIU) | SA(0) | T(dst) | IMM(-1), DR(dst))); + /* Loop for searching the highest bit. */ + FAIL_IF(push_inst(compiler, SELECT_OP(DADDIU, ADDIU) | S(dst) | T(dst) | IMM(1), DR(dst))); + FAIL_IF(push_inst(compiler, BGEZ | S(TMP_REG1) | IMM(-2), UNMOVABLE_INS)); + FAIL_IF(push_inst(compiler, SELECT_OP(DSLL, SLL) | T(TMP_REG1) | D(TMP_REG1) | SH_IMM(1), UNMOVABLE_INS)); +#endif + return SLJIT_SUCCESS; + + case SLJIT_ADD: + is_overflow = GET_FLAG_TYPE(op) == SLJIT_OVERFLOW; + is_carry = GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY); + + if (flags & SRC2_IMM) { + if (is_overflow) { + if (src2 >= 0) + FAIL_IF(push_inst(compiler, OR | S(src1) | T(src1) | DA(EQUAL_FLAG), EQUAL_FLAG)); + else + FAIL_IF(push_inst(compiler, NOR | S(src1) | T(src1) | DA(EQUAL_FLAG), EQUAL_FLAG)); + } + else if (op & SLJIT_SET_Z) + FAIL_IF(push_inst(compiler, SELECT_OP(DADDIU, ADDIU) | S(src1) | TA(EQUAL_FLAG) | IMM(src2), EQUAL_FLAG)); + + if (is_overflow || is_carry) { + if (src2 >= 0) + FAIL_IF(push_inst(compiler, ORI | S(src1) | TA(OTHER_FLAG) | IMM(src2), OTHER_FLAG)); + else { + FAIL_IF(push_inst(compiler, SELECT_OP(DADDIU, ADDIU) | SA(0) | TA(OTHER_FLAG) | IMM(src2), OTHER_FLAG)); + FAIL_IF(push_inst(compiler, OR | S(src1) | TA(OTHER_FLAG) | DA(OTHER_FLAG), OTHER_FLAG)); + } + } + /* dst may be the same as src1 or src2. */ + if (!(flags & UNUSED_DEST) || (op & VARIABLE_FLAG_MASK)) + FAIL_IF(push_inst(compiler, SELECT_OP(DADDIU, ADDIU) | S(src1) | T(dst) | IMM(src2), DR(dst))); + } + else { + if (is_overflow) + FAIL_IF(push_inst(compiler, XOR | S(src1) | T(src2) | DA(EQUAL_FLAG), EQUAL_FLAG)); + else if (op & SLJIT_SET_Z) + FAIL_IF(push_inst(compiler, SELECT_OP(DADDU, ADDU) | S(src1) | T(src2) | DA(EQUAL_FLAG), EQUAL_FLAG)); + + if (is_overflow || is_carry) + FAIL_IF(push_inst(compiler, OR | S(src1) | T(src2) | DA(OTHER_FLAG), OTHER_FLAG)); + /* dst may be the same as src1 or src2. */ + if (!(flags & UNUSED_DEST) || (op & VARIABLE_FLAG_MASK)) + FAIL_IF(push_inst(compiler, SELECT_OP(DADDU, ADDU) | S(src1) | T(src2) | D(dst), DR(dst))); + } + + /* a + b >= a | b (otherwise, the carry should be set to 1). */ + if (is_overflow || is_carry) + FAIL_IF(push_inst(compiler, SLTU | S(dst) | TA(OTHER_FLAG) | DA(OTHER_FLAG), OTHER_FLAG)); + if (!is_overflow) + return SLJIT_SUCCESS; + FAIL_IF(push_inst(compiler, SELECT_OP(DSLL32, SLL) | TA(OTHER_FLAG) | D(TMP_REG1) | SH_IMM(31), DR(TMP_REG1))); + FAIL_IF(push_inst(compiler, XOR | S(TMP_REG1) | TA(EQUAL_FLAG) | DA(EQUAL_FLAG), EQUAL_FLAG)); + FAIL_IF(push_inst(compiler, XOR | S(dst) | TA(EQUAL_FLAG) | DA(OTHER_FLAG), OTHER_FLAG)); + if (op & SLJIT_SET_Z) + FAIL_IF(push_inst(compiler, SELECT_OP(DADDU, ADDU) | S(dst) | TA(0) | DA(EQUAL_FLAG), EQUAL_FLAG)); + return push_inst(compiler, SELECT_OP(DSRL32, SRL) | TA(OTHER_FLAG) | DA(OTHER_FLAG) | SH_IMM(31), OTHER_FLAG); + + case SLJIT_ADDC: + is_carry = GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY); + + if (flags & SRC2_IMM) { + if (is_carry) { + if (src2 >= 0) + FAIL_IF(push_inst(compiler, ORI | S(src1) | TA(EQUAL_FLAG) | IMM(src2), EQUAL_FLAG)); + else { + FAIL_IF(push_inst(compiler, SELECT_OP(DADDIU, ADDIU) | SA(0) | TA(EQUAL_FLAG) | IMM(src2), EQUAL_FLAG)); + FAIL_IF(push_inst(compiler, OR | S(src1) | TA(EQUAL_FLAG) | DA(EQUAL_FLAG), EQUAL_FLAG)); + } + } + FAIL_IF(push_inst(compiler, SELECT_OP(DADDIU, ADDIU) | S(src1) | T(dst) | IMM(src2), DR(dst))); + } else { + if (is_carry) + FAIL_IF(push_inst(compiler, OR | S(src1) | T(src2) | DA(EQUAL_FLAG), EQUAL_FLAG)); + /* dst may be the same as src1 or src2. */ + FAIL_IF(push_inst(compiler, SELECT_OP(DADDU, ADDU) | S(src1) | T(src2) | D(dst), DR(dst))); + } + if (is_carry) + FAIL_IF(push_inst(compiler, SLTU | S(dst) | TA(EQUAL_FLAG) | DA(EQUAL_FLAG), EQUAL_FLAG)); + + FAIL_IF(push_inst(compiler, SELECT_OP(DADDU, ADDU) | S(dst) | TA(OTHER_FLAG) | D(dst), DR(dst))); + if (!is_carry) + return SLJIT_SUCCESS; + + /* Set ULESS_FLAG (dst == 0) && (OTHER_FLAG == 1). */ + FAIL_IF(push_inst(compiler, SLTU | S(dst) | TA(OTHER_FLAG) | DA(OTHER_FLAG), OTHER_FLAG)); + /* Set carry flag. */ + return push_inst(compiler, OR | SA(OTHER_FLAG) | TA(EQUAL_FLAG) | DA(OTHER_FLAG), OTHER_FLAG); + + case SLJIT_SUB: + if ((flags & SRC2_IMM) && src2 == SIMM_MIN) { + FAIL_IF(push_inst(compiler, ADDIU | SA(0) | T(TMP_REG2) | IMM(src2), DR(TMP_REG2))); + src2 = TMP_REG2; + flags &= ~SRC2_IMM; + } + + is_handled = 0; + + if (flags & SRC2_IMM) { + if (GET_FLAG_TYPE(op) == SLJIT_LESS || GET_FLAG_TYPE(op) == SLJIT_GREATER_EQUAL) { + FAIL_IF(push_inst(compiler, SLTIU | S(src1) | TA(OTHER_FLAG) | IMM(src2), OTHER_FLAG)); + is_handled = 1; + } + else if (GET_FLAG_TYPE(op) == SLJIT_SIG_LESS || GET_FLAG_TYPE(op) == SLJIT_SIG_GREATER_EQUAL) { + FAIL_IF(push_inst(compiler, SLTI | S(src1) | TA(OTHER_FLAG) | IMM(src2), OTHER_FLAG)); + is_handled = 1; + } + } + + if (!is_handled && GET_FLAG_TYPE(op) >= SLJIT_LESS && GET_FLAG_TYPE(op) <= SLJIT_SIG_LESS_EQUAL) { + is_handled = 1; + + if (flags & SRC2_IMM) { + FAIL_IF(push_inst(compiler, ADDIU | SA(0) | T(TMP_REG2) | IMM(src2), DR(TMP_REG2))); + src2 = TMP_REG2; + flags &= ~SRC2_IMM; + } + + if (GET_FLAG_TYPE(op) == SLJIT_LESS || GET_FLAG_TYPE(op) == SLJIT_GREATER_EQUAL) { + FAIL_IF(push_inst(compiler, SLTU | S(src1) | T(src2) | DA(OTHER_FLAG), OTHER_FLAG)); + } + else if (GET_FLAG_TYPE(op) == SLJIT_GREATER || GET_FLAG_TYPE(op) == SLJIT_LESS_EQUAL) + { + FAIL_IF(push_inst(compiler, SLTU | S(src2) | T(src1) | DA(OTHER_FLAG), OTHER_FLAG)); + } + else if (GET_FLAG_TYPE(op) == SLJIT_SIG_LESS || GET_FLAG_TYPE(op) == SLJIT_SIG_GREATER_EQUAL) { + FAIL_IF(push_inst(compiler, SLT | S(src1) | T(src2) | DA(OTHER_FLAG), OTHER_FLAG)); + } + else if (GET_FLAG_TYPE(op) == SLJIT_SIG_GREATER || GET_FLAG_TYPE(op) == SLJIT_SIG_LESS_EQUAL) + { + FAIL_IF(push_inst(compiler, SLT | S(src2) | T(src1) | DA(OTHER_FLAG), OTHER_FLAG)); + } + } + + if (is_handled) { + if (flags & SRC2_IMM) { + if (op & SLJIT_SET_Z) + FAIL_IF(push_inst(compiler, SELECT_OP(DADDIU, ADDIU) | S(src1) | TA(EQUAL_FLAG) | IMM(-src2), EQUAL_FLAG)); + if (!(flags & UNUSED_DEST)) + return push_inst(compiler, SELECT_OP(DADDIU, ADDIU) | S(src1) | T(dst) | IMM(-src2), DR(dst)); + } + else { + if (op & SLJIT_SET_Z) + FAIL_IF(push_inst(compiler, SELECT_OP(DSUBU, SUBU) | S(src1) | T(src2) | DA(EQUAL_FLAG), EQUAL_FLAG)); + if (!(flags & UNUSED_DEST)) + return push_inst(compiler, SELECT_OP(DSUBU, SUBU) | S(src1) | T(src2) | D(dst), DR(dst)); + } + return SLJIT_SUCCESS; + } + + is_overflow = GET_FLAG_TYPE(op) == SLJIT_OVERFLOW; + is_carry = GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY); + + if (flags & SRC2_IMM) { + if (is_overflow) { + if (src2 >= 0) + FAIL_IF(push_inst(compiler, OR | S(src1) | T(src1) | DA(EQUAL_FLAG), EQUAL_FLAG)); + else + FAIL_IF(push_inst(compiler, NOR | S(src1) | T(src1) | DA(EQUAL_FLAG), EQUAL_FLAG)); + } + else if (op & SLJIT_SET_Z) + FAIL_IF(push_inst(compiler, SELECT_OP(DADDIU, ADDIU) | S(src1) | TA(EQUAL_FLAG) | IMM(-src2), EQUAL_FLAG)); + + if (is_overflow || is_carry) + FAIL_IF(push_inst(compiler, SLTIU | S(src1) | TA(OTHER_FLAG) | IMM(src2), OTHER_FLAG)); + /* dst may be the same as src1 or src2. */ + if (!(flags & UNUSED_DEST) || (op & VARIABLE_FLAG_MASK)) + FAIL_IF(push_inst(compiler, SELECT_OP(DADDIU, ADDIU) | S(src1) | T(dst) | IMM(-src2), DR(dst))); + } + else { + if (is_overflow) + FAIL_IF(push_inst(compiler, XOR | S(src1) | T(src2) | DA(EQUAL_FLAG), EQUAL_FLAG)); + else if (op & SLJIT_SET_Z) + FAIL_IF(push_inst(compiler, SELECT_OP(DSUBU, SUBU) | S(src1) | T(src2) | DA(EQUAL_FLAG), EQUAL_FLAG)); + + if (is_overflow || is_carry) + FAIL_IF(push_inst(compiler, SLTU | S(src1) | T(src2) | DA(OTHER_FLAG), OTHER_FLAG)); + /* dst may be the same as src1 or src2. */ + if (!(flags & UNUSED_DEST) || (op & VARIABLE_FLAG_MASK)) + FAIL_IF(push_inst(compiler, SELECT_OP(DSUBU, SUBU) | S(src1) | T(src2) | D(dst), DR(dst))); + } + + if (!is_overflow) + return SLJIT_SUCCESS; + FAIL_IF(push_inst(compiler, SELECT_OP(DSLL32, SLL) | TA(OTHER_FLAG) | D(TMP_REG1) | SH_IMM(31), DR(TMP_REG1))); + FAIL_IF(push_inst(compiler, XOR | S(TMP_REG1) | TA(EQUAL_FLAG) | DA(EQUAL_FLAG), EQUAL_FLAG)); + FAIL_IF(push_inst(compiler, XOR | S(dst) | TA(EQUAL_FLAG) | DA(OTHER_FLAG), OTHER_FLAG)); + if (op & SLJIT_SET_Z) + FAIL_IF(push_inst(compiler, SELECT_OP(DADDU, ADDU) | S(dst) | TA(0) | DA(EQUAL_FLAG), EQUAL_FLAG)); + return push_inst(compiler, SELECT_OP(DSRL32, SRL) | TA(OTHER_FLAG) | DA(OTHER_FLAG) | SH_IMM(31), OTHER_FLAG); + + case SLJIT_SUBC: + if ((flags & SRC2_IMM) && src2 == SIMM_MIN) { + FAIL_IF(push_inst(compiler, ADDIU | SA(0) | T(TMP_REG2) | IMM(src2), DR(TMP_REG2))); + src2 = TMP_REG2; + flags &= ~SRC2_IMM; + } + + is_carry = GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY); + + if (flags & SRC2_IMM) { + if (is_carry) + FAIL_IF(push_inst(compiler, SLTIU | S(src1) | TA(EQUAL_FLAG) | IMM(src2), EQUAL_FLAG)); + /* dst may be the same as src1 or src2. */ + FAIL_IF(push_inst(compiler, SELECT_OP(DADDIU, ADDIU) | S(src1) | T(dst) | IMM(-src2), DR(dst))); + } + else { + if (is_carry) + FAIL_IF(push_inst(compiler, SLTU | S(src1) | T(src2) | DA(EQUAL_FLAG), EQUAL_FLAG)); + /* dst may be the same as src1 or src2. */ + FAIL_IF(push_inst(compiler, SELECT_OP(DSUBU, SUBU) | S(src1) | T(src2) | D(dst), DR(dst))); + } + + if (is_carry) + FAIL_IF(push_inst(compiler, SLTU | S(dst) | TA(OTHER_FLAG) | D(TMP_REG1), DR(TMP_REG1))); + + FAIL_IF(push_inst(compiler, SELECT_OP(DSUBU, SUBU) | S(dst) | TA(OTHER_FLAG) | D(dst), DR(dst))); + return (is_carry) ? push_inst(compiler, OR | SA(EQUAL_FLAG) | T(TMP_REG1) | DA(OTHER_FLAG), OTHER_FLAG) : SLJIT_SUCCESS; + + case SLJIT_MUL: + SLJIT_ASSERT(!(flags & SRC2_IMM)); + + if (GET_FLAG_TYPE(op) != SLJIT_MUL_OVERFLOW) { +#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) + return push_inst(compiler, SELECT_OP(DMUL, MUL) | S(src1) | T(src2) | D(dst), DR(dst)); +#elif (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1) + if (op & SLJIT_I32_OP) + return push_inst(compiler, MUL | S(src1) | T(src2) | D(dst), DR(dst)); + FAIL_IF(push_inst(compiler, DMULT | S(src1) | T(src2), MOVABLE_INS)); + return push_inst(compiler, MFLO | D(dst), DR(dst)); +#else /* !SLJIT_MIPS_R6 && !SLJIT_MIPS_R1 */ + FAIL_IF(push_inst(compiler, SELECT_OP(DMULT, MULT) | S(src1) | T(src2), MOVABLE_INS)); + return push_inst(compiler, MFLO | D(dst), DR(dst)); +#endif /* SLJIT_MIPS_R6 */ + } +#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) + FAIL_IF(push_inst(compiler, SELECT_OP(DMUL, MUL) | S(src1) | T(src2) | D(dst), DR(dst))); + FAIL_IF(push_inst(compiler, SELECT_OP(DMUH, MUH) | S(src1) | T(src2) | DA(EQUAL_FLAG), EQUAL_FLAG)); +#else /* !SLJIT_MIPS_R6 */ + FAIL_IF(push_inst(compiler, SELECT_OP(DMULT, MULT) | S(src1) | T(src2), MOVABLE_INS)); + FAIL_IF(push_inst(compiler, MFHI | DA(EQUAL_FLAG), EQUAL_FLAG)); + FAIL_IF(push_inst(compiler, MFLO | D(dst), DR(dst))); +#endif /* SLJIT_MIPS_R6 */ + FAIL_IF(push_inst(compiler, SELECT_OP(DSRA32, SRA) | T(dst) | DA(OTHER_FLAG) | SH_IMM(31), OTHER_FLAG)); + return push_inst(compiler, SELECT_OP(DSUBU, SUBU) | SA(EQUAL_FLAG) | TA(OTHER_FLAG) | DA(OTHER_FLAG), OTHER_FLAG); + + case SLJIT_AND: + EMIT_LOGICAL(ANDI, AND); + return SLJIT_SUCCESS; + + case SLJIT_OR: + EMIT_LOGICAL(ORI, OR); + return SLJIT_SUCCESS; + + case SLJIT_XOR: + EMIT_LOGICAL(XORI, XOR); + return SLJIT_SUCCESS; + + case SLJIT_SHL: + EMIT_SHIFT(DSLL, DSLL32, SLL, DSLLV, SLLV); + return SLJIT_SUCCESS; + + case SLJIT_LSHR: + EMIT_SHIFT(DSRL, DSRL32, SRL, DSRLV, SRLV); + return SLJIT_SUCCESS; + + case SLJIT_ASHR: + EMIT_SHIFT(DSRA, DSRA32, SRA, DSRAV, SRAV); + return SLJIT_SUCCESS; + } + + SLJIT_UNREACHABLE(); + return SLJIT_SUCCESS; +} + +static SLJIT_INLINE sljit_s32 emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw init_value) +{ + FAIL_IF(push_inst(compiler, LUI | T(dst) | IMM(init_value >> 48), DR(dst))); + FAIL_IF(push_inst(compiler, ORI | S(dst) | T(dst) | IMM(init_value >> 32), DR(dst))); + FAIL_IF(push_inst(compiler, DSLL | T(dst) | D(dst) | SH_IMM(16), DR(dst))); + FAIL_IF(push_inst(compiler, ORI | S(dst) | T(dst) | IMM(init_value >> 16), DR(dst))); + FAIL_IF(push_inst(compiler, DSLL | T(dst) | D(dst) | SH_IMM(16), DR(dst))); + return push_inst(compiler, ORI | S(dst) | T(dst) | IMM(init_value), DR(dst)); +} + +SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset) +{ + sljit_ins *inst = (sljit_ins *)addr; + + inst[0] = (inst[0] & 0xffff0000) | ((new_target >> 48) & 0xffff); + inst[1] = (inst[1] & 0xffff0000) | ((new_target >> 32) & 0xffff); + inst[3] = (inst[3] & 0xffff0000) | ((new_target >> 16) & 0xffff); + inst[5] = (inst[5] & 0xffff0000) | (new_target & 0xffff); + inst = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset); + SLJIT_CACHE_FLUSH(inst, inst + 6); +} + +SLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_constant, sljit_sw executable_offset) +{ + sljit_ins *inst = (sljit_ins *)addr; + + inst[0] = (inst[0] & 0xffff0000) | ((new_constant >> 48) & 0xffff); + inst[1] = (inst[1] & 0xffff0000) | ((new_constant >> 32) & 0xffff); + inst[3] = (inst[3] & 0xffff0000) | ((new_constant >> 16) & 0xffff); + inst[5] = (inst[5] & 0xffff0000) | (new_constant & 0xffff); + inst = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset); + SLJIT_CACHE_FLUSH(inst, inst + 6); +} + +static sljit_s32 call_with_args(struct sljit_compiler *compiler, sljit_s32 arg_types, sljit_ins *ins_ptr) +{ + sljit_s32 arg_count = 0; + sljit_s32 word_arg_count = 0; + sljit_s32 float_arg_count = 0; + sljit_s32 types = 0; + sljit_ins prev_ins = NOP; + sljit_ins ins = NOP; + + SLJIT_ASSERT(reg_map[TMP_REG1] == 4 && freg_map[TMP_FREG1] == 12); + + arg_types >>= SLJIT_DEF_SHIFT; + + while (arg_types) { + types = (types << SLJIT_DEF_SHIFT) | (arg_types & SLJIT_DEF_MASK); + + switch (arg_types & SLJIT_DEF_MASK) { + case SLJIT_ARG_TYPE_F32: + case SLJIT_ARG_TYPE_F64: + arg_count++; + float_arg_count++; + break; + default: + arg_count++; + word_arg_count++; + break; + } + + arg_types >>= SLJIT_DEF_SHIFT; + } + + while (types) { + switch (types & SLJIT_DEF_MASK) { + case SLJIT_ARG_TYPE_F32: + if (arg_count != float_arg_count) + ins = MOV_S | FMT_S | FS(float_arg_count) | FD(arg_count); + else if (arg_count == 1) + ins = MOV_S | FMT_S | FS(SLJIT_FR0) | FD(TMP_FREG1); + arg_count--; + float_arg_count--; + break; + case SLJIT_ARG_TYPE_F64: + if (arg_count != float_arg_count) + ins = MOV_S | FMT_D | FS(float_arg_count) | FD(arg_count); + else if (arg_count == 1) + ins = MOV_S | FMT_D | FS(SLJIT_FR0) | FD(TMP_FREG1); + arg_count--; + float_arg_count--; + break; + default: + if (arg_count != word_arg_count) + ins = DADDU | S(word_arg_count) | TA(0) | D(arg_count); + else if (arg_count == 1) + ins = DADDU | S(SLJIT_R0) | TA(0) | DA(4); + arg_count--; + word_arg_count--; + break; + } + + if (ins != NOP) { + if (prev_ins != NOP) + FAIL_IF(push_inst(compiler, prev_ins, MOVABLE_INS)); + prev_ins = ins; + ins = NOP; + } + + types >>= SLJIT_DEF_SHIFT; + } + + *ins_ptr = prev_ins; + + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_call(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 arg_types) +{ + struct sljit_jump *jump; + sljit_ins ins; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_call(compiler, type, arg_types)); + + jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump)); + PTR_FAIL_IF(!jump); + set_jump(jump, compiler, type & SLJIT_REWRITABLE_JUMP); + type &= 0xff; + + PTR_FAIL_IF(call_with_args(compiler, arg_types, &ins)); + + SLJIT_ASSERT(DR(PIC_ADDR_REG) == 25 && PIC_ADDR_REG == TMP_REG2); + + PTR_FAIL_IF(emit_const(compiler, PIC_ADDR_REG, 0)); + + jump->flags |= IS_JAL | IS_CALL; + PTR_FAIL_IF(push_inst(compiler, JALR | S(PIC_ADDR_REG) | DA(RETURN_ADDR_REG), UNMOVABLE_INS)); + jump->addr = compiler->size; + PTR_FAIL_IF(push_inst(compiler, ins, UNMOVABLE_INS)); + + return jump; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_icall(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 arg_types, + sljit_s32 src, sljit_sw srcw) +{ + sljit_ins ins; + + CHECK_ERROR(); + CHECK(check_sljit_emit_icall(compiler, type, arg_types, src, srcw)); + + SLJIT_ASSERT(DR(PIC_ADDR_REG) == 25 && PIC_ADDR_REG == TMP_REG2); + + if (src & SLJIT_IMM) + FAIL_IF(load_immediate(compiler, DR(PIC_ADDR_REG), srcw)); + else if (FAST_IS_REG(src)) + FAIL_IF(push_inst(compiler, DADDU | S(src) | TA(0) | D(PIC_ADDR_REG), DR(PIC_ADDR_REG))); + else if (src & SLJIT_MEM) { + ADJUST_LOCAL_OFFSET(src, srcw); + FAIL_IF(emit_op_mem(compiler, WORD_DATA | LOAD_DATA, DR(PIC_ADDR_REG), src, srcw)); + } + + FAIL_IF(call_with_args(compiler, arg_types, &ins)); + + /* Register input. */ + FAIL_IF(push_inst(compiler, JALR | S(PIC_ADDR_REG) | DA(RETURN_ADDR_REG), UNMOVABLE_INS)); + return push_inst(compiler, ins, UNMOVABLE_INS); +} diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeMIPS_common.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeMIPS_common.c new file mode 100755 index 000000000..7d1d08749 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeMIPS_common.c @@ -0,0 +1,2286 @@ +/* + * Stack-less Just-In-Time compiler + * + * Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* Latest MIPS architecture. */ +/* Automatically detect SLJIT_MIPS_R1 */ + +#if (defined __mips_isa_rev) && (__mips_isa_rev >= 6) +#define SLJIT_MIPS_R6 1 +#endif + +SLJIT_API_FUNC_ATTRIBUTE const char* sljit_get_platform_name(void) +{ +#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) + +#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) + return "MIPS32-R6" SLJIT_CPUINFO; +#else /* !SLJIT_CONFIG_MIPS_32 */ + return "MIPS64-R6" SLJIT_CPUINFO; +#endif /* SLJIT_CONFIG_MIPS_32 */ + +#elif (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1) + +#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) + return "MIPS32-R1" SLJIT_CPUINFO; +#else /* !SLJIT_CONFIG_MIPS_32 */ + return "MIPS64-R1" SLJIT_CPUINFO; +#endif /* SLJIT_CONFIG_MIPS_32 */ + +#else /* SLJIT_MIPS_R1 */ + return "MIPS III" SLJIT_CPUINFO; +#endif /* SLJIT_MIPS_R6 */ +} + +/* Length of an instruction word + Both for mips-32 and mips-64 */ +typedef sljit_u32 sljit_ins; + +#define TMP_REG1 (SLJIT_NUMBER_OF_REGISTERS + 2) +#define TMP_REG2 (SLJIT_NUMBER_OF_REGISTERS + 3) +#define TMP_REG3 (SLJIT_NUMBER_OF_REGISTERS + 4) + +/* For position independent code, t9 must contain the function address. */ +#define PIC_ADDR_REG TMP_REG2 + +/* Floating point status register. */ +#define FCSR_REG 31 +/* Return address register. */ +#define RETURN_ADDR_REG 31 + +/* Flags are kept in volatile registers. */ +#define EQUAL_FLAG 3 +#define OTHER_FLAG 1 + +#define TMP_FREG1 (SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1) +#define TMP_FREG2 (SLJIT_NUMBER_OF_FLOAT_REGISTERS + 2) +#define TMP_FREG3 (SLJIT_NUMBER_OF_FLOAT_REGISTERS + 3) + +static const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 5] = { + 0, 2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 24, 23, 22, 21, 20, 19, 18, 17, 16, 29, 4, 25, 31 +}; + +#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) + +static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 4] = { + 0, 0, 14, 2, 4, 6, 8, 12, 10, 16 +}; + +#else + +static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 4] = { + 0, 0, 13, 14, 15, 16, 17, 12, 18, 10 +}; + +#endif + +/* --------------------------------------------------------------------- */ +/* Instrucion forms */ +/* --------------------------------------------------------------------- */ + +#define S(s) (reg_map[s] << 21) +#define T(t) (reg_map[t] << 16) +#define D(d) (reg_map[d] << 11) +#define FT(t) (freg_map[t] << 16) +#define FS(s) (freg_map[s] << 11) +#define FD(d) (freg_map[d] << 6) +/* Absolute registers. */ +#define SA(s) ((s) << 21) +#define TA(t) ((t) << 16) +#define DA(d) ((d) << 11) +#define IMM(imm) ((imm) & 0xffff) +#define SH_IMM(imm) ((imm) << 6) + +#define DR(dr) (reg_map[dr]) +#define FR(dr) (freg_map[dr]) +#define HI(opcode) ((opcode) << 26) +#define LO(opcode) (opcode) +#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) +/* CMP.cond.fmt */ +/* S = (20 << 21) D = (21 << 21) */ +#define CMP_FMT_S (20 << 21) +#endif /* SLJIT_MIPS_R6 */ +/* S = (16 << 21) D = (17 << 21) */ +#define FMT_S (16 << 21) +#define FMT_D (17 << 21) + +#define ABS_S (HI(17) | FMT_S | LO(5)) +#define ADD_S (HI(17) | FMT_S | LO(0)) +#define ADDIU (HI(9)) +#define ADDU (HI(0) | LO(33)) +#define AND (HI(0) | LO(36)) +#define ANDI (HI(12)) +#define B (HI(4)) +#define BAL (HI(1) | (17 << 16)) +#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) +#define BC1EQZ (HI(17) | (9 << 21) | FT(TMP_FREG3)) +#define BC1NEZ (HI(17) | (13 << 21) | FT(TMP_FREG3)) +#else /* !SLJIT_MIPS_R6 */ +#define BC1F (HI(17) | (8 << 21)) +#define BC1T (HI(17) | (8 << 21) | (1 << 16)) +#endif /* SLJIT_MIPS_R6 */ +#define BEQ (HI(4)) +#define BGEZ (HI(1) | (1 << 16)) +#define BGTZ (HI(7)) +#define BLEZ (HI(6)) +#define BLTZ (HI(1) | (0 << 16)) +#define BNE (HI(5)) +#define BREAK (HI(0) | LO(13)) +#define CFC1 (HI(17) | (2 << 21)) +#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) +#define C_UEQ_S (HI(17) | CMP_FMT_S | LO(3)) +#define C_ULE_S (HI(17) | CMP_FMT_S | LO(7)) +#define C_ULT_S (HI(17) | CMP_FMT_S | LO(5)) +#define C_UN_S (HI(17) | CMP_FMT_S | LO(1)) +#define C_FD (FD(TMP_FREG3)) +#else /* !SLJIT_MIPS_R6 */ +#define C_UEQ_S (HI(17) | FMT_S | LO(51)) +#define C_ULE_S (HI(17) | FMT_S | LO(55)) +#define C_ULT_S (HI(17) | FMT_S | LO(53)) +#define C_UN_S (HI(17) | FMT_S | LO(49)) +#define C_FD (0) +#endif /* SLJIT_MIPS_R6 */ +#define CVT_S_S (HI(17) | FMT_S | LO(32)) +#define DADDIU (HI(25)) +#define DADDU (HI(0) | LO(45)) +#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) +#define DDIV (HI(0) | (2 << 6) | LO(30)) +#define DDIVU (HI(0) | (2 << 6) | LO(31)) +#define DMOD (HI(0) | (3 << 6) | LO(30)) +#define DMODU (HI(0) | (3 << 6) | LO(31)) +#define DIV (HI(0) | (2 << 6) | LO(26)) +#define DIVU (HI(0) | (2 << 6) | LO(27)) +#define DMUH (HI(0) | (3 << 6) | LO(28)) +#define DMUHU (HI(0) | (3 << 6) | LO(29)) +#define DMUL (HI(0) | (2 << 6) | LO(28)) +#define DMULU (HI(0) | (2 << 6) | LO(29)) +#else /* !SLJIT_MIPS_R6 */ +#define DDIV (HI(0) | LO(30)) +#define DDIVU (HI(0) | LO(31)) +#define DIV (HI(0) | LO(26)) +#define DIVU (HI(0) | LO(27)) +#define DMULT (HI(0) | LO(28)) +#define DMULTU (HI(0) | LO(29)) +#endif /* SLJIT_MIPS_R6 */ +#define DIV_S (HI(17) | FMT_S | LO(3)) +#define DSLL (HI(0) | LO(56)) +#define DSLL32 (HI(0) | LO(60)) +#define DSLLV (HI(0) | LO(20)) +#define DSRA (HI(0) | LO(59)) +#define DSRA32 (HI(0) | LO(63)) +#define DSRAV (HI(0) | LO(23)) +#define DSRL (HI(0) | LO(58)) +#define DSRL32 (HI(0) | LO(62)) +#define DSRLV (HI(0) | LO(22)) +#define DSUBU (HI(0) | LO(47)) +#define J (HI(2)) +#define JAL (HI(3)) +#define JALR (HI(0) | LO(9)) +#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) +#define JR (HI(0) | LO(9)) +#else /* !SLJIT_MIPS_R6 */ +#define JR (HI(0) | LO(8)) +#endif /* SLJIT_MIPS_R6 */ +#define LD (HI(55)) +#define LUI (HI(15)) +#define LW (HI(35)) +#define MFC1 (HI(17)) +#if !(defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) +#define MFHI (HI(0) | LO(16)) +#define MFLO (HI(0) | LO(18)) +#else /* SLJIT_MIPS_R6 */ +#define MOD (HI(0) | (3 << 6) | LO(26)) +#define MODU (HI(0) | (3 << 6) | LO(27)) +#endif /* !SLJIT_MIPS_R6 */ +#define MOV_S (HI(17) | FMT_S | LO(6)) +#define MTC1 (HI(17) | (4 << 21)) +#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) +#define MUH (HI(0) | (3 << 6) | LO(24)) +#define MUHU (HI(0) | (3 << 6) | LO(25)) +#define MUL (HI(0) | (2 << 6) | LO(24)) +#define MULU (HI(0) | (2 << 6) | LO(25)) +#else /* !SLJIT_MIPS_R6 */ +#define MULT (HI(0) | LO(24)) +#define MULTU (HI(0) | LO(25)) +#endif /* SLJIT_MIPS_R6 */ +#define MUL_S (HI(17) | FMT_S | LO(2)) +#define NEG_S (HI(17) | FMT_S | LO(7)) +#define NOP (HI(0) | LO(0)) +#define NOR (HI(0) | LO(39)) +#define OR (HI(0) | LO(37)) +#define ORI (HI(13)) +#define SD (HI(63)) +#define SDC1 (HI(61)) +#define SLT (HI(0) | LO(42)) +#define SLTI (HI(10)) +#define SLTIU (HI(11)) +#define SLTU (HI(0) | LO(43)) +#define SLL (HI(0) | LO(0)) +#define SLLV (HI(0) | LO(4)) +#define SRL (HI(0) | LO(2)) +#define SRLV (HI(0) | LO(6)) +#define SRA (HI(0) | LO(3)) +#define SRAV (HI(0) | LO(7)) +#define SUB_S (HI(17) | FMT_S | LO(1)) +#define SUBU (HI(0) | LO(35)) +#define SW (HI(43)) +#define SWC1 (HI(57)) +#define TRUNC_W_S (HI(17) | FMT_S | LO(13)) +#define XOR (HI(0) | LO(38)) +#define XORI (HI(14)) + +#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1) || (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) +#define CLZ (HI(28) | LO(32)) +#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) +#define DCLZ (LO(18)) +#else /* !SLJIT_MIPS_R6 */ +#define DCLZ (HI(28) | LO(36)) +#define MOVF (HI(0) | (0 << 16) | LO(1)) +#define MOVN (HI(0) | LO(11)) +#define MOVT (HI(0) | (1 << 16) | LO(1)) +#define MOVZ (HI(0) | LO(10)) +#define MUL (HI(28) | LO(2)) +#endif /* SLJIT_MIPS_R6 */ +#define PREF (HI(51)) +#define PREFX (HI(19) | LO(15)) +#define SEB (HI(31) | (16 << 6) | LO(32)) +#define SEH (HI(31) | (24 << 6) | LO(32)) +#endif + +#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) +#define ADDU_W ADDU +#define ADDIU_W ADDIU +#define SLL_W SLL +#define SUBU_W SUBU +#else +#define ADDU_W DADDU +#define ADDIU_W DADDIU +#define SLL_W DSLL +#define SUBU_W DSUBU +#endif + +#define SIMM_MAX (0x7fff) +#define SIMM_MIN (-0x8000) +#define UIMM_MAX (0xffff) + +/* dest_reg is the absolute name of the register + Useful for reordering instructions in the delay slot. */ +static sljit_s32 push_inst(struct sljit_compiler *compiler, sljit_ins ins, sljit_s32 delay_slot) +{ + SLJIT_ASSERT(delay_slot == MOVABLE_INS || delay_slot >= UNMOVABLE_INS + || delay_slot == ((ins >> 11) & 0x1f) || delay_slot == ((ins >> 16) & 0x1f)); + sljit_ins *ptr = (sljit_ins*)ensure_buf(compiler, sizeof(sljit_ins)); + FAIL_IF(!ptr); + *ptr = ins; + compiler->size++; + compiler->delay_slot = delay_slot; + return SLJIT_SUCCESS; +} + +static SLJIT_INLINE sljit_ins invert_branch(sljit_s32 flags) +{ + if (flags & IS_BIT26_COND) + return (1 << 26); +#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) + if (flags & IS_BIT23_COND) + return (1 << 23); +#endif /* SLJIT_MIPS_R6 */ + return (1 << 16); +} + +static SLJIT_INLINE sljit_ins* detect_jump_type(struct sljit_jump *jump, sljit_ins *code_ptr, sljit_ins *code, sljit_sw executable_offset) +{ + sljit_sw diff; + sljit_uw target_addr; + sljit_ins *inst; + sljit_ins saved_inst; + +#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) + if (jump->flags & (SLJIT_REWRITABLE_JUMP | IS_CALL)) + return code_ptr; +#else + if (jump->flags & SLJIT_REWRITABLE_JUMP) + return code_ptr; +#endif + + if (jump->flags & JUMP_ADDR) + target_addr = jump->u.target; + else { + SLJIT_ASSERT(jump->flags & JUMP_LABEL); + target_addr = (sljit_uw)(code + jump->u.label->size) + (sljit_uw)executable_offset; + } + + inst = (sljit_ins *)jump->addr; + if (jump->flags & IS_COND) + inst--; + +#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) + if (jump->flags & IS_CALL) + goto keep_address; +#endif + + /* B instructions. */ + if (jump->flags & IS_MOVABLE) { + diff = ((sljit_sw)target_addr - (sljit_sw)inst - executable_offset) >> 2; + if (diff <= SIMM_MAX && diff >= SIMM_MIN) { + jump->flags |= PATCH_B; + + if (!(jump->flags & IS_COND)) { + inst[0] = inst[-1]; + inst[-1] = (jump->flags & IS_JAL) ? BAL : B; + jump->addr -= sizeof(sljit_ins); + return inst; + } + saved_inst = inst[0]; + inst[0] = inst[-1]; + inst[-1] = saved_inst ^ invert_branch(jump->flags); + jump->addr -= 2 * sizeof(sljit_ins); + return inst; + } + } + else { + diff = ((sljit_sw)target_addr - (sljit_sw)(inst + 1) - executable_offset) >> 2; + if (diff <= SIMM_MAX && diff >= SIMM_MIN) { + jump->flags |= PATCH_B; + + if (!(jump->flags & IS_COND)) { + inst[0] = (jump->flags & IS_JAL) ? BAL : B; + inst[1] = NOP; + return inst + 1; + } + inst[0] = inst[0] ^ invert_branch(jump->flags); + inst[1] = NOP; + jump->addr -= sizeof(sljit_ins); + return inst + 1; + } + } + + if (jump->flags & IS_COND) { + if ((jump->flags & IS_MOVABLE) && (target_addr & ~0xfffffff) == ((jump->addr + 2 * sizeof(sljit_ins)) & ~0xfffffff)) { + jump->flags |= PATCH_J; + saved_inst = inst[0]; + inst[0] = inst[-1]; + inst[-1] = (saved_inst & 0xffff0000) | 3; + inst[1] = J; + inst[2] = NOP; + return inst + 2; + } + else if ((target_addr & ~0xfffffff) == ((jump->addr + 3 * sizeof(sljit_ins)) & ~0xfffffff)) { + jump->flags |= PATCH_J; + inst[0] = (inst[0] & 0xffff0000) | 3; + inst[1] = NOP; + inst[2] = J; + inst[3] = NOP; + jump->addr += sizeof(sljit_ins); + return inst + 3; + } + } + else { + /* J instuctions. */ + if ((jump->flags & IS_MOVABLE) && (target_addr & ~0xfffffff) == (jump->addr & ~0xfffffff)) { + jump->flags |= PATCH_J; + inst[0] = inst[-1]; + inst[-1] = (jump->flags & IS_JAL) ? JAL : J; + jump->addr -= sizeof(sljit_ins); + return inst; + } + + if ((target_addr & ~0xfffffff) == ((jump->addr + sizeof(sljit_ins)) & ~0xfffffff)) { + jump->flags |= PATCH_J; + inst[0] = (jump->flags & IS_JAL) ? JAL : J; + inst[1] = NOP; + return inst + 1; + } + } + +#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) +keep_address: + if (target_addr <= 0x7fffffff) { + jump->flags |= PATCH_ABS32; + if (jump->flags & IS_COND) { + inst[0] -= 4; + inst++; + } + inst[2] = inst[6]; + inst[3] = inst[7]; + return inst + 3; + } + if (target_addr <= 0x7fffffffffffl) { + jump->flags |= PATCH_ABS48; + if (jump->flags & IS_COND) { + inst[0] -= 2; + inst++; + } + inst[4] = inst[6]; + inst[5] = inst[7]; + return inst + 5; + } +#endif + + return code_ptr; +} + +#ifdef __GNUC__ +static __attribute__ ((noinline)) void sljit_cache_flush(void* code, void* code_ptr) +{ + SLJIT_CACHE_FLUSH(code, code_ptr); +} +#endif + +#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) + +static SLJIT_INLINE sljit_sw put_label_get_length(struct sljit_put_label *put_label, sljit_uw max_label) +{ + if (max_label < 0x80000000l) { + put_label->flags = 0; + return 1; + } + + if (max_label < 0x800000000000l) { + put_label->flags = 1; + return 3; + } + + put_label->flags = 2; + return 5; +} + +static SLJIT_INLINE void put_label_set(struct sljit_put_label *put_label) +{ + sljit_uw addr = put_label->label->addr; + sljit_ins *inst = (sljit_ins *)put_label->addr; + sljit_s32 reg = *inst; + + if (put_label->flags == 0) { + SLJIT_ASSERT(addr < 0x80000000l); + inst[0] = LUI | T(reg) | IMM(addr >> 16); + } + else if (put_label->flags == 1) { + SLJIT_ASSERT(addr < 0x800000000000l); + inst[0] = LUI | T(reg) | IMM(addr >> 32); + inst[1] = ORI | S(reg) | T(reg) | IMM((addr >> 16) & 0xffff); + inst[2] = DSLL | T(reg) | D(reg) | SH_IMM(16); + inst += 2; + } + else { + inst[0] = LUI | T(reg) | IMM(addr >> 48); + inst[1] = ORI | S(reg) | T(reg) | IMM((addr >> 32) & 0xffff); + inst[2] = DSLL | T(reg) | D(reg) | SH_IMM(16); + inst[3] = ORI | S(reg) | T(reg) | IMM((addr >> 16) & 0xffff); + inst[4] = DSLL | T(reg) | D(reg) | SH_IMM(16); + inst += 4; + } + + inst[1] = ORI | S(reg) | T(reg) | IMM(addr & 0xffff); +} + +#endif + +SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler) +{ + struct sljit_memory_fragment *buf; + sljit_ins *code; + sljit_ins *code_ptr; + sljit_ins *buf_ptr; + sljit_ins *buf_end; + sljit_uw word_count; + sljit_uw next_addr; + sljit_sw executable_offset; + sljit_uw addr; + + struct sljit_label *label; + struct sljit_jump *jump; + struct sljit_const *const_; + struct sljit_put_label *put_label; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_generate_code(compiler)); + reverse_buf(compiler); + + code = (sljit_ins*)SLJIT_MALLOC_EXEC(compiler->size * sizeof(sljit_ins)); + PTR_FAIL_WITH_EXEC_IF(code); + buf = compiler->buf; + + code_ptr = code; + word_count = 0; + next_addr = 0; + executable_offset = SLJIT_EXEC_OFFSET(code); + + label = compiler->labels; + jump = compiler->jumps; + const_ = compiler->consts; + put_label = compiler->put_labels; + + do { + buf_ptr = (sljit_ins*)buf->memory; + buf_end = buf_ptr + (buf->used_size >> 2); + do { + *code_ptr = *buf_ptr++; + if (next_addr == word_count) { + SLJIT_ASSERT(!label || label->size >= word_count); + SLJIT_ASSERT(!jump || jump->addr >= word_count); + SLJIT_ASSERT(!const_ || const_->addr >= word_count); + SLJIT_ASSERT(!put_label || put_label->addr >= word_count); + + /* These structures are ordered by their address. */ + if (label && label->size == word_count) { + label->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); + label->size = code_ptr - code; + label = label->next; + } + if (jump && jump->addr == word_count) { +#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) + jump->addr = (sljit_uw)(code_ptr - 3); +#else + jump->addr = (sljit_uw)(code_ptr - 7); +#endif + code_ptr = detect_jump_type(jump, code_ptr, code, executable_offset); + jump = jump->next; + } + if (const_ && const_->addr == word_count) { + const_->addr = (sljit_uw)code_ptr; + const_ = const_->next; + } + if (put_label && put_label->addr == word_count) { + SLJIT_ASSERT(put_label->label); + put_label->addr = (sljit_uw)code_ptr; +#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) + code_ptr += put_label_get_length(put_label, (sljit_uw)(SLJIT_ADD_EXEC_OFFSET(code, executable_offset) + put_label->label->size)); + word_count += 5; +#endif + put_label = put_label->next; + } + next_addr = compute_next_addr(label, jump, const_, put_label); + } + code_ptr ++; + word_count ++; + } while (buf_ptr < buf_end); + + buf = buf->next; + } while (buf); + + if (label && label->size == word_count) { + label->addr = (sljit_uw)code_ptr; + label->size = code_ptr - code; + label = label->next; + } + + SLJIT_ASSERT(!label); + SLJIT_ASSERT(!jump); + SLJIT_ASSERT(!const_); + SLJIT_ASSERT(!put_label); + SLJIT_ASSERT(code_ptr - code <= (sljit_sw)compiler->size); + + jump = compiler->jumps; + while (jump) { + do { + addr = (jump->flags & JUMP_LABEL) ? jump->u.label->addr : jump->u.target; + buf_ptr = (sljit_ins *)jump->addr; + + if (jump->flags & PATCH_B) { + addr = (sljit_sw)(addr - ((sljit_uw)SLJIT_ADD_EXEC_OFFSET(buf_ptr, executable_offset) + sizeof(sljit_ins))) >> 2; + SLJIT_ASSERT((sljit_sw)addr <= SIMM_MAX && (sljit_sw)addr >= SIMM_MIN); + buf_ptr[0] = (buf_ptr[0] & 0xffff0000) | (addr & 0xffff); + break; + } + if (jump->flags & PATCH_J) { + SLJIT_ASSERT((addr & ~0xfffffff) == (((sljit_uw)SLJIT_ADD_EXEC_OFFSET(buf_ptr, executable_offset) + sizeof(sljit_ins)) & ~0xfffffff)); + buf_ptr[0] |= (addr >> 2) & 0x03ffffff; + break; + } + + /* Set the fields of immediate loads. */ +#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) + buf_ptr[0] = (buf_ptr[0] & 0xffff0000) | ((addr >> 16) & 0xffff); + buf_ptr[1] = (buf_ptr[1] & 0xffff0000) | (addr & 0xffff); +#else + if (jump->flags & PATCH_ABS32) { + SLJIT_ASSERT(addr <= 0x7fffffff); + buf_ptr[0] = (buf_ptr[0] & 0xffff0000) | ((addr >> 16) & 0xffff); + buf_ptr[1] = (buf_ptr[1] & 0xffff0000) | (addr & 0xffff); + } + else if (jump->flags & PATCH_ABS48) { + SLJIT_ASSERT(addr <= 0x7fffffffffffl); + buf_ptr[0] = (buf_ptr[0] & 0xffff0000) | ((addr >> 32) & 0xffff); + buf_ptr[1] = (buf_ptr[1] & 0xffff0000) | ((addr >> 16) & 0xffff); + buf_ptr[3] = (buf_ptr[3] & 0xffff0000) | (addr & 0xffff); + } + else { + buf_ptr[0] = (buf_ptr[0] & 0xffff0000) | ((addr >> 48) & 0xffff); + buf_ptr[1] = (buf_ptr[1] & 0xffff0000) | ((addr >> 32) & 0xffff); + buf_ptr[3] = (buf_ptr[3] & 0xffff0000) | ((addr >> 16) & 0xffff); + buf_ptr[5] = (buf_ptr[5] & 0xffff0000) | (addr & 0xffff); + } +#endif + } while (0); + jump = jump->next; + } + + put_label = compiler->put_labels; + while (put_label) { +#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) + addr = put_label->label->addr; + buf_ptr = (sljit_ins *)put_label->addr; + + SLJIT_ASSERT((buf_ptr[0] & 0xffe00000) == LUI && (buf_ptr[1] & 0xfc000000) == ORI); + buf_ptr[0] |= (addr >> 16) & 0xffff; + buf_ptr[1] |= addr & 0xffff; +#else + put_label_set(put_label); +#endif + put_label = put_label->next; + } + + compiler->error = SLJIT_ERR_COMPILED; + compiler->executable_offset = executable_offset; + compiler->executable_size = (code_ptr - code) * sizeof(sljit_ins); + + code = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(code, executable_offset); + code_ptr = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); + +#ifndef __GNUC__ + SLJIT_CACHE_FLUSH(code, code_ptr); +#else + /* GCC workaround for invalid code generation with -O2. */ + sljit_cache_flush(code, code_ptr); +#endif + return code; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type) +{ + sljit_sw fir = 0; + + switch (feature_type) { + case SLJIT_HAS_FPU: +#ifdef SLJIT_IS_FPU_AVAILABLE + return SLJIT_IS_FPU_AVAILABLE; +#elif defined(__GNUC__) + asm ("cfc1 %0, $0" : "=r"(fir)); + return (fir >> 22) & 0x1; +#else +#error "FIR check is not implemented for this architecture" +#endif + +#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1) + case SLJIT_HAS_CLZ: + case SLJIT_HAS_CMOV: + return 1; +#endif + + default: + return fir; + } +} + +/* --------------------------------------------------------------------- */ +/* Entry, exit */ +/* --------------------------------------------------------------------- */ + +/* Creates an index in data_transfer_insts array. */ +#define LOAD_DATA 0x01 +#define WORD_DATA 0x00 +#define BYTE_DATA 0x02 +#define HALF_DATA 0x04 +#define INT_DATA 0x06 +#define SIGNED_DATA 0x08 +/* Separates integer and floating point registers */ +#define GPR_REG 0x0f +#define DOUBLE_DATA 0x10 +#define SINGLE_DATA 0x12 + +#define MEM_MASK 0x1f + +#define ARG_TEST 0x00020 +#define ALT_KEEP_CACHE 0x00040 +#define CUMULATIVE_OP 0x00080 +#define LOGICAL_OP 0x00100 +#define IMM_OP 0x00200 +#define SRC2_IMM 0x00400 + +#define UNUSED_DEST 0x00800 +#define REG_DEST 0x01000 +#define REG1_SOURCE 0x02000 +#define REG2_SOURCE 0x04000 +#define SLOW_SRC1 0x08000 +#define SLOW_SRC2 0x10000 +#define SLOW_DEST 0x20000 + +#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) +#define STACK_STORE SW +#define STACK_LOAD LW +#else +#define STACK_STORE SD +#define STACK_LOAD LD +#endif + +static SLJIT_INLINE sljit_s32 emit_op_mem(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg_ar, sljit_s32 arg, sljit_sw argw); + +#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) +#include "sljitNativeMIPS_32.c" +#else +#include "sljitNativeMIPS_64.c" +#endif + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compiler, + sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds, + sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size) +{ + sljit_ins base; + sljit_s32 args, i, tmp, offs; + + CHECK_ERROR(); + CHECK(check_sljit_emit_enter(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size)); + set_emit_enter(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size); + + local_size += GET_SAVED_REGISTERS_SIZE(scratches, saveds, 1) + SLJIT_LOCALS_OFFSET; +#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) + local_size = (local_size + 15) & ~0xf; +#else + local_size = (local_size + 31) & ~0x1f; +#endif + compiler->local_size = local_size; + + if (local_size <= SIMM_MAX) { + /* Frequent case. */ + FAIL_IF(push_inst(compiler, ADDIU_W | S(SLJIT_SP) | T(SLJIT_SP) | IMM(-local_size), DR(SLJIT_SP))); + base = S(SLJIT_SP); + offs = local_size - (sljit_sw)sizeof(sljit_sw); + } + else { + FAIL_IF(load_immediate(compiler, DR(OTHER_FLAG), local_size)); + FAIL_IF(push_inst(compiler, ADDU_W | S(SLJIT_SP) | TA(0) | D(TMP_REG2), DR(TMP_REG2))); + FAIL_IF(push_inst(compiler, SUBU_W | S(SLJIT_SP) | T(OTHER_FLAG) | D(SLJIT_SP), DR(SLJIT_SP))); + base = S(TMP_REG2); + local_size = 0; + offs = -(sljit_sw)sizeof(sljit_sw); + } + + FAIL_IF(push_inst(compiler, STACK_STORE | base | TA(RETURN_ADDR_REG) | IMM(offs), MOVABLE_INS)); + + tmp = saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? (SLJIT_S0 + 1 - saveds) : SLJIT_FIRST_SAVED_REG; + for (i = SLJIT_S0; i >= tmp; i--) { + offs -= (sljit_s32)(sizeof(sljit_sw)); + FAIL_IF(push_inst(compiler, STACK_STORE | base | T(i) | IMM(offs), MOVABLE_INS)); + } + + for (i = scratches; i >= SLJIT_FIRST_SAVED_REG; i--) { + offs -= (sljit_s32)(sizeof(sljit_sw)); + FAIL_IF(push_inst(compiler, STACK_STORE | base | T(i) | IMM(offs), MOVABLE_INS)); + } + + args = get_arg_count(arg_types); + + if (args >= 1) + FAIL_IF(push_inst(compiler, ADDU_W | SA(4) | TA(0) | D(SLJIT_S0), DR(SLJIT_S0))); + if (args >= 2) + FAIL_IF(push_inst(compiler, ADDU_W | SA(5) | TA(0) | D(SLJIT_S1), DR(SLJIT_S1))); + if (args >= 3) + FAIL_IF(push_inst(compiler, ADDU_W | SA(6) | TA(0) | D(SLJIT_S2), DR(SLJIT_S2))); + + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_set_context(struct sljit_compiler *compiler, + sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds, + sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size) +{ + CHECK_ERROR(); + CHECK(check_sljit_set_context(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size)); + set_set_context(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size); + + local_size += GET_SAVED_REGISTERS_SIZE(scratches, saveds, 1) + SLJIT_LOCALS_OFFSET; +#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) + compiler->local_size = (local_size + 15) & ~0xf; +#else + compiler->local_size = (local_size + 31) & ~0x1f; +#endif + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw) +{ + sljit_s32 local_size, i, tmp, offs; + sljit_ins base; + + CHECK_ERROR(); + CHECK(check_sljit_emit_return(compiler, op, src, srcw)); + + FAIL_IF(emit_mov_before_return(compiler, op, src, srcw)); + + local_size = compiler->local_size; + if (local_size <= SIMM_MAX) + base = S(SLJIT_SP); + else { + FAIL_IF(load_immediate(compiler, DR(TMP_REG1), local_size)); + FAIL_IF(push_inst(compiler, ADDU_W | S(SLJIT_SP) | T(TMP_REG1) | D(TMP_REG1), DR(TMP_REG1))); + base = S(TMP_REG1); + local_size = 0; + } + + FAIL_IF(push_inst(compiler, STACK_LOAD | base | TA(RETURN_ADDR_REG) | IMM(local_size - (sljit_s32)sizeof(sljit_sw)), RETURN_ADDR_REG)); + offs = local_size - (sljit_s32)GET_SAVED_REGISTERS_SIZE(compiler->scratches, compiler->saveds, 1); + + tmp = compiler->scratches; + for (i = SLJIT_FIRST_SAVED_REG; i <= tmp; i++) { + FAIL_IF(push_inst(compiler, STACK_LOAD | base | T(i) | IMM(offs), DR(i))); + offs += (sljit_s32)(sizeof(sljit_sw)); + } + + tmp = compiler->saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? (SLJIT_S0 + 1 - compiler->saveds) : SLJIT_FIRST_SAVED_REG; + for (i = tmp; i <= SLJIT_S0; i++) { + FAIL_IF(push_inst(compiler, STACK_LOAD | base | T(i) | IMM(offs), DR(i))); + offs += (sljit_s32)(sizeof(sljit_sw)); + } + + SLJIT_ASSERT(offs == local_size - (sljit_sw)(sizeof(sljit_sw))); + + FAIL_IF(push_inst(compiler, JR | SA(RETURN_ADDR_REG), UNMOVABLE_INS)); + if (compiler->local_size <= SIMM_MAX) + return push_inst(compiler, ADDIU_W | S(SLJIT_SP) | T(SLJIT_SP) | IMM(compiler->local_size), UNMOVABLE_INS); + else + return push_inst(compiler, ADDU_W | S(TMP_REG1) | TA(0) | D(SLJIT_SP), UNMOVABLE_INS); +} + +#undef STACK_STORE +#undef STACK_LOAD + +/* --------------------------------------------------------------------- */ +/* Operators */ +/* --------------------------------------------------------------------- */ + +#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) +#define ARCH_32_64(a, b) a +#else +#define ARCH_32_64(a, b) b +#endif + +static const sljit_ins data_transfer_insts[16 + 4] = { +/* u w s */ ARCH_32_64(HI(43) /* sw */, HI(63) /* sd */), +/* u w l */ ARCH_32_64(HI(35) /* lw */, HI(55) /* ld */), +/* u b s */ HI(40) /* sb */, +/* u b l */ HI(36) /* lbu */, +/* u h s */ HI(41) /* sh */, +/* u h l */ HI(37) /* lhu */, +/* u i s */ HI(43) /* sw */, +/* u i l */ ARCH_32_64(HI(35) /* lw */, HI(39) /* lwu */), + +/* s w s */ ARCH_32_64(HI(43) /* sw */, HI(63) /* sd */), +/* s w l */ ARCH_32_64(HI(35) /* lw */, HI(55) /* ld */), +/* s b s */ HI(40) /* sb */, +/* s b l */ HI(32) /* lb */, +/* s h s */ HI(41) /* sh */, +/* s h l */ HI(33) /* lh */, +/* s i s */ HI(43) /* sw */, +/* s i l */ HI(35) /* lw */, + +/* d s */ HI(61) /* sdc1 */, +/* d l */ HI(53) /* ldc1 */, +/* s s */ HI(57) /* swc1 */, +/* s l */ HI(49) /* lwc1 */, +}; + +#undef ARCH_32_64 + +/* reg_ar is an absoulute register! */ + +/* Can perform an operation using at most 1 instruction. */ +static sljit_s32 getput_arg_fast(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg_ar, sljit_s32 arg, sljit_sw argw) +{ + SLJIT_ASSERT(arg & SLJIT_MEM); + + if (!(arg & OFFS_REG_MASK) && argw <= SIMM_MAX && argw >= SIMM_MIN) { + /* Works for both absoulte and relative addresses. */ + if (SLJIT_UNLIKELY(flags & ARG_TEST)) + return 1; + FAIL_IF(push_inst(compiler, data_transfer_insts[flags & MEM_MASK] | S(arg & REG_MASK) + | TA(reg_ar) | IMM(argw), ((flags & MEM_MASK) <= GPR_REG && (flags & LOAD_DATA)) ? reg_ar : MOVABLE_INS)); + return -1; + } + return 0; +} + +/* See getput_arg below. + Note: can_cache is called only for binary operators. Those + operators always uses word arguments without write back. */ +static sljit_s32 can_cache(sljit_s32 arg, sljit_sw argw, sljit_s32 next_arg, sljit_sw next_argw) +{ + SLJIT_ASSERT((arg & SLJIT_MEM) && (next_arg & SLJIT_MEM)); + + /* Simple operation except for updates. */ + if (arg & OFFS_REG_MASK) { + argw &= 0x3; + next_argw &= 0x3; + if (argw && argw == next_argw && (arg == next_arg || (arg & OFFS_REG_MASK) == (next_arg & OFFS_REG_MASK))) + return 1; + return 0; + } + + if (arg == next_arg) { + if (((next_argw - argw) <= SIMM_MAX && (next_argw - argw) >= SIMM_MIN)) + return 1; + return 0; + } + + return 0; +} + +/* Emit the necessary instructions. See can_cache above. */ +static sljit_s32 getput_arg(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg_ar, sljit_s32 arg, sljit_sw argw, sljit_s32 next_arg, sljit_sw next_argw) +{ + sljit_s32 tmp_ar, base, delay_slot; + + SLJIT_ASSERT(arg & SLJIT_MEM); + if (!(next_arg & SLJIT_MEM)) { + next_arg = 0; + next_argw = 0; + } + + if ((flags & MEM_MASK) <= GPR_REG && (flags & LOAD_DATA)) { + tmp_ar = reg_ar; + delay_slot = reg_ar; + } + else { + tmp_ar = DR(TMP_REG1); + delay_slot = MOVABLE_INS; + } + base = arg & REG_MASK; + + if (SLJIT_UNLIKELY(arg & OFFS_REG_MASK)) { + argw &= 0x3; + + /* Using the cache. */ + if (argw == compiler->cache_argw) { + if (arg == compiler->cache_arg) + return push_inst(compiler, data_transfer_insts[flags & MEM_MASK] | S(TMP_REG3) | TA(reg_ar), delay_slot); + + if ((SLJIT_MEM | (arg & OFFS_REG_MASK)) == compiler->cache_arg) { + if (arg == next_arg && argw == (next_argw & 0x3)) { + compiler->cache_arg = arg; + compiler->cache_argw = argw; + FAIL_IF(push_inst(compiler, ADDU_W | S(base) | T(TMP_REG3) | D(TMP_REG3), DR(TMP_REG3))); + return push_inst(compiler, data_transfer_insts[flags & MEM_MASK] | S(TMP_REG3) | TA(reg_ar), delay_slot); + } + FAIL_IF(push_inst(compiler, ADDU_W | S(base) | T(TMP_REG3) | DA(tmp_ar), tmp_ar)); + return push_inst(compiler, data_transfer_insts[flags & MEM_MASK] | SA(tmp_ar) | TA(reg_ar), delay_slot); + } + } + + if (SLJIT_UNLIKELY(argw)) { + compiler->cache_arg = SLJIT_MEM | (arg & OFFS_REG_MASK); + compiler->cache_argw = argw; + FAIL_IF(push_inst(compiler, SLL_W | T(OFFS_REG(arg)) | D(TMP_REG3) | SH_IMM(argw), DR(TMP_REG3))); + } + + if (arg == next_arg && argw == (next_argw & 0x3)) { + compiler->cache_arg = arg; + compiler->cache_argw = argw; + FAIL_IF(push_inst(compiler, ADDU_W | S(base) | T(!argw ? OFFS_REG(arg) : TMP_REG3) | D(TMP_REG3), DR(TMP_REG3))); + tmp_ar = DR(TMP_REG3); + } + else + FAIL_IF(push_inst(compiler, ADDU_W | S(base) | T(!argw ? OFFS_REG(arg) : TMP_REG3) | DA(tmp_ar), tmp_ar)); + return push_inst(compiler, data_transfer_insts[flags & MEM_MASK] | SA(tmp_ar) | TA(reg_ar), delay_slot); + } + + if (compiler->cache_arg == arg && argw - compiler->cache_argw <= SIMM_MAX && argw - compiler->cache_argw >= SIMM_MIN) { + if (argw != compiler->cache_argw) { + FAIL_IF(push_inst(compiler, ADDIU_W | S(TMP_REG3) | T(TMP_REG3) | IMM(argw - compiler->cache_argw), DR(TMP_REG3))); + compiler->cache_argw = argw; + } + return push_inst(compiler, data_transfer_insts[flags & MEM_MASK] | S(TMP_REG3) | TA(reg_ar), delay_slot); + } + + if (compiler->cache_arg == SLJIT_MEM && argw - compiler->cache_argw <= SIMM_MAX && argw - compiler->cache_argw >= SIMM_MIN) { + if (argw != compiler->cache_argw) + FAIL_IF(push_inst(compiler, ADDIU_W | S(TMP_REG3) | T(TMP_REG3) | IMM(argw - compiler->cache_argw), DR(TMP_REG3))); + } + else { + compiler->cache_arg = SLJIT_MEM; + FAIL_IF(load_immediate(compiler, DR(TMP_REG3), argw)); + } + compiler->cache_argw = argw; + + if (!base) + return push_inst(compiler, data_transfer_insts[flags & MEM_MASK] | S(TMP_REG3) | TA(reg_ar), delay_slot); + + if (arg == next_arg && next_argw - argw <= SIMM_MAX && next_argw - argw >= SIMM_MIN) { + compiler->cache_arg = arg; + FAIL_IF(push_inst(compiler, ADDU_W | S(TMP_REG3) | T(base) | D(TMP_REG3), DR(TMP_REG3))); + return push_inst(compiler, data_transfer_insts[flags & MEM_MASK] | S(TMP_REG3) | TA(reg_ar), delay_slot); + } + + FAIL_IF(push_inst(compiler, ADDU_W | S(TMP_REG3) | T(base) | DA(tmp_ar), tmp_ar)); + return push_inst(compiler, data_transfer_insts[flags & MEM_MASK] | SA(tmp_ar) | TA(reg_ar), delay_slot); +} + +static SLJIT_INLINE sljit_s32 emit_op_mem(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg_ar, sljit_s32 arg, sljit_sw argw) +{ + sljit_s32 tmp_ar, base, delay_slot; + + if (getput_arg_fast(compiler, flags, reg_ar, arg, argw)) + return compiler->error; + + if ((flags & MEM_MASK) <= GPR_REG && (flags & LOAD_DATA)) { + tmp_ar = reg_ar; + delay_slot = reg_ar; + } + else { + tmp_ar = DR(TMP_REG1); + delay_slot = MOVABLE_INS; + } + base = arg & REG_MASK; + + if (SLJIT_UNLIKELY(arg & OFFS_REG_MASK)) { + argw &= 0x3; + + if (SLJIT_UNLIKELY(argw)) { + FAIL_IF(push_inst(compiler, SLL_W | T(OFFS_REG(arg)) | DA(tmp_ar) | SH_IMM(argw), tmp_ar)); + FAIL_IF(push_inst(compiler, ADDU_W | S(base) | TA(tmp_ar) | DA(tmp_ar), tmp_ar)); + } + else + FAIL_IF(push_inst(compiler, ADDU_W | S(base) | T(OFFS_REG(arg)) | DA(tmp_ar), tmp_ar)); + return push_inst(compiler, data_transfer_insts[flags & MEM_MASK] | SA(tmp_ar) | TA(reg_ar), delay_slot); + } + + FAIL_IF(load_immediate(compiler, tmp_ar, argw)); + + if (base != 0) + FAIL_IF(push_inst(compiler, ADDU_W | S(base) | TA(tmp_ar) | DA(tmp_ar), tmp_ar)); + + return push_inst(compiler, data_transfer_insts[flags & MEM_MASK] | SA(tmp_ar) | TA(reg_ar), delay_slot); +} + +static SLJIT_INLINE sljit_s32 emit_op_mem2(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg, sljit_s32 arg1, sljit_sw arg1w, sljit_s32 arg2, sljit_sw arg2w) +{ + if (getput_arg_fast(compiler, flags, reg, arg1, arg1w)) + return compiler->error; + return getput_arg(compiler, flags, reg, arg1, arg1w, arg2, arg2w); +} + +static sljit_s32 emit_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 flags, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + /* arg1 goes to TMP_REG1 or src reg + arg2 goes to TMP_REG2, imm or src reg + TMP_REG3 can be used for caching + result goes to TMP_REG2, so put result can use TMP_REG1 and TMP_REG3. */ + sljit_s32 dst_r = TMP_REG2; + sljit_s32 src1_r; + sljit_sw src2_r = 0; + sljit_s32 sugg_src2_r = TMP_REG2; + + if (!(flags & ALT_KEEP_CACHE)) { + compiler->cache_arg = 0; + compiler->cache_argw = 0; + } + + if (SLJIT_UNLIKELY(dst == SLJIT_UNUSED)) { + SLJIT_ASSERT(HAS_FLAGS(op)); + flags |= UNUSED_DEST; + } + else if (FAST_IS_REG(dst)) { + dst_r = dst; + flags |= REG_DEST; + if (op >= SLJIT_MOV && op <= SLJIT_MOV_P) + sugg_src2_r = dst_r; + } + else if ((dst & SLJIT_MEM) && !getput_arg_fast(compiler, flags | ARG_TEST, DR(TMP_REG1), dst, dstw)) + flags |= SLOW_DEST; + + if (flags & IMM_OP) { + if ((src2 & SLJIT_IMM) && src2w) { + if ((!(flags & LOGICAL_OP) && (src2w <= SIMM_MAX && src2w >= SIMM_MIN)) + || ((flags & LOGICAL_OP) && !(src2w & ~UIMM_MAX))) { + flags |= SRC2_IMM; + src2_r = src2w; + } + } + if (!(flags & SRC2_IMM) && (flags & CUMULATIVE_OP) && (src1 & SLJIT_IMM) && src1w) { + if ((!(flags & LOGICAL_OP) && (src1w <= SIMM_MAX && src1w >= SIMM_MIN)) + || ((flags & LOGICAL_OP) && !(src1w & ~UIMM_MAX))) { + flags |= SRC2_IMM; + src2_r = src1w; + + /* And swap arguments. */ + src1 = src2; + src1w = src2w; + src2 = SLJIT_IMM; + /* src2w = src2_r unneeded. */ + } + } + } + + /* Source 1. */ + if (FAST_IS_REG(src1)) { + src1_r = src1; + flags |= REG1_SOURCE; + } + else if (src1 & SLJIT_IMM) { + if (src1w) { + FAIL_IF(load_immediate(compiler, DR(TMP_REG1), src1w)); + src1_r = TMP_REG1; + } + else + src1_r = 0; + } + else { + if (getput_arg_fast(compiler, flags | LOAD_DATA, DR(TMP_REG1), src1, src1w)) + FAIL_IF(compiler->error); + else + flags |= SLOW_SRC1; + src1_r = TMP_REG1; + } + + /* Source 2. */ + if (FAST_IS_REG(src2)) { + src2_r = src2; + flags |= REG2_SOURCE; + if (!(flags & REG_DEST) && op >= SLJIT_MOV && op <= SLJIT_MOV_P) + dst_r = src2_r; + } + else if (src2 & SLJIT_IMM) { + if (!(flags & SRC2_IMM)) { + if (src2w) { + FAIL_IF(load_immediate(compiler, DR(sugg_src2_r), src2w)); + src2_r = sugg_src2_r; + } + else { + src2_r = 0; + if ((op >= SLJIT_MOV && op <= SLJIT_MOV_P) && (dst & SLJIT_MEM)) + dst_r = 0; + } + } + } + else { + if (getput_arg_fast(compiler, flags | LOAD_DATA, DR(sugg_src2_r), src2, src2w)) + FAIL_IF(compiler->error); + else + flags |= SLOW_SRC2; + src2_r = sugg_src2_r; + } + + if ((flags & (SLOW_SRC1 | SLOW_SRC2)) == (SLOW_SRC1 | SLOW_SRC2)) { + SLJIT_ASSERT(src2_r == TMP_REG2); + if (!can_cache(src1, src1w, src2, src2w) && can_cache(src1, src1w, dst, dstw)) { + FAIL_IF(getput_arg(compiler, flags | LOAD_DATA, DR(TMP_REG2), src2, src2w, src1, src1w)); + FAIL_IF(getput_arg(compiler, flags | LOAD_DATA, DR(TMP_REG1), src1, src1w, dst, dstw)); + } + else { + FAIL_IF(getput_arg(compiler, flags | LOAD_DATA, DR(TMP_REG1), src1, src1w, src2, src2w)); + FAIL_IF(getput_arg(compiler, flags | LOAD_DATA, DR(TMP_REG2), src2, src2w, dst, dstw)); + } + } + else if (flags & SLOW_SRC1) + FAIL_IF(getput_arg(compiler, flags | LOAD_DATA, DR(TMP_REG1), src1, src1w, dst, dstw)); + else if (flags & SLOW_SRC2) + FAIL_IF(getput_arg(compiler, flags | LOAD_DATA, DR(sugg_src2_r), src2, src2w, dst, dstw)); + + FAIL_IF(emit_single_op(compiler, op, flags, dst_r, src1_r, src2_r)); + + if (dst & SLJIT_MEM) { + if (!(flags & SLOW_DEST)) { + getput_arg_fast(compiler, flags, DR(dst_r), dst, dstw); + return compiler->error; + } + return getput_arg(compiler, flags, DR(dst_r), dst, dstw, 0, 0); + } + + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compiler, sljit_s32 op) +{ +#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) + sljit_s32 int_op = op & SLJIT_I32_OP; +#endif + + CHECK_ERROR(); + CHECK(check_sljit_emit_op0(compiler, op)); + + op = GET_OPCODE(op); + switch (op) { + case SLJIT_BREAKPOINT: + return push_inst(compiler, BREAK, UNMOVABLE_INS); + case SLJIT_NOP: + return push_inst(compiler, NOP, UNMOVABLE_INS); + case SLJIT_LMUL_UW: + case SLJIT_LMUL_SW: +#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) +#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) + FAIL_IF(push_inst(compiler, (op == SLJIT_LMUL_UW ? DMULU : DMUL) | S(SLJIT_R0) | T(SLJIT_R1) | D(TMP_REG3), DR(TMP_REG3))); + FAIL_IF(push_inst(compiler, (op == SLJIT_LMUL_UW ? DMUHU : DMUH) | S(SLJIT_R0) | T(SLJIT_R1) | D(TMP_REG1), DR(TMP_REG1))); +#else /* !SLJIT_CONFIG_MIPS_64 */ + FAIL_IF(push_inst(compiler, (op == SLJIT_LMUL_UW ? MULU : MUL) | S(SLJIT_R0) | T(SLJIT_R1) | D(TMP_REG3), DR(TMP_REG3))); + FAIL_IF(push_inst(compiler, (op == SLJIT_LMUL_UW ? MUHU : MUH) | S(SLJIT_R0) | T(SLJIT_R1) | D(TMP_REG1), DR(TMP_REG1))); +#endif /* SLJIT_CONFIG_MIPS_64 */ + FAIL_IF(push_inst(compiler, ADDU_W | S(TMP_REG3) | TA(0) | D(SLJIT_R0), DR(SLJIT_R0))); + return push_inst(compiler, ADDU_W | S(TMP_REG1) | TA(0) | D(SLJIT_R1), DR(SLJIT_R1)); +#else /* !SLJIT_MIPS_R6 */ +#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) + FAIL_IF(push_inst(compiler, (op == SLJIT_LMUL_UW ? DMULTU : DMULT) | S(SLJIT_R0) | T(SLJIT_R1), MOVABLE_INS)); +#else /* !SLJIT_CONFIG_MIPS_64 */ + FAIL_IF(push_inst(compiler, (op == SLJIT_LMUL_UW ? MULTU : MULT) | S(SLJIT_R0) | T(SLJIT_R1), MOVABLE_INS)); +#endif /* SLJIT_CONFIG_MIPS_64 */ + FAIL_IF(push_inst(compiler, MFLO | D(SLJIT_R0), DR(SLJIT_R0))); + return push_inst(compiler, MFHI | D(SLJIT_R1), DR(SLJIT_R1)); +#endif /* SLJIT_MIPS_R6 */ + case SLJIT_DIVMOD_UW: + case SLJIT_DIVMOD_SW: + case SLJIT_DIV_UW: + case SLJIT_DIV_SW: + SLJIT_COMPILE_ASSERT((SLJIT_DIVMOD_UW & 0x2) == 0 && SLJIT_DIV_UW - 0x2 == SLJIT_DIVMOD_UW, bad_div_opcode_assignments); +#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) +#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) + if (int_op) { + FAIL_IF(push_inst(compiler, ((op | 0x2) == SLJIT_DIV_UW ? DIVU : DIV) | S(SLJIT_R0) | T(SLJIT_R1) | D(TMP_REG3), DR(TMP_REG3))); + FAIL_IF(push_inst(compiler, ((op | 0x2) == SLJIT_DIV_UW ? MODU : MOD) | S(SLJIT_R0) | T(SLJIT_R1) | D(TMP_REG1), DR(TMP_REG1))); + } + else { + FAIL_IF(push_inst(compiler, ((op | 0x2) == SLJIT_DIV_UW ? DDIVU : DDIV) | S(SLJIT_R0) | T(SLJIT_R1) | D(TMP_REG3), DR(TMP_REG3))); + FAIL_IF(push_inst(compiler, ((op | 0x2) == SLJIT_DIV_UW ? DMODU : DMOD) | S(SLJIT_R0) | T(SLJIT_R1) | D(TMP_REG1), DR(TMP_REG1))); + } +#else /* !SLJIT_CONFIG_MIPS_64 */ + FAIL_IF(push_inst(compiler, ((op | 0x2) == SLJIT_DIV_UW ? DIVU : DIV) | S(SLJIT_R0) | T(SLJIT_R1) | D(TMP_REG3), DR(TMP_REG3))); + FAIL_IF(push_inst(compiler, ((op | 0x2) == SLJIT_DIV_UW ? MODU : MOD) | S(SLJIT_R0) | T(SLJIT_R1) | D(TMP_REG1), DR(TMP_REG1))); +#endif /* SLJIT_CONFIG_MIPS_64 */ + FAIL_IF(push_inst(compiler, ADDU_W | S(TMP_REG3) | TA(0) | D(SLJIT_R0), DR(SLJIT_R0))); + return (op >= SLJIT_DIV_UW) ? SLJIT_SUCCESS : push_inst(compiler, ADDU_W | S(TMP_REG1) | TA(0) | D(SLJIT_R1), DR(SLJIT_R1)); +#else /* !SLJIT_MIPS_R6 */ +#if !(defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1) + FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS)); + FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS)); +#endif /* !SLJIT_MIPS_R1 */ +#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) + if (int_op) + FAIL_IF(push_inst(compiler, ((op | 0x2) == SLJIT_DIV_UW ? DIVU : DIV) | S(SLJIT_R0) | T(SLJIT_R1), MOVABLE_INS)); + else + FAIL_IF(push_inst(compiler, ((op | 0x2) == SLJIT_DIV_UW ? DDIVU : DDIV) | S(SLJIT_R0) | T(SLJIT_R1), MOVABLE_INS)); +#else /* !SLJIT_CONFIG_MIPS_64 */ + FAIL_IF(push_inst(compiler, ((op | 0x2) == SLJIT_DIV_UW ? DIVU : DIV) | S(SLJIT_R0) | T(SLJIT_R1), MOVABLE_INS)); +#endif /* SLJIT_CONFIG_MIPS_64 */ + FAIL_IF(push_inst(compiler, MFLO | D(SLJIT_R0), DR(SLJIT_R0))); + return (op >= SLJIT_DIV_UW) ? SLJIT_SUCCESS : push_inst(compiler, MFHI | D(SLJIT_R1), DR(SLJIT_R1)); +#endif /* SLJIT_MIPS_R6 */ + } + + return SLJIT_SUCCESS; +} + +#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1) +static sljit_s32 emit_prefetch(struct sljit_compiler *compiler, + sljit_s32 src, sljit_sw srcw) +{ + if (!(src & OFFS_REG_MASK)) { + if (srcw <= SIMM_MAX && srcw >= SIMM_MIN) + return push_inst(compiler, PREF | S(src & REG_MASK) | IMM(srcw), MOVABLE_INS); + + FAIL_IF(load_immediate(compiler, DR(TMP_REG1), srcw)); + return push_inst(compiler, PREFX | S(src & REG_MASK) | T(TMP_REG1), MOVABLE_INS); + } + + srcw &= 0x3; + + if (SLJIT_UNLIKELY(srcw != 0)) { + FAIL_IF(push_inst(compiler, SLL_W | T(OFFS_REG(src)) | D(TMP_REG1) | SH_IMM(srcw), DR(TMP_REG1))); + return push_inst(compiler, PREFX | S(src & REG_MASK) | T(TMP_REG1), MOVABLE_INS); + } + + return push_inst(compiler, PREFX | S(src & REG_MASK) | T(OFFS_REG(src)), MOVABLE_INS); +} +#endif + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ +#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) +# define flags 0 +#else + sljit_s32 flags = 0; +#endif + + CHECK_ERROR(); + CHECK(check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw)); + ADJUST_LOCAL_OFFSET(dst, dstw); + ADJUST_LOCAL_OFFSET(src, srcw); + + if (dst == SLJIT_UNUSED && !HAS_FLAGS(op)) { +#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1) + if (op <= SLJIT_MOV_P && (src & SLJIT_MEM)) + return emit_prefetch(compiler, src, srcw); +#endif + return SLJIT_SUCCESS; + } + +#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) + if ((op & SLJIT_I32_OP) && GET_OPCODE(op) >= SLJIT_NOT) + flags |= INT_DATA | SIGNED_DATA; +#endif + + switch (GET_OPCODE(op)) { + case SLJIT_MOV: + case SLJIT_MOV_P: + return emit_op(compiler, SLJIT_MOV, WORD_DATA, dst, dstw, TMP_REG1, 0, src, srcw); + + case SLJIT_MOV_U32: +#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) + return emit_op(compiler, SLJIT_MOV_U32, INT_DATA, dst, dstw, TMP_REG1, 0, src, srcw); +#else + return emit_op(compiler, SLJIT_MOV_U32, INT_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u32)srcw : srcw); +#endif + + case SLJIT_MOV_S32: +#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) + return emit_op(compiler, SLJIT_MOV_S32, INT_DATA | SIGNED_DATA, dst, dstw, TMP_REG1, 0, src, srcw); +#else + return emit_op(compiler, SLJIT_MOV_S32, INT_DATA | SIGNED_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s32)srcw : srcw); +#endif + + case SLJIT_MOV_U8: + return emit_op(compiler, SLJIT_MOV_U8, BYTE_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u8)srcw : srcw); + + case SLJIT_MOV_S8: + return emit_op(compiler, SLJIT_MOV_S8, BYTE_DATA | SIGNED_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s8)srcw : srcw); + + case SLJIT_MOV_U16: + return emit_op(compiler, SLJIT_MOV_U16, HALF_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u16)srcw : srcw); + + case SLJIT_MOV_S16: + return emit_op(compiler, SLJIT_MOV_S16, HALF_DATA | SIGNED_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s16)srcw : srcw); + + case SLJIT_NOT: + return emit_op(compiler, op, flags, dst, dstw, TMP_REG1, 0, src, srcw); + + case SLJIT_NEG: + return emit_op(compiler, SLJIT_SUB | GET_ALL_FLAGS(op), flags | IMM_OP, dst, dstw, SLJIT_IMM, 0, src, srcw); + + case SLJIT_CLZ: + return emit_op(compiler, op, flags, dst, dstw, TMP_REG1, 0, src, srcw); + } + + SLJIT_UNREACHABLE(); + return SLJIT_SUCCESS; + +#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) +# undef flags +#endif +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ +#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) +# define flags 0 +#else + sljit_s32 flags = 0; +#endif + + CHECK_ERROR(); + CHECK(check_sljit_emit_op2(compiler, op, dst, dstw, src1, src1w, src2, src2w)); + ADJUST_LOCAL_OFFSET(dst, dstw); + ADJUST_LOCAL_OFFSET(src1, src1w); + ADJUST_LOCAL_OFFSET(src2, src2w); + + if (dst == SLJIT_UNUSED && !HAS_FLAGS(op)) + return SLJIT_SUCCESS; + +#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) + if (op & SLJIT_I32_OP) { + flags |= INT_DATA | SIGNED_DATA; + if (src1 & SLJIT_IMM) + src1w = (sljit_s32)src1w; + if (src2 & SLJIT_IMM) + src2w = (sljit_s32)src2w; + } +#endif + + switch (GET_OPCODE(op)) { + case SLJIT_ADD: + case SLJIT_ADDC: + return emit_op(compiler, op, flags | CUMULATIVE_OP | IMM_OP, dst, dstw, src1, src1w, src2, src2w); + + case SLJIT_SUB: + case SLJIT_SUBC: + return emit_op(compiler, op, flags | IMM_OP, dst, dstw, src1, src1w, src2, src2w); + + case SLJIT_MUL: + return emit_op(compiler, op, flags | CUMULATIVE_OP, dst, dstw, src1, src1w, src2, src2w); + + case SLJIT_AND: + case SLJIT_OR: + case SLJIT_XOR: + return emit_op(compiler, op, flags | CUMULATIVE_OP | LOGICAL_OP | IMM_OP, dst, dstw, src1, src1w, src2, src2w); + + case SLJIT_SHL: + case SLJIT_LSHR: + case SLJIT_ASHR: +#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) + if (src2 & SLJIT_IMM) + src2w &= 0x1f; +#else + if (src2 & SLJIT_IMM) { + if (op & SLJIT_I32_OP) + src2w &= 0x1f; + else + src2w &= 0x3f; + } +#endif + return emit_op(compiler, op, flags | IMM_OP, dst, dstw, src1, src1w, src2, src2w); + } + + SLJIT_UNREACHABLE(); + return SLJIT_SUCCESS; + +#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) +# undef flags +#endif +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg) +{ + CHECK_REG_INDEX(check_sljit_get_register_index(reg)); + return reg_map[reg]; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_float_register_index(sljit_s32 reg) +{ + CHECK_REG_INDEX(check_sljit_get_float_register_index(reg)); + return FR(reg); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler, + void *instruction, sljit_s32 size) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_op_custom(compiler, instruction, size)); + + return push_inst(compiler, *(sljit_ins*)instruction, UNMOVABLE_INS); +} + +/* --------------------------------------------------------------------- */ +/* Floating point operators */ +/* --------------------------------------------------------------------- */ + +#define FLOAT_DATA(op) (DOUBLE_DATA | ((op & SLJIT_F32_OP) >> 7)) +#define FMT(op) (((op & SLJIT_F32_OP) ^ SLJIT_F32_OP) << (21 - 8)) + +static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_sw_from_f64(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ +#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) +# define flags 0 +#else + sljit_s32 flags = (GET_OPCODE(op) == SLJIT_CONV_SW_FROM_F64) << 21; +#endif + + if (src & SLJIT_MEM) { + FAIL_IF(emit_op_mem2(compiler, FLOAT_DATA(op) | LOAD_DATA, FR(TMP_FREG1), src, srcw, dst, dstw)); + src = TMP_FREG1; + } + + FAIL_IF(push_inst(compiler, (TRUNC_W_S ^ (flags >> 19)) | FMT(op) | FS(src) | FD(TMP_FREG1), MOVABLE_INS)); + + if (FAST_IS_REG(dst)) + return push_inst(compiler, MFC1 | flags | T(dst) | FS(TMP_FREG1), MOVABLE_INS); + + /* Store the integer value from a VFP register. */ + return emit_op_mem2(compiler, flags ? DOUBLE_DATA : SINGLE_DATA, FR(TMP_FREG1), dst, dstw, 0, 0); + +#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) +# undef is_long +#endif +} + +static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ +#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) +# define flags 0 +#else + sljit_s32 flags = (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_SW) << 21; +#endif + + sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1; + + if (FAST_IS_REG(src)) + FAIL_IF(push_inst(compiler, MTC1 | flags | T(src) | FS(TMP_FREG1), MOVABLE_INS)); + else if (src & SLJIT_MEM) { + /* Load the integer value into a VFP register. */ + FAIL_IF(emit_op_mem2(compiler, ((flags) ? DOUBLE_DATA : SINGLE_DATA) | LOAD_DATA, FR(TMP_FREG1), src, srcw, dst, dstw)); + } + else { +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32) + srcw = (sljit_s32)srcw; +#endif + FAIL_IF(load_immediate(compiler, DR(TMP_REG1), srcw)); + FAIL_IF(push_inst(compiler, MTC1 | flags | T(TMP_REG1) | FS(TMP_FREG1), MOVABLE_INS)); + } + + FAIL_IF(push_inst(compiler, CVT_S_S | flags | (4 << 21) | (((op & SLJIT_F32_OP) ^ SLJIT_F32_OP) >> 8) | FS(TMP_FREG1) | FD(dst_r), MOVABLE_INS)); + + if (dst & SLJIT_MEM) + return emit_op_mem2(compiler, FLOAT_DATA(op), FR(TMP_FREG1), dst, dstw, 0, 0); + return SLJIT_SUCCESS; + +#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) +# undef flags +#endif +} + +static SLJIT_INLINE sljit_s32 sljit_emit_fop1_cmp(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + sljit_ins inst; + + if (src1 & SLJIT_MEM) { + FAIL_IF(emit_op_mem2(compiler, FLOAT_DATA(op) | LOAD_DATA, FR(TMP_FREG1), src1, src1w, src2, src2w)); + src1 = TMP_FREG1; + } + + if (src2 & SLJIT_MEM) { + FAIL_IF(emit_op_mem2(compiler, FLOAT_DATA(op) | LOAD_DATA, FR(TMP_FREG2), src2, src2w, 0, 0)); + src2 = TMP_FREG2; + } + + switch (GET_FLAG_TYPE(op)) { + case SLJIT_EQUAL_F64: + case SLJIT_NOT_EQUAL_F64: + inst = C_UEQ_S; + break; + case SLJIT_LESS_F64: + case SLJIT_GREATER_EQUAL_F64: + inst = C_ULT_S; + break; + case SLJIT_GREATER_F64: + case SLJIT_LESS_EQUAL_F64: + inst = C_ULE_S; + break; + default: + SLJIT_ASSERT(GET_FLAG_TYPE(op) == SLJIT_UNORDERED_F64 || GET_FLAG_TYPE(op) == SLJIT_ORDERED_F64); + inst = C_UN_S; + break; + } + return push_inst(compiler, inst | FMT(op) | FT(src2) | FS(src1) | C_FD, UNMOVABLE_INS); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + sljit_s32 dst_r; + + CHECK_ERROR(); + compiler->cache_arg = 0; + compiler->cache_argw = 0; + + SLJIT_COMPILE_ASSERT((SLJIT_F32_OP == 0x100) && !(DOUBLE_DATA & 0x2), float_transfer_bit_error); + SELECT_FOP1_OPERATION_WITH_CHECKS(compiler, op, dst, dstw, src, srcw); + + if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_F32) + op ^= SLJIT_F32_OP; + + dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1; + + if (src & SLJIT_MEM) { + FAIL_IF(emit_op_mem2(compiler, FLOAT_DATA(op) | LOAD_DATA, FR(dst_r), src, srcw, dst, dstw)); + src = dst_r; + } + + switch (GET_OPCODE(op)) { + case SLJIT_MOV_F64: + if (src != dst_r) { + if (dst_r != TMP_FREG1) + FAIL_IF(push_inst(compiler, MOV_S | FMT(op) | FS(src) | FD(dst_r), MOVABLE_INS)); + else + dst_r = src; + } + break; + case SLJIT_NEG_F64: + FAIL_IF(push_inst(compiler, NEG_S | FMT(op) | FS(src) | FD(dst_r), MOVABLE_INS)); + break; + case SLJIT_ABS_F64: + FAIL_IF(push_inst(compiler, ABS_S | FMT(op) | FS(src) | FD(dst_r), MOVABLE_INS)); + break; + case SLJIT_CONV_F64_FROM_F32: + FAIL_IF(push_inst(compiler, CVT_S_S | ((op & SLJIT_F32_OP) ? 1 : (1 << 21)) | FS(src) | FD(dst_r), MOVABLE_INS)); + op ^= SLJIT_F32_OP; + break; + } + + if (dst & SLJIT_MEM) + return emit_op_mem2(compiler, FLOAT_DATA(op), FR(dst_r), dst, dstw, 0, 0); + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + sljit_s32 dst_r, flags = 0; + + CHECK_ERROR(); + CHECK(check_sljit_emit_fop2(compiler, op, dst, dstw, src1, src1w, src2, src2w)); + ADJUST_LOCAL_OFFSET(dst, dstw); + ADJUST_LOCAL_OFFSET(src1, src1w); + ADJUST_LOCAL_OFFSET(src2, src2w); + + compiler->cache_arg = 0; + compiler->cache_argw = 0; + + dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG2; + + if (src1 & SLJIT_MEM) { + if (getput_arg_fast(compiler, FLOAT_DATA(op) | LOAD_DATA, FR(TMP_FREG1), src1, src1w)) { + FAIL_IF(compiler->error); + src1 = TMP_FREG1; + } else + flags |= SLOW_SRC1; + } + + if (src2 & SLJIT_MEM) { + if (getput_arg_fast(compiler, FLOAT_DATA(op) | LOAD_DATA, FR(TMP_FREG2), src2, src2w)) { + FAIL_IF(compiler->error); + src2 = TMP_FREG2; + } else + flags |= SLOW_SRC2; + } + + if ((flags & (SLOW_SRC1 | SLOW_SRC2)) == (SLOW_SRC1 | SLOW_SRC2)) { + if (!can_cache(src1, src1w, src2, src2w) && can_cache(src1, src1w, dst, dstw)) { + FAIL_IF(getput_arg(compiler, FLOAT_DATA(op) | LOAD_DATA, FR(TMP_FREG2), src2, src2w, src1, src1w)); + FAIL_IF(getput_arg(compiler, FLOAT_DATA(op) | LOAD_DATA, FR(TMP_FREG1), src1, src1w, dst, dstw)); + } + else { + FAIL_IF(getput_arg(compiler, FLOAT_DATA(op) | LOAD_DATA, FR(TMP_FREG1), src1, src1w, src2, src2w)); + FAIL_IF(getput_arg(compiler, FLOAT_DATA(op) | LOAD_DATA, FR(TMP_FREG2), src2, src2w, dst, dstw)); + } + } + else if (flags & SLOW_SRC1) + FAIL_IF(getput_arg(compiler, FLOAT_DATA(op) | LOAD_DATA, FR(TMP_FREG1), src1, src1w, dst, dstw)); + else if (flags & SLOW_SRC2) + FAIL_IF(getput_arg(compiler, FLOAT_DATA(op) | LOAD_DATA, FR(TMP_FREG2), src2, src2w, dst, dstw)); + + if (flags & SLOW_SRC1) + src1 = TMP_FREG1; + if (flags & SLOW_SRC2) + src2 = TMP_FREG2; + + switch (GET_OPCODE(op)) { + case SLJIT_ADD_F64: + FAIL_IF(push_inst(compiler, ADD_S | FMT(op) | FT(src2) | FS(src1) | FD(dst_r), MOVABLE_INS)); + break; + + case SLJIT_SUB_F64: + FAIL_IF(push_inst(compiler, SUB_S | FMT(op) | FT(src2) | FS(src1) | FD(dst_r), MOVABLE_INS)); + break; + + case SLJIT_MUL_F64: + FAIL_IF(push_inst(compiler, MUL_S | FMT(op) | FT(src2) | FS(src1) | FD(dst_r), MOVABLE_INS)); + break; + + case SLJIT_DIV_F64: + FAIL_IF(push_inst(compiler, DIV_S | FMT(op) | FT(src2) | FS(src1) | FD(dst_r), MOVABLE_INS)); + break; + } + + if (dst_r == TMP_FREG2) + FAIL_IF(emit_op_mem2(compiler, FLOAT_DATA(op), FR(TMP_FREG2), dst, dstw, 0, 0)); + + return SLJIT_SUCCESS; +} + +/* --------------------------------------------------------------------- */ +/* Other instructions */ +/* --------------------------------------------------------------------- */ + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_fast_enter(compiler, dst, dstw)); + ADJUST_LOCAL_OFFSET(dst, dstw); + + if (FAST_IS_REG(dst)) + return push_inst(compiler, ADDU_W | SA(RETURN_ADDR_REG) | TA(0) | D(dst), DR(dst)); + + /* Memory. */ + return emit_op_mem(compiler, WORD_DATA, RETURN_ADDR_REG, dst, dstw); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_fast_return(compiler, src, srcw)); + ADJUST_LOCAL_OFFSET(src, srcw); + + if (FAST_IS_REG(src)) + FAIL_IF(push_inst(compiler, ADDU_W | S(src) | TA(0) | DA(RETURN_ADDR_REG), RETURN_ADDR_REG)); + else + FAIL_IF(emit_op_mem(compiler, WORD_DATA | LOAD_DATA, RETURN_ADDR_REG, src, srcw)); + + FAIL_IF(push_inst(compiler, JR | SA(RETURN_ADDR_REG), UNMOVABLE_INS)); + return push_inst(compiler, NOP, UNMOVABLE_INS); +} + +/* --------------------------------------------------------------------- */ +/* Conditional instructions */ +/* --------------------------------------------------------------------- */ + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compiler *compiler) +{ + struct sljit_label *label; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_label(compiler)); + + if (compiler->last_label && compiler->last_label->size == compiler->size) + return compiler->last_label; + + label = (struct sljit_label*)ensure_abuf(compiler, sizeof(struct sljit_label)); + PTR_FAIL_IF(!label); + set_label(label, compiler); + compiler->delay_slot = UNMOVABLE_INS; + return label; +} + +#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) +#define JUMP_LENGTH 4 +#else +#define JUMP_LENGTH 8 +#endif + +#define BR_Z(src) \ + inst = BEQ | SA(src) | TA(0) | JUMP_LENGTH; \ + flags = IS_BIT26_COND; \ + delay_check = src; + +#define BR_NZ(src) \ + inst = BNE | SA(src) | TA(0) | JUMP_LENGTH; \ + flags = IS_BIT26_COND; \ + delay_check = src; + +#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) + +#define BR_T() \ + inst = BC1NEZ; \ + flags = IS_BIT23_COND; \ + delay_check = FCSR_FCC; +#define BR_F() \ + inst = BC1EQZ; \ + flags = IS_BIT23_COND; \ + delay_check = FCSR_FCC; + +#else /* !SLJIT_MIPS_R6 */ + +#define BR_T() \ + inst = BC1T | JUMP_LENGTH; \ + flags = IS_BIT16_COND; \ + delay_check = FCSR_FCC; +#define BR_F() \ + inst = BC1F | JUMP_LENGTH; \ + flags = IS_BIT16_COND; \ + delay_check = FCSR_FCC; + +#endif /* SLJIT_MIPS_R6 */ + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, sljit_s32 type) +{ + struct sljit_jump *jump; + sljit_ins inst; + sljit_s32 flags = 0; + sljit_s32 delay_check = UNMOVABLE_INS; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_jump(compiler, type)); + + jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump)); + PTR_FAIL_IF(!jump); + set_jump(jump, compiler, type & SLJIT_REWRITABLE_JUMP); + type &= 0xff; + + switch (type) { + case SLJIT_EQUAL: + BR_NZ(EQUAL_FLAG); + break; + case SLJIT_NOT_EQUAL: + BR_Z(EQUAL_FLAG); + break; + case SLJIT_LESS: + case SLJIT_GREATER: + case SLJIT_SIG_LESS: + case SLJIT_SIG_GREATER: + case SLJIT_OVERFLOW: + case SLJIT_MUL_OVERFLOW: + BR_Z(OTHER_FLAG); + break; + case SLJIT_GREATER_EQUAL: + case SLJIT_LESS_EQUAL: + case SLJIT_SIG_GREATER_EQUAL: + case SLJIT_SIG_LESS_EQUAL: + case SLJIT_NOT_OVERFLOW: + case SLJIT_MUL_NOT_OVERFLOW: + BR_NZ(OTHER_FLAG); + break; + case SLJIT_NOT_EQUAL_F64: + case SLJIT_GREATER_EQUAL_F64: + case SLJIT_GREATER_F64: + case SLJIT_ORDERED_F64: + BR_T(); + break; + case SLJIT_EQUAL_F64: + case SLJIT_LESS_F64: + case SLJIT_LESS_EQUAL_F64: + case SLJIT_UNORDERED_F64: + BR_F(); + break; + default: + /* Not conditional branch. */ + inst = 0; + break; + } + + jump->flags |= flags; + if (compiler->delay_slot == MOVABLE_INS || (compiler->delay_slot != UNMOVABLE_INS && compiler->delay_slot != delay_check)) + jump->flags |= IS_MOVABLE; + + if (inst) + PTR_FAIL_IF(push_inst(compiler, inst, UNMOVABLE_INS)); + + PTR_FAIL_IF(emit_const(compiler, TMP_REG2, 0)); + + if (type <= SLJIT_JUMP) + PTR_FAIL_IF(push_inst(compiler, JR | S(TMP_REG2), UNMOVABLE_INS)); + else { + jump->flags |= IS_JAL; + PTR_FAIL_IF(push_inst(compiler, JALR | S(TMP_REG2) | DA(RETURN_ADDR_REG), UNMOVABLE_INS)); + } + + jump->addr = compiler->size; + PTR_FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS)); + return jump; +} + +#define RESOLVE_IMM1() \ + if (src1 & SLJIT_IMM) { \ + if (src1w) { \ + PTR_FAIL_IF(load_immediate(compiler, DR(TMP_REG1), src1w)); \ + src1 = TMP_REG1; \ + } \ + else \ + src1 = 0; \ + } + +#define RESOLVE_IMM2() \ + if (src2 & SLJIT_IMM) { \ + if (src2w) { \ + PTR_FAIL_IF(load_immediate(compiler, DR(TMP_REG2), src2w)); \ + src2 = TMP_REG2; \ + } \ + else \ + src2 = 0; \ + } + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + struct sljit_jump *jump; + sljit_s32 flags; + sljit_ins inst; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_cmp(compiler, type, src1, src1w, src2, src2w)); + ADJUST_LOCAL_OFFSET(src1, src1w); + ADJUST_LOCAL_OFFSET(src2, src2w); + + compiler->cache_arg = 0; + compiler->cache_argw = 0; + flags = ((type & SLJIT_I32_OP) ? INT_DATA : WORD_DATA) | LOAD_DATA; + if (src1 & SLJIT_MEM) { + PTR_FAIL_IF(emit_op_mem2(compiler, flags, DR(TMP_REG1), src1, src1w, src2, src2w)); + src1 = TMP_REG1; + } + if (src2 & SLJIT_MEM) { + PTR_FAIL_IF(emit_op_mem2(compiler, flags, DR(TMP_REG2), src2, src2w, 0, 0)); + src2 = TMP_REG2; + } + + jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump)); + PTR_FAIL_IF(!jump); + set_jump(jump, compiler, type & SLJIT_REWRITABLE_JUMP); + type &= 0xff; + + if (type <= SLJIT_NOT_EQUAL) { + RESOLVE_IMM1(); + RESOLVE_IMM2(); + jump->flags |= IS_BIT26_COND; + if (compiler->delay_slot == MOVABLE_INS || (compiler->delay_slot != UNMOVABLE_INS && compiler->delay_slot != DR(src1) && compiler->delay_slot != DR(src2))) + jump->flags |= IS_MOVABLE; + PTR_FAIL_IF(push_inst(compiler, (type == SLJIT_EQUAL ? BNE : BEQ) | S(src1) | T(src2) | JUMP_LENGTH, UNMOVABLE_INS)); + } + else if (type >= SLJIT_SIG_LESS && (((src1 & SLJIT_IMM) && (src1w == 0)) || ((src2 & SLJIT_IMM) && (src2w == 0)))) { + inst = NOP; + if ((src1 & SLJIT_IMM) && (src1w == 0)) { + RESOLVE_IMM2(); + switch (type) { + case SLJIT_SIG_LESS: + inst = BLEZ; + jump->flags |= IS_BIT26_COND; + break; + case SLJIT_SIG_GREATER_EQUAL: + inst = BGTZ; + jump->flags |= IS_BIT26_COND; + break; + case SLJIT_SIG_GREATER: + inst = BGEZ; + jump->flags |= IS_BIT16_COND; + break; + case SLJIT_SIG_LESS_EQUAL: + inst = BLTZ; + jump->flags |= IS_BIT16_COND; + break; + } + src1 = src2; + } + else { + RESOLVE_IMM1(); + switch (type) { + case SLJIT_SIG_LESS: + inst = BGEZ; + jump->flags |= IS_BIT16_COND; + break; + case SLJIT_SIG_GREATER_EQUAL: + inst = BLTZ; + jump->flags |= IS_BIT16_COND; + break; + case SLJIT_SIG_GREATER: + inst = BLEZ; + jump->flags |= IS_BIT26_COND; + break; + case SLJIT_SIG_LESS_EQUAL: + inst = BGTZ; + jump->flags |= IS_BIT26_COND; + break; + } + } + PTR_FAIL_IF(push_inst(compiler, inst | S(src1) | JUMP_LENGTH, UNMOVABLE_INS)); + } + else { + if (type == SLJIT_LESS || type == SLJIT_GREATER_EQUAL || type == SLJIT_SIG_LESS || type == SLJIT_SIG_GREATER_EQUAL) { + RESOLVE_IMM1(); + if ((src2 & SLJIT_IMM) && src2w <= SIMM_MAX && src2w >= SIMM_MIN) + PTR_FAIL_IF(push_inst(compiler, (type <= SLJIT_LESS_EQUAL ? SLTIU : SLTI) | S(src1) | T(TMP_REG1) | IMM(src2w), DR(TMP_REG1))); + else { + RESOLVE_IMM2(); + PTR_FAIL_IF(push_inst(compiler, (type <= SLJIT_LESS_EQUAL ? SLTU : SLT) | S(src1) | T(src2) | D(TMP_REG1), DR(TMP_REG1))); + } + type = (type == SLJIT_LESS || type == SLJIT_SIG_LESS) ? SLJIT_NOT_EQUAL : SLJIT_EQUAL; + } + else { + RESOLVE_IMM2(); + if ((src1 & SLJIT_IMM) && src1w <= SIMM_MAX && src1w >= SIMM_MIN) + PTR_FAIL_IF(push_inst(compiler, (type <= SLJIT_LESS_EQUAL ? SLTIU : SLTI) | S(src2) | T(TMP_REG1) | IMM(src1w), DR(TMP_REG1))); + else { + RESOLVE_IMM1(); + PTR_FAIL_IF(push_inst(compiler, (type <= SLJIT_LESS_EQUAL ? SLTU : SLT) | S(src2) | T(src1) | D(TMP_REG1), DR(TMP_REG1))); + } + type = (type == SLJIT_GREATER || type == SLJIT_SIG_GREATER) ? SLJIT_NOT_EQUAL : SLJIT_EQUAL; + } + + jump->flags |= IS_BIT26_COND; + PTR_FAIL_IF(push_inst(compiler, (type == SLJIT_EQUAL ? BNE : BEQ) | S(TMP_REG1) | TA(0) | JUMP_LENGTH, UNMOVABLE_INS)); + } + + PTR_FAIL_IF(emit_const(compiler, TMP_REG2, 0)); + PTR_FAIL_IF(push_inst(compiler, JR | S(TMP_REG2), UNMOVABLE_INS)); + jump->addr = compiler->size; + PTR_FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS)); + return jump; +} + +#undef RESOLVE_IMM1 +#undef RESOLVE_IMM2 + +#undef JUMP_LENGTH +#undef BR_Z +#undef BR_NZ +#undef BR_T +#undef BR_F + +#undef FLOAT_DATA +#undef FMT + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 src, sljit_sw srcw) +{ + struct sljit_jump *jump = NULL; + + CHECK_ERROR(); + CHECK(check_sljit_emit_ijump(compiler, type, src, srcw)); + ADJUST_LOCAL_OFFSET(src, srcw); + + if (src & SLJIT_IMM) { + jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump)); + FAIL_IF(!jump); + set_jump(jump, compiler, JUMP_ADDR | ((type >= SLJIT_FAST_CALL) ? IS_JAL : 0)); + jump->u.target = srcw; + + if (compiler->delay_slot != UNMOVABLE_INS) + jump->flags |= IS_MOVABLE; + + FAIL_IF(emit_const(compiler, TMP_REG2, 0)); + src = TMP_REG2; + } + else if (src & SLJIT_MEM) { + FAIL_IF(emit_op_mem(compiler, WORD_DATA | LOAD_DATA, DR(TMP_REG2), src, srcw)); + src = TMP_REG2; + } + + FAIL_IF(push_inst(compiler, JR | S(src), UNMOVABLE_INS)); + if (jump) + jump->addr = compiler->size; + FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS)); + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 type) +{ + sljit_s32 src_ar, dst_ar; + sljit_s32 saved_op = op; +#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) + sljit_s32 mem_type = WORD_DATA; +#else + sljit_s32 mem_type = (op & SLJIT_I32_OP) ? (INT_DATA | SIGNED_DATA) : WORD_DATA; +#endif + + CHECK_ERROR(); + CHECK(check_sljit_emit_op_flags(compiler, op, dst, dstw, type)); + ADJUST_LOCAL_OFFSET(dst, dstw); + + op = GET_OPCODE(op); +#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) + if (op == SLJIT_MOV_S32) + mem_type = INT_DATA | SIGNED_DATA; +#endif + dst_ar = DR((op < SLJIT_ADD && FAST_IS_REG(dst)) ? dst : TMP_REG2); + + compiler->cache_arg = 0; + compiler->cache_argw = 0; + + if (op >= SLJIT_ADD && (dst & SLJIT_MEM)) + FAIL_IF(emit_op_mem2(compiler, mem_type | LOAD_DATA, DR(TMP_REG1), dst, dstw, dst, dstw)); + + switch (type & 0xff) { + case SLJIT_EQUAL: + case SLJIT_NOT_EQUAL: + FAIL_IF(push_inst(compiler, SLTIU | SA(EQUAL_FLAG) | TA(dst_ar) | IMM(1), dst_ar)); + src_ar = dst_ar; + break; + case SLJIT_MUL_OVERFLOW: + case SLJIT_MUL_NOT_OVERFLOW: + FAIL_IF(push_inst(compiler, SLTIU | SA(OTHER_FLAG) | TA(dst_ar) | IMM(1), dst_ar)); + src_ar = dst_ar; + type ^= 0x1; /* Flip type bit for the XORI below. */ + break; + case SLJIT_GREATER_F64: + case SLJIT_LESS_EQUAL_F64: + type ^= 0x1; /* Flip type bit for the XORI below. */ + case SLJIT_EQUAL_F64: + case SLJIT_NOT_EQUAL_F64: + case SLJIT_LESS_F64: + case SLJIT_GREATER_EQUAL_F64: + case SLJIT_UNORDERED_F64: + case SLJIT_ORDERED_F64: +#if (defined SLJIT_MIPS_R6 && SLJIT_MIPS_R6) + FAIL_IF(push_inst(compiler, MFC1 | TA(dst_ar) | FS(TMP_FREG3), dst_ar)); +#else /* !SLJIT_MIPS_R6 */ + FAIL_IF(push_inst(compiler, CFC1 | TA(dst_ar) | DA(FCSR_REG), dst_ar)); +#endif /* SLJIT_MIPS_R6 */ + FAIL_IF(push_inst(compiler, SRL | TA(dst_ar) | DA(dst_ar) | SH_IMM(23), dst_ar)); + FAIL_IF(push_inst(compiler, ANDI | SA(dst_ar) | TA(dst_ar) | IMM(1), dst_ar)); + src_ar = dst_ar; + break; + + default: + src_ar = OTHER_FLAG; + break; + } + + if (type & 0x1) { + FAIL_IF(push_inst(compiler, XORI | SA(src_ar) | TA(dst_ar) | IMM(1), dst_ar)); + src_ar = dst_ar; + } + + if (op < SLJIT_ADD) { + if (dst & SLJIT_MEM) + return emit_op_mem(compiler, mem_type, src_ar, dst, dstw); + + if (src_ar != dst_ar) + return push_inst(compiler, ADDU_W | SA(src_ar) | TA(0) | DA(dst_ar), dst_ar); + return SLJIT_SUCCESS; + } + + /* OTHER_FLAG cannot be specified as src2 argument at the moment. */ + if (DR(TMP_REG2) != src_ar) + FAIL_IF(push_inst(compiler, ADDU_W | SA(src_ar) | TA(0) | D(TMP_REG2), DR(TMP_REG2))); + + mem_type |= CUMULATIVE_OP | LOGICAL_OP | IMM_OP | ALT_KEEP_CACHE; + + if (dst & SLJIT_MEM) + return emit_op(compiler, saved_op, mem_type, dst, dstw, TMP_REG1, 0, TMP_REG2, 0); + return emit_op(compiler, saved_op, mem_type, dst, dstw, dst, dstw, TMP_REG2, 0); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 dst_reg, + sljit_s32 src, sljit_sw srcw) +{ +#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1) + sljit_ins ins; +#endif + + CHECK_ERROR(); + CHECK(check_sljit_emit_cmov(compiler, type, dst_reg, src, srcw)); + +#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1) + + if (SLJIT_UNLIKELY(src & SLJIT_IMM)) { +#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) + if (dst_reg & SLJIT_I32_OP) + srcw = (sljit_s32)srcw; +#endif + FAIL_IF(load_immediate(compiler, DR(TMP_REG1), srcw)); + src = TMP_REG1; + srcw = 0; + } + + dst_reg &= ~SLJIT_I32_OP; + + switch (type & 0xff) { + case SLJIT_EQUAL: + ins = MOVZ | TA(EQUAL_FLAG); + break; + case SLJIT_NOT_EQUAL: + ins = MOVN | TA(EQUAL_FLAG); + break; + case SLJIT_LESS: + case SLJIT_GREATER: + case SLJIT_SIG_LESS: + case SLJIT_SIG_GREATER: + case SLJIT_OVERFLOW: + case SLJIT_MUL_OVERFLOW: + ins = MOVN | TA(OTHER_FLAG); + break; + case SLJIT_GREATER_EQUAL: + case SLJIT_LESS_EQUAL: + case SLJIT_SIG_GREATER_EQUAL: + case SLJIT_SIG_LESS_EQUAL: + case SLJIT_NOT_OVERFLOW: + case SLJIT_MUL_NOT_OVERFLOW: + ins = MOVZ | TA(OTHER_FLAG); + break; + case SLJIT_EQUAL_F64: + case SLJIT_LESS_F64: + case SLJIT_LESS_EQUAL_F64: + case SLJIT_UNORDERED_F64: + ins = MOVT; + break; + case SLJIT_NOT_EQUAL_F64: + case SLJIT_GREATER_EQUAL_F64: + case SLJIT_GREATER_F64: + case SLJIT_ORDERED_F64: + ins = MOVF; + break; + default: + ins = MOVZ | TA(OTHER_FLAG); + SLJIT_UNREACHABLE(); + break; + } + + return push_inst(compiler, ins | S(src) | D(dst_reg), DR(dst_reg)); + +#else + return sljit_emit_cmov_generic(compiler, type, dst_reg, src, srcw); +#endif +} + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw init_value) +{ + struct sljit_const *const_; + sljit_s32 dst_r; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value)); + ADJUST_LOCAL_OFFSET(dst, dstw); + + const_ = (struct sljit_const*)ensure_abuf(compiler, sizeof(struct sljit_const)); + PTR_FAIL_IF(!const_); + set_const(const_, compiler); + + dst_r = FAST_IS_REG(dst) ? dst : TMP_REG2; + PTR_FAIL_IF(emit_const(compiler, dst_r, init_value)); + + if (dst & SLJIT_MEM) + PTR_FAIL_IF(emit_op(compiler, SLJIT_MOV, WORD_DATA, dst, dstw, TMP_REG1, 0, TMP_REG2, 0)); + + return const_; +} + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_put_label* sljit_emit_put_label(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw) +{ + struct sljit_put_label *put_label; + sljit_s32 dst_r; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_put_label(compiler, dst, dstw)); + ADJUST_LOCAL_OFFSET(dst, dstw); + + put_label = (struct sljit_put_label*)ensure_abuf(compiler, sizeof(struct sljit_put_label)); + PTR_FAIL_IF(!put_label); + set_put_label(put_label, compiler, 0); + + dst_r = FAST_IS_REG(dst) ? dst : TMP_REG2; +#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) + PTR_FAIL_IF(emit_const(compiler, dst_r, 0)); +#else + PTR_FAIL_IF(push_inst(compiler, dst_r, UNMOVABLE_INS)); + compiler->size += 5; +#endif + + if (dst & SLJIT_MEM) + PTR_FAIL_IF(emit_op(compiler, SLJIT_MOV, WORD_DATA, dst, dstw, TMP_REG1, 0, TMP_REG2, 0)); + + return put_label; +} diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativePPC_32.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativePPC_32.c new file mode 100755 index 000000000..3ce741153 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativePPC_32.c @@ -0,0 +1,278 @@ +/* + * Stack-less Just-In-Time compiler + * + * Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* ppc 32-bit arch dependent functions. */ + +static sljit_s32 load_immediate(struct sljit_compiler *compiler, sljit_s32 reg, sljit_sw imm) +{ + if (imm <= SIMM_MAX && imm >= SIMM_MIN) + return push_inst(compiler, ADDI | D(reg) | A(0) | IMM(imm)); + + if (!(imm & ~0xffff)) + return push_inst(compiler, ORI | S(TMP_ZERO) | A(reg) | IMM(imm)); + + FAIL_IF(push_inst(compiler, ADDIS | D(reg) | A(0) | IMM(imm >> 16))); + return (imm & 0xffff) ? push_inst(compiler, ORI | S(reg) | A(reg) | IMM(imm)) : SLJIT_SUCCESS; +} + +#define INS_CLEAR_LEFT(dst, src, from) \ + (RLWINM | S(src) | A(dst) | ((from) << 6) | (31 << 1)) + +static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 flags, + sljit_s32 dst, sljit_s32 src1, sljit_s32 src2) +{ + switch (op) { + case SLJIT_MOV: + case SLJIT_MOV_U32: + case SLJIT_MOV_S32: + case SLJIT_MOV_P: + SLJIT_ASSERT(src1 == TMP_REG1); + if (dst != src2) + return push_inst(compiler, OR | S(src2) | A(dst) | B(src2)); + return SLJIT_SUCCESS; + + case SLJIT_MOV_U8: + case SLJIT_MOV_S8: + SLJIT_ASSERT(src1 == TMP_REG1); + if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) { + if (op == SLJIT_MOV_S8) + return push_inst(compiler, EXTSB | S(src2) | A(dst)); + return push_inst(compiler, INS_CLEAR_LEFT(dst, src2, 24)); + } + else if ((flags & REG_DEST) && op == SLJIT_MOV_S8) + return push_inst(compiler, EXTSB | S(src2) | A(dst)); + else { + SLJIT_ASSERT(dst == src2); + } + return SLJIT_SUCCESS; + + case SLJIT_MOV_U16: + case SLJIT_MOV_S16: + SLJIT_ASSERT(src1 == TMP_REG1); + if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) { + if (op == SLJIT_MOV_S16) + return push_inst(compiler, EXTSH | S(src2) | A(dst)); + return push_inst(compiler, INS_CLEAR_LEFT(dst, src2, 16)); + } + else { + SLJIT_ASSERT(dst == src2); + } + return SLJIT_SUCCESS; + + case SLJIT_NOT: + SLJIT_ASSERT(src1 == TMP_REG1); + return push_inst(compiler, NOR | RC(flags) | S(src2) | A(dst) | B(src2)); + + case SLJIT_NEG: + SLJIT_ASSERT(src1 == TMP_REG1); + /* Setting XER SO is not enough, CR SO is also needed. */ + return push_inst(compiler, NEG | OE((flags & ALT_FORM1) ? ALT_SET_FLAGS : 0) | RC(flags) | D(dst) | A(src2)); + + case SLJIT_CLZ: + SLJIT_ASSERT(src1 == TMP_REG1); + return push_inst(compiler, CNTLZW | S(src2) | A(dst)); + + case SLJIT_ADD: + if (flags & ALT_FORM1) { + /* Setting XER SO is not enough, CR SO is also needed. */ + return push_inst(compiler, ADD | OE(ALT_SET_FLAGS) | RC(ALT_SET_FLAGS) | D(dst) | A(src1) | B(src2)); + } + + if (flags & ALT_FORM2) { + /* Flags does not set: BIN_IMM_EXTS unnecessary. */ + SLJIT_ASSERT(src2 == TMP_REG2); + + if (flags & ALT_FORM3) + return push_inst(compiler, ADDIS | D(dst) | A(src1) | compiler->imm); + + if (flags & ALT_FORM4) { + FAIL_IF(push_inst(compiler, ADDIS | D(dst) | A(src1) | (((compiler->imm >> 16) & 0xffff) + ((compiler->imm >> 15) & 0x1)))); + src1 = dst; + } + + return push_inst(compiler, ADDI | D(dst) | A(src1) | (compiler->imm & 0xffff)); + } + if (flags & ALT_FORM3) { + SLJIT_ASSERT(src2 == TMP_REG2); + return push_inst(compiler, ADDIC | D(dst) | A(src1) | compiler->imm); + } + if (!(flags & ALT_SET_FLAGS)) + return push_inst(compiler, ADD | D(dst) | A(src1) | B(src2)); + if (flags & ALT_FORM4) + return push_inst(compiler, ADDC | RC(ALT_SET_FLAGS) | D(dst) | A(src1) | B(src2)); + return push_inst(compiler, ADD | RC(flags) | D(dst) | A(src1) | B(src2)); + + case SLJIT_ADDC: + return push_inst(compiler, ADDE | D(dst) | A(src1) | B(src2)); + + case SLJIT_SUB: + if (flags & ALT_FORM1) { + if (flags & ALT_FORM2) { + FAIL_IF(push_inst(compiler, CMPLI | CRD(0) | A(src1) | compiler->imm)); + if (!(flags & ALT_FORM3)) + return SLJIT_SUCCESS; + return push_inst(compiler, ADDI | D(dst) | A(src1) | (-compiler->imm & 0xffff)); + } + FAIL_IF(push_inst(compiler, CMPL | CRD(0) | A(src1) | B(src2))); + if (!(flags & ALT_FORM3)) + return SLJIT_SUCCESS; + return push_inst(compiler, SUBF | D(dst) | A(src2) | B(src1)); + } + + if (flags & ALT_FORM2) { + /* Setting XER SO is not enough, CR SO is also needed. */ + return push_inst(compiler, SUBF | OE(ALT_SET_FLAGS) | RC(ALT_SET_FLAGS) | D(dst) | A(src2) | B(src1)); + } + + if (flags & ALT_FORM3) { + /* Flags does not set: BIN_IMM_EXTS unnecessary. */ + SLJIT_ASSERT(src2 == TMP_REG2); + return push_inst(compiler, SUBFIC | D(dst) | A(src1) | compiler->imm); + } + + if (flags & ALT_FORM4) { + if (flags & ALT_FORM5) { + SLJIT_ASSERT(src2 == TMP_REG2); + return push_inst(compiler, CMPI | CRD(0) | A(src1) | compiler->imm); + } + return push_inst(compiler, CMP | CRD(0) | A(src1) | B(src2)); + } + + if (!(flags & ALT_SET_FLAGS)) + return push_inst(compiler, SUBF | D(dst) | A(src2) | B(src1)); + if (flags & ALT_FORM5) + return push_inst(compiler, SUBFC | RC(ALT_SET_FLAGS) | D(dst) | A(src2) | B(src1)); + return push_inst(compiler, SUBF | RC(flags) | D(dst) | A(src2) | B(src1)); + + case SLJIT_SUBC: + return push_inst(compiler, SUBFE | D(dst) | A(src2) | B(src1)); + + case SLJIT_MUL: + if (flags & ALT_FORM1) { + SLJIT_ASSERT(src2 == TMP_REG2); + return push_inst(compiler, MULLI | D(dst) | A(src1) | compiler->imm); + } + return push_inst(compiler, MULLW | OE(flags) | RC(flags) | D(dst) | A(src2) | B(src1)); + + case SLJIT_AND: + if (flags & ALT_FORM1) { + SLJIT_ASSERT(src2 == TMP_REG2); + return push_inst(compiler, ANDI | S(src1) | A(dst) | compiler->imm); + } + if (flags & ALT_FORM2) { + SLJIT_ASSERT(src2 == TMP_REG2); + return push_inst(compiler, ANDIS | S(src1) | A(dst) | compiler->imm); + } + return push_inst(compiler, AND | RC(flags) | S(src1) | A(dst) | B(src2)); + + case SLJIT_OR: + if (flags & ALT_FORM1) { + SLJIT_ASSERT(src2 == TMP_REG2); + return push_inst(compiler, ORI | S(src1) | A(dst) | compiler->imm); + } + if (flags & ALT_FORM2) { + SLJIT_ASSERT(src2 == TMP_REG2); + return push_inst(compiler, ORIS | S(src1) | A(dst) | compiler->imm); + } + if (flags & ALT_FORM3) { + SLJIT_ASSERT(src2 == TMP_REG2); + FAIL_IF(push_inst(compiler, ORI | S(src1) | A(dst) | IMM(compiler->imm))); + return push_inst(compiler, ORIS | S(dst) | A(dst) | IMM(compiler->imm >> 16)); + } + return push_inst(compiler, OR | RC(flags) | S(src1) | A(dst) | B(src2)); + + case SLJIT_XOR: + if (flags & ALT_FORM1) { + SLJIT_ASSERT(src2 == TMP_REG2); + return push_inst(compiler, XORI | S(src1) | A(dst) | compiler->imm); + } + if (flags & ALT_FORM2) { + SLJIT_ASSERT(src2 == TMP_REG2); + return push_inst(compiler, XORIS | S(src1) | A(dst) | compiler->imm); + } + if (flags & ALT_FORM3) { + SLJIT_ASSERT(src2 == TMP_REG2); + FAIL_IF(push_inst(compiler, XORI | S(src1) | A(dst) | IMM(compiler->imm))); + return push_inst(compiler, XORIS | S(dst) | A(dst) | IMM(compiler->imm >> 16)); + } + return push_inst(compiler, XOR | RC(flags) | S(src1) | A(dst) | B(src2)); + + case SLJIT_SHL: + if (flags & ALT_FORM1) { + SLJIT_ASSERT(src2 == TMP_REG2); + compiler->imm &= 0x1f; + return push_inst(compiler, RLWINM | RC(flags) | S(src1) | A(dst) | (compiler->imm << 11) | ((31 - compiler->imm) << 1)); + } + return push_inst(compiler, SLW | RC(flags) | S(src1) | A(dst) | B(src2)); + + case SLJIT_LSHR: + if (flags & ALT_FORM1) { + SLJIT_ASSERT(src2 == TMP_REG2); + compiler->imm &= 0x1f; + return push_inst(compiler, RLWINM | RC(flags) | S(src1) | A(dst) | (((32 - compiler->imm) & 0x1f) << 11) | (compiler->imm << 6) | (31 << 1)); + } + return push_inst(compiler, SRW | RC(flags) | S(src1) | A(dst) | B(src2)); + + case SLJIT_ASHR: + if (flags & ALT_FORM1) { + SLJIT_ASSERT(src2 == TMP_REG2); + compiler->imm &= 0x1f; + return push_inst(compiler, SRAWI | RC(flags) | S(src1) | A(dst) | (compiler->imm << 11)); + } + return push_inst(compiler, SRAW | RC(flags) | S(src1) | A(dst) | B(src2)); + } + + SLJIT_UNREACHABLE(); + return SLJIT_SUCCESS; +} + +static SLJIT_INLINE sljit_s32 emit_const(struct sljit_compiler *compiler, sljit_s32 reg, sljit_sw init_value) +{ + FAIL_IF(push_inst(compiler, ADDIS | D(reg) | A(0) | IMM(init_value >> 16))); + return push_inst(compiler, ORI | S(reg) | A(reg) | IMM(init_value)); +} + +SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset) +{ + sljit_ins *inst = (sljit_ins *)addr; + + SLJIT_ASSERT((inst[0] & 0xfc1f0000) == ADDIS && (inst[1] & 0xfc000000) == ORI); + inst[0] = (inst[0] & 0xffff0000) | ((new_target >> 16) & 0xffff); + inst[1] = (inst[1] & 0xffff0000) | (new_target & 0xffff); + inst = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset); + SLJIT_CACHE_FLUSH(inst, inst + 2); +} + +SLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_constant, sljit_sw executable_offset) +{ + sljit_ins *inst = (sljit_ins *)addr; + + SLJIT_ASSERT((inst[0] & 0xfc1f0000) == ADDIS && (inst[1] & 0xfc000000) == ORI); + inst[0] = (inst[0] & 0xffff0000) | ((new_constant >> 16) & 0xffff); + inst[1] = (inst[1] & 0xffff0000) | (new_constant & 0xffff); + inst = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset); + SLJIT_CACHE_FLUSH(inst, inst + 2); +} diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativePPC_64.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativePPC_64.c new file mode 100755 index 000000000..3b73021cc --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativePPC_64.c @@ -0,0 +1,499 @@ +/* + * Stack-less Just-In-Time compiler + * + * Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* ppc 64-bit arch dependent functions. */ + +#if defined(__GNUC__) || (defined(__IBM_GCC_ASM) && __IBM_GCC_ASM) +#define ASM_SLJIT_CLZ(src, dst) \ + __asm__ volatile ( "cntlzd %0, %1" : "=r"(dst) : "r"(src) ) +#elif defined(__xlc__) +#error "Please enable GCC syntax for inline assembly statements" +#else +#error "Must implement count leading zeroes" +#endif + +#define PUSH_RLDICR(reg, shift) \ + push_inst(compiler, RLDI(reg, reg, 63 - shift, shift, 1)) + +static sljit_s32 load_immediate(struct sljit_compiler *compiler, sljit_s32 reg, sljit_sw imm) +{ + sljit_uw tmp; + sljit_uw shift; + sljit_uw tmp2; + sljit_uw shift2; + + if (imm <= SIMM_MAX && imm >= SIMM_MIN) + return push_inst(compiler, ADDI | D(reg) | A(0) | IMM(imm)); + + if (!(imm & ~0xffff)) + return push_inst(compiler, ORI | S(TMP_ZERO) | A(reg) | IMM(imm)); + + if (imm <= 0x7fffffffl && imm >= -0x80000000l) { + FAIL_IF(push_inst(compiler, ADDIS | D(reg) | A(0) | IMM(imm >> 16))); + return (imm & 0xffff) ? push_inst(compiler, ORI | S(reg) | A(reg) | IMM(imm)) : SLJIT_SUCCESS; + } + + /* Count leading zeroes. */ + tmp = (imm >= 0) ? imm : ~imm; + ASM_SLJIT_CLZ(tmp, shift); + SLJIT_ASSERT(shift > 0); + shift--; + tmp = (imm << shift); + + if ((tmp & ~0xffff000000000000ul) == 0) { + FAIL_IF(push_inst(compiler, ADDI | D(reg) | A(0) | IMM(tmp >> 48))); + shift += 15; + return PUSH_RLDICR(reg, shift); + } + + if ((tmp & ~0xffffffff00000000ul) == 0) { + FAIL_IF(push_inst(compiler, ADDIS | D(reg) | A(0) | IMM(tmp >> 48))); + FAIL_IF(push_inst(compiler, ORI | S(reg) | A(reg) | IMM(tmp >> 32))); + shift += 31; + return PUSH_RLDICR(reg, shift); + } + + /* Cut out the 16 bit from immediate. */ + shift += 15; + tmp2 = imm & ((1ul << (63 - shift)) - 1); + + if (tmp2 <= 0xffff) { + FAIL_IF(push_inst(compiler, ADDI | D(reg) | A(0) | IMM(tmp >> 48))); + FAIL_IF(PUSH_RLDICR(reg, shift)); + return push_inst(compiler, ORI | S(reg) | A(reg) | tmp2); + } + + if (tmp2 <= 0xffffffff) { + FAIL_IF(push_inst(compiler, ADDI | D(reg) | A(0) | IMM(tmp >> 48))); + FAIL_IF(PUSH_RLDICR(reg, shift)); + FAIL_IF(push_inst(compiler, ORIS | S(reg) | A(reg) | (tmp2 >> 16))); + return (imm & 0xffff) ? push_inst(compiler, ORI | S(reg) | A(reg) | IMM(tmp2)) : SLJIT_SUCCESS; + } + + ASM_SLJIT_CLZ(tmp2, shift2); + tmp2 <<= shift2; + + if ((tmp2 & ~0xffff000000000000ul) == 0) { + FAIL_IF(push_inst(compiler, ADDI | D(reg) | A(0) | IMM(tmp >> 48))); + shift2 += 15; + shift += (63 - shift2); + FAIL_IF(PUSH_RLDICR(reg, shift)); + FAIL_IF(push_inst(compiler, ORI | S(reg) | A(reg) | (tmp2 >> 48))); + return PUSH_RLDICR(reg, shift2); + } + + /* The general version. */ + FAIL_IF(push_inst(compiler, ADDIS | D(reg) | A(0) | IMM(imm >> 48))); + FAIL_IF(push_inst(compiler, ORI | S(reg) | A(reg) | IMM(imm >> 32))); + FAIL_IF(PUSH_RLDICR(reg, 31)); + FAIL_IF(push_inst(compiler, ORIS | S(reg) | A(reg) | IMM(imm >> 16))); + return push_inst(compiler, ORI | S(reg) | A(reg) | IMM(imm)); +} + +/* Simplified mnemonics: clrldi. */ +#define INS_CLEAR_LEFT(dst, src, from) \ + (RLDICL | S(src) | A(dst) | ((from) << 6) | (1 << 5)) + +/* Sign extension for integer operations. */ +#define UN_EXTS() \ + if ((flags & (ALT_SIGN_EXT | REG2_SOURCE)) == (ALT_SIGN_EXT | REG2_SOURCE)) { \ + FAIL_IF(push_inst(compiler, EXTSW | S(src2) | A(TMP_REG2))); \ + src2 = TMP_REG2; \ + } + +#define BIN_EXTS() \ + if (flags & ALT_SIGN_EXT) { \ + if (flags & REG1_SOURCE) { \ + FAIL_IF(push_inst(compiler, EXTSW | S(src1) | A(TMP_REG1))); \ + src1 = TMP_REG1; \ + } \ + if (flags & REG2_SOURCE) { \ + FAIL_IF(push_inst(compiler, EXTSW | S(src2) | A(TMP_REG2))); \ + src2 = TMP_REG2; \ + } \ + } + +#define BIN_IMM_EXTS() \ + if ((flags & (ALT_SIGN_EXT | REG1_SOURCE)) == (ALT_SIGN_EXT | REG1_SOURCE)) { \ + FAIL_IF(push_inst(compiler, EXTSW | S(src1) | A(TMP_REG1))); \ + src1 = TMP_REG1; \ + } + +static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 flags, + sljit_s32 dst, sljit_s32 src1, sljit_s32 src2) +{ + switch (op) { + case SLJIT_MOV: + case SLJIT_MOV_P: + SLJIT_ASSERT(src1 == TMP_REG1); + if (dst != src2) + return push_inst(compiler, OR | S(src2) | A(dst) | B(src2)); + return SLJIT_SUCCESS; + + case SLJIT_MOV_U32: + case SLJIT_MOV_S32: + SLJIT_ASSERT(src1 == TMP_REG1); + if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) { + if (op == SLJIT_MOV_S32) + return push_inst(compiler, EXTSW | S(src2) | A(dst)); + return push_inst(compiler, INS_CLEAR_LEFT(dst, src2, 0)); + } + else { + SLJIT_ASSERT(dst == src2); + } + return SLJIT_SUCCESS; + + case SLJIT_MOV_U8: + case SLJIT_MOV_S8: + SLJIT_ASSERT(src1 == TMP_REG1); + if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) { + if (op == SLJIT_MOV_S8) + return push_inst(compiler, EXTSB | S(src2) | A(dst)); + return push_inst(compiler, INS_CLEAR_LEFT(dst, src2, 24)); + } + else if ((flags & REG_DEST) && op == SLJIT_MOV_S8) + return push_inst(compiler, EXTSB | S(src2) | A(dst)); + else { + SLJIT_ASSERT(dst == src2); + } + return SLJIT_SUCCESS; + + case SLJIT_MOV_U16: + case SLJIT_MOV_S16: + SLJIT_ASSERT(src1 == TMP_REG1); + if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) { + if (op == SLJIT_MOV_S16) + return push_inst(compiler, EXTSH | S(src2) | A(dst)); + return push_inst(compiler, INS_CLEAR_LEFT(dst, src2, 16)); + } + else { + SLJIT_ASSERT(dst == src2); + } + return SLJIT_SUCCESS; + + case SLJIT_NOT: + SLJIT_ASSERT(src1 == TMP_REG1); + UN_EXTS(); + return push_inst(compiler, NOR | RC(flags) | S(src2) | A(dst) | B(src2)); + + case SLJIT_NEG: + SLJIT_ASSERT(src1 == TMP_REG1); + + if ((flags & (ALT_FORM1 | ALT_SIGN_EXT)) == (ALT_FORM1 | ALT_SIGN_EXT)) { + FAIL_IF(push_inst(compiler, RLDI(TMP_REG2, src2, 32, 31, 1))); + FAIL_IF(push_inst(compiler, NEG | OE(ALT_SET_FLAGS) | RC(ALT_SET_FLAGS) | D(dst) | A(TMP_REG2))); + return push_inst(compiler, RLDI(dst, dst, 32, 32, 0)); + } + + UN_EXTS(); + /* Setting XER SO is not enough, CR SO is also needed. */ + return push_inst(compiler, NEG | OE((flags & ALT_FORM1) ? ALT_SET_FLAGS : 0) | RC(flags) | D(dst) | A(src2)); + + case SLJIT_CLZ: + SLJIT_ASSERT(src1 == TMP_REG1); + if (flags & ALT_FORM1) + return push_inst(compiler, CNTLZW | S(src2) | A(dst)); + return push_inst(compiler, CNTLZD | S(src2) | A(dst)); + + case SLJIT_ADD: + if (flags & ALT_FORM1) { + if (flags & ALT_SIGN_EXT) { + FAIL_IF(push_inst(compiler, RLDI(TMP_REG1, src1, 32, 31, 1))); + src1 = TMP_REG1; + FAIL_IF(push_inst(compiler, RLDI(TMP_REG2, src2, 32, 31, 1))); + src2 = TMP_REG2; + } + /* Setting XER SO is not enough, CR SO is also needed. */ + FAIL_IF(push_inst(compiler, ADD | OE(ALT_SET_FLAGS) | RC(ALT_SET_FLAGS) | D(dst) | A(src1) | B(src2))); + if (flags & ALT_SIGN_EXT) + return push_inst(compiler, RLDI(dst, dst, 32, 32, 0)); + return SLJIT_SUCCESS; + } + + if (flags & ALT_FORM2) { + /* Flags does not set: BIN_IMM_EXTS unnecessary. */ + SLJIT_ASSERT(src2 == TMP_REG2); + + if (flags & ALT_FORM3) + return push_inst(compiler, ADDIS | D(dst) | A(src1) | compiler->imm); + + if (flags & ALT_FORM4) { + FAIL_IF(push_inst(compiler, ADDIS | D(dst) | A(src1) | (((compiler->imm >> 16) & 0xffff) + ((compiler->imm >> 15) & 0x1)))); + src1 = dst; + } + + return push_inst(compiler, ADDI | D(dst) | A(src1) | (compiler->imm & 0xffff)); + } + if (flags & ALT_FORM3) { + SLJIT_ASSERT(src2 == TMP_REG2); + BIN_IMM_EXTS(); + return push_inst(compiler, ADDIC | D(dst) | A(src1) | compiler->imm); + } + if (!(flags & ALT_SET_FLAGS)) + return push_inst(compiler, ADD | D(dst) | A(src1) | B(src2)); + BIN_EXTS(); + if (flags & ALT_FORM4) + return push_inst(compiler, ADDC | RC(ALT_SET_FLAGS) | D(dst) | A(src1) | B(src2)); + return push_inst(compiler, ADD | RC(flags) | D(dst) | A(src1) | B(src2)); + + case SLJIT_ADDC: + BIN_EXTS(); + return push_inst(compiler, ADDE | D(dst) | A(src1) | B(src2)); + + case SLJIT_SUB: + if (flags & ALT_FORM1) { + if (flags & ALT_FORM2) { + FAIL_IF(push_inst(compiler, CMPLI | CRD(0 | ((flags & ALT_SIGN_EXT) ? 0 : 1)) | A(src1) | compiler->imm)); + if (!(flags & ALT_FORM3)) + return SLJIT_SUCCESS; + return push_inst(compiler, ADDI | D(dst) | A(src1) | (-compiler->imm & 0xffff)); + } + FAIL_IF(push_inst(compiler, CMPL | CRD(0 | ((flags & ALT_SIGN_EXT) ? 0 : 1)) | A(src1) | B(src2))); + if (!(flags & ALT_FORM3)) + return SLJIT_SUCCESS; + return push_inst(compiler, SUBF | D(dst) | A(src2) | B(src1)); + } + + if (flags & ALT_FORM2) { + if (flags & ALT_SIGN_EXT) { + FAIL_IF(push_inst(compiler, RLDI(TMP_REG1, src1, 32, 31, 1))); + src1 = TMP_REG1; + FAIL_IF(push_inst(compiler, RLDI(TMP_REG2, src2, 32, 31, 1))); + src2 = TMP_REG2; + } + /* Setting XER SO is not enough, CR SO is also needed. */ + FAIL_IF(push_inst(compiler, SUBF | OE(ALT_SET_FLAGS) | RC(ALT_SET_FLAGS) | D(dst) | A(src2) | B(src1))); + if (flags & ALT_SIGN_EXT) + return push_inst(compiler, RLDI(dst, dst, 32, 32, 0)); + return SLJIT_SUCCESS; + } + + if (flags & ALT_FORM3) { + /* Flags does not set: BIN_IMM_EXTS unnecessary. */ + SLJIT_ASSERT(src2 == TMP_REG2); + return push_inst(compiler, SUBFIC | D(dst) | A(src1) | compiler->imm); + } + + if (flags & ALT_FORM4) { + if (flags & ALT_FORM5) { + SLJIT_ASSERT(src2 == TMP_REG2); + return push_inst(compiler, CMPI | CRD(0 | ((flags & ALT_SIGN_EXT) ? 0 : 1)) | A(src1) | compiler->imm); + } + return push_inst(compiler, CMP | CRD(0 | ((flags & ALT_SIGN_EXT) ? 0 : 1)) | A(src1) | B(src2)); + } + + if (!(flags & ALT_SET_FLAGS)) + return push_inst(compiler, SUBF | D(dst) | A(src2) | B(src1)); + BIN_EXTS(); + if (flags & ALT_FORM5) + return push_inst(compiler, SUBFC | RC(ALT_SET_FLAGS) | D(dst) | A(src2) | B(src1)); + return push_inst(compiler, SUBF | RC(flags) | D(dst) | A(src2) | B(src1)); + + case SLJIT_SUBC: + BIN_EXTS(); + return push_inst(compiler, SUBFE | D(dst) | A(src2) | B(src1)); + + case SLJIT_MUL: + if (flags & ALT_FORM1) { + SLJIT_ASSERT(src2 == TMP_REG2); + return push_inst(compiler, MULLI | D(dst) | A(src1) | compiler->imm); + } + BIN_EXTS(); + if (flags & ALT_FORM2) + return push_inst(compiler, MULLW | OE(flags) | RC(flags) | D(dst) | A(src2) | B(src1)); + return push_inst(compiler, MULLD | OE(flags) | RC(flags) | D(dst) | A(src2) | B(src1)); + + case SLJIT_AND: + if (flags & ALT_FORM1) { + SLJIT_ASSERT(src2 == TMP_REG2); + return push_inst(compiler, ANDI | S(src1) | A(dst) | compiler->imm); + } + if (flags & ALT_FORM2) { + SLJIT_ASSERT(src2 == TMP_REG2); + return push_inst(compiler, ANDIS | S(src1) | A(dst) | compiler->imm); + } + return push_inst(compiler, AND | RC(flags) | S(src1) | A(dst) | B(src2)); + + case SLJIT_OR: + if (flags & ALT_FORM1) { + SLJIT_ASSERT(src2 == TMP_REG2); + return push_inst(compiler, ORI | S(src1) | A(dst) | compiler->imm); + } + if (flags & ALT_FORM2) { + SLJIT_ASSERT(src2 == TMP_REG2); + return push_inst(compiler, ORIS | S(src1) | A(dst) | compiler->imm); + } + if (flags & ALT_FORM3) { + SLJIT_ASSERT(src2 == TMP_REG2); + FAIL_IF(push_inst(compiler, ORI | S(src1) | A(dst) | IMM(compiler->imm))); + return push_inst(compiler, ORIS | S(dst) | A(dst) | IMM(compiler->imm >> 16)); + } + return push_inst(compiler, OR | RC(flags) | S(src1) | A(dst) | B(src2)); + + case SLJIT_XOR: + if (flags & ALT_FORM1) { + SLJIT_ASSERT(src2 == TMP_REG2); + return push_inst(compiler, XORI | S(src1) | A(dst) | compiler->imm); + } + if (flags & ALT_FORM2) { + SLJIT_ASSERT(src2 == TMP_REG2); + return push_inst(compiler, XORIS | S(src1) | A(dst) | compiler->imm); + } + if (flags & ALT_FORM3) { + SLJIT_ASSERT(src2 == TMP_REG2); + FAIL_IF(push_inst(compiler, XORI | S(src1) | A(dst) | IMM(compiler->imm))); + return push_inst(compiler, XORIS | S(dst) | A(dst) | IMM(compiler->imm >> 16)); + } + return push_inst(compiler, XOR | RC(flags) | S(src1) | A(dst) | B(src2)); + + case SLJIT_SHL: + if (flags & ALT_FORM1) { + SLJIT_ASSERT(src2 == TMP_REG2); + if (flags & ALT_FORM2) { + compiler->imm &= 0x1f; + return push_inst(compiler, RLWINM | RC(flags) | S(src1) | A(dst) | (compiler->imm << 11) | ((31 - compiler->imm) << 1)); + } + compiler->imm &= 0x3f; + return push_inst(compiler, RLDI(dst, src1, compiler->imm, 63 - compiler->imm, 1) | RC(flags)); + } + return push_inst(compiler, ((flags & ALT_FORM2) ? SLW : SLD) | RC(flags) | S(src1) | A(dst) | B(src2)); + + case SLJIT_LSHR: + if (flags & ALT_FORM1) { + SLJIT_ASSERT(src2 == TMP_REG2); + if (flags & ALT_FORM2) { + compiler->imm &= 0x1f; + return push_inst(compiler, RLWINM | RC(flags) | S(src1) | A(dst) | (((32 - compiler->imm) & 0x1f) << 11) | (compiler->imm << 6) | (31 << 1)); + } + compiler->imm &= 0x3f; + return push_inst(compiler, RLDI(dst, src1, 64 - compiler->imm, compiler->imm, 0) | RC(flags)); + } + return push_inst(compiler, ((flags & ALT_FORM2) ? SRW : SRD) | RC(flags) | S(src1) | A(dst) | B(src2)); + + case SLJIT_ASHR: + if (flags & ALT_FORM1) { + SLJIT_ASSERT(src2 == TMP_REG2); + if (flags & ALT_FORM2) { + compiler->imm &= 0x1f; + return push_inst(compiler, SRAWI | RC(flags) | S(src1) | A(dst) | (compiler->imm << 11)); + } + compiler->imm &= 0x3f; + return push_inst(compiler, SRADI | RC(flags) | S(src1) | A(dst) | ((compiler->imm & 0x1f) << 11) | ((compiler->imm & 0x20) >> 4)); + } + return push_inst(compiler, ((flags & ALT_FORM2) ? SRAW : SRAD) | RC(flags) | S(src1) | A(dst) | B(src2)); + } + + SLJIT_UNREACHABLE(); + return SLJIT_SUCCESS; +} + +static sljit_s32 call_with_args(struct sljit_compiler *compiler, sljit_s32 arg_types, sljit_s32 *src) +{ + sljit_s32 arg_count = 0; + sljit_s32 word_arg_count = 0; + sljit_s32 types = 0; + sljit_s32 reg = 0; + + if (src) + reg = *src & REG_MASK; + + arg_types >>= SLJIT_DEF_SHIFT; + + while (arg_types) { + types = (types << SLJIT_DEF_SHIFT) | (arg_types & SLJIT_DEF_MASK); + + switch (arg_types & SLJIT_DEF_MASK) { + case SLJIT_ARG_TYPE_F32: + case SLJIT_ARG_TYPE_F64: + arg_count++; + break; + default: + arg_count++; + word_arg_count++; + + if (arg_count != word_arg_count && arg_count == reg) { + FAIL_IF(push_inst(compiler, OR | S(reg) | A(TMP_CALL_REG) | B(reg))); + *src = TMP_CALL_REG; + } + break; + } + + arg_types >>= SLJIT_DEF_SHIFT; + } + + while (types) { + switch (types & SLJIT_DEF_MASK) { + case SLJIT_ARG_TYPE_F32: + case SLJIT_ARG_TYPE_F64: + arg_count--; + break; + default: + if (arg_count != word_arg_count) + FAIL_IF(push_inst(compiler, OR | S(word_arg_count) | A(arg_count) | B(word_arg_count))); + + arg_count--; + word_arg_count--; + break; + } + + types >>= SLJIT_DEF_SHIFT; + } + + return SLJIT_SUCCESS; +} + +static SLJIT_INLINE sljit_s32 emit_const(struct sljit_compiler *compiler, sljit_s32 reg, sljit_sw init_value) +{ + FAIL_IF(push_inst(compiler, ADDIS | D(reg) | A(0) | IMM(init_value >> 48))); + FAIL_IF(push_inst(compiler, ORI | S(reg) | A(reg) | IMM(init_value >> 32))); + FAIL_IF(PUSH_RLDICR(reg, 31)); + FAIL_IF(push_inst(compiler, ORIS | S(reg) | A(reg) | IMM(init_value >> 16))); + return push_inst(compiler, ORI | S(reg) | A(reg) | IMM(init_value)); +} + +SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset) +{ + sljit_ins *inst = (sljit_ins*)addr; + + inst[0] = (inst[0] & 0xffff0000) | ((new_target >> 48) & 0xffff); + inst[1] = (inst[1] & 0xffff0000) | ((new_target >> 32) & 0xffff); + inst[3] = (inst[3] & 0xffff0000) | ((new_target >> 16) & 0xffff); + inst[4] = (inst[4] & 0xffff0000) | (new_target & 0xffff); + inst = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset); + SLJIT_CACHE_FLUSH(inst, inst + 5); +} + +SLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_constant, sljit_sw executable_offset) +{ + sljit_ins *inst = (sljit_ins*)addr; + + inst[0] = (inst[0] & 0xffff0000) | ((new_constant >> 48) & 0xffff); + inst[1] = (inst[1] & 0xffff0000) | ((new_constant >> 32) & 0xffff); + inst[3] = (inst[3] & 0xffff0000) | ((new_constant >> 16) & 0xffff); + inst[4] = (inst[4] & 0xffff0000) | (new_constant & 0xffff); + inst = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset); + SLJIT_CACHE_FLUSH(inst, inst + 5); +} diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativePPC_common.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativePPC_common.c new file mode 100755 index 000000000..e82751431 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativePPC_common.c @@ -0,0 +1,2395 @@ +/* + * Stack-less Just-In-Time compiler + * + * Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +SLJIT_API_FUNC_ATTRIBUTE const char* sljit_get_platform_name(void) +{ + return "PowerPC" SLJIT_CPUINFO; +} + +/* Length of an instruction word. + Both for ppc-32 and ppc-64. */ +typedef sljit_u32 sljit_ins; + +#if ((defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) && (defined _AIX)) \ + || (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) +#define SLJIT_PPC_STACK_FRAME_V2 1 +#endif + +#ifdef _AIX +#include +#endif + +#if (defined _CALL_ELF && _CALL_ELF == 2) +#define SLJIT_PASS_ENTRY_ADDR_TO_CALL 1 +#endif + +#if (defined SLJIT_CACHE_FLUSH_OWN_IMPL && SLJIT_CACHE_FLUSH_OWN_IMPL) + +static void ppc_cache_flush(sljit_ins *from, sljit_ins *to) +{ +#ifdef _AIX + _sync_cache_range((caddr_t)from, (int)((size_t)to - (size_t)from)); +#elif defined(__GNUC__) || (defined(__IBM_GCC_ASM) && __IBM_GCC_ASM) +# if defined(_ARCH_PWR) || defined(_ARCH_PWR2) + /* Cache flush for POWER architecture. */ + while (from < to) { + __asm__ volatile ( + "clf 0, %0\n" + "dcs\n" + : : "r"(from) + ); + from++; + } + __asm__ volatile ( "ics" ); +# elif defined(_ARCH_COM) && !defined(_ARCH_PPC) +# error "Cache flush is not implemented for PowerPC/POWER common mode." +# else + /* Cache flush for PowerPC architecture. */ + while (from < to) { + __asm__ volatile ( + "dcbf 0, %0\n" + "sync\n" + "icbi 0, %0\n" + : : "r"(from) + ); + from++; + } + __asm__ volatile ( "isync" ); +# endif +# ifdef __xlc__ +# warning "This file may fail to compile if -qfuncsect is used" +# endif +#elif defined(__xlc__) +#error "Please enable GCC syntax for inline assembly statements with -qasm=gcc" +#else +#error "This platform requires a cache flush implementation." +#endif /* _AIX */ +} + +#endif /* (defined SLJIT_CACHE_FLUSH_OWN_IMPL && SLJIT_CACHE_FLUSH_OWN_IMPL) */ + +#define TMP_REG1 (SLJIT_NUMBER_OF_REGISTERS + 2) +#define TMP_REG2 (SLJIT_NUMBER_OF_REGISTERS + 3) +#define TMP_ZERO (SLJIT_NUMBER_OF_REGISTERS + 4) + +#if (defined SLJIT_PASS_ENTRY_ADDR_TO_CALL && SLJIT_PASS_ENTRY_ADDR_TO_CALL) +#define TMP_CALL_REG (SLJIT_NUMBER_OF_REGISTERS + 5) +#else +#define TMP_CALL_REG TMP_REG2 +#endif + +#define TMP_FREG1 (SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1) +#define TMP_FREG2 (SLJIT_NUMBER_OF_FLOAT_REGISTERS + 2) + +static const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 7] = { + 0, 3, 4, 5, 6, 7, 8, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 1, 9, 10, 31, 12 +}; + +static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 3] = { + 0, 1, 2, 3, 4, 5, 6, 0, 7 +}; + +/* --------------------------------------------------------------------- */ +/* Instrucion forms */ +/* --------------------------------------------------------------------- */ +#define D(d) (reg_map[d] << 21) +#define S(s) (reg_map[s] << 21) +#define A(a) (reg_map[a] << 16) +#define B(b) (reg_map[b] << 11) +#define C(c) (reg_map[c] << 6) +#define FD(fd) (freg_map[fd] << 21) +#define FS(fs) (freg_map[fs] << 21) +#define FA(fa) (freg_map[fa] << 16) +#define FB(fb) (freg_map[fb] << 11) +#define FC(fc) (freg_map[fc] << 6) +#define IMM(imm) ((imm) & 0xffff) +#define CRD(d) ((d) << 21) + +/* Instruction bit sections. + OE and Rc flag (see ALT_SET_FLAGS). */ +#define OE(flags) ((flags) & ALT_SET_FLAGS) +/* Rc flag (see ALT_SET_FLAGS). */ +#define RC(flags) (((flags) & ALT_SET_FLAGS) >> 10) +#define HI(opcode) ((opcode) << 26) +#define LO(opcode) ((opcode) << 1) + +#define ADD (HI(31) | LO(266)) +#define ADDC (HI(31) | LO(10)) +#define ADDE (HI(31) | LO(138)) +#define ADDI (HI(14)) +#define ADDIC (HI(13)) +#define ADDIS (HI(15)) +#define ADDME (HI(31) | LO(234)) +#define AND (HI(31) | LO(28)) +#define ANDI (HI(28)) +#define ANDIS (HI(29)) +#define Bx (HI(18)) +#define BCx (HI(16)) +#define BCCTR (HI(19) | LO(528) | (3 << 11)) +#define BLR (HI(19) | LO(16) | (0x14 << 21)) +#define CNTLZD (HI(31) | LO(58)) +#define CNTLZW (HI(31) | LO(26)) +#define CMP (HI(31) | LO(0)) +#define CMPI (HI(11)) +#define CMPL (HI(31) | LO(32)) +#define CMPLI (HI(10)) +#define CROR (HI(19) | LO(449)) +#define DCBT (HI(31) | LO(278)) +#define DIVD (HI(31) | LO(489)) +#define DIVDU (HI(31) | LO(457)) +#define DIVW (HI(31) | LO(491)) +#define DIVWU (HI(31) | LO(459)) +#define EXTSB (HI(31) | LO(954)) +#define EXTSH (HI(31) | LO(922)) +#define EXTSW (HI(31) | LO(986)) +#define FABS (HI(63) | LO(264)) +#define FADD (HI(63) | LO(21)) +#define FADDS (HI(59) | LO(21)) +#define FCFID (HI(63) | LO(846)) +#define FCMPU (HI(63) | LO(0)) +#define FCTIDZ (HI(63) | LO(815)) +#define FCTIWZ (HI(63) | LO(15)) +#define FDIV (HI(63) | LO(18)) +#define FDIVS (HI(59) | LO(18)) +#define FMR (HI(63) | LO(72)) +#define FMUL (HI(63) | LO(25)) +#define FMULS (HI(59) | LO(25)) +#define FNEG (HI(63) | LO(40)) +#define FRSP (HI(63) | LO(12)) +#define FSUB (HI(63) | LO(20)) +#define FSUBS (HI(59) | LO(20)) +#define LD (HI(58) | 0) +#define LWZ (HI(32)) +#define MFCR (HI(31) | LO(19)) +#define MFLR (HI(31) | LO(339) | 0x80000) +#define MFXER (HI(31) | LO(339) | 0x10000) +#define MTCTR (HI(31) | LO(467) | 0x90000) +#define MTLR (HI(31) | LO(467) | 0x80000) +#define MTXER (HI(31) | LO(467) | 0x10000) +#define MULHD (HI(31) | LO(73)) +#define MULHDU (HI(31) | LO(9)) +#define MULHW (HI(31) | LO(75)) +#define MULHWU (HI(31) | LO(11)) +#define MULLD (HI(31) | LO(233)) +#define MULLI (HI(7)) +#define MULLW (HI(31) | LO(235)) +#define NEG (HI(31) | LO(104)) +#define NOP (HI(24)) +#define NOR (HI(31) | LO(124)) +#define OR (HI(31) | LO(444)) +#define ORI (HI(24)) +#define ORIS (HI(25)) +#define RLDICL (HI(30)) +#define RLWINM (HI(21)) +#define SLD (HI(31) | LO(27)) +#define SLW (HI(31) | LO(24)) +#define SRAD (HI(31) | LO(794)) +#define SRADI (HI(31) | LO(413 << 1)) +#define SRAW (HI(31) | LO(792)) +#define SRAWI (HI(31) | LO(824)) +#define SRD (HI(31) | LO(539)) +#define SRW (HI(31) | LO(536)) +#define STD (HI(62) | 0) +#define STDU (HI(62) | 1) +#define STDUX (HI(31) | LO(181)) +#define STFIWX (HI(31) | LO(983)) +#define STW (HI(36)) +#define STWU (HI(37)) +#define STWUX (HI(31) | LO(183)) +#define SUBF (HI(31) | LO(40)) +#define SUBFC (HI(31) | LO(8)) +#define SUBFE (HI(31) | LO(136)) +#define SUBFIC (HI(8)) +#define XOR (HI(31) | LO(316)) +#define XORI (HI(26)) +#define XORIS (HI(27)) + +#define SIMM_MAX (0x7fff) +#define SIMM_MIN (-0x8000) +#define UIMM_MAX (0xffff) + +#define RLDI(dst, src, sh, mb, type) \ + (HI(30) | S(src) | A(dst) | ((type) << 2) | (((sh) & 0x1f) << 11) | (((sh) & 0x20) >> 4) | (((mb) & 0x1f) << 6) | ((mb) & 0x20)) + +#if (defined SLJIT_INDIRECT_CALL && SLJIT_INDIRECT_CALL) +SLJIT_API_FUNC_ATTRIBUTE void sljit_set_function_context(void** func_ptr, struct sljit_function_context* context, sljit_sw addr, void* func) +{ + sljit_sw* ptrs; + if (func_ptr) + *func_ptr = (void*)context; + ptrs = (sljit_sw*)func; + context->addr = addr ? addr : ptrs[0]; + context->r2 = ptrs[1]; + context->r11 = ptrs[2]; +} +#endif + +static sljit_s32 push_inst(struct sljit_compiler *compiler, sljit_ins ins) +{ + sljit_ins *ptr = (sljit_ins*)ensure_buf(compiler, sizeof(sljit_ins)); + FAIL_IF(!ptr); + *ptr = ins; + compiler->size++; + return SLJIT_SUCCESS; +} + +static SLJIT_INLINE sljit_s32 detect_jump_type(struct sljit_jump *jump, sljit_ins *code_ptr, sljit_ins *code, sljit_sw executable_offset) +{ + sljit_sw diff; + sljit_uw target_addr; + sljit_sw extra_jump_flags; + +#if (defined SLJIT_PASS_ENTRY_ADDR_TO_CALL && SLJIT_PASS_ENTRY_ADDR_TO_CALL) && (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) + if (jump->flags & (SLJIT_REWRITABLE_JUMP | IS_CALL)) + return 0; +#else + if (jump->flags & SLJIT_REWRITABLE_JUMP) + return 0; +#endif + + if (jump->flags & JUMP_ADDR) + target_addr = jump->u.target; + else { + SLJIT_ASSERT(jump->flags & JUMP_LABEL); + target_addr = (sljit_uw)(code + jump->u.label->size) + (sljit_uw)executable_offset; + } + +#if (defined SLJIT_PASS_ENTRY_ADDR_TO_CALL && SLJIT_PASS_ENTRY_ADDR_TO_CALL) && (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) + if (jump->flags & IS_CALL) + goto keep_address; +#endif + + diff = ((sljit_sw)target_addr - (sljit_sw)(code_ptr) - executable_offset) & ~0x3l; + + extra_jump_flags = 0; + if (jump->flags & IS_COND) { + if (diff <= 0x7fff && diff >= -0x8000) { + jump->flags |= PATCH_B; + return 1; + } + if (target_addr <= 0xffff) { + jump->flags |= PATCH_B | PATCH_ABS_B; + return 1; + } + extra_jump_flags = REMOVE_COND; + + diff -= sizeof(sljit_ins); + } + + if (diff <= 0x01ffffff && diff >= -0x02000000) { + jump->flags |= PATCH_B | extra_jump_flags; + return 1; + } + + if (target_addr <= 0x03ffffff) { + jump->flags |= PATCH_B | PATCH_ABS_B | extra_jump_flags; + return 1; + } + +#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) +#if (defined SLJIT_PASS_ENTRY_ADDR_TO_CALL && SLJIT_PASS_ENTRY_ADDR_TO_CALL) +keep_address: +#endif + if (target_addr <= 0x7fffffff) { + jump->flags |= PATCH_ABS32; + return 1; + } + + if (target_addr <= 0x7fffffffffffl) { + jump->flags |= PATCH_ABS48; + return 1; + } +#endif + + return 0; +} + +#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) + +static SLJIT_INLINE sljit_sw put_label_get_length(struct sljit_put_label *put_label, sljit_uw max_label) +{ + if (max_label < 0x100000000l) { + put_label->flags = 0; + return 1; + } + + if (max_label < 0x1000000000000l) { + put_label->flags = 1; + return 3; + } + + put_label->flags = 2; + return 4; +} + +static SLJIT_INLINE void put_label_set(struct sljit_put_label *put_label) +{ + sljit_uw addr = put_label->label->addr; + sljit_ins *inst = (sljit_ins *)put_label->addr; + sljit_s32 reg = *inst; + + if (put_label->flags == 0) { + SLJIT_ASSERT(addr < 0x100000000l); + inst[0] = ORIS | S(TMP_ZERO) | A(reg) | IMM(addr >> 16); + } + else { + if (put_label->flags == 1) { + SLJIT_ASSERT(addr < 0x1000000000000l); + inst[0] = ORI | S(TMP_ZERO) | A(reg) | IMM(addr >> 32); + } + else { + inst[0] = ORIS | S(TMP_ZERO) | A(reg) | IMM(addr >> 48); + inst[1] = ORI | S(reg) | A(reg) | IMM((addr >> 32) & 0xffff); + inst ++; + } + + inst[1] = RLDI(reg, reg, 32, 31, 1); + inst[2] = ORIS | S(reg) | A(reg) | IMM((addr >> 16) & 0xffff); + inst += 2; + } + + inst[1] = ORI | S(reg) | A(reg) | IMM(addr & 0xffff); +} + +#endif + +SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler) +{ + struct sljit_memory_fragment *buf; + sljit_ins *code; + sljit_ins *code_ptr; + sljit_ins *buf_ptr; + sljit_ins *buf_end; + sljit_uw word_count; + sljit_uw next_addr; + sljit_sw executable_offset; + sljit_uw addr; + + struct sljit_label *label; + struct sljit_jump *jump; + struct sljit_const *const_; + struct sljit_put_label *put_label; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_generate_code(compiler)); + reverse_buf(compiler); + +#if (defined SLJIT_INDIRECT_CALL && SLJIT_INDIRECT_CALL) +#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) + compiler->size += (compiler->size & 0x1) + (sizeof(struct sljit_function_context) / sizeof(sljit_ins)); +#else + compiler->size += (sizeof(struct sljit_function_context) / sizeof(sljit_ins)); +#endif +#endif + code = (sljit_ins*)SLJIT_MALLOC_EXEC(compiler->size * sizeof(sljit_ins)); + PTR_FAIL_WITH_EXEC_IF(code); + buf = compiler->buf; + + code_ptr = code; + word_count = 0; + next_addr = 0; + executable_offset = SLJIT_EXEC_OFFSET(code); + + label = compiler->labels; + jump = compiler->jumps; + const_ = compiler->consts; + put_label = compiler->put_labels; + + do { + buf_ptr = (sljit_ins*)buf->memory; + buf_end = buf_ptr + (buf->used_size >> 2); + do { + *code_ptr = *buf_ptr++; + if (next_addr == word_count) { + SLJIT_ASSERT(!label || label->size >= word_count); + SLJIT_ASSERT(!jump || jump->addr >= word_count); + SLJIT_ASSERT(!const_ || const_->addr >= word_count); + SLJIT_ASSERT(!put_label || put_label->addr >= word_count); + + /* These structures are ordered by their address. */ + if (label && label->size == word_count) { + /* Just recording the address. */ + label->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); + label->size = code_ptr - code; + label = label->next; + } + if (jump && jump->addr == word_count) { +#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) + jump->addr = (sljit_uw)(code_ptr - 3); +#else + jump->addr = (sljit_uw)(code_ptr - 6); +#endif + if (detect_jump_type(jump, code_ptr, code, executable_offset)) { +#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) + code_ptr[-3] = code_ptr[0]; + code_ptr -= 3; +#else + if (jump->flags & PATCH_ABS32) { + code_ptr -= 3; + code_ptr[-1] = code_ptr[2]; + code_ptr[0] = code_ptr[3]; + } + else if (jump->flags & PATCH_ABS48) { + code_ptr--; + code_ptr[-1] = code_ptr[0]; + code_ptr[0] = code_ptr[1]; + /* rldicr rX,rX,32,31 -> rX,rX,16,47 */ + SLJIT_ASSERT((code_ptr[-3] & 0xfc00ffff) == 0x780007c6); + code_ptr[-3] ^= 0x8422; + /* oris -> ori */ + code_ptr[-2] ^= 0x4000000; + } + else { + code_ptr[-6] = code_ptr[0]; + code_ptr -= 6; + } +#endif + if (jump->flags & REMOVE_COND) { + code_ptr[0] = BCx | (2 << 2) | ((code_ptr[0] ^ (8 << 21)) & 0x03ff0001); + code_ptr++; + jump->addr += sizeof(sljit_ins); + code_ptr[0] = Bx; + jump->flags -= IS_COND; + } + } + jump = jump->next; + } + if (const_ && const_->addr == word_count) { + const_->addr = (sljit_uw)code_ptr; + const_ = const_->next; + } + if (put_label && put_label->addr == word_count) { + SLJIT_ASSERT(put_label->label); + put_label->addr = (sljit_uw)code_ptr; +#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) + code_ptr += put_label_get_length(put_label, (sljit_uw)(SLJIT_ADD_EXEC_OFFSET(code, executable_offset) + put_label->label->size)); + word_count += 4; +#endif + put_label = put_label->next; + } + next_addr = compute_next_addr(label, jump, const_, put_label); + } + code_ptr ++; + word_count ++; + } while (buf_ptr < buf_end); + + buf = buf->next; + } while (buf); + + if (label && label->size == word_count) { + label->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); + label->size = code_ptr - code; + label = label->next; + } + + SLJIT_ASSERT(!label); + SLJIT_ASSERT(!jump); + SLJIT_ASSERT(!const_); + SLJIT_ASSERT(!put_label); + +#if (defined SLJIT_INDIRECT_CALL && SLJIT_INDIRECT_CALL) + SLJIT_ASSERT(code_ptr - code <= (sljit_sw)compiler->size - (sizeof(struct sljit_function_context) / sizeof(sljit_ins))); +#else + SLJIT_ASSERT(code_ptr - code <= (sljit_sw)compiler->size); +#endif + + jump = compiler->jumps; + while (jump) { + do { + addr = (jump->flags & JUMP_LABEL) ? jump->u.label->addr : jump->u.target; + buf_ptr = (sljit_ins *)jump->addr; + + if (jump->flags & PATCH_B) { + if (jump->flags & IS_COND) { + if (!(jump->flags & PATCH_ABS_B)) { + addr -= (sljit_uw)SLJIT_ADD_EXEC_OFFSET(buf_ptr, executable_offset); + SLJIT_ASSERT((sljit_sw)addr <= 0x7fff && (sljit_sw)addr >= -0x8000); + *buf_ptr = BCx | (addr & 0xfffc) | ((*buf_ptr) & 0x03ff0001); + } + else { + SLJIT_ASSERT(addr <= 0xffff); + *buf_ptr = BCx | (addr & 0xfffc) | 0x2 | ((*buf_ptr) & 0x03ff0001); + } + } + else { + if (!(jump->flags & PATCH_ABS_B)) { + addr -= (sljit_uw)SLJIT_ADD_EXEC_OFFSET(buf_ptr, executable_offset); + SLJIT_ASSERT((sljit_sw)addr <= 0x01ffffff && (sljit_sw)addr >= -0x02000000); + *buf_ptr = Bx | (addr & 0x03fffffc) | ((*buf_ptr) & 0x1); + } + else { + SLJIT_ASSERT(addr <= 0x03ffffff); + *buf_ptr = Bx | (addr & 0x03fffffc) | 0x2 | ((*buf_ptr) & 0x1); + } + } + break; + } + + /* Set the fields of immediate loads. */ +#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) + buf_ptr[0] = (buf_ptr[0] & 0xffff0000) | ((addr >> 16) & 0xffff); + buf_ptr[1] = (buf_ptr[1] & 0xffff0000) | (addr & 0xffff); +#else + if (jump->flags & PATCH_ABS32) { + SLJIT_ASSERT(addr <= 0x7fffffff); + buf_ptr[0] = (buf_ptr[0] & 0xffff0000) | ((addr >> 16) & 0xffff); + buf_ptr[1] = (buf_ptr[1] & 0xffff0000) | (addr & 0xffff); + break; + } + if (jump->flags & PATCH_ABS48) { + SLJIT_ASSERT(addr <= 0x7fffffffffff); + buf_ptr[0] = (buf_ptr[0] & 0xffff0000) | ((addr >> 32) & 0xffff); + buf_ptr[1] = (buf_ptr[1] & 0xffff0000) | ((addr >> 16) & 0xffff); + buf_ptr[3] = (buf_ptr[3] & 0xffff0000) | (addr & 0xffff); + break; + } + buf_ptr[0] = (buf_ptr[0] & 0xffff0000) | ((addr >> 48) & 0xffff); + buf_ptr[1] = (buf_ptr[1] & 0xffff0000) | ((addr >> 32) & 0xffff); + buf_ptr[3] = (buf_ptr[3] & 0xffff0000) | ((addr >> 16) & 0xffff); + buf_ptr[4] = (buf_ptr[4] & 0xffff0000) | (addr & 0xffff); +#endif + } while (0); + jump = jump->next; + } + + put_label = compiler->put_labels; + while (put_label) { +#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) + addr = put_label->label->addr; + buf_ptr = (sljit_ins *)put_label->addr; + + SLJIT_ASSERT((buf_ptr[0] & 0xfc1f0000) == ADDIS && (buf_ptr[1] & 0xfc000000) == ORI); + buf_ptr[0] |= (addr >> 16) & 0xffff; + buf_ptr[1] |= addr & 0xffff; +#else + put_label_set(put_label); +#endif + put_label = put_label->next; + } + + compiler->error = SLJIT_ERR_COMPILED; + compiler->executable_offset = executable_offset; + compiler->executable_size = (code_ptr - code) * sizeof(sljit_ins); + + code = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(code, executable_offset); + +#if (defined SLJIT_INDIRECT_CALL && SLJIT_INDIRECT_CALL) +#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) + if (((sljit_sw)code_ptr) & 0x4) + code_ptr++; +#endif + sljit_set_function_context(NULL, (struct sljit_function_context*)code_ptr, (sljit_sw)code, (void*)sljit_generate_code); +#endif + + code_ptr = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); + + SLJIT_CACHE_FLUSH(code, code_ptr); + +#if (defined SLJIT_INDIRECT_CALL && SLJIT_INDIRECT_CALL) + return code_ptr; +#else + return code; +#endif +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type) +{ + switch (feature_type) { + case SLJIT_HAS_FPU: +#ifdef SLJIT_IS_FPU_AVAILABLE + return SLJIT_IS_FPU_AVAILABLE; +#else + /* Available by default. */ + return 1; +#endif + + case SLJIT_HAS_CLZ: + return 1; + + default: + return 0; + } +} + +/* --------------------------------------------------------------------- */ +/* Entry, exit */ +/* --------------------------------------------------------------------- */ + +/* inp_flags: */ + +/* Creates an index in data_transfer_insts array. */ +#define LOAD_DATA 0x01 +#define INDEXED 0x02 +#define SIGNED_DATA 0x04 + +#define WORD_DATA 0x00 +#define BYTE_DATA 0x08 +#define HALF_DATA 0x10 +#define INT_DATA 0x18 +/* Separates integer and floating point registers */ +#define GPR_REG 0x1f +#define DOUBLE_DATA 0x20 + +#define MEM_MASK 0x7f + +/* Other inp_flags. */ + +/* Integer opertion and set flags -> requires exts on 64 bit systems. */ +#define ALT_SIGN_EXT 0x000100 +/* This flag affects the RC() and OERC() macros. */ +#define ALT_SET_FLAGS 0x000400 +#define ALT_FORM1 0x001000 +#define ALT_FORM2 0x002000 +#define ALT_FORM3 0x004000 +#define ALT_FORM4 0x008000 +#define ALT_FORM5 0x010000 + +/* Source and destination is register. */ +#define REG_DEST 0x000001 +#define REG1_SOURCE 0x000002 +#define REG2_SOURCE 0x000004 +/* +ALT_SIGN_EXT 0x000100 +ALT_SET_FLAGS 0x000200 +ALT_FORM1 0x001000 +... +ALT_FORM5 0x010000 */ + +#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) +#include "sljitNativePPC_32.c" +#else +#include "sljitNativePPC_64.c" +#endif + +#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) +#define STACK_STORE STW +#define STACK_LOAD LWZ +#else +#define STACK_STORE STD +#define STACK_LOAD LD +#endif + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compiler, + sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds, + sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size) +{ + sljit_s32 args, i, tmp, offs; + + CHECK_ERROR(); + CHECK(check_sljit_emit_enter(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size)); + set_emit_enter(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size); + + FAIL_IF(push_inst(compiler, MFLR | D(0))); + offs = -(sljit_s32)(sizeof(sljit_sw)); + FAIL_IF(push_inst(compiler, STACK_STORE | S(TMP_ZERO) | A(SLJIT_SP) | IMM(offs))); + + tmp = saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? (SLJIT_S0 + 1 - saveds) : SLJIT_FIRST_SAVED_REG; + for (i = SLJIT_S0; i >= tmp; i--) { + offs -= (sljit_s32)(sizeof(sljit_sw)); + FAIL_IF(push_inst(compiler, STACK_STORE | S(i) | A(SLJIT_SP) | IMM(offs))); + } + + for (i = scratches; i >= SLJIT_FIRST_SAVED_REG; i--) { + offs -= (sljit_s32)(sizeof(sljit_sw)); + FAIL_IF(push_inst(compiler, STACK_STORE | S(i) | A(SLJIT_SP) | IMM(offs))); + } + + SLJIT_ASSERT(offs == -(sljit_s32)GET_SAVED_REGISTERS_SIZE(compiler->scratches, compiler->saveds, 1)); + +#if (defined SLJIT_PPC_STACK_FRAME_V2 && SLJIT_PPC_STACK_FRAME_V2) + FAIL_IF(push_inst(compiler, STACK_STORE | S(0) | A(SLJIT_SP) | IMM(2 * sizeof(sljit_sw)))); +#else + FAIL_IF(push_inst(compiler, STACK_STORE | S(0) | A(SLJIT_SP) | IMM(sizeof(sljit_sw)))); +#endif + + FAIL_IF(push_inst(compiler, ADDI | D(TMP_ZERO) | A(0) | 0)); + + args = get_arg_count(arg_types); + + if (args >= 1) + FAIL_IF(push_inst(compiler, OR | S(SLJIT_R0) | A(SLJIT_S0) | B(SLJIT_R0))); + if (args >= 2) + FAIL_IF(push_inst(compiler, OR | S(SLJIT_R1) | A(SLJIT_S1) | B(SLJIT_R1))); + if (args >= 3) + FAIL_IF(push_inst(compiler, OR | S(SLJIT_R2) | A(SLJIT_S2) | B(SLJIT_R2))); + + local_size += GET_SAVED_REGISTERS_SIZE(scratches, saveds, 1) + SLJIT_LOCALS_OFFSET; + local_size = (local_size + 15) & ~0xf; + compiler->local_size = local_size; + +#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) + if (local_size <= SIMM_MAX) + FAIL_IF(push_inst(compiler, STWU | S(SLJIT_SP) | A(SLJIT_SP) | IMM(-local_size))); + else { + FAIL_IF(load_immediate(compiler, 0, -local_size)); + FAIL_IF(push_inst(compiler, STWUX | S(SLJIT_SP) | A(SLJIT_SP) | B(0))); + } +#else + if (local_size <= SIMM_MAX) + FAIL_IF(push_inst(compiler, STDU | S(SLJIT_SP) | A(SLJIT_SP) | IMM(-local_size))); + else { + FAIL_IF(load_immediate(compiler, 0, -local_size)); + FAIL_IF(push_inst(compiler, STDUX | S(SLJIT_SP) | A(SLJIT_SP) | B(0))); + } +#endif + + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_set_context(struct sljit_compiler *compiler, + sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds, + sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size) +{ + CHECK_ERROR(); + CHECK(check_sljit_set_context(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size)); + set_set_context(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size); + + local_size += GET_SAVED_REGISTERS_SIZE(scratches, saveds, 1) + SLJIT_LOCALS_OFFSET; + compiler->local_size = (local_size + 15) & ~0xf; + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw) +{ + sljit_s32 i, tmp, offs; + + CHECK_ERROR(); + CHECK(check_sljit_emit_return(compiler, op, src, srcw)); + + FAIL_IF(emit_mov_before_return(compiler, op, src, srcw)); + + if (compiler->local_size <= SIMM_MAX) + FAIL_IF(push_inst(compiler, ADDI | D(SLJIT_SP) | A(SLJIT_SP) | IMM(compiler->local_size))); + else { + FAIL_IF(load_immediate(compiler, 0, compiler->local_size)); + FAIL_IF(push_inst(compiler, ADD | D(SLJIT_SP) | A(SLJIT_SP) | B(0))); + } + +#if (defined SLJIT_PPC_STACK_FRAME_V2 && SLJIT_PPC_STACK_FRAME_V2) + FAIL_IF(push_inst(compiler, STACK_LOAD | D(0) | A(SLJIT_SP) | IMM(2 * sizeof(sljit_sw)))); +#else + FAIL_IF(push_inst(compiler, STACK_LOAD | D(0) | A(SLJIT_SP) | IMM(sizeof(sljit_sw)))); +#endif + + offs = -(sljit_s32)GET_SAVED_REGISTERS_SIZE(compiler->scratches, compiler->saveds, 1); + + tmp = compiler->scratches; + for (i = SLJIT_FIRST_SAVED_REG; i <= tmp; i++) { + FAIL_IF(push_inst(compiler, STACK_LOAD | D(i) | A(SLJIT_SP) | IMM(offs))); + offs += (sljit_s32)(sizeof(sljit_sw)); + } + + tmp = compiler->saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? (SLJIT_S0 + 1 - compiler->saveds) : SLJIT_FIRST_SAVED_REG; + for (i = tmp; i <= SLJIT_S0; i++) { + FAIL_IF(push_inst(compiler, STACK_LOAD | D(i) | A(SLJIT_SP) | IMM(offs))); + offs += (sljit_s32)(sizeof(sljit_sw)); + } + + FAIL_IF(push_inst(compiler, STACK_LOAD | D(TMP_ZERO) | A(SLJIT_SP) | IMM(offs))); + SLJIT_ASSERT(offs == -(sljit_sw)(sizeof(sljit_sw))); + + FAIL_IF(push_inst(compiler, MTLR | S(0))); + FAIL_IF(push_inst(compiler, BLR)); + + return SLJIT_SUCCESS; +} + +#undef STACK_STORE +#undef STACK_LOAD + +/* --------------------------------------------------------------------- */ +/* Operators */ +/* --------------------------------------------------------------------- */ + +/* s/l - store/load (1 bit) + i/x - immediate/indexed form + u/s - signed/unsigned (1 bit) + w/b/h/i - word/byte/half/int allowed (2 bit) + + Some opcodes are repeated (e.g. store signed / unsigned byte is the same instruction). */ + +/* 64 bit only: [reg+imm] must be aligned to 4 bytes. */ +#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) +#define INT_ALIGNED 0x10000 +#endif + +#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) +#define ARCH_32_64(a, b) a +#define INST_CODE_AND_DST(inst, flags, reg) \ + ((inst) | (((flags) & MEM_MASK) <= GPR_REG ? D(reg) : FD(reg))) +#else +#define ARCH_32_64(a, b) b +#define INST_CODE_AND_DST(inst, flags, reg) \ + (((inst) & ~INT_ALIGNED) | (((flags) & MEM_MASK) <= GPR_REG ? D(reg) : FD(reg))) +#endif + +static const sljit_ins data_transfer_insts[64 + 16] = { + +/* -------- Integer -------- */ + +/* Word. */ + +/* w u i s */ ARCH_32_64(HI(36) /* stw */, HI(62) | INT_ALIGNED | 0x0 /* std */), +/* w u i l */ ARCH_32_64(HI(32) /* lwz */, HI(58) | INT_ALIGNED | 0x0 /* ld */), +/* w u x s */ ARCH_32_64(HI(31) | LO(151) /* stwx */, HI(31) | LO(149) /* stdx */), +/* w u x l */ ARCH_32_64(HI(31) | LO(23) /* lwzx */, HI(31) | LO(21) /* ldx */), + +/* w s i s */ ARCH_32_64(HI(36) /* stw */, HI(62) | INT_ALIGNED | 0x0 /* std */), +/* w s i l */ ARCH_32_64(HI(32) /* lwz */, HI(58) | INT_ALIGNED | 0x0 /* ld */), +/* w s x s */ ARCH_32_64(HI(31) | LO(151) /* stwx */, HI(31) | LO(149) /* stdx */), +/* w s x l */ ARCH_32_64(HI(31) | LO(23) /* lwzx */, HI(31) | LO(21) /* ldx */), + +/* Byte. */ + +/* b u i s */ HI(38) /* stb */, +/* b u i l */ HI(34) /* lbz */, +/* b u x s */ HI(31) | LO(215) /* stbx */, +/* b u x l */ HI(31) | LO(87) /* lbzx */, + +/* b s i s */ HI(38) /* stb */, +/* b s i l */ HI(34) /* lbz */ /* EXTS_REQ */, +/* b s x s */ HI(31) | LO(215) /* stbx */, +/* b s x l */ HI(31) | LO(87) /* lbzx */ /* EXTS_REQ */, + +/* Half. */ + +/* h u i s */ HI(44) /* sth */, +/* h u i l */ HI(40) /* lhz */, +/* h u x s */ HI(31) | LO(407) /* sthx */, +/* h u x l */ HI(31) | LO(279) /* lhzx */, + +/* h s i s */ HI(44) /* sth */, +/* h s i l */ HI(42) /* lha */, +/* h s x s */ HI(31) | LO(407) /* sthx */, +/* h s x l */ HI(31) | LO(343) /* lhax */, + +/* Int. */ + +/* i u i s */ HI(36) /* stw */, +/* i u i l */ HI(32) /* lwz */, +/* i u x s */ HI(31) | LO(151) /* stwx */, +/* i u x l */ HI(31) | LO(23) /* lwzx */, + +/* i s i s */ HI(36) /* stw */, +/* i s i l */ ARCH_32_64(HI(32) /* lwz */, HI(58) | INT_ALIGNED | 0x2 /* lwa */), +/* i s x s */ HI(31) | LO(151) /* stwx */, +/* i s x l */ ARCH_32_64(HI(31) | LO(23) /* lwzx */, HI(31) | LO(341) /* lwax */), + +/* -------- Floating point -------- */ + +/* d i s */ HI(54) /* stfd */, +/* d i l */ HI(50) /* lfd */, +/* d x s */ HI(31) | LO(727) /* stfdx */, +/* d x l */ HI(31) | LO(599) /* lfdx */, + +/* s i s */ HI(52) /* stfs */, +/* s i l */ HI(48) /* lfs */, +/* s x s */ HI(31) | LO(663) /* stfsx */, +/* s x l */ HI(31) | LO(535) /* lfsx */, +}; + +static const sljit_ins updated_data_transfer_insts[64] = { + +/* -------- Integer -------- */ + +/* Word. */ + +/* w u i s */ ARCH_32_64(HI(37) /* stwu */, HI(62) | INT_ALIGNED | 0x1 /* stdu */), +/* w u i l */ ARCH_32_64(HI(33) /* lwzu */, HI(58) | INT_ALIGNED | 0x1 /* ldu */), +/* w u x s */ ARCH_32_64(HI(31) | LO(183) /* stwux */, HI(31) | LO(181) /* stdux */), +/* w u x l */ ARCH_32_64(HI(31) | LO(55) /* lwzux */, HI(31) | LO(53) /* ldux */), + +/* w s i s */ ARCH_32_64(HI(37) /* stwu */, HI(62) | INT_ALIGNED | 0x1 /* stdu */), +/* w s i l */ ARCH_32_64(HI(33) /* lwzu */, HI(58) | INT_ALIGNED | 0x1 /* ldu */), +/* w s x s */ ARCH_32_64(HI(31) | LO(183) /* stwux */, HI(31) | LO(181) /* stdux */), +/* w s x l */ ARCH_32_64(HI(31) | LO(55) /* lwzux */, HI(31) | LO(53) /* ldux */), + +/* Byte. */ + +/* b u i s */ HI(39) /* stbu */, +/* b u i l */ HI(35) /* lbzu */, +/* b u x s */ HI(31) | LO(247) /* stbux */, +/* b u x l */ HI(31) | LO(119) /* lbzux */, + +/* b s i s */ HI(39) /* stbu */, +/* b s i l */ 0 /* no such instruction */, +/* b s x s */ HI(31) | LO(247) /* stbux */, +/* b s x l */ 0 /* no such instruction */, + +/* Half. */ + +/* h u i s */ HI(45) /* sthu */, +/* h u i l */ HI(41) /* lhzu */, +/* h u x s */ HI(31) | LO(439) /* sthux */, +/* h u x l */ HI(31) | LO(311) /* lhzux */, + +/* h s i s */ HI(45) /* sthu */, +/* h s i l */ HI(43) /* lhau */, +/* h s x s */ HI(31) | LO(439) /* sthux */, +/* h s x l */ HI(31) | LO(375) /* lhaux */, + +/* Int. */ + +/* i u i s */ HI(37) /* stwu */, +/* i u i l */ HI(33) /* lwzu */, +/* i u x s */ HI(31) | LO(183) /* stwux */, +/* i u x l */ HI(31) | LO(55) /* lwzux */, + +/* i s i s */ HI(37) /* stwu */, +/* i s i l */ ARCH_32_64(HI(33) /* lwzu */, 0 /* no such instruction */), +/* i s x s */ HI(31) | LO(183) /* stwux */, +/* i s x l */ ARCH_32_64(HI(31) | LO(55) /* lwzux */, HI(31) | LO(373) /* lwaux */), + +/* -------- Floating point -------- */ + +/* d i s */ HI(55) /* stfdu */, +/* d i l */ HI(51) /* lfdu */, +/* d x s */ HI(31) | LO(759) /* stfdux */, +/* d x l */ HI(31) | LO(631) /* lfdux */, + +/* s i s */ HI(53) /* stfsu */, +/* s i l */ HI(49) /* lfsu */, +/* s x s */ HI(31) | LO(695) /* stfsux */, +/* s x l */ HI(31) | LO(567) /* lfsux */, +}; + +#undef ARCH_32_64 + +/* Simple cases, (no caching is required). */ +static sljit_s32 emit_op_mem(struct sljit_compiler *compiler, sljit_s32 inp_flags, sljit_s32 reg, + sljit_s32 arg, sljit_sw argw, sljit_s32 tmp_reg) +{ + sljit_ins inst; + sljit_s32 offs_reg; + sljit_sw high_short; + + /* Should work when (arg & REG_MASK) == 0. */ + SLJIT_ASSERT(A(0) == 0); + SLJIT_ASSERT(arg & SLJIT_MEM); + + if (SLJIT_UNLIKELY(arg & OFFS_REG_MASK)) { + argw &= 0x3; + offs_reg = OFFS_REG(arg); + + if (argw != 0) { +#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) + FAIL_IF(push_inst(compiler, RLWINM | S(OFFS_REG(arg)) | A(tmp_reg) | (argw << 11) | ((31 - argw) << 1))); +#else + FAIL_IF(push_inst(compiler, RLDI(tmp_reg, OFFS_REG(arg), argw, 63 - argw, 1))); +#endif + offs_reg = tmp_reg; + } + + inst = data_transfer_insts[(inp_flags | INDEXED) & MEM_MASK]; + +#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) + SLJIT_ASSERT(!(inst & INT_ALIGNED)); +#endif + + return push_inst(compiler, INST_CODE_AND_DST(inst, inp_flags, reg) | A(arg & REG_MASK) | B(offs_reg)); + } + + inst = data_transfer_insts[inp_flags & MEM_MASK]; + arg &= REG_MASK; + +#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) + if ((inst & INT_ALIGNED) && (argw & 0x3) != 0) { + FAIL_IF(load_immediate(compiler, tmp_reg, argw)); + + inst = data_transfer_insts[(inp_flags | INDEXED) & MEM_MASK]; + return push_inst(compiler, INST_CODE_AND_DST(inst, inp_flags, reg) | A(arg) | B(tmp_reg)); + } +#endif + + if (argw <= SIMM_MAX && argw >= SIMM_MIN) + return push_inst(compiler, INST_CODE_AND_DST(inst, inp_flags, reg) | A(arg) | IMM(argw)); + +#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) + if (argw <= 0x7fff7fffl && argw >= -0x80000000l) { +#endif + + high_short = (sljit_s32)(argw + ((argw & 0x8000) << 1)) & ~0xffff; + +#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) + SLJIT_ASSERT(high_short && high_short <= 0x7fffffffl && high_short >= -0x80000000l); +#else + SLJIT_ASSERT(high_short); +#endif + + FAIL_IF(push_inst(compiler, ADDIS | D(tmp_reg) | A(arg) | IMM(high_short >> 16))); + return push_inst(compiler, INST_CODE_AND_DST(inst, inp_flags, reg) | A(tmp_reg) | IMM(argw)); + +#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) + } + + /* The rest is PPC-64 only. */ + + FAIL_IF(load_immediate(compiler, tmp_reg, argw)); + + inst = data_transfer_insts[(inp_flags | INDEXED) & MEM_MASK]; + return push_inst(compiler, INST_CODE_AND_DST(inst, inp_flags, reg) | A(arg) | B(tmp_reg)); +#endif +} + +static sljit_s32 emit_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 input_flags, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + /* arg1 goes to TMP_REG1 or src reg + arg2 goes to TMP_REG2, imm or src reg + result goes to TMP_REG2, so put result can use TMP_REG1. */ + sljit_s32 dst_r = TMP_REG2; + sljit_s32 src1_r; + sljit_s32 src2_r; + sljit_s32 sugg_src2_r = TMP_REG2; + sljit_s32 flags = input_flags & (ALT_FORM1 | ALT_FORM2 | ALT_FORM3 | ALT_FORM4 | ALT_FORM5 | ALT_SIGN_EXT | ALT_SET_FLAGS); + + /* Destination check. */ + if (SLOW_IS_REG(dst)) { + dst_r = dst; + flags |= REG_DEST; + + if (op >= SLJIT_MOV && op <= SLJIT_MOV_P) + sugg_src2_r = dst_r; + } + + /* Source 1. */ + if (FAST_IS_REG(src1)) { + src1_r = src1; + flags |= REG1_SOURCE; + } + else if (src1 & SLJIT_IMM) { + FAIL_IF(load_immediate(compiler, TMP_REG1, src1w)); + src1_r = TMP_REG1; + } + else { + FAIL_IF(emit_op_mem(compiler, input_flags | LOAD_DATA, TMP_REG1, src1, src1w, TMP_REG1)); + src1_r = TMP_REG1; + } + + /* Source 2. */ + if (FAST_IS_REG(src2)) { + src2_r = src2; + flags |= REG2_SOURCE; + + if (!(flags & REG_DEST) && op >= SLJIT_MOV && op <= SLJIT_MOV_P) + dst_r = src2_r; + } + else if (src2 & SLJIT_IMM) { + FAIL_IF(load_immediate(compiler, sugg_src2_r, src2w)); + src2_r = sugg_src2_r; + } + else { + FAIL_IF(emit_op_mem(compiler, input_flags | LOAD_DATA, sugg_src2_r, src2, src2w, TMP_REG2)); + src2_r = sugg_src2_r; + } + + FAIL_IF(emit_single_op(compiler, op, flags, dst_r, src1_r, src2_r)); + + if (!(dst & SLJIT_MEM)) + return SLJIT_SUCCESS; + + return emit_op_mem(compiler, input_flags, dst_r, dst, dstw, TMP_REG1); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compiler, sljit_s32 op) +{ +#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) + sljit_s32 int_op = op & SLJIT_I32_OP; +#endif + + CHECK_ERROR(); + CHECK(check_sljit_emit_op0(compiler, op)); + + op = GET_OPCODE(op); + switch (op) { + case SLJIT_BREAKPOINT: + case SLJIT_NOP: + return push_inst(compiler, NOP); + case SLJIT_LMUL_UW: + case SLJIT_LMUL_SW: + FAIL_IF(push_inst(compiler, OR | S(SLJIT_R0) | A(TMP_REG1) | B(SLJIT_R0))); +#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) + FAIL_IF(push_inst(compiler, MULLD | D(SLJIT_R0) | A(TMP_REG1) | B(SLJIT_R1))); + return push_inst(compiler, (op == SLJIT_LMUL_UW ? MULHDU : MULHD) | D(SLJIT_R1) | A(TMP_REG1) | B(SLJIT_R1)); +#else + FAIL_IF(push_inst(compiler, MULLW | D(SLJIT_R0) | A(TMP_REG1) | B(SLJIT_R1))); + return push_inst(compiler, (op == SLJIT_LMUL_UW ? MULHWU : MULHW) | D(SLJIT_R1) | A(TMP_REG1) | B(SLJIT_R1)); +#endif + case SLJIT_DIVMOD_UW: + case SLJIT_DIVMOD_SW: + FAIL_IF(push_inst(compiler, OR | S(SLJIT_R0) | A(TMP_REG1) | B(SLJIT_R0))); +#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) + FAIL_IF(push_inst(compiler, (int_op ? (op == SLJIT_DIVMOD_UW ? DIVWU : DIVW) : (op == SLJIT_DIVMOD_UW ? DIVDU : DIVD)) | D(SLJIT_R0) | A(SLJIT_R0) | B(SLJIT_R1))); + FAIL_IF(push_inst(compiler, (int_op ? MULLW : MULLD) | D(SLJIT_R1) | A(SLJIT_R0) | B(SLJIT_R1))); +#else + FAIL_IF(push_inst(compiler, (op == SLJIT_DIVMOD_UW ? DIVWU : DIVW) | D(SLJIT_R0) | A(SLJIT_R0) | B(SLJIT_R1))); + FAIL_IF(push_inst(compiler, MULLW | D(SLJIT_R1) | A(SLJIT_R0) | B(SLJIT_R1))); +#endif + return push_inst(compiler, SUBF | D(SLJIT_R1) | A(SLJIT_R1) | B(TMP_REG1)); + case SLJIT_DIV_UW: + case SLJIT_DIV_SW: +#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) + return push_inst(compiler, (int_op ? (op == SLJIT_DIV_UW ? DIVWU : DIVW) : (op == SLJIT_DIV_UW ? DIVDU : DIVD)) | D(SLJIT_R0) | A(SLJIT_R0) | B(SLJIT_R1)); +#else + return push_inst(compiler, (op == SLJIT_DIV_UW ? DIVWU : DIVW) | D(SLJIT_R0) | A(SLJIT_R0) | B(SLJIT_R1)); +#endif + } + + return SLJIT_SUCCESS; +} + +static sljit_s32 emit_prefetch(struct sljit_compiler *compiler, + sljit_s32 src, sljit_sw srcw) +{ + if (!(src & OFFS_REG_MASK)) { + if (srcw == 0 && (src & REG_MASK) != SLJIT_UNUSED) + return push_inst(compiler, DCBT | A(0) | B(src & REG_MASK)); + + FAIL_IF(load_immediate(compiler, TMP_REG1, srcw)); + /* Works with SLJIT_MEM0() case as well. */ + return push_inst(compiler, DCBT | A(src & REG_MASK) | B(TMP_REG1)); + } + + srcw &= 0x3; + + if (srcw == 0) + return push_inst(compiler, DCBT | A(src & REG_MASK) | B(OFFS_REG(src))); + +#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) + FAIL_IF(push_inst(compiler, RLWINM | S(OFFS_REG(src)) | A(TMP_REG1) | (srcw << 11) | ((31 - srcw) << 1))); +#else + FAIL_IF(push_inst(compiler, RLDI(TMP_REG1, OFFS_REG(src), srcw, 63 - srcw, 1))); +#endif + return push_inst(compiler, DCBT | A(src & REG_MASK) | B(TMP_REG1)); +} + +#define EMIT_MOV(type, type_flags, type_cast) \ + emit_op(compiler, (src & SLJIT_IMM) ? SLJIT_MOV : type, flags | (type_flags), dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? type_cast srcw : srcw) + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + sljit_s32 flags = HAS_FLAGS(op) ? ALT_SET_FLAGS : 0; + sljit_s32 op_flags = GET_ALL_FLAGS(op); + + CHECK_ERROR(); + CHECK(check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw)); + ADJUST_LOCAL_OFFSET(dst, dstw); + ADJUST_LOCAL_OFFSET(src, srcw); + + if (dst == SLJIT_UNUSED && !HAS_FLAGS(op)) { + if (op <= SLJIT_MOV_P && (src & SLJIT_MEM)) + return emit_prefetch(compiler, src, srcw); + + return SLJIT_SUCCESS; + } + + op = GET_OPCODE(op); + if ((src & SLJIT_IMM) && srcw == 0) + src = TMP_ZERO; + + if (GET_FLAG_TYPE(op_flags) == SLJIT_OVERFLOW) + FAIL_IF(push_inst(compiler, MTXER | S(TMP_ZERO))); + + if (op < SLJIT_NOT && FAST_IS_REG(src) && src == dst) { + if (!TYPE_CAST_NEEDED(op)) + return SLJIT_SUCCESS; + } + +#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) + if (op_flags & SLJIT_I32_OP) { + if (op < SLJIT_NOT) { + if (src & SLJIT_MEM) { + if (op == SLJIT_MOV_S32) + op = SLJIT_MOV_U32; + } + else if (src & SLJIT_IMM) { + if (op == SLJIT_MOV_U32) + op = SLJIT_MOV_S32; + } + } + else { + /* Most operations expect sign extended arguments. */ + flags |= INT_DATA | SIGNED_DATA; + if (HAS_FLAGS(op_flags)) + flags |= ALT_SIGN_EXT; + } + } +#endif + + switch (op) { + case SLJIT_MOV: + case SLJIT_MOV_P: +#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) + case SLJIT_MOV_U32: + case SLJIT_MOV_S32: +#endif + return emit_op(compiler, SLJIT_MOV, flags | WORD_DATA, dst, dstw, TMP_REG1, 0, src, srcw); + +#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) + case SLJIT_MOV_U32: + return EMIT_MOV(SLJIT_MOV_U32, INT_DATA, (sljit_u32)); + + case SLJIT_MOV_S32: + return EMIT_MOV(SLJIT_MOV_S32, INT_DATA | SIGNED_DATA, (sljit_s32)); +#endif + + case SLJIT_MOV_U8: + return EMIT_MOV(SLJIT_MOV_U8, BYTE_DATA, (sljit_u8)); + + case SLJIT_MOV_S8: + return EMIT_MOV(SLJIT_MOV_S8, BYTE_DATA | SIGNED_DATA, (sljit_s8)); + + case SLJIT_MOV_U16: + return EMIT_MOV(SLJIT_MOV_U16, HALF_DATA, (sljit_u16)); + + case SLJIT_MOV_S16: + return EMIT_MOV(SLJIT_MOV_S16, HALF_DATA | SIGNED_DATA, (sljit_s16)); + + case SLJIT_NOT: + return emit_op(compiler, SLJIT_NOT, flags, dst, dstw, TMP_REG1, 0, src, srcw); + + case SLJIT_NEG: + return emit_op(compiler, SLJIT_NEG, flags | (GET_FLAG_TYPE(op_flags) ? ALT_FORM1 : 0), dst, dstw, TMP_REG1, 0, src, srcw); + + case SLJIT_CLZ: +#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) + return emit_op(compiler, SLJIT_CLZ, flags | (!(op_flags & SLJIT_I32_OP) ? 0 : ALT_FORM1), dst, dstw, TMP_REG1, 0, src, srcw); +#else + return emit_op(compiler, SLJIT_CLZ, flags, dst, dstw, TMP_REG1, 0, src, srcw); +#endif + } + + return SLJIT_SUCCESS; +} + +#undef EMIT_MOV + +#define TEST_SL_IMM(src, srcw) \ + (((src) & SLJIT_IMM) && (srcw) <= SIMM_MAX && (srcw) >= SIMM_MIN) + +#define TEST_UL_IMM(src, srcw) \ + (((src) & SLJIT_IMM) && !((srcw) & ~0xffff)) + +#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) +#define TEST_SH_IMM(src, srcw) \ + (((src) & SLJIT_IMM) && !((srcw) & 0xffff) && (srcw) <= 0x7fffffffl && (srcw) >= -0x80000000l) +#else +#define TEST_SH_IMM(src, srcw) \ + (((src) & SLJIT_IMM) && !((srcw) & 0xffff)) +#endif + +#define TEST_UH_IMM(src, srcw) \ + (((src) & SLJIT_IMM) && !((srcw) & ~0xffff0000)) + +#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) +#define TEST_ADD_IMM(src, srcw) \ + (((src) & SLJIT_IMM) && (srcw) <= 0x7fff7fffl && (srcw) >= -0x80000000l) +#else +#define TEST_ADD_IMM(src, srcw) \ + ((src) & SLJIT_IMM) +#endif + +#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) +#define TEST_UI_IMM(src, srcw) \ + (((src) & SLJIT_IMM) && !((srcw) & ~0xffffffff)) +#else +#define TEST_UI_IMM(src, srcw) \ + ((src) & SLJIT_IMM) +#endif + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + sljit_s32 flags = HAS_FLAGS(op) ? ALT_SET_FLAGS : 0; + + CHECK_ERROR(); + CHECK(check_sljit_emit_op2(compiler, op, dst, dstw, src1, src1w, src2, src2w)); + ADJUST_LOCAL_OFFSET(dst, dstw); + ADJUST_LOCAL_OFFSET(src1, src1w); + ADJUST_LOCAL_OFFSET(src2, src2w); + + if (dst == SLJIT_UNUSED && !HAS_FLAGS(op)) + return SLJIT_SUCCESS; + + if ((src1 & SLJIT_IMM) && src1w == 0) + src1 = TMP_ZERO; + if ((src2 & SLJIT_IMM) && src2w == 0) + src2 = TMP_ZERO; + +#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) + if (op & SLJIT_I32_OP) { + /* Most operations expect sign extended arguments. */ + flags |= INT_DATA | SIGNED_DATA; + if (src1 & SLJIT_IMM) + src1w = (sljit_s32)(src1w); + if (src2 & SLJIT_IMM) + src2w = (sljit_s32)(src2w); + if (HAS_FLAGS(op)) + flags |= ALT_SIGN_EXT; + } +#endif + if (GET_FLAG_TYPE(op) == SLJIT_OVERFLOW) + FAIL_IF(push_inst(compiler, MTXER | S(TMP_ZERO))); + + switch (GET_OPCODE(op)) { + case SLJIT_ADD: + if (GET_FLAG_TYPE(op) == SLJIT_OVERFLOW) + return emit_op(compiler, SLJIT_ADD, flags | ALT_FORM1, dst, dstw, src1, src1w, src2, src2w); + + if (!HAS_FLAGS(op) && ((src1 | src2) & SLJIT_IMM)) { + if (TEST_SL_IMM(src2, src2w)) { + compiler->imm = src2w & 0xffff; + return emit_op(compiler, SLJIT_ADD, flags | ALT_FORM2, dst, dstw, src1, src1w, TMP_REG2, 0); + } + if (TEST_SL_IMM(src1, src1w)) { + compiler->imm = src1w & 0xffff; + return emit_op(compiler, SLJIT_ADD, flags | ALT_FORM2, dst, dstw, src2, src2w, TMP_REG2, 0); + } + if (TEST_SH_IMM(src2, src2w)) { + compiler->imm = (src2w >> 16) & 0xffff; + return emit_op(compiler, SLJIT_ADD, flags | ALT_FORM2 | ALT_FORM3, dst, dstw, src1, src1w, TMP_REG2, 0); + } + if (TEST_SH_IMM(src1, src1w)) { + compiler->imm = (src1w >> 16) & 0xffff; + return emit_op(compiler, SLJIT_ADD, flags | ALT_FORM2 | ALT_FORM3, dst, dstw, src2, src2w, TMP_REG2, 0); + } + /* Range between -1 and -32768 is covered above. */ + if (TEST_ADD_IMM(src2, src2w)) { + compiler->imm = src2w & 0xffffffff; + return emit_op(compiler, SLJIT_ADD, flags | ALT_FORM2 | ALT_FORM4, dst, dstw, src1, src1w, TMP_REG2, 0); + } + if (TEST_ADD_IMM(src1, src1w)) { + compiler->imm = src1w & 0xffffffff; + return emit_op(compiler, SLJIT_ADD, flags | ALT_FORM2 | ALT_FORM4, dst, dstw, src2, src2w, TMP_REG2, 0); + } + } + if (HAS_FLAGS(op)) { + if (TEST_SL_IMM(src2, src2w)) { + compiler->imm = src2w & 0xffff; + return emit_op(compiler, SLJIT_ADD, flags | ALT_FORM3, dst, dstw, src1, src1w, TMP_REG2, 0); + } + if (TEST_SL_IMM(src1, src1w)) { + compiler->imm = src1w & 0xffff; + return emit_op(compiler, SLJIT_ADD, flags | ALT_FORM3, dst, dstw, src2, src2w, TMP_REG2, 0); + } + } + return emit_op(compiler, SLJIT_ADD, flags | ((GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY)) ? ALT_FORM4 : 0), dst, dstw, src1, src1w, src2, src2w); + + case SLJIT_ADDC: + return emit_op(compiler, SLJIT_ADDC, flags, dst, dstw, src1, src1w, src2, src2w); + + case SLJIT_SUB: + if (GET_FLAG_TYPE(op) >= SLJIT_LESS && GET_FLAG_TYPE(op) <= SLJIT_LESS_EQUAL) { + if (dst == SLJIT_UNUSED) { + if (TEST_UL_IMM(src2, src2w)) { + compiler->imm = src2w & 0xffff; + return emit_op(compiler, SLJIT_SUB, flags | ALT_FORM1 | ALT_FORM2, dst, dstw, src1, src1w, TMP_REG2, 0); + } + return emit_op(compiler, SLJIT_SUB, flags | ALT_FORM1, dst, dstw, src1, src1w, src2, src2w); + } + + if ((src2 & SLJIT_IMM) && src2w >= 0 && src2w <= (SIMM_MAX + 1)) { + compiler->imm = src2w; + return emit_op(compiler, SLJIT_SUB, flags | ALT_FORM1 | ALT_FORM2 | ALT_FORM3, dst, dstw, src1, src1w, TMP_REG2, 0); + } + return emit_op(compiler, SLJIT_SUB, flags | ALT_FORM1 | ALT_FORM3, dst, dstw, src1, src1w, src2, src2w); + } + + if (GET_FLAG_TYPE(op) == SLJIT_OVERFLOW) + return emit_op(compiler, SLJIT_SUB, flags | ALT_FORM2, dst, dstw, src1, src1w, src2, src2w); + + if (!HAS_FLAGS(op) && ((src1 | src2) & SLJIT_IMM)) { + if (TEST_SL_IMM(src2, -src2w)) { + compiler->imm = (-src2w) & 0xffff; + return emit_op(compiler, SLJIT_ADD, flags | ALT_FORM2, dst, dstw, src1, src1w, TMP_REG2, 0); + } + if (TEST_SL_IMM(src1, src1w)) { + compiler->imm = src1w & 0xffff; + return emit_op(compiler, SLJIT_SUB, flags | ALT_FORM3, dst, dstw, src2, src2w, TMP_REG2, 0); + } + if (TEST_SH_IMM(src2, -src2w)) { + compiler->imm = ((-src2w) >> 16) & 0xffff; + return emit_op(compiler, SLJIT_ADD, flags | ALT_FORM2 | ALT_FORM3, dst, dstw, src1, src1w, TMP_REG2, 0); + } + /* Range between -1 and -32768 is covered above. */ + if (TEST_ADD_IMM(src2, -src2w)) { + compiler->imm = -src2w & 0xffffffff; + return emit_op(compiler, SLJIT_ADD, flags | ALT_FORM2 | ALT_FORM4, dst, dstw, src1, src1w, TMP_REG2, 0); + } + } + + if (dst == SLJIT_UNUSED && GET_FLAG_TYPE(op) != GET_FLAG_TYPE(SLJIT_SET_CARRY)) { + if (TEST_SL_IMM(src2, src2w)) { + compiler->imm = src2w & 0xffff; + return emit_op(compiler, SLJIT_SUB, flags | ALT_FORM4 | ALT_FORM5, dst, dstw, src1, src1w, TMP_REG2, 0); + } + return emit_op(compiler, SLJIT_SUB, flags | ALT_FORM4, dst, dstw, src1, src1w, src2, src2w); + } + + if (TEST_SL_IMM(src2, -src2w)) { + compiler->imm = (-src2w) & 0xffff; + return emit_op(compiler, SLJIT_ADD, flags | ALT_FORM3, dst, dstw, src1, src1w, TMP_REG2, 0); + } + /* We know ALT_SIGN_EXT is set if it is an SLJIT_I32_OP on 64 bit systems. */ + return emit_op(compiler, SLJIT_SUB, flags | ((GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY)) ? ALT_FORM5 : 0), dst, dstw, src1, src1w, src2, src2w); + + case SLJIT_SUBC: + return emit_op(compiler, SLJIT_SUBC, flags, dst, dstw, src1, src1w, src2, src2w); + + case SLJIT_MUL: +#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) + if (op & SLJIT_I32_OP) + flags |= ALT_FORM2; +#endif + if (!HAS_FLAGS(op)) { + if (TEST_SL_IMM(src2, src2w)) { + compiler->imm = src2w & 0xffff; + return emit_op(compiler, SLJIT_MUL, flags | ALT_FORM1, dst, dstw, src1, src1w, TMP_REG2, 0); + } + if (TEST_SL_IMM(src1, src1w)) { + compiler->imm = src1w & 0xffff; + return emit_op(compiler, SLJIT_MUL, flags | ALT_FORM1, dst, dstw, src2, src2w, TMP_REG2, 0); + } + } + else + FAIL_IF(push_inst(compiler, MTXER | S(TMP_ZERO))); + return emit_op(compiler, SLJIT_MUL, flags, dst, dstw, src1, src1w, src2, src2w); + + case SLJIT_AND: + case SLJIT_OR: + case SLJIT_XOR: + /* Commutative unsigned operations. */ + if (!HAS_FLAGS(op) || GET_OPCODE(op) == SLJIT_AND) { + if (TEST_UL_IMM(src2, src2w)) { + compiler->imm = src2w; + return emit_op(compiler, GET_OPCODE(op), flags | ALT_FORM1, dst, dstw, src1, src1w, TMP_REG2, 0); + } + if (TEST_UL_IMM(src1, src1w)) { + compiler->imm = src1w; + return emit_op(compiler, GET_OPCODE(op), flags | ALT_FORM1, dst, dstw, src2, src2w, TMP_REG2, 0); + } + if (TEST_UH_IMM(src2, src2w)) { + compiler->imm = (src2w >> 16) & 0xffff; + return emit_op(compiler, GET_OPCODE(op), flags | ALT_FORM2, dst, dstw, src1, src1w, TMP_REG2, 0); + } + if (TEST_UH_IMM(src1, src1w)) { + compiler->imm = (src1w >> 16) & 0xffff; + return emit_op(compiler, GET_OPCODE(op), flags | ALT_FORM2, dst, dstw, src2, src2w, TMP_REG2, 0); + } + } + if (GET_OPCODE(op) != SLJIT_AND && GET_OPCODE(op) != SLJIT_AND) { + /* Unlike or and xor, and resets unwanted bits as well. */ + if (TEST_UI_IMM(src2, src2w)) { + compiler->imm = src2w; + return emit_op(compiler, GET_OPCODE(op), flags | ALT_FORM3, dst, dstw, src1, src1w, TMP_REG2, 0); + } + if (TEST_UI_IMM(src1, src1w)) { + compiler->imm = src1w; + return emit_op(compiler, GET_OPCODE(op), flags | ALT_FORM3, dst, dstw, src2, src2w, TMP_REG2, 0); + } + } + return emit_op(compiler, GET_OPCODE(op), flags, dst, dstw, src1, src1w, src2, src2w); + + case SLJIT_SHL: + case SLJIT_LSHR: + case SLJIT_ASHR: +#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) + if (op & SLJIT_I32_OP) + flags |= ALT_FORM2; +#endif + if (src2 & SLJIT_IMM) { + compiler->imm = src2w; + return emit_op(compiler, GET_OPCODE(op), flags | ALT_FORM1, dst, dstw, src1, src1w, TMP_REG2, 0); + } + return emit_op(compiler, GET_OPCODE(op), flags, dst, dstw, src1, src1w, src2, src2w); + } + + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg) +{ + CHECK_REG_INDEX(check_sljit_get_register_index(reg)); + return reg_map[reg]; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_float_register_index(sljit_s32 reg) +{ + CHECK_REG_INDEX(check_sljit_get_float_register_index(reg)); + return freg_map[reg]; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler, + void *instruction, sljit_s32 size) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_op_custom(compiler, instruction, size)); + + return push_inst(compiler, *(sljit_ins*)instruction); +} + +/* --------------------------------------------------------------------- */ +/* Floating point operators */ +/* --------------------------------------------------------------------- */ + +#define FLOAT_DATA(op) (DOUBLE_DATA | ((op & SLJIT_F32_OP) >> 6)) +#define SELECT_FOP(op, single, double) ((op & SLJIT_F32_OP) ? single : double) + +#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) +#define FLOAT_TMP_MEM_OFFSET (6 * sizeof(sljit_sw)) +#else +#define FLOAT_TMP_MEM_OFFSET (2 * sizeof(sljit_sw)) + +#if (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN) +#define FLOAT_TMP_MEM_OFFSET_LOW (2 * sizeof(sljit_sw)) +#define FLOAT_TMP_MEM_OFFSET_HI (3 * sizeof(sljit_sw)) +#else +#define FLOAT_TMP_MEM_OFFSET_LOW (3 * sizeof(sljit_sw)) +#define FLOAT_TMP_MEM_OFFSET_HI (2 * sizeof(sljit_sw)) +#endif + +#endif /* SLJIT_CONFIG_PPC_64 */ + +static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_sw_from_f64(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + if (src & SLJIT_MEM) { + /* We can ignore the temporary data store on the stack from caching point of view. */ + FAIL_IF(emit_op_mem(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG1, src, srcw, TMP_REG1)); + src = TMP_FREG1; + } + +#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) + op = GET_OPCODE(op); + FAIL_IF(push_inst(compiler, (op == SLJIT_CONV_S32_FROM_F64 ? FCTIWZ : FCTIDZ) | FD(TMP_FREG1) | FB(src))); + + if (op == SLJIT_CONV_SW_FROM_F64) { + if (FAST_IS_REG(dst)) { + FAIL_IF(emit_op_mem(compiler, DOUBLE_DATA, TMP_FREG1, SLJIT_MEM1(SLJIT_SP), FLOAT_TMP_MEM_OFFSET, TMP_REG1)); + return emit_op_mem(compiler, WORD_DATA | LOAD_DATA, dst, SLJIT_MEM1(SLJIT_SP), FLOAT_TMP_MEM_OFFSET, TMP_REG1); + } + return emit_op_mem(compiler, DOUBLE_DATA, TMP_FREG1, dst, dstw, TMP_REG1); + } +#else + FAIL_IF(push_inst(compiler, FCTIWZ | FD(TMP_FREG1) | FB(src))); +#endif + + if (FAST_IS_REG(dst)) { + FAIL_IF(load_immediate(compiler, TMP_REG1, FLOAT_TMP_MEM_OFFSET)); + FAIL_IF(push_inst(compiler, STFIWX | FS(TMP_FREG1) | A(SLJIT_SP) | B(TMP_REG1))); + return emit_op_mem(compiler, INT_DATA | LOAD_DATA, dst, SLJIT_MEM1(SLJIT_SP), FLOAT_TMP_MEM_OFFSET, TMP_REG1); + } + + SLJIT_ASSERT(dst & SLJIT_MEM); + + if (dst & OFFS_REG_MASK) { + dstw &= 0x3; + if (dstw) { +#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) + FAIL_IF(push_inst(compiler, RLWINM | S(OFFS_REG(dst)) | A(TMP_REG1) | (dstw << 11) | ((31 - dstw) << 1))); +#else + FAIL_IF(push_inst(compiler, RLDI(TMP_REG1, OFFS_REG(dst), dstw, 63 - dstw, 1))); +#endif + dstw = TMP_REG1; + } + else + dstw = OFFS_REG(dst); + } + else { + if ((dst & REG_MASK) && !dstw) { + dstw = dst & REG_MASK; + dst = 0; + } + else { + /* This works regardless we have SLJIT_MEM1 or SLJIT_MEM0. */ + FAIL_IF(load_immediate(compiler, TMP_REG1, dstw)); + dstw = TMP_REG1; + } + } + + return push_inst(compiler, STFIWX | FS(TMP_FREG1) | A(dst & REG_MASK) | B(dstw)); +} + +static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ +#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) + + sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1; + + if (src & SLJIT_IMM) { + if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32) + srcw = (sljit_s32)srcw; + FAIL_IF(load_immediate(compiler, TMP_REG1, srcw)); + src = TMP_REG1; + } + else if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32) { + if (FAST_IS_REG(src)) + FAIL_IF(push_inst(compiler, EXTSW | S(src) | A(TMP_REG1))); + else + FAIL_IF(emit_op_mem(compiler, INT_DATA | SIGNED_DATA | LOAD_DATA, TMP_REG1, src, srcw, TMP_REG1)); + src = TMP_REG1; + } + + if (FAST_IS_REG(src)) { + FAIL_IF(emit_op_mem(compiler, WORD_DATA, src, SLJIT_MEM1(SLJIT_SP), FLOAT_TMP_MEM_OFFSET, TMP_REG1)); + FAIL_IF(emit_op_mem(compiler, DOUBLE_DATA | LOAD_DATA, TMP_FREG1, SLJIT_MEM1(SLJIT_SP), FLOAT_TMP_MEM_OFFSET, TMP_REG1)); + } + else + FAIL_IF(emit_op_mem(compiler, DOUBLE_DATA | LOAD_DATA, TMP_FREG1, src, srcw, TMP_REG1)); + + FAIL_IF(push_inst(compiler, FCFID | FD(dst_r) | FB(TMP_FREG1))); + + if (dst & SLJIT_MEM) + return emit_op_mem(compiler, FLOAT_DATA(op), TMP_FREG1, dst, dstw, TMP_REG1); + if (op & SLJIT_F32_OP) + return push_inst(compiler, FRSP | FD(dst_r) | FB(dst_r)); + return SLJIT_SUCCESS; + +#else + + sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1; + sljit_s32 invert_sign = 1; + + if (src & SLJIT_IMM) { + FAIL_IF(load_immediate(compiler, TMP_REG1, srcw ^ 0x80000000)); + src = TMP_REG1; + invert_sign = 0; + } + else if (!FAST_IS_REG(src)) { + FAIL_IF(emit_op_mem(compiler, WORD_DATA | SIGNED_DATA | LOAD_DATA, TMP_REG1, src, srcw, TMP_REG1)); + src = TMP_REG1; + } + + /* First, a special double floating point value is constructed: (2^53 + (input xor (2^31))) + The double precision format has exactly 53 bit precision, so the lower 32 bit represents + the lower 32 bit of such value. The result of xor 2^31 is the same as adding 0x80000000 + to the input, which shifts it into the 0 - 0xffffffff range. To get the converted floating + point value, we need to substract 2^53 + 2^31 from the constructed value. */ + FAIL_IF(push_inst(compiler, ADDIS | D(TMP_REG2) | A(0) | 0x4330)); + if (invert_sign) + FAIL_IF(push_inst(compiler, XORIS | S(src) | A(TMP_REG1) | 0x8000)); + FAIL_IF(emit_op_mem(compiler, WORD_DATA, TMP_REG2, SLJIT_MEM1(SLJIT_SP), FLOAT_TMP_MEM_OFFSET_HI, TMP_REG1)); + FAIL_IF(emit_op_mem(compiler, WORD_DATA, TMP_REG1, SLJIT_MEM1(SLJIT_SP), FLOAT_TMP_MEM_OFFSET_LOW, TMP_REG2)); + FAIL_IF(push_inst(compiler, ADDIS | D(TMP_REG1) | A(0) | 0x8000)); + FAIL_IF(emit_op_mem(compiler, DOUBLE_DATA | LOAD_DATA, TMP_FREG1, SLJIT_MEM1(SLJIT_SP), FLOAT_TMP_MEM_OFFSET, TMP_REG1)); + FAIL_IF(emit_op_mem(compiler, WORD_DATA, TMP_REG1, SLJIT_MEM1(SLJIT_SP), FLOAT_TMP_MEM_OFFSET_LOW, TMP_REG2)); + FAIL_IF(emit_op_mem(compiler, DOUBLE_DATA | LOAD_DATA, TMP_FREG2, SLJIT_MEM1(SLJIT_SP), FLOAT_TMP_MEM_OFFSET, TMP_REG1)); + + FAIL_IF(push_inst(compiler, FSUB | FD(dst_r) | FA(TMP_FREG1) | FB(TMP_FREG2))); + + if (dst & SLJIT_MEM) + return emit_op_mem(compiler, FLOAT_DATA(op), TMP_FREG1, dst, dstw, TMP_REG1); + if (op & SLJIT_F32_OP) + return push_inst(compiler, FRSP | FD(dst_r) | FB(dst_r)); + return SLJIT_SUCCESS; + +#endif +} + +static SLJIT_INLINE sljit_s32 sljit_emit_fop1_cmp(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + if (src1 & SLJIT_MEM) { + FAIL_IF(emit_op_mem(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG1, src1, src1w, TMP_REG1)); + src1 = TMP_FREG1; + } + + if (src2 & SLJIT_MEM) { + FAIL_IF(emit_op_mem(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG2, src2, src2w, TMP_REG2)); + src2 = TMP_FREG2; + } + + return push_inst(compiler, FCMPU | CRD(4) | FA(src1) | FB(src2)); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + sljit_s32 dst_r; + + CHECK_ERROR(); + + SLJIT_COMPILE_ASSERT((SLJIT_F32_OP == 0x100) && !(DOUBLE_DATA & 0x4), float_transfer_bit_error); + SELECT_FOP1_OPERATION_WITH_CHECKS(compiler, op, dst, dstw, src, srcw); + + if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_F32) + op ^= SLJIT_F32_OP; + + dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1; + + if (src & SLJIT_MEM) { + FAIL_IF(emit_op_mem(compiler, FLOAT_DATA(op) | LOAD_DATA, dst_r, src, srcw, TMP_REG1)); + src = dst_r; + } + + switch (GET_OPCODE(op)) { + case SLJIT_CONV_F64_FROM_F32: + op ^= SLJIT_F32_OP; + if (op & SLJIT_F32_OP) { + FAIL_IF(push_inst(compiler, FRSP | FD(dst_r) | FB(src))); + break; + } + /* Fall through. */ + case SLJIT_MOV_F64: + if (src != dst_r) { + if (dst_r != TMP_FREG1) + FAIL_IF(push_inst(compiler, FMR | FD(dst_r) | FB(src))); + else + dst_r = src; + } + break; + case SLJIT_NEG_F64: + FAIL_IF(push_inst(compiler, FNEG | FD(dst_r) | FB(src))); + break; + case SLJIT_ABS_F64: + FAIL_IF(push_inst(compiler, FABS | FD(dst_r) | FB(src))); + break; + } + + if (dst & SLJIT_MEM) + FAIL_IF(emit_op_mem(compiler, FLOAT_DATA(op), dst_r, dst, dstw, TMP_REG1)); + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + sljit_s32 dst_r; + + CHECK_ERROR(); + CHECK(check_sljit_emit_fop2(compiler, op, dst, dstw, src1, src1w, src2, src2w)); + ADJUST_LOCAL_OFFSET(dst, dstw); + ADJUST_LOCAL_OFFSET(src1, src1w); + ADJUST_LOCAL_OFFSET(src2, src2w); + + dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG2; + + if (src1 & SLJIT_MEM) { + FAIL_IF(emit_op_mem(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG1, src1, src1w, TMP_REG1)); + src1 = TMP_FREG1; + } + + if (src2 & SLJIT_MEM) { + FAIL_IF(emit_op_mem(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG2, src2, src2w, TMP_REG2)); + src2 = TMP_FREG2; + } + + switch (GET_OPCODE(op)) { + case SLJIT_ADD_F64: + FAIL_IF(push_inst(compiler, SELECT_FOP(op, FADDS, FADD) | FD(dst_r) | FA(src1) | FB(src2))); + break; + + case SLJIT_SUB_F64: + FAIL_IF(push_inst(compiler, SELECT_FOP(op, FSUBS, FSUB) | FD(dst_r) | FA(src1) | FB(src2))); + break; + + case SLJIT_MUL_F64: + FAIL_IF(push_inst(compiler, SELECT_FOP(op, FMULS, FMUL) | FD(dst_r) | FA(src1) | FC(src2) /* FMUL use FC as src2 */)); + break; + + case SLJIT_DIV_F64: + FAIL_IF(push_inst(compiler, SELECT_FOP(op, FDIVS, FDIV) | FD(dst_r) | FA(src1) | FB(src2))); + break; + } + + if (dst & SLJIT_MEM) + FAIL_IF(emit_op_mem(compiler, FLOAT_DATA(op), TMP_FREG2, dst, dstw, TMP_REG1)); + + return SLJIT_SUCCESS; +} + +#undef SELECT_FOP + +/* --------------------------------------------------------------------- */ +/* Other instructions */ +/* --------------------------------------------------------------------- */ + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_fast_enter(compiler, dst, dstw)); + ADJUST_LOCAL_OFFSET(dst, dstw); + + if (FAST_IS_REG(dst)) + return push_inst(compiler, MFLR | D(dst)); + + /* Memory. */ + FAIL_IF(push_inst(compiler, MFLR | D(TMP_REG2))); + return emit_op(compiler, SLJIT_MOV, WORD_DATA, dst, dstw, TMP_REG1, 0, TMP_REG2, 0); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_fast_return(compiler, src, srcw)); + ADJUST_LOCAL_OFFSET(src, srcw); + + if (FAST_IS_REG(src)) + FAIL_IF(push_inst(compiler, MTLR | S(src))); + else { + FAIL_IF(emit_op(compiler, SLJIT_MOV, WORD_DATA, TMP_REG2, 0, TMP_REG1, 0, src, srcw)); + FAIL_IF(push_inst(compiler, MTLR | S(TMP_REG2))); + } + + return push_inst(compiler, BLR); +} + +/* --------------------------------------------------------------------- */ +/* Conditional instructions */ +/* --------------------------------------------------------------------- */ + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compiler *compiler) +{ + struct sljit_label *label; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_label(compiler)); + + if (compiler->last_label && compiler->last_label->size == compiler->size) + return compiler->last_label; + + label = (struct sljit_label*)ensure_abuf(compiler, sizeof(struct sljit_label)); + PTR_FAIL_IF(!label); + set_label(label, compiler); + return label; +} + +static sljit_ins get_bo_bi_flags(sljit_s32 type) +{ + switch (type) { + case SLJIT_EQUAL: + return (12 << 21) | (2 << 16); + + case SLJIT_NOT_EQUAL: + return (4 << 21) | (2 << 16); + + case SLJIT_LESS: + case SLJIT_SIG_LESS: + return (12 << 21) | (0 << 16); + + case SLJIT_GREATER_EQUAL: + case SLJIT_SIG_GREATER_EQUAL: + return (4 << 21) | (0 << 16); + + case SLJIT_GREATER: + case SLJIT_SIG_GREATER: + return (12 << 21) | (1 << 16); + + case SLJIT_LESS_EQUAL: + case SLJIT_SIG_LESS_EQUAL: + return (4 << 21) | (1 << 16); + + case SLJIT_LESS_F64: + return (12 << 21) | ((4 + 0) << 16); + + case SLJIT_GREATER_EQUAL_F64: + return (4 << 21) | ((4 + 0) << 16); + + case SLJIT_GREATER_F64: + return (12 << 21) | ((4 + 1) << 16); + + case SLJIT_LESS_EQUAL_F64: + return (4 << 21) | ((4 + 1) << 16); + + case SLJIT_OVERFLOW: + case SLJIT_MUL_OVERFLOW: + return (12 << 21) | (3 << 16); + + case SLJIT_NOT_OVERFLOW: + case SLJIT_MUL_NOT_OVERFLOW: + return (4 << 21) | (3 << 16); + + case SLJIT_EQUAL_F64: + return (12 << 21) | ((4 + 2) << 16); + + case SLJIT_NOT_EQUAL_F64: + return (4 << 21) | ((4 + 2) << 16); + + case SLJIT_UNORDERED_F64: + return (12 << 21) | ((4 + 3) << 16); + + case SLJIT_ORDERED_F64: + return (4 << 21) | ((4 + 3) << 16); + + default: + SLJIT_ASSERT(type >= SLJIT_JUMP && type <= SLJIT_CALL_CDECL); + return (20 << 21); + } +} + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, sljit_s32 type) +{ + struct sljit_jump *jump; + sljit_ins bo_bi_flags; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_jump(compiler, type)); + + bo_bi_flags = get_bo_bi_flags(type & 0xff); + if (!bo_bi_flags) + return NULL; + + jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump)); + PTR_FAIL_IF(!jump); + set_jump(jump, compiler, type & SLJIT_REWRITABLE_JUMP); + type &= 0xff; + + /* In PPC, we don't need to touch the arguments. */ + if (type < SLJIT_JUMP) + jump->flags |= IS_COND; +#if (defined SLJIT_PASS_ENTRY_ADDR_TO_CALL && SLJIT_PASS_ENTRY_ADDR_TO_CALL) + if (type >= SLJIT_CALL) + jump->flags |= IS_CALL; +#endif + + PTR_FAIL_IF(emit_const(compiler, TMP_CALL_REG, 0)); + PTR_FAIL_IF(push_inst(compiler, MTCTR | S(TMP_CALL_REG))); + jump->addr = compiler->size; + PTR_FAIL_IF(push_inst(compiler, BCCTR | bo_bi_flags | (type >= SLJIT_FAST_CALL ? 1 : 0))); + return jump; +} + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_call(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 arg_types) +{ + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_call(compiler, type, arg_types)); + +#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) + PTR_FAIL_IF(call_with_args(compiler, arg_types, NULL)); +#endif + +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \ + || (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + compiler->skip_checks = 1; +#endif + + return sljit_emit_jump(compiler, type); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 src, sljit_sw srcw) +{ + struct sljit_jump *jump = NULL; + sljit_s32 src_r; + + CHECK_ERROR(); + CHECK(check_sljit_emit_ijump(compiler, type, src, srcw)); + ADJUST_LOCAL_OFFSET(src, srcw); + + if (FAST_IS_REG(src)) { +#if (defined SLJIT_PASS_ENTRY_ADDR_TO_CALL && SLJIT_PASS_ENTRY_ADDR_TO_CALL) + if (type >= SLJIT_CALL) { + FAIL_IF(push_inst(compiler, OR | S(src) | A(TMP_CALL_REG) | B(src))); + src_r = TMP_CALL_REG; + } + else + src_r = src; +#else + src_r = src; +#endif + } else if (src & SLJIT_IMM) { + /* These jumps are converted to jump/call instructions when possible. */ + jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump)); + FAIL_IF(!jump); + set_jump(jump, compiler, JUMP_ADDR); + jump->u.target = srcw; +#if (defined SLJIT_PASS_ENTRY_ADDR_TO_CALL && SLJIT_PASS_ENTRY_ADDR_TO_CALL) + if (type >= SLJIT_CALL) + jump->flags |= IS_CALL; +#endif + FAIL_IF(emit_const(compiler, TMP_CALL_REG, 0)); + src_r = TMP_CALL_REG; + } + else { + FAIL_IF(emit_op(compiler, SLJIT_MOV, WORD_DATA, TMP_CALL_REG, 0, TMP_REG1, 0, src, srcw)); + src_r = TMP_CALL_REG; + } + + FAIL_IF(push_inst(compiler, MTCTR | S(src_r))); + if (jump) + jump->addr = compiler->size; + return push_inst(compiler, BCCTR | (20 << 21) | (type >= SLJIT_FAST_CALL ? 1 : 0)); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_icall(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 arg_types, + sljit_s32 src, sljit_sw srcw) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_icall(compiler, type, arg_types, src, srcw)); + +#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) + if (src & SLJIT_MEM) { + ADJUST_LOCAL_OFFSET(src, srcw); + FAIL_IF(emit_op(compiler, SLJIT_MOV, WORD_DATA, TMP_CALL_REG, 0, TMP_REG1, 0, src, srcw)); + src = TMP_CALL_REG; + } + + FAIL_IF(call_with_args(compiler, arg_types, &src)); +#endif + +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \ + || (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + compiler->skip_checks = 1; +#endif + + return sljit_emit_ijump(compiler, type, src, srcw); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 type) +{ + sljit_s32 reg, input_flags, cr_bit, invert; + sljit_s32 saved_op = op; + sljit_sw saved_dstw = dstw; + + CHECK_ERROR(); + CHECK(check_sljit_emit_op_flags(compiler, op, dst, dstw, type)); + ADJUST_LOCAL_OFFSET(dst, dstw); + +#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) + input_flags = (op & SLJIT_I32_OP) ? INT_DATA : WORD_DATA; +#else + input_flags = WORD_DATA; +#endif + + op = GET_OPCODE(op); + reg = (op < SLJIT_ADD && FAST_IS_REG(dst)) ? dst : TMP_REG2; + + if (op >= SLJIT_ADD && (dst & SLJIT_MEM)) + FAIL_IF(emit_op_mem(compiler, input_flags | LOAD_DATA, TMP_REG1, dst, dstw, TMP_REG1)); + + invert = 0; + cr_bit = 0; + + switch (type & 0xff) { + case SLJIT_LESS: + case SLJIT_SIG_LESS: + break; + + case SLJIT_GREATER_EQUAL: + case SLJIT_SIG_GREATER_EQUAL: + invert = 1; + break; + + case SLJIT_GREATER: + case SLJIT_SIG_GREATER: + cr_bit = 1; + break; + + case SLJIT_LESS_EQUAL: + case SLJIT_SIG_LESS_EQUAL: + cr_bit = 1; + invert = 1; + break; + + case SLJIT_EQUAL: + cr_bit = 2; + break; + + case SLJIT_NOT_EQUAL: + cr_bit = 2; + invert = 1; + break; + + case SLJIT_OVERFLOW: + case SLJIT_MUL_OVERFLOW: + cr_bit = 3; + break; + + case SLJIT_NOT_OVERFLOW: + case SLJIT_MUL_NOT_OVERFLOW: + cr_bit = 3; + invert = 1; + break; + + case SLJIT_LESS_F64: + cr_bit = 4 + 0; + break; + + case SLJIT_GREATER_EQUAL_F64: + cr_bit = 4 + 0; + invert = 1; + break; + + case SLJIT_GREATER_F64: + cr_bit = 4 + 1; + break; + + case SLJIT_LESS_EQUAL_F64: + cr_bit = 4 + 1; + invert = 1; + break; + + case SLJIT_EQUAL_F64: + cr_bit = 4 + 2; + break; + + case SLJIT_NOT_EQUAL_F64: + cr_bit = 4 + 2; + invert = 1; + break; + + case SLJIT_UNORDERED_F64: + cr_bit = 4 + 3; + break; + + case SLJIT_ORDERED_F64: + cr_bit = 4 + 3; + invert = 1; + break; + + default: + SLJIT_UNREACHABLE(); + break; + } + + FAIL_IF(push_inst(compiler, MFCR | D(reg))); + FAIL_IF(push_inst(compiler, RLWINM | S(reg) | A(reg) | ((1 + (cr_bit)) << 11) | (31 << 6) | (31 << 1))); + + if (invert) + FAIL_IF(push_inst(compiler, XORI | S(reg) | A(reg) | 0x1)); + + if (op < SLJIT_ADD) { + if (!(dst & SLJIT_MEM)) + return SLJIT_SUCCESS; + return emit_op_mem(compiler, input_flags, reg, dst, dstw, TMP_REG1); + } + +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \ + || (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + compiler->skip_checks = 1; +#endif + if (dst & SLJIT_MEM) + return sljit_emit_op2(compiler, saved_op, dst, saved_dstw, TMP_REG1, 0, TMP_REG2, 0); + return sljit_emit_op2(compiler, saved_op, dst, 0, dst, 0, TMP_REG2, 0); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 dst_reg, + sljit_s32 src, sljit_sw srcw) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_cmov(compiler, type, dst_reg, src, srcw)); + + return sljit_emit_cmov_generic(compiler, type, dst_reg, src, srcw);; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 reg, + sljit_s32 mem, sljit_sw memw) +{ + sljit_s32 mem_flags; + sljit_ins inst; + + CHECK_ERROR(); + CHECK(check_sljit_emit_mem(compiler, type, reg, mem, memw)); + + if (type & SLJIT_MEM_POST) + return SLJIT_ERR_UNSUPPORTED; + + switch (type & 0xff) { + case SLJIT_MOV: + case SLJIT_MOV_P: +#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) + case SLJIT_MOV_U32: + case SLJIT_MOV_S32: +#endif + mem_flags = WORD_DATA; + break; + +#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) + case SLJIT_MOV_U32: + mem_flags = INT_DATA; + break; + + case SLJIT_MOV_S32: + mem_flags = INT_DATA; + + if (!(type & SLJIT_MEM_STORE) && !(type & SLJIT_I32_OP)) { + if (mem & OFFS_REG_MASK) + mem_flags |= SIGNED_DATA; + else + return SLJIT_ERR_UNSUPPORTED; + } + break; +#endif + + case SLJIT_MOV_U8: + case SLJIT_MOV_S8: + mem_flags = BYTE_DATA; + break; + + case SLJIT_MOV_U16: + mem_flags = HALF_DATA; + break; + + case SLJIT_MOV_S16: + mem_flags = HALF_DATA | SIGNED_DATA; + break; + + default: + SLJIT_UNREACHABLE(); + mem_flags = WORD_DATA; + break; + } + + if (!(type & SLJIT_MEM_STORE)) + mem_flags |= LOAD_DATA; + + if (SLJIT_UNLIKELY(mem & OFFS_REG_MASK)) { + if (memw != 0) + return SLJIT_ERR_UNSUPPORTED; + + if (type & SLJIT_MEM_SUPP) + return SLJIT_SUCCESS; + + inst = updated_data_transfer_insts[mem_flags | INDEXED]; + FAIL_IF(push_inst(compiler, INST_CODE_AND_DST(inst, 0, reg) | A(mem & REG_MASK) | B(OFFS_REG(mem)))); + } + else { + if (memw > SIMM_MAX || memw < SIMM_MIN) + return SLJIT_ERR_UNSUPPORTED; + + inst = updated_data_transfer_insts[mem_flags]; + +#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) + if ((inst & INT_ALIGNED) && (memw & 0x3) != 0) + return SLJIT_ERR_UNSUPPORTED; +#endif + + if (type & SLJIT_MEM_SUPP) + return SLJIT_SUCCESS; + + FAIL_IF(push_inst(compiler, INST_CODE_AND_DST(inst, 0, reg) | A(mem & REG_MASK) | IMM(memw))); + } + + if ((mem_flags & LOAD_DATA) && (type & 0xff) == SLJIT_MOV_S8) + return push_inst(compiler, EXTSB | S(reg) | A(reg)); + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fmem(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 freg, + sljit_s32 mem, sljit_sw memw) +{ + sljit_s32 mem_flags; + sljit_ins inst; + + CHECK_ERROR(); + CHECK(check_sljit_emit_fmem(compiler, type, freg, mem, memw)); + + if (type & SLJIT_MEM_POST) + return SLJIT_ERR_UNSUPPORTED; + + if (SLJIT_UNLIKELY(mem & OFFS_REG_MASK)) { + if (memw != 0) + return SLJIT_ERR_UNSUPPORTED; + } + else { + if (memw > SIMM_MAX || memw < SIMM_MIN) + return SLJIT_ERR_UNSUPPORTED; + } + + if (type & SLJIT_MEM_SUPP) + return SLJIT_SUCCESS; + + mem_flags = FLOAT_DATA(type); + + if (!(type & SLJIT_MEM_STORE)) + mem_flags |= LOAD_DATA; + + if (SLJIT_UNLIKELY(mem & OFFS_REG_MASK)) { + inst = updated_data_transfer_insts[mem_flags | INDEXED]; + return push_inst(compiler, INST_CODE_AND_DST(inst, DOUBLE_DATA, freg) | A(mem & REG_MASK) | B(OFFS_REG(mem))); + } + + inst = updated_data_transfer_insts[mem_flags]; + return push_inst(compiler, INST_CODE_AND_DST(inst, DOUBLE_DATA, freg) | A(mem & REG_MASK) | IMM(memw)); +} + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw init_value) +{ + struct sljit_const *const_; + sljit_s32 dst_r; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value)); + ADJUST_LOCAL_OFFSET(dst, dstw); + + const_ = (struct sljit_const*)ensure_abuf(compiler, sizeof(struct sljit_const)); + PTR_FAIL_IF(!const_); + set_const(const_, compiler); + + dst_r = FAST_IS_REG(dst) ? dst : TMP_REG2; + PTR_FAIL_IF(emit_const(compiler, dst_r, init_value)); + + if (dst & SLJIT_MEM) + PTR_FAIL_IF(emit_op(compiler, SLJIT_MOV, WORD_DATA, dst, dstw, TMP_REG1, 0, TMP_REG2, 0)); + + return const_; +} + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_put_label* sljit_emit_put_label(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw) +{ + struct sljit_put_label *put_label; + sljit_s32 dst_r; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_put_label(compiler, dst, dstw)); + ADJUST_LOCAL_OFFSET(dst, dstw); + + put_label = (struct sljit_put_label*)ensure_abuf(compiler, sizeof(struct sljit_put_label)); + PTR_FAIL_IF(!put_label); + set_put_label(put_label, compiler, 0); + + dst_r = FAST_IS_REG(dst) ? dst : TMP_REG2; +#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) + PTR_FAIL_IF(emit_const(compiler, dst_r, 0)); +#else + PTR_FAIL_IF(push_inst(compiler, dst_r)); + compiler->size += 4; +#endif + + if (dst & SLJIT_MEM) + PTR_FAIL_IF(emit_op(compiler, SLJIT_MOV, WORD_DATA, dst, dstw, TMP_REG1, 0, TMP_REG2, 0)); + + return put_label; +} diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeSPARC_32.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeSPARC_32.c new file mode 100755 index 000000000..8079fad8d --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeSPARC_32.c @@ -0,0 +1,286 @@ +/* + * Stack-less Just-In-Time compiler + * + * Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +static sljit_s32 load_immediate(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw imm) +{ + if (imm <= SIMM_MAX && imm >= SIMM_MIN) + return push_inst(compiler, OR | D(dst) | S1(0) | IMM(imm), DR(dst)); + + FAIL_IF(push_inst(compiler, SETHI | D(dst) | ((imm >> 10) & 0x3fffff), DR(dst))); + return (imm & 0x3ff) ? push_inst(compiler, OR | D(dst) | S1(dst) | IMM_ARG | (imm & 0x3ff), DR(dst)) : SLJIT_SUCCESS; +} + +#define ARG2(flags, src2) ((flags & SRC2_IMM) ? IMM(src2) : S2(src2)) + +static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 flags, + sljit_s32 dst, sljit_s32 src1, sljit_sw src2) +{ + SLJIT_COMPILE_ASSERT(ICC_IS_SET == SET_FLAGS, icc_is_set_and_set_flags_must_be_the_same); + + switch (op) { + case SLJIT_MOV: + case SLJIT_MOV_U32: + case SLJIT_MOV_S32: + case SLJIT_MOV_P: + SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); + if (dst != src2) + return push_inst(compiler, OR | D(dst) | S1(0) | S2(src2), DR(dst)); + return SLJIT_SUCCESS; + + case SLJIT_MOV_U8: + case SLJIT_MOV_S8: + SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); + if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) { + if (op == SLJIT_MOV_U8) + return push_inst(compiler, AND | D(dst) | S1(src2) | IMM(0xff), DR(dst)); + FAIL_IF(push_inst(compiler, SLL | D(dst) | S1(src2) | IMM(24), DR(dst))); + return push_inst(compiler, SRA | D(dst) | S1(dst) | IMM(24), DR(dst)); + } + else if (dst != src2) + SLJIT_UNREACHABLE(); + return SLJIT_SUCCESS; + + case SLJIT_MOV_U16: + case SLJIT_MOV_S16: + SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); + if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) { + FAIL_IF(push_inst(compiler, SLL | D(dst) | S1(src2) | IMM(16), DR(dst))); + return push_inst(compiler, (op == SLJIT_MOV_S16 ? SRA : SRL) | D(dst) | S1(dst) | IMM(16), DR(dst)); + } + else if (dst != src2) + SLJIT_UNREACHABLE(); + return SLJIT_SUCCESS; + + case SLJIT_NOT: + SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); + return push_inst(compiler, XNOR | (flags & SET_FLAGS) | D(dst) | S1(0) | S2(src2), DR(dst) | (flags & SET_FLAGS)); + + case SLJIT_CLZ: + SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); + FAIL_IF(push_inst(compiler, SUB | SET_FLAGS | D(0) | S1(src2) | S2(0), SET_FLAGS)); + FAIL_IF(push_inst(compiler, OR | D(TMP_REG1) | S1(0) | S2(src2), DR(TMP_REG1))); + FAIL_IF(push_inst(compiler, BICC | DA(0x1) | (7 & DISP_MASK), UNMOVABLE_INS)); + FAIL_IF(push_inst(compiler, OR | D(dst) | S1(0) | IMM(32), UNMOVABLE_INS)); + FAIL_IF(push_inst(compiler, OR | D(dst) | S1(0) | IMM(-1), DR(dst))); + + /* Loop. */ + FAIL_IF(push_inst(compiler, SUB | SET_FLAGS | D(0) | S1(TMP_REG1) | S2(0), SET_FLAGS)); + FAIL_IF(push_inst(compiler, SLL | D(TMP_REG1) | S1(TMP_REG1) | IMM(1), DR(TMP_REG1))); + FAIL_IF(push_inst(compiler, BICC | DA(0xe) | (-2 & DISP_MASK), UNMOVABLE_INS)); + return push_inst(compiler, ADD | D(dst) | S1(dst) | IMM(1), UNMOVABLE_INS); + + case SLJIT_ADD: + return push_inst(compiler, ADD | (flags & SET_FLAGS) | D(dst) | S1(src1) | ARG2(flags, src2), DR(dst) | (flags & SET_FLAGS)); + + case SLJIT_ADDC: + return push_inst(compiler, ADDC | (flags & SET_FLAGS) | D(dst) | S1(src1) | ARG2(flags, src2), DR(dst) | (flags & SET_FLAGS)); + + case SLJIT_SUB: + return push_inst(compiler, SUB | (flags & SET_FLAGS) | D(dst) | S1(src1) | ARG2(flags, src2), DR(dst) | (flags & SET_FLAGS)); + + case SLJIT_SUBC: + return push_inst(compiler, SUBC | (flags & SET_FLAGS) | D(dst) | S1(src1) | ARG2(flags, src2), DR(dst) | (flags & SET_FLAGS)); + + case SLJIT_MUL: + FAIL_IF(push_inst(compiler, SMUL | D(dst) | S1(src1) | ARG2(flags, src2), DR(dst))); + if (!(flags & SET_FLAGS)) + return SLJIT_SUCCESS; + FAIL_IF(push_inst(compiler, SRA | D(TMP_REG1) | S1(dst) | IMM(31), DR(TMP_REG1))); + FAIL_IF(push_inst(compiler, RDY | D(TMP_LINK), DR(TMP_LINK))); + return push_inst(compiler, SUB | SET_FLAGS | D(0) | S1(TMP_REG1) | S2(TMP_LINK), MOVABLE_INS | SET_FLAGS); + + case SLJIT_AND: + return push_inst(compiler, AND | (flags & SET_FLAGS) | D(dst) | S1(src1) | ARG2(flags, src2), DR(dst) | (flags & SET_FLAGS)); + + case SLJIT_OR: + return push_inst(compiler, OR | (flags & SET_FLAGS) | D(dst) | S1(src1) | ARG2(flags, src2), DR(dst) | (flags & SET_FLAGS)); + + case SLJIT_XOR: + return push_inst(compiler, XOR | (flags & SET_FLAGS) | D(dst) | S1(src1) | ARG2(flags, src2), DR(dst) | (flags & SET_FLAGS)); + + case SLJIT_SHL: + FAIL_IF(push_inst(compiler, SLL | D(dst) | S1(src1) | ARG2(flags, src2), DR(dst))); + return !(flags & SET_FLAGS) ? SLJIT_SUCCESS : push_inst(compiler, SUB | SET_FLAGS | D(0) | S1(dst) | S2(0), SET_FLAGS); + + case SLJIT_LSHR: + FAIL_IF(push_inst(compiler, SRL | D(dst) | S1(src1) | ARG2(flags, src2), DR(dst))); + return !(flags & SET_FLAGS) ? SLJIT_SUCCESS : push_inst(compiler, SUB | SET_FLAGS | D(0) | S1(dst) | S2(0), SET_FLAGS); + + case SLJIT_ASHR: + FAIL_IF(push_inst(compiler, SRA | D(dst) | S1(src1) | ARG2(flags, src2), DR(dst))); + return !(flags & SET_FLAGS) ? SLJIT_SUCCESS : push_inst(compiler, SUB | SET_FLAGS | D(0) | S1(dst) | S2(0), SET_FLAGS); + } + + SLJIT_UNREACHABLE(); + return SLJIT_SUCCESS; +} + +static sljit_s32 call_with_args(struct sljit_compiler *compiler, sljit_s32 arg_types, sljit_s32 *src) +{ + sljit_s32 reg_index = 8; + sljit_s32 word_reg_index = 8; + sljit_s32 float_arg_index = 1; + sljit_s32 double_arg_count = 0; + sljit_s32 float_offset = (16 + 6) * sizeof(sljit_sw); + sljit_s32 types = 0; + sljit_s32 reg = 0; + sljit_s32 move_to_tmp2 = 0; + + if (src) + reg = reg_map[*src & REG_MASK]; + + arg_types >>= SLJIT_DEF_SHIFT; + + while (arg_types) { + types = (types << SLJIT_DEF_SHIFT) | (arg_types & SLJIT_DEF_MASK); + + switch (arg_types & SLJIT_DEF_MASK) { + case SLJIT_ARG_TYPE_F32: + float_arg_index++; + if (reg_index == reg) + move_to_tmp2 = 1; + reg_index++; + break; + case SLJIT_ARG_TYPE_F64: + float_arg_index++; + double_arg_count++; + if (reg_index == reg || reg_index + 1 == reg) + move_to_tmp2 = 1; + reg_index += 2; + break; + default: + if (reg_index != word_reg_index && reg_index < 14 && reg_index == reg) + move_to_tmp2 = 1; + reg_index++; + word_reg_index++; + break; + } + + if (move_to_tmp2) { + move_to_tmp2 = 0; + if (reg < 14) + FAIL_IF(push_inst(compiler, OR | D(TMP_REG1) | S1(0) | S2A(reg), DR(TMP_REG1))); + *src = TMP_REG1; + } + + arg_types >>= SLJIT_DEF_SHIFT; + } + + arg_types = types; + + while (arg_types) { + switch (arg_types & SLJIT_DEF_MASK) { + case SLJIT_ARG_TYPE_F32: + float_arg_index--; + FAIL_IF(push_inst(compiler, STF | FD(float_arg_index) | S1(SLJIT_SP) | IMM(float_offset), MOVABLE_INS)); + float_offset -= sizeof(sljit_f64); + break; + case SLJIT_ARG_TYPE_F64: + float_arg_index--; + if (float_arg_index == 4 && double_arg_count == 4) { + FAIL_IF(push_inst(compiler, STF | FD(float_arg_index) | S1(SLJIT_SP) | IMM((16 + 7) * sizeof(sljit_sw)), MOVABLE_INS)); + FAIL_IF(push_inst(compiler, STF | FD(float_arg_index) | (1 << 25) | S1(SLJIT_SP) | IMM((16 + 8) * sizeof(sljit_sw)), MOVABLE_INS)); + } + else + FAIL_IF(push_inst(compiler, STDF | FD(float_arg_index) | S1(SLJIT_SP) | IMM(float_offset), MOVABLE_INS)); + float_offset -= sizeof(sljit_f64); + break; + default: + break; + } + + arg_types >>= SLJIT_DEF_SHIFT; + } + + float_offset = (16 + 6) * sizeof(sljit_sw); + + while (types) { + switch (types & SLJIT_DEF_MASK) { + case SLJIT_ARG_TYPE_F32: + reg_index--; + if (reg_index < 14) + FAIL_IF(push_inst(compiler, LDUW | DA(reg_index) | S1(SLJIT_SP) | IMM(float_offset), reg_index)); + float_offset -= sizeof(sljit_f64); + break; + case SLJIT_ARG_TYPE_F64: + reg_index -= 2; + if (reg_index < 14) { + if ((reg_index & 0x1) != 0) { + FAIL_IF(push_inst(compiler, LDUW | DA(reg_index) | S1(SLJIT_SP) | IMM(float_offset), reg_index)); + if (reg_index < 13) + FAIL_IF(push_inst(compiler, LDUW | DA(reg_index + 1) | S1(SLJIT_SP) | IMM(float_offset + sizeof(sljit_sw)), reg_index + 1)); + } + else + FAIL_IF(push_inst(compiler, LDD | DA(reg_index) | S1(SLJIT_SP) | IMM(float_offset), reg_index)); + } + float_offset -= sizeof(sljit_f64); + break; + default: + reg_index--; + word_reg_index--; + + if (reg_index != word_reg_index) { + if (reg_index < 14) + FAIL_IF(push_inst(compiler, OR | DA(reg_index) | S1(0) | S2A(word_reg_index), reg_index)); + else + FAIL_IF(push_inst(compiler, STW | DA(word_reg_index) | S1(SLJIT_SP) | IMM(92), word_reg_index)); + } + break; + } + + types >>= SLJIT_DEF_SHIFT; + } + + return SLJIT_SUCCESS; +} + +static SLJIT_INLINE sljit_s32 emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw init_value) +{ + FAIL_IF(push_inst(compiler, SETHI | D(dst) | ((init_value >> 10) & 0x3fffff), DR(dst))); + return push_inst(compiler, OR | D(dst) | S1(dst) | IMM_ARG | (init_value & 0x3ff), DR(dst)); +} + +SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset) +{ + sljit_ins *inst = (sljit_ins *)addr; + + SLJIT_ASSERT(((inst[0] & 0xc1c00000) == 0x01000000) && ((inst[1] & 0xc1f82000) == 0x80102000)); + inst[0] = (inst[0] & 0xffc00000) | ((new_target >> 10) & 0x3fffff); + inst[1] = (inst[1] & 0xfffffc00) | (new_target & 0x3ff); + inst = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset); + SLJIT_CACHE_FLUSH(inst, inst + 2); +} + +SLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_constant, sljit_sw executable_offset) +{ + sljit_ins *inst = (sljit_ins *)addr; + + SLJIT_ASSERT(((inst[0] & 0xc1c00000) == 0x01000000) && ((inst[1] & 0xc1f82000) == 0x80102000)); + inst[0] = (inst[0] & 0xffc00000) | ((new_constant >> 10) & 0x3fffff); + inst[1] = (inst[1] & 0xfffffc00) | (new_constant & 0x3ff); + inst = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset); + SLJIT_CACHE_FLUSH(inst, inst + 2); +} diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeSPARC_common.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeSPARC_common.c new file mode 100755 index 000000000..bfa4ecede --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeSPARC_common.c @@ -0,0 +1,1536 @@ +/* + * Stack-less Just-In-Time compiler + * + * Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +SLJIT_API_FUNC_ATTRIBUTE const char* sljit_get_platform_name(void) +{ + return "SPARC" SLJIT_CPUINFO; +} + +/* Length of an instruction word + Both for sparc-32 and sparc-64 */ +typedef sljit_u32 sljit_ins; + +#if (defined SLJIT_CACHE_FLUSH_OWN_IMPL && SLJIT_CACHE_FLUSH_OWN_IMPL) + +static void sparc_cache_flush(sljit_ins *from, sljit_ins *to) +{ +#if defined(__SUNPRO_C) && __SUNPRO_C < 0x590 + __asm ( + /* if (from == to) return */ + "cmp %i0, %i1\n" + "be .leave\n" + "nop\n" + + /* loop until from >= to */ + ".mainloop:\n" + "flush %i0\n" + "add %i0, 8, %i0\n" + "cmp %i0, %i1\n" + "bcs .mainloop\n" + "nop\n" + + /* The comparison was done above. */ + "bne .leave\n" + /* nop is not necessary here, since the + sub operation has no side effect. */ + "sub %i0, 4, %i0\n" + "flush %i0\n" + ".leave:" + ); +#else + if (SLJIT_UNLIKELY(from == to)) + return; + + do { + __asm__ volatile ( + "flush %0\n" + : : "r"(from) + ); + /* Operates at least on doubleword. */ + from += 2; + } while (from < to); + + if (from == to) { + /* Flush the last word. */ + from --; + __asm__ volatile ( + "flush %0\n" + : : "r"(from) + ); + } +#endif +} + +#endif /* (defined SLJIT_CACHE_FLUSH_OWN_IMPL && SLJIT_CACHE_FLUSH_OWN_IMPL) */ + +/* TMP_REG2 is not used by getput_arg */ +#define TMP_REG1 (SLJIT_NUMBER_OF_REGISTERS + 2) +#define TMP_REG2 (SLJIT_NUMBER_OF_REGISTERS + 3) +#define TMP_REG3 (SLJIT_NUMBER_OF_REGISTERS + 4) +/* This register is modified by calls, which affects the instruction + in the delay slot if it is used as a source register. */ +#define TMP_LINK (SLJIT_NUMBER_OF_REGISTERS + 5) + +#define TMP_FREG1 (SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1) +#define TMP_FREG2 (SLJIT_NUMBER_OF_FLOAT_REGISTERS + 2) + +static const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 6] = { + 0, 8, 9, 10, 11, 29, 28, 27, 23, 22, 21, 20, 19, 18, 17, 16, 26, 25, 24, 14, 1, 12, 13, 15 +}; + +static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 3] = { + 0, 0, 2, 4, 6, 8, 10, 12, 14 +}; + +/* --------------------------------------------------------------------- */ +/* Instrucion forms */ +/* --------------------------------------------------------------------- */ + +#define D(d) (reg_map[d] << 25) +#define FD(d) (freg_map[d] << 25) +#define FDN(d) ((freg_map[d] | 0x1) << 25) +#define DA(d) ((d) << 25) +#define S1(s1) (reg_map[s1] << 14) +#define FS1(s1) (freg_map[s1] << 14) +#define S1A(s1) ((s1) << 14) +#define S2(s2) (reg_map[s2]) +#define FS2(s2) (freg_map[s2]) +#define FS2N(s2) (freg_map[s2] | 0x1) +#define S2A(s2) (s2) +#define IMM_ARG 0x2000 +#define DOP(op) ((op) << 5) +#define IMM(imm) (((imm) & 0x1fff) | IMM_ARG) + +#define DR(dr) (reg_map[dr]) +#define OPC1(opcode) ((opcode) << 30) +#define OPC2(opcode) ((opcode) << 22) +#define OPC3(opcode) ((opcode) << 19) +#define SET_FLAGS OPC3(0x10) + +#define ADD (OPC1(0x2) | OPC3(0x00)) +#define ADDC (OPC1(0x2) | OPC3(0x08)) +#define AND (OPC1(0x2) | OPC3(0x01)) +#define ANDN (OPC1(0x2) | OPC3(0x05)) +#define CALL (OPC1(0x1)) +#define FABSS (OPC1(0x2) | OPC3(0x34) | DOP(0x09)) +#define FADDD (OPC1(0x2) | OPC3(0x34) | DOP(0x42)) +#define FADDS (OPC1(0x2) | OPC3(0x34) | DOP(0x41)) +#define FCMPD (OPC1(0x2) | OPC3(0x35) | DOP(0x52)) +#define FCMPS (OPC1(0x2) | OPC3(0x35) | DOP(0x51)) +#define FDIVD (OPC1(0x2) | OPC3(0x34) | DOP(0x4e)) +#define FDIVS (OPC1(0x2) | OPC3(0x34) | DOP(0x4d)) +#define FDTOI (OPC1(0x2) | OPC3(0x34) | DOP(0xd2)) +#define FDTOS (OPC1(0x2) | OPC3(0x34) | DOP(0xc6)) +#define FITOD (OPC1(0x2) | OPC3(0x34) | DOP(0xc8)) +#define FITOS (OPC1(0x2) | OPC3(0x34) | DOP(0xc4)) +#define FMOVS (OPC1(0x2) | OPC3(0x34) | DOP(0x01)) +#define FMULD (OPC1(0x2) | OPC3(0x34) | DOP(0x4a)) +#define FMULS (OPC1(0x2) | OPC3(0x34) | DOP(0x49)) +#define FNEGS (OPC1(0x2) | OPC3(0x34) | DOP(0x05)) +#define FSTOD (OPC1(0x2) | OPC3(0x34) | DOP(0xc9)) +#define FSTOI (OPC1(0x2) | OPC3(0x34) | DOP(0xd1)) +#define FSUBD (OPC1(0x2) | OPC3(0x34) | DOP(0x46)) +#define FSUBS (OPC1(0x2) | OPC3(0x34) | DOP(0x45)) +#define JMPL (OPC1(0x2) | OPC3(0x38)) +#define LDD (OPC1(0x3) | OPC3(0x03)) +#define LDUW (OPC1(0x3) | OPC3(0x00)) +#define NOP (OPC1(0x0) | OPC2(0x04)) +#define OR (OPC1(0x2) | OPC3(0x02)) +#define ORN (OPC1(0x2) | OPC3(0x06)) +#define RDY (OPC1(0x2) | OPC3(0x28) | S1A(0)) +#define RESTORE (OPC1(0x2) | OPC3(0x3d)) +#define SAVE (OPC1(0x2) | OPC3(0x3c)) +#define SETHI (OPC1(0x0) | OPC2(0x04)) +#define SLL (OPC1(0x2) | OPC3(0x25)) +#define SLLX (OPC1(0x2) | OPC3(0x25) | (1 << 12)) +#define SRA (OPC1(0x2) | OPC3(0x27)) +#define SRAX (OPC1(0x2) | OPC3(0x27) | (1 << 12)) +#define SRL (OPC1(0x2) | OPC3(0x26)) +#define SRLX (OPC1(0x2) | OPC3(0x26) | (1 << 12)) +#define STDF (OPC1(0x3) | OPC3(0x27)) +#define STF (OPC1(0x3) | OPC3(0x24)) +#define STW (OPC1(0x3) | OPC3(0x04)) +#define SUB (OPC1(0x2) | OPC3(0x04)) +#define SUBC (OPC1(0x2) | OPC3(0x0c)) +#define TA (OPC1(0x2) | OPC3(0x3a) | (8 << 25)) +#define WRY (OPC1(0x2) | OPC3(0x30) | DA(0)) +#define XOR (OPC1(0x2) | OPC3(0x03)) +#define XNOR (OPC1(0x2) | OPC3(0x07)) + +#if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) +#define MAX_DISP (0x1fffff) +#define MIN_DISP (-0x200000) +#define DISP_MASK (0x3fffff) + +#define BICC (OPC1(0x0) | OPC2(0x2)) +#define FBFCC (OPC1(0x0) | OPC2(0x6)) +#define SLL_W SLL +#define SDIV (OPC1(0x2) | OPC3(0x0f)) +#define SMUL (OPC1(0x2) | OPC3(0x0b)) +#define UDIV (OPC1(0x2) | OPC3(0x0e)) +#define UMUL (OPC1(0x2) | OPC3(0x0a)) +#else +#define SLL_W SLLX +#endif + +#define SIMM_MAX (0x0fff) +#define SIMM_MIN (-0x1000) + +/* dest_reg is the absolute name of the register + Useful for reordering instructions in the delay slot. */ +static sljit_s32 push_inst(struct sljit_compiler *compiler, sljit_ins ins, sljit_s32 delay_slot) +{ + sljit_ins *ptr; + SLJIT_ASSERT((delay_slot & DST_INS_MASK) == UNMOVABLE_INS + || (delay_slot & DST_INS_MASK) == MOVABLE_INS + || (delay_slot & DST_INS_MASK) == ((ins >> 25) & 0x1f)); + ptr = (sljit_ins*)ensure_buf(compiler, sizeof(sljit_ins)); + FAIL_IF(!ptr); + *ptr = ins; + compiler->size++; + compiler->delay_slot = delay_slot; + return SLJIT_SUCCESS; +} + +static SLJIT_INLINE sljit_ins* detect_jump_type(struct sljit_jump *jump, sljit_ins *code_ptr, sljit_ins *code, sljit_sw executable_offset) +{ + sljit_sw diff; + sljit_uw target_addr; + sljit_ins *inst; + sljit_ins saved_inst; + + if (jump->flags & SLJIT_REWRITABLE_JUMP) + return code_ptr; + + if (jump->flags & JUMP_ADDR) + target_addr = jump->u.target; + else { + SLJIT_ASSERT(jump->flags & JUMP_LABEL); + target_addr = (sljit_uw)(code + jump->u.label->size) + (sljit_uw)executable_offset; + } + inst = (sljit_ins*)jump->addr; + +#if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) + if (jump->flags & IS_CALL) { + /* Call is always patchable on sparc 32. */ + jump->flags |= PATCH_CALL; + if (jump->flags & IS_MOVABLE) { + inst[0] = inst[-1]; + inst[-1] = CALL; + jump->addr -= sizeof(sljit_ins); + return inst; + } + inst[0] = CALL; + inst[1] = NOP; + return inst + 1; + } +#else + /* Both calls and BPr instructions shall not pass this point. */ +#error "Implementation required" +#endif + + if (jump->flags & IS_COND) + inst--; + + diff = ((sljit_sw)target_addr - (sljit_sw)(inst - 1) - executable_offset) >> 2; + + if (jump->flags & IS_MOVABLE) { + if (diff <= MAX_DISP && diff >= MIN_DISP) { + jump->flags |= PATCH_B; + inst--; + if (jump->flags & IS_COND) { + saved_inst = inst[0]; + inst[0] = inst[1] ^ (1 << 28); + inst[1] = saved_inst; + } else { + inst[1] = inst[0]; + inst[0] = BICC | DA(0x8); + } + jump->addr = (sljit_uw)inst; + return inst + 1; + } + } + + diff += sizeof(sljit_ins); + + if (diff <= MAX_DISP && diff >= MIN_DISP) { + jump->flags |= PATCH_B; + if (jump->flags & IS_COND) + inst[0] ^= (1 << 28); + else + inst[0] = BICC | DA(0x8); + inst[1] = NOP; + jump->addr = (sljit_uw)inst; + return inst + 1; + } + + return code_ptr; +} + +SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler) +{ + struct sljit_memory_fragment *buf; + sljit_ins *code; + sljit_ins *code_ptr; + sljit_ins *buf_ptr; + sljit_ins *buf_end; + sljit_uw word_count; + sljit_uw next_addr; + sljit_sw executable_offset; + sljit_uw addr; + + struct sljit_label *label; + struct sljit_jump *jump; + struct sljit_const *const_; + struct sljit_put_label *put_label; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_generate_code(compiler)); + reverse_buf(compiler); + + code = (sljit_ins*)SLJIT_MALLOC_EXEC(compiler->size * sizeof(sljit_ins)); + PTR_FAIL_WITH_EXEC_IF(code); + buf = compiler->buf; + + code_ptr = code; + word_count = 0; + next_addr = 0; + executable_offset = SLJIT_EXEC_OFFSET(code); + + label = compiler->labels; + jump = compiler->jumps; + const_ = compiler->consts; + put_label = compiler->put_labels; + + do { + buf_ptr = (sljit_ins*)buf->memory; + buf_end = buf_ptr + (buf->used_size >> 2); + do { + *code_ptr = *buf_ptr++; + if (next_addr == word_count) { + SLJIT_ASSERT(!label || label->size >= word_count); + SLJIT_ASSERT(!jump || jump->addr >= word_count); + SLJIT_ASSERT(!const_ || const_->addr >= word_count); + SLJIT_ASSERT(!put_label || put_label->addr >= word_count); + + /* These structures are ordered by their address. */ + if (label && label->size == word_count) { + /* Just recording the address. */ + label->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); + label->size = code_ptr - code; + label = label->next; + } + if (jump && jump->addr == word_count) { +#if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) + jump->addr = (sljit_uw)(code_ptr - 3); +#else + jump->addr = (sljit_uw)(code_ptr - 6); +#endif + code_ptr = detect_jump_type(jump, code_ptr, code, executable_offset); + jump = jump->next; + } + if (const_ && const_->addr == word_count) { + /* Just recording the address. */ + const_->addr = (sljit_uw)code_ptr; + const_ = const_->next; + } + if (put_label && put_label->addr == word_count) { + SLJIT_ASSERT(put_label->label); + put_label->addr = (sljit_uw)code_ptr; + put_label = put_label->next; + } + next_addr = compute_next_addr(label, jump, const_, put_label); + } + code_ptr ++; + word_count ++; + } while (buf_ptr < buf_end); + + buf = buf->next; + } while (buf); + + if (label && label->size == word_count) { + label->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); + label->size = code_ptr - code; + label = label->next; + } + + SLJIT_ASSERT(!label); + SLJIT_ASSERT(!jump); + SLJIT_ASSERT(!const_); + SLJIT_ASSERT(!put_label); + SLJIT_ASSERT(code_ptr - code <= (sljit_s32)compiler->size); + + jump = compiler->jumps; + while (jump) { + do { + addr = (jump->flags & JUMP_LABEL) ? jump->u.label->addr : jump->u.target; + buf_ptr = (sljit_ins *)jump->addr; + + if (jump->flags & PATCH_CALL) { + addr = (sljit_sw)(addr - (sljit_uw)SLJIT_ADD_EXEC_OFFSET(buf_ptr, executable_offset)) >> 2; + SLJIT_ASSERT((sljit_sw)addr <= 0x1fffffff && (sljit_sw)addr >= -0x20000000); + buf_ptr[0] = CALL | (addr & 0x3fffffff); + break; + } + if (jump->flags & PATCH_B) { + addr = (sljit_sw)(addr - (sljit_uw)SLJIT_ADD_EXEC_OFFSET(buf_ptr, executable_offset)) >> 2; + SLJIT_ASSERT((sljit_sw)addr <= MAX_DISP && (sljit_sw)addr >= MIN_DISP); + buf_ptr[0] = (buf_ptr[0] & ~DISP_MASK) | (addr & DISP_MASK); + break; + } + + /* Set the fields of immediate loads. */ +#if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) + SLJIT_ASSERT(((buf_ptr[0] & 0xc1cfffff) == 0x01000000) && ((buf_ptr[1] & 0xc1f83fff) == 0x80102000)); + buf_ptr[0] |= (addr >> 10) & 0x3fffff; + buf_ptr[1] |= addr & 0x3ff; +#else +#error "Implementation required" +#endif + } while (0); + jump = jump->next; + } + + put_label = compiler->put_labels; + while (put_label) { + addr = put_label->label->addr; + buf_ptr = (sljit_ins *)put_label->addr; + +#if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) + SLJIT_ASSERT(((buf_ptr[0] & 0xc1cfffff) == 0x01000000) && ((buf_ptr[1] & 0xc1f83fff) == 0x80102000)); + buf_ptr[0] |= (addr >> 10) & 0x3fffff; + buf_ptr[1] |= addr & 0x3ff; +#else +#error "Implementation required" +#endif + put_label = put_label->next; + } + + compiler->error = SLJIT_ERR_COMPILED; + compiler->executable_offset = executable_offset; + compiler->executable_size = (code_ptr - code) * sizeof(sljit_ins); + + code = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(code, executable_offset); + code_ptr = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); + + SLJIT_CACHE_FLUSH(code, code_ptr); + return code; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type) +{ + switch (feature_type) { + case SLJIT_HAS_FPU: +#ifdef SLJIT_IS_FPU_AVAILABLE + return SLJIT_IS_FPU_AVAILABLE; +#else + /* Available by default. */ + return 1; +#endif + +#if (defined SLJIT_CONFIG_SPARC_64 && SLJIT_CONFIG_SPARC_64) + case SLJIT_HAS_CMOV: + return 1; +#endif + + default: + return 0; + } +} + +/* --------------------------------------------------------------------- */ +/* Entry, exit */ +/* --------------------------------------------------------------------- */ + +/* Creates an index in data_transfer_insts array. */ +#define LOAD_DATA 0x01 +#define WORD_DATA 0x00 +#define BYTE_DATA 0x02 +#define HALF_DATA 0x04 +#define INT_DATA 0x06 +#define SIGNED_DATA 0x08 +/* Separates integer and floating point registers */ +#define GPR_REG 0x0f +#define DOUBLE_DATA 0x10 +#define SINGLE_DATA 0x12 + +#define MEM_MASK 0x1f + +#define ARG_TEST 0x00020 +#define ALT_KEEP_CACHE 0x00040 +#define CUMULATIVE_OP 0x00080 +#define IMM_OP 0x00100 +#define SRC2_IMM 0x00200 + +#define REG_DEST 0x00400 +#define REG2_SOURCE 0x00800 +#define SLOW_SRC1 0x01000 +#define SLOW_SRC2 0x02000 +#define SLOW_DEST 0x04000 + +/* SET_FLAGS (0x10 << 19) also belong here! */ + +#if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) +#include "sljitNativeSPARC_32.c" +#else +#include "sljitNativeSPARC_64.c" +#endif + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compiler, + sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds, + sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_enter(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size)); + set_emit_enter(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size); + + local_size = (local_size + SLJIT_LOCALS_OFFSET + 7) & ~0x7; + compiler->local_size = local_size; + + if (local_size <= SIMM_MAX) { + FAIL_IF(push_inst(compiler, SAVE | D(SLJIT_SP) | S1(SLJIT_SP) | IMM(-local_size), UNMOVABLE_INS)); + } + else { + FAIL_IF(load_immediate(compiler, TMP_REG1, -local_size)); + FAIL_IF(push_inst(compiler, SAVE | D(SLJIT_SP) | S1(SLJIT_SP) | S2(TMP_REG1), UNMOVABLE_INS)); + } + + /* Arguments are in their appropriate registers. */ + + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_set_context(struct sljit_compiler *compiler, + sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds, + sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size) +{ + CHECK_ERROR(); + CHECK(check_sljit_set_context(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size)); + set_set_context(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size); + + compiler->local_size = (local_size + SLJIT_LOCALS_OFFSET + 7) & ~0x7; + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_return(compiler, op, src, srcw)); + + if (op != SLJIT_MOV || !FAST_IS_REG(src)) { + FAIL_IF(emit_mov_before_return(compiler, op, src, srcw)); + src = SLJIT_R0; + } + + FAIL_IF(push_inst(compiler, JMPL | D(0) | S1A(31) | IMM(8), UNMOVABLE_INS)); + return push_inst(compiler, RESTORE | D(SLJIT_R0) | S1(src) | S2(0), UNMOVABLE_INS); +} + +/* --------------------------------------------------------------------- */ +/* Operators */ +/* --------------------------------------------------------------------- */ + +#if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) +#define ARCH_32_64(a, b) a +#else +#define ARCH_32_64(a, b) b +#endif + +static const sljit_ins data_transfer_insts[16 + 4] = { +/* u w s */ ARCH_32_64(OPC1(3) | OPC3(0x04) /* stw */, OPC1(3) | OPC3(0x0e) /* stx */), +/* u w l */ ARCH_32_64(OPC1(3) | OPC3(0x00) /* lduw */, OPC1(3) | OPC3(0x0b) /* ldx */), +/* u b s */ OPC1(3) | OPC3(0x05) /* stb */, +/* u b l */ OPC1(3) | OPC3(0x01) /* ldub */, +/* u h s */ OPC1(3) | OPC3(0x06) /* sth */, +/* u h l */ OPC1(3) | OPC3(0x02) /* lduh */, +/* u i s */ OPC1(3) | OPC3(0x04) /* stw */, +/* u i l */ OPC1(3) | OPC3(0x00) /* lduw */, + +/* s w s */ ARCH_32_64(OPC1(3) | OPC3(0x04) /* stw */, OPC1(3) | OPC3(0x0e) /* stx */), +/* s w l */ ARCH_32_64(OPC1(3) | OPC3(0x00) /* lduw */, OPC1(3) | OPC3(0x0b) /* ldx */), +/* s b s */ OPC1(3) | OPC3(0x05) /* stb */, +/* s b l */ OPC1(3) | OPC3(0x09) /* ldsb */, +/* s h s */ OPC1(3) | OPC3(0x06) /* sth */, +/* s h l */ OPC1(3) | OPC3(0x0a) /* ldsh */, +/* s i s */ OPC1(3) | OPC3(0x04) /* stw */, +/* s i l */ ARCH_32_64(OPC1(3) | OPC3(0x00) /* lduw */, OPC1(3) | OPC3(0x08) /* ldsw */), + +/* d s */ OPC1(3) | OPC3(0x27), +/* d l */ OPC1(3) | OPC3(0x23), +/* s s */ OPC1(3) | OPC3(0x24), +/* s l */ OPC1(3) | OPC3(0x20), +}; + +#undef ARCH_32_64 + +/* Can perform an operation using at most 1 instruction. */ +static sljit_s32 getput_arg_fast(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg, sljit_s32 arg, sljit_sw argw) +{ + SLJIT_ASSERT(arg & SLJIT_MEM); + + if ((!(arg & OFFS_REG_MASK) && argw <= SIMM_MAX && argw >= SIMM_MIN) + || ((arg & OFFS_REG_MASK) && (argw & 0x3) == 0)) { + /* Works for both absoulte and relative addresses (immediate case). */ + if (SLJIT_UNLIKELY(flags & ARG_TEST)) + return 1; + FAIL_IF(push_inst(compiler, data_transfer_insts[flags & MEM_MASK] + | ((flags & MEM_MASK) <= GPR_REG ? D(reg) : FD(reg)) + | S1(arg & REG_MASK) | ((arg & OFFS_REG_MASK) ? S2(OFFS_REG(arg)) : IMM(argw)), + ((flags & MEM_MASK) <= GPR_REG && (flags & LOAD_DATA)) ? DR(reg) : MOVABLE_INS)); + return -1; + } + return 0; +} + +/* See getput_arg below. + Note: can_cache is called only for binary operators. Those + operators always uses word arguments without write back. */ +static sljit_s32 can_cache(sljit_s32 arg, sljit_sw argw, sljit_s32 next_arg, sljit_sw next_argw) +{ + SLJIT_ASSERT((arg & SLJIT_MEM) && (next_arg & SLJIT_MEM)); + + /* Simple operation except for updates. */ + if (arg & OFFS_REG_MASK) { + argw &= 0x3; + SLJIT_ASSERT(argw); + next_argw &= 0x3; + if ((arg & OFFS_REG_MASK) == (next_arg & OFFS_REG_MASK) && argw == next_argw) + return 1; + return 0; + } + + if (((next_argw - argw) <= SIMM_MAX && (next_argw - argw) >= SIMM_MIN)) + return 1; + return 0; +} + +/* Emit the necessary instructions. See can_cache above. */ +static sljit_s32 getput_arg(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg, sljit_s32 arg, sljit_sw argw, sljit_s32 next_arg, sljit_sw next_argw) +{ + sljit_s32 base, arg2, delay_slot; + sljit_ins dest; + + SLJIT_ASSERT(arg & SLJIT_MEM); + if (!(next_arg & SLJIT_MEM)) { + next_arg = 0; + next_argw = 0; + } + + base = arg & REG_MASK; + if (SLJIT_UNLIKELY(arg & OFFS_REG_MASK)) { + argw &= 0x3; + + /* Using the cache. */ + if (((SLJIT_MEM | (arg & OFFS_REG_MASK)) == compiler->cache_arg) && (argw == compiler->cache_argw)) + arg2 = TMP_REG3; + else { + if ((arg & OFFS_REG_MASK) == (next_arg & OFFS_REG_MASK) && argw == (next_argw & 0x3)) { + compiler->cache_arg = SLJIT_MEM | (arg & OFFS_REG_MASK); + compiler->cache_argw = argw; + arg2 = TMP_REG3; + } + else if ((flags & LOAD_DATA) && ((flags & MEM_MASK) <= GPR_REG) && reg != base && reg != OFFS_REG(arg)) + arg2 = reg; + else /* It must be a mov operation, so tmp1 must be free to use. */ + arg2 = TMP_REG1; + FAIL_IF(push_inst(compiler, SLL_W | D(arg2) | S1(OFFS_REG(arg)) | IMM_ARG | argw, DR(arg2))); + } + } + else { + /* Using the cache. */ + if ((compiler->cache_arg == SLJIT_MEM) && (argw - compiler->cache_argw) <= SIMM_MAX && (argw - compiler->cache_argw) >= SIMM_MIN) { + if (argw != compiler->cache_argw) { + FAIL_IF(push_inst(compiler, ADD | D(TMP_REG3) | S1(TMP_REG3) | IMM(argw - compiler->cache_argw), DR(TMP_REG3))); + compiler->cache_argw = argw; + } + arg2 = TMP_REG3; + } else { + if ((next_argw - argw) <= SIMM_MAX && (next_argw - argw) >= SIMM_MIN) { + compiler->cache_arg = SLJIT_MEM; + compiler->cache_argw = argw; + arg2 = TMP_REG3; + } + else if ((flags & LOAD_DATA) && ((flags & MEM_MASK) <= GPR_REG) && reg != base) + arg2 = reg; + else /* It must be a mov operation, so tmp1 must be free to use. */ + arg2 = TMP_REG1; + FAIL_IF(load_immediate(compiler, arg2, argw)); + } + } + + dest = ((flags & MEM_MASK) <= GPR_REG ? D(reg) : FD(reg)); + delay_slot = ((flags & MEM_MASK) <= GPR_REG && (flags & LOAD_DATA)) ? DR(reg) : MOVABLE_INS; + if (!base) + return push_inst(compiler, data_transfer_insts[flags & MEM_MASK] | dest | S1(arg2) | IMM(0), delay_slot); + return push_inst(compiler, data_transfer_insts[flags & MEM_MASK] | dest | S1(base) | S2(arg2), delay_slot); +} + +static SLJIT_INLINE sljit_s32 emit_op_mem(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg, sljit_s32 arg, sljit_sw argw) +{ + if (getput_arg_fast(compiler, flags, reg, arg, argw)) + return compiler->error; + compiler->cache_arg = 0; + compiler->cache_argw = 0; + return getput_arg(compiler, flags, reg, arg, argw, 0, 0); +} + +static SLJIT_INLINE sljit_s32 emit_op_mem2(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg, sljit_s32 arg1, sljit_sw arg1w, sljit_s32 arg2, sljit_sw arg2w) +{ + if (getput_arg_fast(compiler, flags, reg, arg1, arg1w)) + return compiler->error; + return getput_arg(compiler, flags, reg, arg1, arg1w, arg2, arg2w); +} + +static sljit_s32 emit_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 flags, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + /* arg1 goes to TMP_REG1 or src reg + arg2 goes to TMP_REG2, imm or src reg + TMP_REG3 can be used for caching + result goes to TMP_REG2, so put result can use TMP_REG1 and TMP_REG3. */ + sljit_s32 dst_r = TMP_REG2; + sljit_s32 src1_r; + sljit_sw src2_r = 0; + sljit_s32 sugg_src2_r = TMP_REG2; + + if (!(flags & ALT_KEEP_CACHE)) { + compiler->cache_arg = 0; + compiler->cache_argw = 0; + } + + if (dst != SLJIT_UNUSED) { + if (FAST_IS_REG(dst)) { + dst_r = dst; + flags |= REG_DEST; + if (op >= SLJIT_MOV && op <= SLJIT_MOV_P) + sugg_src2_r = dst_r; + } + else if ((dst & SLJIT_MEM) && !getput_arg_fast(compiler, flags | ARG_TEST, TMP_REG1, dst, dstw)) + flags |= SLOW_DEST; + } + + if (flags & IMM_OP) { + if ((src2 & SLJIT_IMM) && src2w) { + if (src2w <= SIMM_MAX && src2w >= SIMM_MIN) { + flags |= SRC2_IMM; + src2_r = src2w; + } + } + if (!(flags & SRC2_IMM) && (flags & CUMULATIVE_OP) && (src1 & SLJIT_IMM) && src1w) { + if (src1w <= SIMM_MAX && src1w >= SIMM_MIN) { + flags |= SRC2_IMM; + src2_r = src1w; + + /* And swap arguments. */ + src1 = src2; + src1w = src2w; + src2 = SLJIT_IMM; + /* src2w = src2_r unneeded. */ + } + } + } + + /* Source 1. */ + if (FAST_IS_REG(src1)) + src1_r = src1; + else if (src1 & SLJIT_IMM) { + if (src1w) { + FAIL_IF(load_immediate(compiler, TMP_REG1, src1w)); + src1_r = TMP_REG1; + } + else + src1_r = 0; + } + else { + if (getput_arg_fast(compiler, flags | LOAD_DATA, TMP_REG1, src1, src1w)) + FAIL_IF(compiler->error); + else + flags |= SLOW_SRC1; + src1_r = TMP_REG1; + } + + /* Source 2. */ + if (FAST_IS_REG(src2)) { + src2_r = src2; + flags |= REG2_SOURCE; + if (!(flags & REG_DEST) && op >= SLJIT_MOV && op <= SLJIT_MOV_P) + dst_r = src2_r; + } + else if (src2 & SLJIT_IMM) { + if (!(flags & SRC2_IMM)) { + if (src2w) { + FAIL_IF(load_immediate(compiler, sugg_src2_r, src2w)); + src2_r = sugg_src2_r; + } + else { + src2_r = 0; + if ((op >= SLJIT_MOV && op <= SLJIT_MOV_P) && (dst & SLJIT_MEM)) + dst_r = 0; + } + } + } + else { + if (getput_arg_fast(compiler, flags | LOAD_DATA, sugg_src2_r, src2, src2w)) + FAIL_IF(compiler->error); + else + flags |= SLOW_SRC2; + src2_r = sugg_src2_r; + } + + if ((flags & (SLOW_SRC1 | SLOW_SRC2)) == (SLOW_SRC1 | SLOW_SRC2)) { + SLJIT_ASSERT(src2_r == TMP_REG2); + if (!can_cache(src1, src1w, src2, src2w) && can_cache(src1, src1w, dst, dstw)) { + FAIL_IF(getput_arg(compiler, flags | LOAD_DATA, TMP_REG2, src2, src2w, src1, src1w)); + FAIL_IF(getput_arg(compiler, flags | LOAD_DATA, TMP_REG1, src1, src1w, dst, dstw)); + } + else { + FAIL_IF(getput_arg(compiler, flags | LOAD_DATA, TMP_REG1, src1, src1w, src2, src2w)); + FAIL_IF(getput_arg(compiler, flags | LOAD_DATA, TMP_REG2, src2, src2w, dst, dstw)); + } + } + else if (flags & SLOW_SRC1) + FAIL_IF(getput_arg(compiler, flags | LOAD_DATA, TMP_REG1, src1, src1w, dst, dstw)); + else if (flags & SLOW_SRC2) + FAIL_IF(getput_arg(compiler, flags | LOAD_DATA, sugg_src2_r, src2, src2w, dst, dstw)); + + FAIL_IF(emit_single_op(compiler, op, flags, dst_r, src1_r, src2_r)); + + if (dst & SLJIT_MEM) { + if (!(flags & SLOW_DEST)) { + getput_arg_fast(compiler, flags, dst_r, dst, dstw); + return compiler->error; + } + return getput_arg(compiler, flags, dst_r, dst, dstw, 0, 0); + } + + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compiler, sljit_s32 op) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_op0(compiler, op)); + + op = GET_OPCODE(op); + switch (op) { + case SLJIT_BREAKPOINT: + return push_inst(compiler, TA, UNMOVABLE_INS); + case SLJIT_NOP: + return push_inst(compiler, NOP, UNMOVABLE_INS); + case SLJIT_LMUL_UW: + case SLJIT_LMUL_SW: +#if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) + FAIL_IF(push_inst(compiler, (op == SLJIT_LMUL_UW ? UMUL : SMUL) | D(SLJIT_R0) | S1(SLJIT_R0) | S2(SLJIT_R1), DR(SLJIT_R0))); + return push_inst(compiler, RDY | D(SLJIT_R1), DR(SLJIT_R1)); +#else +#error "Implementation required" +#endif + case SLJIT_DIVMOD_UW: + case SLJIT_DIVMOD_SW: + case SLJIT_DIV_UW: + case SLJIT_DIV_SW: + SLJIT_COMPILE_ASSERT((SLJIT_DIVMOD_UW & 0x2) == 0 && SLJIT_DIV_UW - 0x2 == SLJIT_DIVMOD_UW, bad_div_opcode_assignments); +#if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) + if ((op | 0x2) == SLJIT_DIV_UW) + FAIL_IF(push_inst(compiler, WRY | S1(0), MOVABLE_INS)); + else { + FAIL_IF(push_inst(compiler, SRA | D(TMP_REG1) | S1(SLJIT_R0) | IMM(31), DR(TMP_REG1))); + FAIL_IF(push_inst(compiler, WRY | S1(TMP_REG1), MOVABLE_INS)); + } + if (op <= SLJIT_DIVMOD_SW) + FAIL_IF(push_inst(compiler, OR | D(TMP_REG2) | S1(0) | S2(SLJIT_R0), DR(TMP_REG2))); + FAIL_IF(push_inst(compiler, ((op | 0x2) == SLJIT_DIV_UW ? UDIV : SDIV) | D(SLJIT_R0) | S1(SLJIT_R0) | S2(SLJIT_R1), DR(SLJIT_R0))); + if (op >= SLJIT_DIV_UW) + return SLJIT_SUCCESS; + FAIL_IF(push_inst(compiler, SMUL | D(SLJIT_R1) | S1(SLJIT_R0) | S2(SLJIT_R1), DR(SLJIT_R1))); + return push_inst(compiler, SUB | D(SLJIT_R1) | S1(TMP_REG2) | S2(SLJIT_R1), DR(SLJIT_R1)); +#else +#error "Implementation required" +#endif + } + + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + sljit_s32 flags = HAS_FLAGS(op) ? SET_FLAGS : 0; + + CHECK_ERROR(); + CHECK(check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw)); + ADJUST_LOCAL_OFFSET(dst, dstw); + ADJUST_LOCAL_OFFSET(src, srcw); + + if (dst == SLJIT_UNUSED && !HAS_FLAGS(op)) + return SLJIT_SUCCESS; + + op = GET_OPCODE(op); + switch (op) { + case SLJIT_MOV: + case SLJIT_MOV_P: + return emit_op(compiler, SLJIT_MOV, flags | WORD_DATA, dst, dstw, TMP_REG1, 0, src, srcw); + + case SLJIT_MOV_U32: + return emit_op(compiler, SLJIT_MOV_U32, flags | INT_DATA, dst, dstw, TMP_REG1, 0, src, srcw); + + case SLJIT_MOV_S32: + return emit_op(compiler, SLJIT_MOV_S32, flags | INT_DATA | SIGNED_DATA, dst, dstw, TMP_REG1, 0, src, srcw); + + case SLJIT_MOV_U8: + return emit_op(compiler, SLJIT_MOV_U8, flags | BYTE_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u8)srcw : srcw); + + case SLJIT_MOV_S8: + return emit_op(compiler, SLJIT_MOV_S8, flags | BYTE_DATA | SIGNED_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s8)srcw : srcw); + + case SLJIT_MOV_U16: + return emit_op(compiler, SLJIT_MOV_U16, flags | HALF_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u16)srcw : srcw); + + case SLJIT_MOV_S16: + return emit_op(compiler, SLJIT_MOV_S16, flags | HALF_DATA | SIGNED_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s16)srcw : srcw); + + case SLJIT_NOT: + case SLJIT_CLZ: + return emit_op(compiler, op, flags, dst, dstw, TMP_REG1, 0, src, srcw); + + case SLJIT_NEG: + return emit_op(compiler, SLJIT_SUB, flags | IMM_OP, dst, dstw, SLJIT_IMM, 0, src, srcw); + } + + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + sljit_s32 flags = HAS_FLAGS(op) ? SET_FLAGS : 0; + + CHECK_ERROR(); + CHECK(check_sljit_emit_op2(compiler, op, dst, dstw, src1, src1w, src2, src2w)); + ADJUST_LOCAL_OFFSET(dst, dstw); + ADJUST_LOCAL_OFFSET(src1, src1w); + ADJUST_LOCAL_OFFSET(src2, src2w); + + if (dst == SLJIT_UNUSED && !HAS_FLAGS(op)) + return SLJIT_SUCCESS; + + op = GET_OPCODE(op); + switch (op) { + case SLJIT_ADD: + case SLJIT_ADDC: + case SLJIT_MUL: + case SLJIT_AND: + case SLJIT_OR: + case SLJIT_XOR: + return emit_op(compiler, op, flags | CUMULATIVE_OP | IMM_OP, dst, dstw, src1, src1w, src2, src2w); + + case SLJIT_SUB: + case SLJIT_SUBC: + return emit_op(compiler, op, flags | IMM_OP, dst, dstw, src1, src1w, src2, src2w); + + case SLJIT_SHL: + case SLJIT_LSHR: + case SLJIT_ASHR: +#if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) + if (src2 & SLJIT_IMM) + src2w &= 0x1f; +#else + SLJIT_UNREACHABLE(); +#endif + return emit_op(compiler, op, flags | IMM_OP, dst, dstw, src1, src1w, src2, src2w); + } + + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg) +{ + CHECK_REG_INDEX(check_sljit_get_register_index(reg)); + return reg_map[reg]; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_float_register_index(sljit_s32 reg) +{ + CHECK_REG_INDEX(check_sljit_get_float_register_index(reg)); + return freg_map[reg]; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler, + void *instruction, sljit_s32 size) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_op_custom(compiler, instruction, size)); + + return push_inst(compiler, *(sljit_ins*)instruction, UNMOVABLE_INS); +} + +/* --------------------------------------------------------------------- */ +/* Floating point operators */ +/* --------------------------------------------------------------------- */ + +#define FLOAT_DATA(op) (DOUBLE_DATA | ((op & SLJIT_F32_OP) >> 7)) +#define SELECT_FOP(op, single, double) ((op & SLJIT_F32_OP) ? single : double) +#define FLOAT_TMP_MEM_OFFSET (22 * sizeof(sljit_sw)) + +static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_sw_from_f64(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + if (src & SLJIT_MEM) { + FAIL_IF(emit_op_mem2(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG1, src, srcw, dst, dstw)); + src = TMP_FREG1; + } + + FAIL_IF(push_inst(compiler, SELECT_FOP(op, FSTOI, FDTOI) | FD(TMP_FREG1) | FS2(src), MOVABLE_INS)); + + if (FAST_IS_REG(dst)) { + FAIL_IF(emit_op_mem2(compiler, SINGLE_DATA, TMP_FREG1, SLJIT_MEM1(SLJIT_SP), FLOAT_TMP_MEM_OFFSET, SLJIT_MEM1(SLJIT_SP), FLOAT_TMP_MEM_OFFSET)); + return emit_op_mem2(compiler, WORD_DATA | LOAD_DATA, dst, SLJIT_MEM1(SLJIT_SP), FLOAT_TMP_MEM_OFFSET, SLJIT_MEM1(SLJIT_SP), FLOAT_TMP_MEM_OFFSET); + } + + /* Store the integer value from a VFP register. */ + return emit_op_mem2(compiler, SINGLE_DATA, TMP_FREG1, dst, dstw, 0, 0); +} + +static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1; + + if (src & SLJIT_IMM) { +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32) + srcw = (sljit_s32)srcw; +#endif + FAIL_IF(load_immediate(compiler, TMP_REG1, srcw)); + src = TMP_REG1; + srcw = 0; + } + + if (FAST_IS_REG(src)) { + FAIL_IF(emit_op_mem2(compiler, WORD_DATA, src, SLJIT_MEM1(SLJIT_SP), FLOAT_TMP_MEM_OFFSET, SLJIT_MEM1(SLJIT_SP), FLOAT_TMP_MEM_OFFSET)); + src = SLJIT_MEM1(SLJIT_SP); + srcw = FLOAT_TMP_MEM_OFFSET; + } + + FAIL_IF(emit_op_mem2(compiler, SINGLE_DATA | LOAD_DATA, TMP_FREG1, src, srcw, dst, dstw)); + FAIL_IF(push_inst(compiler, SELECT_FOP(op, FITOS, FITOD) | FD(dst_r) | FS2(TMP_FREG1), MOVABLE_INS)); + + if (dst & SLJIT_MEM) + return emit_op_mem2(compiler, FLOAT_DATA(op), TMP_FREG1, dst, dstw, 0, 0); + return SLJIT_SUCCESS; +} + +static SLJIT_INLINE sljit_s32 sljit_emit_fop1_cmp(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + if (src1 & SLJIT_MEM) { + FAIL_IF(emit_op_mem2(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG1, src1, src1w, src2, src2w)); + src1 = TMP_FREG1; + } + + if (src2 & SLJIT_MEM) { + FAIL_IF(emit_op_mem2(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG2, src2, src2w, 0, 0)); + src2 = TMP_FREG2; + } + + return push_inst(compiler, SELECT_FOP(op, FCMPS, FCMPD) | FS1(src1) | FS2(src2), FCC_IS_SET | MOVABLE_INS); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + sljit_s32 dst_r; + + CHECK_ERROR(); + compiler->cache_arg = 0; + compiler->cache_argw = 0; + + SLJIT_COMPILE_ASSERT((SLJIT_F32_OP == 0x100) && !(DOUBLE_DATA & 0x2), float_transfer_bit_error); + SELECT_FOP1_OPERATION_WITH_CHECKS(compiler, op, dst, dstw, src, srcw); + + if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_F32) + op ^= SLJIT_F32_OP; + + dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1; + + if (src & SLJIT_MEM) { + FAIL_IF(emit_op_mem2(compiler, FLOAT_DATA(op) | LOAD_DATA, dst_r, src, srcw, dst, dstw)); + src = dst_r; + } + + switch (GET_OPCODE(op)) { + case SLJIT_MOV_F64: + if (src != dst_r) { + if (dst_r != TMP_FREG1) { + FAIL_IF(push_inst(compiler, FMOVS | FD(dst_r) | FS2(src), MOVABLE_INS)); + if (!(op & SLJIT_F32_OP)) + FAIL_IF(push_inst(compiler, FMOVS | FDN(dst_r) | FS2N(src), MOVABLE_INS)); + } + else + dst_r = src; + } + break; + case SLJIT_NEG_F64: + FAIL_IF(push_inst(compiler, FNEGS | FD(dst_r) | FS2(src), MOVABLE_INS)); + if (dst_r != src && !(op & SLJIT_F32_OP)) + FAIL_IF(push_inst(compiler, FMOVS | FDN(dst_r) | FS2N(src), MOVABLE_INS)); + break; + case SLJIT_ABS_F64: + FAIL_IF(push_inst(compiler, FABSS | FD(dst_r) | FS2(src), MOVABLE_INS)); + if (dst_r != src && !(op & SLJIT_F32_OP)) + FAIL_IF(push_inst(compiler, FMOVS | FDN(dst_r) | FS2N(src), MOVABLE_INS)); + break; + case SLJIT_CONV_F64_FROM_F32: + FAIL_IF(push_inst(compiler, SELECT_FOP(op, FSTOD, FDTOS) | FD(dst_r) | FS2(src), MOVABLE_INS)); + op ^= SLJIT_F32_OP; + break; + } + + if (dst & SLJIT_MEM) + FAIL_IF(emit_op_mem2(compiler, FLOAT_DATA(op), dst_r, dst, dstw, 0, 0)); + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + sljit_s32 dst_r, flags = 0; + + CHECK_ERROR(); + CHECK(check_sljit_emit_fop2(compiler, op, dst, dstw, src1, src1w, src2, src2w)); + ADJUST_LOCAL_OFFSET(dst, dstw); + ADJUST_LOCAL_OFFSET(src1, src1w); + ADJUST_LOCAL_OFFSET(src2, src2w); + + compiler->cache_arg = 0; + compiler->cache_argw = 0; + + dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG2; + + if (src1 & SLJIT_MEM) { + if (getput_arg_fast(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG1, src1, src1w)) { + FAIL_IF(compiler->error); + src1 = TMP_FREG1; + } else + flags |= SLOW_SRC1; + } + + if (src2 & SLJIT_MEM) { + if (getput_arg_fast(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG2, src2, src2w)) { + FAIL_IF(compiler->error); + src2 = TMP_FREG2; + } else + flags |= SLOW_SRC2; + } + + if ((flags & (SLOW_SRC1 | SLOW_SRC2)) == (SLOW_SRC1 | SLOW_SRC2)) { + if (!can_cache(src1, src1w, src2, src2w) && can_cache(src1, src1w, dst, dstw)) { + FAIL_IF(getput_arg(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG2, src2, src2w, src1, src1w)); + FAIL_IF(getput_arg(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG1, src1, src1w, dst, dstw)); + } + else { + FAIL_IF(getput_arg(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG1, src1, src1w, src2, src2w)); + FAIL_IF(getput_arg(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG2, src2, src2w, dst, dstw)); + } + } + else if (flags & SLOW_SRC1) + FAIL_IF(getput_arg(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG1, src1, src1w, dst, dstw)); + else if (flags & SLOW_SRC2) + FAIL_IF(getput_arg(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG2, src2, src2w, dst, dstw)); + + if (flags & SLOW_SRC1) + src1 = TMP_FREG1; + if (flags & SLOW_SRC2) + src2 = TMP_FREG2; + + switch (GET_OPCODE(op)) { + case SLJIT_ADD_F64: + FAIL_IF(push_inst(compiler, SELECT_FOP(op, FADDS, FADDD) | FD(dst_r) | FS1(src1) | FS2(src2), MOVABLE_INS)); + break; + + case SLJIT_SUB_F64: + FAIL_IF(push_inst(compiler, SELECT_FOP(op, FSUBS, FSUBD) | FD(dst_r) | FS1(src1) | FS2(src2), MOVABLE_INS)); + break; + + case SLJIT_MUL_F64: + FAIL_IF(push_inst(compiler, SELECT_FOP(op, FMULS, FMULD) | FD(dst_r) | FS1(src1) | FS2(src2), MOVABLE_INS)); + break; + + case SLJIT_DIV_F64: + FAIL_IF(push_inst(compiler, SELECT_FOP(op, FDIVS, FDIVD) | FD(dst_r) | FS1(src1) | FS2(src2), MOVABLE_INS)); + break; + } + + if (dst_r == TMP_FREG2) + FAIL_IF(emit_op_mem2(compiler, FLOAT_DATA(op), TMP_FREG2, dst, dstw, 0, 0)); + + return SLJIT_SUCCESS; +} + +#undef FLOAT_DATA +#undef SELECT_FOP + +/* --------------------------------------------------------------------- */ +/* Other instructions */ +/* --------------------------------------------------------------------- */ + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_fast_enter(compiler, dst, dstw)); + ADJUST_LOCAL_OFFSET(dst, dstw); + + if (FAST_IS_REG(dst)) + return push_inst(compiler, OR | D(dst) | S1(0) | S2(TMP_LINK), DR(dst)); + + /* Memory. */ + return emit_op_mem(compiler, WORD_DATA, TMP_LINK, dst, dstw); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_fast_return(compiler, src, srcw)); + ADJUST_LOCAL_OFFSET(src, srcw); + + if (FAST_IS_REG(src)) + FAIL_IF(push_inst(compiler, OR | D(TMP_LINK) | S1(0) | S2(src), DR(TMP_LINK))); + else + FAIL_IF(emit_op_mem(compiler, WORD_DATA | LOAD_DATA, TMP_LINK, src, srcw)); + + FAIL_IF(push_inst(compiler, JMPL | D(0) | S1(TMP_LINK) | IMM(8), UNMOVABLE_INS)); + return push_inst(compiler, NOP, UNMOVABLE_INS); +} + +/* --------------------------------------------------------------------- */ +/* Conditional instructions */ +/* --------------------------------------------------------------------- */ + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compiler *compiler) +{ + struct sljit_label *label; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_label(compiler)); + + if (compiler->last_label && compiler->last_label->size == compiler->size) + return compiler->last_label; + + label = (struct sljit_label*)ensure_abuf(compiler, sizeof(struct sljit_label)); + PTR_FAIL_IF(!label); + set_label(label, compiler); + compiler->delay_slot = UNMOVABLE_INS; + return label; +} + +static sljit_ins get_cc(sljit_s32 type) +{ + switch (type) { + case SLJIT_EQUAL: + case SLJIT_MUL_NOT_OVERFLOW: + case SLJIT_NOT_EQUAL_F64: /* Unordered. */ + return DA(0x1); + + case SLJIT_NOT_EQUAL: + case SLJIT_MUL_OVERFLOW: + case SLJIT_EQUAL_F64: + return DA(0x9); + + case SLJIT_LESS: + case SLJIT_GREATER_F64: /* Unordered. */ + return DA(0x5); + + case SLJIT_GREATER_EQUAL: + case SLJIT_LESS_EQUAL_F64: + return DA(0xd); + + case SLJIT_GREATER: + case SLJIT_GREATER_EQUAL_F64: /* Unordered. */ + return DA(0xc); + + case SLJIT_LESS_EQUAL: + case SLJIT_LESS_F64: + return DA(0x4); + + case SLJIT_SIG_LESS: + return DA(0x3); + + case SLJIT_SIG_GREATER_EQUAL: + return DA(0xb); + + case SLJIT_SIG_GREATER: + return DA(0xa); + + case SLJIT_SIG_LESS_EQUAL: + return DA(0x2); + + case SLJIT_OVERFLOW: + case SLJIT_UNORDERED_F64: + return DA(0x7); + + case SLJIT_NOT_OVERFLOW: + case SLJIT_ORDERED_F64: + return DA(0xf); + + default: + SLJIT_UNREACHABLE(); + return DA(0x8); + } +} + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, sljit_s32 type) +{ + struct sljit_jump *jump; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_jump(compiler, type)); + + jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump)); + PTR_FAIL_IF(!jump); + set_jump(jump, compiler, type & SLJIT_REWRITABLE_JUMP); + type &= 0xff; + + if (type < SLJIT_EQUAL_F64) { + jump->flags |= IS_COND; + if (((compiler->delay_slot & DST_INS_MASK) != UNMOVABLE_INS) && !(compiler->delay_slot & ICC_IS_SET)) + jump->flags |= IS_MOVABLE; +#if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) + PTR_FAIL_IF(push_inst(compiler, BICC | get_cc(type ^ 1) | 5, UNMOVABLE_INS)); +#else +#error "Implementation required" +#endif + } + else if (type < SLJIT_JUMP) { + jump->flags |= IS_COND; + if (((compiler->delay_slot & DST_INS_MASK) != UNMOVABLE_INS) && !(compiler->delay_slot & FCC_IS_SET)) + jump->flags |= IS_MOVABLE; +#if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) + PTR_FAIL_IF(push_inst(compiler, FBFCC | get_cc(type ^ 1) | 5, UNMOVABLE_INS)); +#else +#error "Implementation required" +#endif + } + else { + if ((compiler->delay_slot & DST_INS_MASK) != UNMOVABLE_INS) + jump->flags |= IS_MOVABLE; + if (type >= SLJIT_FAST_CALL) + jump->flags |= IS_CALL; + } + + PTR_FAIL_IF(emit_const(compiler, TMP_REG1, 0)); + PTR_FAIL_IF(push_inst(compiler, JMPL | D(type >= SLJIT_FAST_CALL ? TMP_LINK : 0) | S1(TMP_REG1) | IMM(0), UNMOVABLE_INS)); + jump->addr = compiler->size; + PTR_FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS)); + + return jump; +} + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_call(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 arg_types) +{ + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_call(compiler, type, arg_types)); + + PTR_FAIL_IF(call_with_args(compiler, arg_types, NULL)); + +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \ + || (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + compiler->skip_checks = 1; +#endif + + return sljit_emit_jump(compiler, type); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 src, sljit_sw srcw) +{ + struct sljit_jump *jump = NULL; + sljit_s32 src_r; + + CHECK_ERROR(); + CHECK(check_sljit_emit_ijump(compiler, type, src, srcw)); + ADJUST_LOCAL_OFFSET(src, srcw); + + if (FAST_IS_REG(src)) + src_r = src; + else if (src & SLJIT_IMM) { + jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump)); + FAIL_IF(!jump); + set_jump(jump, compiler, JUMP_ADDR); + jump->u.target = srcw; + + if ((compiler->delay_slot & DST_INS_MASK) != UNMOVABLE_INS) + jump->flags |= IS_MOVABLE; + if (type >= SLJIT_FAST_CALL) + jump->flags |= IS_CALL; + + FAIL_IF(emit_const(compiler, TMP_REG1, 0)); + src_r = TMP_REG1; + } + else { + FAIL_IF(emit_op_mem(compiler, WORD_DATA | LOAD_DATA, TMP_REG1, src, srcw)); + src_r = TMP_REG1; + } + + FAIL_IF(push_inst(compiler, JMPL | D(type >= SLJIT_FAST_CALL ? TMP_LINK : 0) | S1(src_r) | IMM(0), UNMOVABLE_INS)); + if (jump) + jump->addr = compiler->size; + return push_inst(compiler, NOP, UNMOVABLE_INS); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_icall(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 arg_types, + sljit_s32 src, sljit_sw srcw) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_icall(compiler, type, arg_types, src, srcw)); + + if (src & SLJIT_MEM) { + ADJUST_LOCAL_OFFSET(src, srcw); + FAIL_IF(emit_op_mem(compiler, WORD_DATA | LOAD_DATA, TMP_REG1, src, srcw)); + src = TMP_REG1; + } + + FAIL_IF(call_with_args(compiler, arg_types, &src)); + +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \ + || (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + compiler->skip_checks = 1; +#endif + + return sljit_emit_ijump(compiler, type, src, srcw); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 type) +{ + sljit_s32 reg, flags = HAS_FLAGS(op) ? SET_FLAGS : 0; + + CHECK_ERROR(); + CHECK(check_sljit_emit_op_flags(compiler, op, dst, dstw, type)); + ADJUST_LOCAL_OFFSET(dst, dstw); + +#if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) + op = GET_OPCODE(op); + reg = (op < SLJIT_ADD && FAST_IS_REG(dst)) ? dst : TMP_REG2; + + compiler->cache_arg = 0; + compiler->cache_argw = 0; + + if (op >= SLJIT_ADD && (dst & SLJIT_MEM)) + FAIL_IF(emit_op_mem2(compiler, WORD_DATA | LOAD_DATA, TMP_REG1, dst, dstw, dst, dstw)); + + type &= 0xff; + if (type < SLJIT_EQUAL_F64) + FAIL_IF(push_inst(compiler, BICC | get_cc(type) | 3, UNMOVABLE_INS)); + else + FAIL_IF(push_inst(compiler, FBFCC | get_cc(type) | 3, UNMOVABLE_INS)); + + FAIL_IF(push_inst(compiler, OR | D(reg) | S1(0) | IMM(1), UNMOVABLE_INS)); + FAIL_IF(push_inst(compiler, OR | D(reg) | S1(0) | IMM(0), UNMOVABLE_INS)); + + if (op >= SLJIT_ADD) { + flags |= CUMULATIVE_OP | IMM_OP | ALT_KEEP_CACHE; + if (dst & SLJIT_MEM) + return emit_op(compiler, op, flags, dst, dstw, TMP_REG1, 0, TMP_REG2, 0); + return emit_op(compiler, op, flags, dst, 0, dst, 0, TMP_REG2, 0); + } + + if (!(dst & SLJIT_MEM)) + return SLJIT_SUCCESS; + + return emit_op_mem(compiler, WORD_DATA, TMP_REG2, dst, dstw); +#else +#error "Implementation required" +#endif +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 dst_reg, + sljit_s32 src, sljit_sw srcw) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_cmov(compiler, type, dst_reg, src, srcw)); + +#if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) + return sljit_emit_cmov_generic(compiler, type, dst_reg, src, srcw);; +#else +#error "Implementation required" +#endif +} + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw init_value) +{ + struct sljit_const *const_; + sljit_s32 dst_r; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value)); + ADJUST_LOCAL_OFFSET(dst, dstw); + + const_ = (struct sljit_const*)ensure_abuf(compiler, sizeof(struct sljit_const)); + PTR_FAIL_IF(!const_); + set_const(const_, compiler); + + dst_r = FAST_IS_REG(dst) ? dst : TMP_REG2; + PTR_FAIL_IF(emit_const(compiler, dst_r, init_value)); + + if (dst & SLJIT_MEM) + PTR_FAIL_IF(emit_op_mem(compiler, WORD_DATA, TMP_REG2, dst, dstw)); + return const_; +} + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_put_label* sljit_emit_put_label(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw) +{ + struct sljit_put_label *put_label; + sljit_s32 dst_r; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_put_label(compiler, dst, dstw)); + ADJUST_LOCAL_OFFSET(dst, dstw); + + put_label = (struct sljit_put_label*)ensure_abuf(compiler, sizeof(struct sljit_put_label)); + PTR_FAIL_IF(!put_label); + set_put_label(put_label, compiler, 0); + + dst_r = FAST_IS_REG(dst) ? dst : TMP_REG2; + PTR_FAIL_IF(emit_const(compiler, dst_r, 0)); + + if (dst & SLJIT_MEM) + PTR_FAIL_IF(emit_op_mem(compiler, WORD_DATA, TMP_REG2, dst, dstw)); + return put_label; +} diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeTILEGX-encoder.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeTILEGX-encoder.c new file mode 100755 index 000000000..dd82ebae6 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeTILEGX-encoder.c @@ -0,0 +1,10159 @@ +/* + * Stack-less Just-In-Time compiler + * + * Copyright 2013-2013 Tilera Corporation(jiwang@tilera.com). All rights reserved. + * Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* This code is owned by Tilera Corporation, and distributed as part + of multiple projects. In sljit, the code is under BSD licence. */ + +#include +#include +#include +#define BFD_RELOC(x) R_##x + +/* Special registers. */ +#define TREG_LR 55 +#define TREG_SN 56 +#define TREG_ZERO 63 + +/* Canonical name of each register. */ +const char *const tilegx_register_names[] = +{ + "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", + "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", + "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", + "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31", + "r32", "r33", "r34", "r35", "r36", "r37", "r38", "r39", + "r40", "r41", "r42", "r43", "r44", "r45", "r46", "r47", + "r48", "r49", "r50", "r51", "r52", "tp", "sp", "lr", + "sn", "idn0", "idn1", "udn0", "udn1", "udn2", "udn3", "zero" +}; + +enum +{ + R_NONE = 0, + R_TILEGX_NONE = 0, + R_TILEGX_64 = 1, + R_TILEGX_32 = 2, + R_TILEGX_16 = 3, + R_TILEGX_8 = 4, + R_TILEGX_64_PCREL = 5, + R_TILEGX_32_PCREL = 6, + R_TILEGX_16_PCREL = 7, + R_TILEGX_8_PCREL = 8, + R_TILEGX_HW0 = 9, + R_TILEGX_HW1 = 10, + R_TILEGX_HW2 = 11, + R_TILEGX_HW3 = 12, + R_TILEGX_HW0_LAST = 13, + R_TILEGX_HW1_LAST = 14, + R_TILEGX_HW2_LAST = 15, + R_TILEGX_COPY = 16, + R_TILEGX_GLOB_DAT = 17, + R_TILEGX_JMP_SLOT = 18, + R_TILEGX_RELATIVE = 19, + R_TILEGX_BROFF_X1 = 20, + R_TILEGX_JUMPOFF_X1 = 21, + R_TILEGX_JUMPOFF_X1_PLT = 22, + R_TILEGX_IMM8_X0 = 23, + R_TILEGX_IMM8_Y0 = 24, + R_TILEGX_IMM8_X1 = 25, + R_TILEGX_IMM8_Y1 = 26, + R_TILEGX_DEST_IMM8_X1 = 27, + R_TILEGX_MT_IMM14_X1 = 28, + R_TILEGX_MF_IMM14_X1 = 29, + R_TILEGX_MMSTART_X0 = 30, + R_TILEGX_MMEND_X0 = 31, + R_TILEGX_SHAMT_X0 = 32, + R_TILEGX_SHAMT_X1 = 33, + R_TILEGX_SHAMT_Y0 = 34, + R_TILEGX_SHAMT_Y1 = 35, + R_TILEGX_IMM16_X0_HW0 = 36, + R_TILEGX_IMM16_X1_HW0 = 37, + R_TILEGX_IMM16_X0_HW1 = 38, + R_TILEGX_IMM16_X1_HW1 = 39, + R_TILEGX_IMM16_X0_HW2 = 40, + R_TILEGX_IMM16_X1_HW2 = 41, + R_TILEGX_IMM16_X0_HW3 = 42, + R_TILEGX_IMM16_X1_HW3 = 43, + R_TILEGX_IMM16_X0_HW0_LAST = 44, + R_TILEGX_IMM16_X1_HW0_LAST = 45, + R_TILEGX_IMM16_X0_HW1_LAST = 46, + R_TILEGX_IMM16_X1_HW1_LAST = 47, + R_TILEGX_IMM16_X0_HW2_LAST = 48, + R_TILEGX_IMM16_X1_HW2_LAST = 49, + R_TILEGX_IMM16_X0_HW0_PCREL = 50, + R_TILEGX_IMM16_X1_HW0_PCREL = 51, + R_TILEGX_IMM16_X0_HW1_PCREL = 52, + R_TILEGX_IMM16_X1_HW1_PCREL = 53, + R_TILEGX_IMM16_X0_HW2_PCREL = 54, + R_TILEGX_IMM16_X1_HW2_PCREL = 55, + R_TILEGX_IMM16_X0_HW3_PCREL = 56, + R_TILEGX_IMM16_X1_HW3_PCREL = 57, + R_TILEGX_IMM16_X0_HW0_LAST_PCREL = 58, + R_TILEGX_IMM16_X1_HW0_LAST_PCREL = 59, + R_TILEGX_IMM16_X0_HW1_LAST_PCREL = 60, + R_TILEGX_IMM16_X1_HW1_LAST_PCREL = 61, + R_TILEGX_IMM16_X0_HW2_LAST_PCREL = 62, + R_TILEGX_IMM16_X1_HW2_LAST_PCREL = 63, + R_TILEGX_IMM16_X0_HW0_GOT = 64, + R_TILEGX_IMM16_X1_HW0_GOT = 65, + + R_TILEGX_IMM16_X0_HW0_PLT_PCREL = 66, + R_TILEGX_IMM16_X1_HW0_PLT_PCREL = 67, + R_TILEGX_IMM16_X0_HW1_PLT_PCREL = 68, + R_TILEGX_IMM16_X1_HW1_PLT_PCREL = 69, + R_TILEGX_IMM16_X0_HW2_PLT_PCREL = 70, + R_TILEGX_IMM16_X1_HW2_PLT_PCREL = 71, + + R_TILEGX_IMM16_X0_HW0_LAST_GOT = 72, + R_TILEGX_IMM16_X1_HW0_LAST_GOT = 73, + R_TILEGX_IMM16_X0_HW1_LAST_GOT = 74, + R_TILEGX_IMM16_X1_HW1_LAST_GOT = 75, + R_TILEGX_IMM16_X0_HW0_TLS_GD = 78, + R_TILEGX_IMM16_X1_HW0_TLS_GD = 79, + R_TILEGX_IMM16_X0_HW0_TLS_LE = 80, + R_TILEGX_IMM16_X1_HW0_TLS_LE = 81, + R_TILEGX_IMM16_X0_HW0_LAST_TLS_LE = 82, + R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE = 83, + R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE = 84, + R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE = 85, + R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD = 86, + R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD = 87, + R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD = 88, + R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD = 89, + R_TILEGX_IMM16_X0_HW0_TLS_IE = 92, + R_TILEGX_IMM16_X1_HW0_TLS_IE = 93, + + R_TILEGX_IMM16_X0_HW0_LAST_PLT_PCREL = 94, + R_TILEGX_IMM16_X1_HW0_LAST_PLT_PCREL = 95, + R_TILEGX_IMM16_X0_HW1_LAST_PLT_PCREL = 96, + R_TILEGX_IMM16_X1_HW1_LAST_PLT_PCREL = 97, + R_TILEGX_IMM16_X0_HW2_LAST_PLT_PCREL = 98, + R_TILEGX_IMM16_X1_HW2_LAST_PLT_PCREL = 99, + + R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE = 100, + R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE = 101, + R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE = 102, + R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE = 103, + R_TILEGX_TLS_DTPMOD64 = 106, + R_TILEGX_TLS_DTPOFF64 = 107, + R_TILEGX_TLS_TPOFF64 = 108, + R_TILEGX_TLS_DTPMOD32 = 109, + R_TILEGX_TLS_DTPOFF32 = 110, + R_TILEGX_TLS_TPOFF32 = 111, + R_TILEGX_TLS_GD_CALL = 112, + R_TILEGX_IMM8_X0_TLS_GD_ADD = 113, + R_TILEGX_IMM8_X1_TLS_GD_ADD = 114, + R_TILEGX_IMM8_Y0_TLS_GD_ADD = 115, + R_TILEGX_IMM8_Y1_TLS_GD_ADD = 116, + R_TILEGX_TLS_IE_LOAD = 117, + R_TILEGX_IMM8_X0_TLS_ADD = 118, + R_TILEGX_IMM8_X1_TLS_ADD = 119, + R_TILEGX_IMM8_Y0_TLS_ADD = 120, + R_TILEGX_IMM8_Y1_TLS_ADD = 121, + R_TILEGX_GNU_VTINHERIT = 128, + R_TILEGX_GNU_VTENTRY = 129, + R_TILEGX_IRELATIVE = 130, + R_TILEGX_NUM = 131 +}; + +typedef enum +{ + TILEGX_PIPELINE_X0, + TILEGX_PIPELINE_X1, + TILEGX_PIPELINE_Y0, + TILEGX_PIPELINE_Y1, + TILEGX_PIPELINE_Y2, +} tilegx_pipeline; + +typedef unsigned long long tilegx_bundle_bits; + +/* These are the bits that determine if a bundle is in the X encoding. */ +#define TILEGX_BUNDLE_MODE_MASK ((tilegx_bundle_bits)3 << 62) + +enum +{ + /* Maximum number of instructions in a bundle (2 for X, 3 for Y). */ + TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE = 3, + + /* How many different pipeline encodings are there? X0, X1, Y0, Y1, Y2. */ + TILEGX_NUM_PIPELINE_ENCODINGS = 5, + + /* Log base 2 of TILEGX_BUNDLE_SIZE_IN_BYTES. */ + TILEGX_LOG2_BUNDLE_SIZE_IN_BYTES = 3, + + /* Instructions take this many bytes. */ + TILEGX_BUNDLE_SIZE_IN_BYTES = 1 << TILEGX_LOG2_BUNDLE_SIZE_IN_BYTES, + + /* Log base 2 of TILEGX_BUNDLE_ALIGNMENT_IN_BYTES. */ + TILEGX_LOG2_BUNDLE_ALIGNMENT_IN_BYTES = 3, + + /* Bundles should be aligned modulo this number of bytes. */ + TILEGX_BUNDLE_ALIGNMENT_IN_BYTES = + (1 << TILEGX_LOG2_BUNDLE_ALIGNMENT_IN_BYTES), + + /* Number of registers (some are magic, such as network I/O). */ + TILEGX_NUM_REGISTERS = 64, +}; + +/* Make a few "tile_" variables to simplify common code between + architectures. */ + +typedef tilegx_bundle_bits tile_bundle_bits; +#define TILE_BUNDLE_SIZE_IN_BYTES TILEGX_BUNDLE_SIZE_IN_BYTES +#define TILE_BUNDLE_ALIGNMENT_IN_BYTES TILEGX_BUNDLE_ALIGNMENT_IN_BYTES +#define TILE_LOG2_BUNDLE_ALIGNMENT_IN_BYTES \ + TILEGX_LOG2_BUNDLE_ALIGNMENT_IN_BYTES + +/* 64-bit pattern for a { bpt ; nop } bundle. */ +#define TILEGX_BPT_BUNDLE 0x286a44ae51485000ULL + +typedef enum +{ + TILEGX_OP_TYPE_REGISTER, + TILEGX_OP_TYPE_IMMEDIATE, + TILEGX_OP_TYPE_ADDRESS, + TILEGX_OP_TYPE_SPR +} tilegx_operand_type; + +struct tilegx_operand +{ + /* Is this operand a register, immediate or address? */ + tilegx_operand_type type; + + /* The default relocation type for this operand. */ + signed int default_reloc : 16; + + /* How many bits is this value? (used for range checking) */ + unsigned int num_bits : 5; + + /* Is the value signed? (used for range checking) */ + unsigned int is_signed : 1; + + /* Is this operand a source register? */ + unsigned int is_src_reg : 1; + + /* Is this operand written? (i.e. is it a destination register) */ + unsigned int is_dest_reg : 1; + + /* Is this operand PC-relative? */ + unsigned int is_pc_relative : 1; + + /* By how many bits do we right shift the value before inserting? */ + unsigned int rightshift : 2; + + /* Return the bits for this operand to be ORed into an existing bundle. */ + tilegx_bundle_bits (*insert) (int op); + + /* Extract this operand and return it. */ + unsigned int (*extract) (tilegx_bundle_bits bundle); +}; + +typedef enum +{ + TILEGX_OPC_BPT, + TILEGX_OPC_INFO, + TILEGX_OPC_INFOL, + TILEGX_OPC_LD4S_TLS, + TILEGX_OPC_LD_TLS, + TILEGX_OPC_MOVE, + TILEGX_OPC_MOVEI, + TILEGX_OPC_MOVELI, + TILEGX_OPC_PREFETCH, + TILEGX_OPC_PREFETCH_ADD_L1, + TILEGX_OPC_PREFETCH_ADD_L1_FAULT, + TILEGX_OPC_PREFETCH_ADD_L2, + TILEGX_OPC_PREFETCH_ADD_L2_FAULT, + TILEGX_OPC_PREFETCH_ADD_L3, + TILEGX_OPC_PREFETCH_ADD_L3_FAULT, + TILEGX_OPC_PREFETCH_L1, + TILEGX_OPC_PREFETCH_L1_FAULT, + TILEGX_OPC_PREFETCH_L2, + TILEGX_OPC_PREFETCH_L2_FAULT, + TILEGX_OPC_PREFETCH_L3, + TILEGX_OPC_PREFETCH_L3_FAULT, + TILEGX_OPC_RAISE, + TILEGX_OPC_ADD, + TILEGX_OPC_ADDI, + TILEGX_OPC_ADDLI, + TILEGX_OPC_ADDX, + TILEGX_OPC_ADDXI, + TILEGX_OPC_ADDXLI, + TILEGX_OPC_ADDXSC, + TILEGX_OPC_AND, + TILEGX_OPC_ANDI, + TILEGX_OPC_BEQZ, + TILEGX_OPC_BEQZT, + TILEGX_OPC_BFEXTS, + TILEGX_OPC_BFEXTU, + TILEGX_OPC_BFINS, + TILEGX_OPC_BGEZ, + TILEGX_OPC_BGEZT, + TILEGX_OPC_BGTZ, + TILEGX_OPC_BGTZT, + TILEGX_OPC_BLBC, + TILEGX_OPC_BLBCT, + TILEGX_OPC_BLBS, + TILEGX_OPC_BLBST, + TILEGX_OPC_BLEZ, + TILEGX_OPC_BLEZT, + TILEGX_OPC_BLTZ, + TILEGX_OPC_BLTZT, + TILEGX_OPC_BNEZ, + TILEGX_OPC_BNEZT, + TILEGX_OPC_CLZ, + TILEGX_OPC_CMOVEQZ, + TILEGX_OPC_CMOVNEZ, + TILEGX_OPC_CMPEQ, + TILEGX_OPC_CMPEQI, + TILEGX_OPC_CMPEXCH, + TILEGX_OPC_CMPEXCH4, + TILEGX_OPC_CMPLES, + TILEGX_OPC_CMPLEU, + TILEGX_OPC_CMPLTS, + TILEGX_OPC_CMPLTSI, + TILEGX_OPC_CMPLTU, + TILEGX_OPC_CMPLTUI, + TILEGX_OPC_CMPNE, + TILEGX_OPC_CMUL, + TILEGX_OPC_CMULA, + TILEGX_OPC_CMULAF, + TILEGX_OPC_CMULF, + TILEGX_OPC_CMULFR, + TILEGX_OPC_CMULH, + TILEGX_OPC_CMULHR, + TILEGX_OPC_CRC32_32, + TILEGX_OPC_CRC32_8, + TILEGX_OPC_CTZ, + TILEGX_OPC_DBLALIGN, + TILEGX_OPC_DBLALIGN2, + TILEGX_OPC_DBLALIGN4, + TILEGX_OPC_DBLALIGN6, + TILEGX_OPC_DRAIN, + TILEGX_OPC_DTLBPR, + TILEGX_OPC_EXCH, + TILEGX_OPC_EXCH4, + TILEGX_OPC_FDOUBLE_ADD_FLAGS, + TILEGX_OPC_FDOUBLE_ADDSUB, + TILEGX_OPC_FDOUBLE_MUL_FLAGS, + TILEGX_OPC_FDOUBLE_PACK1, + TILEGX_OPC_FDOUBLE_PACK2, + TILEGX_OPC_FDOUBLE_SUB_FLAGS, + TILEGX_OPC_FDOUBLE_UNPACK_MAX, + TILEGX_OPC_FDOUBLE_UNPACK_MIN, + TILEGX_OPC_FETCHADD, + TILEGX_OPC_FETCHADD4, + TILEGX_OPC_FETCHADDGEZ, + TILEGX_OPC_FETCHADDGEZ4, + TILEGX_OPC_FETCHAND, + TILEGX_OPC_FETCHAND4, + TILEGX_OPC_FETCHOR, + TILEGX_OPC_FETCHOR4, + TILEGX_OPC_FINV, + TILEGX_OPC_FLUSH, + TILEGX_OPC_FLUSHWB, + TILEGX_OPC_FNOP, + TILEGX_OPC_FSINGLE_ADD1, + TILEGX_OPC_FSINGLE_ADDSUB2, + TILEGX_OPC_FSINGLE_MUL1, + TILEGX_OPC_FSINGLE_MUL2, + TILEGX_OPC_FSINGLE_PACK1, + TILEGX_OPC_FSINGLE_PACK2, + TILEGX_OPC_FSINGLE_SUB1, + TILEGX_OPC_ICOH, + TILEGX_OPC_ILL, + TILEGX_OPC_INV, + TILEGX_OPC_IRET, + TILEGX_OPC_J, + TILEGX_OPC_JAL, + TILEGX_OPC_JALR, + TILEGX_OPC_JALRP, + TILEGX_OPC_JR, + TILEGX_OPC_JRP, + TILEGX_OPC_LD, + TILEGX_OPC_LD1S, + TILEGX_OPC_LD1S_ADD, + TILEGX_OPC_LD1U, + TILEGX_OPC_LD1U_ADD, + TILEGX_OPC_LD2S, + TILEGX_OPC_LD2S_ADD, + TILEGX_OPC_LD2U, + TILEGX_OPC_LD2U_ADD, + TILEGX_OPC_LD4S, + TILEGX_OPC_LD4S_ADD, + TILEGX_OPC_LD4U, + TILEGX_OPC_LD4U_ADD, + TILEGX_OPC_LD_ADD, + TILEGX_OPC_LDNA, + TILEGX_OPC_LDNA_ADD, + TILEGX_OPC_LDNT, + TILEGX_OPC_LDNT1S, + TILEGX_OPC_LDNT1S_ADD, + TILEGX_OPC_LDNT1U, + TILEGX_OPC_LDNT1U_ADD, + TILEGX_OPC_LDNT2S, + TILEGX_OPC_LDNT2S_ADD, + TILEGX_OPC_LDNT2U, + TILEGX_OPC_LDNT2U_ADD, + TILEGX_OPC_LDNT4S, + TILEGX_OPC_LDNT4S_ADD, + TILEGX_OPC_LDNT4U, + TILEGX_OPC_LDNT4U_ADD, + TILEGX_OPC_LDNT_ADD, + TILEGX_OPC_LNK, + TILEGX_OPC_MF, + TILEGX_OPC_MFSPR, + TILEGX_OPC_MM, + TILEGX_OPC_MNZ, + TILEGX_OPC_MTSPR, + TILEGX_OPC_MUL_HS_HS, + TILEGX_OPC_MUL_HS_HU, + TILEGX_OPC_MUL_HS_LS, + TILEGX_OPC_MUL_HS_LU, + TILEGX_OPC_MUL_HU_HU, + TILEGX_OPC_MUL_HU_LS, + TILEGX_OPC_MUL_HU_LU, + TILEGX_OPC_MUL_LS_LS, + TILEGX_OPC_MUL_LS_LU, + TILEGX_OPC_MUL_LU_LU, + TILEGX_OPC_MULA_HS_HS, + TILEGX_OPC_MULA_HS_HU, + TILEGX_OPC_MULA_HS_LS, + TILEGX_OPC_MULA_HS_LU, + TILEGX_OPC_MULA_HU_HU, + TILEGX_OPC_MULA_HU_LS, + TILEGX_OPC_MULA_HU_LU, + TILEGX_OPC_MULA_LS_LS, + TILEGX_OPC_MULA_LS_LU, + TILEGX_OPC_MULA_LU_LU, + TILEGX_OPC_MULAX, + TILEGX_OPC_MULX, + TILEGX_OPC_MZ, + TILEGX_OPC_NAP, + TILEGX_OPC_NOP, + TILEGX_OPC_NOR, + TILEGX_OPC_OR, + TILEGX_OPC_ORI, + TILEGX_OPC_PCNT, + TILEGX_OPC_REVBITS, + TILEGX_OPC_REVBYTES, + TILEGX_OPC_ROTL, + TILEGX_OPC_ROTLI, + TILEGX_OPC_SHL, + TILEGX_OPC_SHL16INSLI, + TILEGX_OPC_SHL1ADD, + TILEGX_OPC_SHL1ADDX, + TILEGX_OPC_SHL2ADD, + TILEGX_OPC_SHL2ADDX, + TILEGX_OPC_SHL3ADD, + TILEGX_OPC_SHL3ADDX, + TILEGX_OPC_SHLI, + TILEGX_OPC_SHLX, + TILEGX_OPC_SHLXI, + TILEGX_OPC_SHRS, + TILEGX_OPC_SHRSI, + TILEGX_OPC_SHRU, + TILEGX_OPC_SHRUI, + TILEGX_OPC_SHRUX, + TILEGX_OPC_SHRUXI, + TILEGX_OPC_SHUFFLEBYTES, + TILEGX_OPC_ST, + TILEGX_OPC_ST1, + TILEGX_OPC_ST1_ADD, + TILEGX_OPC_ST2, + TILEGX_OPC_ST2_ADD, + TILEGX_OPC_ST4, + TILEGX_OPC_ST4_ADD, + TILEGX_OPC_ST_ADD, + TILEGX_OPC_STNT, + TILEGX_OPC_STNT1, + TILEGX_OPC_STNT1_ADD, + TILEGX_OPC_STNT2, + TILEGX_OPC_STNT2_ADD, + TILEGX_OPC_STNT4, + TILEGX_OPC_STNT4_ADD, + TILEGX_OPC_STNT_ADD, + TILEGX_OPC_SUB, + TILEGX_OPC_SUBX, + TILEGX_OPC_SUBXSC, + TILEGX_OPC_SWINT0, + TILEGX_OPC_SWINT1, + TILEGX_OPC_SWINT2, + TILEGX_OPC_SWINT3, + TILEGX_OPC_TBLIDXB0, + TILEGX_OPC_TBLIDXB1, + TILEGX_OPC_TBLIDXB2, + TILEGX_OPC_TBLIDXB3, + TILEGX_OPC_V1ADD, + TILEGX_OPC_V1ADDI, + TILEGX_OPC_V1ADDUC, + TILEGX_OPC_V1ADIFFU, + TILEGX_OPC_V1AVGU, + TILEGX_OPC_V1CMPEQ, + TILEGX_OPC_V1CMPEQI, + TILEGX_OPC_V1CMPLES, + TILEGX_OPC_V1CMPLEU, + TILEGX_OPC_V1CMPLTS, + TILEGX_OPC_V1CMPLTSI, + TILEGX_OPC_V1CMPLTU, + TILEGX_OPC_V1CMPLTUI, + TILEGX_OPC_V1CMPNE, + TILEGX_OPC_V1DDOTPU, + TILEGX_OPC_V1DDOTPUA, + TILEGX_OPC_V1DDOTPUS, + TILEGX_OPC_V1DDOTPUSA, + TILEGX_OPC_V1DOTP, + TILEGX_OPC_V1DOTPA, + TILEGX_OPC_V1DOTPU, + TILEGX_OPC_V1DOTPUA, + TILEGX_OPC_V1DOTPUS, + TILEGX_OPC_V1DOTPUSA, + TILEGX_OPC_V1INT_H, + TILEGX_OPC_V1INT_L, + TILEGX_OPC_V1MAXU, + TILEGX_OPC_V1MAXUI, + TILEGX_OPC_V1MINU, + TILEGX_OPC_V1MINUI, + TILEGX_OPC_V1MNZ, + TILEGX_OPC_V1MULTU, + TILEGX_OPC_V1MULU, + TILEGX_OPC_V1MULUS, + TILEGX_OPC_V1MZ, + TILEGX_OPC_V1SADAU, + TILEGX_OPC_V1SADU, + TILEGX_OPC_V1SHL, + TILEGX_OPC_V1SHLI, + TILEGX_OPC_V1SHRS, + TILEGX_OPC_V1SHRSI, + TILEGX_OPC_V1SHRU, + TILEGX_OPC_V1SHRUI, + TILEGX_OPC_V1SUB, + TILEGX_OPC_V1SUBUC, + TILEGX_OPC_V2ADD, + TILEGX_OPC_V2ADDI, + TILEGX_OPC_V2ADDSC, + TILEGX_OPC_V2ADIFFS, + TILEGX_OPC_V2AVGS, + TILEGX_OPC_V2CMPEQ, + TILEGX_OPC_V2CMPEQI, + TILEGX_OPC_V2CMPLES, + TILEGX_OPC_V2CMPLEU, + TILEGX_OPC_V2CMPLTS, + TILEGX_OPC_V2CMPLTSI, + TILEGX_OPC_V2CMPLTU, + TILEGX_OPC_V2CMPLTUI, + TILEGX_OPC_V2CMPNE, + TILEGX_OPC_V2DOTP, + TILEGX_OPC_V2DOTPA, + TILEGX_OPC_V2INT_H, + TILEGX_OPC_V2INT_L, + TILEGX_OPC_V2MAXS, + TILEGX_OPC_V2MAXSI, + TILEGX_OPC_V2MINS, + TILEGX_OPC_V2MINSI, + TILEGX_OPC_V2MNZ, + TILEGX_OPC_V2MULFSC, + TILEGX_OPC_V2MULS, + TILEGX_OPC_V2MULTS, + TILEGX_OPC_V2MZ, + TILEGX_OPC_V2PACKH, + TILEGX_OPC_V2PACKL, + TILEGX_OPC_V2PACKUC, + TILEGX_OPC_V2SADAS, + TILEGX_OPC_V2SADAU, + TILEGX_OPC_V2SADS, + TILEGX_OPC_V2SADU, + TILEGX_OPC_V2SHL, + TILEGX_OPC_V2SHLI, + TILEGX_OPC_V2SHLSC, + TILEGX_OPC_V2SHRS, + TILEGX_OPC_V2SHRSI, + TILEGX_OPC_V2SHRU, + TILEGX_OPC_V2SHRUI, + TILEGX_OPC_V2SUB, + TILEGX_OPC_V2SUBSC, + TILEGX_OPC_V4ADD, + TILEGX_OPC_V4ADDSC, + TILEGX_OPC_V4INT_H, + TILEGX_OPC_V4INT_L, + TILEGX_OPC_V4PACKSC, + TILEGX_OPC_V4SHL, + TILEGX_OPC_V4SHLSC, + TILEGX_OPC_V4SHRS, + TILEGX_OPC_V4SHRU, + TILEGX_OPC_V4SUB, + TILEGX_OPC_V4SUBSC, + TILEGX_OPC_WH64, + TILEGX_OPC_XOR, + TILEGX_OPC_XORI, + TILEGX_OPC_NONE +} tilegx_mnemonic; + +enum +{ + TILEGX_MAX_OPERANDS = 4 /* bfexts */ +}; + +struct tilegx_opcode +{ + /* The opcode mnemonic, e.g. "add" */ + const char *name; + + /* The enum value for this mnemonic. */ + tilegx_mnemonic mnemonic; + + /* A bit mask of which of the five pipes this instruction + is compatible with: + X0 0x01 + X1 0x02 + Y0 0x04 + Y1 0x08 + Y2 0x10 */ + unsigned char pipes; + + /* How many operands are there? */ + unsigned char num_operands; + + /* Which register does this write implicitly, or TREG_ZERO if none? */ + unsigned char implicitly_written_register; + + /* Can this be bundled with other instructions (almost always true). */ + unsigned char can_bundle; + + /* The description of the operands. Each of these is an + * index into the tilegx_operands[] table. */ + unsigned char operands[TILEGX_NUM_PIPELINE_ENCODINGS][TILEGX_MAX_OPERANDS]; + + /* A mask of which bits have predefined values for each pipeline. + * This is useful for disassembly. */ + tilegx_bundle_bits fixed_bit_masks[TILEGX_NUM_PIPELINE_ENCODINGS]; + + /* For each bit set in fixed_bit_masks, what the value is for this + * instruction. */ + tilegx_bundle_bits fixed_bit_values[TILEGX_NUM_PIPELINE_ENCODINGS]; +}; + +/* Used for non-textual disassembly into structs. */ +struct tilegx_decoded_instruction +{ + const struct tilegx_opcode *opcode; + const struct tilegx_operand *operands[TILEGX_MAX_OPERANDS]; + long long operand_values[TILEGX_MAX_OPERANDS]; +}; + +enum +{ + ADDI_IMM8_OPCODE_X0 = 1, + ADDI_IMM8_OPCODE_X1 = 1, + ADDI_OPCODE_Y0 = 0, + ADDI_OPCODE_Y1 = 1, + ADDLI_OPCODE_X0 = 1, + ADDLI_OPCODE_X1 = 0, + ADDXI_IMM8_OPCODE_X0 = 2, + ADDXI_IMM8_OPCODE_X1 = 2, + ADDXI_OPCODE_Y0 = 1, + ADDXI_OPCODE_Y1 = 2, + ADDXLI_OPCODE_X0 = 2, + ADDXLI_OPCODE_X1 = 1, + ADDXSC_RRR_0_OPCODE_X0 = 1, + ADDXSC_RRR_0_OPCODE_X1 = 1, + ADDX_RRR_0_OPCODE_X0 = 2, + ADDX_RRR_0_OPCODE_X1 = 2, + ADDX_RRR_0_OPCODE_Y0 = 0, + ADDX_SPECIAL_0_OPCODE_Y1 = 0, + ADD_RRR_0_OPCODE_X0 = 3, + ADD_RRR_0_OPCODE_X1 = 3, + ADD_RRR_0_OPCODE_Y0 = 1, + ADD_SPECIAL_0_OPCODE_Y1 = 1, + ANDI_IMM8_OPCODE_X0 = 3, + ANDI_IMM8_OPCODE_X1 = 3, + ANDI_OPCODE_Y0 = 2, + ANDI_OPCODE_Y1 = 3, + AND_RRR_0_OPCODE_X0 = 4, + AND_RRR_0_OPCODE_X1 = 4, + AND_RRR_5_OPCODE_Y0 = 0, + AND_RRR_5_OPCODE_Y1 = 0, + BEQZT_BRANCH_OPCODE_X1 = 16, + BEQZ_BRANCH_OPCODE_X1 = 17, + BFEXTS_BF_OPCODE_X0 = 4, + BFEXTU_BF_OPCODE_X0 = 5, + BFINS_BF_OPCODE_X0 = 6, + BF_OPCODE_X0 = 3, + BGEZT_BRANCH_OPCODE_X1 = 18, + BGEZ_BRANCH_OPCODE_X1 = 19, + BGTZT_BRANCH_OPCODE_X1 = 20, + BGTZ_BRANCH_OPCODE_X1 = 21, + BLBCT_BRANCH_OPCODE_X1 = 22, + BLBC_BRANCH_OPCODE_X1 = 23, + BLBST_BRANCH_OPCODE_X1 = 24, + BLBS_BRANCH_OPCODE_X1 = 25, + BLEZT_BRANCH_OPCODE_X1 = 26, + BLEZ_BRANCH_OPCODE_X1 = 27, + BLTZT_BRANCH_OPCODE_X1 = 28, + BLTZ_BRANCH_OPCODE_X1 = 29, + BNEZT_BRANCH_OPCODE_X1 = 30, + BNEZ_BRANCH_OPCODE_X1 = 31, + BRANCH_OPCODE_X1 = 2, + CMOVEQZ_RRR_0_OPCODE_X0 = 5, + CMOVEQZ_RRR_4_OPCODE_Y0 = 0, + CMOVNEZ_RRR_0_OPCODE_X0 = 6, + CMOVNEZ_RRR_4_OPCODE_Y0 = 1, + CMPEQI_IMM8_OPCODE_X0 = 4, + CMPEQI_IMM8_OPCODE_X1 = 4, + CMPEQI_OPCODE_Y0 = 3, + CMPEQI_OPCODE_Y1 = 4, + CMPEQ_RRR_0_OPCODE_X0 = 7, + CMPEQ_RRR_0_OPCODE_X1 = 5, + CMPEQ_RRR_3_OPCODE_Y0 = 0, + CMPEQ_RRR_3_OPCODE_Y1 = 2, + CMPEXCH4_RRR_0_OPCODE_X1 = 6, + CMPEXCH_RRR_0_OPCODE_X1 = 7, + CMPLES_RRR_0_OPCODE_X0 = 8, + CMPLES_RRR_0_OPCODE_X1 = 8, + CMPLES_RRR_2_OPCODE_Y0 = 0, + CMPLES_RRR_2_OPCODE_Y1 = 0, + CMPLEU_RRR_0_OPCODE_X0 = 9, + CMPLEU_RRR_0_OPCODE_X1 = 9, + CMPLEU_RRR_2_OPCODE_Y0 = 1, + CMPLEU_RRR_2_OPCODE_Y1 = 1, + CMPLTSI_IMM8_OPCODE_X0 = 5, + CMPLTSI_IMM8_OPCODE_X1 = 5, + CMPLTSI_OPCODE_Y0 = 4, + CMPLTSI_OPCODE_Y1 = 5, + CMPLTS_RRR_0_OPCODE_X0 = 10, + CMPLTS_RRR_0_OPCODE_X1 = 10, + CMPLTS_RRR_2_OPCODE_Y0 = 2, + CMPLTS_RRR_2_OPCODE_Y1 = 2, + CMPLTUI_IMM8_OPCODE_X0 = 6, + CMPLTUI_IMM8_OPCODE_X1 = 6, + CMPLTU_RRR_0_OPCODE_X0 = 11, + CMPLTU_RRR_0_OPCODE_X1 = 11, + CMPLTU_RRR_2_OPCODE_Y0 = 3, + CMPLTU_RRR_2_OPCODE_Y1 = 3, + CMPNE_RRR_0_OPCODE_X0 = 12, + CMPNE_RRR_0_OPCODE_X1 = 12, + CMPNE_RRR_3_OPCODE_Y0 = 1, + CMPNE_RRR_3_OPCODE_Y1 = 3, + CMULAF_RRR_0_OPCODE_X0 = 13, + CMULA_RRR_0_OPCODE_X0 = 14, + CMULFR_RRR_0_OPCODE_X0 = 15, + CMULF_RRR_0_OPCODE_X0 = 16, + CMULHR_RRR_0_OPCODE_X0 = 17, + CMULH_RRR_0_OPCODE_X0 = 18, + CMUL_RRR_0_OPCODE_X0 = 19, + CNTLZ_UNARY_OPCODE_X0 = 1, + CNTLZ_UNARY_OPCODE_Y0 = 1, + CNTTZ_UNARY_OPCODE_X0 = 2, + CNTTZ_UNARY_OPCODE_Y0 = 2, + CRC32_32_RRR_0_OPCODE_X0 = 20, + CRC32_8_RRR_0_OPCODE_X0 = 21, + DBLALIGN2_RRR_0_OPCODE_X0 = 22, + DBLALIGN2_RRR_0_OPCODE_X1 = 13, + DBLALIGN4_RRR_0_OPCODE_X0 = 23, + DBLALIGN4_RRR_0_OPCODE_X1 = 14, + DBLALIGN6_RRR_0_OPCODE_X0 = 24, + DBLALIGN6_RRR_0_OPCODE_X1 = 15, + DBLALIGN_RRR_0_OPCODE_X0 = 25, + DRAIN_UNARY_OPCODE_X1 = 1, + DTLBPR_UNARY_OPCODE_X1 = 2, + EXCH4_RRR_0_OPCODE_X1 = 16, + EXCH_RRR_0_OPCODE_X1 = 17, + FDOUBLE_ADDSUB_RRR_0_OPCODE_X0 = 26, + FDOUBLE_ADD_FLAGS_RRR_0_OPCODE_X0 = 27, + FDOUBLE_MUL_FLAGS_RRR_0_OPCODE_X0 = 28, + FDOUBLE_PACK1_RRR_0_OPCODE_X0 = 29, + FDOUBLE_PACK2_RRR_0_OPCODE_X0 = 30, + FDOUBLE_SUB_FLAGS_RRR_0_OPCODE_X0 = 31, + FDOUBLE_UNPACK_MAX_RRR_0_OPCODE_X0 = 32, + FDOUBLE_UNPACK_MIN_RRR_0_OPCODE_X0 = 33, + FETCHADD4_RRR_0_OPCODE_X1 = 18, + FETCHADDGEZ4_RRR_0_OPCODE_X1 = 19, + FETCHADDGEZ_RRR_0_OPCODE_X1 = 20, + FETCHADD_RRR_0_OPCODE_X1 = 21, + FETCHAND4_RRR_0_OPCODE_X1 = 22, + FETCHAND_RRR_0_OPCODE_X1 = 23, + FETCHOR4_RRR_0_OPCODE_X1 = 24, + FETCHOR_RRR_0_OPCODE_X1 = 25, + FINV_UNARY_OPCODE_X1 = 3, + FLUSHWB_UNARY_OPCODE_X1 = 4, + FLUSH_UNARY_OPCODE_X1 = 5, + FNOP_UNARY_OPCODE_X0 = 3, + FNOP_UNARY_OPCODE_X1 = 6, + FNOP_UNARY_OPCODE_Y0 = 3, + FNOP_UNARY_OPCODE_Y1 = 8, + FSINGLE_ADD1_RRR_0_OPCODE_X0 = 34, + FSINGLE_ADDSUB2_RRR_0_OPCODE_X0 = 35, + FSINGLE_MUL1_RRR_0_OPCODE_X0 = 36, + FSINGLE_MUL2_RRR_0_OPCODE_X0 = 37, + FSINGLE_PACK1_UNARY_OPCODE_X0 = 4, + FSINGLE_PACK1_UNARY_OPCODE_Y0 = 4, + FSINGLE_PACK2_RRR_0_OPCODE_X0 = 38, + FSINGLE_SUB1_RRR_0_OPCODE_X0 = 39, + ICOH_UNARY_OPCODE_X1 = 7, + ILL_UNARY_OPCODE_X1 = 8, + ILL_UNARY_OPCODE_Y1 = 9, + IMM8_OPCODE_X0 = 4, + IMM8_OPCODE_X1 = 3, + INV_UNARY_OPCODE_X1 = 9, + IRET_UNARY_OPCODE_X1 = 10, + JALRP_UNARY_OPCODE_X1 = 11, + JALRP_UNARY_OPCODE_Y1 = 10, + JALR_UNARY_OPCODE_X1 = 12, + JALR_UNARY_OPCODE_Y1 = 11, + JAL_JUMP_OPCODE_X1 = 0, + JRP_UNARY_OPCODE_X1 = 13, + JRP_UNARY_OPCODE_Y1 = 12, + JR_UNARY_OPCODE_X1 = 14, + JR_UNARY_OPCODE_Y1 = 13, + JUMP_OPCODE_X1 = 4, + J_JUMP_OPCODE_X1 = 1, + LD1S_ADD_IMM8_OPCODE_X1 = 7, + LD1S_OPCODE_Y2 = 0, + LD1S_UNARY_OPCODE_X1 = 15, + LD1U_ADD_IMM8_OPCODE_X1 = 8, + LD1U_OPCODE_Y2 = 1, + LD1U_UNARY_OPCODE_X1 = 16, + LD2S_ADD_IMM8_OPCODE_X1 = 9, + LD2S_OPCODE_Y2 = 2, + LD2S_UNARY_OPCODE_X1 = 17, + LD2U_ADD_IMM8_OPCODE_X1 = 10, + LD2U_OPCODE_Y2 = 3, + LD2U_UNARY_OPCODE_X1 = 18, + LD4S_ADD_IMM8_OPCODE_X1 = 11, + LD4S_OPCODE_Y2 = 1, + LD4S_UNARY_OPCODE_X1 = 19, + LD4U_ADD_IMM8_OPCODE_X1 = 12, + LD4U_OPCODE_Y2 = 2, + LD4U_UNARY_OPCODE_X1 = 20, + LDNA_UNARY_OPCODE_X1 = 21, + LDNT1S_ADD_IMM8_OPCODE_X1 = 13, + LDNT1S_UNARY_OPCODE_X1 = 22, + LDNT1U_ADD_IMM8_OPCODE_X1 = 14, + LDNT1U_UNARY_OPCODE_X1 = 23, + LDNT2S_ADD_IMM8_OPCODE_X1 = 15, + LDNT2S_UNARY_OPCODE_X1 = 24, + LDNT2U_ADD_IMM8_OPCODE_X1 = 16, + LDNT2U_UNARY_OPCODE_X1 = 25, + LDNT4S_ADD_IMM8_OPCODE_X1 = 17, + LDNT4S_UNARY_OPCODE_X1 = 26, + LDNT4U_ADD_IMM8_OPCODE_X1 = 18, + LDNT4U_UNARY_OPCODE_X1 = 27, + LDNT_ADD_IMM8_OPCODE_X1 = 19, + LDNT_UNARY_OPCODE_X1 = 28, + LD_ADD_IMM8_OPCODE_X1 = 20, + LD_OPCODE_Y2 = 3, + LD_UNARY_OPCODE_X1 = 29, + LNK_UNARY_OPCODE_X1 = 30, + LNK_UNARY_OPCODE_Y1 = 14, + LWNA_ADD_IMM8_OPCODE_X1 = 21, + MFSPR_IMM8_OPCODE_X1 = 22, + MF_UNARY_OPCODE_X1 = 31, + MM_BF_OPCODE_X0 = 7, + MNZ_RRR_0_OPCODE_X0 = 40, + MNZ_RRR_0_OPCODE_X1 = 26, + MNZ_RRR_4_OPCODE_Y0 = 2, + MNZ_RRR_4_OPCODE_Y1 = 2, + MODE_OPCODE_YA2 = 1, + MODE_OPCODE_YB2 = 2, + MODE_OPCODE_YC2 = 3, + MTSPR_IMM8_OPCODE_X1 = 23, + MULAX_RRR_0_OPCODE_X0 = 41, + MULAX_RRR_3_OPCODE_Y0 = 2, + MULA_HS_HS_RRR_0_OPCODE_X0 = 42, + MULA_HS_HS_RRR_9_OPCODE_Y0 = 0, + MULA_HS_HU_RRR_0_OPCODE_X0 = 43, + MULA_HS_LS_RRR_0_OPCODE_X0 = 44, + MULA_HS_LU_RRR_0_OPCODE_X0 = 45, + MULA_HU_HU_RRR_0_OPCODE_X0 = 46, + MULA_HU_HU_RRR_9_OPCODE_Y0 = 1, + MULA_HU_LS_RRR_0_OPCODE_X0 = 47, + MULA_HU_LU_RRR_0_OPCODE_X0 = 48, + MULA_LS_LS_RRR_0_OPCODE_X0 = 49, + MULA_LS_LS_RRR_9_OPCODE_Y0 = 2, + MULA_LS_LU_RRR_0_OPCODE_X0 = 50, + MULA_LU_LU_RRR_0_OPCODE_X0 = 51, + MULA_LU_LU_RRR_9_OPCODE_Y0 = 3, + MULX_RRR_0_OPCODE_X0 = 52, + MULX_RRR_3_OPCODE_Y0 = 3, + MUL_HS_HS_RRR_0_OPCODE_X0 = 53, + MUL_HS_HS_RRR_8_OPCODE_Y0 = 0, + MUL_HS_HU_RRR_0_OPCODE_X0 = 54, + MUL_HS_LS_RRR_0_OPCODE_X0 = 55, + MUL_HS_LU_RRR_0_OPCODE_X0 = 56, + MUL_HU_HU_RRR_0_OPCODE_X0 = 57, + MUL_HU_HU_RRR_8_OPCODE_Y0 = 1, + MUL_HU_LS_RRR_0_OPCODE_X0 = 58, + MUL_HU_LU_RRR_0_OPCODE_X0 = 59, + MUL_LS_LS_RRR_0_OPCODE_X0 = 60, + MUL_LS_LS_RRR_8_OPCODE_Y0 = 2, + MUL_LS_LU_RRR_0_OPCODE_X0 = 61, + MUL_LU_LU_RRR_0_OPCODE_X0 = 62, + MUL_LU_LU_RRR_8_OPCODE_Y0 = 3, + MZ_RRR_0_OPCODE_X0 = 63, + MZ_RRR_0_OPCODE_X1 = 27, + MZ_RRR_4_OPCODE_Y0 = 3, + MZ_RRR_4_OPCODE_Y1 = 3, + NAP_UNARY_OPCODE_X1 = 32, + NOP_UNARY_OPCODE_X0 = 5, + NOP_UNARY_OPCODE_X1 = 33, + NOP_UNARY_OPCODE_Y0 = 5, + NOP_UNARY_OPCODE_Y1 = 15, + NOR_RRR_0_OPCODE_X0 = 64, + NOR_RRR_0_OPCODE_X1 = 28, + NOR_RRR_5_OPCODE_Y0 = 1, + NOR_RRR_5_OPCODE_Y1 = 1, + ORI_IMM8_OPCODE_X0 = 7, + ORI_IMM8_OPCODE_X1 = 24, + OR_RRR_0_OPCODE_X0 = 65, + OR_RRR_0_OPCODE_X1 = 29, + OR_RRR_5_OPCODE_Y0 = 2, + OR_RRR_5_OPCODE_Y1 = 2, + PCNT_UNARY_OPCODE_X0 = 6, + PCNT_UNARY_OPCODE_Y0 = 6, + REVBITS_UNARY_OPCODE_X0 = 7, + REVBITS_UNARY_OPCODE_Y0 = 7, + REVBYTES_UNARY_OPCODE_X0 = 8, + REVBYTES_UNARY_OPCODE_Y0 = 8, + ROTLI_SHIFT_OPCODE_X0 = 1, + ROTLI_SHIFT_OPCODE_X1 = 1, + ROTLI_SHIFT_OPCODE_Y0 = 0, + ROTLI_SHIFT_OPCODE_Y1 = 0, + ROTL_RRR_0_OPCODE_X0 = 66, + ROTL_RRR_0_OPCODE_X1 = 30, + ROTL_RRR_6_OPCODE_Y0 = 0, + ROTL_RRR_6_OPCODE_Y1 = 0, + RRR_0_OPCODE_X0 = 5, + RRR_0_OPCODE_X1 = 5, + RRR_0_OPCODE_Y0 = 5, + RRR_0_OPCODE_Y1 = 6, + RRR_1_OPCODE_Y0 = 6, + RRR_1_OPCODE_Y1 = 7, + RRR_2_OPCODE_Y0 = 7, + RRR_2_OPCODE_Y1 = 8, + RRR_3_OPCODE_Y0 = 8, + RRR_3_OPCODE_Y1 = 9, + RRR_4_OPCODE_Y0 = 9, + RRR_4_OPCODE_Y1 = 10, + RRR_5_OPCODE_Y0 = 10, + RRR_5_OPCODE_Y1 = 11, + RRR_6_OPCODE_Y0 = 11, + RRR_6_OPCODE_Y1 = 12, + RRR_7_OPCODE_Y0 = 12, + RRR_7_OPCODE_Y1 = 13, + RRR_8_OPCODE_Y0 = 13, + RRR_9_OPCODE_Y0 = 14, + SHIFT_OPCODE_X0 = 6, + SHIFT_OPCODE_X1 = 6, + SHIFT_OPCODE_Y0 = 15, + SHIFT_OPCODE_Y1 = 14, + SHL16INSLI_OPCODE_X0 = 7, + SHL16INSLI_OPCODE_X1 = 7, + SHL1ADDX_RRR_0_OPCODE_X0 = 67, + SHL1ADDX_RRR_0_OPCODE_X1 = 31, + SHL1ADDX_RRR_7_OPCODE_Y0 = 1, + SHL1ADDX_RRR_7_OPCODE_Y1 = 1, + SHL1ADD_RRR_0_OPCODE_X0 = 68, + SHL1ADD_RRR_0_OPCODE_X1 = 32, + SHL1ADD_RRR_1_OPCODE_Y0 = 0, + SHL1ADD_RRR_1_OPCODE_Y1 = 0, + SHL2ADDX_RRR_0_OPCODE_X0 = 69, + SHL2ADDX_RRR_0_OPCODE_X1 = 33, + SHL2ADDX_RRR_7_OPCODE_Y0 = 2, + SHL2ADDX_RRR_7_OPCODE_Y1 = 2, + SHL2ADD_RRR_0_OPCODE_X0 = 70, + SHL2ADD_RRR_0_OPCODE_X1 = 34, + SHL2ADD_RRR_1_OPCODE_Y0 = 1, + SHL2ADD_RRR_1_OPCODE_Y1 = 1, + SHL3ADDX_RRR_0_OPCODE_X0 = 71, + SHL3ADDX_RRR_0_OPCODE_X1 = 35, + SHL3ADDX_RRR_7_OPCODE_Y0 = 3, + SHL3ADDX_RRR_7_OPCODE_Y1 = 3, + SHL3ADD_RRR_0_OPCODE_X0 = 72, + SHL3ADD_RRR_0_OPCODE_X1 = 36, + SHL3ADD_RRR_1_OPCODE_Y0 = 2, + SHL3ADD_RRR_1_OPCODE_Y1 = 2, + SHLI_SHIFT_OPCODE_X0 = 2, + SHLI_SHIFT_OPCODE_X1 = 2, + SHLI_SHIFT_OPCODE_Y0 = 1, + SHLI_SHIFT_OPCODE_Y1 = 1, + SHLXI_SHIFT_OPCODE_X0 = 3, + SHLXI_SHIFT_OPCODE_X1 = 3, + SHLX_RRR_0_OPCODE_X0 = 73, + SHLX_RRR_0_OPCODE_X1 = 37, + SHL_RRR_0_OPCODE_X0 = 74, + SHL_RRR_0_OPCODE_X1 = 38, + SHL_RRR_6_OPCODE_Y0 = 1, + SHL_RRR_6_OPCODE_Y1 = 1, + SHRSI_SHIFT_OPCODE_X0 = 4, + SHRSI_SHIFT_OPCODE_X1 = 4, + SHRSI_SHIFT_OPCODE_Y0 = 2, + SHRSI_SHIFT_OPCODE_Y1 = 2, + SHRS_RRR_0_OPCODE_X0 = 75, + SHRS_RRR_0_OPCODE_X1 = 39, + SHRS_RRR_6_OPCODE_Y0 = 2, + SHRS_RRR_6_OPCODE_Y1 = 2, + SHRUI_SHIFT_OPCODE_X0 = 5, + SHRUI_SHIFT_OPCODE_X1 = 5, + SHRUI_SHIFT_OPCODE_Y0 = 3, + SHRUI_SHIFT_OPCODE_Y1 = 3, + SHRUXI_SHIFT_OPCODE_X0 = 6, + SHRUXI_SHIFT_OPCODE_X1 = 6, + SHRUX_RRR_0_OPCODE_X0 = 76, + SHRUX_RRR_0_OPCODE_X1 = 40, + SHRU_RRR_0_OPCODE_X0 = 77, + SHRU_RRR_0_OPCODE_X1 = 41, + SHRU_RRR_6_OPCODE_Y0 = 3, + SHRU_RRR_6_OPCODE_Y1 = 3, + SHUFFLEBYTES_RRR_0_OPCODE_X0 = 78, + ST1_ADD_IMM8_OPCODE_X1 = 25, + ST1_OPCODE_Y2 = 0, + ST1_RRR_0_OPCODE_X1 = 42, + ST2_ADD_IMM8_OPCODE_X1 = 26, + ST2_OPCODE_Y2 = 1, + ST2_RRR_0_OPCODE_X1 = 43, + ST4_ADD_IMM8_OPCODE_X1 = 27, + ST4_OPCODE_Y2 = 2, + ST4_RRR_0_OPCODE_X1 = 44, + STNT1_ADD_IMM8_OPCODE_X1 = 28, + STNT1_RRR_0_OPCODE_X1 = 45, + STNT2_ADD_IMM8_OPCODE_X1 = 29, + STNT2_RRR_0_OPCODE_X1 = 46, + STNT4_ADD_IMM8_OPCODE_X1 = 30, + STNT4_RRR_0_OPCODE_X1 = 47, + STNT_ADD_IMM8_OPCODE_X1 = 31, + STNT_RRR_0_OPCODE_X1 = 48, + ST_ADD_IMM8_OPCODE_X1 = 32, + ST_OPCODE_Y2 = 3, + ST_RRR_0_OPCODE_X1 = 49, + SUBXSC_RRR_0_OPCODE_X0 = 79, + SUBXSC_RRR_0_OPCODE_X1 = 50, + SUBX_RRR_0_OPCODE_X0 = 80, + SUBX_RRR_0_OPCODE_X1 = 51, + SUBX_RRR_0_OPCODE_Y0 = 2, + SUBX_RRR_0_OPCODE_Y1 = 2, + SUB_RRR_0_OPCODE_X0 = 81, + SUB_RRR_0_OPCODE_X1 = 52, + SUB_RRR_0_OPCODE_Y0 = 3, + SUB_RRR_0_OPCODE_Y1 = 3, + SWINT0_UNARY_OPCODE_X1 = 34, + SWINT1_UNARY_OPCODE_X1 = 35, + SWINT2_UNARY_OPCODE_X1 = 36, + SWINT3_UNARY_OPCODE_X1 = 37, + TBLIDXB0_UNARY_OPCODE_X0 = 9, + TBLIDXB0_UNARY_OPCODE_Y0 = 9, + TBLIDXB1_UNARY_OPCODE_X0 = 10, + TBLIDXB1_UNARY_OPCODE_Y0 = 10, + TBLIDXB2_UNARY_OPCODE_X0 = 11, + TBLIDXB2_UNARY_OPCODE_Y0 = 11, + TBLIDXB3_UNARY_OPCODE_X0 = 12, + TBLIDXB3_UNARY_OPCODE_Y0 = 12, + UNARY_RRR_0_OPCODE_X0 = 82, + UNARY_RRR_0_OPCODE_X1 = 53, + UNARY_RRR_1_OPCODE_Y0 = 3, + UNARY_RRR_1_OPCODE_Y1 = 3, + V1ADDI_IMM8_OPCODE_X0 = 8, + V1ADDI_IMM8_OPCODE_X1 = 33, + V1ADDUC_RRR_0_OPCODE_X0 = 83, + V1ADDUC_RRR_0_OPCODE_X1 = 54, + V1ADD_RRR_0_OPCODE_X0 = 84, + V1ADD_RRR_0_OPCODE_X1 = 55, + V1ADIFFU_RRR_0_OPCODE_X0 = 85, + V1AVGU_RRR_0_OPCODE_X0 = 86, + V1CMPEQI_IMM8_OPCODE_X0 = 9, + V1CMPEQI_IMM8_OPCODE_X1 = 34, + V1CMPEQ_RRR_0_OPCODE_X0 = 87, + V1CMPEQ_RRR_0_OPCODE_X1 = 56, + V1CMPLES_RRR_0_OPCODE_X0 = 88, + V1CMPLES_RRR_0_OPCODE_X1 = 57, + V1CMPLEU_RRR_0_OPCODE_X0 = 89, + V1CMPLEU_RRR_0_OPCODE_X1 = 58, + V1CMPLTSI_IMM8_OPCODE_X0 = 10, + V1CMPLTSI_IMM8_OPCODE_X1 = 35, + V1CMPLTS_RRR_0_OPCODE_X0 = 90, + V1CMPLTS_RRR_0_OPCODE_X1 = 59, + V1CMPLTUI_IMM8_OPCODE_X0 = 11, + V1CMPLTUI_IMM8_OPCODE_X1 = 36, + V1CMPLTU_RRR_0_OPCODE_X0 = 91, + V1CMPLTU_RRR_0_OPCODE_X1 = 60, + V1CMPNE_RRR_0_OPCODE_X0 = 92, + V1CMPNE_RRR_0_OPCODE_X1 = 61, + V1DDOTPUA_RRR_0_OPCODE_X0 = 161, + V1DDOTPUSA_RRR_0_OPCODE_X0 = 93, + V1DDOTPUS_RRR_0_OPCODE_X0 = 94, + V1DDOTPU_RRR_0_OPCODE_X0 = 162, + V1DOTPA_RRR_0_OPCODE_X0 = 95, + V1DOTPUA_RRR_0_OPCODE_X0 = 163, + V1DOTPUSA_RRR_0_OPCODE_X0 = 96, + V1DOTPUS_RRR_0_OPCODE_X0 = 97, + V1DOTPU_RRR_0_OPCODE_X0 = 164, + V1DOTP_RRR_0_OPCODE_X0 = 98, + V1INT_H_RRR_0_OPCODE_X0 = 99, + V1INT_H_RRR_0_OPCODE_X1 = 62, + V1INT_L_RRR_0_OPCODE_X0 = 100, + V1INT_L_RRR_0_OPCODE_X1 = 63, + V1MAXUI_IMM8_OPCODE_X0 = 12, + V1MAXUI_IMM8_OPCODE_X1 = 37, + V1MAXU_RRR_0_OPCODE_X0 = 101, + V1MAXU_RRR_0_OPCODE_X1 = 64, + V1MINUI_IMM8_OPCODE_X0 = 13, + V1MINUI_IMM8_OPCODE_X1 = 38, + V1MINU_RRR_0_OPCODE_X0 = 102, + V1MINU_RRR_0_OPCODE_X1 = 65, + V1MNZ_RRR_0_OPCODE_X0 = 103, + V1MNZ_RRR_0_OPCODE_X1 = 66, + V1MULTU_RRR_0_OPCODE_X0 = 104, + V1MULUS_RRR_0_OPCODE_X0 = 105, + V1MULU_RRR_0_OPCODE_X0 = 106, + V1MZ_RRR_0_OPCODE_X0 = 107, + V1MZ_RRR_0_OPCODE_X1 = 67, + V1SADAU_RRR_0_OPCODE_X0 = 108, + V1SADU_RRR_0_OPCODE_X0 = 109, + V1SHLI_SHIFT_OPCODE_X0 = 7, + V1SHLI_SHIFT_OPCODE_X1 = 7, + V1SHL_RRR_0_OPCODE_X0 = 110, + V1SHL_RRR_0_OPCODE_X1 = 68, + V1SHRSI_SHIFT_OPCODE_X0 = 8, + V1SHRSI_SHIFT_OPCODE_X1 = 8, + V1SHRS_RRR_0_OPCODE_X0 = 111, + V1SHRS_RRR_0_OPCODE_X1 = 69, + V1SHRUI_SHIFT_OPCODE_X0 = 9, + V1SHRUI_SHIFT_OPCODE_X1 = 9, + V1SHRU_RRR_0_OPCODE_X0 = 112, + V1SHRU_RRR_0_OPCODE_X1 = 70, + V1SUBUC_RRR_0_OPCODE_X0 = 113, + V1SUBUC_RRR_0_OPCODE_X1 = 71, + V1SUB_RRR_0_OPCODE_X0 = 114, + V1SUB_RRR_0_OPCODE_X1 = 72, + V2ADDI_IMM8_OPCODE_X0 = 14, + V2ADDI_IMM8_OPCODE_X1 = 39, + V2ADDSC_RRR_0_OPCODE_X0 = 115, + V2ADDSC_RRR_0_OPCODE_X1 = 73, + V2ADD_RRR_0_OPCODE_X0 = 116, + V2ADD_RRR_0_OPCODE_X1 = 74, + V2ADIFFS_RRR_0_OPCODE_X0 = 117, + V2AVGS_RRR_0_OPCODE_X0 = 118, + V2CMPEQI_IMM8_OPCODE_X0 = 15, + V2CMPEQI_IMM8_OPCODE_X1 = 40, + V2CMPEQ_RRR_0_OPCODE_X0 = 119, + V2CMPEQ_RRR_0_OPCODE_X1 = 75, + V2CMPLES_RRR_0_OPCODE_X0 = 120, + V2CMPLES_RRR_0_OPCODE_X1 = 76, + V2CMPLEU_RRR_0_OPCODE_X0 = 121, + V2CMPLEU_RRR_0_OPCODE_X1 = 77, + V2CMPLTSI_IMM8_OPCODE_X0 = 16, + V2CMPLTSI_IMM8_OPCODE_X1 = 41, + V2CMPLTS_RRR_0_OPCODE_X0 = 122, + V2CMPLTS_RRR_0_OPCODE_X1 = 78, + V2CMPLTUI_IMM8_OPCODE_X0 = 17, + V2CMPLTUI_IMM8_OPCODE_X1 = 42, + V2CMPLTU_RRR_0_OPCODE_X0 = 123, + V2CMPLTU_RRR_0_OPCODE_X1 = 79, + V2CMPNE_RRR_0_OPCODE_X0 = 124, + V2CMPNE_RRR_0_OPCODE_X1 = 80, + V2DOTPA_RRR_0_OPCODE_X0 = 125, + V2DOTP_RRR_0_OPCODE_X0 = 126, + V2INT_H_RRR_0_OPCODE_X0 = 127, + V2INT_H_RRR_0_OPCODE_X1 = 81, + V2INT_L_RRR_0_OPCODE_X0 = 128, + V2INT_L_RRR_0_OPCODE_X1 = 82, + V2MAXSI_IMM8_OPCODE_X0 = 18, + V2MAXSI_IMM8_OPCODE_X1 = 43, + V2MAXS_RRR_0_OPCODE_X0 = 129, + V2MAXS_RRR_0_OPCODE_X1 = 83, + V2MINSI_IMM8_OPCODE_X0 = 19, + V2MINSI_IMM8_OPCODE_X1 = 44, + V2MINS_RRR_0_OPCODE_X0 = 130, + V2MINS_RRR_0_OPCODE_X1 = 84, + V2MNZ_RRR_0_OPCODE_X0 = 131, + V2MNZ_RRR_0_OPCODE_X1 = 85, + V2MULFSC_RRR_0_OPCODE_X0 = 132, + V2MULS_RRR_0_OPCODE_X0 = 133, + V2MULTS_RRR_0_OPCODE_X0 = 134, + V2MZ_RRR_0_OPCODE_X0 = 135, + V2MZ_RRR_0_OPCODE_X1 = 86, + V2PACKH_RRR_0_OPCODE_X0 = 136, + V2PACKH_RRR_0_OPCODE_X1 = 87, + V2PACKL_RRR_0_OPCODE_X0 = 137, + V2PACKL_RRR_0_OPCODE_X1 = 88, + V2PACKUC_RRR_0_OPCODE_X0 = 138, + V2PACKUC_RRR_0_OPCODE_X1 = 89, + V2SADAS_RRR_0_OPCODE_X0 = 139, + V2SADAU_RRR_0_OPCODE_X0 = 140, + V2SADS_RRR_0_OPCODE_X0 = 141, + V2SADU_RRR_0_OPCODE_X0 = 142, + V2SHLI_SHIFT_OPCODE_X0 = 10, + V2SHLI_SHIFT_OPCODE_X1 = 10, + V2SHLSC_RRR_0_OPCODE_X0 = 143, + V2SHLSC_RRR_0_OPCODE_X1 = 90, + V2SHL_RRR_0_OPCODE_X0 = 144, + V2SHL_RRR_0_OPCODE_X1 = 91, + V2SHRSI_SHIFT_OPCODE_X0 = 11, + V2SHRSI_SHIFT_OPCODE_X1 = 11, + V2SHRS_RRR_0_OPCODE_X0 = 145, + V2SHRS_RRR_0_OPCODE_X1 = 92, + V2SHRUI_SHIFT_OPCODE_X0 = 12, + V2SHRUI_SHIFT_OPCODE_X1 = 12, + V2SHRU_RRR_0_OPCODE_X0 = 146, + V2SHRU_RRR_0_OPCODE_X1 = 93, + V2SUBSC_RRR_0_OPCODE_X0 = 147, + V2SUBSC_RRR_0_OPCODE_X1 = 94, + V2SUB_RRR_0_OPCODE_X0 = 148, + V2SUB_RRR_0_OPCODE_X1 = 95, + V4ADDSC_RRR_0_OPCODE_X0 = 149, + V4ADDSC_RRR_0_OPCODE_X1 = 96, + V4ADD_RRR_0_OPCODE_X0 = 150, + V4ADD_RRR_0_OPCODE_X1 = 97, + V4INT_H_RRR_0_OPCODE_X0 = 151, + V4INT_H_RRR_0_OPCODE_X1 = 98, + V4INT_L_RRR_0_OPCODE_X0 = 152, + V4INT_L_RRR_0_OPCODE_X1 = 99, + V4PACKSC_RRR_0_OPCODE_X0 = 153, + V4PACKSC_RRR_0_OPCODE_X1 = 100, + V4SHLSC_RRR_0_OPCODE_X0 = 154, + V4SHLSC_RRR_0_OPCODE_X1 = 101, + V4SHL_RRR_0_OPCODE_X0 = 155, + V4SHL_RRR_0_OPCODE_X1 = 102, + V4SHRS_RRR_0_OPCODE_X0 = 156, + V4SHRS_RRR_0_OPCODE_X1 = 103, + V4SHRU_RRR_0_OPCODE_X0 = 157, + V4SHRU_RRR_0_OPCODE_X1 = 104, + V4SUBSC_RRR_0_OPCODE_X0 = 158, + V4SUBSC_RRR_0_OPCODE_X1 = 105, + V4SUB_RRR_0_OPCODE_X0 = 159, + V4SUB_RRR_0_OPCODE_X1 = 106, + WH64_UNARY_OPCODE_X1 = 38, + XORI_IMM8_OPCODE_X0 = 20, + XORI_IMM8_OPCODE_X1 = 45, + XOR_RRR_0_OPCODE_X0 = 160, + XOR_RRR_0_OPCODE_X1 = 107, + XOR_RRR_5_OPCODE_Y0 = 3, + XOR_RRR_5_OPCODE_Y1 = 3 +}; + +static __inline unsigned int +get_BFEnd_X0(tilegx_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 12)) & 0x3f); +} + +static __inline unsigned int +get_BFOpcodeExtension_X0(tilegx_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 24)) & 0xf); +} + +static __inline unsigned int +get_BFStart_X0(tilegx_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 18)) & 0x3f); +} + +static __inline unsigned int +get_BrOff_X1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 31)) & 0x0000003f) | + (((unsigned int)(n >> 37)) & 0x0001ffc0); +} + +static __inline unsigned int +get_BrType_X1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 54)) & 0x1f); +} + +static __inline unsigned int +get_Dest_Imm8_X1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 31)) & 0x0000003f) | + (((unsigned int)(n >> 43)) & 0x000000c0); +} + +static __inline unsigned int +get_Dest_X0(tilegx_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 0)) & 0x3f); +} + +static __inline unsigned int +get_Dest_X1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 31)) & 0x3f); +} + +static __inline unsigned int +get_Dest_Y0(tilegx_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 0)) & 0x3f); +} + +static __inline unsigned int +get_Dest_Y1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 31)) & 0x3f); +} + +static __inline unsigned int +get_Imm16_X0(tilegx_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 12)) & 0xffff); +} + +static __inline unsigned int +get_Imm16_X1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 43)) & 0xffff); +} + +static __inline unsigned int +get_Imm8OpcodeExtension_X0(tilegx_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 20)) & 0xff); +} + +static __inline unsigned int +get_Imm8OpcodeExtension_X1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 51)) & 0xff); +} + +static __inline unsigned int +get_Imm8_X0(tilegx_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 12)) & 0xff); +} + +static __inline unsigned int +get_Imm8_X1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 43)) & 0xff); +} + +static __inline unsigned int +get_Imm8_Y0(tilegx_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 12)) & 0xff); +} + +static __inline unsigned int +get_Imm8_Y1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 43)) & 0xff); +} + +static __inline unsigned int +get_JumpOff_X1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 31)) & 0x7ffffff); +} + +static __inline unsigned int +get_JumpOpcodeExtension_X1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 58)) & 0x1); +} + +static __inline unsigned int +get_MF_Imm14_X1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 37)) & 0x3fff); +} + +static __inline unsigned int +get_MT_Imm14_X1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 31)) & 0x0000003f) | + (((unsigned int)(n >> 37)) & 0x00003fc0); +} + +static __inline unsigned int +get_Mode(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 62)) & 0x3); +} + +static __inline unsigned int +get_Opcode_X0(tilegx_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 28)) & 0x7); +} + +static __inline unsigned int +get_Opcode_X1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 59)) & 0x7); +} + +static __inline unsigned int +get_Opcode_Y0(tilegx_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 27)) & 0xf); +} + +static __inline unsigned int +get_Opcode_Y1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 58)) & 0xf); +} + +static __inline unsigned int +get_Opcode_Y2(tilegx_bundle_bits n) +{ + return (((n >> 26)) & 0x00000001) | + (((unsigned int)(n >> 56)) & 0x00000002); +} + +static __inline unsigned int +get_RRROpcodeExtension_X0(tilegx_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 18)) & 0x3ff); +} + +static __inline unsigned int +get_RRROpcodeExtension_X1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 49)) & 0x3ff); +} + +static __inline unsigned int +get_RRROpcodeExtension_Y0(tilegx_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 18)) & 0x3); +} + +static __inline unsigned int +get_RRROpcodeExtension_Y1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 49)) & 0x3); +} + +static __inline unsigned int +get_ShAmt_X0(tilegx_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 12)) & 0x3f); +} + +static __inline unsigned int +get_ShAmt_X1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 43)) & 0x3f); +} + +static __inline unsigned int +get_ShAmt_Y0(tilegx_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 12)) & 0x3f); +} + +static __inline unsigned int +get_ShAmt_Y1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 43)) & 0x3f); +} + +static __inline unsigned int +get_ShiftOpcodeExtension_X0(tilegx_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 18)) & 0x3ff); +} + +static __inline unsigned int +get_ShiftOpcodeExtension_X1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 49)) & 0x3ff); +} + +static __inline unsigned int +get_ShiftOpcodeExtension_Y0(tilegx_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 18)) & 0x3); +} + +static __inline unsigned int +get_ShiftOpcodeExtension_Y1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 49)) & 0x3); +} + +static __inline unsigned int +get_SrcA_X0(tilegx_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 6)) & 0x3f); +} + +static __inline unsigned int +get_SrcA_X1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 37)) & 0x3f); +} + +static __inline unsigned int +get_SrcA_Y0(tilegx_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 6)) & 0x3f); +} + +static __inline unsigned int +get_SrcA_Y1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 37)) & 0x3f); +} + +static __inline unsigned int +get_SrcA_Y2(tilegx_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 20)) & 0x3f); +} + +static __inline unsigned int +get_SrcBDest_Y2(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 51)) & 0x3f); +} + +static __inline unsigned int +get_SrcB_X0(tilegx_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 12)) & 0x3f); +} + +static __inline unsigned int +get_SrcB_X1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 43)) & 0x3f); +} + +static __inline unsigned int +get_SrcB_Y0(tilegx_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 12)) & 0x3f); +} + +static __inline unsigned int +get_SrcB_Y1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 43)) & 0x3f); +} + +static __inline unsigned int +get_UnaryOpcodeExtension_X0(tilegx_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 12)) & 0x3f); +} + +static __inline unsigned int +get_UnaryOpcodeExtension_X1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 43)) & 0x3f); +} + +static __inline unsigned int +get_UnaryOpcodeExtension_Y0(tilegx_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 12)) & 0x3f); +} + +static __inline unsigned int +get_UnaryOpcodeExtension_Y1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 43)) & 0x3f); +} + +static __inline int +sign_extend(int n, int num_bits) +{ + int shift = (int)(sizeof(int) * 8 - num_bits); + return (n << shift) >> shift; +} + +static __inline tilegx_bundle_bits +create_BFEnd_X0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x3f) << 12); +} + +static __inline tilegx_bundle_bits +create_BFOpcodeExtension_X0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0xf) << 24); +} + +static __inline tilegx_bundle_bits +create_BFStart_X0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x3f) << 18); +} + +static __inline tilegx_bundle_bits +create_BrOff_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0x0000003f)) << 31) | + (((tilegx_bundle_bits)(n & 0x0001ffc0)) << 37); +} + +static __inline tilegx_bundle_bits +create_BrType_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0x1f)) << 54); +} + +static __inline tilegx_bundle_bits +create_Dest_Imm8_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0x0000003f)) << 31) | + (((tilegx_bundle_bits)(n & 0x000000c0)) << 43); +} + +static __inline tilegx_bundle_bits +create_Dest_X0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x3f) << 0); +} + +static __inline tilegx_bundle_bits +create_Dest_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0x3f)) << 31); +} + +static __inline tilegx_bundle_bits +create_Dest_Y0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x3f) << 0); +} + +static __inline tilegx_bundle_bits +create_Dest_Y1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0x3f)) << 31); +} + +static __inline tilegx_bundle_bits +create_Imm16_X0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0xffff) << 12); +} + +static __inline tilegx_bundle_bits +create_Imm16_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0xffff)) << 43); +} + +static __inline tilegx_bundle_bits +create_Imm8OpcodeExtension_X0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0xff) << 20); +} + +static __inline tilegx_bundle_bits +create_Imm8OpcodeExtension_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0xff)) << 51); +} + +static __inline tilegx_bundle_bits +create_Imm8_X0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0xff) << 12); +} + +static __inline tilegx_bundle_bits +create_Imm8_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0xff)) << 43); +} + +static __inline tilegx_bundle_bits +create_Imm8_Y0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0xff) << 12); +} + +static __inline tilegx_bundle_bits +create_Imm8_Y1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0xff)) << 43); +} + +static __inline tilegx_bundle_bits +create_JumpOff_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0x7ffffff)) << 31); +} + +static __inline tilegx_bundle_bits +create_JumpOpcodeExtension_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0x1)) << 58); +} + +static __inline tilegx_bundle_bits +create_MF_Imm14_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0x3fff)) << 37); +} + +static __inline tilegx_bundle_bits +create_MT_Imm14_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0x0000003f)) << 31) | + (((tilegx_bundle_bits)(n & 0x00003fc0)) << 37); +} + +static __inline tilegx_bundle_bits +create_Mode(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0x3)) << 62); +} + +static __inline tilegx_bundle_bits +create_Opcode_X0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x7) << 28); +} + +static __inline tilegx_bundle_bits +create_Opcode_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0x7)) << 59); +} + +static __inline tilegx_bundle_bits +create_Opcode_Y0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0xf) << 27); +} + +static __inline tilegx_bundle_bits +create_Opcode_Y1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0xf)) << 58); +} + +static __inline tilegx_bundle_bits +create_Opcode_Y2(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x00000001) << 26) | + (((tilegx_bundle_bits)(n & 0x00000002)) << 56); +} + +static __inline tilegx_bundle_bits +create_RRROpcodeExtension_X0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x3ff) << 18); +} + +static __inline tilegx_bundle_bits +create_RRROpcodeExtension_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0x3ff)) << 49); +} + +static __inline tilegx_bundle_bits +create_RRROpcodeExtension_Y0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x3) << 18); +} + +static __inline tilegx_bundle_bits +create_RRROpcodeExtension_Y1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0x3)) << 49); +} + +static __inline tilegx_bundle_bits +create_ShAmt_X0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x3f) << 12); +} + +static __inline tilegx_bundle_bits +create_ShAmt_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0x3f)) << 43); +} + +static __inline tilegx_bundle_bits +create_ShAmt_Y0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x3f) << 12); +} + +static __inline tilegx_bundle_bits +create_ShAmt_Y1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0x3f)) << 43); +} + +static __inline tilegx_bundle_bits +create_ShiftOpcodeExtension_X0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x3ff) << 18); +} + +static __inline tilegx_bundle_bits +create_ShiftOpcodeExtension_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0x3ff)) << 49); +} + +static __inline tilegx_bundle_bits +create_ShiftOpcodeExtension_Y0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x3) << 18); +} + +static __inline tilegx_bundle_bits +create_ShiftOpcodeExtension_Y1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0x3)) << 49); +} + +static __inline tilegx_bundle_bits +create_SrcA_X0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x3f) << 6); +} + +static __inline tilegx_bundle_bits +create_SrcA_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0x3f)) << 37); +} + +static __inline tilegx_bundle_bits +create_SrcA_Y0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x3f) << 6); +} + +static __inline tilegx_bundle_bits +create_SrcA_Y1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0x3f)) << 37); +} + +static __inline tilegx_bundle_bits +create_SrcA_Y2(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x3f) << 20); +} + +static __inline tilegx_bundle_bits +create_SrcBDest_Y2(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0x3f)) << 51); +} + +static __inline tilegx_bundle_bits +create_SrcB_X0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x3f) << 12); +} + +static __inline tilegx_bundle_bits +create_SrcB_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0x3f)) << 43); +} + +static __inline tilegx_bundle_bits +create_SrcB_Y0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x3f) << 12); +} + +static __inline tilegx_bundle_bits +create_SrcB_Y1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0x3f)) << 43); +} + +static __inline tilegx_bundle_bits +create_UnaryOpcodeExtension_X0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x3f) << 12); +} + +static __inline tilegx_bundle_bits +create_UnaryOpcodeExtension_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0x3f)) << 43); +} + +static __inline tilegx_bundle_bits +create_UnaryOpcodeExtension_Y0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x3f) << 12); +} + +static __inline tilegx_bundle_bits +create_UnaryOpcodeExtension_Y1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0x3f)) << 43); +} + +const struct tilegx_opcode tilegx_opcodes[336] = +{ + { "bpt", TILEGX_OPC_BPT, 0x2, 0, TREG_ZERO, 0, + { { 0, }, { }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xffffffff80000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x286a44ae00000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "info", TILEGX_OPC_INFO, 0xf, 1, TREG_ZERO, 1, + { { 0 }, { 1 }, { 2 }, { 3 }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ff00fffULL, + 0xfff807ff80000000ULL, + 0x0000000078000fffULL, + 0x3c0007ff80000000ULL, + 0ULL + }, + { + 0x0000000040300fffULL, + 0x181807ff80000000ULL, + 0x0000000010000fffULL, + 0x0c0007ff80000000ULL, + -1ULL + } +#endif + }, + { "infol", TILEGX_OPC_INFOL, 0x3, 1, TREG_ZERO, 1, + { { 4 }, { 5 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc000000070000fffULL, + 0xf80007ff80000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000070000fffULL, + 0x380007ff80000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "ld4s_tls", TILEGX_OPC_LD4S_TLS, 0x2, 3, TREG_ZERO, 1, + { { 0, }, { 6, 7, 1 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffff80000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x1858000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "ld_tls", TILEGX_OPC_LD_TLS, 0x2, 3, TREG_ZERO, 1, + { { 0, }, { 6, 7, 1 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffff80000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x18a0000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "move", TILEGX_OPC_MOVE, 0xf, 2, TREG_ZERO, 1, + { { 8, 9 }, { 6, 7 }, { 10, 11 }, { 12, 13 }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffff000ULL, + 0xfffff80000000000ULL, + 0x00000000780ff000ULL, + 0x3c07f80000000000ULL, + 0ULL + }, + { + 0x000000005107f000ULL, + 0x283bf80000000000ULL, + 0x00000000500bf000ULL, + 0x2c05f80000000000ULL, + -1ULL + } +#endif + }, + { "movei", TILEGX_OPC_MOVEI, 0xf, 2, TREG_ZERO, 1, + { { 8, 0 }, { 6, 1 }, { 10, 2 }, { 12, 3 }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ff00fc0ULL, + 0xfff807e000000000ULL, + 0x0000000078000fc0ULL, + 0x3c0007e000000000ULL, + 0ULL + }, + { + 0x0000000040100fc0ULL, + 0x180807e000000000ULL, + 0x0000000000000fc0ULL, + 0x040007e000000000ULL, + -1ULL + } +#endif + }, + { "moveli", TILEGX_OPC_MOVELI, 0x3, 2, TREG_ZERO, 1, + { { 8, 4 }, { 6, 5 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc000000070000fc0ULL, + 0xf80007e000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000010000fc0ULL, + 0x000007e000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "prefetch", TILEGX_OPC_PREFETCH, 0x12, 1, TREG_ZERO, 1, + { { 0, }, { 7 }, { 0, }, { 0, }, { 14 } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffff81f80000000ULL, + 0ULL, + 0ULL, + 0xc3f8000004000000ULL + }, + { + -1ULL, + 0x286a801f80000000ULL, + -1ULL, + -1ULL, + 0x41f8000004000000ULL + } +#endif + }, + { "prefetch_add_l1", TILEGX_OPC_PREFETCH_ADD_L1, 0x2, 2, TREG_ZERO, 1, + { { 0, }, { 15, 1 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfff8001f80000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x1840001f80000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "prefetch_add_l1_fault", TILEGX_OPC_PREFETCH_ADD_L1_FAULT, 0x2, 2, TREG_ZERO, 1, + { { 0, }, { 15, 1 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfff8001f80000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x1838001f80000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "prefetch_add_l2", TILEGX_OPC_PREFETCH_ADD_L2, 0x2, 2, TREG_ZERO, 1, + { { 0, }, { 15, 1 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfff8001f80000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x1850001f80000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "prefetch_add_l2_fault", TILEGX_OPC_PREFETCH_ADD_L2_FAULT, 0x2, 2, TREG_ZERO, 1, + { { 0, }, { 15, 1 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfff8001f80000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x1848001f80000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "prefetch_add_l3", TILEGX_OPC_PREFETCH_ADD_L3, 0x2, 2, TREG_ZERO, 1, + { { 0, }, { 15, 1 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfff8001f80000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x1860001f80000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "prefetch_add_l3_fault", TILEGX_OPC_PREFETCH_ADD_L3_FAULT, 0x2, 2, TREG_ZERO, 1, + { { 0, }, { 15, 1 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfff8001f80000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x1858001f80000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "prefetch_l1", TILEGX_OPC_PREFETCH_L1, 0x12, 1, TREG_ZERO, 1, + { { 0, }, { 7 }, { 0, }, { 0, }, { 14 } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffff81f80000000ULL, + 0ULL, + 0ULL, + 0xc3f8000004000000ULL + }, + { + -1ULL, + 0x286a801f80000000ULL, + -1ULL, + -1ULL, + 0x41f8000004000000ULL + } +#endif + }, + { "prefetch_l1_fault", TILEGX_OPC_PREFETCH_L1_FAULT, 0x12, 1, TREG_ZERO, 1, + { { 0, }, { 7 }, { 0, }, { 0, }, { 14 } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffff81f80000000ULL, + 0ULL, + 0ULL, + 0xc3f8000004000000ULL + }, + { + -1ULL, + 0x286a781f80000000ULL, + -1ULL, + -1ULL, + 0x41f8000000000000ULL + } +#endif + }, + { "prefetch_l2", TILEGX_OPC_PREFETCH_L2, 0x12, 1, TREG_ZERO, 1, + { { 0, }, { 7 }, { 0, }, { 0, }, { 14 } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffff81f80000000ULL, + 0ULL, + 0ULL, + 0xc3f8000004000000ULL + }, + { + -1ULL, + 0x286a901f80000000ULL, + -1ULL, + -1ULL, + 0x43f8000004000000ULL + } +#endif + }, + { "prefetch_l2_fault", TILEGX_OPC_PREFETCH_L2_FAULT, 0x12, 1, TREG_ZERO, 1, + { { 0, }, { 7 }, { 0, }, { 0, }, { 14 } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffff81f80000000ULL, + 0ULL, + 0ULL, + 0xc3f8000004000000ULL + }, + { + -1ULL, + 0x286a881f80000000ULL, + -1ULL, + -1ULL, + 0x43f8000000000000ULL + } +#endif + }, + { "prefetch_l3", TILEGX_OPC_PREFETCH_L3, 0x12, 1, TREG_ZERO, 1, + { { 0, }, { 7 }, { 0, }, { 0, }, { 14 } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffff81f80000000ULL, + 0ULL, + 0ULL, + 0xc3f8000004000000ULL + }, + { + -1ULL, + 0x286aa01f80000000ULL, + -1ULL, + -1ULL, + 0x83f8000000000000ULL + } +#endif + }, + { "prefetch_l3_fault", TILEGX_OPC_PREFETCH_L3_FAULT, 0x12, 1, TREG_ZERO, 1, + { { 0, }, { 7 }, { 0, }, { 0, }, { 14 } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffff81f80000000ULL, + 0ULL, + 0ULL, + 0xc3f8000004000000ULL + }, + { + -1ULL, + 0x286a981f80000000ULL, + -1ULL, + -1ULL, + 0x81f8000004000000ULL + } +#endif + }, + { "raise", TILEGX_OPC_RAISE, 0x2, 0, TREG_ZERO, 1, + { { 0, }, { }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xffffffff80000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x286a44ae80000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "add", TILEGX_OPC_ADD, 0xf, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0x00000000780c0000ULL, + 0x3c06000000000000ULL, + 0ULL + }, + { + 0x00000000500c0000ULL, + 0x2806000000000000ULL, + 0x0000000028040000ULL, + 0x1802000000000000ULL, + -1ULL + } +#endif + }, + { "addi", TILEGX_OPC_ADDI, 0xf, 3, TREG_ZERO, 1, + { { 8, 9, 0 }, { 6, 7, 1 }, { 10, 11, 2 }, { 12, 13, 3 }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ff00000ULL, + 0xfff8000000000000ULL, + 0x0000000078000000ULL, + 0x3c00000000000000ULL, + 0ULL + }, + { + 0x0000000040100000ULL, + 0x1808000000000000ULL, + 0ULL, + 0x0400000000000000ULL, + -1ULL + } +#endif + }, + { "addli", TILEGX_OPC_ADDLI, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 4 }, { 6, 7, 5 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc000000070000000ULL, + 0xf800000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000010000000ULL, + 0ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "addx", TILEGX_OPC_ADDX, 0xf, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0x00000000780c0000ULL, + 0x3c06000000000000ULL, + 0ULL + }, + { + 0x0000000050080000ULL, + 0x2804000000000000ULL, + 0x0000000028000000ULL, + 0x1800000000000000ULL, + -1ULL + } +#endif + }, + { "addxi", TILEGX_OPC_ADDXI, 0xf, 3, TREG_ZERO, 1, + { { 8, 9, 0 }, { 6, 7, 1 }, { 10, 11, 2 }, { 12, 13, 3 }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ff00000ULL, + 0xfff8000000000000ULL, + 0x0000000078000000ULL, + 0x3c00000000000000ULL, + 0ULL + }, + { + 0x0000000040200000ULL, + 0x1810000000000000ULL, + 0x0000000008000000ULL, + 0x0800000000000000ULL, + -1ULL + } +#endif + }, + { "addxli", TILEGX_OPC_ADDXLI, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 4 }, { 6, 7, 5 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc000000070000000ULL, + 0xf800000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000020000000ULL, + 0x0800000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "addxsc", TILEGX_OPC_ADDXSC, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000050040000ULL, + 0x2802000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "and", TILEGX_OPC_AND, 0xf, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0x00000000780c0000ULL, + 0x3c06000000000000ULL, + 0ULL + }, + { + 0x0000000050100000ULL, + 0x2808000000000000ULL, + 0x0000000050000000ULL, + 0x2c00000000000000ULL, + -1ULL + } +#endif + }, + { "andi", TILEGX_OPC_ANDI, 0xf, 3, TREG_ZERO, 1, + { { 8, 9, 0 }, { 6, 7, 1 }, { 10, 11, 2 }, { 12, 13, 3 }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ff00000ULL, + 0xfff8000000000000ULL, + 0x0000000078000000ULL, + 0x3c00000000000000ULL, + 0ULL + }, + { + 0x0000000040300000ULL, + 0x1818000000000000ULL, + 0x0000000010000000ULL, + 0x0c00000000000000ULL, + -1ULL + } +#endif + }, + { "beqz", TILEGX_OPC_BEQZ, 0x2, 2, TREG_ZERO, 1, + { { 0, }, { 7, 20 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xffc0000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x1440000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "beqzt", TILEGX_OPC_BEQZT, 0x2, 2, TREG_ZERO, 1, + { { 0, }, { 7, 20 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xffc0000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x1400000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "bfexts", TILEGX_OPC_BFEXTS, 0x1, 4, TREG_ZERO, 1, + { { 8, 9, 21, 22 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007f000000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000034000000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "bfextu", TILEGX_OPC_BFEXTU, 0x1, 4, TREG_ZERO, 1, + { { 8, 9, 21, 22 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007f000000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000035000000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "bfins", TILEGX_OPC_BFINS, 0x1, 4, TREG_ZERO, 1, + { { 23, 9, 21, 22 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007f000000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000036000000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "bgez", TILEGX_OPC_BGEZ, 0x2, 2, TREG_ZERO, 1, + { { 0, }, { 7, 20 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xffc0000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x14c0000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "bgezt", TILEGX_OPC_BGEZT, 0x2, 2, TREG_ZERO, 1, + { { 0, }, { 7, 20 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xffc0000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x1480000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "bgtz", TILEGX_OPC_BGTZ, 0x2, 2, TREG_ZERO, 1, + { { 0, }, { 7, 20 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xffc0000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x1540000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "bgtzt", TILEGX_OPC_BGTZT, 0x2, 2, TREG_ZERO, 1, + { { 0, }, { 7, 20 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xffc0000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x1500000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "blbc", TILEGX_OPC_BLBC, 0x2, 2, TREG_ZERO, 1, + { { 0, }, { 7, 20 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xffc0000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x15c0000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "blbct", TILEGX_OPC_BLBCT, 0x2, 2, TREG_ZERO, 1, + { { 0, }, { 7, 20 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xffc0000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x1580000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "blbs", TILEGX_OPC_BLBS, 0x2, 2, TREG_ZERO, 1, + { { 0, }, { 7, 20 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xffc0000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x1640000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "blbst", TILEGX_OPC_BLBST, 0x2, 2, TREG_ZERO, 1, + { { 0, }, { 7, 20 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xffc0000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x1600000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "blez", TILEGX_OPC_BLEZ, 0x2, 2, TREG_ZERO, 1, + { { 0, }, { 7, 20 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xffc0000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x16c0000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "blezt", TILEGX_OPC_BLEZT, 0x2, 2, TREG_ZERO, 1, + { { 0, }, { 7, 20 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xffc0000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x1680000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "bltz", TILEGX_OPC_BLTZ, 0x2, 2, TREG_ZERO, 1, + { { 0, }, { 7, 20 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xffc0000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x1740000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "bltzt", TILEGX_OPC_BLTZT, 0x2, 2, TREG_ZERO, 1, + { { 0, }, { 7, 20 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xffc0000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x1700000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "bnez", TILEGX_OPC_BNEZ, 0x2, 2, TREG_ZERO, 1, + { { 0, }, { 7, 20 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xffc0000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x17c0000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "bnezt", TILEGX_OPC_BNEZT, 0x2, 2, TREG_ZERO, 1, + { { 0, }, { 7, 20 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xffc0000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x1780000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "clz", TILEGX_OPC_CLZ, 0x5, 2, TREG_ZERO, 1, + { { 8, 9 }, { 0, }, { 10, 11 }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffff000ULL, + 0ULL, + 0x00000000780ff000ULL, + 0ULL, + 0ULL + }, + { + 0x0000000051481000ULL, + -1ULL, + 0x00000000300c1000ULL, + -1ULL, + -1ULL + } +#endif + }, + { "cmoveqz", TILEGX_OPC_CMOVEQZ, 0x5, 3, TREG_ZERO, 1, + { { 23, 9, 16 }, { 0, }, { 24, 11, 18 }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0x00000000780c0000ULL, + 0ULL, + 0ULL + }, + { + 0x0000000050140000ULL, + -1ULL, + 0x0000000048000000ULL, + -1ULL, + -1ULL + } +#endif + }, + { "cmovnez", TILEGX_OPC_CMOVNEZ, 0x5, 3, TREG_ZERO, 1, + { { 23, 9, 16 }, { 0, }, { 24, 11, 18 }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0x00000000780c0000ULL, + 0ULL, + 0ULL + }, + { + 0x0000000050180000ULL, + -1ULL, + 0x0000000048040000ULL, + -1ULL, + -1ULL + } +#endif + }, + { "cmpeq", TILEGX_OPC_CMPEQ, 0xf, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0x00000000780c0000ULL, + 0x3c06000000000000ULL, + 0ULL + }, + { + 0x00000000501c0000ULL, + 0x280a000000000000ULL, + 0x0000000040000000ULL, + 0x2404000000000000ULL, + -1ULL + } +#endif + }, + { "cmpeqi", TILEGX_OPC_CMPEQI, 0xf, 3, TREG_ZERO, 1, + { { 8, 9, 0 }, { 6, 7, 1 }, { 10, 11, 2 }, { 12, 13, 3 }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ff00000ULL, + 0xfff8000000000000ULL, + 0x0000000078000000ULL, + 0x3c00000000000000ULL, + 0ULL + }, + { + 0x0000000040400000ULL, + 0x1820000000000000ULL, + 0x0000000018000000ULL, + 0x1000000000000000ULL, + -1ULL + } +#endif + }, + { "cmpexch", TILEGX_OPC_CMPEXCH, 0x2, 3, TREG_ZERO, 1, + { { 0, }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x280e000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "cmpexch4", TILEGX_OPC_CMPEXCH4, 0x2, 3, TREG_ZERO, 1, + { { 0, }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x280c000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "cmples", TILEGX_OPC_CMPLES, 0xf, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0x00000000780c0000ULL, + 0x3c06000000000000ULL, + 0ULL + }, + { + 0x0000000050200000ULL, + 0x2810000000000000ULL, + 0x0000000038000000ULL, + 0x2000000000000000ULL, + -1ULL + } +#endif + }, + { "cmpleu", TILEGX_OPC_CMPLEU, 0xf, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0x00000000780c0000ULL, + 0x3c06000000000000ULL, + 0ULL + }, + { + 0x0000000050240000ULL, + 0x2812000000000000ULL, + 0x0000000038040000ULL, + 0x2002000000000000ULL, + -1ULL + } +#endif + }, + { "cmplts", TILEGX_OPC_CMPLTS, 0xf, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0x00000000780c0000ULL, + 0x3c06000000000000ULL, + 0ULL + }, + { + 0x0000000050280000ULL, + 0x2814000000000000ULL, + 0x0000000038080000ULL, + 0x2004000000000000ULL, + -1ULL + } +#endif + }, + { "cmpltsi", TILEGX_OPC_CMPLTSI, 0xf, 3, TREG_ZERO, 1, + { { 8, 9, 0 }, { 6, 7, 1 }, { 10, 11, 2 }, { 12, 13, 3 }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ff00000ULL, + 0xfff8000000000000ULL, + 0x0000000078000000ULL, + 0x3c00000000000000ULL, + 0ULL + }, + { + 0x0000000040500000ULL, + 0x1828000000000000ULL, + 0x0000000020000000ULL, + 0x1400000000000000ULL, + -1ULL + } +#endif + }, + { "cmpltu", TILEGX_OPC_CMPLTU, 0xf, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0x00000000780c0000ULL, + 0x3c06000000000000ULL, + 0ULL + }, + { + 0x00000000502c0000ULL, + 0x2816000000000000ULL, + 0x00000000380c0000ULL, + 0x2006000000000000ULL, + -1ULL + } +#endif + }, + { "cmpltui", TILEGX_OPC_CMPLTUI, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 0 }, { 6, 7, 1 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ff00000ULL, + 0xfff8000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000040600000ULL, + 0x1830000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "cmpne", TILEGX_OPC_CMPNE, 0xf, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0x00000000780c0000ULL, + 0x3c06000000000000ULL, + 0ULL + }, + { + 0x0000000050300000ULL, + 0x2818000000000000ULL, + 0x0000000040040000ULL, + 0x2406000000000000ULL, + -1ULL + } +#endif + }, + { "cmul", TILEGX_OPC_CMUL, 0x1, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x00000000504c0000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "cmula", TILEGX_OPC_CMULA, 0x1, 3, TREG_ZERO, 1, + { { 23, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000050380000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "cmulaf", TILEGX_OPC_CMULAF, 0x1, 3, TREG_ZERO, 1, + { { 23, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000050340000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "cmulf", TILEGX_OPC_CMULF, 0x1, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000050400000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "cmulfr", TILEGX_OPC_CMULFR, 0x1, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x00000000503c0000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "cmulh", TILEGX_OPC_CMULH, 0x1, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000050480000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "cmulhr", TILEGX_OPC_CMULHR, 0x1, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000050440000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "crc32_32", TILEGX_OPC_CRC32_32, 0x1, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000050500000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "crc32_8", TILEGX_OPC_CRC32_8, 0x1, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000050540000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "ctz", TILEGX_OPC_CTZ, 0x5, 2, TREG_ZERO, 1, + { { 8, 9 }, { 0, }, { 10, 11 }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffff000ULL, + 0ULL, + 0x00000000780ff000ULL, + 0ULL, + 0ULL + }, + { + 0x0000000051482000ULL, + -1ULL, + 0x00000000300c2000ULL, + -1ULL, + -1ULL + } +#endif + }, + { "dblalign", TILEGX_OPC_DBLALIGN, 0x1, 3, TREG_ZERO, 1, + { { 23, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000050640000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "dblalign2", TILEGX_OPC_DBLALIGN2, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000050580000ULL, + 0x281a000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "dblalign4", TILEGX_OPC_DBLALIGN4, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x00000000505c0000ULL, + 0x281c000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "dblalign6", TILEGX_OPC_DBLALIGN6, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000050600000ULL, + 0x281e000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "drain", TILEGX_OPC_DRAIN, 0x2, 0, TREG_ZERO, 0, + { { 0, }, { }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffff80000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x286a080000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "dtlbpr", TILEGX_OPC_DTLBPR, 0x2, 1, TREG_ZERO, 1, + { { 0, }, { 7 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffff80000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x286a100000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "exch", TILEGX_OPC_EXCH, 0x2, 3, TREG_ZERO, 1, + { { 0, }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x2822000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "exch4", TILEGX_OPC_EXCH4, 0x2, 3, TREG_ZERO, 1, + { { 0, }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x2820000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "fdouble_add_flags", TILEGX_OPC_FDOUBLE_ADD_FLAGS, 0x1, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x00000000506c0000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "fdouble_addsub", TILEGX_OPC_FDOUBLE_ADDSUB, 0x1, 3, TREG_ZERO, 1, + { { 23, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000050680000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "fdouble_mul_flags", TILEGX_OPC_FDOUBLE_MUL_FLAGS, 0x1, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000050700000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "fdouble_pack1", TILEGX_OPC_FDOUBLE_PACK1, 0x1, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000050740000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "fdouble_pack2", TILEGX_OPC_FDOUBLE_PACK2, 0x1, 3, TREG_ZERO, 1, + { { 23, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000050780000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "fdouble_sub_flags", TILEGX_OPC_FDOUBLE_SUB_FLAGS, 0x1, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x00000000507c0000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "fdouble_unpack_max", TILEGX_OPC_FDOUBLE_UNPACK_MAX, 0x1, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000050800000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "fdouble_unpack_min", TILEGX_OPC_FDOUBLE_UNPACK_MIN, 0x1, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000050840000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "fetchadd", TILEGX_OPC_FETCHADD, 0x2, 3, TREG_ZERO, 1, + { { 0, }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x282a000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "fetchadd4", TILEGX_OPC_FETCHADD4, 0x2, 3, TREG_ZERO, 1, + { { 0, }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x2824000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "fetchaddgez", TILEGX_OPC_FETCHADDGEZ, 0x2, 3, TREG_ZERO, 1, + { { 0, }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x2828000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "fetchaddgez4", TILEGX_OPC_FETCHADDGEZ4, 0x2, 3, TREG_ZERO, 1, + { { 0, }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x2826000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "fetchand", TILEGX_OPC_FETCHAND, 0x2, 3, TREG_ZERO, 1, + { { 0, }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x282e000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "fetchand4", TILEGX_OPC_FETCHAND4, 0x2, 3, TREG_ZERO, 1, + { { 0, }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x282c000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "fetchor", TILEGX_OPC_FETCHOR, 0x2, 3, TREG_ZERO, 1, + { { 0, }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x2832000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "fetchor4", TILEGX_OPC_FETCHOR4, 0x2, 3, TREG_ZERO, 1, + { { 0, }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x2830000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "finv", TILEGX_OPC_FINV, 0x2, 1, TREG_ZERO, 1, + { { 0, }, { 7 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffff80000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x286a180000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "flush", TILEGX_OPC_FLUSH, 0x2, 1, TREG_ZERO, 1, + { { 0, }, { 7 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffff80000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x286a280000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "flushwb", TILEGX_OPC_FLUSHWB, 0x2, 0, TREG_ZERO, 1, + { { 0, }, { }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffff80000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x286a200000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "fnop", TILEGX_OPC_FNOP, 0xf, 0, TREG_ZERO, 1, + { { }, { }, { }, { }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffff000ULL, + 0xfffff80000000000ULL, + 0x00000000780ff000ULL, + 0x3c07f80000000000ULL, + 0ULL + }, + { + 0x0000000051483000ULL, + 0x286a300000000000ULL, + 0x00000000300c3000ULL, + 0x1c06400000000000ULL, + -1ULL + } +#endif + }, + { "fsingle_add1", TILEGX_OPC_FSINGLE_ADD1, 0x1, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000050880000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "fsingle_addsub2", TILEGX_OPC_FSINGLE_ADDSUB2, 0x1, 3, TREG_ZERO, 1, + { { 23, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x00000000508c0000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "fsingle_mul1", TILEGX_OPC_FSINGLE_MUL1, 0x1, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000050900000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "fsingle_mul2", TILEGX_OPC_FSINGLE_MUL2, 0x1, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000050940000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "fsingle_pack1", TILEGX_OPC_FSINGLE_PACK1, 0x5, 2, TREG_ZERO, 1, + { { 8, 9 }, { 0, }, { 10, 11 }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffff000ULL, + 0ULL, + 0x00000000780ff000ULL, + 0ULL, + 0ULL + }, + { + 0x0000000051484000ULL, + -1ULL, + 0x00000000300c4000ULL, + -1ULL, + -1ULL + } +#endif + }, + { "fsingle_pack2", TILEGX_OPC_FSINGLE_PACK2, 0x1, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000050980000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "fsingle_sub1", TILEGX_OPC_FSINGLE_SUB1, 0x1, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x00000000509c0000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "icoh", TILEGX_OPC_ICOH, 0x2, 1, TREG_ZERO, 1, + { { 0, }, { 7 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffff80000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x286a380000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "ill", TILEGX_OPC_ILL, 0xa, 0, TREG_ZERO, 1, + { { 0, }, { }, { 0, }, { }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffff80000000000ULL, + 0ULL, + 0x3c07f80000000000ULL, + 0ULL + }, + { + -1ULL, + 0x286a400000000000ULL, + -1ULL, + 0x1c06480000000000ULL, + -1ULL + } +#endif + }, + { "inv", TILEGX_OPC_INV, 0x2, 1, TREG_ZERO, 1, + { { 0, }, { 7 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffff80000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x286a480000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "iret", TILEGX_OPC_IRET, 0x2, 0, TREG_ZERO, 1, + { { 0, }, { }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffff80000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x286a500000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "j", TILEGX_OPC_J, 0x2, 1, TREG_ZERO, 1, + { { 0, }, { 25 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfc00000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x2400000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "jal", TILEGX_OPC_JAL, 0x2, 1, TREG_LR, 1, + { { 0, }, { 25 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfc00000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x2000000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "jalr", TILEGX_OPC_JALR, 0xa, 1, TREG_LR, 1, + { { 0, }, { 7 }, { 0, }, { 13 }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffff80000000000ULL, + 0ULL, + 0x3c07f80000000000ULL, + 0ULL + }, + { + -1ULL, + 0x286a600000000000ULL, + -1ULL, + 0x1c06580000000000ULL, + -1ULL + } +#endif + }, + { "jalrp", TILEGX_OPC_JALRP, 0xa, 1, TREG_LR, 1, + { { 0, }, { 7 }, { 0, }, { 13 }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffff80000000000ULL, + 0ULL, + 0x3c07f80000000000ULL, + 0ULL + }, + { + -1ULL, + 0x286a580000000000ULL, + -1ULL, + 0x1c06500000000000ULL, + -1ULL + } +#endif + }, + { "jr", TILEGX_OPC_JR, 0xa, 1, TREG_ZERO, 1, + { { 0, }, { 7 }, { 0, }, { 13 }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffff80000000000ULL, + 0ULL, + 0x3c07f80000000000ULL, + 0ULL + }, + { + -1ULL, + 0x286a700000000000ULL, + -1ULL, + 0x1c06680000000000ULL, + -1ULL + } +#endif + }, + { "jrp", TILEGX_OPC_JRP, 0xa, 1, TREG_ZERO, 1, + { { 0, }, { 7 }, { 0, }, { 13 }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffff80000000000ULL, + 0ULL, + 0x3c07f80000000000ULL, + 0ULL + }, + { + -1ULL, + 0x286a680000000000ULL, + -1ULL, + 0x1c06600000000000ULL, + -1ULL + } +#endif + }, + { "ld", TILEGX_OPC_LD, 0x12, 2, TREG_ZERO, 1, + { { 0, }, { 6, 7 }, { 0, }, { 0, }, { 26, 14 } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffff80000000000ULL, + 0ULL, + 0ULL, + 0xc200000004000000ULL + }, + { + -1ULL, + 0x286ae80000000000ULL, + -1ULL, + -1ULL, + 0x8200000004000000ULL + } +#endif + }, + { "ld1s", TILEGX_OPC_LD1S, 0x12, 2, TREG_ZERO, 1, + { { 0, }, { 6, 7 }, { 0, }, { 0, }, { 26, 14 } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffff80000000000ULL, + 0ULL, + 0ULL, + 0xc200000004000000ULL + }, + { + -1ULL, + 0x286a780000000000ULL, + -1ULL, + -1ULL, + 0x4000000000000000ULL + } +#endif + }, + { "ld1s_add", TILEGX_OPC_LD1S_ADD, 0x2, 3, TREG_ZERO, 1, + { { 0, }, { 6, 15, 1 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfff8000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x1838000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "ld1u", TILEGX_OPC_LD1U, 0x12, 2, TREG_ZERO, 1, + { { 0, }, { 6, 7 }, { 0, }, { 0, }, { 26, 14 } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffff80000000000ULL, + 0ULL, + 0ULL, + 0xc200000004000000ULL + }, + { + -1ULL, + 0x286a800000000000ULL, + -1ULL, + -1ULL, + 0x4000000004000000ULL + } +#endif + }, + { "ld1u_add", TILEGX_OPC_LD1U_ADD, 0x2, 3, TREG_ZERO, 1, + { { 0, }, { 6, 15, 1 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfff8000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x1840000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "ld2s", TILEGX_OPC_LD2S, 0x12, 2, TREG_ZERO, 1, + { { 0, }, { 6, 7 }, { 0, }, { 0, }, { 26, 14 } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffff80000000000ULL, + 0ULL, + 0ULL, + 0xc200000004000000ULL + }, + { + -1ULL, + 0x286a880000000000ULL, + -1ULL, + -1ULL, + 0x4200000000000000ULL + } +#endif + }, + { "ld2s_add", TILEGX_OPC_LD2S_ADD, 0x2, 3, TREG_ZERO, 1, + { { 0, }, { 6, 15, 1 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfff8000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x1848000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "ld2u", TILEGX_OPC_LD2U, 0x12, 2, TREG_ZERO, 1, + { { 0, }, { 6, 7 }, { 0, }, { 0, }, { 26, 14 } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffff80000000000ULL, + 0ULL, + 0ULL, + 0xc200000004000000ULL + }, + { + -1ULL, + 0x286a900000000000ULL, + -1ULL, + -1ULL, + 0x4200000004000000ULL + } +#endif + }, + { "ld2u_add", TILEGX_OPC_LD2U_ADD, 0x2, 3, TREG_ZERO, 1, + { { 0, }, { 6, 15, 1 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfff8000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x1850000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "ld4s", TILEGX_OPC_LD4S, 0x12, 2, TREG_ZERO, 1, + { { 0, }, { 6, 7 }, { 0, }, { 0, }, { 26, 14 } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffff80000000000ULL, + 0ULL, + 0ULL, + 0xc200000004000000ULL + }, + { + -1ULL, + 0x286a980000000000ULL, + -1ULL, + -1ULL, + 0x8000000004000000ULL + } +#endif + }, + { "ld4s_add", TILEGX_OPC_LD4S_ADD, 0x2, 3, TREG_ZERO, 1, + { { 0, }, { 6, 15, 1 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfff8000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x1858000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "ld4u", TILEGX_OPC_LD4U, 0x12, 2, TREG_ZERO, 1, + { { 0, }, { 6, 7 }, { 0, }, { 0, }, { 26, 14 } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffff80000000000ULL, + 0ULL, + 0ULL, + 0xc200000004000000ULL + }, + { + -1ULL, + 0x286aa00000000000ULL, + -1ULL, + -1ULL, + 0x8200000000000000ULL + } +#endif + }, + { "ld4u_add", TILEGX_OPC_LD4U_ADD, 0x2, 3, TREG_ZERO, 1, + { { 0, }, { 6, 15, 1 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfff8000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x1860000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "ld_add", TILEGX_OPC_LD_ADD, 0x2, 3, TREG_ZERO, 1, + { { 0, }, { 6, 15, 1 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfff8000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x18a0000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "ldna", TILEGX_OPC_LDNA, 0x2, 2, TREG_ZERO, 1, + { { 0, }, { 6, 7 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffff80000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x286aa80000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "ldna_add", TILEGX_OPC_LDNA_ADD, 0x2, 3, TREG_ZERO, 1, + { { 0, }, { 6, 15, 1 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfff8000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x18a8000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "ldnt", TILEGX_OPC_LDNT, 0x2, 2, TREG_ZERO, 1, + { { 0, }, { 6, 7 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffff80000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x286ae00000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "ldnt1s", TILEGX_OPC_LDNT1S, 0x2, 2, TREG_ZERO, 1, + { { 0, }, { 6, 7 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffff80000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x286ab00000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "ldnt1s_add", TILEGX_OPC_LDNT1S_ADD, 0x2, 3, TREG_ZERO, 1, + { { 0, }, { 6, 15, 1 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfff8000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x1868000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "ldnt1u", TILEGX_OPC_LDNT1U, 0x2, 2, TREG_ZERO, 1, + { { 0, }, { 6, 7 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffff80000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x286ab80000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "ldnt1u_add", TILEGX_OPC_LDNT1U_ADD, 0x2, 3, TREG_ZERO, 1, + { { 0, }, { 6, 15, 1 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfff8000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x1870000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "ldnt2s", TILEGX_OPC_LDNT2S, 0x2, 2, TREG_ZERO, 1, + { { 0, }, { 6, 7 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffff80000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x286ac00000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "ldnt2s_add", TILEGX_OPC_LDNT2S_ADD, 0x2, 3, TREG_ZERO, 1, + { { 0, }, { 6, 15, 1 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfff8000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x1878000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "ldnt2u", TILEGX_OPC_LDNT2U, 0x2, 2, TREG_ZERO, 1, + { { 0, }, { 6, 7 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffff80000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x286ac80000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "ldnt2u_add", TILEGX_OPC_LDNT2U_ADD, 0x2, 3, TREG_ZERO, 1, + { { 0, }, { 6, 15, 1 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfff8000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x1880000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "ldnt4s", TILEGX_OPC_LDNT4S, 0x2, 2, TREG_ZERO, 1, + { { 0, }, { 6, 7 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffff80000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x286ad00000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "ldnt4s_add", TILEGX_OPC_LDNT4S_ADD, 0x2, 3, TREG_ZERO, 1, + { { 0, }, { 6, 15, 1 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfff8000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x1888000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "ldnt4u", TILEGX_OPC_LDNT4U, 0x2, 2, TREG_ZERO, 1, + { { 0, }, { 6, 7 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffff80000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x286ad80000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "ldnt4u_add", TILEGX_OPC_LDNT4U_ADD, 0x2, 3, TREG_ZERO, 1, + { { 0, }, { 6, 15, 1 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfff8000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x1890000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "ldnt_add", TILEGX_OPC_LDNT_ADD, 0x2, 3, TREG_ZERO, 1, + { { 0, }, { 6, 15, 1 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfff8000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x1898000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "lnk", TILEGX_OPC_LNK, 0xa, 1, TREG_ZERO, 1, + { { 0, }, { 6 }, { 0, }, { 12 }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffff80000000000ULL, + 0ULL, + 0x3c07f80000000000ULL, + 0ULL + }, + { + -1ULL, + 0x286af00000000000ULL, + -1ULL, + 0x1c06700000000000ULL, + -1ULL + } +#endif + }, + { "mf", TILEGX_OPC_MF, 0x2, 0, TREG_ZERO, 1, + { { 0, }, { }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffff80000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x286af80000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "mfspr", TILEGX_OPC_MFSPR, 0x2, 2, TREG_ZERO, 1, + { { 0, }, { 6, 27 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfff8000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x18b0000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "mm", TILEGX_OPC_MM, 0x1, 4, TREG_ZERO, 1, + { { 23, 9, 21, 22 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007f000000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000037000000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "mnz", TILEGX_OPC_MNZ, 0xf, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0x00000000780c0000ULL, + 0x3c06000000000000ULL, + 0ULL + }, + { + 0x0000000050a00000ULL, + 0x2834000000000000ULL, + 0x0000000048080000ULL, + 0x2804000000000000ULL, + -1ULL + } +#endif + }, + { "mtspr", TILEGX_OPC_MTSPR, 0x2, 2, TREG_ZERO, 1, + { { 0, }, { 28, 7 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfff8000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x18b8000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "mul_hs_hs", TILEGX_OPC_MUL_HS_HS, 0x5, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 0, }, { 10, 11, 18 }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0x00000000780c0000ULL, + 0ULL, + 0ULL + }, + { + 0x0000000050d40000ULL, + -1ULL, + 0x0000000068000000ULL, + -1ULL, + -1ULL + } +#endif + }, + { "mul_hs_hu", TILEGX_OPC_MUL_HS_HU, 0x1, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000050d80000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "mul_hs_ls", TILEGX_OPC_MUL_HS_LS, 0x1, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000050dc0000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "mul_hs_lu", TILEGX_OPC_MUL_HS_LU, 0x1, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000050e00000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "mul_hu_hu", TILEGX_OPC_MUL_HU_HU, 0x5, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 0, }, { 10, 11, 18 }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0x00000000780c0000ULL, + 0ULL, + 0ULL + }, + { + 0x0000000050e40000ULL, + -1ULL, + 0x0000000068040000ULL, + -1ULL, + -1ULL + } +#endif + }, + { "mul_hu_ls", TILEGX_OPC_MUL_HU_LS, 0x1, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000050e80000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "mul_hu_lu", TILEGX_OPC_MUL_HU_LU, 0x1, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000050ec0000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "mul_ls_ls", TILEGX_OPC_MUL_LS_LS, 0x5, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 0, }, { 10, 11, 18 }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0x00000000780c0000ULL, + 0ULL, + 0ULL + }, + { + 0x0000000050f00000ULL, + -1ULL, + 0x0000000068080000ULL, + -1ULL, + -1ULL + } +#endif + }, + { "mul_ls_lu", TILEGX_OPC_MUL_LS_LU, 0x1, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000050f40000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "mul_lu_lu", TILEGX_OPC_MUL_LU_LU, 0x5, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 0, }, { 10, 11, 18 }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0x00000000780c0000ULL, + 0ULL, + 0ULL + }, + { + 0x0000000050f80000ULL, + -1ULL, + 0x00000000680c0000ULL, + -1ULL, + -1ULL + } +#endif + }, + { "mula_hs_hs", TILEGX_OPC_MULA_HS_HS, 0x5, 3, TREG_ZERO, 1, + { { 23, 9, 16 }, { 0, }, { 24, 11, 18 }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0x00000000780c0000ULL, + 0ULL, + 0ULL + }, + { + 0x0000000050a80000ULL, + -1ULL, + 0x0000000070000000ULL, + -1ULL, + -1ULL + } +#endif + }, + { "mula_hs_hu", TILEGX_OPC_MULA_HS_HU, 0x1, 3, TREG_ZERO, 1, + { { 23, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000050ac0000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "mula_hs_ls", TILEGX_OPC_MULA_HS_LS, 0x1, 3, TREG_ZERO, 1, + { { 23, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000050b00000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "mula_hs_lu", TILEGX_OPC_MULA_HS_LU, 0x1, 3, TREG_ZERO, 1, + { { 23, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000050b40000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "mula_hu_hu", TILEGX_OPC_MULA_HU_HU, 0x5, 3, TREG_ZERO, 1, + { { 23, 9, 16 }, { 0, }, { 24, 11, 18 }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0x00000000780c0000ULL, + 0ULL, + 0ULL + }, + { + 0x0000000050b80000ULL, + -1ULL, + 0x0000000070040000ULL, + -1ULL, + -1ULL + } +#endif + }, + { "mula_hu_ls", TILEGX_OPC_MULA_HU_LS, 0x1, 3, TREG_ZERO, 1, + { { 23, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000050bc0000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "mula_hu_lu", TILEGX_OPC_MULA_HU_LU, 0x1, 3, TREG_ZERO, 1, + { { 23, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000050c00000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "mula_ls_ls", TILEGX_OPC_MULA_LS_LS, 0x5, 3, TREG_ZERO, 1, + { { 23, 9, 16 }, { 0, }, { 24, 11, 18 }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0x00000000780c0000ULL, + 0ULL, + 0ULL + }, + { + 0x0000000050c40000ULL, + -1ULL, + 0x0000000070080000ULL, + -1ULL, + -1ULL + } +#endif + }, + { "mula_ls_lu", TILEGX_OPC_MULA_LS_LU, 0x1, 3, TREG_ZERO, 1, + { { 23, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000050c80000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "mula_lu_lu", TILEGX_OPC_MULA_LU_LU, 0x5, 3, TREG_ZERO, 1, + { { 23, 9, 16 }, { 0, }, { 24, 11, 18 }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0x00000000780c0000ULL, + 0ULL, + 0ULL + }, + { + 0x0000000050cc0000ULL, + -1ULL, + 0x00000000700c0000ULL, + -1ULL, + -1ULL + } +#endif + }, + { "mulax", TILEGX_OPC_MULAX, 0x5, 3, TREG_ZERO, 1, + { { 23, 9, 16 }, { 0, }, { 24, 11, 18 }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0x00000000780c0000ULL, + 0ULL, + 0ULL + }, + { + 0x0000000050a40000ULL, + -1ULL, + 0x0000000040080000ULL, + -1ULL, + -1ULL + } +#endif + }, + { "mulx", TILEGX_OPC_MULX, 0x5, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 0, }, { 10, 11, 18 }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0x00000000780c0000ULL, + 0ULL, + 0ULL + }, + { + 0x0000000050d00000ULL, + -1ULL, + 0x00000000400c0000ULL, + -1ULL, + -1ULL + } +#endif + }, + { "mz", TILEGX_OPC_MZ, 0xf, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0x00000000780c0000ULL, + 0x3c06000000000000ULL, + 0ULL + }, + { + 0x0000000050fc0000ULL, + 0x2836000000000000ULL, + 0x00000000480c0000ULL, + 0x2806000000000000ULL, + -1ULL + } +#endif + }, + { "nap", TILEGX_OPC_NAP, 0x2, 0, TREG_ZERO, 0, + { { 0, }, { }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffff80000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x286b000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "nop", TILEGX_OPC_NOP, 0xf, 0, TREG_ZERO, 1, + { { }, { }, { }, { }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffff000ULL, + 0xfffff80000000000ULL, + 0x00000000780ff000ULL, + 0x3c07f80000000000ULL, + 0ULL + }, + { + 0x0000000051485000ULL, + 0x286b080000000000ULL, + 0x00000000300c5000ULL, + 0x1c06780000000000ULL, + -1ULL + } +#endif + }, + { "nor", TILEGX_OPC_NOR, 0xf, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0x00000000780c0000ULL, + 0x3c06000000000000ULL, + 0ULL + }, + { + 0x0000000051000000ULL, + 0x2838000000000000ULL, + 0x0000000050040000ULL, + 0x2c02000000000000ULL, + -1ULL + } +#endif + }, + { "or", TILEGX_OPC_OR, 0xf, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0x00000000780c0000ULL, + 0x3c06000000000000ULL, + 0ULL + }, + { + 0x0000000051040000ULL, + 0x283a000000000000ULL, + 0x0000000050080000ULL, + 0x2c04000000000000ULL, + -1ULL + } +#endif + }, + { "ori", TILEGX_OPC_ORI, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 0 }, { 6, 7, 1 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ff00000ULL, + 0xfff8000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000040700000ULL, + 0x18c0000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "pcnt", TILEGX_OPC_PCNT, 0x5, 2, TREG_ZERO, 1, + { { 8, 9 }, { 0, }, { 10, 11 }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffff000ULL, + 0ULL, + 0x00000000780ff000ULL, + 0ULL, + 0ULL + }, + { + 0x0000000051486000ULL, + -1ULL, + 0x00000000300c6000ULL, + -1ULL, + -1ULL + } +#endif + }, + { "revbits", TILEGX_OPC_REVBITS, 0x5, 2, TREG_ZERO, 1, + { { 8, 9 }, { 0, }, { 10, 11 }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffff000ULL, + 0ULL, + 0x00000000780ff000ULL, + 0ULL, + 0ULL + }, + { + 0x0000000051487000ULL, + -1ULL, + 0x00000000300c7000ULL, + -1ULL, + -1ULL + } +#endif + }, + { "revbytes", TILEGX_OPC_REVBYTES, 0x5, 2, TREG_ZERO, 1, + { { 8, 9 }, { 0, }, { 10, 11 }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffff000ULL, + 0ULL, + 0x00000000780ff000ULL, + 0ULL, + 0ULL + }, + { + 0x0000000051488000ULL, + -1ULL, + 0x00000000300c8000ULL, + -1ULL, + -1ULL + } +#endif + }, + { "rotl", TILEGX_OPC_ROTL, 0xf, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0x00000000780c0000ULL, + 0x3c06000000000000ULL, + 0ULL + }, + { + 0x0000000051080000ULL, + 0x283c000000000000ULL, + 0x0000000058000000ULL, + 0x3000000000000000ULL, + -1ULL + } +#endif + }, + { "rotli", TILEGX_OPC_ROTLI, 0xf, 3, TREG_ZERO, 1, + { { 8, 9, 29 }, { 6, 7, 30 }, { 10, 11, 31 }, { 12, 13, 32 }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0x00000000780c0000ULL, + 0x3c06000000000000ULL, + 0ULL + }, + { + 0x0000000060040000ULL, + 0x3002000000000000ULL, + 0x0000000078000000ULL, + 0x3800000000000000ULL, + -1ULL + } +#endif + }, + { "shl", TILEGX_OPC_SHL, 0xf, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0x00000000780c0000ULL, + 0x3c06000000000000ULL, + 0ULL + }, + { + 0x0000000051280000ULL, + 0x284c000000000000ULL, + 0x0000000058040000ULL, + 0x3002000000000000ULL, + -1ULL + } +#endif + }, + { "shl16insli", TILEGX_OPC_SHL16INSLI, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 4 }, { 6, 7, 5 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc000000070000000ULL, + 0xf800000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000070000000ULL, + 0x3800000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "shl1add", TILEGX_OPC_SHL1ADD, 0xf, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0x00000000780c0000ULL, + 0x3c06000000000000ULL, + 0ULL + }, + { + 0x0000000051100000ULL, + 0x2840000000000000ULL, + 0x0000000030000000ULL, + 0x1c00000000000000ULL, + -1ULL + } +#endif + }, + { "shl1addx", TILEGX_OPC_SHL1ADDX, 0xf, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0x00000000780c0000ULL, + 0x3c06000000000000ULL, + 0ULL + }, + { + 0x00000000510c0000ULL, + 0x283e000000000000ULL, + 0x0000000060040000ULL, + 0x3402000000000000ULL, + -1ULL + } +#endif + }, + { "shl2add", TILEGX_OPC_SHL2ADD, 0xf, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0x00000000780c0000ULL, + 0x3c06000000000000ULL, + 0ULL + }, + { + 0x0000000051180000ULL, + 0x2844000000000000ULL, + 0x0000000030040000ULL, + 0x1c02000000000000ULL, + -1ULL + } +#endif + }, + { "shl2addx", TILEGX_OPC_SHL2ADDX, 0xf, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0x00000000780c0000ULL, + 0x3c06000000000000ULL, + 0ULL + }, + { + 0x0000000051140000ULL, + 0x2842000000000000ULL, + 0x0000000060080000ULL, + 0x3404000000000000ULL, + -1ULL + } +#endif + }, + { "shl3add", TILEGX_OPC_SHL3ADD, 0xf, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0x00000000780c0000ULL, + 0x3c06000000000000ULL, + 0ULL + }, + { + 0x0000000051200000ULL, + 0x2848000000000000ULL, + 0x0000000030080000ULL, + 0x1c04000000000000ULL, + -1ULL + } +#endif + }, + { "shl3addx", TILEGX_OPC_SHL3ADDX, 0xf, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0x00000000780c0000ULL, + 0x3c06000000000000ULL, + 0ULL + }, + { + 0x00000000511c0000ULL, + 0x2846000000000000ULL, + 0x00000000600c0000ULL, + 0x3406000000000000ULL, + -1ULL + } +#endif + }, + { "shli", TILEGX_OPC_SHLI, 0xf, 3, TREG_ZERO, 1, + { { 8, 9, 29 }, { 6, 7, 30 }, { 10, 11, 31 }, { 12, 13, 32 }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0x00000000780c0000ULL, + 0x3c06000000000000ULL, + 0ULL + }, + { + 0x0000000060080000ULL, + 0x3004000000000000ULL, + 0x0000000078040000ULL, + 0x3802000000000000ULL, + -1ULL + } +#endif + }, + { "shlx", TILEGX_OPC_SHLX, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000051240000ULL, + 0x284a000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "shlxi", TILEGX_OPC_SHLXI, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 29 }, { 6, 7, 30 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x00000000600c0000ULL, + 0x3006000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "shrs", TILEGX_OPC_SHRS, 0xf, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0x00000000780c0000ULL, + 0x3c06000000000000ULL, + 0ULL + }, + { + 0x00000000512c0000ULL, + 0x284e000000000000ULL, + 0x0000000058080000ULL, + 0x3004000000000000ULL, + -1ULL + } +#endif + }, + { "shrsi", TILEGX_OPC_SHRSI, 0xf, 3, TREG_ZERO, 1, + { { 8, 9, 29 }, { 6, 7, 30 }, { 10, 11, 31 }, { 12, 13, 32 }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0x00000000780c0000ULL, + 0x3c06000000000000ULL, + 0ULL + }, + { + 0x0000000060100000ULL, + 0x3008000000000000ULL, + 0x0000000078080000ULL, + 0x3804000000000000ULL, + -1ULL + } +#endif + }, + { "shru", TILEGX_OPC_SHRU, 0xf, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0x00000000780c0000ULL, + 0x3c06000000000000ULL, + 0ULL + }, + { + 0x0000000051340000ULL, + 0x2852000000000000ULL, + 0x00000000580c0000ULL, + 0x3006000000000000ULL, + -1ULL + } +#endif + }, + { "shrui", TILEGX_OPC_SHRUI, 0xf, 3, TREG_ZERO, 1, + { { 8, 9, 29 }, { 6, 7, 30 }, { 10, 11, 31 }, { 12, 13, 32 }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0x00000000780c0000ULL, + 0x3c06000000000000ULL, + 0ULL + }, + { + 0x0000000060140000ULL, + 0x300a000000000000ULL, + 0x00000000780c0000ULL, + 0x3806000000000000ULL, + -1ULL + } +#endif + }, + { "shrux", TILEGX_OPC_SHRUX, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000051300000ULL, + 0x2850000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "shruxi", TILEGX_OPC_SHRUXI, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 29 }, { 6, 7, 30 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000060180000ULL, + 0x300c000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "shufflebytes", TILEGX_OPC_SHUFFLEBYTES, 0x1, 3, TREG_ZERO, 1, + { { 23, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000051380000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "st", TILEGX_OPC_ST, 0x12, 2, TREG_ZERO, 1, + { { 0, }, { 7, 17 }, { 0, }, { 0, }, { 14, 33 } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0xc200000004000000ULL + }, + { + -1ULL, + 0x2862000000000000ULL, + -1ULL, + -1ULL, + 0xc200000004000000ULL + } +#endif + }, + { "st1", TILEGX_OPC_ST1, 0x12, 2, TREG_ZERO, 1, + { { 0, }, { 7, 17 }, { 0, }, { 0, }, { 14, 33 } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0xc200000004000000ULL + }, + { + -1ULL, + 0x2854000000000000ULL, + -1ULL, + -1ULL, + 0xc000000000000000ULL + } +#endif + }, + { "st1_add", TILEGX_OPC_ST1_ADD, 0x2, 3, TREG_ZERO, 1, + { { 0, }, { 15, 17, 34 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfff8000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x18c8000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "st2", TILEGX_OPC_ST2, 0x12, 2, TREG_ZERO, 1, + { { 0, }, { 7, 17 }, { 0, }, { 0, }, { 14, 33 } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0xc200000004000000ULL + }, + { + -1ULL, + 0x2856000000000000ULL, + -1ULL, + -1ULL, + 0xc000000004000000ULL + } +#endif + }, + { "st2_add", TILEGX_OPC_ST2_ADD, 0x2, 3, TREG_ZERO, 1, + { { 0, }, { 15, 17, 34 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfff8000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x18d0000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "st4", TILEGX_OPC_ST4, 0x12, 2, TREG_ZERO, 1, + { { 0, }, { 7, 17 }, { 0, }, { 0, }, { 14, 33 } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0xc200000004000000ULL + }, + { + -1ULL, + 0x2858000000000000ULL, + -1ULL, + -1ULL, + 0xc200000000000000ULL + } +#endif + }, + { "st4_add", TILEGX_OPC_ST4_ADD, 0x2, 3, TREG_ZERO, 1, + { { 0, }, { 15, 17, 34 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfff8000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x18d8000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "st_add", TILEGX_OPC_ST_ADD, 0x2, 3, TREG_ZERO, 1, + { { 0, }, { 15, 17, 34 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfff8000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x1900000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "stnt", TILEGX_OPC_STNT, 0x2, 2, TREG_ZERO, 1, + { { 0, }, { 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x2860000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "stnt1", TILEGX_OPC_STNT1, 0x2, 2, TREG_ZERO, 1, + { { 0, }, { 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x285a000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "stnt1_add", TILEGX_OPC_STNT1_ADD, 0x2, 3, TREG_ZERO, 1, + { { 0, }, { 15, 17, 34 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfff8000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x18e0000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "stnt2", TILEGX_OPC_STNT2, 0x2, 2, TREG_ZERO, 1, + { { 0, }, { 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x285c000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "stnt2_add", TILEGX_OPC_STNT2_ADD, 0x2, 3, TREG_ZERO, 1, + { { 0, }, { 15, 17, 34 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfff8000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x18e8000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "stnt4", TILEGX_OPC_STNT4, 0x2, 2, TREG_ZERO, 1, + { { 0, }, { 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x285e000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "stnt4_add", TILEGX_OPC_STNT4_ADD, 0x2, 3, TREG_ZERO, 1, + { { 0, }, { 15, 17, 34 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfff8000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x18f0000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "stnt_add", TILEGX_OPC_STNT_ADD, 0x2, 3, TREG_ZERO, 1, + { { 0, }, { 15, 17, 34 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfff8000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x18f8000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "sub", TILEGX_OPC_SUB, 0xf, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0x00000000780c0000ULL, + 0x3c06000000000000ULL, + 0ULL + }, + { + 0x0000000051440000ULL, + 0x2868000000000000ULL, + 0x00000000280c0000ULL, + 0x1806000000000000ULL, + -1ULL + } +#endif + }, + { "subx", TILEGX_OPC_SUBX, 0xf, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0x00000000780c0000ULL, + 0x3c06000000000000ULL, + 0ULL + }, + { + 0x0000000051400000ULL, + 0x2866000000000000ULL, + 0x0000000028080000ULL, + 0x1804000000000000ULL, + -1ULL + } +#endif + }, + { "subxsc", TILEGX_OPC_SUBXSC, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x00000000513c0000ULL, + 0x2864000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "swint0", TILEGX_OPC_SWINT0, 0x2, 0, TREG_ZERO, 0, + { { 0, }, { }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffff80000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x286b100000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "swint1", TILEGX_OPC_SWINT1, 0x2, 0, TREG_ZERO, 0, + { { 0, }, { }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffff80000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x286b180000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "swint2", TILEGX_OPC_SWINT2, 0x2, 0, TREG_ZERO, 0, + { { 0, }, { }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffff80000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x286b200000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "swint3", TILEGX_OPC_SWINT3, 0x2, 0, TREG_ZERO, 0, + { { 0, }, { }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffff80000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x286b280000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "tblidxb0", TILEGX_OPC_TBLIDXB0, 0x5, 2, TREG_ZERO, 1, + { { 23, 9 }, { 0, }, { 24, 11 }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffff000ULL, + 0ULL, + 0x00000000780ff000ULL, + 0ULL, + 0ULL + }, + { + 0x0000000051489000ULL, + -1ULL, + 0x00000000300c9000ULL, + -1ULL, + -1ULL + } +#endif + }, + { "tblidxb1", TILEGX_OPC_TBLIDXB1, 0x5, 2, TREG_ZERO, 1, + { { 23, 9 }, { 0, }, { 24, 11 }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffff000ULL, + 0ULL, + 0x00000000780ff000ULL, + 0ULL, + 0ULL + }, + { + 0x000000005148a000ULL, + -1ULL, + 0x00000000300ca000ULL, + -1ULL, + -1ULL + } +#endif + }, + { "tblidxb2", TILEGX_OPC_TBLIDXB2, 0x5, 2, TREG_ZERO, 1, + { { 23, 9 }, { 0, }, { 24, 11 }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffff000ULL, + 0ULL, + 0x00000000780ff000ULL, + 0ULL, + 0ULL + }, + { + 0x000000005148b000ULL, + -1ULL, + 0x00000000300cb000ULL, + -1ULL, + -1ULL + } +#endif + }, + { "tblidxb3", TILEGX_OPC_TBLIDXB3, 0x5, 2, TREG_ZERO, 1, + { { 23, 9 }, { 0, }, { 24, 11 }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffff000ULL, + 0ULL, + 0x00000000780ff000ULL, + 0ULL, + 0ULL + }, + { + 0x000000005148c000ULL, + -1ULL, + 0x00000000300cc000ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v1add", TILEGX_OPC_V1ADD, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000051500000ULL, + 0x286e000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v1addi", TILEGX_OPC_V1ADDI, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 0 }, { 6, 7, 1 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ff00000ULL, + 0xfff8000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000040800000ULL, + 0x1908000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v1adduc", TILEGX_OPC_V1ADDUC, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x00000000514c0000ULL, + 0x286c000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v1adiffu", TILEGX_OPC_V1ADIFFU, 0x1, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000051540000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v1avgu", TILEGX_OPC_V1AVGU, 0x1, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000051580000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v1cmpeq", TILEGX_OPC_V1CMPEQ, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x00000000515c0000ULL, + 0x2870000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v1cmpeqi", TILEGX_OPC_V1CMPEQI, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 0 }, { 6, 7, 1 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ff00000ULL, + 0xfff8000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000040900000ULL, + 0x1910000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v1cmples", TILEGX_OPC_V1CMPLES, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000051600000ULL, + 0x2872000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v1cmpleu", TILEGX_OPC_V1CMPLEU, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000051640000ULL, + 0x2874000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v1cmplts", TILEGX_OPC_V1CMPLTS, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000051680000ULL, + 0x2876000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v1cmpltsi", TILEGX_OPC_V1CMPLTSI, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 0 }, { 6, 7, 1 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ff00000ULL, + 0xfff8000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000040a00000ULL, + 0x1918000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v1cmpltu", TILEGX_OPC_V1CMPLTU, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x00000000516c0000ULL, + 0x2878000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v1cmpltui", TILEGX_OPC_V1CMPLTUI, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 0 }, { 6, 7, 1 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ff00000ULL, + 0xfff8000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000040b00000ULL, + 0x1920000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v1cmpne", TILEGX_OPC_V1CMPNE, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000051700000ULL, + 0x287a000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v1ddotpu", TILEGX_OPC_V1DDOTPU, 0x1, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000052880000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v1ddotpua", TILEGX_OPC_V1DDOTPUA, 0x1, 3, TREG_ZERO, 1, + { { 23, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000052840000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v1ddotpus", TILEGX_OPC_V1DDOTPUS, 0x1, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000051780000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v1ddotpusa", TILEGX_OPC_V1DDOTPUSA, 0x1, 3, TREG_ZERO, 1, + { { 23, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000051740000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v1dotp", TILEGX_OPC_V1DOTP, 0x1, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000051880000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v1dotpa", TILEGX_OPC_V1DOTPA, 0x1, 3, TREG_ZERO, 1, + { { 23, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x00000000517c0000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v1dotpu", TILEGX_OPC_V1DOTPU, 0x1, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000052900000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v1dotpua", TILEGX_OPC_V1DOTPUA, 0x1, 3, TREG_ZERO, 1, + { { 23, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x00000000528c0000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v1dotpus", TILEGX_OPC_V1DOTPUS, 0x1, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000051840000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v1dotpusa", TILEGX_OPC_V1DOTPUSA, 0x1, 3, TREG_ZERO, 1, + { { 23, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000051800000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v1int_h", TILEGX_OPC_V1INT_H, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x00000000518c0000ULL, + 0x287c000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v1int_l", TILEGX_OPC_V1INT_L, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000051900000ULL, + 0x287e000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v1maxu", TILEGX_OPC_V1MAXU, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000051940000ULL, + 0x2880000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v1maxui", TILEGX_OPC_V1MAXUI, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 0 }, { 6, 7, 1 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ff00000ULL, + 0xfff8000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000040c00000ULL, + 0x1928000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v1minu", TILEGX_OPC_V1MINU, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000051980000ULL, + 0x2882000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v1minui", TILEGX_OPC_V1MINUI, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 0 }, { 6, 7, 1 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ff00000ULL, + 0xfff8000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000040d00000ULL, + 0x1930000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v1mnz", TILEGX_OPC_V1MNZ, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x00000000519c0000ULL, + 0x2884000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v1multu", TILEGX_OPC_V1MULTU, 0x1, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000051a00000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v1mulu", TILEGX_OPC_V1MULU, 0x1, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000051a80000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v1mulus", TILEGX_OPC_V1MULUS, 0x1, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000051a40000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v1mz", TILEGX_OPC_V1MZ, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000051ac0000ULL, + 0x2886000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v1sadau", TILEGX_OPC_V1SADAU, 0x1, 3, TREG_ZERO, 1, + { { 23, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000051b00000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v1sadu", TILEGX_OPC_V1SADU, 0x1, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000051b40000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v1shl", TILEGX_OPC_V1SHL, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000051b80000ULL, + 0x2888000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v1shli", TILEGX_OPC_V1SHLI, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 29 }, { 6, 7, 30 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x00000000601c0000ULL, + 0x300e000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v1shrs", TILEGX_OPC_V1SHRS, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000051bc0000ULL, + 0x288a000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v1shrsi", TILEGX_OPC_V1SHRSI, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 29 }, { 6, 7, 30 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000060200000ULL, + 0x3010000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v1shru", TILEGX_OPC_V1SHRU, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000051c00000ULL, + 0x288c000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v1shrui", TILEGX_OPC_V1SHRUI, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 29 }, { 6, 7, 30 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000060240000ULL, + 0x3012000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v1sub", TILEGX_OPC_V1SUB, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000051c80000ULL, + 0x2890000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v1subuc", TILEGX_OPC_V1SUBUC, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000051c40000ULL, + 0x288e000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v2add", TILEGX_OPC_V2ADD, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000051d00000ULL, + 0x2894000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v2addi", TILEGX_OPC_V2ADDI, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 0 }, { 6, 7, 1 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ff00000ULL, + 0xfff8000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000040e00000ULL, + 0x1938000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v2addsc", TILEGX_OPC_V2ADDSC, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000051cc0000ULL, + 0x2892000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v2adiffs", TILEGX_OPC_V2ADIFFS, 0x1, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000051d40000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v2avgs", TILEGX_OPC_V2AVGS, 0x1, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000051d80000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v2cmpeq", TILEGX_OPC_V2CMPEQ, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000051dc0000ULL, + 0x2896000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v2cmpeqi", TILEGX_OPC_V2CMPEQI, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 0 }, { 6, 7, 1 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ff00000ULL, + 0xfff8000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000040f00000ULL, + 0x1940000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v2cmples", TILEGX_OPC_V2CMPLES, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000051e00000ULL, + 0x2898000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v2cmpleu", TILEGX_OPC_V2CMPLEU, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000051e40000ULL, + 0x289a000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v2cmplts", TILEGX_OPC_V2CMPLTS, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000051e80000ULL, + 0x289c000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v2cmpltsi", TILEGX_OPC_V2CMPLTSI, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 0 }, { 6, 7, 1 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ff00000ULL, + 0xfff8000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000041000000ULL, + 0x1948000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v2cmpltu", TILEGX_OPC_V2CMPLTU, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000051ec0000ULL, + 0x289e000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v2cmpltui", TILEGX_OPC_V2CMPLTUI, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 0 }, { 6, 7, 1 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ff00000ULL, + 0xfff8000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000041100000ULL, + 0x1950000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v2cmpne", TILEGX_OPC_V2CMPNE, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000051f00000ULL, + 0x28a0000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v2dotp", TILEGX_OPC_V2DOTP, 0x1, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000051f80000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v2dotpa", TILEGX_OPC_V2DOTPA, 0x1, 3, TREG_ZERO, 1, + { { 23, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000051f40000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v2int_h", TILEGX_OPC_V2INT_H, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000051fc0000ULL, + 0x28a2000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v2int_l", TILEGX_OPC_V2INT_L, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000052000000ULL, + 0x28a4000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v2maxs", TILEGX_OPC_V2MAXS, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000052040000ULL, + 0x28a6000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v2maxsi", TILEGX_OPC_V2MAXSI, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 0 }, { 6, 7, 1 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ff00000ULL, + 0xfff8000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000041200000ULL, + 0x1958000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v2mins", TILEGX_OPC_V2MINS, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000052080000ULL, + 0x28a8000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v2minsi", TILEGX_OPC_V2MINSI, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 0 }, { 6, 7, 1 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ff00000ULL, + 0xfff8000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000041300000ULL, + 0x1960000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v2mnz", TILEGX_OPC_V2MNZ, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x00000000520c0000ULL, + 0x28aa000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v2mulfsc", TILEGX_OPC_V2MULFSC, 0x1, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000052100000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v2muls", TILEGX_OPC_V2MULS, 0x1, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000052140000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v2mults", TILEGX_OPC_V2MULTS, 0x1, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000052180000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v2mz", TILEGX_OPC_V2MZ, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x00000000521c0000ULL, + 0x28ac000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v2packh", TILEGX_OPC_V2PACKH, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000052200000ULL, + 0x28ae000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v2packl", TILEGX_OPC_V2PACKL, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000052240000ULL, + 0x28b0000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v2packuc", TILEGX_OPC_V2PACKUC, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000052280000ULL, + 0x28b2000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v2sadas", TILEGX_OPC_V2SADAS, 0x1, 3, TREG_ZERO, 1, + { { 23, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x00000000522c0000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v2sadau", TILEGX_OPC_V2SADAU, 0x1, 3, TREG_ZERO, 1, + { { 23, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000052300000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v2sads", TILEGX_OPC_V2SADS, 0x1, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000052340000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v2sadu", TILEGX_OPC_V2SADU, 0x1, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000052380000ULL, + -1ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v2shl", TILEGX_OPC_V2SHL, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000052400000ULL, + 0x28b6000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v2shli", TILEGX_OPC_V2SHLI, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 29 }, { 6, 7, 30 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000060280000ULL, + 0x3014000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v2shlsc", TILEGX_OPC_V2SHLSC, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x00000000523c0000ULL, + 0x28b4000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v2shrs", TILEGX_OPC_V2SHRS, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000052440000ULL, + 0x28b8000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v2shrsi", TILEGX_OPC_V2SHRSI, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 29 }, { 6, 7, 30 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x00000000602c0000ULL, + 0x3016000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v2shru", TILEGX_OPC_V2SHRU, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000052480000ULL, + 0x28ba000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v2shrui", TILEGX_OPC_V2SHRUI, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 29 }, { 6, 7, 30 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000060300000ULL, + 0x3018000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v2sub", TILEGX_OPC_V2SUB, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000052500000ULL, + 0x28be000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v2subsc", TILEGX_OPC_V2SUBSC, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x00000000524c0000ULL, + 0x28bc000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v4add", TILEGX_OPC_V4ADD, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000052580000ULL, + 0x28c2000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v4addsc", TILEGX_OPC_V4ADDSC, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000052540000ULL, + 0x28c0000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v4int_h", TILEGX_OPC_V4INT_H, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x00000000525c0000ULL, + 0x28c4000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v4int_l", TILEGX_OPC_V4INT_L, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000052600000ULL, + 0x28c6000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v4packsc", TILEGX_OPC_V4PACKSC, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000052640000ULL, + 0x28c8000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v4shl", TILEGX_OPC_V4SHL, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x00000000526c0000ULL, + 0x28cc000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v4shlsc", TILEGX_OPC_V4SHLSC, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000052680000ULL, + 0x28ca000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v4shrs", TILEGX_OPC_V4SHRS, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000052700000ULL, + 0x28ce000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v4shru", TILEGX_OPC_V4SHRU, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000052740000ULL, + 0x28d0000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v4sub", TILEGX_OPC_V4SUB, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x00000000527c0000ULL, + 0x28d4000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "v4subsc", TILEGX_OPC_V4SUBSC, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000052780000ULL, + 0x28d2000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "wh64", TILEGX_OPC_WH64, 0x2, 1, TREG_ZERO, 1, + { { 0, }, { 7 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0ULL, + 0xfffff80000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + -1ULL, + 0x286b300000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { "xor", TILEGX_OPC_XOR, 0xf, 3, TREG_ZERO, 1, + { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ffc0000ULL, + 0xfffe000000000000ULL, + 0x00000000780c0000ULL, + 0x3c06000000000000ULL, + 0ULL + }, + { + 0x0000000052800000ULL, + 0x28d6000000000000ULL, + 0x00000000500c0000ULL, + 0x2c06000000000000ULL, + -1ULL + } +#endif + }, + { "xori", TILEGX_OPC_XORI, 0x3, 3, TREG_ZERO, 1, + { { 8, 9, 0 }, { 6, 7, 1 }, { 0, }, { 0, }, { 0, } }, +#ifndef DISASM_ONLY + { + 0xc00000007ff00000ULL, + 0xfff8000000000000ULL, + 0ULL, + 0ULL, + 0ULL + }, + { + 0x0000000041400000ULL, + 0x1968000000000000ULL, + -1ULL, + -1ULL, + -1ULL + } +#endif + }, + { NULL, TILEGX_OPC_NONE, 0, 0, TREG_ZERO, 0, { { 0, } }, +#ifndef DISASM_ONLY + { 0, }, { 0, } +#endif + } +}; + +#define BITFIELD(start, size) ((start) | (((1 << (size)) - 1) << 6)) +#define CHILD(array_index) (TILEGX_OPC_NONE + (array_index)) + +static const unsigned short decode_X0_fsm[936] = +{ + BITFIELD(22, 9) /* index 0 */, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), + CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), + CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), + CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), + CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), + CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), + CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), + CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), + CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), + CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), + CHILD(513), CHILD(513), CHILD(513), CHILD(513), TILEGX_OPC_ADDXLI, + TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, + TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, + TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, + TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, + TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, + TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, + TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, + TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, + TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, + TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, + TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, + TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, + TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, + TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, + TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, + TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_BFEXTS, + TILEGX_OPC_BFEXTS, TILEGX_OPC_BFEXTS, TILEGX_OPC_BFEXTS, TILEGX_OPC_BFEXTU, + TILEGX_OPC_BFEXTU, TILEGX_OPC_BFEXTU, TILEGX_OPC_BFEXTU, TILEGX_OPC_BFINS, + TILEGX_OPC_BFINS, TILEGX_OPC_BFINS, TILEGX_OPC_BFINS, TILEGX_OPC_MM, + TILEGX_OPC_MM, TILEGX_OPC_MM, TILEGX_OPC_MM, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, CHILD(528), CHILD(578), + CHILD(583), CHILD(588), CHILD(593), CHILD(598), TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, CHILD(603), CHILD(620), CHILD(637), CHILD(654), CHILD(671), + CHILD(703), CHILD(797), CHILD(814), CHILD(831), CHILD(848), CHILD(865), + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, CHILD(889), TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, CHILD(906), CHILD(906), CHILD(906), CHILD(906), CHILD(906), + CHILD(906), CHILD(906), CHILD(906), CHILD(906), CHILD(906), CHILD(906), + CHILD(906), CHILD(906), CHILD(906), CHILD(906), CHILD(906), CHILD(906), + CHILD(906), CHILD(906), CHILD(906), CHILD(906), CHILD(906), CHILD(906), + CHILD(906), CHILD(906), CHILD(906), CHILD(906), CHILD(906), CHILD(906), + CHILD(906), CHILD(906), CHILD(906), CHILD(906), CHILD(906), CHILD(906), + CHILD(906), CHILD(906), CHILD(906), CHILD(906), CHILD(906), CHILD(906), + CHILD(906), CHILD(906), CHILD(906), CHILD(906), CHILD(906), CHILD(906), + CHILD(906), CHILD(906), CHILD(906), CHILD(906), CHILD(906), CHILD(906), + CHILD(906), CHILD(906), CHILD(906), CHILD(906), CHILD(906), CHILD(906), + CHILD(906), CHILD(906), CHILD(906), CHILD(906), CHILD(906), + BITFIELD(6, 2) /* index 513 */, + TILEGX_OPC_ADDLI, TILEGX_OPC_ADDLI, TILEGX_OPC_ADDLI, CHILD(518), + BITFIELD(8, 2) /* index 518 */, + TILEGX_OPC_ADDLI, TILEGX_OPC_ADDLI, TILEGX_OPC_ADDLI, CHILD(523), + BITFIELD(10, 2) /* index 523 */, + TILEGX_OPC_ADDLI, TILEGX_OPC_ADDLI, TILEGX_OPC_ADDLI, TILEGX_OPC_MOVELI, + BITFIELD(20, 2) /* index 528 */, + TILEGX_OPC_NONE, CHILD(533), TILEGX_OPC_ADDXI, CHILD(548), + BITFIELD(6, 2) /* index 533 */, + TILEGX_OPC_ADDI, TILEGX_OPC_ADDI, TILEGX_OPC_ADDI, CHILD(538), + BITFIELD(8, 2) /* index 538 */, + TILEGX_OPC_ADDI, TILEGX_OPC_ADDI, TILEGX_OPC_ADDI, CHILD(543), + BITFIELD(10, 2) /* index 543 */, + TILEGX_OPC_ADDI, TILEGX_OPC_ADDI, TILEGX_OPC_ADDI, TILEGX_OPC_MOVEI, + BITFIELD(0, 2) /* index 548 */, + TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, CHILD(553), + BITFIELD(2, 2) /* index 553 */, + TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, CHILD(558), + BITFIELD(4, 2) /* index 558 */, + TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, CHILD(563), + BITFIELD(6, 2) /* index 563 */, + TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, CHILD(568), + BITFIELD(8, 2) /* index 568 */, + TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, CHILD(573), + BITFIELD(10, 2) /* index 573 */, + TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_INFO, + BITFIELD(20, 2) /* index 578 */, + TILEGX_OPC_CMPEQI, TILEGX_OPC_CMPLTSI, TILEGX_OPC_CMPLTUI, TILEGX_OPC_ORI, + BITFIELD(20, 2) /* index 583 */, + TILEGX_OPC_V1ADDI, TILEGX_OPC_V1CMPEQI, TILEGX_OPC_V1CMPLTSI, + TILEGX_OPC_V1CMPLTUI, + BITFIELD(20, 2) /* index 588 */, + TILEGX_OPC_V1MAXUI, TILEGX_OPC_V1MINUI, TILEGX_OPC_V2ADDI, + TILEGX_OPC_V2CMPEQI, + BITFIELD(20, 2) /* index 593 */, + TILEGX_OPC_V2CMPLTSI, TILEGX_OPC_V2CMPLTUI, TILEGX_OPC_V2MAXSI, + TILEGX_OPC_V2MINSI, + BITFIELD(20, 2) /* index 598 */, + TILEGX_OPC_XORI, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + BITFIELD(18, 4) /* index 603 */, + TILEGX_OPC_NONE, TILEGX_OPC_ADDXSC, TILEGX_OPC_ADDX, TILEGX_OPC_ADD, + TILEGX_OPC_AND, TILEGX_OPC_CMOVEQZ, TILEGX_OPC_CMOVNEZ, TILEGX_OPC_CMPEQ, + TILEGX_OPC_CMPLES, TILEGX_OPC_CMPLEU, TILEGX_OPC_CMPLTS, TILEGX_OPC_CMPLTU, + TILEGX_OPC_CMPNE, TILEGX_OPC_CMULAF, TILEGX_OPC_CMULA, TILEGX_OPC_CMULFR, + BITFIELD(18, 4) /* index 620 */, + TILEGX_OPC_CMULF, TILEGX_OPC_CMULHR, TILEGX_OPC_CMULH, TILEGX_OPC_CMUL, + TILEGX_OPC_CRC32_32, TILEGX_OPC_CRC32_8, TILEGX_OPC_DBLALIGN2, + TILEGX_OPC_DBLALIGN4, TILEGX_OPC_DBLALIGN6, TILEGX_OPC_DBLALIGN, + TILEGX_OPC_FDOUBLE_ADDSUB, TILEGX_OPC_FDOUBLE_ADD_FLAGS, + TILEGX_OPC_FDOUBLE_MUL_FLAGS, TILEGX_OPC_FDOUBLE_PACK1, + TILEGX_OPC_FDOUBLE_PACK2, TILEGX_OPC_FDOUBLE_SUB_FLAGS, + BITFIELD(18, 4) /* index 637 */, + TILEGX_OPC_FDOUBLE_UNPACK_MAX, TILEGX_OPC_FDOUBLE_UNPACK_MIN, + TILEGX_OPC_FSINGLE_ADD1, TILEGX_OPC_FSINGLE_ADDSUB2, + TILEGX_OPC_FSINGLE_MUL1, TILEGX_OPC_FSINGLE_MUL2, TILEGX_OPC_FSINGLE_PACK2, + TILEGX_OPC_FSINGLE_SUB1, TILEGX_OPC_MNZ, TILEGX_OPC_MULAX, + TILEGX_OPC_MULA_HS_HS, TILEGX_OPC_MULA_HS_HU, TILEGX_OPC_MULA_HS_LS, + TILEGX_OPC_MULA_HS_LU, TILEGX_OPC_MULA_HU_HU, TILEGX_OPC_MULA_HU_LS, + BITFIELD(18, 4) /* index 654 */, + TILEGX_OPC_MULA_HU_LU, TILEGX_OPC_MULA_LS_LS, TILEGX_OPC_MULA_LS_LU, + TILEGX_OPC_MULA_LU_LU, TILEGX_OPC_MULX, TILEGX_OPC_MUL_HS_HS, + TILEGX_OPC_MUL_HS_HU, TILEGX_OPC_MUL_HS_LS, TILEGX_OPC_MUL_HS_LU, + TILEGX_OPC_MUL_HU_HU, TILEGX_OPC_MUL_HU_LS, TILEGX_OPC_MUL_HU_LU, + TILEGX_OPC_MUL_LS_LS, TILEGX_OPC_MUL_LS_LU, TILEGX_OPC_MUL_LU_LU, + TILEGX_OPC_MZ, + BITFIELD(18, 4) /* index 671 */, + TILEGX_OPC_NOR, CHILD(688), TILEGX_OPC_ROTL, TILEGX_OPC_SHL1ADDX, + TILEGX_OPC_SHL1ADD, TILEGX_OPC_SHL2ADDX, TILEGX_OPC_SHL2ADD, + TILEGX_OPC_SHL3ADDX, TILEGX_OPC_SHL3ADD, TILEGX_OPC_SHLX, TILEGX_OPC_SHL, + TILEGX_OPC_SHRS, TILEGX_OPC_SHRUX, TILEGX_OPC_SHRU, TILEGX_OPC_SHUFFLEBYTES, + TILEGX_OPC_SUBXSC, + BITFIELD(12, 2) /* index 688 */, + TILEGX_OPC_OR, TILEGX_OPC_OR, TILEGX_OPC_OR, CHILD(693), + BITFIELD(14, 2) /* index 693 */, + TILEGX_OPC_OR, TILEGX_OPC_OR, TILEGX_OPC_OR, CHILD(698), + BITFIELD(16, 2) /* index 698 */, + TILEGX_OPC_OR, TILEGX_OPC_OR, TILEGX_OPC_OR, TILEGX_OPC_MOVE, + BITFIELD(18, 4) /* index 703 */, + TILEGX_OPC_SUBX, TILEGX_OPC_SUB, CHILD(720), TILEGX_OPC_V1ADDUC, + TILEGX_OPC_V1ADD, TILEGX_OPC_V1ADIFFU, TILEGX_OPC_V1AVGU, + TILEGX_OPC_V1CMPEQ, TILEGX_OPC_V1CMPLES, TILEGX_OPC_V1CMPLEU, + TILEGX_OPC_V1CMPLTS, TILEGX_OPC_V1CMPLTU, TILEGX_OPC_V1CMPNE, + TILEGX_OPC_V1DDOTPUSA, TILEGX_OPC_V1DDOTPUS, TILEGX_OPC_V1DOTPA, + BITFIELD(12, 4) /* index 720 */, + TILEGX_OPC_NONE, CHILD(737), CHILD(742), CHILD(747), CHILD(752), CHILD(757), + CHILD(762), CHILD(767), CHILD(772), CHILD(777), CHILD(782), CHILD(787), + CHILD(792), TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + BITFIELD(16, 2) /* index 737 */, + TILEGX_OPC_CLZ, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + BITFIELD(16, 2) /* index 742 */, + TILEGX_OPC_CTZ, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + BITFIELD(16, 2) /* index 747 */, + TILEGX_OPC_FNOP, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + BITFIELD(16, 2) /* index 752 */, + TILEGX_OPC_FSINGLE_PACK1, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + BITFIELD(16, 2) /* index 757 */, + TILEGX_OPC_NOP, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + BITFIELD(16, 2) /* index 762 */, + TILEGX_OPC_PCNT, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + BITFIELD(16, 2) /* index 767 */, + TILEGX_OPC_REVBITS, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + BITFIELD(16, 2) /* index 772 */, + TILEGX_OPC_REVBYTES, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + BITFIELD(16, 2) /* index 777 */, + TILEGX_OPC_TBLIDXB0, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + BITFIELD(16, 2) /* index 782 */, + TILEGX_OPC_TBLIDXB1, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + BITFIELD(16, 2) /* index 787 */, + TILEGX_OPC_TBLIDXB2, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + BITFIELD(16, 2) /* index 792 */, + TILEGX_OPC_TBLIDXB3, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + BITFIELD(18, 4) /* index 797 */, + TILEGX_OPC_V1DOTPUSA, TILEGX_OPC_V1DOTPUS, TILEGX_OPC_V1DOTP, + TILEGX_OPC_V1INT_H, TILEGX_OPC_V1INT_L, TILEGX_OPC_V1MAXU, + TILEGX_OPC_V1MINU, TILEGX_OPC_V1MNZ, TILEGX_OPC_V1MULTU, TILEGX_OPC_V1MULUS, + TILEGX_OPC_V1MULU, TILEGX_OPC_V1MZ, TILEGX_OPC_V1SADAU, TILEGX_OPC_V1SADU, + TILEGX_OPC_V1SHL, TILEGX_OPC_V1SHRS, + BITFIELD(18, 4) /* index 814 */, + TILEGX_OPC_V1SHRU, TILEGX_OPC_V1SUBUC, TILEGX_OPC_V1SUB, TILEGX_OPC_V2ADDSC, + TILEGX_OPC_V2ADD, TILEGX_OPC_V2ADIFFS, TILEGX_OPC_V2AVGS, + TILEGX_OPC_V2CMPEQ, TILEGX_OPC_V2CMPLES, TILEGX_OPC_V2CMPLEU, + TILEGX_OPC_V2CMPLTS, TILEGX_OPC_V2CMPLTU, TILEGX_OPC_V2CMPNE, + TILEGX_OPC_V2DOTPA, TILEGX_OPC_V2DOTP, TILEGX_OPC_V2INT_H, + BITFIELD(18, 4) /* index 831 */, + TILEGX_OPC_V2INT_L, TILEGX_OPC_V2MAXS, TILEGX_OPC_V2MINS, TILEGX_OPC_V2MNZ, + TILEGX_OPC_V2MULFSC, TILEGX_OPC_V2MULS, TILEGX_OPC_V2MULTS, TILEGX_OPC_V2MZ, + TILEGX_OPC_V2PACKH, TILEGX_OPC_V2PACKL, TILEGX_OPC_V2PACKUC, + TILEGX_OPC_V2SADAS, TILEGX_OPC_V2SADAU, TILEGX_OPC_V2SADS, + TILEGX_OPC_V2SADU, TILEGX_OPC_V2SHLSC, + BITFIELD(18, 4) /* index 848 */, + TILEGX_OPC_V2SHL, TILEGX_OPC_V2SHRS, TILEGX_OPC_V2SHRU, TILEGX_OPC_V2SUBSC, + TILEGX_OPC_V2SUB, TILEGX_OPC_V4ADDSC, TILEGX_OPC_V4ADD, TILEGX_OPC_V4INT_H, + TILEGX_OPC_V4INT_L, TILEGX_OPC_V4PACKSC, TILEGX_OPC_V4SHLSC, + TILEGX_OPC_V4SHL, TILEGX_OPC_V4SHRS, TILEGX_OPC_V4SHRU, TILEGX_OPC_V4SUBSC, + TILEGX_OPC_V4SUB, + BITFIELD(18, 3) /* index 865 */, + CHILD(874), CHILD(877), CHILD(880), CHILD(883), CHILD(886), TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, + BITFIELD(21, 1) /* index 874 */, + TILEGX_OPC_XOR, TILEGX_OPC_NONE, + BITFIELD(21, 1) /* index 877 */, + TILEGX_OPC_V1DDOTPUA, TILEGX_OPC_NONE, + BITFIELD(21, 1) /* index 880 */, + TILEGX_OPC_V1DDOTPU, TILEGX_OPC_NONE, + BITFIELD(21, 1) /* index 883 */, + TILEGX_OPC_V1DOTPUA, TILEGX_OPC_NONE, + BITFIELD(21, 1) /* index 886 */, + TILEGX_OPC_V1DOTPU, TILEGX_OPC_NONE, + BITFIELD(18, 4) /* index 889 */, + TILEGX_OPC_NONE, TILEGX_OPC_ROTLI, TILEGX_OPC_SHLI, TILEGX_OPC_SHLXI, + TILEGX_OPC_SHRSI, TILEGX_OPC_SHRUI, TILEGX_OPC_SHRUXI, TILEGX_OPC_V1SHLI, + TILEGX_OPC_V1SHRSI, TILEGX_OPC_V1SHRUI, TILEGX_OPC_V2SHLI, + TILEGX_OPC_V2SHRSI, TILEGX_OPC_V2SHRUI, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, + BITFIELD(0, 2) /* index 906 */, + TILEGX_OPC_SHL16INSLI, TILEGX_OPC_SHL16INSLI, TILEGX_OPC_SHL16INSLI, + CHILD(911), + BITFIELD(2, 2) /* index 911 */, + TILEGX_OPC_SHL16INSLI, TILEGX_OPC_SHL16INSLI, TILEGX_OPC_SHL16INSLI, + CHILD(916), + BITFIELD(4, 2) /* index 916 */, + TILEGX_OPC_SHL16INSLI, TILEGX_OPC_SHL16INSLI, TILEGX_OPC_SHL16INSLI, + CHILD(921), + BITFIELD(6, 2) /* index 921 */, + TILEGX_OPC_SHL16INSLI, TILEGX_OPC_SHL16INSLI, TILEGX_OPC_SHL16INSLI, + CHILD(926), + BITFIELD(8, 2) /* index 926 */, + TILEGX_OPC_SHL16INSLI, TILEGX_OPC_SHL16INSLI, TILEGX_OPC_SHL16INSLI, + CHILD(931), + BITFIELD(10, 2) /* index 931 */, + TILEGX_OPC_SHL16INSLI, TILEGX_OPC_SHL16INSLI, TILEGX_OPC_SHL16INSLI, + TILEGX_OPC_INFOL, +}; + +static const unsigned short decode_X1_fsm[1266] = +{ + BITFIELD(53, 9) /* index 0 */, + CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), + CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), + CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), + CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), + CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), + CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), + CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), + CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), + CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), + CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), + CHILD(513), CHILD(513), CHILD(513), CHILD(513), TILEGX_OPC_ADDXLI, + TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, + TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, + TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, + TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, + TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, + TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, + TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, + TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, + TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, + TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, + TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, + TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, + TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, + TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, + TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, + TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_BEQZT, + TILEGX_OPC_BEQZT, TILEGX_OPC_BEQZ, TILEGX_OPC_BEQZ, TILEGX_OPC_BGEZT, + TILEGX_OPC_BGEZT, TILEGX_OPC_BGEZ, TILEGX_OPC_BGEZ, TILEGX_OPC_BGTZT, + TILEGX_OPC_BGTZT, TILEGX_OPC_BGTZ, TILEGX_OPC_BGTZ, TILEGX_OPC_BLBCT, + TILEGX_OPC_BLBCT, TILEGX_OPC_BLBC, TILEGX_OPC_BLBC, TILEGX_OPC_BLBST, + TILEGX_OPC_BLBST, TILEGX_OPC_BLBS, TILEGX_OPC_BLBS, TILEGX_OPC_BLEZT, + TILEGX_OPC_BLEZT, TILEGX_OPC_BLEZ, TILEGX_OPC_BLEZ, TILEGX_OPC_BLTZT, + TILEGX_OPC_BLTZT, TILEGX_OPC_BLTZ, TILEGX_OPC_BLTZ, TILEGX_OPC_BNEZT, + TILEGX_OPC_BNEZT, TILEGX_OPC_BNEZ, TILEGX_OPC_BNEZ, CHILD(528), CHILD(578), + CHILD(598), CHILD(703), CHILD(723), CHILD(728), CHILD(753), CHILD(758), + CHILD(763), CHILD(768), CHILD(773), CHILD(778), TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_JAL, + TILEGX_OPC_JAL, TILEGX_OPC_JAL, TILEGX_OPC_JAL, TILEGX_OPC_JAL, + TILEGX_OPC_JAL, TILEGX_OPC_JAL, TILEGX_OPC_JAL, TILEGX_OPC_JAL, + TILEGX_OPC_JAL, TILEGX_OPC_JAL, TILEGX_OPC_JAL, TILEGX_OPC_JAL, + TILEGX_OPC_JAL, TILEGX_OPC_JAL, TILEGX_OPC_JAL, TILEGX_OPC_JAL, + TILEGX_OPC_JAL, TILEGX_OPC_JAL, TILEGX_OPC_JAL, TILEGX_OPC_JAL, + TILEGX_OPC_JAL, TILEGX_OPC_JAL, TILEGX_OPC_JAL, TILEGX_OPC_JAL, + TILEGX_OPC_JAL, TILEGX_OPC_JAL, TILEGX_OPC_JAL, TILEGX_OPC_JAL, + TILEGX_OPC_JAL, TILEGX_OPC_JAL, TILEGX_OPC_JAL, TILEGX_OPC_J, TILEGX_OPC_J, + TILEGX_OPC_J, TILEGX_OPC_J, TILEGX_OPC_J, TILEGX_OPC_J, TILEGX_OPC_J, + TILEGX_OPC_J, TILEGX_OPC_J, TILEGX_OPC_J, TILEGX_OPC_J, TILEGX_OPC_J, + TILEGX_OPC_J, TILEGX_OPC_J, TILEGX_OPC_J, TILEGX_OPC_J, TILEGX_OPC_J, + TILEGX_OPC_J, TILEGX_OPC_J, TILEGX_OPC_J, TILEGX_OPC_J, TILEGX_OPC_J, + TILEGX_OPC_J, TILEGX_OPC_J, TILEGX_OPC_J, TILEGX_OPC_J, TILEGX_OPC_J, + TILEGX_OPC_J, TILEGX_OPC_J, TILEGX_OPC_J, TILEGX_OPC_J, TILEGX_OPC_J, + CHILD(783), CHILD(800), CHILD(832), CHILD(849), CHILD(1168), CHILD(1185), + CHILD(1202), TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, CHILD(1219), TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, CHILD(1236), CHILD(1236), CHILD(1236), + CHILD(1236), CHILD(1236), CHILD(1236), CHILD(1236), CHILD(1236), + CHILD(1236), CHILD(1236), CHILD(1236), CHILD(1236), CHILD(1236), + CHILD(1236), CHILD(1236), CHILD(1236), CHILD(1236), CHILD(1236), + CHILD(1236), CHILD(1236), CHILD(1236), CHILD(1236), CHILD(1236), + CHILD(1236), CHILD(1236), CHILD(1236), CHILD(1236), CHILD(1236), + CHILD(1236), CHILD(1236), CHILD(1236), CHILD(1236), CHILD(1236), + CHILD(1236), CHILD(1236), CHILD(1236), CHILD(1236), CHILD(1236), + CHILD(1236), CHILD(1236), CHILD(1236), CHILD(1236), CHILD(1236), + CHILD(1236), CHILD(1236), CHILD(1236), CHILD(1236), CHILD(1236), + CHILD(1236), CHILD(1236), CHILD(1236), CHILD(1236), CHILD(1236), + CHILD(1236), CHILD(1236), CHILD(1236), CHILD(1236), CHILD(1236), + CHILD(1236), CHILD(1236), CHILD(1236), CHILD(1236), CHILD(1236), + CHILD(1236), + BITFIELD(37, 2) /* index 513 */, + TILEGX_OPC_ADDLI, TILEGX_OPC_ADDLI, TILEGX_OPC_ADDLI, CHILD(518), + BITFIELD(39, 2) /* index 518 */, + TILEGX_OPC_ADDLI, TILEGX_OPC_ADDLI, TILEGX_OPC_ADDLI, CHILD(523), + BITFIELD(41, 2) /* index 523 */, + TILEGX_OPC_ADDLI, TILEGX_OPC_ADDLI, TILEGX_OPC_ADDLI, TILEGX_OPC_MOVELI, + BITFIELD(51, 2) /* index 528 */, + TILEGX_OPC_NONE, CHILD(533), TILEGX_OPC_ADDXI, CHILD(548), + BITFIELD(37, 2) /* index 533 */, + TILEGX_OPC_ADDI, TILEGX_OPC_ADDI, TILEGX_OPC_ADDI, CHILD(538), + BITFIELD(39, 2) /* index 538 */, + TILEGX_OPC_ADDI, TILEGX_OPC_ADDI, TILEGX_OPC_ADDI, CHILD(543), + BITFIELD(41, 2) /* index 543 */, + TILEGX_OPC_ADDI, TILEGX_OPC_ADDI, TILEGX_OPC_ADDI, TILEGX_OPC_MOVEI, + BITFIELD(31, 2) /* index 548 */, + TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, CHILD(553), + BITFIELD(33, 2) /* index 553 */, + TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, CHILD(558), + BITFIELD(35, 2) /* index 558 */, + TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, CHILD(563), + BITFIELD(37, 2) /* index 563 */, + TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, CHILD(568), + BITFIELD(39, 2) /* index 568 */, + TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, CHILD(573), + BITFIELD(41, 2) /* index 573 */, + TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_INFO, + BITFIELD(51, 2) /* index 578 */, + TILEGX_OPC_CMPEQI, TILEGX_OPC_CMPLTSI, TILEGX_OPC_CMPLTUI, CHILD(583), + BITFIELD(31, 2) /* index 583 */, + TILEGX_OPC_LD1S_ADD, TILEGX_OPC_LD1S_ADD, TILEGX_OPC_LD1S_ADD, CHILD(588), + BITFIELD(33, 2) /* index 588 */, + TILEGX_OPC_LD1S_ADD, TILEGX_OPC_LD1S_ADD, TILEGX_OPC_LD1S_ADD, CHILD(593), + BITFIELD(35, 2) /* index 593 */, + TILEGX_OPC_LD1S_ADD, TILEGX_OPC_LD1S_ADD, TILEGX_OPC_LD1S_ADD, + TILEGX_OPC_PREFETCH_ADD_L1_FAULT, + BITFIELD(51, 2) /* index 598 */, + CHILD(603), CHILD(618), CHILD(633), CHILD(648), + BITFIELD(31, 2) /* index 603 */, + TILEGX_OPC_LD1U_ADD, TILEGX_OPC_LD1U_ADD, TILEGX_OPC_LD1U_ADD, CHILD(608), + BITFIELD(33, 2) /* index 608 */, + TILEGX_OPC_LD1U_ADD, TILEGX_OPC_LD1U_ADD, TILEGX_OPC_LD1U_ADD, CHILD(613), + BITFIELD(35, 2) /* index 613 */, + TILEGX_OPC_LD1U_ADD, TILEGX_OPC_LD1U_ADD, TILEGX_OPC_LD1U_ADD, + TILEGX_OPC_PREFETCH_ADD_L1, + BITFIELD(31, 2) /* index 618 */, + TILEGX_OPC_LD2S_ADD, TILEGX_OPC_LD2S_ADD, TILEGX_OPC_LD2S_ADD, CHILD(623), + BITFIELD(33, 2) /* index 623 */, + TILEGX_OPC_LD2S_ADD, TILEGX_OPC_LD2S_ADD, TILEGX_OPC_LD2S_ADD, CHILD(628), + BITFIELD(35, 2) /* index 628 */, + TILEGX_OPC_LD2S_ADD, TILEGX_OPC_LD2S_ADD, TILEGX_OPC_LD2S_ADD, + TILEGX_OPC_PREFETCH_ADD_L2_FAULT, + BITFIELD(31, 2) /* index 633 */, + TILEGX_OPC_LD2U_ADD, TILEGX_OPC_LD2U_ADD, TILEGX_OPC_LD2U_ADD, CHILD(638), + BITFIELD(33, 2) /* index 638 */, + TILEGX_OPC_LD2U_ADD, TILEGX_OPC_LD2U_ADD, TILEGX_OPC_LD2U_ADD, CHILD(643), + BITFIELD(35, 2) /* index 643 */, + TILEGX_OPC_LD2U_ADD, TILEGX_OPC_LD2U_ADD, TILEGX_OPC_LD2U_ADD, + TILEGX_OPC_PREFETCH_ADD_L2, + BITFIELD(31, 2) /* index 648 */, + CHILD(653), CHILD(653), CHILD(653), CHILD(673), + BITFIELD(43, 2) /* index 653 */, + CHILD(658), TILEGX_OPC_LD4S_ADD, TILEGX_OPC_LD4S_ADD, TILEGX_OPC_LD4S_ADD, + BITFIELD(45, 2) /* index 658 */, + CHILD(663), TILEGX_OPC_LD4S_ADD, TILEGX_OPC_LD4S_ADD, TILEGX_OPC_LD4S_ADD, + BITFIELD(47, 2) /* index 663 */, + CHILD(668), TILEGX_OPC_LD4S_ADD, TILEGX_OPC_LD4S_ADD, TILEGX_OPC_LD4S_ADD, + BITFIELD(49, 2) /* index 668 */, + TILEGX_OPC_LD4S_TLS, TILEGX_OPC_LD4S_ADD, TILEGX_OPC_LD4S_ADD, + TILEGX_OPC_LD4S_ADD, + BITFIELD(33, 2) /* index 673 */, + CHILD(653), CHILD(653), CHILD(653), CHILD(678), + BITFIELD(35, 2) /* index 678 */, + CHILD(653), CHILD(653), CHILD(653), CHILD(683), + BITFIELD(43, 2) /* index 683 */, + CHILD(688), TILEGX_OPC_PREFETCH_ADD_L3_FAULT, + TILEGX_OPC_PREFETCH_ADD_L3_FAULT, TILEGX_OPC_PREFETCH_ADD_L3_FAULT, + BITFIELD(45, 2) /* index 688 */, + CHILD(693), TILEGX_OPC_PREFETCH_ADD_L3_FAULT, + TILEGX_OPC_PREFETCH_ADD_L3_FAULT, TILEGX_OPC_PREFETCH_ADD_L3_FAULT, + BITFIELD(47, 2) /* index 693 */, + CHILD(698), TILEGX_OPC_PREFETCH_ADD_L3_FAULT, + TILEGX_OPC_PREFETCH_ADD_L3_FAULT, TILEGX_OPC_PREFETCH_ADD_L3_FAULT, + BITFIELD(49, 2) /* index 698 */, + TILEGX_OPC_LD4S_TLS, TILEGX_OPC_PREFETCH_ADD_L3_FAULT, + TILEGX_OPC_PREFETCH_ADD_L3_FAULT, TILEGX_OPC_PREFETCH_ADD_L3_FAULT, + BITFIELD(51, 2) /* index 703 */, + CHILD(708), TILEGX_OPC_LDNT1S_ADD, TILEGX_OPC_LDNT1U_ADD, + TILEGX_OPC_LDNT2S_ADD, + BITFIELD(31, 2) /* index 708 */, + TILEGX_OPC_LD4U_ADD, TILEGX_OPC_LD4U_ADD, TILEGX_OPC_LD4U_ADD, CHILD(713), + BITFIELD(33, 2) /* index 713 */, + TILEGX_OPC_LD4U_ADD, TILEGX_OPC_LD4U_ADD, TILEGX_OPC_LD4U_ADD, CHILD(718), + BITFIELD(35, 2) /* index 718 */, + TILEGX_OPC_LD4U_ADD, TILEGX_OPC_LD4U_ADD, TILEGX_OPC_LD4U_ADD, + TILEGX_OPC_PREFETCH_ADD_L3, + BITFIELD(51, 2) /* index 723 */, + TILEGX_OPC_LDNT2U_ADD, TILEGX_OPC_LDNT4S_ADD, TILEGX_OPC_LDNT4U_ADD, + TILEGX_OPC_LDNT_ADD, + BITFIELD(51, 2) /* index 728 */, + CHILD(733), TILEGX_OPC_LDNA_ADD, TILEGX_OPC_MFSPR, TILEGX_OPC_MTSPR, + BITFIELD(43, 2) /* index 733 */, + CHILD(738), TILEGX_OPC_LD_ADD, TILEGX_OPC_LD_ADD, TILEGX_OPC_LD_ADD, + BITFIELD(45, 2) /* index 738 */, + CHILD(743), TILEGX_OPC_LD_ADD, TILEGX_OPC_LD_ADD, TILEGX_OPC_LD_ADD, + BITFIELD(47, 2) /* index 743 */, + CHILD(748), TILEGX_OPC_LD_ADD, TILEGX_OPC_LD_ADD, TILEGX_OPC_LD_ADD, + BITFIELD(49, 2) /* index 748 */, + TILEGX_OPC_LD_TLS, TILEGX_OPC_LD_ADD, TILEGX_OPC_LD_ADD, TILEGX_OPC_LD_ADD, + BITFIELD(51, 2) /* index 753 */, + TILEGX_OPC_ORI, TILEGX_OPC_ST1_ADD, TILEGX_OPC_ST2_ADD, TILEGX_OPC_ST4_ADD, + BITFIELD(51, 2) /* index 758 */, + TILEGX_OPC_STNT1_ADD, TILEGX_OPC_STNT2_ADD, TILEGX_OPC_STNT4_ADD, + TILEGX_OPC_STNT_ADD, + BITFIELD(51, 2) /* index 763 */, + TILEGX_OPC_ST_ADD, TILEGX_OPC_V1ADDI, TILEGX_OPC_V1CMPEQI, + TILEGX_OPC_V1CMPLTSI, + BITFIELD(51, 2) /* index 768 */, + TILEGX_OPC_V1CMPLTUI, TILEGX_OPC_V1MAXUI, TILEGX_OPC_V1MINUI, + TILEGX_OPC_V2ADDI, + BITFIELD(51, 2) /* index 773 */, + TILEGX_OPC_V2CMPEQI, TILEGX_OPC_V2CMPLTSI, TILEGX_OPC_V2CMPLTUI, + TILEGX_OPC_V2MAXSI, + BITFIELD(51, 2) /* index 778 */, + TILEGX_OPC_V2MINSI, TILEGX_OPC_XORI, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + BITFIELD(49, 4) /* index 783 */, + TILEGX_OPC_NONE, TILEGX_OPC_ADDXSC, TILEGX_OPC_ADDX, TILEGX_OPC_ADD, + TILEGX_OPC_AND, TILEGX_OPC_CMPEQ, TILEGX_OPC_CMPEXCH4, TILEGX_OPC_CMPEXCH, + TILEGX_OPC_CMPLES, TILEGX_OPC_CMPLEU, TILEGX_OPC_CMPLTS, TILEGX_OPC_CMPLTU, + TILEGX_OPC_CMPNE, TILEGX_OPC_DBLALIGN2, TILEGX_OPC_DBLALIGN4, + TILEGX_OPC_DBLALIGN6, + BITFIELD(49, 4) /* index 800 */, + TILEGX_OPC_EXCH4, TILEGX_OPC_EXCH, TILEGX_OPC_FETCHADD4, + TILEGX_OPC_FETCHADDGEZ4, TILEGX_OPC_FETCHADDGEZ, TILEGX_OPC_FETCHADD, + TILEGX_OPC_FETCHAND4, TILEGX_OPC_FETCHAND, TILEGX_OPC_FETCHOR4, + TILEGX_OPC_FETCHOR, TILEGX_OPC_MNZ, TILEGX_OPC_MZ, TILEGX_OPC_NOR, + CHILD(817), TILEGX_OPC_ROTL, TILEGX_OPC_SHL1ADDX, + BITFIELD(43, 2) /* index 817 */, + TILEGX_OPC_OR, TILEGX_OPC_OR, TILEGX_OPC_OR, CHILD(822), + BITFIELD(45, 2) /* index 822 */, + TILEGX_OPC_OR, TILEGX_OPC_OR, TILEGX_OPC_OR, CHILD(827), + BITFIELD(47, 2) /* index 827 */, + TILEGX_OPC_OR, TILEGX_OPC_OR, TILEGX_OPC_OR, TILEGX_OPC_MOVE, + BITFIELD(49, 4) /* index 832 */, + TILEGX_OPC_SHL1ADD, TILEGX_OPC_SHL2ADDX, TILEGX_OPC_SHL2ADD, + TILEGX_OPC_SHL3ADDX, TILEGX_OPC_SHL3ADD, TILEGX_OPC_SHLX, TILEGX_OPC_SHL, + TILEGX_OPC_SHRS, TILEGX_OPC_SHRUX, TILEGX_OPC_SHRU, TILEGX_OPC_ST1, + TILEGX_OPC_ST2, TILEGX_OPC_ST4, TILEGX_OPC_STNT1, TILEGX_OPC_STNT2, + TILEGX_OPC_STNT4, + BITFIELD(46, 7) /* index 849 */, + TILEGX_OPC_STNT, TILEGX_OPC_STNT, TILEGX_OPC_STNT, TILEGX_OPC_STNT, + TILEGX_OPC_STNT, TILEGX_OPC_STNT, TILEGX_OPC_STNT, TILEGX_OPC_STNT, + TILEGX_OPC_ST, TILEGX_OPC_ST, TILEGX_OPC_ST, TILEGX_OPC_ST, TILEGX_OPC_ST, + TILEGX_OPC_ST, TILEGX_OPC_ST, TILEGX_OPC_ST, TILEGX_OPC_SUBXSC, + TILEGX_OPC_SUBXSC, TILEGX_OPC_SUBXSC, TILEGX_OPC_SUBXSC, TILEGX_OPC_SUBXSC, + TILEGX_OPC_SUBXSC, TILEGX_OPC_SUBXSC, TILEGX_OPC_SUBXSC, TILEGX_OPC_SUBX, + TILEGX_OPC_SUBX, TILEGX_OPC_SUBX, TILEGX_OPC_SUBX, TILEGX_OPC_SUBX, + TILEGX_OPC_SUBX, TILEGX_OPC_SUBX, TILEGX_OPC_SUBX, TILEGX_OPC_SUB, + TILEGX_OPC_SUB, TILEGX_OPC_SUB, TILEGX_OPC_SUB, TILEGX_OPC_SUB, + TILEGX_OPC_SUB, TILEGX_OPC_SUB, TILEGX_OPC_SUB, CHILD(978), CHILD(987), + CHILD(1066), CHILD(1150), CHILD(1159), TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_V1ADDUC, TILEGX_OPC_V1ADDUC, TILEGX_OPC_V1ADDUC, + TILEGX_OPC_V1ADDUC, TILEGX_OPC_V1ADDUC, TILEGX_OPC_V1ADDUC, + TILEGX_OPC_V1ADDUC, TILEGX_OPC_V1ADDUC, TILEGX_OPC_V1ADD, TILEGX_OPC_V1ADD, + TILEGX_OPC_V1ADD, TILEGX_OPC_V1ADD, TILEGX_OPC_V1ADD, TILEGX_OPC_V1ADD, + TILEGX_OPC_V1ADD, TILEGX_OPC_V1ADD, TILEGX_OPC_V1CMPEQ, TILEGX_OPC_V1CMPEQ, + TILEGX_OPC_V1CMPEQ, TILEGX_OPC_V1CMPEQ, TILEGX_OPC_V1CMPEQ, + TILEGX_OPC_V1CMPEQ, TILEGX_OPC_V1CMPEQ, TILEGX_OPC_V1CMPEQ, + TILEGX_OPC_V1CMPLES, TILEGX_OPC_V1CMPLES, TILEGX_OPC_V1CMPLES, + TILEGX_OPC_V1CMPLES, TILEGX_OPC_V1CMPLES, TILEGX_OPC_V1CMPLES, + TILEGX_OPC_V1CMPLES, TILEGX_OPC_V1CMPLES, TILEGX_OPC_V1CMPLEU, + TILEGX_OPC_V1CMPLEU, TILEGX_OPC_V1CMPLEU, TILEGX_OPC_V1CMPLEU, + TILEGX_OPC_V1CMPLEU, TILEGX_OPC_V1CMPLEU, TILEGX_OPC_V1CMPLEU, + TILEGX_OPC_V1CMPLEU, TILEGX_OPC_V1CMPLTS, TILEGX_OPC_V1CMPLTS, + TILEGX_OPC_V1CMPLTS, TILEGX_OPC_V1CMPLTS, TILEGX_OPC_V1CMPLTS, + TILEGX_OPC_V1CMPLTS, TILEGX_OPC_V1CMPLTS, TILEGX_OPC_V1CMPLTS, + TILEGX_OPC_V1CMPLTU, TILEGX_OPC_V1CMPLTU, TILEGX_OPC_V1CMPLTU, + TILEGX_OPC_V1CMPLTU, TILEGX_OPC_V1CMPLTU, TILEGX_OPC_V1CMPLTU, + TILEGX_OPC_V1CMPLTU, TILEGX_OPC_V1CMPLTU, TILEGX_OPC_V1CMPNE, + TILEGX_OPC_V1CMPNE, TILEGX_OPC_V1CMPNE, TILEGX_OPC_V1CMPNE, + TILEGX_OPC_V1CMPNE, TILEGX_OPC_V1CMPNE, TILEGX_OPC_V1CMPNE, + TILEGX_OPC_V1CMPNE, TILEGX_OPC_V1INT_H, TILEGX_OPC_V1INT_H, + TILEGX_OPC_V1INT_H, TILEGX_OPC_V1INT_H, TILEGX_OPC_V1INT_H, + TILEGX_OPC_V1INT_H, TILEGX_OPC_V1INT_H, TILEGX_OPC_V1INT_H, + TILEGX_OPC_V1INT_L, TILEGX_OPC_V1INT_L, TILEGX_OPC_V1INT_L, + TILEGX_OPC_V1INT_L, TILEGX_OPC_V1INT_L, TILEGX_OPC_V1INT_L, + TILEGX_OPC_V1INT_L, TILEGX_OPC_V1INT_L, + BITFIELD(43, 3) /* index 978 */, + TILEGX_OPC_NONE, TILEGX_OPC_DRAIN, TILEGX_OPC_DTLBPR, TILEGX_OPC_FINV, + TILEGX_OPC_FLUSHWB, TILEGX_OPC_FLUSH, TILEGX_OPC_FNOP, TILEGX_OPC_ICOH, + BITFIELD(43, 3) /* index 987 */, + CHILD(996), TILEGX_OPC_INV, TILEGX_OPC_IRET, TILEGX_OPC_JALRP, + TILEGX_OPC_JALR, TILEGX_OPC_JRP, TILEGX_OPC_JR, CHILD(1051), + BITFIELD(31, 2) /* index 996 */, + CHILD(1001), CHILD(1026), TILEGX_OPC_ILL, TILEGX_OPC_ILL, + BITFIELD(33, 2) /* index 1001 */, + TILEGX_OPC_ILL, TILEGX_OPC_ILL, TILEGX_OPC_ILL, CHILD(1006), + BITFIELD(35, 2) /* index 1006 */, + TILEGX_OPC_ILL, CHILD(1011), TILEGX_OPC_ILL, TILEGX_OPC_ILL, + BITFIELD(37, 2) /* index 1011 */, + TILEGX_OPC_ILL, CHILD(1016), TILEGX_OPC_ILL, TILEGX_OPC_ILL, + BITFIELD(39, 2) /* index 1016 */, + TILEGX_OPC_ILL, CHILD(1021), TILEGX_OPC_ILL, TILEGX_OPC_ILL, + BITFIELD(41, 2) /* index 1021 */, + TILEGX_OPC_ILL, TILEGX_OPC_ILL, TILEGX_OPC_BPT, TILEGX_OPC_ILL, + BITFIELD(33, 2) /* index 1026 */, + TILEGX_OPC_ILL, TILEGX_OPC_ILL, TILEGX_OPC_ILL, CHILD(1031), + BITFIELD(35, 2) /* index 1031 */, + TILEGX_OPC_ILL, CHILD(1036), TILEGX_OPC_ILL, TILEGX_OPC_ILL, + BITFIELD(37, 2) /* index 1036 */, + TILEGX_OPC_ILL, CHILD(1041), TILEGX_OPC_ILL, TILEGX_OPC_ILL, + BITFIELD(39, 2) /* index 1041 */, + TILEGX_OPC_ILL, CHILD(1046), TILEGX_OPC_ILL, TILEGX_OPC_ILL, + BITFIELD(41, 2) /* index 1046 */, + TILEGX_OPC_ILL, TILEGX_OPC_ILL, TILEGX_OPC_RAISE, TILEGX_OPC_ILL, + BITFIELD(31, 2) /* index 1051 */, + TILEGX_OPC_LD1S, TILEGX_OPC_LD1S, TILEGX_OPC_LD1S, CHILD(1056), + BITFIELD(33, 2) /* index 1056 */, + TILEGX_OPC_LD1S, TILEGX_OPC_LD1S, TILEGX_OPC_LD1S, CHILD(1061), + BITFIELD(35, 2) /* index 1061 */, + TILEGX_OPC_LD1S, TILEGX_OPC_LD1S, TILEGX_OPC_LD1S, + TILEGX_OPC_PREFETCH_L1_FAULT, + BITFIELD(43, 3) /* index 1066 */, + CHILD(1075), CHILD(1090), CHILD(1105), CHILD(1120), CHILD(1135), + TILEGX_OPC_LDNA, TILEGX_OPC_LDNT1S, TILEGX_OPC_LDNT1U, + BITFIELD(31, 2) /* index 1075 */, + TILEGX_OPC_LD1U, TILEGX_OPC_LD1U, TILEGX_OPC_LD1U, CHILD(1080), + BITFIELD(33, 2) /* index 1080 */, + TILEGX_OPC_LD1U, TILEGX_OPC_LD1U, TILEGX_OPC_LD1U, CHILD(1085), + BITFIELD(35, 2) /* index 1085 */, + TILEGX_OPC_LD1U, TILEGX_OPC_LD1U, TILEGX_OPC_LD1U, TILEGX_OPC_PREFETCH, + BITFIELD(31, 2) /* index 1090 */, + TILEGX_OPC_LD2S, TILEGX_OPC_LD2S, TILEGX_OPC_LD2S, CHILD(1095), + BITFIELD(33, 2) /* index 1095 */, + TILEGX_OPC_LD2S, TILEGX_OPC_LD2S, TILEGX_OPC_LD2S, CHILD(1100), + BITFIELD(35, 2) /* index 1100 */, + TILEGX_OPC_LD2S, TILEGX_OPC_LD2S, TILEGX_OPC_LD2S, + TILEGX_OPC_PREFETCH_L2_FAULT, + BITFIELD(31, 2) /* index 1105 */, + TILEGX_OPC_LD2U, TILEGX_OPC_LD2U, TILEGX_OPC_LD2U, CHILD(1110), + BITFIELD(33, 2) /* index 1110 */, + TILEGX_OPC_LD2U, TILEGX_OPC_LD2U, TILEGX_OPC_LD2U, CHILD(1115), + BITFIELD(35, 2) /* index 1115 */, + TILEGX_OPC_LD2U, TILEGX_OPC_LD2U, TILEGX_OPC_LD2U, TILEGX_OPC_PREFETCH_L2, + BITFIELD(31, 2) /* index 1120 */, + TILEGX_OPC_LD4S, TILEGX_OPC_LD4S, TILEGX_OPC_LD4S, CHILD(1125), + BITFIELD(33, 2) /* index 1125 */, + TILEGX_OPC_LD4S, TILEGX_OPC_LD4S, TILEGX_OPC_LD4S, CHILD(1130), + BITFIELD(35, 2) /* index 1130 */, + TILEGX_OPC_LD4S, TILEGX_OPC_LD4S, TILEGX_OPC_LD4S, + TILEGX_OPC_PREFETCH_L3_FAULT, + BITFIELD(31, 2) /* index 1135 */, + TILEGX_OPC_LD4U, TILEGX_OPC_LD4U, TILEGX_OPC_LD4U, CHILD(1140), + BITFIELD(33, 2) /* index 1140 */, + TILEGX_OPC_LD4U, TILEGX_OPC_LD4U, TILEGX_OPC_LD4U, CHILD(1145), + BITFIELD(35, 2) /* index 1145 */, + TILEGX_OPC_LD4U, TILEGX_OPC_LD4U, TILEGX_OPC_LD4U, TILEGX_OPC_PREFETCH_L3, + BITFIELD(43, 3) /* index 1150 */, + TILEGX_OPC_LDNT2S, TILEGX_OPC_LDNT2U, TILEGX_OPC_LDNT4S, TILEGX_OPC_LDNT4U, + TILEGX_OPC_LDNT, TILEGX_OPC_LD, TILEGX_OPC_LNK, TILEGX_OPC_MF, + BITFIELD(43, 3) /* index 1159 */, + TILEGX_OPC_NAP, TILEGX_OPC_NOP, TILEGX_OPC_SWINT0, TILEGX_OPC_SWINT1, + TILEGX_OPC_SWINT2, TILEGX_OPC_SWINT3, TILEGX_OPC_WH64, TILEGX_OPC_NONE, + BITFIELD(49, 4) /* index 1168 */, + TILEGX_OPC_V1MAXU, TILEGX_OPC_V1MINU, TILEGX_OPC_V1MNZ, TILEGX_OPC_V1MZ, + TILEGX_OPC_V1SHL, TILEGX_OPC_V1SHRS, TILEGX_OPC_V1SHRU, TILEGX_OPC_V1SUBUC, + TILEGX_OPC_V1SUB, TILEGX_OPC_V2ADDSC, TILEGX_OPC_V2ADD, TILEGX_OPC_V2CMPEQ, + TILEGX_OPC_V2CMPLES, TILEGX_OPC_V2CMPLEU, TILEGX_OPC_V2CMPLTS, + TILEGX_OPC_V2CMPLTU, + BITFIELD(49, 4) /* index 1185 */, + TILEGX_OPC_V2CMPNE, TILEGX_OPC_V2INT_H, TILEGX_OPC_V2INT_L, + TILEGX_OPC_V2MAXS, TILEGX_OPC_V2MINS, TILEGX_OPC_V2MNZ, TILEGX_OPC_V2MZ, + TILEGX_OPC_V2PACKH, TILEGX_OPC_V2PACKL, TILEGX_OPC_V2PACKUC, + TILEGX_OPC_V2SHLSC, TILEGX_OPC_V2SHL, TILEGX_OPC_V2SHRS, TILEGX_OPC_V2SHRU, + TILEGX_OPC_V2SUBSC, TILEGX_OPC_V2SUB, + BITFIELD(49, 4) /* index 1202 */, + TILEGX_OPC_V4ADDSC, TILEGX_OPC_V4ADD, TILEGX_OPC_V4INT_H, + TILEGX_OPC_V4INT_L, TILEGX_OPC_V4PACKSC, TILEGX_OPC_V4SHLSC, + TILEGX_OPC_V4SHL, TILEGX_OPC_V4SHRS, TILEGX_OPC_V4SHRU, TILEGX_OPC_V4SUBSC, + TILEGX_OPC_V4SUB, TILEGX_OPC_XOR, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, + BITFIELD(49, 4) /* index 1219 */, + TILEGX_OPC_NONE, TILEGX_OPC_ROTLI, TILEGX_OPC_SHLI, TILEGX_OPC_SHLXI, + TILEGX_OPC_SHRSI, TILEGX_OPC_SHRUI, TILEGX_OPC_SHRUXI, TILEGX_OPC_V1SHLI, + TILEGX_OPC_V1SHRSI, TILEGX_OPC_V1SHRUI, TILEGX_OPC_V2SHLI, + TILEGX_OPC_V2SHRSI, TILEGX_OPC_V2SHRUI, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, + BITFIELD(31, 2) /* index 1236 */, + TILEGX_OPC_SHL16INSLI, TILEGX_OPC_SHL16INSLI, TILEGX_OPC_SHL16INSLI, + CHILD(1241), + BITFIELD(33, 2) /* index 1241 */, + TILEGX_OPC_SHL16INSLI, TILEGX_OPC_SHL16INSLI, TILEGX_OPC_SHL16INSLI, + CHILD(1246), + BITFIELD(35, 2) /* index 1246 */, + TILEGX_OPC_SHL16INSLI, TILEGX_OPC_SHL16INSLI, TILEGX_OPC_SHL16INSLI, + CHILD(1251), + BITFIELD(37, 2) /* index 1251 */, + TILEGX_OPC_SHL16INSLI, TILEGX_OPC_SHL16INSLI, TILEGX_OPC_SHL16INSLI, + CHILD(1256), + BITFIELD(39, 2) /* index 1256 */, + TILEGX_OPC_SHL16INSLI, TILEGX_OPC_SHL16INSLI, TILEGX_OPC_SHL16INSLI, + CHILD(1261), + BITFIELD(41, 2) /* index 1261 */, + TILEGX_OPC_SHL16INSLI, TILEGX_OPC_SHL16INSLI, TILEGX_OPC_SHL16INSLI, + TILEGX_OPC_INFOL, +}; + +static const unsigned short decode_Y0_fsm[178] = +{ + BITFIELD(27, 4) /* index 0 */, + CHILD(17), TILEGX_OPC_ADDXI, CHILD(32), TILEGX_OPC_CMPEQI, + TILEGX_OPC_CMPLTSI, CHILD(62), CHILD(67), CHILD(118), CHILD(123), + CHILD(128), CHILD(133), CHILD(153), CHILD(158), CHILD(163), CHILD(168), + CHILD(173), + BITFIELD(6, 2) /* index 17 */, + TILEGX_OPC_ADDI, TILEGX_OPC_ADDI, TILEGX_OPC_ADDI, CHILD(22), + BITFIELD(8, 2) /* index 22 */, + TILEGX_OPC_ADDI, TILEGX_OPC_ADDI, TILEGX_OPC_ADDI, CHILD(27), + BITFIELD(10, 2) /* index 27 */, + TILEGX_OPC_ADDI, TILEGX_OPC_ADDI, TILEGX_OPC_ADDI, TILEGX_OPC_MOVEI, + BITFIELD(0, 2) /* index 32 */, + TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, CHILD(37), + BITFIELD(2, 2) /* index 37 */, + TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, CHILD(42), + BITFIELD(4, 2) /* index 42 */, + TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, CHILD(47), + BITFIELD(6, 2) /* index 47 */, + TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, CHILD(52), + BITFIELD(8, 2) /* index 52 */, + TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, CHILD(57), + BITFIELD(10, 2) /* index 57 */, + TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_INFO, + BITFIELD(18, 2) /* index 62 */, + TILEGX_OPC_ADDX, TILEGX_OPC_ADD, TILEGX_OPC_SUBX, TILEGX_OPC_SUB, + BITFIELD(15, 5) /* index 67 */, + TILEGX_OPC_SHL1ADD, TILEGX_OPC_SHL1ADD, TILEGX_OPC_SHL1ADD, + TILEGX_OPC_SHL1ADD, TILEGX_OPC_SHL1ADD, TILEGX_OPC_SHL1ADD, + TILEGX_OPC_SHL1ADD, TILEGX_OPC_SHL1ADD, TILEGX_OPC_SHL2ADD, + TILEGX_OPC_SHL2ADD, TILEGX_OPC_SHL2ADD, TILEGX_OPC_SHL2ADD, + TILEGX_OPC_SHL2ADD, TILEGX_OPC_SHL2ADD, TILEGX_OPC_SHL2ADD, + TILEGX_OPC_SHL2ADD, TILEGX_OPC_SHL3ADD, TILEGX_OPC_SHL3ADD, + TILEGX_OPC_SHL3ADD, TILEGX_OPC_SHL3ADD, TILEGX_OPC_SHL3ADD, + TILEGX_OPC_SHL3ADD, TILEGX_OPC_SHL3ADD, TILEGX_OPC_SHL3ADD, CHILD(100), + CHILD(109), TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + BITFIELD(12, 3) /* index 100 */, + TILEGX_OPC_NONE, TILEGX_OPC_CLZ, TILEGX_OPC_CTZ, TILEGX_OPC_FNOP, + TILEGX_OPC_FSINGLE_PACK1, TILEGX_OPC_NOP, TILEGX_OPC_PCNT, + TILEGX_OPC_REVBITS, + BITFIELD(12, 3) /* index 109 */, + TILEGX_OPC_REVBYTES, TILEGX_OPC_TBLIDXB0, TILEGX_OPC_TBLIDXB1, + TILEGX_OPC_TBLIDXB2, TILEGX_OPC_TBLIDXB3, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + TILEGX_OPC_NONE, + BITFIELD(18, 2) /* index 118 */, + TILEGX_OPC_CMPLES, TILEGX_OPC_CMPLEU, TILEGX_OPC_CMPLTS, TILEGX_OPC_CMPLTU, + BITFIELD(18, 2) /* index 123 */, + TILEGX_OPC_CMPEQ, TILEGX_OPC_CMPNE, TILEGX_OPC_MULAX, TILEGX_OPC_MULX, + BITFIELD(18, 2) /* index 128 */, + TILEGX_OPC_CMOVEQZ, TILEGX_OPC_CMOVNEZ, TILEGX_OPC_MNZ, TILEGX_OPC_MZ, + BITFIELD(18, 2) /* index 133 */, + TILEGX_OPC_AND, TILEGX_OPC_NOR, CHILD(138), TILEGX_OPC_XOR, + BITFIELD(12, 2) /* index 138 */, + TILEGX_OPC_OR, TILEGX_OPC_OR, TILEGX_OPC_OR, CHILD(143), + BITFIELD(14, 2) /* index 143 */, + TILEGX_OPC_OR, TILEGX_OPC_OR, TILEGX_OPC_OR, CHILD(148), + BITFIELD(16, 2) /* index 148 */, + TILEGX_OPC_OR, TILEGX_OPC_OR, TILEGX_OPC_OR, TILEGX_OPC_MOVE, + BITFIELD(18, 2) /* index 153 */, + TILEGX_OPC_ROTL, TILEGX_OPC_SHL, TILEGX_OPC_SHRS, TILEGX_OPC_SHRU, + BITFIELD(18, 2) /* index 158 */, + TILEGX_OPC_NONE, TILEGX_OPC_SHL1ADDX, TILEGX_OPC_SHL2ADDX, + TILEGX_OPC_SHL3ADDX, + BITFIELD(18, 2) /* index 163 */, + TILEGX_OPC_MUL_HS_HS, TILEGX_OPC_MUL_HU_HU, TILEGX_OPC_MUL_LS_LS, + TILEGX_OPC_MUL_LU_LU, + BITFIELD(18, 2) /* index 168 */, + TILEGX_OPC_MULA_HS_HS, TILEGX_OPC_MULA_HU_HU, TILEGX_OPC_MULA_LS_LS, + TILEGX_OPC_MULA_LU_LU, + BITFIELD(18, 2) /* index 173 */, + TILEGX_OPC_ROTLI, TILEGX_OPC_SHLI, TILEGX_OPC_SHRSI, TILEGX_OPC_SHRUI, +}; + +static const unsigned short decode_Y1_fsm[167] = +{ + BITFIELD(58, 4) /* index 0 */, + TILEGX_OPC_NONE, CHILD(17), TILEGX_OPC_ADDXI, CHILD(32), TILEGX_OPC_CMPEQI, + TILEGX_OPC_CMPLTSI, CHILD(62), CHILD(67), CHILD(117), CHILD(122), + CHILD(127), CHILD(132), CHILD(152), CHILD(157), CHILD(162), TILEGX_OPC_NONE, + BITFIELD(37, 2) /* index 17 */, + TILEGX_OPC_ADDI, TILEGX_OPC_ADDI, TILEGX_OPC_ADDI, CHILD(22), + BITFIELD(39, 2) /* index 22 */, + TILEGX_OPC_ADDI, TILEGX_OPC_ADDI, TILEGX_OPC_ADDI, CHILD(27), + BITFIELD(41, 2) /* index 27 */, + TILEGX_OPC_ADDI, TILEGX_OPC_ADDI, TILEGX_OPC_ADDI, TILEGX_OPC_MOVEI, + BITFIELD(31, 2) /* index 32 */, + TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, CHILD(37), + BITFIELD(33, 2) /* index 37 */, + TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, CHILD(42), + BITFIELD(35, 2) /* index 42 */, + TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, CHILD(47), + BITFIELD(37, 2) /* index 47 */, + TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, CHILD(52), + BITFIELD(39, 2) /* index 52 */, + TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, CHILD(57), + BITFIELD(41, 2) /* index 57 */, + TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_INFO, + BITFIELD(49, 2) /* index 62 */, + TILEGX_OPC_ADDX, TILEGX_OPC_ADD, TILEGX_OPC_SUBX, TILEGX_OPC_SUB, + BITFIELD(47, 4) /* index 67 */, + TILEGX_OPC_SHL1ADD, TILEGX_OPC_SHL1ADD, TILEGX_OPC_SHL1ADD, + TILEGX_OPC_SHL1ADD, TILEGX_OPC_SHL2ADD, TILEGX_OPC_SHL2ADD, + TILEGX_OPC_SHL2ADD, TILEGX_OPC_SHL2ADD, TILEGX_OPC_SHL3ADD, + TILEGX_OPC_SHL3ADD, TILEGX_OPC_SHL3ADD, TILEGX_OPC_SHL3ADD, CHILD(84), + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, + BITFIELD(43, 3) /* index 84 */, + CHILD(93), CHILD(96), CHILD(99), CHILD(102), CHILD(105), CHILD(108), + CHILD(111), CHILD(114), + BITFIELD(46, 1) /* index 93 */, + TILEGX_OPC_NONE, TILEGX_OPC_FNOP, + BITFIELD(46, 1) /* index 96 */, + TILEGX_OPC_NONE, TILEGX_OPC_ILL, + BITFIELD(46, 1) /* index 99 */, + TILEGX_OPC_NONE, TILEGX_OPC_JALRP, + BITFIELD(46, 1) /* index 102 */, + TILEGX_OPC_NONE, TILEGX_OPC_JALR, + BITFIELD(46, 1) /* index 105 */, + TILEGX_OPC_NONE, TILEGX_OPC_JRP, + BITFIELD(46, 1) /* index 108 */, + TILEGX_OPC_NONE, TILEGX_OPC_JR, + BITFIELD(46, 1) /* index 111 */, + TILEGX_OPC_NONE, TILEGX_OPC_LNK, + BITFIELD(46, 1) /* index 114 */, + TILEGX_OPC_NONE, TILEGX_OPC_NOP, + BITFIELD(49, 2) /* index 117 */, + TILEGX_OPC_CMPLES, TILEGX_OPC_CMPLEU, TILEGX_OPC_CMPLTS, TILEGX_OPC_CMPLTU, + BITFIELD(49, 2) /* index 122 */, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_CMPEQ, TILEGX_OPC_CMPNE, + BITFIELD(49, 2) /* index 127 */, + TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_MNZ, TILEGX_OPC_MZ, + BITFIELD(49, 2) /* index 132 */, + TILEGX_OPC_AND, TILEGX_OPC_NOR, CHILD(137), TILEGX_OPC_XOR, + BITFIELD(43, 2) /* index 137 */, + TILEGX_OPC_OR, TILEGX_OPC_OR, TILEGX_OPC_OR, CHILD(142), + BITFIELD(45, 2) /* index 142 */, + TILEGX_OPC_OR, TILEGX_OPC_OR, TILEGX_OPC_OR, CHILD(147), + BITFIELD(47, 2) /* index 147 */, + TILEGX_OPC_OR, TILEGX_OPC_OR, TILEGX_OPC_OR, TILEGX_OPC_MOVE, + BITFIELD(49, 2) /* index 152 */, + TILEGX_OPC_ROTL, TILEGX_OPC_SHL, TILEGX_OPC_SHRS, TILEGX_OPC_SHRU, + BITFIELD(49, 2) /* index 157 */, + TILEGX_OPC_NONE, TILEGX_OPC_SHL1ADDX, TILEGX_OPC_SHL2ADDX, + TILEGX_OPC_SHL3ADDX, + BITFIELD(49, 2) /* index 162 */, + TILEGX_OPC_ROTLI, TILEGX_OPC_SHLI, TILEGX_OPC_SHRSI, TILEGX_OPC_SHRUI, +}; + +static const unsigned short decode_Y2_fsm[118] = +{ + BITFIELD(62, 2) /* index 0 */, + TILEGX_OPC_NONE, CHILD(5), CHILD(66), CHILD(109), + BITFIELD(55, 3) /* index 5 */, + CHILD(14), CHILD(14), CHILD(14), CHILD(17), CHILD(40), CHILD(40), CHILD(40), + CHILD(43), + BITFIELD(26, 1) /* index 14 */, + TILEGX_OPC_LD1S, TILEGX_OPC_LD1U, + BITFIELD(26, 1) /* index 17 */, + CHILD(20), CHILD(30), + BITFIELD(51, 2) /* index 20 */, + TILEGX_OPC_LD1S, TILEGX_OPC_LD1S, TILEGX_OPC_LD1S, CHILD(25), + BITFIELD(53, 2) /* index 25 */, + TILEGX_OPC_LD1S, TILEGX_OPC_LD1S, TILEGX_OPC_LD1S, + TILEGX_OPC_PREFETCH_L1_FAULT, + BITFIELD(51, 2) /* index 30 */, + TILEGX_OPC_LD1U, TILEGX_OPC_LD1U, TILEGX_OPC_LD1U, CHILD(35), + BITFIELD(53, 2) /* index 35 */, + TILEGX_OPC_LD1U, TILEGX_OPC_LD1U, TILEGX_OPC_LD1U, TILEGX_OPC_PREFETCH, + BITFIELD(26, 1) /* index 40 */, + TILEGX_OPC_LD2S, TILEGX_OPC_LD2U, + BITFIELD(26, 1) /* index 43 */, + CHILD(46), CHILD(56), + BITFIELD(51, 2) /* index 46 */, + TILEGX_OPC_LD2S, TILEGX_OPC_LD2S, TILEGX_OPC_LD2S, CHILD(51), + BITFIELD(53, 2) /* index 51 */, + TILEGX_OPC_LD2S, TILEGX_OPC_LD2S, TILEGX_OPC_LD2S, + TILEGX_OPC_PREFETCH_L2_FAULT, + BITFIELD(51, 2) /* index 56 */, + TILEGX_OPC_LD2U, TILEGX_OPC_LD2U, TILEGX_OPC_LD2U, CHILD(61), + BITFIELD(53, 2) /* index 61 */, + TILEGX_OPC_LD2U, TILEGX_OPC_LD2U, TILEGX_OPC_LD2U, TILEGX_OPC_PREFETCH_L2, + BITFIELD(56, 2) /* index 66 */, + CHILD(71), CHILD(74), CHILD(90), CHILD(93), + BITFIELD(26, 1) /* index 71 */, + TILEGX_OPC_NONE, TILEGX_OPC_LD4S, + BITFIELD(26, 1) /* index 74 */, + TILEGX_OPC_NONE, CHILD(77), + BITFIELD(51, 2) /* index 77 */, + TILEGX_OPC_LD4S, TILEGX_OPC_LD4S, TILEGX_OPC_LD4S, CHILD(82), + BITFIELD(53, 2) /* index 82 */, + TILEGX_OPC_LD4S, TILEGX_OPC_LD4S, TILEGX_OPC_LD4S, CHILD(87), + BITFIELD(55, 1) /* index 87 */, + TILEGX_OPC_LD4S, TILEGX_OPC_PREFETCH_L3_FAULT, + BITFIELD(26, 1) /* index 90 */, + TILEGX_OPC_LD4U, TILEGX_OPC_LD, + BITFIELD(26, 1) /* index 93 */, + CHILD(96), TILEGX_OPC_LD, + BITFIELD(51, 2) /* index 96 */, + TILEGX_OPC_LD4U, TILEGX_OPC_LD4U, TILEGX_OPC_LD4U, CHILD(101), + BITFIELD(53, 2) /* index 101 */, + TILEGX_OPC_LD4U, TILEGX_OPC_LD4U, TILEGX_OPC_LD4U, CHILD(106), + BITFIELD(55, 1) /* index 106 */, + TILEGX_OPC_LD4U, TILEGX_OPC_PREFETCH_L3, + BITFIELD(26, 1) /* index 109 */, + CHILD(112), CHILD(115), + BITFIELD(57, 1) /* index 112 */, + TILEGX_OPC_ST1, TILEGX_OPC_ST4, + BITFIELD(57, 1) /* index 115 */, + TILEGX_OPC_ST2, TILEGX_OPC_ST, +}; + +#undef BITFIELD +#undef CHILD + +const unsigned short * const +tilegx_bundle_decoder_fsms[TILEGX_NUM_PIPELINE_ENCODINGS] = +{ + decode_X0_fsm, + decode_X1_fsm, + decode_Y0_fsm, + decode_Y1_fsm, + decode_Y2_fsm +}; + +const struct tilegx_operand tilegx_operands[35] = +{ + { + TILEGX_OP_TYPE_IMMEDIATE, BFD_RELOC(TILEGX_IMM8_X0), + 8, 1, 0, 0, 0, 0, + create_Imm8_X0, get_Imm8_X0 + }, + { + TILEGX_OP_TYPE_IMMEDIATE, BFD_RELOC(TILEGX_IMM8_X1), + 8, 1, 0, 0, 0, 0, + create_Imm8_X1, get_Imm8_X1 + }, + { + TILEGX_OP_TYPE_IMMEDIATE, BFD_RELOC(TILEGX_IMM8_Y0), + 8, 1, 0, 0, 0, 0, + create_Imm8_Y0, get_Imm8_Y0 + }, + { + TILEGX_OP_TYPE_IMMEDIATE, BFD_RELOC(TILEGX_IMM8_Y1), + 8, 1, 0, 0, 0, 0, + create_Imm8_Y1, get_Imm8_Y1 + }, + { + TILEGX_OP_TYPE_IMMEDIATE, BFD_RELOC(TILEGX_IMM16_X0_HW0_LAST), + 16, 1, 0, 0, 0, 0, + create_Imm16_X0, get_Imm16_X0 + }, + { + TILEGX_OP_TYPE_IMMEDIATE, BFD_RELOC(TILEGX_IMM16_X1_HW0_LAST), + 16, 1, 0, 0, 0, 0, + create_Imm16_X1, get_Imm16_X1 + }, + { + TILEGX_OP_TYPE_REGISTER, BFD_RELOC(NONE), + 6, 0, 0, 1, 0, 0, + create_Dest_X1, get_Dest_X1 + }, + { + TILEGX_OP_TYPE_REGISTER, BFD_RELOC(NONE), + 6, 0, 1, 0, 0, 0, + create_SrcA_X1, get_SrcA_X1 + }, + { + TILEGX_OP_TYPE_REGISTER, BFD_RELOC(NONE), + 6, 0, 0, 1, 0, 0, + create_Dest_X0, get_Dest_X0 + }, + { + TILEGX_OP_TYPE_REGISTER, BFD_RELOC(NONE), + 6, 0, 1, 0, 0, 0, + create_SrcA_X0, get_SrcA_X0 + }, + { + TILEGX_OP_TYPE_REGISTER, BFD_RELOC(NONE), + 6, 0, 0, 1, 0, 0, + create_Dest_Y0, get_Dest_Y0 + }, + { + TILEGX_OP_TYPE_REGISTER, BFD_RELOC(NONE), + 6, 0, 1, 0, 0, 0, + create_SrcA_Y0, get_SrcA_Y0 + }, + { + TILEGX_OP_TYPE_REGISTER, BFD_RELOC(NONE), + 6, 0, 0, 1, 0, 0, + create_Dest_Y1, get_Dest_Y1 + }, + { + TILEGX_OP_TYPE_REGISTER, BFD_RELOC(NONE), + 6, 0, 1, 0, 0, 0, + create_SrcA_Y1, get_SrcA_Y1 + }, + { + TILEGX_OP_TYPE_REGISTER, BFD_RELOC(NONE), + 6, 0, 1, 0, 0, 0, + create_SrcA_Y2, get_SrcA_Y2 + }, + { + TILEGX_OP_TYPE_REGISTER, BFD_RELOC(NONE), + 6, 0, 1, 1, 0, 0, + create_SrcA_X1, get_SrcA_X1 + }, + { + TILEGX_OP_TYPE_REGISTER, BFD_RELOC(NONE), + 6, 0, 1, 0, 0, 0, + create_SrcB_X0, get_SrcB_X0 + }, + { + TILEGX_OP_TYPE_REGISTER, BFD_RELOC(NONE), + 6, 0, 1, 0, 0, 0, + create_SrcB_X1, get_SrcB_X1 + }, + { + TILEGX_OP_TYPE_REGISTER, BFD_RELOC(NONE), + 6, 0, 1, 0, 0, 0, + create_SrcB_Y0, get_SrcB_Y0 + }, + { + TILEGX_OP_TYPE_REGISTER, BFD_RELOC(NONE), + 6, 0, 1, 0, 0, 0, + create_SrcB_Y1, get_SrcB_Y1 + }, + { + TILEGX_OP_TYPE_ADDRESS, BFD_RELOC(TILEGX_BROFF_X1), + 17, 1, 0, 0, 1, TILEGX_LOG2_BUNDLE_ALIGNMENT_IN_BYTES, + create_BrOff_X1, get_BrOff_X1 + }, + { + TILEGX_OP_TYPE_IMMEDIATE, BFD_RELOC(TILEGX_MMSTART_X0), + 6, 0, 0, 0, 0, 0, + create_BFStart_X0, get_BFStart_X0 + }, + { + TILEGX_OP_TYPE_IMMEDIATE, BFD_RELOC(TILEGX_MMEND_X0), + 6, 0, 0, 0, 0, 0, + create_BFEnd_X0, get_BFEnd_X0 + }, + { + TILEGX_OP_TYPE_REGISTER, BFD_RELOC(NONE), + 6, 0, 1, 1, 0, 0, + create_Dest_X0, get_Dest_X0 + }, + { + TILEGX_OP_TYPE_REGISTER, BFD_RELOC(NONE), + 6, 0, 1, 1, 0, 0, + create_Dest_Y0, get_Dest_Y0 + }, + { + TILEGX_OP_TYPE_ADDRESS, BFD_RELOC(TILEGX_JUMPOFF_X1), + 27, 1, 0, 0, 1, TILEGX_LOG2_BUNDLE_ALIGNMENT_IN_BYTES, + create_JumpOff_X1, get_JumpOff_X1 + }, + { + TILEGX_OP_TYPE_REGISTER, BFD_RELOC(NONE), + 6, 0, 0, 1, 0, 0, + create_SrcBDest_Y2, get_SrcBDest_Y2 + }, + { + TILEGX_OP_TYPE_SPR, BFD_RELOC(TILEGX_MF_IMM14_X1), + 14, 0, 0, 0, 0, 0, + create_MF_Imm14_X1, get_MF_Imm14_X1 + }, + { + TILEGX_OP_TYPE_SPR, BFD_RELOC(TILEGX_MT_IMM14_X1), + 14, 0, 0, 0, 0, 0, + create_MT_Imm14_X1, get_MT_Imm14_X1 + }, + { + TILEGX_OP_TYPE_IMMEDIATE, BFD_RELOC(TILEGX_SHAMT_X0), + 6, 0, 0, 0, 0, 0, + create_ShAmt_X0, get_ShAmt_X0 + }, + { + TILEGX_OP_TYPE_IMMEDIATE, BFD_RELOC(TILEGX_SHAMT_X1), + 6, 0, 0, 0, 0, 0, + create_ShAmt_X1, get_ShAmt_X1 + }, + { + TILEGX_OP_TYPE_IMMEDIATE, BFD_RELOC(TILEGX_SHAMT_Y0), + 6, 0, 0, 0, 0, 0, + create_ShAmt_Y0, get_ShAmt_Y0 + }, + { + TILEGX_OP_TYPE_IMMEDIATE, BFD_RELOC(TILEGX_SHAMT_Y1), + 6, 0, 0, 0, 0, 0, + create_ShAmt_Y1, get_ShAmt_Y1 + }, + { + TILEGX_OP_TYPE_REGISTER, BFD_RELOC(NONE), + 6, 0, 1, 0, 0, 0, + create_SrcBDest_Y2, get_SrcBDest_Y2 + }, + { + TILEGX_OP_TYPE_IMMEDIATE, BFD_RELOC(TILEGX_DEST_IMM8_X1), + 8, 1, 0, 0, 0, 0, + create_Dest_Imm8_X1, get_Dest_Imm8_X1 + } +}; + +/* Given a set of bundle bits and a specific pipe, returns which + * instruction the bundle contains in that pipe. + */ +const struct tilegx_opcode * +find_opcode(tilegx_bundle_bits bits, tilegx_pipeline pipe) +{ + const unsigned short *table = tilegx_bundle_decoder_fsms[pipe]; + int index = 0; + + while (1) + { + unsigned short bitspec = table[index]; + unsigned int bitfield = + ((unsigned int)(bits >> (bitspec & 63))) & (bitspec >> 6); + + unsigned short next = table[index + 1 + bitfield]; + if (next <= TILEGX_OPC_NONE) + return &tilegx_opcodes[next]; + + index = next - TILEGX_OPC_NONE; + } +} + +int +parse_insn_tilegx(tilegx_bundle_bits bits, + unsigned long long pc, + struct tilegx_decoded_instruction + decoded[TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE]) +{ + int num_instructions = 0; + int pipe; + + int min_pipe, max_pipe; + if ((bits & TILEGX_BUNDLE_MODE_MASK) == 0) + { + min_pipe = TILEGX_PIPELINE_X0; + max_pipe = TILEGX_PIPELINE_X1; + } + else + { + min_pipe = TILEGX_PIPELINE_Y0; + max_pipe = TILEGX_PIPELINE_Y2; + } + + /* For each pipe, find an instruction that fits. */ + for (pipe = min_pipe; pipe <= max_pipe; pipe++) + { + const struct tilegx_opcode *opc; + struct tilegx_decoded_instruction *d; + int i; + + d = &decoded[num_instructions++]; + opc = find_opcode (bits, (tilegx_pipeline)pipe); + d->opcode = opc; + + /* Decode each operand, sign extending, etc. as appropriate. */ + for (i = 0; i < opc->num_operands; i++) + { + const struct tilegx_operand *op = + &tilegx_operands[opc->operands[pipe][i]]; + int raw_opval = op->extract (bits); + long long opval; + + if (op->is_signed) + { + /* Sign-extend the operand. */ + int shift = (int)((sizeof(int) * 8) - op->num_bits); + raw_opval = (raw_opval << shift) >> shift; + } + + /* Adjust PC-relative scaled branch offsets. */ + if (op->type == TILEGX_OP_TYPE_ADDRESS) + opval = (raw_opval * TILEGX_BUNDLE_SIZE_IN_BYTES) + pc; + else + opval = raw_opval; + + /* Record the final value. */ + d->operands[i] = op; + d->operand_values[i] = opval; + } + } + + return num_instructions; +} + +struct tilegx_spr +{ + /* The number */ + int number; + + /* The name */ + const char *name; +}; + +static int +tilegx_spr_compare (const void *a_ptr, const void *b_ptr) +{ + const struct tilegx_spr *a = (const struct tilegx_spr *) a_ptr; + const struct tilegx_spr *b = (const struct tilegx_spr *) b_ptr; + return (a->number - b->number); +} + +const struct tilegx_spr tilegx_sprs[] = { + { 0, "MPL_MEM_ERROR_SET_0" }, + { 1, "MPL_MEM_ERROR_SET_1" }, + { 2, "MPL_MEM_ERROR_SET_2" }, + { 3, "MPL_MEM_ERROR_SET_3" }, + { 4, "MPL_MEM_ERROR" }, + { 5, "MEM_ERROR_CBOX_ADDR" }, + { 6, "MEM_ERROR_CBOX_STATUS" }, + { 7, "MEM_ERROR_ENABLE" }, + { 8, "MEM_ERROR_MBOX_ADDR" }, + { 9, "MEM_ERROR_MBOX_STATUS" }, + { 10, "SBOX_ERROR" }, + { 11, "XDN_DEMUX_ERROR" }, + { 256, "MPL_SINGLE_STEP_3_SET_0" }, + { 257, "MPL_SINGLE_STEP_3_SET_1" }, + { 258, "MPL_SINGLE_STEP_3_SET_2" }, + { 259, "MPL_SINGLE_STEP_3_SET_3" }, + { 260, "MPL_SINGLE_STEP_3" }, + { 261, "SINGLE_STEP_CONTROL_3" }, + { 512, "MPL_SINGLE_STEP_2_SET_0" }, + { 513, "MPL_SINGLE_STEP_2_SET_1" }, + { 514, "MPL_SINGLE_STEP_2_SET_2" }, + { 515, "MPL_SINGLE_STEP_2_SET_3" }, + { 516, "MPL_SINGLE_STEP_2" }, + { 517, "SINGLE_STEP_CONTROL_2" }, + { 768, "MPL_SINGLE_STEP_1_SET_0" }, + { 769, "MPL_SINGLE_STEP_1_SET_1" }, + { 770, "MPL_SINGLE_STEP_1_SET_2" }, + { 771, "MPL_SINGLE_STEP_1_SET_3" }, + { 772, "MPL_SINGLE_STEP_1" }, + { 773, "SINGLE_STEP_CONTROL_1" }, + { 1024, "MPL_SINGLE_STEP_0_SET_0" }, + { 1025, "MPL_SINGLE_STEP_0_SET_1" }, + { 1026, "MPL_SINGLE_STEP_0_SET_2" }, + { 1027, "MPL_SINGLE_STEP_0_SET_3" }, + { 1028, "MPL_SINGLE_STEP_0" }, + { 1029, "SINGLE_STEP_CONTROL_0" }, + { 1280, "MPL_IDN_COMPLETE_SET_0" }, + { 1281, "MPL_IDN_COMPLETE_SET_1" }, + { 1282, "MPL_IDN_COMPLETE_SET_2" }, + { 1283, "MPL_IDN_COMPLETE_SET_3" }, + { 1284, "MPL_IDN_COMPLETE" }, + { 1285, "IDN_COMPLETE_PENDING" }, + { 1536, "MPL_UDN_COMPLETE_SET_0" }, + { 1537, "MPL_UDN_COMPLETE_SET_1" }, + { 1538, "MPL_UDN_COMPLETE_SET_2" }, + { 1539, "MPL_UDN_COMPLETE_SET_3" }, + { 1540, "MPL_UDN_COMPLETE" }, + { 1541, "UDN_COMPLETE_PENDING" }, + { 1792, "MPL_ITLB_MISS_SET_0" }, + { 1793, "MPL_ITLB_MISS_SET_1" }, + { 1794, "MPL_ITLB_MISS_SET_2" }, + { 1795, "MPL_ITLB_MISS_SET_3" }, + { 1796, "MPL_ITLB_MISS" }, + { 1797, "ITLB_TSB_BASE_ADDR_0" }, + { 1798, "ITLB_TSB_BASE_ADDR_1" }, + { 1920, "ITLB_CURRENT_ATTR" }, + { 1921, "ITLB_CURRENT_PA" }, + { 1922, "ITLB_CURRENT_VA" }, + { 1923, "ITLB_INDEX" }, + { 1924, "ITLB_MATCH_0" }, + { 1925, "ITLB_PERF" }, + { 1926, "ITLB_PR" }, + { 1927, "ITLB_TSB_ADDR_0" }, + { 1928, "ITLB_TSB_ADDR_1" }, + { 1929, "ITLB_TSB_FILL_CURRENT_ATTR" }, + { 1930, "ITLB_TSB_FILL_MATCH" }, + { 1931, "NUMBER_ITLB" }, + { 1932, "REPLACEMENT_ITLB" }, + { 1933, "WIRED_ITLB" }, + { 2048, "MPL_ILL_SET_0" }, + { 2049, "MPL_ILL_SET_1" }, + { 2050, "MPL_ILL_SET_2" }, + { 2051, "MPL_ILL_SET_3" }, + { 2052, "MPL_ILL" }, + { 2304, "MPL_GPV_SET_0" }, + { 2305, "MPL_GPV_SET_1" }, + { 2306, "MPL_GPV_SET_2" }, + { 2307, "MPL_GPV_SET_3" }, + { 2308, "MPL_GPV" }, + { 2309, "GPV_REASON" }, + { 2560, "MPL_IDN_ACCESS_SET_0" }, + { 2561, "MPL_IDN_ACCESS_SET_1" }, + { 2562, "MPL_IDN_ACCESS_SET_2" }, + { 2563, "MPL_IDN_ACCESS_SET_3" }, + { 2564, "MPL_IDN_ACCESS" }, + { 2565, "IDN_DEMUX_COUNT_0" }, + { 2566, "IDN_DEMUX_COUNT_1" }, + { 2567, "IDN_FLUSH_EGRESS" }, + { 2568, "IDN_PENDING" }, + { 2569, "IDN_ROUTE_ORDER" }, + { 2570, "IDN_SP_FIFO_CNT" }, + { 2688, "IDN_DATA_AVAIL" }, + { 2816, "MPL_UDN_ACCESS_SET_0" }, + { 2817, "MPL_UDN_ACCESS_SET_1" }, + { 2818, "MPL_UDN_ACCESS_SET_2" }, + { 2819, "MPL_UDN_ACCESS_SET_3" }, + { 2820, "MPL_UDN_ACCESS" }, + { 2821, "UDN_DEMUX_COUNT_0" }, + { 2822, "UDN_DEMUX_COUNT_1" }, + { 2823, "UDN_DEMUX_COUNT_2" }, + { 2824, "UDN_DEMUX_COUNT_3" }, + { 2825, "UDN_FLUSH_EGRESS" }, + { 2826, "UDN_PENDING" }, + { 2827, "UDN_ROUTE_ORDER" }, + { 2828, "UDN_SP_FIFO_CNT" }, + { 2944, "UDN_DATA_AVAIL" }, + { 3072, "MPL_SWINT_3_SET_0" }, + { 3073, "MPL_SWINT_3_SET_1" }, + { 3074, "MPL_SWINT_3_SET_2" }, + { 3075, "MPL_SWINT_3_SET_3" }, + { 3076, "MPL_SWINT_3" }, + { 3328, "MPL_SWINT_2_SET_0" }, + { 3329, "MPL_SWINT_2_SET_1" }, + { 3330, "MPL_SWINT_2_SET_2" }, + { 3331, "MPL_SWINT_2_SET_3" }, + { 3332, "MPL_SWINT_2" }, + { 3584, "MPL_SWINT_1_SET_0" }, + { 3585, "MPL_SWINT_1_SET_1" }, + { 3586, "MPL_SWINT_1_SET_2" }, + { 3587, "MPL_SWINT_1_SET_3" }, + { 3588, "MPL_SWINT_1" }, + { 3840, "MPL_SWINT_0_SET_0" }, + { 3841, "MPL_SWINT_0_SET_1" }, + { 3842, "MPL_SWINT_0_SET_2" }, + { 3843, "MPL_SWINT_0_SET_3" }, + { 3844, "MPL_SWINT_0" }, + { 4096, "MPL_ILL_TRANS_SET_0" }, + { 4097, "MPL_ILL_TRANS_SET_1" }, + { 4098, "MPL_ILL_TRANS_SET_2" }, + { 4099, "MPL_ILL_TRANS_SET_3" }, + { 4100, "MPL_ILL_TRANS" }, + { 4101, "ILL_TRANS_REASON" }, + { 4102, "ILL_VA_PC" }, + { 4352, "MPL_UNALIGN_DATA_SET_0" }, + { 4353, "MPL_UNALIGN_DATA_SET_1" }, + { 4354, "MPL_UNALIGN_DATA_SET_2" }, + { 4355, "MPL_UNALIGN_DATA_SET_3" }, + { 4356, "MPL_UNALIGN_DATA" }, + { 4608, "MPL_DTLB_MISS_SET_0" }, + { 4609, "MPL_DTLB_MISS_SET_1" }, + { 4610, "MPL_DTLB_MISS_SET_2" }, + { 4611, "MPL_DTLB_MISS_SET_3" }, + { 4612, "MPL_DTLB_MISS" }, + { 4613, "DTLB_TSB_BASE_ADDR_0" }, + { 4614, "DTLB_TSB_BASE_ADDR_1" }, + { 4736, "AAR" }, + { 4737, "CACHE_PINNED_WAYS" }, + { 4738, "DTLB_BAD_ADDR" }, + { 4739, "DTLB_BAD_ADDR_REASON" }, + { 4740, "DTLB_CURRENT_ATTR" }, + { 4741, "DTLB_CURRENT_PA" }, + { 4742, "DTLB_CURRENT_VA" }, + { 4743, "DTLB_INDEX" }, + { 4744, "DTLB_MATCH_0" }, + { 4745, "DTLB_PERF" }, + { 4746, "DTLB_TSB_ADDR_0" }, + { 4747, "DTLB_TSB_ADDR_1" }, + { 4748, "DTLB_TSB_FILL_CURRENT_ATTR" }, + { 4749, "DTLB_TSB_FILL_MATCH" }, + { 4750, "NUMBER_DTLB" }, + { 4751, "REPLACEMENT_DTLB" }, + { 4752, "WIRED_DTLB" }, + { 4864, "MPL_DTLB_ACCESS_SET_0" }, + { 4865, "MPL_DTLB_ACCESS_SET_1" }, + { 4866, "MPL_DTLB_ACCESS_SET_2" }, + { 4867, "MPL_DTLB_ACCESS_SET_3" }, + { 4868, "MPL_DTLB_ACCESS" }, + { 5120, "MPL_IDN_FIREWALL_SET_0" }, + { 5121, "MPL_IDN_FIREWALL_SET_1" }, + { 5122, "MPL_IDN_FIREWALL_SET_2" }, + { 5123, "MPL_IDN_FIREWALL_SET_3" }, + { 5124, "MPL_IDN_FIREWALL" }, + { 5125, "IDN_DIRECTION_PROTECT" }, + { 5376, "MPL_UDN_FIREWALL_SET_0" }, + { 5377, "MPL_UDN_FIREWALL_SET_1" }, + { 5378, "MPL_UDN_FIREWALL_SET_2" }, + { 5379, "MPL_UDN_FIREWALL_SET_3" }, + { 5380, "MPL_UDN_FIREWALL" }, + { 5381, "UDN_DIRECTION_PROTECT" }, + { 5632, "MPL_TILE_TIMER_SET_0" }, + { 5633, "MPL_TILE_TIMER_SET_1" }, + { 5634, "MPL_TILE_TIMER_SET_2" }, + { 5635, "MPL_TILE_TIMER_SET_3" }, + { 5636, "MPL_TILE_TIMER" }, + { 5637, "TILE_TIMER_CONTROL" }, + { 5888, "MPL_AUX_TILE_TIMER_SET_0" }, + { 5889, "MPL_AUX_TILE_TIMER_SET_1" }, + { 5890, "MPL_AUX_TILE_TIMER_SET_2" }, + { 5891, "MPL_AUX_TILE_TIMER_SET_3" }, + { 5892, "MPL_AUX_TILE_TIMER" }, + { 5893, "AUX_TILE_TIMER_CONTROL" }, + { 6144, "MPL_IDN_TIMER_SET_0" }, + { 6145, "MPL_IDN_TIMER_SET_1" }, + { 6146, "MPL_IDN_TIMER_SET_2" }, + { 6147, "MPL_IDN_TIMER_SET_3" }, + { 6148, "MPL_IDN_TIMER" }, + { 6149, "IDN_DEADLOCK_COUNT" }, + { 6150, "IDN_DEADLOCK_TIMEOUT" }, + { 6400, "MPL_UDN_TIMER_SET_0" }, + { 6401, "MPL_UDN_TIMER_SET_1" }, + { 6402, "MPL_UDN_TIMER_SET_2" }, + { 6403, "MPL_UDN_TIMER_SET_3" }, + { 6404, "MPL_UDN_TIMER" }, + { 6405, "UDN_DEADLOCK_COUNT" }, + { 6406, "UDN_DEADLOCK_TIMEOUT" }, + { 6656, "MPL_IDN_AVAIL_SET_0" }, + { 6657, "MPL_IDN_AVAIL_SET_1" }, + { 6658, "MPL_IDN_AVAIL_SET_2" }, + { 6659, "MPL_IDN_AVAIL_SET_3" }, + { 6660, "MPL_IDN_AVAIL" }, + { 6661, "IDN_AVAIL_EN" }, + { 6912, "MPL_UDN_AVAIL_SET_0" }, + { 6913, "MPL_UDN_AVAIL_SET_1" }, + { 6914, "MPL_UDN_AVAIL_SET_2" }, + { 6915, "MPL_UDN_AVAIL_SET_3" }, + { 6916, "MPL_UDN_AVAIL" }, + { 6917, "UDN_AVAIL_EN" }, + { 7168, "MPL_IPI_3_SET_0" }, + { 7169, "MPL_IPI_3_SET_1" }, + { 7170, "MPL_IPI_3_SET_2" }, + { 7171, "MPL_IPI_3_SET_3" }, + { 7172, "MPL_IPI_3" }, + { 7173, "IPI_EVENT_3" }, + { 7174, "IPI_EVENT_RESET_3" }, + { 7175, "IPI_EVENT_SET_3" }, + { 7176, "IPI_MASK_3" }, + { 7177, "IPI_MASK_RESET_3" }, + { 7178, "IPI_MASK_SET_3" }, + { 7424, "MPL_IPI_2_SET_0" }, + { 7425, "MPL_IPI_2_SET_1" }, + { 7426, "MPL_IPI_2_SET_2" }, + { 7427, "MPL_IPI_2_SET_3" }, + { 7428, "MPL_IPI_2" }, + { 7429, "IPI_EVENT_2" }, + { 7430, "IPI_EVENT_RESET_2" }, + { 7431, "IPI_EVENT_SET_2" }, + { 7432, "IPI_MASK_2" }, + { 7433, "IPI_MASK_RESET_2" }, + { 7434, "IPI_MASK_SET_2" }, + { 7680, "MPL_IPI_1_SET_0" }, + { 7681, "MPL_IPI_1_SET_1" }, + { 7682, "MPL_IPI_1_SET_2" }, + { 7683, "MPL_IPI_1_SET_3" }, + { 7684, "MPL_IPI_1" }, + { 7685, "IPI_EVENT_1" }, + { 7686, "IPI_EVENT_RESET_1" }, + { 7687, "IPI_EVENT_SET_1" }, + { 7688, "IPI_MASK_1" }, + { 7689, "IPI_MASK_RESET_1" }, + { 7690, "IPI_MASK_SET_1" }, + { 7936, "MPL_IPI_0_SET_0" }, + { 7937, "MPL_IPI_0_SET_1" }, + { 7938, "MPL_IPI_0_SET_2" }, + { 7939, "MPL_IPI_0_SET_3" }, + { 7940, "MPL_IPI_0" }, + { 7941, "IPI_EVENT_0" }, + { 7942, "IPI_EVENT_RESET_0" }, + { 7943, "IPI_EVENT_SET_0" }, + { 7944, "IPI_MASK_0" }, + { 7945, "IPI_MASK_RESET_0" }, + { 7946, "IPI_MASK_SET_0" }, + { 8192, "MPL_PERF_COUNT_SET_0" }, + { 8193, "MPL_PERF_COUNT_SET_1" }, + { 8194, "MPL_PERF_COUNT_SET_2" }, + { 8195, "MPL_PERF_COUNT_SET_3" }, + { 8196, "MPL_PERF_COUNT" }, + { 8197, "PERF_COUNT_0" }, + { 8198, "PERF_COUNT_1" }, + { 8199, "PERF_COUNT_CTL" }, + { 8200, "PERF_COUNT_DN_CTL" }, + { 8201, "PERF_COUNT_STS" }, + { 8202, "WATCH_MASK" }, + { 8203, "WATCH_VAL" }, + { 8448, "MPL_AUX_PERF_COUNT_SET_0" }, + { 8449, "MPL_AUX_PERF_COUNT_SET_1" }, + { 8450, "MPL_AUX_PERF_COUNT_SET_2" }, + { 8451, "MPL_AUX_PERF_COUNT_SET_3" }, + { 8452, "MPL_AUX_PERF_COUNT" }, + { 8453, "AUX_PERF_COUNT_0" }, + { 8454, "AUX_PERF_COUNT_1" }, + { 8455, "AUX_PERF_COUNT_CTL" }, + { 8456, "AUX_PERF_COUNT_STS" }, + { 8704, "MPL_INTCTRL_3_SET_0" }, + { 8705, "MPL_INTCTRL_3_SET_1" }, + { 8706, "MPL_INTCTRL_3_SET_2" }, + { 8707, "MPL_INTCTRL_3_SET_3" }, + { 8708, "MPL_INTCTRL_3" }, + { 8709, "INTCTRL_3_STATUS" }, + { 8710, "INTERRUPT_MASK_3" }, + { 8711, "INTERRUPT_MASK_RESET_3" }, + { 8712, "INTERRUPT_MASK_SET_3" }, + { 8713, "INTERRUPT_VECTOR_BASE_3" }, + { 8714, "SINGLE_STEP_EN_0_3" }, + { 8715, "SINGLE_STEP_EN_1_3" }, + { 8716, "SINGLE_STEP_EN_2_3" }, + { 8717, "SINGLE_STEP_EN_3_3" }, + { 8832, "EX_CONTEXT_3_0" }, + { 8833, "EX_CONTEXT_3_1" }, + { 8834, "SYSTEM_SAVE_3_0" }, + { 8835, "SYSTEM_SAVE_3_1" }, + { 8836, "SYSTEM_SAVE_3_2" }, + { 8837, "SYSTEM_SAVE_3_3" }, + { 8960, "MPL_INTCTRL_2_SET_0" }, + { 8961, "MPL_INTCTRL_2_SET_1" }, + { 8962, "MPL_INTCTRL_2_SET_2" }, + { 8963, "MPL_INTCTRL_2_SET_3" }, + { 8964, "MPL_INTCTRL_2" }, + { 8965, "INTCTRL_2_STATUS" }, + { 8966, "INTERRUPT_MASK_2" }, + { 8967, "INTERRUPT_MASK_RESET_2" }, + { 8968, "INTERRUPT_MASK_SET_2" }, + { 8969, "INTERRUPT_VECTOR_BASE_2" }, + { 8970, "SINGLE_STEP_EN_0_2" }, + { 8971, "SINGLE_STEP_EN_1_2" }, + { 8972, "SINGLE_STEP_EN_2_2" }, + { 8973, "SINGLE_STEP_EN_3_2" }, + { 9088, "EX_CONTEXT_2_0" }, + { 9089, "EX_CONTEXT_2_1" }, + { 9090, "SYSTEM_SAVE_2_0" }, + { 9091, "SYSTEM_SAVE_2_1" }, + { 9092, "SYSTEM_SAVE_2_2" }, + { 9093, "SYSTEM_SAVE_2_3" }, + { 9216, "MPL_INTCTRL_1_SET_0" }, + { 9217, "MPL_INTCTRL_1_SET_1" }, + { 9218, "MPL_INTCTRL_1_SET_2" }, + { 9219, "MPL_INTCTRL_1_SET_3" }, + { 9220, "MPL_INTCTRL_1" }, + { 9221, "INTCTRL_1_STATUS" }, + { 9222, "INTERRUPT_MASK_1" }, + { 9223, "INTERRUPT_MASK_RESET_1" }, + { 9224, "INTERRUPT_MASK_SET_1" }, + { 9225, "INTERRUPT_VECTOR_BASE_1" }, + { 9226, "SINGLE_STEP_EN_0_1" }, + { 9227, "SINGLE_STEP_EN_1_1" }, + { 9228, "SINGLE_STEP_EN_2_1" }, + { 9229, "SINGLE_STEP_EN_3_1" }, + { 9344, "EX_CONTEXT_1_0" }, + { 9345, "EX_CONTEXT_1_1" }, + { 9346, "SYSTEM_SAVE_1_0" }, + { 9347, "SYSTEM_SAVE_1_1" }, + { 9348, "SYSTEM_SAVE_1_2" }, + { 9349, "SYSTEM_SAVE_1_3" }, + { 9472, "MPL_INTCTRL_0_SET_0" }, + { 9473, "MPL_INTCTRL_0_SET_1" }, + { 9474, "MPL_INTCTRL_0_SET_2" }, + { 9475, "MPL_INTCTRL_0_SET_3" }, + { 9476, "MPL_INTCTRL_0" }, + { 9477, "INTCTRL_0_STATUS" }, + { 9478, "INTERRUPT_MASK_0" }, + { 9479, "INTERRUPT_MASK_RESET_0" }, + { 9480, "INTERRUPT_MASK_SET_0" }, + { 9481, "INTERRUPT_VECTOR_BASE_0" }, + { 9482, "SINGLE_STEP_EN_0_0" }, + { 9483, "SINGLE_STEP_EN_1_0" }, + { 9484, "SINGLE_STEP_EN_2_0" }, + { 9485, "SINGLE_STEP_EN_3_0" }, + { 9600, "EX_CONTEXT_0_0" }, + { 9601, "EX_CONTEXT_0_1" }, + { 9602, "SYSTEM_SAVE_0_0" }, + { 9603, "SYSTEM_SAVE_0_1" }, + { 9604, "SYSTEM_SAVE_0_2" }, + { 9605, "SYSTEM_SAVE_0_3" }, + { 9728, "MPL_BOOT_ACCESS_SET_0" }, + { 9729, "MPL_BOOT_ACCESS_SET_1" }, + { 9730, "MPL_BOOT_ACCESS_SET_2" }, + { 9731, "MPL_BOOT_ACCESS_SET_3" }, + { 9732, "MPL_BOOT_ACCESS" }, + { 9733, "BIG_ENDIAN_CONFIG" }, + { 9734, "CACHE_INVALIDATION_COMPRESSION_MODE" }, + { 9735, "CACHE_INVALIDATION_MASK_0" }, + { 9736, "CACHE_INVALIDATION_MASK_1" }, + { 9737, "CACHE_INVALIDATION_MASK_2" }, + { 9738, "CBOX_CACHEASRAM_CONFIG" }, + { 9739, "CBOX_CACHE_CONFIG" }, + { 9740, "CBOX_HOME_MAP_ADDR" }, + { 9741, "CBOX_HOME_MAP_DATA" }, + { 9742, "CBOX_MMAP_0" }, + { 9743, "CBOX_MMAP_1" }, + { 9744, "CBOX_MMAP_2" }, + { 9745, "CBOX_MMAP_3" }, + { 9746, "CBOX_MSR" }, + { 9747, "DIAG_BCST_CTL" }, + { 9748, "DIAG_BCST_MASK" }, + { 9749, "DIAG_BCST_TRIGGER" }, + { 9750, "DIAG_MUX_CTL" }, + { 9751, "DIAG_TRACE_CTL" }, + { 9752, "DIAG_TRACE_DATA" }, + { 9753, "DIAG_TRACE_STS" }, + { 9754, "IDN_DEMUX_BUF_THRESH" }, + { 9755, "L1_I_PIN_WAY_0" }, + { 9756, "MEM_ROUTE_ORDER" }, + { 9757, "MEM_STRIPE_CONFIG" }, + { 9758, "PERF_COUNT_PLS" }, + { 9759, "PSEUDO_RANDOM_NUMBER_MODIFY" }, + { 9760, "QUIESCE_CTL" }, + { 9761, "RSHIM_COORD" }, + { 9762, "SBOX_CONFIG" }, + { 9763, "UDN_DEMUX_BUF_THRESH" }, + { 9764, "XDN_CORE_STARVATION_COUNT" }, + { 9765, "XDN_ROUND_ROBIN_ARB_CTL" }, + { 9856, "CYCLE_MODIFY" }, + { 9857, "I_AAR" }, + { 9984, "MPL_WORLD_ACCESS_SET_0" }, + { 9985, "MPL_WORLD_ACCESS_SET_1" }, + { 9986, "MPL_WORLD_ACCESS_SET_2" }, + { 9987, "MPL_WORLD_ACCESS_SET_3" }, + { 9988, "MPL_WORLD_ACCESS" }, + { 9989, "DONE" }, + { 9990, "DSTREAM_PF" }, + { 9991, "FAIL" }, + { 9992, "INTERRUPT_CRITICAL_SECTION" }, + { 9993, "PASS" }, + { 9994, "PSEUDO_RANDOM_NUMBER" }, + { 9995, "TILE_COORD" }, + { 9996, "TILE_RTF_HWM" }, + { 10112, "CMPEXCH_VALUE" }, + { 10113, "CYCLE" }, + { 10114, "EVENT_BEGIN" }, + { 10115, "EVENT_END" }, + { 10116, "PROC_STATUS" }, + { 10117, "SIM_CONTROL" }, + { 10118, "SIM_SOCKET" }, + { 10119, "STATUS_SATURATE" }, + { 10240, "MPL_I_ASID_SET_0" }, + { 10241, "MPL_I_ASID_SET_1" }, + { 10242, "MPL_I_ASID_SET_2" }, + { 10243, "MPL_I_ASID_SET_3" }, + { 10244, "MPL_I_ASID" }, + { 10245, "I_ASID" }, + { 10496, "MPL_D_ASID_SET_0" }, + { 10497, "MPL_D_ASID_SET_1" }, + { 10498, "MPL_D_ASID_SET_2" }, + { 10499, "MPL_D_ASID_SET_3" }, + { 10500, "MPL_D_ASID" }, + { 10501, "D_ASID" }, + { 10752, "MPL_DOUBLE_FAULT_SET_0" }, + { 10753, "MPL_DOUBLE_FAULT_SET_1" }, + { 10754, "MPL_DOUBLE_FAULT_SET_2" }, + { 10755, "MPL_DOUBLE_FAULT_SET_3" }, + { 10756, "MPL_DOUBLE_FAULT" }, + { 10757, "LAST_INTERRUPT_REASON" }, +}; + +const int tilegx_num_sprs = 441; + +const char * +get_tilegx_spr_name (int num) +{ + void *result; + struct tilegx_spr key; + + key.number = num; + result = bsearch((const void *) &key, (const void *) tilegx_sprs, + tilegx_num_sprs, sizeof (struct tilegx_spr), + tilegx_spr_compare); + + if (result == NULL) + { + return (NULL); + } + else + { + struct tilegx_spr *result_ptr = (struct tilegx_spr *) result; + return (result_ptr->name); + } +} + +int +print_insn_tilegx (unsigned char * memaddr) +{ + struct tilegx_decoded_instruction + decoded[TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE]; + unsigned char opbuf[TILEGX_BUNDLE_SIZE_IN_BYTES]; + int i, num_instructions, num_printed; + tilegx_mnemonic padding_mnemonic; + + memcpy((void *)opbuf, (void *)memaddr, TILEGX_BUNDLE_SIZE_IN_BYTES); + + /* Parse the instructions in the bundle. */ + num_instructions = + parse_insn_tilegx (*(unsigned long long *)opbuf, (unsigned long long)memaddr, decoded); + + /* Print the instructions in the bundle. */ + printf("{ "); + num_printed = 0; + + /* Determine which nop opcode is used for padding and should be skipped. */ + padding_mnemonic = TILEGX_OPC_FNOP; + for (i = 0; i < num_instructions; i++) + { + if (!decoded[i].opcode->can_bundle) + { + /* Instructions that cannot be bundled are padded out with nops, + rather than fnops. Displaying them is always clutter. */ + padding_mnemonic = TILEGX_OPC_NOP; + break; + } + } + + for (i = 0; i < num_instructions; i++) + { + const struct tilegx_opcode *opcode = decoded[i].opcode; + const char *name; + int j; + + /* Do not print out fnops, unless everything is an fnop, in + which case we will print out just the last one. */ + if (opcode->mnemonic == padding_mnemonic + && (num_printed > 0 || i + 1 < num_instructions)) + continue; + + if (num_printed > 0) + printf(" ; "); + ++num_printed; + + name = opcode->name; + if (name == NULL) + name = ""; + printf("%s", name); + + for (j = 0; j < opcode->num_operands; j++) + { + unsigned long long num; + const struct tilegx_operand *op; + const char *spr_name; + + if (j > 0) + printf (","); + printf (" "); + + num = decoded[i].operand_values[j]; + + op = decoded[i].operands[j]; + switch (op->type) + { + case TILEGX_OP_TYPE_REGISTER: + printf ("%s", tilegx_register_names[(int)num]); + break; + case TILEGX_OP_TYPE_SPR: + spr_name = get_tilegx_spr_name(num); + if (spr_name != NULL) + printf ("%s", spr_name); + else + printf ("%d", (int)num); + break; + case TILEGX_OP_TYPE_IMMEDIATE: + printf ("%d", (int)num); + break; + case TILEGX_OP_TYPE_ADDRESS: + printf ("0x%016llx", num); + break; + default: + abort (); + } + } + } + printf (" }\n"); + + return TILEGX_BUNDLE_SIZE_IN_BYTES; +} diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeTILEGX_64.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeTILEGX_64.c new file mode 100755 index 000000000..003f43a79 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeTILEGX_64.c @@ -0,0 +1,2555 @@ +/* + * Stack-less Just-In-Time compiler + * + * Copyright 2013-2013 Tilera Corporation(jiwang@tilera.com). All rights reserved. + * Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* TileGX architecture. */ +/* Contributed by Tilera Corporation. */ +#include "sljitNativeTILEGX-encoder.c" + +#define SIMM_8BIT_MAX (0x7f) +#define SIMM_8BIT_MIN (-0x80) +#define SIMM_16BIT_MAX (0x7fff) +#define SIMM_16BIT_MIN (-0x8000) +#define SIMM_17BIT_MAX (0xffff) +#define SIMM_17BIT_MIN (-0x10000) +#define SIMM_32BIT_MAX (0x7fffffff) +#define SIMM_32BIT_MIN (-0x7fffffff - 1) +#define SIMM_48BIT_MAX (0x7fffffff0000L) +#define SIMM_48BIT_MIN (-0x800000000000L) +#define IMM16(imm) ((imm) & 0xffff) + +#define UIMM_16BIT_MAX (0xffff) + +#define TMP_REG1 (SLJIT_NUMBER_OF_REGISTERS + 2) +#define TMP_REG2 (SLJIT_NUMBER_OF_REGISTERS + 3) +#define TMP_REG3 (SLJIT_NUMBER_OF_REGISTERS + 4) +#define ADDR_TMP (SLJIT_NUMBER_OF_REGISTERS + 5) +#define PIC_ADDR_REG TMP_REG2 + +static const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 6] = { + 63, 0, 1, 2, 3, 4, 30, 31, 32, 33, 34, 54, 5, 16, 6, 7 +}; + +#define SLJIT_LOCALS_REG_mapped 54 +#define TMP_REG1_mapped 5 +#define TMP_REG2_mapped 16 +#define TMP_REG3_mapped 6 +#define ADDR_TMP_mapped 7 + +/* Flags are keept in volatile registers. */ +#define EQUAL_FLAG 8 +/* And carry flag as well. */ +#define ULESS_FLAG 9 +#define UGREATER_FLAG 10 +#define LESS_FLAG 11 +#define GREATER_FLAG 12 +#define OVERFLOW_FLAG 13 + +#define ZERO 63 +#define RA 55 +#define TMP_EREG1 14 +#define TMP_EREG2 15 + +#define LOAD_DATA 0x01 +#define WORD_DATA 0x00 +#define BYTE_DATA 0x02 +#define HALF_DATA 0x04 +#define INT_DATA 0x06 +#define SIGNED_DATA 0x08 +#define DOUBLE_DATA 0x10 + +/* Separates integer and floating point registers */ +#define GPR_REG 0xf + +#define MEM_MASK 0x1f + +#define WRITE_BACK 0x00020 +#define ARG_TEST 0x00040 +#define ALT_KEEP_CACHE 0x00080 +#define CUMULATIVE_OP 0x00100 +#define LOGICAL_OP 0x00200 +#define IMM_OP 0x00400 +#define SRC2_IMM 0x00800 + +#define UNUSED_DEST 0x01000 +#define REG_DEST 0x02000 +#define REG1_SOURCE 0x04000 +#define REG2_SOURCE 0x08000 +#define SLOW_SRC1 0x10000 +#define SLOW_SRC2 0x20000 +#define SLOW_DEST 0x40000 + +/* Only these flags are set. UNUSED_DEST is not set when no flags should be set. + */ +#define CHECK_FLAGS(list) (!(flags & UNUSED_DEST) || (op & GET_FLAGS(~(list)))) + +SLJIT_API_FUNC_ATTRIBUTE const char *sljit_get_platform_name(void) +{ + return "TileGX" SLJIT_CPUINFO; +} + +/* Length of an instruction word */ +typedef sljit_uw sljit_ins; + +struct jit_instr { + const struct tilegx_opcode* opcode; + tilegx_pipeline pipe; + unsigned long input_registers; + unsigned long output_registers; + int operand_value[4]; + int line; +}; + +/* Opcode Helper Macros */ +#define TILEGX_X_MODE 0 + +#define X_MODE create_Mode(TILEGX_X_MODE) + +#define FNOP_X0 \ + create_Opcode_X0(RRR_0_OPCODE_X0) | \ + create_RRROpcodeExtension_X0(UNARY_RRR_0_OPCODE_X0) | \ + create_UnaryOpcodeExtension_X0(FNOP_UNARY_OPCODE_X0) + +#define FNOP_X1 \ + create_Opcode_X1(RRR_0_OPCODE_X1) | \ + create_RRROpcodeExtension_X1(UNARY_RRR_0_OPCODE_X1) | \ + create_UnaryOpcodeExtension_X1(FNOP_UNARY_OPCODE_X1) + +#define NOP \ + create_Mode(TILEGX_X_MODE) | FNOP_X0 | FNOP_X1 + +#define ANOP_X0 \ + create_Opcode_X0(RRR_0_OPCODE_X0) | \ + create_RRROpcodeExtension_X0(UNARY_RRR_0_OPCODE_X0) | \ + create_UnaryOpcodeExtension_X0(NOP_UNARY_OPCODE_X0) + +#define BPT create_Mode(TILEGX_X_MODE) | create_Opcode_X1(RRR_0_OPCODE_X1) | \ + create_RRROpcodeExtension_X1(UNARY_RRR_0_OPCODE_X1) | \ + create_UnaryOpcodeExtension_X1(ILL_UNARY_OPCODE_X1) | \ + create_Dest_X1(0x1C) | create_SrcA_X1(0x25) | ANOP_X0 + +#define ADD_X1 \ + create_Mode(TILEGX_X_MODE) | create_Opcode_X1(RRR_0_OPCODE_X1) | \ + create_RRROpcodeExtension_X1(ADD_RRR_0_OPCODE_X1) | FNOP_X0 + +#define ADDI_X1 \ + create_Mode(TILEGX_X_MODE) | create_Opcode_X1(IMM8_OPCODE_X1) | \ + create_Imm8OpcodeExtension_X1(ADDI_IMM8_OPCODE_X1) | FNOP_X0 + +#define SUB_X1 \ + create_Mode(TILEGX_X_MODE) | create_Opcode_X1(RRR_0_OPCODE_X1) | \ + create_RRROpcodeExtension_X1(SUB_RRR_0_OPCODE_X1) | FNOP_X0 + +#define NOR_X1 \ + create_Mode(TILEGX_X_MODE) | create_Opcode_X1(RRR_0_OPCODE_X1) | \ + create_RRROpcodeExtension_X1(NOR_RRR_0_OPCODE_X1) | FNOP_X0 + +#define OR_X1 \ + create_Mode(TILEGX_X_MODE) | create_Opcode_X1(RRR_0_OPCODE_X1) | \ + create_RRROpcodeExtension_X1(OR_RRR_0_OPCODE_X1) | FNOP_X0 + +#define AND_X1 \ + create_Mode(TILEGX_X_MODE) | create_Opcode_X1(RRR_0_OPCODE_X1) | \ + create_RRROpcodeExtension_X1(AND_RRR_0_OPCODE_X1) | FNOP_X0 + +#define XOR_X1 \ + create_Mode(TILEGX_X_MODE) | create_Opcode_X1(RRR_0_OPCODE_X1) | \ + create_RRROpcodeExtension_X1(XOR_RRR_0_OPCODE_X1) | FNOP_X0 + +#define CMOVNEZ_X0 \ + create_Mode(TILEGX_X_MODE) | create_Opcode_X0(RRR_0_OPCODE_X0) | \ + create_RRROpcodeExtension_X0(CMOVNEZ_RRR_0_OPCODE_X0) | FNOP_X1 + +#define CMOVEQZ_X0 \ + create_Mode(TILEGX_X_MODE) | create_Opcode_X0(RRR_0_OPCODE_X0) | \ + create_RRROpcodeExtension_X0(CMOVEQZ_RRR_0_OPCODE_X0) | FNOP_X1 + +#define ADDLI_X1 \ + create_Mode(TILEGX_X_MODE) | create_Opcode_X1(ADDLI_OPCODE_X1) | FNOP_X0 + +#define V4INT_L_X1 \ + create_Mode(TILEGX_X_MODE) | create_Opcode_X1(RRR_0_OPCODE_X1) | \ + create_RRROpcodeExtension_X1(V4INT_L_RRR_0_OPCODE_X1) | FNOP_X0 + +#define BFEXTU_X0 \ + create_Mode(TILEGX_X_MODE) | create_Opcode_X0(BF_OPCODE_X0) | \ + create_BFOpcodeExtension_X0(BFEXTU_BF_OPCODE_X0) | FNOP_X1 + +#define BFEXTS_X0 \ + create_Mode(TILEGX_X_MODE) | create_Opcode_X0(BF_OPCODE_X0) | \ + create_BFOpcodeExtension_X0(BFEXTS_BF_OPCODE_X0) | FNOP_X1 + +#define SHL16INSLI_X1 \ + create_Mode(TILEGX_X_MODE) | create_Opcode_X1(SHL16INSLI_OPCODE_X1) | FNOP_X0 + +#define ST_X1 \ + create_Mode(TILEGX_X_MODE) | create_Opcode_X1(RRR_0_OPCODE_X1) | \ + create_RRROpcodeExtension_X1(ST_RRR_0_OPCODE_X1) | create_Dest_X1(0x0) | FNOP_X0 + +#define LD_X1 \ + create_Mode(TILEGX_X_MODE) | create_Opcode_X1(RRR_0_OPCODE_X1) | \ + create_RRROpcodeExtension_X1(UNARY_RRR_0_OPCODE_X1) | \ + create_UnaryOpcodeExtension_X1(LD_UNARY_OPCODE_X1) | FNOP_X0 + +#define JR_X1 \ + create_Mode(TILEGX_X_MODE) | create_Opcode_X1(RRR_0_OPCODE_X1) | \ + create_RRROpcodeExtension_X1(UNARY_RRR_0_OPCODE_X1) | \ + create_UnaryOpcodeExtension_X1(JR_UNARY_OPCODE_X1) | FNOP_X0 + +#define JALR_X1 \ + create_Mode(TILEGX_X_MODE) | create_Opcode_X1(RRR_0_OPCODE_X1) | \ + create_RRROpcodeExtension_X1(UNARY_RRR_0_OPCODE_X1) | \ + create_UnaryOpcodeExtension_X1(JALR_UNARY_OPCODE_X1) | FNOP_X0 + +#define CLZ_X0 \ + create_Mode(TILEGX_X_MODE) | create_Opcode_X0(RRR_0_OPCODE_X0) | \ + create_RRROpcodeExtension_X0(UNARY_RRR_0_OPCODE_X0) | \ + create_UnaryOpcodeExtension_X0(CNTLZ_UNARY_OPCODE_X0) | FNOP_X1 + +#define CMPLTUI_X1 \ + create_Mode(TILEGX_X_MODE) | create_Opcode_X1(IMM8_OPCODE_X1) | \ + create_Imm8OpcodeExtension_X1(CMPLTUI_IMM8_OPCODE_X1) | FNOP_X0 + +#define CMPLTU_X1 \ + create_Mode(TILEGX_X_MODE) | create_Opcode_X1(RRR_0_OPCODE_X1) | \ + create_RRROpcodeExtension_X1(CMPLTU_RRR_0_OPCODE_X1) | FNOP_X0 + +#define CMPLTS_X1 \ + create_Mode(TILEGX_X_MODE) | create_Opcode_X1(RRR_0_OPCODE_X1) | \ + create_RRROpcodeExtension_X1(CMPLTS_RRR_0_OPCODE_X1) | FNOP_X0 + +#define XORI_X1 \ + create_Mode(TILEGX_X_MODE) | create_Opcode_X1(IMM8_OPCODE_X1) | \ + create_Imm8OpcodeExtension_X1(XORI_IMM8_OPCODE_X1) | FNOP_X0 + +#define ORI_X1 \ + create_Mode(TILEGX_X_MODE) | create_Opcode_X1(IMM8_OPCODE_X1) | \ + create_Imm8OpcodeExtension_X1(ORI_IMM8_OPCODE_X1) | FNOP_X0 + +#define ANDI_X1 \ + create_Mode(TILEGX_X_MODE) | create_Opcode_X1(IMM8_OPCODE_X1) | \ + create_Imm8OpcodeExtension_X1(ANDI_IMM8_OPCODE_X1) | FNOP_X0 + +#define SHLI_X1 \ + create_Mode(TILEGX_X_MODE) | create_Opcode_X1(SHIFT_OPCODE_X1) | \ + create_ShiftOpcodeExtension_X1(SHLI_SHIFT_OPCODE_X1) | FNOP_X0 + +#define SHL_X1 \ + create_Mode(TILEGX_X_MODE) | create_Opcode_X1(RRR_0_OPCODE_X1) | \ + create_RRROpcodeExtension_X1(SHL_RRR_0_OPCODE_X1) | FNOP_X0 + +#define SHRSI_X1 \ + create_Mode(TILEGX_X_MODE) | create_Opcode_X1(SHIFT_OPCODE_X1) | \ + create_ShiftOpcodeExtension_X1(SHRSI_SHIFT_OPCODE_X1) | FNOP_X0 + +#define SHRS_X1 \ + create_Mode(TILEGX_X_MODE) | create_Opcode_X1(RRR_0_OPCODE_X1) | \ + create_RRROpcodeExtension_X1(SHRS_RRR_0_OPCODE_X1) | FNOP_X0 + +#define SHRUI_X1 \ + create_Mode(TILEGX_X_MODE) | create_Opcode_X1(SHIFT_OPCODE_X1) | \ + create_ShiftOpcodeExtension_X1(SHRUI_SHIFT_OPCODE_X1) | FNOP_X0 + +#define SHRU_X1 \ + create_Mode(TILEGX_X_MODE) | create_Opcode_X1(RRR_0_OPCODE_X1) | \ + create_RRROpcodeExtension_X1(SHRU_RRR_0_OPCODE_X1) | FNOP_X0 + +#define BEQZ_X1 \ + create_Mode(TILEGX_X_MODE) | create_Opcode_X1(BRANCH_OPCODE_X1) | \ + create_BrType_X1(BEQZ_BRANCH_OPCODE_X1) | FNOP_X0 + +#define BNEZ_X1 \ + create_Mode(TILEGX_X_MODE) | create_Opcode_X1(BRANCH_OPCODE_X1) | \ + create_BrType_X1(BNEZ_BRANCH_OPCODE_X1) | FNOP_X0 + +#define J_X1 \ + create_Mode(TILEGX_X_MODE) | create_Opcode_X1(JUMP_OPCODE_X1) | \ + create_JumpOpcodeExtension_X1(J_JUMP_OPCODE_X1) | FNOP_X0 + +#define JAL_X1 \ + create_Mode(TILEGX_X_MODE) | create_Opcode_X1(JUMP_OPCODE_X1) | \ + create_JumpOpcodeExtension_X1(JAL_JUMP_OPCODE_X1) | FNOP_X0 + +#define DEST_X0(x) create_Dest_X0(x) +#define SRCA_X0(x) create_SrcA_X0(x) +#define SRCB_X0(x) create_SrcB_X0(x) +#define DEST_X1(x) create_Dest_X1(x) +#define SRCA_X1(x) create_SrcA_X1(x) +#define SRCB_X1(x) create_SrcB_X1(x) +#define IMM16_X1(x) create_Imm16_X1(x) +#define IMM8_X1(x) create_Imm8_X1(x) +#define BFSTART_X0(x) create_BFStart_X0(x) +#define BFEND_X0(x) create_BFEnd_X0(x) +#define SHIFTIMM_X1(x) create_ShAmt_X1(x) +#define JOFF_X1(x) create_JumpOff_X1(x) +#define BOFF_X1(x) create_BrOff_X1(x) + +static const tilegx_mnemonic data_transfer_insts[16] = { + /* u w s */ TILEGX_OPC_ST /* st */, + /* u w l */ TILEGX_OPC_LD /* ld */, + /* u b s */ TILEGX_OPC_ST1 /* st1 */, + /* u b l */ TILEGX_OPC_LD1U /* ld1u */, + /* u h s */ TILEGX_OPC_ST2 /* st2 */, + /* u h l */ TILEGX_OPC_LD2U /* ld2u */, + /* u i s */ TILEGX_OPC_ST4 /* st4 */, + /* u i l */ TILEGX_OPC_LD4U /* ld4u */, + /* s w s */ TILEGX_OPC_ST /* st */, + /* s w l */ TILEGX_OPC_LD /* ld */, + /* s b s */ TILEGX_OPC_ST1 /* st1 */, + /* s b l */ TILEGX_OPC_LD1S /* ld1s */, + /* s h s */ TILEGX_OPC_ST2 /* st2 */, + /* s h l */ TILEGX_OPC_LD2S /* ld2s */, + /* s i s */ TILEGX_OPC_ST4 /* st4 */, + /* s i l */ TILEGX_OPC_LD4S /* ld4s */, +}; + +#ifdef TILEGX_JIT_DEBUG +static sljit_s32 push_inst_debug(struct sljit_compiler *compiler, sljit_ins ins, int line) +{ + sljit_ins *ptr = (sljit_ins *)ensure_buf(compiler, sizeof(sljit_ins)); + FAIL_IF(!ptr); + *ptr = ins; + compiler->size++; + printf("|%04d|S0|:\t\t", line); + print_insn_tilegx(ptr); + return SLJIT_SUCCESS; +} + +static sljit_s32 push_inst_nodebug(struct sljit_compiler *compiler, sljit_ins ins) +{ + sljit_ins *ptr = (sljit_ins *)ensure_buf(compiler, sizeof(sljit_ins)); + FAIL_IF(!ptr); + *ptr = ins; + compiler->size++; + return SLJIT_SUCCESS; +} + +#define push_inst(a, b) push_inst_debug(a, b, __LINE__) +#else +static sljit_s32 push_inst(struct sljit_compiler *compiler, sljit_ins ins) +{ + sljit_ins *ptr = (sljit_ins *)ensure_buf(compiler, sizeof(sljit_ins)); + FAIL_IF(!ptr); + *ptr = ins; + compiler->size++; + return SLJIT_SUCCESS; +} +#endif + +#define BUNDLE_FORMAT_MASK(p0, p1, p2) \ + ((p0) | ((p1) << 8) | ((p2) << 16)) + +#define BUNDLE_FORMAT(p0, p1, p2) \ + { \ + { \ + (tilegx_pipeline)(p0), \ + (tilegx_pipeline)(p1), \ + (tilegx_pipeline)(p2) \ + }, \ + BUNDLE_FORMAT_MASK(1 << (p0), 1 << (p1), (1 << (p2))) \ + } + +#define NO_PIPELINE TILEGX_NUM_PIPELINE_ENCODINGS + +#define tilegx_is_x_pipeline(p) ((int)(p) <= (int)TILEGX_PIPELINE_X1) + +#define PI(encoding) \ + push_inst(compiler, encoding) + +#define PB3(opcode, dst, srca, srcb) \ + push_3_buffer(compiler, opcode, dst, srca, srcb, __LINE__) + +#define PB2(opcode, dst, src) \ + push_2_buffer(compiler, opcode, dst, src, __LINE__) + +#define JR(reg) \ + push_jr_buffer(compiler, TILEGX_OPC_JR, reg, __LINE__) + +#define ADD(dst, srca, srcb) \ + push_3_buffer(compiler, TILEGX_OPC_ADD, dst, srca, srcb, __LINE__) + +#define SUB(dst, srca, srcb) \ + push_3_buffer(compiler, TILEGX_OPC_SUB, dst, srca, srcb, __LINE__) + +#define MUL(dst, srca, srcb) \ + push_3_buffer(compiler, TILEGX_OPC_MULX, dst, srca, srcb, __LINE__) + +#define NOR(dst, srca, srcb) \ + push_3_buffer(compiler, TILEGX_OPC_NOR, dst, srca, srcb, __LINE__) + +#define OR(dst, srca, srcb) \ + push_3_buffer(compiler, TILEGX_OPC_OR, dst, srca, srcb, __LINE__) + +#define XOR(dst, srca, srcb) \ + push_3_buffer(compiler, TILEGX_OPC_XOR, dst, srca, srcb, __LINE__) + +#define AND(dst, srca, srcb) \ + push_3_buffer(compiler, TILEGX_OPC_AND, dst, srca, srcb, __LINE__) + +#define CLZ(dst, src) \ + push_2_buffer(compiler, TILEGX_OPC_CLZ, dst, src, __LINE__) + +#define SHLI(dst, srca, srcb) \ + push_3_buffer(compiler, TILEGX_OPC_SHLI, dst, srca, srcb, __LINE__) + +#define SHRUI(dst, srca, imm) \ + push_3_buffer(compiler, TILEGX_OPC_SHRUI, dst, srca, imm, __LINE__) + +#define XORI(dst, srca, imm) \ + push_3_buffer(compiler, TILEGX_OPC_XORI, dst, srca, imm, __LINE__) + +#define ORI(dst, srca, imm) \ + push_3_buffer(compiler, TILEGX_OPC_ORI, dst, srca, imm, __LINE__) + +#define CMPLTU(dst, srca, srcb) \ + push_3_buffer(compiler, TILEGX_OPC_CMPLTU, dst, srca, srcb, __LINE__) + +#define CMPLTS(dst, srca, srcb) \ + push_3_buffer(compiler, TILEGX_OPC_CMPLTS, dst, srca, srcb, __LINE__) + +#define CMPLTUI(dst, srca, imm) \ + push_3_buffer(compiler, TILEGX_OPC_CMPLTUI, dst, srca, imm, __LINE__) + +#define CMOVNEZ(dst, srca, srcb) \ + push_3_buffer(compiler, TILEGX_OPC_CMOVNEZ, dst, srca, srcb, __LINE__) + +#define CMOVEQZ(dst, srca, srcb) \ + push_3_buffer(compiler, TILEGX_OPC_CMOVEQZ, dst, srca, srcb, __LINE__) + +#define ADDLI(dst, srca, srcb) \ + push_3_buffer(compiler, TILEGX_OPC_ADDLI, dst, srca, srcb, __LINE__) + +#define SHL16INSLI(dst, srca, srcb) \ + push_3_buffer(compiler, TILEGX_OPC_SHL16INSLI, dst, srca, srcb, __LINE__) + +#define LD_ADD(dst, addr, adjust) \ + push_3_buffer(compiler, TILEGX_OPC_LD_ADD, dst, addr, adjust, __LINE__) + +#define ST_ADD(src, addr, adjust) \ + push_3_buffer(compiler, TILEGX_OPC_ST_ADD, src, addr, adjust, __LINE__) + +#define LD(dst, addr) \ + push_2_buffer(compiler, TILEGX_OPC_LD, dst, addr, __LINE__) + +#define BFEXTU(dst, src, start, end) \ + push_4_buffer(compiler, TILEGX_OPC_BFEXTU, dst, src, start, end, __LINE__) + +#define BFEXTS(dst, src, start, end) \ + push_4_buffer(compiler, TILEGX_OPC_BFEXTS, dst, src, start, end, __LINE__) + +#define ADD_SOLO(dest, srca, srcb) \ + push_inst(compiler, ADD_X1 | DEST_X1(dest) | SRCA_X1(srca) | SRCB_X1(srcb)) + +#define ADDI_SOLO(dest, srca, imm) \ + push_inst(compiler, ADDI_X1 | DEST_X1(dest) | SRCA_X1(srca) | IMM8_X1(imm)) + +#define ADDLI_SOLO(dest, srca, imm) \ + push_inst(compiler, ADDLI_X1 | DEST_X1(dest) | SRCA_X1(srca) | IMM16_X1(imm)) + +#define SHL16INSLI_SOLO(dest, srca, imm) \ + push_inst(compiler, SHL16INSLI_X1 | DEST_X1(dest) | SRCA_X1(srca) | IMM16_X1(imm)) + +#define JALR_SOLO(reg) \ + push_inst(compiler, JALR_X1 | SRCA_X1(reg)) + +#define JR_SOLO(reg) \ + push_inst(compiler, JR_X1 | SRCA_X1(reg)) + +struct Format { + /* Mapping of bundle issue slot to assigned pipe. */ + tilegx_pipeline pipe[TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE]; + + /* Mask of pipes used by this bundle. */ + unsigned int pipe_mask; +}; + +const struct Format formats[] = +{ + /* In Y format we must always have something in Y2, since it has + * no fnop, so this conveys that Y2 must always be used. */ + BUNDLE_FORMAT(TILEGX_PIPELINE_Y0, TILEGX_PIPELINE_Y2, NO_PIPELINE), + BUNDLE_FORMAT(TILEGX_PIPELINE_Y1, TILEGX_PIPELINE_Y2, NO_PIPELINE), + BUNDLE_FORMAT(TILEGX_PIPELINE_Y2, TILEGX_PIPELINE_Y0, NO_PIPELINE), + BUNDLE_FORMAT(TILEGX_PIPELINE_Y2, TILEGX_PIPELINE_Y1, NO_PIPELINE), + + /* Y format has three instructions. */ + BUNDLE_FORMAT(TILEGX_PIPELINE_Y0, TILEGX_PIPELINE_Y1, TILEGX_PIPELINE_Y2), + BUNDLE_FORMAT(TILEGX_PIPELINE_Y0, TILEGX_PIPELINE_Y2, TILEGX_PIPELINE_Y1), + BUNDLE_FORMAT(TILEGX_PIPELINE_Y1, TILEGX_PIPELINE_Y0, TILEGX_PIPELINE_Y2), + BUNDLE_FORMAT(TILEGX_PIPELINE_Y1, TILEGX_PIPELINE_Y2, TILEGX_PIPELINE_Y0), + BUNDLE_FORMAT(TILEGX_PIPELINE_Y2, TILEGX_PIPELINE_Y0, TILEGX_PIPELINE_Y1), + BUNDLE_FORMAT(TILEGX_PIPELINE_Y2, TILEGX_PIPELINE_Y1, TILEGX_PIPELINE_Y0), + + /* X format has only two instructions. */ + BUNDLE_FORMAT(TILEGX_PIPELINE_X0, TILEGX_PIPELINE_X1, NO_PIPELINE), + BUNDLE_FORMAT(TILEGX_PIPELINE_X1, TILEGX_PIPELINE_X0, NO_PIPELINE) +}; + + +struct jit_instr inst_buf[TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE]; +unsigned long inst_buf_index; + +tilegx_pipeline get_any_valid_pipe(const struct tilegx_opcode* opcode) +{ + /* FIXME: tile: we could pregenerate this. */ + int pipe; + for (pipe = 0; ((opcode->pipes & (1 << pipe)) == 0 && pipe < TILEGX_NUM_PIPELINE_ENCODINGS); pipe++) + ; + return (tilegx_pipeline)(pipe); +} + +void insert_nop(tilegx_mnemonic opc, int line) +{ + const struct tilegx_opcode* opcode = NULL; + + memmove(&inst_buf[1], &inst_buf[0], inst_buf_index * sizeof inst_buf[0]); + + opcode = &tilegx_opcodes[opc]; + inst_buf[0].opcode = opcode; + inst_buf[0].pipe = get_any_valid_pipe(opcode); + inst_buf[0].input_registers = 0; + inst_buf[0].output_registers = 0; + inst_buf[0].line = line; + ++inst_buf_index; +} + +const struct Format* compute_format() +{ + unsigned int compatible_pipes = BUNDLE_FORMAT_MASK( + inst_buf[0].opcode->pipes, + inst_buf[1].opcode->pipes, + (inst_buf_index == 3 ? inst_buf[2].opcode->pipes : (1 << NO_PIPELINE))); + + const struct Format* match = NULL; + const struct Format *b = NULL; + unsigned int i; + for (i = 0; i < sizeof formats / sizeof formats[0]; i++) { + b = &formats[i]; + if ((b->pipe_mask & compatible_pipes) == b->pipe_mask) { + match = b; + break; + } + } + + return match; +} + +sljit_s32 assign_pipes() +{ + unsigned long output_registers = 0; + unsigned int i = 0; + + if (inst_buf_index == 1) { + tilegx_mnemonic opc = inst_buf[0].opcode->can_bundle + ? TILEGX_OPC_FNOP : TILEGX_OPC_NOP; + insert_nop(opc, __LINE__); + } + + const struct Format* match = compute_format(); + + if (match == NULL) + return -1; + + for (i = 0; i < inst_buf_index; i++) { + + if ((i > 0) && ((inst_buf[i].input_registers & output_registers) != 0)) + return -1; + + if ((i > 0) && ((inst_buf[i].output_registers & output_registers) != 0)) + return -1; + + /* Don't include Rzero in the match set, to avoid triggering + needlessly on 'prefetch' instrs. */ + + output_registers |= inst_buf[i].output_registers & 0xFFFFFFFFFFFFFFL; + + inst_buf[i].pipe = match->pipe[i]; + } + + /* If only 2 instrs, and in Y-mode, insert a nop. */ + if (inst_buf_index == 2 && !tilegx_is_x_pipeline(match->pipe[0])) { + insert_nop(TILEGX_OPC_FNOP, __LINE__); + + /* Select the yet unassigned pipe. */ + tilegx_pipeline pipe = (tilegx_pipeline)(((TILEGX_PIPELINE_Y0 + + TILEGX_PIPELINE_Y1 + TILEGX_PIPELINE_Y2) + - (inst_buf[1].pipe + inst_buf[2].pipe))); + + inst_buf[0].pipe = pipe; + } + + return 0; +} + +tilegx_bundle_bits get_bundle_bit(struct jit_instr *inst) +{ + int i, val; + const struct tilegx_opcode* opcode = inst->opcode; + tilegx_bundle_bits bits = opcode->fixed_bit_values[inst->pipe]; + + const struct tilegx_operand* operand = NULL; + for (i = 0; i < opcode->num_operands; i++) { + operand = &tilegx_operands[opcode->operands[inst->pipe][i]]; + val = inst->operand_value[i]; + + bits |= operand->insert(val); + } + + return bits; +} + +static sljit_s32 update_buffer(struct sljit_compiler *compiler) +{ + int i; + int orig_index = inst_buf_index; + struct jit_instr inst0 = inst_buf[0]; + struct jit_instr inst1 = inst_buf[1]; + struct jit_instr inst2 = inst_buf[2]; + tilegx_bundle_bits bits = 0; + + /* If the bundle is valid as is, perform the encoding and return 1. */ + if (assign_pipes() == 0) { + for (i = 0; i < inst_buf_index; i++) { + bits |= get_bundle_bit(inst_buf + i); +#ifdef TILEGX_JIT_DEBUG + printf("|%04d", inst_buf[i].line); +#endif + } +#ifdef TILEGX_JIT_DEBUG + if (inst_buf_index == 3) + printf("|M0|:\t"); + else + printf("|M0|:\t\t"); + print_insn_tilegx(&bits); +#endif + + inst_buf_index = 0; + +#ifdef TILEGX_JIT_DEBUG + return push_inst_nodebug(compiler, bits); +#else + return push_inst(compiler, bits); +#endif + } + + /* If the bundle is invalid, split it in two. First encode the first two + (or possibly 1) instructions, and then the last, separately. Note that + assign_pipes may have re-ordered the instrs (by inserting no-ops in + lower slots) so we need to reset them. */ + + inst_buf_index = orig_index - 1; + inst_buf[0] = inst0; + inst_buf[1] = inst1; + inst_buf[2] = inst2; + if (assign_pipes() == 0) { + for (i = 0; i < inst_buf_index; i++) { + bits |= get_bundle_bit(inst_buf + i); +#ifdef TILEGX_JIT_DEBUG + printf("|%04d", inst_buf[i].line); +#endif + } + +#ifdef TILEGX_JIT_DEBUG + if (inst_buf_index == 3) + printf("|M1|:\t"); + else + printf("|M1|:\t\t"); + print_insn_tilegx(&bits); +#endif + + if ((orig_index - 1) == 2) { + inst_buf[0] = inst2; + inst_buf_index = 1; + } else if ((orig_index - 1) == 1) { + inst_buf[0] = inst1; + inst_buf_index = 1; + } else + SLJIT_UNREACHABLE(); + +#ifdef TILEGX_JIT_DEBUG + return push_inst_nodebug(compiler, bits); +#else + return push_inst(compiler, bits); +#endif + } else { + /* We had 3 instrs of which the first 2 can't live in the same bundle. + Split those two. Note that we don't try to then combine the second + and third instr into a single bundle. First instruction: */ + inst_buf_index = 1; + inst_buf[0] = inst0; + inst_buf[1] = inst1; + inst_buf[2] = inst2; + if (assign_pipes() == 0) { + for (i = 0; i < inst_buf_index; i++) { + bits |= get_bundle_bit(inst_buf + i); +#ifdef TILEGX_JIT_DEBUG + printf("|%04d", inst_buf[i].line); +#endif + } + +#ifdef TILEGX_JIT_DEBUG + if (inst_buf_index == 3) + printf("|M2|:\t"); + else + printf("|M2|:\t\t"); + print_insn_tilegx(&bits); +#endif + + inst_buf[0] = inst1; + inst_buf[1] = inst2; + inst_buf_index = orig_index - 1; +#ifdef TILEGX_JIT_DEBUG + return push_inst_nodebug(compiler, bits); +#else + return push_inst(compiler, bits); +#endif + } else + SLJIT_UNREACHABLE(); + } + + SLJIT_UNREACHABLE(); +} + +static sljit_s32 flush_buffer(struct sljit_compiler *compiler) +{ + while (inst_buf_index != 0) { + FAIL_IF(update_buffer(compiler)); + } + return SLJIT_SUCCESS; +} + +static sljit_s32 push_4_buffer(struct sljit_compiler *compiler, tilegx_mnemonic opc, int op0, int op1, int op2, int op3, int line) +{ + if (inst_buf_index == TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE) + FAIL_IF(update_buffer(compiler)); + + const struct tilegx_opcode* opcode = &tilegx_opcodes[opc]; + inst_buf[inst_buf_index].opcode = opcode; + inst_buf[inst_buf_index].pipe = get_any_valid_pipe(opcode); + inst_buf[inst_buf_index].operand_value[0] = op0; + inst_buf[inst_buf_index].operand_value[1] = op1; + inst_buf[inst_buf_index].operand_value[2] = op2; + inst_buf[inst_buf_index].operand_value[3] = op3; + inst_buf[inst_buf_index].input_registers = 1L << op1; + inst_buf[inst_buf_index].output_registers = 1L << op0; + inst_buf[inst_buf_index].line = line; + inst_buf_index++; + + return SLJIT_SUCCESS; +} + +static sljit_s32 push_3_buffer(struct sljit_compiler *compiler, tilegx_mnemonic opc, int op0, int op1, int op2, int line) +{ + if (inst_buf_index == TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE) + FAIL_IF(update_buffer(compiler)); + + const struct tilegx_opcode* opcode = &tilegx_opcodes[opc]; + inst_buf[inst_buf_index].opcode = opcode; + inst_buf[inst_buf_index].pipe = get_any_valid_pipe(opcode); + inst_buf[inst_buf_index].operand_value[0] = op0; + inst_buf[inst_buf_index].operand_value[1] = op1; + inst_buf[inst_buf_index].operand_value[2] = op2; + inst_buf[inst_buf_index].line = line; + + switch (opc) { + case TILEGX_OPC_ST_ADD: + inst_buf[inst_buf_index].input_registers = (1L << op0) | (1L << op1); + inst_buf[inst_buf_index].output_registers = 1L << op0; + break; + case TILEGX_OPC_LD_ADD: + inst_buf[inst_buf_index].input_registers = 1L << op1; + inst_buf[inst_buf_index].output_registers = (1L << op0) | (1L << op1); + break; + case TILEGX_OPC_ADD: + case TILEGX_OPC_AND: + case TILEGX_OPC_SUB: + case TILEGX_OPC_MULX: + case TILEGX_OPC_OR: + case TILEGX_OPC_XOR: + case TILEGX_OPC_NOR: + case TILEGX_OPC_SHL: + case TILEGX_OPC_SHRU: + case TILEGX_OPC_SHRS: + case TILEGX_OPC_CMPLTU: + case TILEGX_OPC_CMPLTS: + case TILEGX_OPC_CMOVEQZ: + case TILEGX_OPC_CMOVNEZ: + inst_buf[inst_buf_index].input_registers = (1L << op1) | (1L << op2); + inst_buf[inst_buf_index].output_registers = 1L << op0; + break; + case TILEGX_OPC_ADDLI: + case TILEGX_OPC_XORI: + case TILEGX_OPC_ORI: + case TILEGX_OPC_SHLI: + case TILEGX_OPC_SHRUI: + case TILEGX_OPC_SHRSI: + case TILEGX_OPC_SHL16INSLI: + case TILEGX_OPC_CMPLTUI: + case TILEGX_OPC_CMPLTSI: + inst_buf[inst_buf_index].input_registers = 1L << op1; + inst_buf[inst_buf_index].output_registers = 1L << op0; + break; + default: + printf("unrecoginzed opc: %s\n", opcode->name); + SLJIT_UNREACHABLE(); + } + + inst_buf_index++; + + return SLJIT_SUCCESS; +} + +static sljit_s32 push_2_buffer(struct sljit_compiler *compiler, tilegx_mnemonic opc, int op0, int op1, int line) +{ + if (inst_buf_index == TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE) + FAIL_IF(update_buffer(compiler)); + + const struct tilegx_opcode* opcode = &tilegx_opcodes[opc]; + inst_buf[inst_buf_index].opcode = opcode; + inst_buf[inst_buf_index].pipe = get_any_valid_pipe(opcode); + inst_buf[inst_buf_index].operand_value[0] = op0; + inst_buf[inst_buf_index].operand_value[1] = op1; + inst_buf[inst_buf_index].line = line; + + switch (opc) { + case TILEGX_OPC_BEQZ: + case TILEGX_OPC_BNEZ: + inst_buf[inst_buf_index].input_registers = 1L << op0; + break; + case TILEGX_OPC_ST: + case TILEGX_OPC_ST1: + case TILEGX_OPC_ST2: + case TILEGX_OPC_ST4: + inst_buf[inst_buf_index].input_registers = (1L << op0) | (1L << op1); + inst_buf[inst_buf_index].output_registers = 0; + break; + case TILEGX_OPC_CLZ: + case TILEGX_OPC_LD: + case TILEGX_OPC_LD1U: + case TILEGX_OPC_LD1S: + case TILEGX_OPC_LD2U: + case TILEGX_OPC_LD2S: + case TILEGX_OPC_LD4U: + case TILEGX_OPC_LD4S: + inst_buf[inst_buf_index].input_registers = 1L << op1; + inst_buf[inst_buf_index].output_registers = 1L << op0; + break; + default: + printf("unrecoginzed opc: %s\n", opcode->name); + SLJIT_UNREACHABLE(); + } + + inst_buf_index++; + + return SLJIT_SUCCESS; +} + +static sljit_s32 push_0_buffer(struct sljit_compiler *compiler, tilegx_mnemonic opc, int line) +{ + if (inst_buf_index == TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE) + FAIL_IF(update_buffer(compiler)); + + const struct tilegx_opcode* opcode = &tilegx_opcodes[opc]; + inst_buf[inst_buf_index].opcode = opcode; + inst_buf[inst_buf_index].pipe = get_any_valid_pipe(opcode); + inst_buf[inst_buf_index].input_registers = 0; + inst_buf[inst_buf_index].output_registers = 0; + inst_buf[inst_buf_index].line = line; + inst_buf_index++; + + return SLJIT_SUCCESS; +} + +static sljit_s32 push_jr_buffer(struct sljit_compiler *compiler, tilegx_mnemonic opc, int op0, int line) +{ + if (inst_buf_index == TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE) + FAIL_IF(update_buffer(compiler)); + + const struct tilegx_opcode* opcode = &tilegx_opcodes[opc]; + inst_buf[inst_buf_index].opcode = opcode; + inst_buf[inst_buf_index].pipe = get_any_valid_pipe(opcode); + inst_buf[inst_buf_index].operand_value[0] = op0; + inst_buf[inst_buf_index].input_registers = 1L << op0; + inst_buf[inst_buf_index].output_registers = 0; + inst_buf[inst_buf_index].line = line; + inst_buf_index++; + + return flush_buffer(compiler); +} + +static SLJIT_INLINE sljit_ins * detect_jump_type(struct sljit_jump *jump, sljit_ins *code_ptr, sljit_ins *code) +{ + sljit_sw diff; + sljit_uw target_addr; + sljit_ins *inst; + + if (jump->flags & SLJIT_REWRITABLE_JUMP) + return code_ptr; + + if (jump->flags & JUMP_ADDR) + target_addr = jump->u.target; + else { + SLJIT_ASSERT(jump->flags & JUMP_LABEL); + target_addr = (sljit_uw)(code + jump->u.label->size); + } + + inst = (sljit_ins *)jump->addr; + if (jump->flags & IS_COND) + inst--; + + diff = ((sljit_sw) target_addr - (sljit_sw) inst) >> 3; + if (diff <= SIMM_17BIT_MAX && diff >= SIMM_17BIT_MIN) { + jump->flags |= PATCH_B; + + if (!(jump->flags & IS_COND)) { + if (jump->flags & IS_JAL) { + jump->flags &= ~(PATCH_B); + jump->flags |= PATCH_J; + inst[0] = JAL_X1; + +#ifdef TILEGX_JIT_DEBUG + printf("[runtime relocate]%04d:\t", __LINE__); + print_insn_tilegx(inst); +#endif + } else { + inst[0] = BEQZ_X1 | SRCA_X1(ZERO); + +#ifdef TILEGX_JIT_DEBUG + printf("[runtime relocate]%04d:\t", __LINE__); + print_insn_tilegx(inst); +#endif + } + + return inst; + } + + inst[0] = inst[0] ^ (0x7L << 55); + +#ifdef TILEGX_JIT_DEBUG + printf("[runtime relocate]%04d:\t", __LINE__); + print_insn_tilegx(inst); +#endif + jump->addr -= sizeof(sljit_ins); + return inst; + } + + if (jump->flags & IS_COND) { + if ((target_addr & ~0x3FFFFFFFL) == ((jump->addr + sizeof(sljit_ins)) & ~0x3FFFFFFFL)) { + jump->flags |= PATCH_J; + inst[0] = (inst[0] & ~(BOFF_X1(-1))) | BOFF_X1(2); + inst[1] = J_X1; + return inst + 1; + } + + return code_ptr; + } + + if ((target_addr & ~0x3FFFFFFFL) == ((jump->addr + sizeof(sljit_ins)) & ~0x3FFFFFFFL)) { + jump->flags |= PATCH_J; + + if (jump->flags & IS_JAL) { + inst[0] = JAL_X1; + +#ifdef TILEGX_JIT_DEBUG + printf("[runtime relocate]%04d:\t", __LINE__); + print_insn_tilegx(inst); +#endif + + } else { + inst[0] = J_X1; + +#ifdef TILEGX_JIT_DEBUG + printf("[runtime relocate]%04d:\t", __LINE__); + print_insn_tilegx(inst); +#endif + } + + return inst; + } + + return code_ptr; +} + +SLJIT_API_FUNC_ATTRIBUTE void * sljit_generate_code(struct sljit_compiler *compiler) +{ + struct sljit_memory_fragment *buf; + sljit_ins *code; + sljit_ins *code_ptr; + sljit_ins *buf_ptr; + sljit_ins *buf_end; + sljit_uw word_count; + sljit_uw addr; + + struct sljit_label *label; + struct sljit_jump *jump; + struct sljit_const *const_; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_generate_code(compiler)); + reverse_buf(compiler); + + code = (sljit_ins *)SLJIT_MALLOC_EXEC(compiler->size * sizeof(sljit_ins)); + PTR_FAIL_WITH_EXEC_IF(code); + buf = compiler->buf; + + code_ptr = code; + word_count = 0; + label = compiler->labels; + jump = compiler->jumps; + const_ = compiler->consts; + do { + buf_ptr = (sljit_ins *)buf->memory; + buf_end = buf_ptr + (buf->used_size >> 3); + do { + *code_ptr = *buf_ptr++; + SLJIT_ASSERT(!label || label->size >= word_count); + SLJIT_ASSERT(!jump || jump->addr >= word_count); + SLJIT_ASSERT(!const_ || const_->addr >= word_count); + /* These structures are ordered by their address. */ + if (label && label->size == word_count) { + /* Just recording the address. */ + label->addr = (sljit_uw) code_ptr; + label->size = code_ptr - code; + label = label->next; + } + + if (jump && jump->addr == word_count) { + if (jump->flags & IS_JAL) + jump->addr = (sljit_uw)(code_ptr - 4); + else + jump->addr = (sljit_uw)(code_ptr - 3); + + code_ptr = detect_jump_type(jump, code_ptr, code); + jump = jump->next; + } + + if (const_ && const_->addr == word_count) { + /* Just recording the address. */ + const_->addr = (sljit_uw) code_ptr; + const_ = const_->next; + } + + code_ptr++; + word_count++; + } while (buf_ptr < buf_end); + + buf = buf->next; + } while (buf); + + if (label && label->size == word_count) { + label->addr = (sljit_uw) code_ptr; + label->size = code_ptr - code; + label = label->next; + } + + SLJIT_ASSERT(!label); + SLJIT_ASSERT(!jump); + SLJIT_ASSERT(!const_); + SLJIT_ASSERT(code_ptr - code <= (sljit_sw)compiler->size); + + jump = compiler->jumps; + while (jump) { + do { + addr = (jump->flags & JUMP_LABEL) ? jump->u.label->addr : jump->u.target; + buf_ptr = (sljit_ins *)jump->addr; + + if (jump->flags & PATCH_B) { + addr = (sljit_sw)(addr - (jump->addr)) >> 3; + SLJIT_ASSERT((sljit_sw) addr <= SIMM_17BIT_MAX && (sljit_sw) addr >= SIMM_17BIT_MIN); + buf_ptr[0] = (buf_ptr[0] & ~(BOFF_X1(-1))) | BOFF_X1(addr); + +#ifdef TILEGX_JIT_DEBUG + printf("[runtime relocate]%04d:\t", __LINE__); + print_insn_tilegx(buf_ptr); +#endif + break; + } + + if (jump->flags & PATCH_J) { + SLJIT_ASSERT((addr & ~0x3FFFFFFFL) == ((jump->addr + sizeof(sljit_ins)) & ~0x3FFFFFFFL)); + addr = (sljit_sw)(addr - (jump->addr)) >> 3; + buf_ptr[0] = (buf_ptr[0] & ~(JOFF_X1(-1))) | JOFF_X1(addr); + +#ifdef TILEGX_JIT_DEBUG + printf("[runtime relocate]%04d:\t", __LINE__); + print_insn_tilegx(buf_ptr); +#endif + break; + } + + SLJIT_ASSERT(!(jump->flags & IS_JAL)); + + /* Set the fields of immediate loads. */ + buf_ptr[0] = (buf_ptr[0] & ~(0xFFFFL << 43)) | (((addr >> 32) & 0xFFFFL) << 43); + buf_ptr[1] = (buf_ptr[1] & ~(0xFFFFL << 43)) | (((addr >> 16) & 0xFFFFL) << 43); + buf_ptr[2] = (buf_ptr[2] & ~(0xFFFFL << 43)) | ((addr & 0xFFFFL) << 43); + } while (0); + + jump = jump->next; + } + + compiler->error = SLJIT_ERR_COMPILED; + compiler->executable_size = (code_ptr - code) * sizeof(sljit_ins); + SLJIT_CACHE_FLUSH(code, code_ptr); + return code; +} + +static sljit_s32 load_immediate(struct sljit_compiler *compiler, sljit_s32 dst_ar, sljit_sw imm) +{ + + if (imm <= SIMM_16BIT_MAX && imm >= SIMM_16BIT_MIN) + return ADDLI(dst_ar, ZERO, imm); + + if (imm <= SIMM_32BIT_MAX && imm >= SIMM_32BIT_MIN) { + FAIL_IF(ADDLI(dst_ar, ZERO, imm >> 16)); + return SHL16INSLI(dst_ar, dst_ar, imm); + } + + if (imm <= SIMM_48BIT_MAX && imm >= SIMM_48BIT_MIN) { + FAIL_IF(ADDLI(dst_ar, ZERO, imm >> 32)); + FAIL_IF(SHL16INSLI(dst_ar, dst_ar, imm >> 16)); + return SHL16INSLI(dst_ar, dst_ar, imm); + } + + FAIL_IF(ADDLI(dst_ar, ZERO, imm >> 48)); + FAIL_IF(SHL16INSLI(dst_ar, dst_ar, imm >> 32)); + FAIL_IF(SHL16INSLI(dst_ar, dst_ar, imm >> 16)); + return SHL16INSLI(dst_ar, dst_ar, imm); +} + +static sljit_s32 emit_const(struct sljit_compiler *compiler, sljit_s32 dst_ar, sljit_sw imm, int flush) +{ + /* Should *not* be optimized as load_immediate, as pcre relocation + mechanism will match this fixed 4-instruction pattern. */ + if (flush) { + FAIL_IF(ADDLI_SOLO(dst_ar, ZERO, imm >> 32)); + FAIL_IF(SHL16INSLI_SOLO(dst_ar, dst_ar, imm >> 16)); + return SHL16INSLI_SOLO(dst_ar, dst_ar, imm); + } + + FAIL_IF(ADDLI(dst_ar, ZERO, imm >> 32)); + FAIL_IF(SHL16INSLI(dst_ar, dst_ar, imm >> 16)); + return SHL16INSLI(dst_ar, dst_ar, imm); +} + +static sljit_s32 emit_const_64(struct sljit_compiler *compiler, sljit_s32 dst_ar, sljit_sw imm, int flush) +{ + /* Should *not* be optimized as load_immediate, as pcre relocation + mechanism will match this fixed 4-instruction pattern. */ + if (flush) { + FAIL_IF(ADDLI_SOLO(reg_map[dst_ar], ZERO, imm >> 48)); + FAIL_IF(SHL16INSLI_SOLO(reg_map[dst_ar], reg_map[dst_ar], imm >> 32)); + FAIL_IF(SHL16INSLI_SOLO(reg_map[dst_ar], reg_map[dst_ar], imm >> 16)); + return SHL16INSLI_SOLO(reg_map[dst_ar], reg_map[dst_ar], imm); + } + + FAIL_IF(ADDLI(reg_map[dst_ar], ZERO, imm >> 48)); + FAIL_IF(SHL16INSLI(reg_map[dst_ar], reg_map[dst_ar], imm >> 32)); + FAIL_IF(SHL16INSLI(reg_map[dst_ar], reg_map[dst_ar], imm >> 16)); + return SHL16INSLI(reg_map[dst_ar], reg_map[dst_ar], imm); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compiler, + sljit_s32 options, sljit_s32 args, sljit_s32 scratches, sljit_s32 saveds, + sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size) +{ + sljit_ins base; + sljit_s32 i, tmp; + + CHECK_ERROR(); + CHECK(check_sljit_emit_enter(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size)); + set_emit_enter(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size); + + local_size += GET_SAVED_REGISTERS_SIZE(scratches, saveds, 1); + local_size = (local_size + 7) & ~7; + compiler->local_size = local_size; + + if (local_size <= SIMM_16BIT_MAX) { + /* Frequent case. */ + FAIL_IF(ADDLI(SLJIT_LOCALS_REG_mapped, SLJIT_LOCALS_REG_mapped, -local_size)); + base = SLJIT_LOCALS_REG_mapped; + } else { + FAIL_IF(load_immediate(compiler, TMP_REG1_mapped, local_size)); + FAIL_IF(ADD(TMP_REG2_mapped, SLJIT_LOCALS_REG_mapped, ZERO)); + FAIL_IF(SUB(SLJIT_LOCALS_REG_mapped, SLJIT_LOCALS_REG_mapped, TMP_REG1_mapped)); + base = TMP_REG2_mapped; + local_size = 0; + } + + /* Save the return address. */ + FAIL_IF(ADDLI(ADDR_TMP_mapped, base, local_size - 8)); + FAIL_IF(ST_ADD(ADDR_TMP_mapped, RA, -8)); + + /* Save the S registers. */ + tmp = saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? (SLJIT_S0 + 1 - saveds) : SLJIT_FIRST_SAVED_REG; + for (i = SLJIT_S0; i >= tmp; i--) { + FAIL_IF(ST_ADD(ADDR_TMP_mapped, reg_map[i], -8)); + } + + /* Save the R registers that need to be reserved. */ + for (i = scratches; i >= SLJIT_FIRST_SAVED_REG; i--) { + FAIL_IF(ST_ADD(ADDR_TMP_mapped, reg_map[i], -8)); + } + + /* Move the arguments to S registers. */ + for (i = 0; i < args; i++) { + FAIL_IF(ADD(reg_map[SLJIT_S0 - i], i, ZERO)); + } + + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_set_context(struct sljit_compiler *compiler, + sljit_s32 options, sljit_s32 args, sljit_s32 scratches, sljit_s32 saveds, + sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size) +{ + CHECK_ERROR(); + CHECK(check_sljit_set_context(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size)); + set_set_context(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size); + + local_size += GET_SAVED_REGISTERS_SIZE(scratches, saveds, 1); + compiler->local_size = (local_size + 7) & ~7; + + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw) +{ + sljit_s32 local_size; + sljit_ins base; + sljit_s32 i, tmp; + sljit_s32 saveds; + + CHECK_ERROR(); + CHECK(check_sljit_emit_return(compiler, op, src, srcw)); + + FAIL_IF(emit_mov_before_return(compiler, op, src, srcw)); + + local_size = compiler->local_size; + if (local_size <= SIMM_16BIT_MAX) + base = SLJIT_LOCALS_REG_mapped; + else { + FAIL_IF(load_immediate(compiler, TMP_REG1_mapped, local_size)); + FAIL_IF(ADD(TMP_REG1_mapped, SLJIT_LOCALS_REG_mapped, TMP_REG1_mapped)); + base = TMP_REG1_mapped; + local_size = 0; + } + + /* Restore the return address. */ + FAIL_IF(ADDLI(ADDR_TMP_mapped, base, local_size - 8)); + FAIL_IF(LD_ADD(RA, ADDR_TMP_mapped, -8)); + + /* Restore the S registers. */ + saveds = compiler->saveds; + tmp = saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? (SLJIT_S0 + 1 - saveds) : SLJIT_FIRST_SAVED_REG; + for (i = SLJIT_S0; i >= tmp; i--) { + FAIL_IF(LD_ADD(reg_map[i], ADDR_TMP_mapped, -8)); + } + + /* Restore the R registers that need to be reserved. */ + for (i = compiler->scratches; i >= SLJIT_FIRST_SAVED_REG; i--) { + FAIL_IF(LD_ADD(reg_map[i], ADDR_TMP_mapped, -8)); + } + + if (compiler->local_size <= SIMM_16BIT_MAX) + FAIL_IF(ADDLI(SLJIT_LOCALS_REG_mapped, SLJIT_LOCALS_REG_mapped, compiler->local_size)); + else + FAIL_IF(ADD(SLJIT_LOCALS_REG_mapped, TMP_REG1_mapped, ZERO)); + + return JR(RA); +} + +/* reg_ar is an absoulute register! */ + +/* Can perform an operation using at most 1 instruction. */ +static sljit_s32 getput_arg_fast(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg_ar, sljit_s32 arg, sljit_sw argw) +{ + SLJIT_ASSERT(arg & SLJIT_MEM); + + if ((!(flags & WRITE_BACK) || !(arg & REG_MASK)) + && !(arg & OFFS_REG_MASK) && argw <= SIMM_16BIT_MAX && argw >= SIMM_16BIT_MIN) { + /* Works for both absoulte and relative addresses. */ + if (SLJIT_UNLIKELY(flags & ARG_TEST)) + return 1; + + FAIL_IF(ADDLI(ADDR_TMP_mapped, reg_map[arg & REG_MASK], argw)); + + if (flags & LOAD_DATA) + FAIL_IF(PB2(data_transfer_insts[flags & MEM_MASK], reg_ar, ADDR_TMP_mapped)); + else + FAIL_IF(PB2(data_transfer_insts[flags & MEM_MASK], ADDR_TMP_mapped, reg_ar)); + + return -1; + } + + return 0; +} + +/* See getput_arg below. + Note: can_cache is called only for binary operators. Those + operators always uses word arguments without write back. */ +static sljit_s32 can_cache(sljit_s32 arg, sljit_sw argw, sljit_s32 next_arg, sljit_sw next_argw) +{ + SLJIT_ASSERT((arg & SLJIT_MEM) && (next_arg & SLJIT_MEM)); + + /* Simple operation except for updates. */ + if (arg & OFFS_REG_MASK) { + argw &= 0x3; + next_argw &= 0x3; + if (argw && argw == next_argw + && (arg == next_arg || (arg & OFFS_REG_MASK) == (next_arg & OFFS_REG_MASK))) + return 1; + return 0; + } + + if (arg == next_arg) { + if (((next_argw - argw) <= SIMM_16BIT_MAX + && (next_argw - argw) >= SIMM_16BIT_MIN)) + return 1; + + return 0; + } + + return 0; +} + +/* Emit the necessary instructions. See can_cache above. */ +static sljit_s32 getput_arg(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg_ar, sljit_s32 arg, sljit_sw argw, sljit_s32 next_arg, sljit_sw next_argw) +{ + sljit_s32 tmp_ar, base; + + SLJIT_ASSERT(arg & SLJIT_MEM); + if (!(next_arg & SLJIT_MEM)) { + next_arg = 0; + next_argw = 0; + } + + if ((flags & MEM_MASK) <= GPR_REG && (flags & LOAD_DATA)) + tmp_ar = reg_ar; + else + tmp_ar = TMP_REG1_mapped; + + base = arg & REG_MASK; + + if (SLJIT_UNLIKELY(arg & OFFS_REG_MASK)) { + argw &= 0x3; + + if ((flags & WRITE_BACK) && reg_ar == reg_map[base]) { + SLJIT_ASSERT(!(flags & LOAD_DATA) && reg_map[TMP_REG1] != reg_ar); + FAIL_IF(ADD(TMP_REG1_mapped, reg_ar, ZERO)); + reg_ar = TMP_REG1_mapped; + } + + /* Using the cache. */ + if (argw == compiler->cache_argw) { + if (!(flags & WRITE_BACK)) { + if (arg == compiler->cache_arg) { + if (flags & LOAD_DATA) + return PB2(data_transfer_insts[flags & MEM_MASK], reg_ar, TMP_REG3_mapped); + else + return PB2(data_transfer_insts[flags & MEM_MASK], TMP_REG3_mapped, reg_ar); + } + + if ((SLJIT_MEM | (arg & OFFS_REG_MASK)) == compiler->cache_arg) { + if (arg == next_arg && argw == (next_argw & 0x3)) { + compiler->cache_arg = arg; + compiler->cache_argw = argw; + FAIL_IF(ADD(TMP_REG3_mapped, reg_map[base], TMP_REG3_mapped)); + if (flags & LOAD_DATA) + return PB2(data_transfer_insts[flags & MEM_MASK], reg_ar, TMP_REG3_mapped); + else + return PB2(data_transfer_insts[flags & MEM_MASK], TMP_REG3_mapped, reg_ar); + } + + FAIL_IF(ADD(tmp_ar, reg_map[base], TMP_REG3_mapped)); + if (flags & LOAD_DATA) + return PB2(data_transfer_insts[flags & MEM_MASK], reg_ar, tmp_ar); + else + return PB2(data_transfer_insts[flags & MEM_MASK], tmp_ar, reg_ar); + } + } else { + if ((SLJIT_MEM | (arg & OFFS_REG_MASK)) == compiler->cache_arg) { + FAIL_IF(ADD(reg_map[base], reg_map[base], TMP_REG3_mapped)); + if (flags & LOAD_DATA) + return PB2(data_transfer_insts[flags & MEM_MASK], reg_ar, reg_map[base]); + else + return PB2(data_transfer_insts[flags & MEM_MASK], reg_map[base], reg_ar); + } + } + } + + if (SLJIT_UNLIKELY(argw)) { + compiler->cache_arg = SLJIT_MEM | (arg & OFFS_REG_MASK); + compiler->cache_argw = argw; + FAIL_IF(SHLI(TMP_REG3_mapped, reg_map[OFFS_REG(arg)], argw)); + } + + if (!(flags & WRITE_BACK)) { + if (arg == next_arg && argw == (next_argw & 0x3)) { + compiler->cache_arg = arg; + compiler->cache_argw = argw; + FAIL_IF(ADD(TMP_REG3_mapped, reg_map[base], reg_map[!argw ? OFFS_REG(arg) : TMP_REG3])); + tmp_ar = TMP_REG3_mapped; + } else + FAIL_IF(ADD(tmp_ar, reg_map[base], reg_map[!argw ? OFFS_REG(arg) : TMP_REG3])); + + if (flags & LOAD_DATA) + return PB2(data_transfer_insts[flags & MEM_MASK], reg_ar, tmp_ar); + else + return PB2(data_transfer_insts[flags & MEM_MASK], tmp_ar, reg_ar); + } + + FAIL_IF(ADD(reg_map[base], reg_map[base], reg_map[!argw ? OFFS_REG(arg) : TMP_REG3])); + + if (flags & LOAD_DATA) + return PB2(data_transfer_insts[flags & MEM_MASK], reg_ar, reg_map[base]); + else + return PB2(data_transfer_insts[flags & MEM_MASK], reg_map[base], reg_ar); + } + + if (SLJIT_UNLIKELY(flags & WRITE_BACK) && base) { + /* Update only applies if a base register exists. */ + if (reg_ar == reg_map[base]) { + SLJIT_ASSERT(!(flags & LOAD_DATA) && TMP_REG1_mapped != reg_ar); + if (argw <= SIMM_16BIT_MAX && argw >= SIMM_16BIT_MIN) { + FAIL_IF(ADDLI(ADDR_TMP_mapped, reg_map[base], argw)); + if (flags & LOAD_DATA) + FAIL_IF(PB2(data_transfer_insts[flags & MEM_MASK], reg_ar, ADDR_TMP_mapped)); + else + FAIL_IF(PB2(data_transfer_insts[flags & MEM_MASK], ADDR_TMP_mapped, reg_ar)); + + if (argw) + return ADDLI(reg_map[base], reg_map[base], argw); + + return SLJIT_SUCCESS; + } + + FAIL_IF(ADD(TMP_REG1_mapped, reg_ar, ZERO)); + reg_ar = TMP_REG1_mapped; + } + + if (argw <= SIMM_16BIT_MAX && argw >= SIMM_16BIT_MIN) { + if (argw) + FAIL_IF(ADDLI(reg_map[base], reg_map[base], argw)); + } else { + if (compiler->cache_arg == SLJIT_MEM + && argw - compiler->cache_argw <= SIMM_16BIT_MAX + && argw - compiler->cache_argw >= SIMM_16BIT_MIN) { + if (argw != compiler->cache_argw) { + FAIL_IF(ADD(TMP_REG3_mapped, TMP_REG3_mapped, argw - compiler->cache_argw)); + compiler->cache_argw = argw; + } + + FAIL_IF(ADD(reg_map[base], reg_map[base], TMP_REG3_mapped)); + } else { + compiler->cache_arg = SLJIT_MEM; + compiler->cache_argw = argw; + FAIL_IF(load_immediate(compiler, TMP_REG3_mapped, argw)); + FAIL_IF(ADD(reg_map[base], reg_map[base], TMP_REG3_mapped)); + } + } + + if (flags & LOAD_DATA) + return PB2(data_transfer_insts[flags & MEM_MASK], reg_ar, reg_map[base]); + else + return PB2(data_transfer_insts[flags & MEM_MASK], reg_map[base], reg_ar); + } + + if (compiler->cache_arg == arg + && argw - compiler->cache_argw <= SIMM_16BIT_MAX + && argw - compiler->cache_argw >= SIMM_16BIT_MIN) { + if (argw != compiler->cache_argw) { + FAIL_IF(ADDLI(TMP_REG3_mapped, TMP_REG3_mapped, argw - compiler->cache_argw)); + compiler->cache_argw = argw; + } + + if (flags & LOAD_DATA) + return PB2(data_transfer_insts[flags & MEM_MASK], reg_ar, TMP_REG3_mapped); + else + return PB2(data_transfer_insts[flags & MEM_MASK], TMP_REG3_mapped, reg_ar); + } + + if (compiler->cache_arg == SLJIT_MEM + && argw - compiler->cache_argw <= SIMM_16BIT_MAX + && argw - compiler->cache_argw >= SIMM_16BIT_MIN) { + if (argw != compiler->cache_argw) + FAIL_IF(ADDLI(TMP_REG3_mapped, TMP_REG3_mapped, argw - compiler->cache_argw)); + } else { + compiler->cache_arg = SLJIT_MEM; + FAIL_IF(load_immediate(compiler, TMP_REG3_mapped, argw)); + } + + compiler->cache_argw = argw; + + if (!base) { + if (flags & LOAD_DATA) + return PB2(data_transfer_insts[flags & MEM_MASK], reg_ar, TMP_REG3_mapped); + else + return PB2(data_transfer_insts[flags & MEM_MASK], TMP_REG3_mapped, reg_ar); + } + + if (arg == next_arg + && next_argw - argw <= SIMM_16BIT_MAX + && next_argw - argw >= SIMM_16BIT_MIN) { + compiler->cache_arg = arg; + FAIL_IF(ADD(TMP_REG3_mapped, TMP_REG3_mapped, reg_map[base])); + if (flags & LOAD_DATA) + return PB2(data_transfer_insts[flags & MEM_MASK], reg_ar, TMP_REG3_mapped); + else + return PB2(data_transfer_insts[flags & MEM_MASK], TMP_REG3_mapped, reg_ar); + } + + FAIL_IF(ADD(tmp_ar, TMP_REG3_mapped, reg_map[base])); + + if (flags & LOAD_DATA) + return PB2(data_transfer_insts[flags & MEM_MASK], reg_ar, tmp_ar); + else + return PB2(data_transfer_insts[flags & MEM_MASK], tmp_ar, reg_ar); +} + +static SLJIT_INLINE sljit_s32 emit_op_mem(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg_ar, sljit_s32 arg, sljit_sw argw) +{ + if (getput_arg_fast(compiler, flags, reg_ar, arg, argw)) + return compiler->error; + + compiler->cache_arg = 0; + compiler->cache_argw = 0; + return getput_arg(compiler, flags, reg_ar, arg, argw, 0, 0); +} + +static SLJIT_INLINE sljit_s32 emit_op_mem2(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg, sljit_s32 arg1, sljit_sw arg1w, sljit_s32 arg2, sljit_sw arg2w) +{ + if (getput_arg_fast(compiler, flags, reg, arg1, arg1w)) + return compiler->error; + return getput_arg(compiler, flags, reg, arg1, arg1w, arg2, arg2w); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_fast_enter(compiler, dst, dstw)); + ADJUST_LOCAL_OFFSET(dst, dstw); + + /* For UNUSED dst. Uncommon, but possible. */ + if (dst == SLJIT_UNUSED) + return SLJIT_SUCCESS; + + if (FAST_IS_REG(dst)) + return ADD(reg_map[dst], RA, ZERO); + + /* Memory. */ + return emit_op_mem(compiler, WORD_DATA, RA, dst, dstw); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_fast_return(compiler, src, srcw)); + ADJUST_LOCAL_OFFSET(src, srcw); + + if (FAST_IS_REG(src)) + FAIL_IF(ADD(RA, reg_map[src], ZERO)); + + else if (src & SLJIT_MEM) + FAIL_IF(emit_op_mem(compiler, WORD_DATA | LOAD_DATA, RA, src, srcw)); + + else if (src & SLJIT_IMM) + FAIL_IF(load_immediate(compiler, RA, srcw)); + + return JR(RA); +} + +static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 flags, sljit_s32 dst, sljit_s32 src1, sljit_sw src2) +{ + sljit_s32 overflow_ra = 0; + + switch (GET_OPCODE(op)) { + case SLJIT_MOV: + case SLJIT_MOV_P: + SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); + if (dst != src2) + return ADD(reg_map[dst], reg_map[src2], ZERO); + return SLJIT_SUCCESS; + + case SLJIT_MOV_U32: + case SLJIT_MOV_S32: + SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); + if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) { + if (op == SLJIT_MOV_S32) + return BFEXTS(reg_map[dst], reg_map[src2], 0, 31); + + return BFEXTU(reg_map[dst], reg_map[src2], 0, 31); + } else if (dst != src2) { + SLJIT_ASSERT(src2 == 0); + return ADD(reg_map[dst], reg_map[src2], ZERO); + } + + return SLJIT_SUCCESS; + + case SLJIT_MOV_U8: + case SLJIT_MOV_S8: + SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); + if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) { + if (op == SLJIT_MOV_S8) + return BFEXTS(reg_map[dst], reg_map[src2], 0, 7); + + return BFEXTU(reg_map[dst], reg_map[src2], 0, 7); + } else if (dst != src2) { + SLJIT_ASSERT(src2 == 0); + return ADD(reg_map[dst], reg_map[src2], ZERO); + } + + return SLJIT_SUCCESS; + + case SLJIT_MOV_U16: + case SLJIT_MOV_S16: + SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); + if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) { + if (op == SLJIT_MOV_S16) + return BFEXTS(reg_map[dst], reg_map[src2], 0, 15); + + return BFEXTU(reg_map[dst], reg_map[src2], 0, 15); + } else if (dst != src2) { + SLJIT_ASSERT(src2 == 0); + return ADD(reg_map[dst], reg_map[src2], ZERO); + } + + return SLJIT_SUCCESS; + + case SLJIT_NOT: + SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); + if (op & SLJIT_SET_E) + FAIL_IF(NOR(EQUAL_FLAG, reg_map[src2], reg_map[src2])); + if (CHECK_FLAGS(SLJIT_SET_E)) + FAIL_IF(NOR(reg_map[dst], reg_map[src2], reg_map[src2])); + + return SLJIT_SUCCESS; + + case SLJIT_CLZ: + SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); + if (op & SLJIT_SET_E) + FAIL_IF(CLZ(EQUAL_FLAG, reg_map[src2])); + if (CHECK_FLAGS(SLJIT_SET_E)) + FAIL_IF(CLZ(reg_map[dst], reg_map[src2])); + + return SLJIT_SUCCESS; + + case SLJIT_ADD: + if (flags & SRC2_IMM) { + if (op & SLJIT_SET_O) { + FAIL_IF(SHRUI(TMP_EREG1, reg_map[src1], 63)); + if (src2 < 0) + FAIL_IF(XORI(TMP_EREG1, TMP_EREG1, 1)); + } + + if (op & SLJIT_SET_E) + FAIL_IF(ADDLI(EQUAL_FLAG, reg_map[src1], src2)); + + if (op & SLJIT_SET_C) { + if (src2 >= 0) + FAIL_IF(ORI(ULESS_FLAG ,reg_map[src1], src2)); + else { + FAIL_IF(ADDLI(ULESS_FLAG ,ZERO, src2)); + FAIL_IF(OR(ULESS_FLAG,reg_map[src1],ULESS_FLAG)); + } + } + + /* dst may be the same as src1 or src2. */ + if (CHECK_FLAGS(SLJIT_SET_E)) + FAIL_IF(ADDLI(reg_map[dst], reg_map[src1], src2)); + + if (op & SLJIT_SET_O) { + FAIL_IF(SHRUI(OVERFLOW_FLAG, reg_map[dst], 63)); + + if (src2 < 0) + FAIL_IF(XORI(OVERFLOW_FLAG, OVERFLOW_FLAG, 1)); + } + } else { + if (op & SLJIT_SET_O) { + FAIL_IF(XOR(TMP_EREG1, reg_map[src1], reg_map[src2])); + FAIL_IF(SHRUI(TMP_EREG1, TMP_EREG1, 63)); + + if (src1 != dst) + overflow_ra = reg_map[src1]; + else if (src2 != dst) + overflow_ra = reg_map[src2]; + else { + /* Rare ocasion. */ + FAIL_IF(ADD(TMP_EREG2, reg_map[src1], ZERO)); + overflow_ra = TMP_EREG2; + } + } + + if (op & SLJIT_SET_E) + FAIL_IF(ADD(EQUAL_FLAG ,reg_map[src1], reg_map[src2])); + + if (op & SLJIT_SET_C) + FAIL_IF(OR(ULESS_FLAG,reg_map[src1], reg_map[src2])); + + /* dst may be the same as src1 or src2. */ + if (CHECK_FLAGS(SLJIT_SET_E)) + FAIL_IF(ADD(reg_map[dst],reg_map[src1], reg_map[src2])); + + if (op & SLJIT_SET_O) { + FAIL_IF(XOR(OVERFLOW_FLAG,reg_map[dst], overflow_ra)); + FAIL_IF(SHRUI(OVERFLOW_FLAG, OVERFLOW_FLAG, 63)); + } + } + + /* a + b >= a | b (otherwise, the carry should be set to 1). */ + if (op & SLJIT_SET_C) + FAIL_IF(CMPLTU(ULESS_FLAG ,reg_map[dst] ,ULESS_FLAG)); + + if (op & SLJIT_SET_O) + return CMOVNEZ(OVERFLOW_FLAG, TMP_EREG1, ZERO); + + return SLJIT_SUCCESS; + + case SLJIT_ADDC: + if (flags & SRC2_IMM) { + if (op & SLJIT_SET_C) { + if (src2 >= 0) + FAIL_IF(ORI(TMP_EREG1, reg_map[src1], src2)); + else { + FAIL_IF(ADDLI(TMP_EREG1, ZERO, src2)); + FAIL_IF(OR(TMP_EREG1, reg_map[src1], TMP_EREG1)); + } + } + + FAIL_IF(ADDLI(reg_map[dst], reg_map[src1], src2)); + + } else { + if (op & SLJIT_SET_C) + FAIL_IF(OR(TMP_EREG1, reg_map[src1], reg_map[src2])); + + /* dst may be the same as src1 or src2. */ + FAIL_IF(ADD(reg_map[dst], reg_map[src1], reg_map[src2])); + } + + if (op & SLJIT_SET_C) + FAIL_IF(CMPLTU(TMP_EREG1, reg_map[dst], TMP_EREG1)); + + FAIL_IF(ADD(reg_map[dst], reg_map[dst], ULESS_FLAG)); + + if (!(op & SLJIT_SET_C)) + return SLJIT_SUCCESS; + + /* Set TMP_EREG2 (dst == 0) && (ULESS_FLAG == 1). */ + FAIL_IF(CMPLTUI(TMP_EREG2, reg_map[dst], 1)); + FAIL_IF(AND(TMP_EREG2, TMP_EREG2, ULESS_FLAG)); + /* Set carry flag. */ + return OR(ULESS_FLAG, TMP_EREG2, TMP_EREG1); + + case SLJIT_SUB: + if ((flags & SRC2_IMM) && ((op & (SLJIT_SET_U | SLJIT_SET_S)) || src2 == SIMM_16BIT_MIN)) { + FAIL_IF(ADDLI(TMP_REG2_mapped, ZERO, src2)); + src2 = TMP_REG2; + flags &= ~SRC2_IMM; + } + + if (flags & SRC2_IMM) { + if (op & SLJIT_SET_O) { + FAIL_IF(SHRUI(TMP_EREG1,reg_map[src1], 63)); + + if (src2 < 0) + FAIL_IF(XORI(TMP_EREG1, TMP_EREG1, 1)); + + if (src1 != dst) + overflow_ra = reg_map[src1]; + else { + /* Rare ocasion. */ + FAIL_IF(ADD(TMP_EREG2, reg_map[src1], ZERO)); + overflow_ra = TMP_EREG2; + } + } + + if (op & SLJIT_SET_E) + FAIL_IF(ADDLI(EQUAL_FLAG, reg_map[src1], -src2)); + + if (op & SLJIT_SET_C) { + FAIL_IF(load_immediate(compiler, ADDR_TMP_mapped, src2)); + FAIL_IF(CMPLTU(ULESS_FLAG, reg_map[src1], ADDR_TMP_mapped)); + } + + /* dst may be the same as src1 or src2. */ + if (CHECK_FLAGS(SLJIT_SET_E)) + FAIL_IF(ADDLI(reg_map[dst], reg_map[src1], -src2)); + + } else { + + if (op & SLJIT_SET_O) { + FAIL_IF(XOR(TMP_EREG1, reg_map[src1], reg_map[src2])); + FAIL_IF(SHRUI(TMP_EREG1, TMP_EREG1, 63)); + + if (src1 != dst) + overflow_ra = reg_map[src1]; + else { + /* Rare ocasion. */ + FAIL_IF(ADD(TMP_EREG2, reg_map[src1], ZERO)); + overflow_ra = TMP_EREG2; + } + } + + if (op & SLJIT_SET_E) + FAIL_IF(SUB(EQUAL_FLAG, reg_map[src1], reg_map[src2])); + + if (op & (SLJIT_SET_U | SLJIT_SET_C)) + FAIL_IF(CMPLTU(ULESS_FLAG, reg_map[src1], reg_map[src2])); + + if (op & SLJIT_SET_U) + FAIL_IF(CMPLTU(UGREATER_FLAG, reg_map[src2], reg_map[src1])); + + if (op & SLJIT_SET_S) { + FAIL_IF(CMPLTS(LESS_FLAG ,reg_map[src1] ,reg_map[src2])); + FAIL_IF(CMPLTS(GREATER_FLAG ,reg_map[src2] ,reg_map[src1])); + } + + /* dst may be the same as src1 or src2. */ + if (CHECK_FLAGS(SLJIT_SET_E | SLJIT_SET_U | SLJIT_SET_S | SLJIT_SET_C)) + FAIL_IF(SUB(reg_map[dst], reg_map[src1], reg_map[src2])); + } + + if (op & SLJIT_SET_O) { + FAIL_IF(XOR(OVERFLOW_FLAG, reg_map[dst], overflow_ra)); + FAIL_IF(SHRUI(OVERFLOW_FLAG, OVERFLOW_FLAG, 63)); + return CMOVEQZ(OVERFLOW_FLAG, TMP_EREG1, ZERO); + } + + return SLJIT_SUCCESS; + + case SLJIT_SUBC: + if ((flags & SRC2_IMM) && src2 == SIMM_16BIT_MIN) { + FAIL_IF(ADDLI(TMP_REG2_mapped, ZERO, src2)); + src2 = TMP_REG2; + flags &= ~SRC2_IMM; + } + + if (flags & SRC2_IMM) { + if (op & SLJIT_SET_C) { + FAIL_IF(load_immediate(compiler, ADDR_TMP_mapped, -src2)); + FAIL_IF(CMPLTU(TMP_EREG1, reg_map[src1], ADDR_TMP_mapped)); + } + + /* dst may be the same as src1 or src2. */ + FAIL_IF(ADDLI(reg_map[dst], reg_map[src1], -src2)); + + } else { + if (op & SLJIT_SET_C) + FAIL_IF(CMPLTU(TMP_EREG1, reg_map[src1], reg_map[src2])); + /* dst may be the same as src1 or src2. */ + FAIL_IF(SUB(reg_map[dst], reg_map[src1], reg_map[src2])); + } + + if (op & SLJIT_SET_C) + FAIL_IF(CMOVEQZ(TMP_EREG1, reg_map[dst], ULESS_FLAG)); + + FAIL_IF(SUB(reg_map[dst], reg_map[dst], ULESS_FLAG)); + + if (op & SLJIT_SET_C) + FAIL_IF(ADD(ULESS_FLAG, TMP_EREG1, ZERO)); + + return SLJIT_SUCCESS; + + case SLJIT_MUL: + if (flags & SRC2_IMM) { + FAIL_IF(load_immediate(compiler, TMP_REG2_mapped, src2)); + src2 = TMP_REG2; + flags &= ~SRC2_IMM; + } + + FAIL_IF(MUL(reg_map[dst], reg_map[src1], reg_map[src2])); + + return SLJIT_SUCCESS; + +#define EMIT_LOGICAL(op_imm, op_norm) \ + if (flags & SRC2_IMM) { \ + FAIL_IF(load_immediate(compiler, ADDR_TMP_mapped, src2)); \ + if (op & SLJIT_SET_E) \ + FAIL_IF(push_3_buffer( \ + compiler, op_norm, EQUAL_FLAG, reg_map[src1], \ + ADDR_TMP_mapped, __LINE__)); \ + if (CHECK_FLAGS(SLJIT_SET_E)) \ + FAIL_IF(push_3_buffer( \ + compiler, op_norm, reg_map[dst], reg_map[src1], \ + ADDR_TMP_mapped, __LINE__)); \ + } else { \ + if (op & SLJIT_SET_E) \ + FAIL_IF(push_3_buffer( \ + compiler, op_norm, EQUAL_FLAG, reg_map[src1], \ + reg_map[src2], __LINE__)); \ + if (CHECK_FLAGS(SLJIT_SET_E)) \ + FAIL_IF(push_3_buffer( \ + compiler, op_norm, reg_map[dst], reg_map[src1], \ + reg_map[src2], __LINE__)); \ + } + + case SLJIT_AND: + EMIT_LOGICAL(TILEGX_OPC_ANDI, TILEGX_OPC_AND); + return SLJIT_SUCCESS; + + case SLJIT_OR: + EMIT_LOGICAL(TILEGX_OPC_ORI, TILEGX_OPC_OR); + return SLJIT_SUCCESS; + + case SLJIT_XOR: + EMIT_LOGICAL(TILEGX_OPC_XORI, TILEGX_OPC_XOR); + return SLJIT_SUCCESS; + +#define EMIT_SHIFT(op_imm, op_norm) \ + if (flags & SRC2_IMM) { \ + if (op & SLJIT_SET_E) \ + FAIL_IF(push_3_buffer( \ + compiler, op_imm, EQUAL_FLAG, reg_map[src1], \ + src2 & 0x3F, __LINE__)); \ + if (CHECK_FLAGS(SLJIT_SET_E)) \ + FAIL_IF(push_3_buffer( \ + compiler, op_imm, reg_map[dst], reg_map[src1], \ + src2 & 0x3F, __LINE__)); \ + } else { \ + if (op & SLJIT_SET_E) \ + FAIL_IF(push_3_buffer( \ + compiler, op_norm, EQUAL_FLAG, reg_map[src1], \ + reg_map[src2], __LINE__)); \ + if (CHECK_FLAGS(SLJIT_SET_E)) \ + FAIL_IF(push_3_buffer( \ + compiler, op_norm, reg_map[dst], reg_map[src1], \ + reg_map[src2], __LINE__)); \ + } + + case SLJIT_SHL: + EMIT_SHIFT(TILEGX_OPC_SHLI, TILEGX_OPC_SHL); + return SLJIT_SUCCESS; + + case SLJIT_LSHR: + EMIT_SHIFT(TILEGX_OPC_SHRUI, TILEGX_OPC_SHRU); + return SLJIT_SUCCESS; + + case SLJIT_ASHR: + EMIT_SHIFT(TILEGX_OPC_SHRSI, TILEGX_OPC_SHRS); + return SLJIT_SUCCESS; + } + + SLJIT_UNREACHABLE(); + return SLJIT_SUCCESS; +} + +static sljit_s32 emit_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 flags, sljit_s32 dst, sljit_sw dstw, sljit_s32 src1, sljit_sw src1w, sljit_s32 src2, sljit_sw src2w) +{ + /* arg1 goes to TMP_REG1 or src reg. + arg2 goes to TMP_REG2, imm or src reg. + TMP_REG3 can be used for caching. + result goes to TMP_REG2, so put result can use TMP_REG1 and TMP_REG3. */ + sljit_s32 dst_r = TMP_REG2; + sljit_s32 src1_r; + sljit_sw src2_r = 0; + sljit_s32 sugg_src2_r = TMP_REG2; + + if (!(flags & ALT_KEEP_CACHE)) { + compiler->cache_arg = 0; + compiler->cache_argw = 0; + } + + if (SLJIT_UNLIKELY(dst == SLJIT_UNUSED)) { + if (op >= SLJIT_MOV && op <= SLJIT_MOVU_S32 && !(src2 & SLJIT_MEM)) + return SLJIT_SUCCESS; + if (GET_FLAGS(op)) + flags |= UNUSED_DEST; + } else if (FAST_IS_REG(dst)) { + dst_r = dst; + flags |= REG_DEST; + if (op >= SLJIT_MOV && op <= SLJIT_MOVU_S32) + sugg_src2_r = dst_r; + } else if ((dst & SLJIT_MEM) && !getput_arg_fast(compiler, flags | ARG_TEST, TMP_REG1_mapped, dst, dstw)) + flags |= SLOW_DEST; + + if (flags & IMM_OP) { + if ((src2 & SLJIT_IMM) && src2w) { + if ((!(flags & LOGICAL_OP) + && (src2w <= SIMM_16BIT_MAX && src2w >= SIMM_16BIT_MIN)) + || ((flags & LOGICAL_OP) && !(src2w & ~UIMM_16BIT_MAX))) { + flags |= SRC2_IMM; + src2_r = src2w; + } + } + + if (!(flags & SRC2_IMM) && (flags & CUMULATIVE_OP) && (src1 & SLJIT_IMM) && src1w) { + if ((!(flags & LOGICAL_OP) + && (src1w <= SIMM_16BIT_MAX && src1w >= SIMM_16BIT_MIN)) + || ((flags & LOGICAL_OP) && !(src1w & ~UIMM_16BIT_MAX))) { + flags |= SRC2_IMM; + src2_r = src1w; + + /* And swap arguments. */ + src1 = src2; + src1w = src2w; + src2 = SLJIT_IMM; + /* src2w = src2_r unneeded. */ + } + } + } + + /* Source 1. */ + if (FAST_IS_REG(src1)) { + src1_r = src1; + flags |= REG1_SOURCE; + } else if (src1 & SLJIT_IMM) { + if (src1w) { + FAIL_IF(load_immediate(compiler, TMP_REG1_mapped, src1w)); + src1_r = TMP_REG1; + } else + src1_r = 0; + } else { + if (getput_arg_fast(compiler, flags | LOAD_DATA, TMP_REG1_mapped, src1, src1w)) + FAIL_IF(compiler->error); + else + flags |= SLOW_SRC1; + src1_r = TMP_REG1; + } + + /* Source 2. */ + if (FAST_IS_REG(src2)) { + src2_r = src2; + flags |= REG2_SOURCE; + if (!(flags & REG_DEST) && op >= SLJIT_MOV && op <= SLJIT_MOVU_S32) + dst_r = src2_r; + } else if (src2 & SLJIT_IMM) { + if (!(flags & SRC2_IMM)) { + if (src2w) { + FAIL_IF(load_immediate(compiler, reg_map[sugg_src2_r], src2w)); + src2_r = sugg_src2_r; + } else { + src2_r = 0; + if ((op >= SLJIT_MOV && op <= SLJIT_MOVU_S32) && (dst & SLJIT_MEM)) + dst_r = 0; + } + } + } else { + if (getput_arg_fast(compiler, flags | LOAD_DATA, reg_map[sugg_src2_r], src2, src2w)) + FAIL_IF(compiler->error); + else + flags |= SLOW_SRC2; + src2_r = sugg_src2_r; + } + + if ((flags & (SLOW_SRC1 | SLOW_SRC2)) == (SLOW_SRC1 | SLOW_SRC2)) { + SLJIT_ASSERT(src2_r == TMP_REG2); + if (!can_cache(src1, src1w, src2, src2w) && can_cache(src1, src1w, dst, dstw)) { + FAIL_IF(getput_arg(compiler, flags | LOAD_DATA, TMP_REG2_mapped, src2, src2w, src1, src1w)); + FAIL_IF(getput_arg(compiler, flags | LOAD_DATA, TMP_REG1_mapped, src1, src1w, dst, dstw)); + } else { + FAIL_IF(getput_arg(compiler, flags | LOAD_DATA, TMP_REG1_mapped, src1, src1w, src2, src2w)); + FAIL_IF(getput_arg(compiler, flags | LOAD_DATA, TMP_REG2_mapped, src2, src2w, dst, dstw)); + } + } else if (flags & SLOW_SRC1) + FAIL_IF(getput_arg(compiler, flags | LOAD_DATA, TMP_REG1_mapped, src1, src1w, dst, dstw)); + else if (flags & SLOW_SRC2) + FAIL_IF(getput_arg(compiler, flags | LOAD_DATA, reg_map[sugg_src2_r], src2, src2w, dst, dstw)); + + FAIL_IF(emit_single_op(compiler, op, flags, dst_r, src1_r, src2_r)); + + if (dst & SLJIT_MEM) { + if (!(flags & SLOW_DEST)) { + getput_arg_fast(compiler, flags, reg_map[dst_r], dst, dstw); + return compiler->error; + } + + return getput_arg(compiler, flags, reg_map[dst_r], dst, dstw, 0, 0); + } + + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 dst, sljit_sw dstw, sljit_s32 src, sljit_sw srcw, sljit_s32 type) +{ + sljit_s32 sugg_dst_ar, dst_ar; + sljit_s32 flags = GET_ALL_FLAGS(op); + sljit_s32 mem_type = (op & SLJIT_I32_OP) ? (INT_DATA | SIGNED_DATA) : WORD_DATA; + + CHECK_ERROR(); + CHECK(check_sljit_emit_op_flags(compiler, op, dst, dstw, src, srcw, type)); + ADJUST_LOCAL_OFFSET(dst, dstw); + + op = GET_OPCODE(op); + if (op == SLJIT_MOV_S32 || op == SLJIT_MOV_U32) + mem_type = INT_DATA | SIGNED_DATA; + sugg_dst_ar = reg_map[(op < SLJIT_ADD && FAST_IS_REG(dst)) ? dst : TMP_REG2]; + + compiler->cache_arg = 0; + compiler->cache_argw = 0; + if (op >= SLJIT_ADD && (src & SLJIT_MEM)) { + ADJUST_LOCAL_OFFSET(src, srcw); + FAIL_IF(emit_op_mem2(compiler, mem_type | LOAD_DATA, TMP_REG1_mapped, src, srcw, dst, dstw)); + src = TMP_REG1; + srcw = 0; + } + + switch (type & 0xff) { + case SLJIT_EQUAL: + case SLJIT_NOT_EQUAL: + FAIL_IF(CMPLTUI(sugg_dst_ar, EQUAL_FLAG, 1)); + dst_ar = sugg_dst_ar; + break; + case SLJIT_LESS: + case SLJIT_GREATER_EQUAL: + dst_ar = ULESS_FLAG; + break; + case SLJIT_GREATER: + case SLJIT_LESS_EQUAL: + dst_ar = UGREATER_FLAG; + break; + case SLJIT_SIG_LESS: + case SLJIT_SIG_GREATER_EQUAL: + dst_ar = LESS_FLAG; + break; + case SLJIT_SIG_GREATER: + case SLJIT_SIG_LESS_EQUAL: + dst_ar = GREATER_FLAG; + break; + case SLJIT_OVERFLOW: + case SLJIT_NOT_OVERFLOW: + dst_ar = OVERFLOW_FLAG; + break; + case SLJIT_MUL_OVERFLOW: + case SLJIT_MUL_NOT_OVERFLOW: + FAIL_IF(CMPLTUI(sugg_dst_ar, OVERFLOW_FLAG, 1)); + dst_ar = sugg_dst_ar; + type ^= 0x1; /* Flip type bit for the XORI below. */ + break; + + default: + SLJIT_UNREACHABLE(); + dst_ar = sugg_dst_ar; + break; + } + + if (type & 0x1) { + FAIL_IF(XORI(sugg_dst_ar, dst_ar, 1)); + dst_ar = sugg_dst_ar; + } + + if (op >= SLJIT_ADD) { + if (TMP_REG2_mapped != dst_ar) + FAIL_IF(ADD(TMP_REG2_mapped, dst_ar, ZERO)); + return emit_op(compiler, op | flags, mem_type | CUMULATIVE_OP | LOGICAL_OP | IMM_OP | ALT_KEEP_CACHE, dst, dstw, src, srcw, TMP_REG2, 0); + } + + if (dst & SLJIT_MEM) + return emit_op_mem(compiler, mem_type, dst_ar, dst, dstw); + + if (sugg_dst_ar != dst_ar) + return ADD(sugg_dst_ar, dst_ar, ZERO); + + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compiler, sljit_s32 op) { + CHECK_ERROR(); + CHECK(check_sljit_emit_op0(compiler, op)); + + op = GET_OPCODE(op); + switch (op) { + case SLJIT_NOP: + return push_0_buffer(compiler, TILEGX_OPC_FNOP, __LINE__); + + case SLJIT_BREAKPOINT: + return PI(BPT); + + case SLJIT_LMUL_UW: + case SLJIT_LMUL_SW: + case SLJIT_DIVMOD_UW: + case SLJIT_DIVMOD_SW: + case SLJIT_DIV_UW: + case SLJIT_DIV_SW: + SLJIT_UNREACHABLE(); + } + + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 dst, sljit_sw dstw, sljit_s32 src, sljit_sw srcw) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw)); + ADJUST_LOCAL_OFFSET(dst, dstw); + ADJUST_LOCAL_OFFSET(src, srcw); + + switch (GET_OPCODE(op)) { + case SLJIT_MOV: + case SLJIT_MOV_P: + return emit_op(compiler, SLJIT_MOV, WORD_DATA, dst, dstw, TMP_REG1, 0, src, srcw); + + case SLJIT_MOV_U32: + return emit_op(compiler, SLJIT_MOV_U32, INT_DATA, dst, dstw, TMP_REG1, 0, src, srcw); + + case SLJIT_MOV_S32: + return emit_op(compiler, SLJIT_MOV_S32, INT_DATA | SIGNED_DATA, dst, dstw, TMP_REG1, 0, src, srcw); + + case SLJIT_MOV_U8: + return emit_op(compiler, SLJIT_MOV_U8, BYTE_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u8) srcw : srcw); + + case SLJIT_MOV_S8: + return emit_op(compiler, SLJIT_MOV_S8, BYTE_DATA | SIGNED_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s8) srcw : srcw); + + case SLJIT_MOV_U16: + return emit_op(compiler, SLJIT_MOV_U16, HALF_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u16) srcw : srcw); + + case SLJIT_MOV_S16: + return emit_op(compiler, SLJIT_MOV_S16, HALF_DATA | SIGNED_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s16) srcw : srcw); + + case SLJIT_MOVU: + case SLJIT_MOVU_P: + return emit_op(compiler, SLJIT_MOV, WORD_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, srcw); + + case SLJIT_MOVU_U32: + return emit_op(compiler, SLJIT_MOV_U32, INT_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, srcw); + + case SLJIT_MOVU_S32: + return emit_op(compiler, SLJIT_MOV_S32, INT_DATA | SIGNED_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, srcw); + + case SLJIT_MOVU_U8: + return emit_op(compiler, SLJIT_MOV_U8, BYTE_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u8) srcw : srcw); + + case SLJIT_MOVU_S8: + return emit_op(compiler, SLJIT_MOV_S8, BYTE_DATA | SIGNED_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s8) srcw : srcw); + + case SLJIT_MOVU_U16: + return emit_op(compiler, SLJIT_MOV_U16, HALF_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u16) srcw : srcw); + + case SLJIT_MOVU_S16: + return emit_op(compiler, SLJIT_MOV_S16, HALF_DATA | SIGNED_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s16) srcw : srcw); + + case SLJIT_NOT: + return emit_op(compiler, op, 0, dst, dstw, TMP_REG1, 0, src, srcw); + + case SLJIT_NEG: + return emit_op(compiler, SLJIT_SUB | GET_ALL_FLAGS(op), IMM_OP, dst, dstw, SLJIT_IMM, 0, src, srcw); + + case SLJIT_CLZ: + return emit_op(compiler, op, (op & SLJIT_I32_OP) ? INT_DATA : WORD_DATA, dst, dstw, TMP_REG1, 0, src, srcw); + } + + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 dst, sljit_sw dstw, sljit_s32 src1, sljit_sw src1w, sljit_s32 src2, sljit_sw src2w) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_op2(compiler, op, dst, dstw, src1, src1w, src2, src2w)); + ADJUST_LOCAL_OFFSET(dst, dstw); + ADJUST_LOCAL_OFFSET(src1, src1w); + ADJUST_LOCAL_OFFSET(src2, src2w); + + switch (GET_OPCODE(op)) { + case SLJIT_ADD: + case SLJIT_ADDC: + return emit_op(compiler, op, CUMULATIVE_OP | IMM_OP, dst, dstw, src1, src1w, src2, src2w); + + case SLJIT_SUB: + case SLJIT_SUBC: + return emit_op(compiler, op, IMM_OP, dst, dstw, src1, src1w, src2, src2w); + + case SLJIT_MUL: + return emit_op(compiler, op, CUMULATIVE_OP, dst, dstw, src1, src1w, src2, src2w); + + case SLJIT_AND: + case SLJIT_OR: + case SLJIT_XOR: + return emit_op(compiler, op, CUMULATIVE_OP | LOGICAL_OP | IMM_OP, dst, dstw, src1, src1w, src2, src2w); + + case SLJIT_SHL: + case SLJIT_LSHR: + case SLJIT_ASHR: + if (src2 & SLJIT_IMM) + src2w &= 0x3f; + if (op & SLJIT_I32_OP) + src2w &= 0x1f; + + return emit_op(compiler, op, IMM_OP, dst, dstw, src1, src1w, src2, src2w); + } + + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_label * sljit_emit_label(struct sljit_compiler *compiler) +{ + struct sljit_label *label; + + flush_buffer(compiler); + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_label(compiler)); + + if (compiler->last_label && compiler->last_label->size == compiler->size) + return compiler->last_label; + + label = (struct sljit_label *)ensure_abuf(compiler, sizeof(struct sljit_label)); + PTR_FAIL_IF(!label); + set_label(label, compiler); + return label; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 src, sljit_sw srcw) +{ + sljit_s32 src_r = TMP_REG2; + struct sljit_jump *jump = NULL; + + flush_buffer(compiler); + + CHECK_ERROR(); + CHECK(check_sljit_emit_ijump(compiler, type, src, srcw)); + ADJUST_LOCAL_OFFSET(src, srcw); + + if (FAST_IS_REG(src)) { + if (reg_map[src] != 0) + src_r = src; + else + FAIL_IF(ADD_SOLO(TMP_REG2_mapped, reg_map[src], ZERO)); + } + + if (type >= SLJIT_CALL0) { + SLJIT_ASSERT(reg_map[PIC_ADDR_REG] == 16 && PIC_ADDR_REG == TMP_REG2); + if (src & (SLJIT_IMM | SLJIT_MEM)) { + if (src & SLJIT_IMM) + FAIL_IF(emit_const(compiler, reg_map[PIC_ADDR_REG], srcw, 1)); + else { + SLJIT_ASSERT(src_r == TMP_REG2 && (src & SLJIT_MEM)); + FAIL_IF(emit_op(compiler, SLJIT_MOV, WORD_DATA, TMP_REG2, 0, TMP_REG1, 0, src, srcw)); + } + + FAIL_IF(ADD_SOLO(0, reg_map[SLJIT_R0], ZERO)); + + FAIL_IF(ADDI_SOLO(54, 54, -16)); + + FAIL_IF(JALR_SOLO(reg_map[PIC_ADDR_REG])); + + return ADDI_SOLO(54, 54, 16); + } + + /* Register input. */ + if (type >= SLJIT_CALL1) + FAIL_IF(ADD_SOLO(0, reg_map[SLJIT_R0], ZERO)); + + FAIL_IF(ADD_SOLO(reg_map[PIC_ADDR_REG], reg_map[src_r], ZERO)); + + FAIL_IF(ADDI_SOLO(54, 54, -16)); + + FAIL_IF(JALR_SOLO(reg_map[src_r])); + + return ADDI_SOLO(54, 54, 16); + } + + if (src & SLJIT_IMM) { + jump = (struct sljit_jump *)ensure_abuf(compiler, sizeof(struct sljit_jump)); + FAIL_IF(!jump); + set_jump(jump, compiler, JUMP_ADDR | ((type >= SLJIT_FAST_CALL) ? IS_JAL : 0)); + jump->u.target = srcw; + FAIL_IF(emit_const(compiler, TMP_REG2_mapped, 0, 1)); + + if (type >= SLJIT_FAST_CALL) { + FAIL_IF(ADD_SOLO(ZERO, ZERO, ZERO)); + jump->addr = compiler->size; + FAIL_IF(JR_SOLO(reg_map[src_r])); + } else { + jump->addr = compiler->size; + FAIL_IF(JR_SOLO(reg_map[src_r])); + } + + return SLJIT_SUCCESS; + + } else if (src & SLJIT_MEM) { + FAIL_IF(emit_op(compiler, SLJIT_MOV, WORD_DATA, TMP_REG2, 0, TMP_REG1, 0, src, srcw)); + flush_buffer(compiler); + } + + FAIL_IF(JR_SOLO(reg_map[src_r])); + + if (jump) + jump->addr = compiler->size; + + return SLJIT_SUCCESS; +} + +#define BR_Z(src) \ + inst = BEQZ_X1 | SRCA_X1(src); \ + flags = IS_COND; + +#define BR_NZ(src) \ + inst = BNEZ_X1 | SRCA_X1(src); \ + flags = IS_COND; + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump * sljit_emit_jump(struct sljit_compiler *compiler, sljit_s32 type) +{ + struct sljit_jump *jump; + sljit_ins inst; + sljit_s32 flags = 0; + + flush_buffer(compiler); + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_jump(compiler, type)); + + jump = (struct sljit_jump *)ensure_abuf(compiler, sizeof(struct sljit_jump)); + PTR_FAIL_IF(!jump); + set_jump(jump, compiler, type & SLJIT_REWRITABLE_JUMP); + type &= 0xff; + + switch (type) { + case SLJIT_EQUAL: + BR_NZ(EQUAL_FLAG); + break; + case SLJIT_NOT_EQUAL: + BR_Z(EQUAL_FLAG); + break; + case SLJIT_LESS: + BR_Z(ULESS_FLAG); + break; + case SLJIT_GREATER_EQUAL: + BR_NZ(ULESS_FLAG); + break; + case SLJIT_GREATER: + BR_Z(UGREATER_FLAG); + break; + case SLJIT_LESS_EQUAL: + BR_NZ(UGREATER_FLAG); + break; + case SLJIT_SIG_LESS: + BR_Z(LESS_FLAG); + break; + case SLJIT_SIG_GREATER_EQUAL: + BR_NZ(LESS_FLAG); + break; + case SLJIT_SIG_GREATER: + BR_Z(GREATER_FLAG); + break; + case SLJIT_SIG_LESS_EQUAL: + BR_NZ(GREATER_FLAG); + break; + case SLJIT_OVERFLOW: + case SLJIT_MUL_OVERFLOW: + BR_Z(OVERFLOW_FLAG); + break; + case SLJIT_NOT_OVERFLOW: + case SLJIT_MUL_NOT_OVERFLOW: + BR_NZ(OVERFLOW_FLAG); + break; + default: + /* Not conditional branch. */ + inst = 0; + break; + } + + jump->flags |= flags; + + if (inst) { + inst = inst | ((type <= SLJIT_JUMP) ? BOFF_X1(5) : BOFF_X1(6)); + PTR_FAIL_IF(PI(inst)); + } + + PTR_FAIL_IF(emit_const(compiler, TMP_REG2_mapped, 0, 1)); + if (type <= SLJIT_JUMP) { + jump->addr = compiler->size; + PTR_FAIL_IF(JR_SOLO(TMP_REG2_mapped)); + } else { + SLJIT_ASSERT(reg_map[PIC_ADDR_REG] == 16 && PIC_ADDR_REG == TMP_REG2); + /* Cannot be optimized out if type is >= CALL0. */ + jump->flags |= IS_JAL | (type >= SLJIT_CALL0 ? SLJIT_REWRITABLE_JUMP : 0); + PTR_FAIL_IF(ADD_SOLO(0, reg_map[SLJIT_R0], ZERO)); + jump->addr = compiler->size; + PTR_FAIL_IF(JALR_SOLO(TMP_REG2_mapped)); + } + + return jump; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 dst, sljit_sw dstw, sljit_s32 src, sljit_sw srcw) +{ + SLJIT_UNREACHABLE(); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 dst, sljit_sw dstw, sljit_s32 src1, sljit_sw src1w, sljit_s32 src2, sljit_sw src2w) +{ + SLJIT_UNREACHABLE(); +} + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_const * sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw init_value) +{ + struct sljit_const *const_; + sljit_s32 reg; + + flush_buffer(compiler); + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value)); + ADJUST_LOCAL_OFFSET(dst, dstw); + + const_ = (struct sljit_const *)ensure_abuf(compiler, sizeof(struct sljit_const)); + PTR_FAIL_IF(!const_); + set_const(const_, compiler); + + reg = FAST_IS_REG(dst) ? dst : TMP_REG2; + + PTR_FAIL_IF(emit_const_64(compiler, reg, init_value, 1)); + + if (dst & SLJIT_MEM) + PTR_FAIL_IF(emit_op(compiler, SLJIT_MOV, WORD_DATA, dst, dstw, TMP_REG1, 0, TMP_REG2, 0)); + return const_; +} + +SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target) +{ + sljit_ins *inst = (sljit_ins *)addr; + + inst[0] = (inst[0] & ~(0xFFFFL << 43)) | (((new_target >> 32) & 0xffff) << 43); + inst[1] = (inst[1] & ~(0xFFFFL << 43)) | (((new_target >> 16) & 0xffff) << 43); + inst[2] = (inst[2] & ~(0xFFFFL << 43)) | ((new_target & 0xffff) << 43); + SLJIT_CACHE_FLUSH(inst, inst + 3); +} + +SLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_constant) +{ + sljit_ins *inst = (sljit_ins *)addr; + + inst[0] = (inst[0] & ~(0xFFFFL << 43)) | (((new_constant >> 48) & 0xFFFFL) << 43); + inst[1] = (inst[1] & ~(0xFFFFL << 43)) | (((new_constant >> 32) & 0xFFFFL) << 43); + inst[2] = (inst[2] & ~(0xFFFFL << 43)) | (((new_constant >> 16) & 0xFFFFL) << 43); + inst[3] = (inst[3] & ~(0xFFFFL << 43)) | ((new_constant & 0xFFFFL) << 43); + SLJIT_CACHE_FLUSH(inst, inst + 4); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg) +{ + CHECK_REG_INDEX(check_sljit_get_register_index(reg)); + return reg_map[reg]; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler, + void *instruction, sljit_s32 size) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_op_custom(compiler, instruction, size)); + return SLJIT_ERR_UNSUPPORTED; +} + diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeX86_32.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeX86_32.c new file mode 100755 index 000000000..34a3a3d94 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeX86_32.c @@ -0,0 +1,896 @@ +/* + * Stack-less Just-In-Time compiler + * + * Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* x86 32-bit arch dependent functions. */ + +static sljit_s32 emit_do_imm(struct sljit_compiler *compiler, sljit_u8 opcode, sljit_sw imm) +{ + sljit_u8 *inst; + + inst = (sljit_u8*)ensure_buf(compiler, 1 + 1 + sizeof(sljit_sw)); + FAIL_IF(!inst); + INC_SIZE(1 + sizeof(sljit_sw)); + *inst++ = opcode; + sljit_unaligned_store_sw(inst, imm); + return SLJIT_SUCCESS; +} + +static sljit_u8* generate_far_jump_code(struct sljit_jump *jump, sljit_u8 *code_ptr, sljit_sw executable_offset) +{ + sljit_s32 type = jump->flags >> TYPE_SHIFT; + + if (type == SLJIT_JUMP) { + *code_ptr++ = JMP_i32; + jump->addr++; + } + else if (type >= SLJIT_FAST_CALL) { + *code_ptr++ = CALL_i32; + jump->addr++; + } + else { + *code_ptr++ = GROUP_0F; + *code_ptr++ = get_jump_code(type); + jump->addr += 2; + } + + if (jump->flags & JUMP_LABEL) + jump->flags |= PATCH_MW; + else + sljit_unaligned_store_sw(code_ptr, jump->u.target - (jump->addr + 4) - (sljit_uw)executable_offset); + code_ptr += 4; + + return code_ptr; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compiler, + sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds, + sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size) +{ + sljit_s32 args, size; + sljit_u8 *inst; + + CHECK_ERROR(); + CHECK(check_sljit_emit_enter(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size)); + set_emit_enter(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size); + + args = get_arg_count(arg_types); + compiler->args = args; + + /* [esp+0] for saving temporaries and function calls. */ + compiler->stack_tmp_size = 2 * sizeof(sljit_sw); + +#if !(defined SLJIT_X86_32_FASTCALL && SLJIT_X86_32_FASTCALL) + if (scratches > 3) + compiler->stack_tmp_size = 3 * sizeof(sljit_sw); +#endif + + compiler->saveds_offset = compiler->stack_tmp_size; + if (scratches > 3) + compiler->saveds_offset += ((scratches > (3 + 6)) ? 6 : (scratches - 3)) * sizeof(sljit_sw); + + compiler->locals_offset = compiler->saveds_offset; + + if (saveds > 3) + compiler->locals_offset += (saveds - 3) * sizeof(sljit_sw); + + if (options & SLJIT_F64_ALIGNMENT) + compiler->locals_offset = (compiler->locals_offset + sizeof(sljit_f64) - 1) & ~(sizeof(sljit_f64) - 1); + + size = 1 + (scratches > 9 ? (scratches - 9) : 0) + (saveds <= 3 ? saveds : 3); +#if (defined SLJIT_X86_32_FASTCALL && SLJIT_X86_32_FASTCALL) + size += (args > 0 ? (args * 2) : 0) + (args > 2 ? 2 : 0); +#else + size += (args > 0 ? (2 + args * 3) : 0); +#endif + inst = (sljit_u8*)ensure_buf(compiler, 1 + size); + FAIL_IF(!inst); + + INC_SIZE(size); + PUSH_REG(reg_map[TMP_REG1]); +#if !(defined SLJIT_X86_32_FASTCALL && SLJIT_X86_32_FASTCALL) + if (args > 0) { + *inst++ = MOV_r_rm; + *inst++ = MOD_REG | (reg_map[TMP_REG1] << 3) | 0x4 /* esp */; + } +#endif + if (saveds > 2 || scratches > 9) + PUSH_REG(reg_map[SLJIT_S2]); + if (saveds > 1 || scratches > 10) + PUSH_REG(reg_map[SLJIT_S1]); + if (saveds > 0 || scratches > 11) + PUSH_REG(reg_map[SLJIT_S0]); + +#if (defined SLJIT_X86_32_FASTCALL && SLJIT_X86_32_FASTCALL) + if (args > 0) { + inst[0] = MOV_r_rm; + inst[1] = MOD_REG | (reg_map[SLJIT_S0] << 3) | reg_map[SLJIT_R2]; + inst += 2; + } + if (args > 1) { + inst[0] = MOV_r_rm; + inst[1] = MOD_REG | (reg_map[SLJIT_S1] << 3) | reg_map[SLJIT_R1]; + inst += 2; + } + if (args > 2) { + inst[0] = MOV_r_rm; + inst[1] = MOD_DISP8 | (reg_map[SLJIT_S2] << 3) | 0x4 /* esp */; + inst[2] = 0x24; + inst[3] = sizeof(sljit_sw) * (3 + 2); /* saveds >= 3 as well. */ + } +#else + if (args > 0) { + inst[0] = MOV_r_rm; + inst[1] = MOD_DISP8 | (reg_map[SLJIT_S0] << 3) | reg_map[TMP_REG1]; + inst[2] = sizeof(sljit_sw) * 2; + inst += 3; + } + if (args > 1) { + inst[0] = MOV_r_rm; + inst[1] = MOD_DISP8 | (reg_map[SLJIT_S1] << 3) | reg_map[TMP_REG1]; + inst[2] = sizeof(sljit_sw) * 3; + inst += 3; + } + if (args > 2) { + inst[0] = MOV_r_rm; + inst[1] = MOD_DISP8 | (reg_map[SLJIT_S2] << 3) | reg_map[TMP_REG1]; + inst[2] = sizeof(sljit_sw) * 4; + } +#endif + + SLJIT_ASSERT(SLJIT_LOCALS_OFFSET > 0); + +#if defined(__APPLE__) + /* Ignore pushed registers and SLJIT_LOCALS_OFFSET when computing the aligned local size. */ + saveds = (2 + (scratches > 9 ? (scratches - 9) : 0) + (saveds <= 3 ? saveds : 3)) * sizeof(sljit_uw); + local_size = ((SLJIT_LOCALS_OFFSET + saveds + local_size + 15) & ~15) - saveds; +#else + if (options & SLJIT_F64_ALIGNMENT) + local_size = SLJIT_LOCALS_OFFSET + ((local_size + sizeof(sljit_f64) - 1) & ~(sizeof(sljit_f64) - 1)); + else + local_size = SLJIT_LOCALS_OFFSET + ((local_size + sizeof(sljit_sw) - 1) & ~(sizeof(sljit_sw) - 1)); +#endif + + compiler->local_size = local_size; + +#ifdef _WIN32 + if (local_size > 0) { + if (local_size <= 4 * 4096) { + if (local_size > 4096) + EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_MEM1(SLJIT_SP), -4096); + if (local_size > 2 * 4096) + EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_MEM1(SLJIT_SP), -4096 * 2); + if (local_size > 3 * 4096) + EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_MEM1(SLJIT_SP), -4096 * 3); + } + else { + EMIT_MOV(compiler, SLJIT_R0, 0, SLJIT_SP, 0); + EMIT_MOV(compiler, SLJIT_R1, 0, SLJIT_IMM, (local_size - 1) >> 12); + + SLJIT_ASSERT (reg_map[SLJIT_R0] == 0); + + EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_MEM1(SLJIT_R0), -4096); + FAIL_IF(emit_non_cum_binary(compiler, BINARY_OPCODE(SUB), + SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 4096)); + FAIL_IF(emit_non_cum_binary(compiler, BINARY_OPCODE(SUB), + SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_IMM, 1)); + + inst = (sljit_u8*)ensure_buf(compiler, 1 + 2); + FAIL_IF(!inst); + + INC_SIZE(2); + inst[0] = JNE_i8; + inst[1] = (sljit_s8) -16; + } + + EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_MEM1(SLJIT_SP), -local_size); + } +#endif + + SLJIT_ASSERT(local_size > 0); + +#if !defined(__APPLE__) + if (options & SLJIT_F64_ALIGNMENT) { + EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_SP, 0); + + /* Some space might allocated during sljit_grow_stack() above on WIN32. */ + FAIL_IF(emit_non_cum_binary(compiler, BINARY_OPCODE(SUB), + SLJIT_SP, 0, SLJIT_SP, 0, SLJIT_IMM, local_size + sizeof(sljit_sw))); + +#if defined _WIN32 && !(defined SLJIT_X86_32_FASTCALL && SLJIT_X86_32_FASTCALL) + if (compiler->local_size > 1024) + FAIL_IF(emit_cum_binary(compiler, BINARY_OPCODE(ADD), + TMP_REG1, 0, TMP_REG1, 0, SLJIT_IMM, sizeof(sljit_sw))); +#endif + + inst = (sljit_u8*)ensure_buf(compiler, 1 + 6); + FAIL_IF(!inst); + + INC_SIZE(6); + inst[0] = GROUP_BINARY_81; + inst[1] = MOD_REG | AND | reg_map[SLJIT_SP]; + sljit_unaligned_store_sw(inst + 2, ~(sizeof(sljit_f64) - 1)); + + /* The real local size must be used. */ + return emit_mov(compiler, SLJIT_MEM1(SLJIT_SP), compiler->local_size, TMP_REG1, 0); + } +#endif + return emit_non_cum_binary(compiler, BINARY_OPCODE(SUB), + SLJIT_SP, 0, SLJIT_SP, 0, SLJIT_IMM, local_size); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_set_context(struct sljit_compiler *compiler, + sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds, + sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size) +{ + CHECK_ERROR(); + CHECK(check_sljit_set_context(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size)); + set_set_context(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size); + + compiler->args = get_arg_count(arg_types); + + /* [esp+0] for saving temporaries and function calls. */ + compiler->stack_tmp_size = 2 * sizeof(sljit_sw); + +#if !(defined SLJIT_X86_32_FASTCALL && SLJIT_X86_32_FASTCALL) + if (scratches > 3) + compiler->stack_tmp_size = 3 * sizeof(sljit_sw); +#endif + + compiler->saveds_offset = compiler->stack_tmp_size; + if (scratches > 3) + compiler->saveds_offset += ((scratches > (3 + 6)) ? 6 : (scratches - 3)) * sizeof(sljit_sw); + + compiler->locals_offset = compiler->saveds_offset; + + if (saveds > 3) + compiler->locals_offset += (saveds - 3) * sizeof(sljit_sw); + + if (options & SLJIT_F64_ALIGNMENT) + compiler->locals_offset = (compiler->locals_offset + sizeof(sljit_f64) - 1) & ~(sizeof(sljit_f64) - 1); + +#if defined(__APPLE__) + saveds = (2 + (scratches > 9 ? (scratches - 9) : 0) + (saveds <= 3 ? saveds : 3)) * sizeof(sljit_uw); + compiler->local_size = ((SLJIT_LOCALS_OFFSET + saveds + local_size + 15) & ~15) - saveds; +#else + if (options & SLJIT_F64_ALIGNMENT) + compiler->local_size = SLJIT_LOCALS_OFFSET + ((local_size + sizeof(sljit_f64) - 1) & ~(sizeof(sljit_f64) - 1)); + else + compiler->local_size = SLJIT_LOCALS_OFFSET + ((local_size + sizeof(sljit_sw) - 1) & ~(sizeof(sljit_sw) - 1)); +#endif + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw) +{ + sljit_s32 size; + sljit_u8 *inst; + + CHECK_ERROR(); + CHECK(check_sljit_emit_return(compiler, op, src, srcw)); + SLJIT_ASSERT(compiler->args >= 0); + + FAIL_IF(emit_mov_before_return(compiler, op, src, srcw)); + + SLJIT_ASSERT(compiler->local_size > 0); + +#if !defined(__APPLE__) + if (compiler->options & SLJIT_F64_ALIGNMENT) + EMIT_MOV(compiler, SLJIT_SP, 0, SLJIT_MEM1(SLJIT_SP), compiler->local_size) + else + FAIL_IF(emit_cum_binary(compiler, BINARY_OPCODE(ADD), + SLJIT_SP, 0, SLJIT_SP, 0, SLJIT_IMM, compiler->local_size)); +#else + FAIL_IF(emit_cum_binary(compiler, BINARY_OPCODE(ADD), + SLJIT_SP, 0, SLJIT_SP, 0, SLJIT_IMM, compiler->local_size)); +#endif + + size = 2 + (compiler->scratches > 7 ? (compiler->scratches - 7) : 0) + + (compiler->saveds <= 3 ? compiler->saveds : 3); +#if (defined SLJIT_X86_32_FASTCALL && SLJIT_X86_32_FASTCALL) + if (compiler->args > 2) + size += 2; +#else + if (compiler->args > 0) + size += 2; +#endif + inst = (sljit_u8*)ensure_buf(compiler, 1 + size); + FAIL_IF(!inst); + + INC_SIZE(size); + + if (compiler->saveds > 0 || compiler->scratches > 11) + POP_REG(reg_map[SLJIT_S0]); + if (compiler->saveds > 1 || compiler->scratches > 10) + POP_REG(reg_map[SLJIT_S1]); + if (compiler->saveds > 2 || compiler->scratches > 9) + POP_REG(reg_map[SLJIT_S2]); + POP_REG(reg_map[TMP_REG1]); +#if (defined SLJIT_X86_32_FASTCALL && SLJIT_X86_32_FASTCALL) + if (compiler->args > 2) + RET_I16(sizeof(sljit_sw)); + else + RET(); +#else + RET(); +#endif + + return SLJIT_SUCCESS; +} + +/* --------------------------------------------------------------------- */ +/* Operators */ +/* --------------------------------------------------------------------- */ + +/* Size contains the flags as well. */ +static sljit_u8* emit_x86_instruction(struct sljit_compiler *compiler, sljit_s32 size, + /* The register or immediate operand. */ + sljit_s32 a, sljit_sw imma, + /* The general operand (not immediate). */ + sljit_s32 b, sljit_sw immb) +{ + sljit_u8 *inst; + sljit_u8 *buf_ptr; + sljit_s32 flags = size & ~0xf; + sljit_s32 inst_size; + + /* Both cannot be switched on. */ + SLJIT_ASSERT((flags & (EX86_BIN_INS | EX86_SHIFT_INS)) != (EX86_BIN_INS | EX86_SHIFT_INS)); + /* Size flags not allowed for typed instructions. */ + SLJIT_ASSERT(!(flags & (EX86_BIN_INS | EX86_SHIFT_INS)) || (flags & (EX86_BYTE_ARG | EX86_HALF_ARG)) == 0); + /* Both size flags cannot be switched on. */ + SLJIT_ASSERT((flags & (EX86_BYTE_ARG | EX86_HALF_ARG)) != (EX86_BYTE_ARG | EX86_HALF_ARG)); + /* SSE2 and immediate is not possible. */ + SLJIT_ASSERT(!(a & SLJIT_IMM) || !(flags & EX86_SSE2)); + SLJIT_ASSERT((flags & (EX86_PREF_F2 | EX86_PREF_F3)) != (EX86_PREF_F2 | EX86_PREF_F3) + && (flags & (EX86_PREF_F2 | EX86_PREF_66)) != (EX86_PREF_F2 | EX86_PREF_66) + && (flags & (EX86_PREF_F3 | EX86_PREF_66)) != (EX86_PREF_F3 | EX86_PREF_66)); + + size &= 0xf; + inst_size = size; + + if (flags & (EX86_PREF_F2 | EX86_PREF_F3)) + inst_size++; + if (flags & EX86_PREF_66) + inst_size++; + + /* Calculate size of b. */ + inst_size += 1; /* mod r/m byte. */ + if (b & SLJIT_MEM) { + if ((b & REG_MASK) == SLJIT_UNUSED) + inst_size += sizeof(sljit_sw); + else if (immb != 0 && !(b & OFFS_REG_MASK)) { + /* Immediate operand. */ + if (immb <= 127 && immb >= -128) + inst_size += sizeof(sljit_s8); + else + inst_size += sizeof(sljit_sw); + } + + if ((b & REG_MASK) == SLJIT_SP && !(b & OFFS_REG_MASK)) + b |= TO_OFFS_REG(SLJIT_SP); + + if ((b & OFFS_REG_MASK) != SLJIT_UNUSED) + inst_size += 1; /* SIB byte. */ + } + + /* Calculate size of a. */ + if (a & SLJIT_IMM) { + if (flags & EX86_BIN_INS) { + if (imma <= 127 && imma >= -128) { + inst_size += 1; + flags |= EX86_BYTE_ARG; + } else + inst_size += 4; + } + else if (flags & EX86_SHIFT_INS) { + imma &= 0x1f; + if (imma != 1) { + inst_size ++; + flags |= EX86_BYTE_ARG; + } + } else if (flags & EX86_BYTE_ARG) + inst_size++; + else if (flags & EX86_HALF_ARG) + inst_size += sizeof(short); + else + inst_size += sizeof(sljit_sw); + } + else + SLJIT_ASSERT(!(flags & EX86_SHIFT_INS) || a == SLJIT_PREF_SHIFT_REG); + + inst = (sljit_u8*)ensure_buf(compiler, 1 + inst_size); + PTR_FAIL_IF(!inst); + + /* Encoding the byte. */ + INC_SIZE(inst_size); + if (flags & EX86_PREF_F2) + *inst++ = 0xf2; + if (flags & EX86_PREF_F3) + *inst++ = 0xf3; + if (flags & EX86_PREF_66) + *inst++ = 0x66; + + buf_ptr = inst + size; + + /* Encode mod/rm byte. */ + if (!(flags & EX86_SHIFT_INS)) { + if ((flags & EX86_BIN_INS) && (a & SLJIT_IMM)) + *inst = (flags & EX86_BYTE_ARG) ? GROUP_BINARY_83 : GROUP_BINARY_81; + + if (a & SLJIT_IMM) + *buf_ptr = 0; + else if (!(flags & EX86_SSE2_OP1)) + *buf_ptr = reg_map[a] << 3; + else + *buf_ptr = a << 3; + } + else { + if (a & SLJIT_IMM) { + if (imma == 1) + *inst = GROUP_SHIFT_1; + else + *inst = GROUP_SHIFT_N; + } else + *inst = GROUP_SHIFT_CL; + *buf_ptr = 0; + } + + if (!(b & SLJIT_MEM)) + *buf_ptr++ |= MOD_REG + ((!(flags & EX86_SSE2_OP2)) ? reg_map[b] : b); + else if ((b & REG_MASK) != SLJIT_UNUSED) { + if ((b & OFFS_REG_MASK) == SLJIT_UNUSED || (b & OFFS_REG_MASK) == TO_OFFS_REG(SLJIT_SP)) { + if (immb != 0) { + if (immb <= 127 && immb >= -128) + *buf_ptr |= 0x40; + else + *buf_ptr |= 0x80; + } + + if ((b & OFFS_REG_MASK) == SLJIT_UNUSED) + *buf_ptr++ |= reg_map[b & REG_MASK]; + else { + *buf_ptr++ |= 0x04; + *buf_ptr++ = reg_map[b & REG_MASK] | (reg_map[OFFS_REG(b)] << 3); + } + + if (immb != 0) { + if (immb <= 127 && immb >= -128) + *buf_ptr++ = immb; /* 8 bit displacement. */ + else { + sljit_unaligned_store_sw(buf_ptr, immb); /* 32 bit displacement. */ + buf_ptr += sizeof(sljit_sw); + } + } + } + else { + *buf_ptr++ |= 0x04; + *buf_ptr++ = reg_map[b & REG_MASK] | (reg_map[OFFS_REG(b)] << 3) | (immb << 6); + } + } + else { + *buf_ptr++ |= 0x05; + sljit_unaligned_store_sw(buf_ptr, immb); /* 32 bit displacement. */ + buf_ptr += sizeof(sljit_sw); + } + + if (a & SLJIT_IMM) { + if (flags & EX86_BYTE_ARG) + *buf_ptr = imma; + else if (flags & EX86_HALF_ARG) + sljit_unaligned_store_s16(buf_ptr, imma); + else if (!(flags & EX86_SHIFT_INS)) + sljit_unaligned_store_sw(buf_ptr, imma); + } + + return !(flags & EX86_SHIFT_INS) ? inst : (inst + 1); +} + +/* --------------------------------------------------------------------- */ +/* Call / return instructions */ +/* --------------------------------------------------------------------- */ + +#if (defined SLJIT_X86_32_FASTCALL && SLJIT_X86_32_FASTCALL) + +static sljit_s32 c_fast_call_get_stack_size(sljit_s32 arg_types, sljit_s32 *word_arg_count_ptr) +{ + sljit_s32 stack_size = 0; + sljit_s32 word_arg_count = 0; + + arg_types >>= SLJIT_DEF_SHIFT; + + while (arg_types) { + switch (arg_types & SLJIT_DEF_MASK) { + case SLJIT_ARG_TYPE_F32: + stack_size += sizeof(sljit_f32); + break; + case SLJIT_ARG_TYPE_F64: + stack_size += sizeof(sljit_f64); + break; + default: + word_arg_count++; + if (word_arg_count > 2) + stack_size += sizeof(sljit_sw); + break; + } + + arg_types >>= SLJIT_DEF_SHIFT; + } + + if (word_arg_count_ptr) + *word_arg_count_ptr = word_arg_count; + + return stack_size; +} + +static sljit_s32 c_fast_call_with_args(struct sljit_compiler *compiler, + sljit_s32 arg_types, sljit_s32 stack_size, sljit_s32 word_arg_count, sljit_s32 swap_args) +{ + sljit_u8 *inst; + sljit_s32 float_arg_count; + + if (stack_size == sizeof(sljit_sw) && word_arg_count == 3) { + inst = (sljit_u8*)ensure_buf(compiler, 1 + 1); + FAIL_IF(!inst); + INC_SIZE(1); + PUSH_REG(reg_map[SLJIT_R2]); + } + else if (stack_size > 0) { + if (word_arg_count >= 4) + EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_MEM1(SLJIT_SP), compiler->saveds_offset - sizeof(sljit_sw)); + + FAIL_IF(emit_non_cum_binary(compiler, BINARY_OPCODE(SUB), + SLJIT_SP, 0, SLJIT_SP, 0, SLJIT_IMM, stack_size)); + + stack_size = 0; + arg_types >>= SLJIT_DEF_SHIFT; + word_arg_count = 0; + float_arg_count = 0; + while (arg_types) { + switch (arg_types & SLJIT_DEF_MASK) { + case SLJIT_ARG_TYPE_F32: + float_arg_count++; + FAIL_IF(emit_sse2_store(compiler, 1, SLJIT_MEM1(SLJIT_SP), stack_size, float_arg_count)); + stack_size += sizeof(sljit_f32); + break; + case SLJIT_ARG_TYPE_F64: + float_arg_count++; + FAIL_IF(emit_sse2_store(compiler, 0, SLJIT_MEM1(SLJIT_SP), stack_size, float_arg_count)); + stack_size += sizeof(sljit_f64); + break; + default: + word_arg_count++; + if (word_arg_count == 3) { + EMIT_MOV(compiler, SLJIT_MEM1(SLJIT_SP), stack_size, SLJIT_R2, 0); + stack_size += sizeof(sljit_sw); + } + else if (word_arg_count == 4) { + EMIT_MOV(compiler, SLJIT_MEM1(SLJIT_SP), stack_size, TMP_REG1, 0); + stack_size += sizeof(sljit_sw); + } + break; + } + + arg_types >>= SLJIT_DEF_SHIFT; + } + } + + if (word_arg_count > 0) { + if (swap_args) { + inst = (sljit_u8*)ensure_buf(compiler, 1 + 1); + FAIL_IF(!inst); + INC_SIZE(1); + + *inst++ = XCHG_EAX_r | reg_map[SLJIT_R2]; + } + else { + inst = (sljit_u8*)ensure_buf(compiler, 1 + 2); + FAIL_IF(!inst); + INC_SIZE(2); + + *inst++ = MOV_r_rm; + *inst++ = MOD_REG | (reg_map[SLJIT_R2] << 3) | reg_map[SLJIT_R0]; + } + } + + return SLJIT_SUCCESS; +} + +#endif + +static sljit_s32 cdecl_call_get_stack_size(struct sljit_compiler *compiler, sljit_s32 arg_types, sljit_s32 *word_arg_count_ptr) +{ + sljit_s32 stack_size = 0; + sljit_s32 word_arg_count = 0; + + arg_types >>= SLJIT_DEF_SHIFT; + + while (arg_types) { + switch (arg_types & SLJIT_DEF_MASK) { + case SLJIT_ARG_TYPE_F32: + stack_size += sizeof(sljit_f32); + break; + case SLJIT_ARG_TYPE_F64: + stack_size += sizeof(sljit_f64); + break; + default: + word_arg_count++; + stack_size += sizeof(sljit_sw); + break; + } + + arg_types >>= SLJIT_DEF_SHIFT; + } + + if (word_arg_count_ptr) + *word_arg_count_ptr = word_arg_count; + + if (stack_size <= compiler->stack_tmp_size) + return 0; + +#if defined(__APPLE__) + return ((stack_size - compiler->stack_tmp_size + 15) & ~15); +#else + return stack_size - compiler->stack_tmp_size; +#endif +} + +static sljit_s32 cdecl_call_with_args(struct sljit_compiler *compiler, + sljit_s32 arg_types, sljit_s32 stack_size, sljit_s32 word_arg_count) +{ + sljit_s32 float_arg_count = 0; + + if (word_arg_count >= 4) + EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_MEM1(SLJIT_SP), compiler->saveds_offset - sizeof(sljit_sw)); + + if (stack_size > 0) + FAIL_IF(emit_non_cum_binary(compiler, BINARY_OPCODE(SUB), + SLJIT_SP, 0, SLJIT_SP, 0, SLJIT_IMM, stack_size)); + + stack_size = 0; + word_arg_count = 0; + arg_types >>= SLJIT_DEF_SHIFT; + + while (arg_types) { + switch (arg_types & SLJIT_DEF_MASK) { + case SLJIT_ARG_TYPE_F32: + float_arg_count++; + FAIL_IF(emit_sse2_store(compiler, 1, SLJIT_MEM1(SLJIT_SP), stack_size, float_arg_count)); + stack_size += sizeof(sljit_f32); + break; + case SLJIT_ARG_TYPE_F64: + float_arg_count++; + FAIL_IF(emit_sse2_store(compiler, 0, SLJIT_MEM1(SLJIT_SP), stack_size, float_arg_count)); + stack_size += sizeof(sljit_f64); + break; + default: + word_arg_count++; + EMIT_MOV(compiler, SLJIT_MEM1(SLJIT_SP), stack_size, (word_arg_count >= 4) ? TMP_REG1 : word_arg_count, 0); + stack_size += sizeof(sljit_sw); + break; + } + + arg_types >>= SLJIT_DEF_SHIFT; + } + + return SLJIT_SUCCESS; +} + +static sljit_s32 post_call_with_args(struct sljit_compiler *compiler, + sljit_s32 arg_types, sljit_s32 stack_size) +{ + sljit_u8 *inst; + sljit_s32 single; + + if (stack_size > 0) + FAIL_IF(emit_cum_binary(compiler, BINARY_OPCODE(ADD), + SLJIT_SP, 0, SLJIT_SP, 0, SLJIT_IMM, stack_size)); + + if ((arg_types & SLJIT_DEF_MASK) < SLJIT_ARG_TYPE_F32) + return SLJIT_SUCCESS; + + single = ((arg_types & SLJIT_DEF_MASK) == SLJIT_ARG_TYPE_F32); + + inst = (sljit_u8*)ensure_buf(compiler, 1 + 3); + FAIL_IF(!inst); + INC_SIZE(3); + inst[0] = single ? FSTPS : FSTPD; + inst[1] = (0x03 << 3) | 0x04; + inst[2] = (0x04 << 3) | reg_map[SLJIT_SP]; + + return emit_sse2_load(compiler, single, SLJIT_FR0, SLJIT_MEM1(SLJIT_SP), 0); +} + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_call(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 arg_types) +{ + struct sljit_jump *jump; + sljit_s32 stack_size = 0; + sljit_s32 word_arg_count; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_call(compiler, type, arg_types)); + +#if (defined SLJIT_X86_32_FASTCALL && SLJIT_X86_32_FASTCALL) + if ((type & 0xff) == SLJIT_CALL) { + stack_size = c_fast_call_get_stack_size(arg_types, &word_arg_count); + PTR_FAIL_IF(c_fast_call_with_args(compiler, arg_types, stack_size, word_arg_count, 0)); + +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \ + || (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + compiler->skip_checks = 1; +#endif + + jump = sljit_emit_jump(compiler, type); + PTR_FAIL_IF(jump == NULL); + + PTR_FAIL_IF(post_call_with_args(compiler, arg_types, 0)); + return jump; + } +#endif + + stack_size = cdecl_call_get_stack_size(compiler, arg_types, &word_arg_count); + PTR_FAIL_IF(cdecl_call_with_args(compiler, arg_types, stack_size, word_arg_count)); + +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \ + || (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + compiler->skip_checks = 1; +#endif + + jump = sljit_emit_jump(compiler, type); + PTR_FAIL_IF(jump == NULL); + + PTR_FAIL_IF(post_call_with_args(compiler, arg_types, stack_size)); + return jump; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_icall(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 arg_types, + sljit_s32 src, sljit_sw srcw) +{ + sljit_s32 stack_size = 0; + sljit_s32 word_arg_count; +#if (defined SLJIT_X86_32_FASTCALL && SLJIT_X86_32_FASTCALL) + sljit_s32 swap_args; +#endif + + CHECK_ERROR(); + CHECK(check_sljit_emit_icall(compiler, type, arg_types, src, srcw)); + +#if (defined SLJIT_X86_32_FASTCALL && SLJIT_X86_32_FASTCALL) + SLJIT_ASSERT(reg_map[SLJIT_R0] == 0 && reg_map[SLJIT_R2] == 1 && SLJIT_R0 == 1 && SLJIT_R2 == 3); + + if ((type & 0xff) == SLJIT_CALL) { + stack_size = c_fast_call_get_stack_size(arg_types, &word_arg_count); + swap_args = 0; + + if (word_arg_count > 0) { + if ((src & REG_MASK) == SLJIT_R2 || OFFS_REG(src) == SLJIT_R2) { + swap_args = 1; + if (((src & REG_MASK) | 0x2) == SLJIT_R2) + src ^= 0x2; + if ((OFFS_REG(src) | 0x2) == SLJIT_R2) + src ^= TO_OFFS_REG(0x2); + } + } + + FAIL_IF(c_fast_call_with_args(compiler, arg_types, stack_size, word_arg_count, swap_args)); + + compiler->saveds_offset += stack_size; + compiler->locals_offset += stack_size; + +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \ + || (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + compiler->skip_checks = 1; +#endif + FAIL_IF(sljit_emit_ijump(compiler, type, src, srcw)); + + compiler->saveds_offset -= stack_size; + compiler->locals_offset -= stack_size; + + return post_call_with_args(compiler, arg_types, 0); + } +#endif + + stack_size = cdecl_call_get_stack_size(compiler, arg_types, &word_arg_count); + FAIL_IF(cdecl_call_with_args(compiler, arg_types, stack_size, word_arg_count)); + + compiler->saveds_offset += stack_size; + compiler->locals_offset += stack_size; + +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \ + || (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + compiler->skip_checks = 1; +#endif + FAIL_IF(sljit_emit_ijump(compiler, type, src, srcw)); + + compiler->saveds_offset -= stack_size; + compiler->locals_offset -= stack_size; + + return post_call_with_args(compiler, arg_types, stack_size); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw) +{ + sljit_u8 *inst; + + CHECK_ERROR(); + CHECK(check_sljit_emit_fast_enter(compiler, dst, dstw)); + ADJUST_LOCAL_OFFSET(dst, dstw); + + CHECK_EXTRA_REGS(dst, dstw, (void)0); + + /* For UNUSED dst. Uncommon, but possible. */ + if (dst == SLJIT_UNUSED) + dst = TMP_REG1; + + if (FAST_IS_REG(dst)) { + /* Unused dest is possible here. */ + inst = (sljit_u8*)ensure_buf(compiler, 1 + 1); + FAIL_IF(!inst); + + INC_SIZE(1); + POP_REG(reg_map[dst]); + return SLJIT_SUCCESS; + } + + /* Memory. */ + inst = emit_x86_instruction(compiler, 1, 0, 0, dst, dstw); + FAIL_IF(!inst); + *inst++ = POP_rm; + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw) +{ + sljit_u8 *inst; + + CHECK_ERROR(); + CHECK(check_sljit_emit_fast_return(compiler, src, srcw)); + ADJUST_LOCAL_OFFSET(src, srcw); + + CHECK_EXTRA_REGS(src, srcw, (void)0); + + if (FAST_IS_REG(src)) { + inst = (sljit_u8*)ensure_buf(compiler, 1 + 1 + 1); + FAIL_IF(!inst); + + INC_SIZE(1 + 1); + PUSH_REG(reg_map[src]); + } + else { + inst = emit_x86_instruction(compiler, 1, 0, 0, src, srcw); + FAIL_IF(!inst); + *inst++ = GROUP_FF; + *inst |= PUSH_rm; + + inst = (sljit_u8*)ensure_buf(compiler, 1 + 1); + FAIL_IF(!inst); + INC_SIZE(1); + } + + RET(); + return SLJIT_SUCCESS; +} diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeX86_64.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeX86_64.c new file mode 100755 index 000000000..575871195 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeX86_64.c @@ -0,0 +1,900 @@ +/* + * Stack-less Just-In-Time compiler + * + * Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* x86 64-bit arch dependent functions. */ + +static sljit_s32 emit_load_imm64(struct sljit_compiler *compiler, sljit_s32 reg, sljit_sw imm) +{ + sljit_u8 *inst; + + inst = (sljit_u8*)ensure_buf(compiler, 1 + 2 + sizeof(sljit_sw)); + FAIL_IF(!inst); + INC_SIZE(2 + sizeof(sljit_sw)); + *inst++ = REX_W | ((reg_map[reg] <= 7) ? 0 : REX_B); + *inst++ = MOV_r_i32 + (reg_map[reg] & 0x7); + sljit_unaligned_store_sw(inst, imm); + return SLJIT_SUCCESS; +} + +static sljit_u8* generate_far_jump_code(struct sljit_jump *jump, sljit_u8 *code_ptr) +{ + sljit_s32 type = jump->flags >> TYPE_SHIFT; + + int short_addr = !(jump->flags & SLJIT_REWRITABLE_JUMP) && !(jump->flags & JUMP_LABEL) && (jump->u.target <= 0xffffffff); + + /* The relative jump below specialized for this case. */ + SLJIT_ASSERT(reg_map[TMP_REG2] >= 8); + + if (type < SLJIT_JUMP) { + /* Invert type. */ + *code_ptr++ = get_jump_code(type ^ 0x1) - 0x10; + *code_ptr++ = short_addr ? (6 + 3) : (10 + 3); + } + + *code_ptr++ = short_addr ? REX_B : (REX_W | REX_B); + *code_ptr++ = MOV_r_i32 | reg_lmap[TMP_REG2]; + jump->addr = (sljit_uw)code_ptr; + + if (jump->flags & JUMP_LABEL) + jump->flags |= PATCH_MD; + else if (short_addr) + sljit_unaligned_store_s32(code_ptr, (sljit_s32)jump->u.target); + else + sljit_unaligned_store_sw(code_ptr, jump->u.target); + + code_ptr += short_addr ? sizeof(sljit_s32) : sizeof(sljit_sw); + + *code_ptr++ = REX_B; + *code_ptr++ = GROUP_FF; + *code_ptr++ = MOD_REG | (type >= SLJIT_FAST_CALL ? CALL_rm : JMP_rm) | reg_lmap[TMP_REG2]; + + return code_ptr; +} + +static sljit_u8* generate_put_label_code(struct sljit_put_label *put_label, sljit_u8 *code_ptr, sljit_uw max_label) +{ + if (max_label > HALFWORD_MAX) { + put_label->addr -= put_label->flags; + put_label->flags = PATCH_MD; + return code_ptr; + } + + if (put_label->flags == 0) { + /* Destination is register. */ + code_ptr = (sljit_u8*)put_label->addr - 2 - sizeof(sljit_uw); + + SLJIT_ASSERT((code_ptr[0] & 0xf8) == REX_W); + SLJIT_ASSERT((code_ptr[1] & 0xf8) == MOV_r_i32); + + if ((code_ptr[0] & 0x07) != 0) { + code_ptr[0] = (sljit_u8)(code_ptr[0] & ~0x08); + code_ptr += 2 + sizeof(sljit_s32); + } + else { + code_ptr[0] = code_ptr[1]; + code_ptr += 1 + sizeof(sljit_s32); + } + + put_label->addr = (sljit_uw)code_ptr; + return code_ptr; + } + + code_ptr -= put_label->flags + (2 + sizeof(sljit_uw)); + SLJIT_MEMMOVE(code_ptr, code_ptr + (2 + sizeof(sljit_uw)), put_label->flags); + + SLJIT_ASSERT((code_ptr[0] & 0xf8) == REX_W); + + if ((code_ptr[1] & 0xf8) == MOV_r_i32) { + code_ptr += 2 + sizeof(sljit_uw); + SLJIT_ASSERT((code_ptr[0] & 0xf8) == REX_W); + } + + SLJIT_ASSERT(code_ptr[1] == MOV_rm_r); + + code_ptr[0] = (sljit_u8)(code_ptr[0] & ~0x4); + code_ptr[1] = MOV_rm_i32; + code_ptr[2] = (sljit_u8)(code_ptr[2] & ~(0x7 << 3)); + + code_ptr = (sljit_u8*)(put_label->addr - (2 + sizeof(sljit_uw)) + sizeof(sljit_s32)); + put_label->addr = (sljit_uw)code_ptr; + put_label->flags = 0; + return code_ptr; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compiler, + sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds, + sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size) +{ + sljit_s32 args, i, tmp, size, saved_register_size; + sljit_u8 *inst; + + CHECK_ERROR(); + CHECK(check_sljit_emit_enter(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size)); + set_emit_enter(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size); + + compiler->mode32 = 0; + +#ifdef _WIN64 + /* Two/four register slots for parameters plus space for xmm6 register if needed. */ + if (fscratches >= 6 || fsaveds >= 1) + compiler->locals_offset = 6 * sizeof(sljit_sw); + else + compiler->locals_offset = ((scratches > 2) ? 4 : 2) * sizeof(sljit_sw); +#endif + + /* Including the return address saved by the call instruction. */ + saved_register_size = GET_SAVED_REGISTERS_SIZE(scratches, saveds, 1); + + tmp = saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? (SLJIT_S0 + 1 - saveds) : SLJIT_FIRST_SAVED_REG; + for (i = SLJIT_S0; i >= tmp; i--) { + size = reg_map[i] >= 8 ? 2 : 1; + inst = (sljit_u8*)ensure_buf(compiler, 1 + size); + FAIL_IF(!inst); + INC_SIZE(size); + if (reg_map[i] >= 8) + *inst++ = REX_B; + PUSH_REG(reg_lmap[i]); + } + + for (i = scratches; i >= SLJIT_FIRST_SAVED_REG; i--) { + size = reg_map[i] >= 8 ? 2 : 1; + inst = (sljit_u8*)ensure_buf(compiler, 1 + size); + FAIL_IF(!inst); + INC_SIZE(size); + if (reg_map[i] >= 8) + *inst++ = REX_B; + PUSH_REG(reg_lmap[i]); + } + + args = get_arg_count(arg_types); + + if (args > 0) { + size = args * 3; + inst = (sljit_u8*)ensure_buf(compiler, 1 + size); + FAIL_IF(!inst); + + INC_SIZE(size); + +#ifndef _WIN64 + if (args > 0) { + inst[0] = REX_W; + inst[1] = MOV_r_rm; + inst[2] = MOD_REG | (reg_map[SLJIT_S0] << 3) | 0x7 /* rdi */; + inst += 3; + } + if (args > 1) { + inst[0] = REX_W | REX_R; + inst[1] = MOV_r_rm; + inst[2] = MOD_REG | (reg_lmap[SLJIT_S1] << 3) | 0x6 /* rsi */; + inst += 3; + } + if (args > 2) { + inst[0] = REX_W | REX_R; + inst[1] = MOV_r_rm; + inst[2] = MOD_REG | (reg_lmap[SLJIT_S2] << 3) | 0x2 /* rdx */; + } +#else + if (args > 0) { + inst[0] = REX_W; + inst[1] = MOV_r_rm; + inst[2] = MOD_REG | (reg_map[SLJIT_S0] << 3) | 0x1 /* rcx */; + inst += 3; + } + if (args > 1) { + inst[0] = REX_W; + inst[1] = MOV_r_rm; + inst[2] = MOD_REG | (reg_map[SLJIT_S1] << 3) | 0x2 /* rdx */; + inst += 3; + } + if (args > 2) { + inst[0] = REX_W | REX_B; + inst[1] = MOV_r_rm; + inst[2] = MOD_REG | (reg_map[SLJIT_S2] << 3) | 0x0 /* r8 */; + } +#endif + } + + local_size = ((local_size + SLJIT_LOCALS_OFFSET + saved_register_size + 15) & ~15) - saved_register_size; + compiler->local_size = local_size; + +#ifdef _WIN64 + if (local_size > 0) { + if (local_size <= 4 * 4096) { + if (local_size > 4096) + EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_MEM1(SLJIT_SP), -4096); + if (local_size > 2 * 4096) + EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_MEM1(SLJIT_SP), -4096 * 2); + if (local_size > 3 * 4096) + EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_MEM1(SLJIT_SP), -4096 * 3); + } + else { + EMIT_MOV(compiler, SLJIT_R0, 0, SLJIT_SP, 0); + EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_IMM, (local_size - 1) >> 12); + + SLJIT_ASSERT (reg_map[SLJIT_R0] == 0); + + EMIT_MOV(compiler, TMP_REG2, 0, SLJIT_MEM1(SLJIT_R0), -4096); + FAIL_IF(emit_non_cum_binary(compiler, BINARY_OPCODE(SUB), + SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 4096)); + FAIL_IF(emit_non_cum_binary(compiler, BINARY_OPCODE(SUB), + TMP_REG1, 0, TMP_REG1, 0, SLJIT_IMM, 1)); + + inst = (sljit_u8*)ensure_buf(compiler, 1 + 2); + FAIL_IF(!inst); + + INC_SIZE(2); + inst[0] = JNE_i8; + inst[1] = (sljit_s8) -19; + } + + EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_MEM1(SLJIT_SP), -local_size); + } +#endif + + if (local_size > 0) { + FAIL_IF(emit_non_cum_binary(compiler, BINARY_OPCODE(SUB), + SLJIT_SP, 0, SLJIT_SP, 0, SLJIT_IMM, local_size)); + } + +#ifdef _WIN64 + /* Save xmm6 register: movaps [rsp + 0x20], xmm6 */ + if (fscratches >= 6 || fsaveds >= 1) { + inst = (sljit_u8*)ensure_buf(compiler, 1 + 5); + FAIL_IF(!inst); + INC_SIZE(5); + *inst++ = GROUP_0F; + sljit_unaligned_store_s32(inst, 0x20247429); + } +#endif + + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_set_context(struct sljit_compiler *compiler, + sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds, + sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size) +{ + sljit_s32 saved_register_size; + + CHECK_ERROR(); + CHECK(check_sljit_set_context(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size)); + set_set_context(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size); + +#ifdef _WIN64 + /* Two/four register slots for parameters plus space for xmm6 register if needed. */ + if (fscratches >= 6 || fsaveds >= 1) + compiler->locals_offset = 6 * sizeof(sljit_sw); + else + compiler->locals_offset = ((scratches > 2) ? 4 : 2) * sizeof(sljit_sw); +#endif + + /* Including the return address saved by the call instruction. */ + saved_register_size = GET_SAVED_REGISTERS_SIZE(scratches, saveds, 1); + compiler->local_size = ((local_size + SLJIT_LOCALS_OFFSET + saved_register_size + 15) & ~15) - saved_register_size; + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw) +{ + sljit_s32 i, tmp, size; + sljit_u8 *inst; + + CHECK_ERROR(); + CHECK(check_sljit_emit_return(compiler, op, src, srcw)); + + FAIL_IF(emit_mov_before_return(compiler, op, src, srcw)); + +#ifdef _WIN64 + /* Restore xmm6 register: movaps xmm6, [rsp + 0x20] */ + if (compiler->fscratches >= 6 || compiler->fsaveds >= 1) { + inst = (sljit_u8*)ensure_buf(compiler, 1 + 5); + FAIL_IF(!inst); + INC_SIZE(5); + *inst++ = GROUP_0F; + sljit_unaligned_store_s32(inst, 0x20247428); + } +#endif + + if (compiler->local_size > 0) { + if (compiler->local_size <= 127) { + inst = (sljit_u8*)ensure_buf(compiler, 1 + 4); + FAIL_IF(!inst); + INC_SIZE(4); + *inst++ = REX_W; + *inst++ = GROUP_BINARY_83; + *inst++ = MOD_REG | ADD | 4; + *inst = compiler->local_size; + } + else { + inst = (sljit_u8*)ensure_buf(compiler, 1 + 7); + FAIL_IF(!inst); + INC_SIZE(7); + *inst++ = REX_W; + *inst++ = GROUP_BINARY_81; + *inst++ = MOD_REG | ADD | 4; + sljit_unaligned_store_s32(inst, compiler->local_size); + } + } + + tmp = compiler->scratches; + for (i = SLJIT_FIRST_SAVED_REG; i <= tmp; i++) { + size = reg_map[i] >= 8 ? 2 : 1; + inst = (sljit_u8*)ensure_buf(compiler, 1 + size); + FAIL_IF(!inst); + INC_SIZE(size); + if (reg_map[i] >= 8) + *inst++ = REX_B; + POP_REG(reg_lmap[i]); + } + + tmp = compiler->saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? (SLJIT_S0 + 1 - compiler->saveds) : SLJIT_FIRST_SAVED_REG; + for (i = tmp; i <= SLJIT_S0; i++) { + size = reg_map[i] >= 8 ? 2 : 1; + inst = (sljit_u8*)ensure_buf(compiler, 1 + size); + FAIL_IF(!inst); + INC_SIZE(size); + if (reg_map[i] >= 8) + *inst++ = REX_B; + POP_REG(reg_lmap[i]); + } + + inst = (sljit_u8*)ensure_buf(compiler, 1 + 1); + FAIL_IF(!inst); + INC_SIZE(1); + RET(); + return SLJIT_SUCCESS; +} + +/* --------------------------------------------------------------------- */ +/* Operators */ +/* --------------------------------------------------------------------- */ + +static sljit_s32 emit_do_imm32(struct sljit_compiler *compiler, sljit_u8 rex, sljit_u8 opcode, sljit_sw imm) +{ + sljit_u8 *inst; + sljit_s32 length = 1 + (rex ? 1 : 0) + sizeof(sljit_s32); + + inst = (sljit_u8*)ensure_buf(compiler, 1 + length); + FAIL_IF(!inst); + INC_SIZE(length); + if (rex) + *inst++ = rex; + *inst++ = opcode; + sljit_unaligned_store_s32(inst, imm); + return SLJIT_SUCCESS; +} + +static sljit_u8* emit_x86_instruction(struct sljit_compiler *compiler, sljit_s32 size, + /* The register or immediate operand. */ + sljit_s32 a, sljit_sw imma, + /* The general operand (not immediate). */ + sljit_s32 b, sljit_sw immb) +{ + sljit_u8 *inst; + sljit_u8 *buf_ptr; + sljit_u8 rex = 0; + sljit_s32 flags = size & ~0xf; + sljit_s32 inst_size; + + /* The immediate operand must be 32 bit. */ + SLJIT_ASSERT(!(a & SLJIT_IMM) || compiler->mode32 || IS_HALFWORD(imma)); + /* Both cannot be switched on. */ + SLJIT_ASSERT((flags & (EX86_BIN_INS | EX86_SHIFT_INS)) != (EX86_BIN_INS | EX86_SHIFT_INS)); + /* Size flags not allowed for typed instructions. */ + SLJIT_ASSERT(!(flags & (EX86_BIN_INS | EX86_SHIFT_INS)) || (flags & (EX86_BYTE_ARG | EX86_HALF_ARG)) == 0); + /* Both size flags cannot be switched on. */ + SLJIT_ASSERT((flags & (EX86_BYTE_ARG | EX86_HALF_ARG)) != (EX86_BYTE_ARG | EX86_HALF_ARG)); + /* SSE2 and immediate is not possible. */ + SLJIT_ASSERT(!(a & SLJIT_IMM) || !(flags & EX86_SSE2)); + SLJIT_ASSERT((flags & (EX86_PREF_F2 | EX86_PREF_F3)) != (EX86_PREF_F2 | EX86_PREF_F3) + && (flags & (EX86_PREF_F2 | EX86_PREF_66)) != (EX86_PREF_F2 | EX86_PREF_66) + && (flags & (EX86_PREF_F3 | EX86_PREF_66)) != (EX86_PREF_F3 | EX86_PREF_66)); + + size &= 0xf; + inst_size = size; + + if (!compiler->mode32 && !(flags & EX86_NO_REXW)) + rex |= REX_W; + else if (flags & EX86_REX) + rex |= REX; + + if (flags & (EX86_PREF_F2 | EX86_PREF_F3)) + inst_size++; + if (flags & EX86_PREF_66) + inst_size++; + + /* Calculate size of b. */ + inst_size += 1; /* mod r/m byte. */ + if (b & SLJIT_MEM) { + if (!(b & OFFS_REG_MASK)) { + if (NOT_HALFWORD(immb)) { + PTR_FAIL_IF(emit_load_imm64(compiler, TMP_REG2, immb)); + immb = 0; + if (b & REG_MASK) + b |= TO_OFFS_REG(TMP_REG2); + else + b |= TMP_REG2; + } + else if (reg_lmap[b & REG_MASK] == 4) + b |= TO_OFFS_REG(SLJIT_SP); + } + + if ((b & REG_MASK) == SLJIT_UNUSED) + inst_size += 1 + sizeof(sljit_s32); /* SIB byte required to avoid RIP based addressing. */ + else { + if (reg_map[b & REG_MASK] >= 8) + rex |= REX_B; + + if (immb != 0 && (!(b & OFFS_REG_MASK) || (b & OFFS_REG_MASK) == TO_OFFS_REG(SLJIT_SP))) { + /* Immediate operand. */ + if (immb <= 127 && immb >= -128) + inst_size += sizeof(sljit_s8); + else + inst_size += sizeof(sljit_s32); + } + else if (reg_lmap[b & REG_MASK] == 5) + inst_size += sizeof(sljit_s8); + + if ((b & OFFS_REG_MASK) != SLJIT_UNUSED) { + inst_size += 1; /* SIB byte. */ + if (reg_map[OFFS_REG(b)] >= 8) + rex |= REX_X; + } + } + } + else if (!(flags & EX86_SSE2_OP2)) { + if (reg_map[b] >= 8) + rex |= REX_B; + } + else if (freg_map[b] >= 8) + rex |= REX_B; + + if (a & SLJIT_IMM) { + if (flags & EX86_BIN_INS) { + if (imma <= 127 && imma >= -128) { + inst_size += 1; + flags |= EX86_BYTE_ARG; + } else + inst_size += 4; + } + else if (flags & EX86_SHIFT_INS) { + imma &= compiler->mode32 ? 0x1f : 0x3f; + if (imma != 1) { + inst_size ++; + flags |= EX86_BYTE_ARG; + } + } else if (flags & EX86_BYTE_ARG) + inst_size++; + else if (flags & EX86_HALF_ARG) + inst_size += sizeof(short); + else + inst_size += sizeof(sljit_s32); + } + else { + SLJIT_ASSERT(!(flags & EX86_SHIFT_INS) || a == SLJIT_PREF_SHIFT_REG); + /* reg_map[SLJIT_PREF_SHIFT_REG] is less than 8. */ + if (!(flags & EX86_SSE2_OP1)) { + if (reg_map[a] >= 8) + rex |= REX_R; + } + else if (freg_map[a] >= 8) + rex |= REX_R; + } + + if (rex) + inst_size++; + + inst = (sljit_u8*)ensure_buf(compiler, 1 + inst_size); + PTR_FAIL_IF(!inst); + + /* Encoding the byte. */ + INC_SIZE(inst_size); + if (flags & EX86_PREF_F2) + *inst++ = 0xf2; + if (flags & EX86_PREF_F3) + *inst++ = 0xf3; + if (flags & EX86_PREF_66) + *inst++ = 0x66; + if (rex) + *inst++ = rex; + buf_ptr = inst + size; + + /* Encode mod/rm byte. */ + if (!(flags & EX86_SHIFT_INS)) { + if ((flags & EX86_BIN_INS) && (a & SLJIT_IMM)) + *inst = (flags & EX86_BYTE_ARG) ? GROUP_BINARY_83 : GROUP_BINARY_81; + + if (a & SLJIT_IMM) + *buf_ptr = 0; + else if (!(flags & EX86_SSE2_OP1)) + *buf_ptr = reg_lmap[a] << 3; + else + *buf_ptr = freg_lmap[a] << 3; + } + else { + if (a & SLJIT_IMM) { + if (imma == 1) + *inst = GROUP_SHIFT_1; + else + *inst = GROUP_SHIFT_N; + } else + *inst = GROUP_SHIFT_CL; + *buf_ptr = 0; + } + + if (!(b & SLJIT_MEM)) + *buf_ptr++ |= MOD_REG + ((!(flags & EX86_SSE2_OP2)) ? reg_lmap[b] : freg_lmap[b]); + else if ((b & REG_MASK) != SLJIT_UNUSED) { + if ((b & OFFS_REG_MASK) == SLJIT_UNUSED || (b & OFFS_REG_MASK) == TO_OFFS_REG(SLJIT_SP)) { + if (immb != 0 || reg_lmap[b & REG_MASK] == 5) { + if (immb <= 127 && immb >= -128) + *buf_ptr |= 0x40; + else + *buf_ptr |= 0x80; + } + + if ((b & OFFS_REG_MASK) == SLJIT_UNUSED) + *buf_ptr++ |= reg_lmap[b & REG_MASK]; + else { + *buf_ptr++ |= 0x04; + *buf_ptr++ = reg_lmap[b & REG_MASK] | (reg_lmap[OFFS_REG(b)] << 3); + } + + if (immb != 0 || reg_lmap[b & REG_MASK] == 5) { + if (immb <= 127 && immb >= -128) + *buf_ptr++ = immb; /* 8 bit displacement. */ + else { + sljit_unaligned_store_s32(buf_ptr, immb); /* 32 bit displacement. */ + buf_ptr += sizeof(sljit_s32); + } + } + } + else { + if (reg_lmap[b & REG_MASK] == 5) + *buf_ptr |= 0x40; + *buf_ptr++ |= 0x04; + *buf_ptr++ = reg_lmap[b & REG_MASK] | (reg_lmap[OFFS_REG(b)] << 3) | (immb << 6); + if (reg_lmap[b & REG_MASK] == 5) + *buf_ptr++ = 0; + } + } + else { + *buf_ptr++ |= 0x04; + *buf_ptr++ = 0x25; + sljit_unaligned_store_s32(buf_ptr, immb); /* 32 bit displacement. */ + buf_ptr += sizeof(sljit_s32); + } + + if (a & SLJIT_IMM) { + if (flags & EX86_BYTE_ARG) + *buf_ptr = imma; + else if (flags & EX86_HALF_ARG) + sljit_unaligned_store_s16(buf_ptr, imma); + else if (!(flags & EX86_SHIFT_INS)) + sljit_unaligned_store_s32(buf_ptr, imma); + } + + return !(flags & EX86_SHIFT_INS) ? inst : (inst + 1); +} + +/* --------------------------------------------------------------------- */ +/* Call / return instructions */ +/* --------------------------------------------------------------------- */ + +#ifndef _WIN64 + +static sljit_s32 call_with_args(struct sljit_compiler *compiler, sljit_s32 arg_types, sljit_s32 *src_ptr, sljit_sw srcw) +{ + sljit_s32 src = src_ptr ? (*src_ptr) : 0; + sljit_s32 word_arg_count = 0; + + SLJIT_ASSERT(reg_map[SLJIT_R1] == 6 && reg_map[SLJIT_R3] == 1 && reg_map[TMP_REG1] == 2); + + compiler->mode32 = 0; + + /* Remove return value. */ + arg_types >>= SLJIT_DEF_SHIFT; + + while (arg_types) { + if ((arg_types & SLJIT_DEF_MASK) < SLJIT_ARG_TYPE_F32) + word_arg_count++; + arg_types >>= SLJIT_DEF_SHIFT; + } + + if (word_arg_count == 0) + return SLJIT_SUCCESS; + + if (src & SLJIT_MEM) { + ADJUST_LOCAL_OFFSET(src, srcw); + EMIT_MOV(compiler, TMP_REG2, 0, src, srcw); + *src_ptr = TMP_REG2; + } + else if (src == SLJIT_R2 && word_arg_count >= SLJIT_R2) + *src_ptr = TMP_REG1; + + if (word_arg_count >= 3) + EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_R2, 0); + return emit_mov(compiler, SLJIT_R2, 0, SLJIT_R0, 0); +} + +#else + +static sljit_s32 call_with_args(struct sljit_compiler *compiler, sljit_s32 arg_types, sljit_s32 *src_ptr, sljit_sw srcw) +{ + sljit_s32 src = src_ptr ? (*src_ptr) : 0; + sljit_s32 arg_count = 0; + sljit_s32 word_arg_count = 0; + sljit_s32 float_arg_count = 0; + sljit_s32 types = 0; + sljit_s32 data_trandfer = 0; + static sljit_u8 word_arg_regs[5] = { 0, SLJIT_R3, SLJIT_R1, SLJIT_R2, TMP_REG1 }; + + SLJIT_ASSERT(reg_map[SLJIT_R3] == 1 && reg_map[SLJIT_R1] == 2 && reg_map[SLJIT_R2] == 8 && reg_map[TMP_REG1] == 9); + + compiler->mode32 = 0; + arg_types >>= SLJIT_DEF_SHIFT; + + while (arg_types) { + types = (types << SLJIT_DEF_SHIFT) | (arg_types & SLJIT_DEF_MASK); + + switch (arg_types & SLJIT_DEF_MASK) { + case SLJIT_ARG_TYPE_F32: + case SLJIT_ARG_TYPE_F64: + arg_count++; + float_arg_count++; + + if (arg_count != float_arg_count) + data_trandfer = 1; + break; + default: + arg_count++; + word_arg_count++; + + if (arg_count != word_arg_count || arg_count != word_arg_regs[arg_count]) { + data_trandfer = 1; + + if (src == word_arg_regs[arg_count]) { + EMIT_MOV(compiler, TMP_REG2, 0, src, 0); + *src_ptr = TMP_REG2; + } + } + break; + } + + arg_types >>= SLJIT_DEF_SHIFT; + } + + if (!data_trandfer) + return SLJIT_SUCCESS; + + if (src & SLJIT_MEM) { + ADJUST_LOCAL_OFFSET(src, srcw); + EMIT_MOV(compiler, TMP_REG2, 0, src, srcw); + *src_ptr = TMP_REG2; + } + + while (types) { + switch (types & SLJIT_DEF_MASK) { + case SLJIT_ARG_TYPE_F32: + if (arg_count != float_arg_count) + FAIL_IF(emit_sse2_load(compiler, 1, arg_count, float_arg_count, 0)); + arg_count--; + float_arg_count--; + break; + case SLJIT_ARG_TYPE_F64: + if (arg_count != float_arg_count) + FAIL_IF(emit_sse2_load(compiler, 0, arg_count, float_arg_count, 0)); + arg_count--; + float_arg_count--; + break; + default: + if (arg_count != word_arg_count || arg_count != word_arg_regs[arg_count]) + EMIT_MOV(compiler, word_arg_regs[arg_count], 0, word_arg_count, 0); + arg_count--; + word_arg_count--; + break; + } + + types >>= SLJIT_DEF_SHIFT; + } + + return SLJIT_SUCCESS; +} + +#endif + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_call(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 arg_types) +{ + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_call(compiler, type, arg_types)); + + PTR_FAIL_IF(call_with_args(compiler, arg_types, NULL, 0)); + +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \ + || (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + compiler->skip_checks = 1; +#endif + + return sljit_emit_jump(compiler, type); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_icall(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 arg_types, + sljit_s32 src, sljit_sw srcw) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_icall(compiler, type, arg_types, src, srcw)); + + FAIL_IF(call_with_args(compiler, arg_types, &src, srcw)); + +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \ + || (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + compiler->skip_checks = 1; +#endif + + return sljit_emit_ijump(compiler, type, src, srcw); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw) +{ + sljit_u8 *inst; + + CHECK_ERROR(); + CHECK(check_sljit_emit_fast_enter(compiler, dst, dstw)); + ADJUST_LOCAL_OFFSET(dst, dstw); + + /* For UNUSED dst. Uncommon, but possible. */ + if (dst == SLJIT_UNUSED) + dst = TMP_REG1; + + if (FAST_IS_REG(dst)) { + if (reg_map[dst] < 8) { + inst = (sljit_u8*)ensure_buf(compiler, 1 + 1); + FAIL_IF(!inst); + INC_SIZE(1); + POP_REG(reg_lmap[dst]); + return SLJIT_SUCCESS; + } + + inst = (sljit_u8*)ensure_buf(compiler, 1 + 2); + FAIL_IF(!inst); + INC_SIZE(2); + *inst++ = REX_B; + POP_REG(reg_lmap[dst]); + return SLJIT_SUCCESS; + } + + /* REX_W is not necessary (src is not immediate). */ + compiler->mode32 = 1; + inst = emit_x86_instruction(compiler, 1, 0, 0, dst, dstw); + FAIL_IF(!inst); + *inst++ = POP_rm; + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw) +{ + sljit_u8 *inst; + + CHECK_ERROR(); + CHECK(check_sljit_emit_fast_return(compiler, src, srcw)); + ADJUST_LOCAL_OFFSET(src, srcw); + + if (FAST_IS_REG(src)) { + if (reg_map[src] < 8) { + inst = (sljit_u8*)ensure_buf(compiler, 1 + 1 + 1); + FAIL_IF(!inst); + + INC_SIZE(1 + 1); + PUSH_REG(reg_lmap[src]); + } + else { + inst = (sljit_u8*)ensure_buf(compiler, 1 + 2 + 1); + FAIL_IF(!inst); + + INC_SIZE(2 + 1); + *inst++ = REX_B; + PUSH_REG(reg_lmap[src]); + } + } + else { + /* REX_W is not necessary (src is not immediate). */ + compiler->mode32 = 1; + inst = emit_x86_instruction(compiler, 1, 0, 0, src, srcw); + FAIL_IF(!inst); + *inst++ = GROUP_FF; + *inst |= PUSH_rm; + + inst = (sljit_u8*)ensure_buf(compiler, 1 + 1); + FAIL_IF(!inst); + INC_SIZE(1); + } + + RET(); + return SLJIT_SUCCESS; +} + +/* --------------------------------------------------------------------- */ +/* Extend input */ +/* --------------------------------------------------------------------- */ + +static sljit_s32 emit_mov_int(struct sljit_compiler *compiler, sljit_s32 sign, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + sljit_u8* inst; + sljit_s32 dst_r; + + compiler->mode32 = 0; + + if (dst == SLJIT_UNUSED && !(src & SLJIT_MEM)) + return SLJIT_SUCCESS; /* Empty instruction. */ + + if (src & SLJIT_IMM) { + if (FAST_IS_REG(dst)) { + if (sign || ((sljit_uw)srcw <= 0x7fffffff)) { + inst = emit_x86_instruction(compiler, 1, SLJIT_IMM, (sljit_sw)(sljit_s32)srcw, dst, dstw); + FAIL_IF(!inst); + *inst = MOV_rm_i32; + return SLJIT_SUCCESS; + } + return emit_load_imm64(compiler, dst, srcw); + } + compiler->mode32 = 1; + inst = emit_x86_instruction(compiler, 1, SLJIT_IMM, (sljit_sw)(sljit_s32)srcw, dst, dstw); + FAIL_IF(!inst); + *inst = MOV_rm_i32; + compiler->mode32 = 0; + return SLJIT_SUCCESS; + } + + dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1; + + if ((dst & SLJIT_MEM) && FAST_IS_REG(src)) + dst_r = src; + else { + if (sign) { + inst = emit_x86_instruction(compiler, 1, dst_r, 0, src, srcw); + FAIL_IF(!inst); + *inst++ = MOVSXD_r_rm; + } else { + compiler->mode32 = 1; + FAIL_IF(emit_mov(compiler, dst_r, 0, src, srcw)); + compiler->mode32 = 0; + } + } + + if (dst & SLJIT_MEM) { + compiler->mode32 = 1; + inst = emit_x86_instruction(compiler, 1, dst_r, 0, dst, dstw); + FAIL_IF(!inst); + *inst = MOV_rm_r; + compiler->mode32 = 0; + } + + return SLJIT_SUCCESS; +} diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeX86_common.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeX86_common.c new file mode 100755 index 000000000..6296da538 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitNativeX86_common.c @@ -0,0 +1,2940 @@ +/* + * Stack-less Just-In-Time compiler + * + * Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +SLJIT_API_FUNC_ATTRIBUTE const char* sljit_get_platform_name(void) +{ +#if (defined SLJIT_X86_32_FASTCALL && SLJIT_X86_32_FASTCALL) + return "x86" SLJIT_CPUINFO " ABI:fastcall"; +#else + return "x86" SLJIT_CPUINFO; +#endif +} + +/* + 32b register indexes: + 0 - EAX + 1 - ECX + 2 - EDX + 3 - EBX + 4 - ESP + 5 - EBP + 6 - ESI + 7 - EDI +*/ + +/* + 64b register indexes: + 0 - RAX + 1 - RCX + 2 - RDX + 3 - RBX + 4 - RSP + 5 - RBP + 6 - RSI + 7 - RDI + 8 - R8 - From now on REX prefix is required + 9 - R9 + 10 - R10 + 11 - R11 + 12 - R12 + 13 - R13 + 14 - R14 + 15 - R15 +*/ + +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + +/* Last register + 1. */ +#define TMP_REG1 (SLJIT_NUMBER_OF_REGISTERS + 2) + +static const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 3] = { + 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 7, 6, 3, 4, 5 +}; + +#define CHECK_EXTRA_REGS(p, w, do) \ + if (p >= SLJIT_R3 && p <= SLJIT_S3) { \ + if (p <= compiler->scratches) \ + w = compiler->saveds_offset - ((p) - SLJIT_R2) * (sljit_sw)sizeof(sljit_sw); \ + else \ + w = compiler->locals_offset + ((p) - SLJIT_S2) * (sljit_sw)sizeof(sljit_sw); \ + p = SLJIT_MEM1(SLJIT_SP); \ + do; \ + } + +#else /* SLJIT_CONFIG_X86_32 */ + +/* Last register + 1. */ +#define TMP_REG1 (SLJIT_NUMBER_OF_REGISTERS + 2) +#define TMP_REG2 (SLJIT_NUMBER_OF_REGISTERS + 3) + +/* Note: r12 & 0x7 == 0b100, which decoded as SIB byte present + Note: avoid to use r12 and r13 for memory addessing + therefore r12 is better to be a higher saved register. */ +#ifndef _WIN64 +/* Args: rdi(=7), rsi(=6), rdx(=2), rcx(=1), r8, r9. Scratches: rax(=0), r10, r11 */ +static const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 4] = { + 0, 0, 6, 7, 1, 8, 11, 10, 12, 5, 13, 14, 15, 3, 4, 2, 9 +}; +/* low-map. reg_map & 0x7. */ +static const sljit_u8 reg_lmap[SLJIT_NUMBER_OF_REGISTERS + 4] = { + 0, 0, 6, 7, 1, 0, 3, 2, 4, 5, 5, 6, 7, 3, 4, 2, 1 +}; +#else +/* Args: rcx(=1), rdx(=2), r8, r9. Scratches: rax(=0), r10, r11 */ +static const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 4] = { + 0, 0, 2, 8, 1, 11, 12, 5, 13, 14, 15, 7, 6, 3, 4, 9, 10 +}; +/* low-map. reg_map & 0x7. */ +static const sljit_u8 reg_lmap[SLJIT_NUMBER_OF_REGISTERS + 4] = { + 0, 0, 2, 0, 1, 3, 4, 5, 5, 6, 7, 7, 6, 3, 4, 1, 2 +}; +#endif + +/* Args: xmm0-xmm3 */ +static const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1] = { + 4, 0, 1, 2, 3, 5, 6 +}; +/* low-map. freg_map & 0x7. */ +static const sljit_u8 freg_lmap[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1] = { + 4, 0, 1, 2, 3, 5, 6 +}; + +#define REX_W 0x48 +#define REX_R 0x44 +#define REX_X 0x42 +#define REX_B 0x41 +#define REX 0x40 + +#ifndef _WIN64 +#define HALFWORD_MAX 0x7fffffffl +#define HALFWORD_MIN -0x80000000l +#else +#define HALFWORD_MAX 0x7fffffffll +#define HALFWORD_MIN -0x80000000ll +#endif + +#define IS_HALFWORD(x) ((x) <= HALFWORD_MAX && (x) >= HALFWORD_MIN) +#define NOT_HALFWORD(x) ((x) > HALFWORD_MAX || (x) < HALFWORD_MIN) + +#define CHECK_EXTRA_REGS(p, w, do) + +#endif /* SLJIT_CONFIG_X86_32 */ + +#define TMP_FREG (0) + +/* Size flags for emit_x86_instruction: */ +#define EX86_BIN_INS 0x0010 +#define EX86_SHIFT_INS 0x0020 +#define EX86_REX 0x0040 +#define EX86_NO_REXW 0x0080 +#define EX86_BYTE_ARG 0x0100 +#define EX86_HALF_ARG 0x0200 +#define EX86_PREF_66 0x0400 +#define EX86_PREF_F2 0x0800 +#define EX86_PREF_F3 0x1000 +#define EX86_SSE2_OP1 0x2000 +#define EX86_SSE2_OP2 0x4000 +#define EX86_SSE2 (EX86_SSE2_OP1 | EX86_SSE2_OP2) + +/* --------------------------------------------------------------------- */ +/* Instrucion forms */ +/* --------------------------------------------------------------------- */ + +#define ADD (/* BINARY */ 0 << 3) +#define ADD_EAX_i32 0x05 +#define ADD_r_rm 0x03 +#define ADD_rm_r 0x01 +#define ADDSD_x_xm 0x58 +#define ADC (/* BINARY */ 2 << 3) +#define ADC_EAX_i32 0x15 +#define ADC_r_rm 0x13 +#define ADC_rm_r 0x11 +#define AND (/* BINARY */ 4 << 3) +#define AND_EAX_i32 0x25 +#define AND_r_rm 0x23 +#define AND_rm_r 0x21 +#define ANDPD_x_xm 0x54 +#define BSR_r_rm (/* GROUP_0F */ 0xbd) +#define CALL_i32 0xe8 +#define CALL_rm (/* GROUP_FF */ 2 << 3) +#define CDQ 0x99 +#define CMOVE_r_rm (/* GROUP_0F */ 0x44) +#define CMP (/* BINARY */ 7 << 3) +#define CMP_EAX_i32 0x3d +#define CMP_r_rm 0x3b +#define CMP_rm_r 0x39 +#define CVTPD2PS_x_xm 0x5a +#define CVTSI2SD_x_rm 0x2a +#define CVTTSD2SI_r_xm 0x2c +#define DIV (/* GROUP_F7 */ 6 << 3) +#define DIVSD_x_xm 0x5e +#define FSTPS 0xd9 +#define FSTPD 0xdd +#define INT3 0xcc +#define IDIV (/* GROUP_F7 */ 7 << 3) +#define IMUL (/* GROUP_F7 */ 5 << 3) +#define IMUL_r_rm (/* GROUP_0F */ 0xaf) +#define IMUL_r_rm_i8 0x6b +#define IMUL_r_rm_i32 0x69 +#define JE_i8 0x74 +#define JNE_i8 0x75 +#define JMP_i8 0xeb +#define JMP_i32 0xe9 +#define JMP_rm (/* GROUP_FF */ 4 << 3) +#define LEA_r_m 0x8d +#define MOV_r_rm 0x8b +#define MOV_r_i32 0xb8 +#define MOV_rm_r 0x89 +#define MOV_rm_i32 0xc7 +#define MOV_rm8_i8 0xc6 +#define MOV_rm8_r8 0x88 +#define MOVSD_x_xm 0x10 +#define MOVSD_xm_x 0x11 +#define MOVSXD_r_rm 0x63 +#define MOVSX_r_rm8 (/* GROUP_0F */ 0xbe) +#define MOVSX_r_rm16 (/* GROUP_0F */ 0xbf) +#define MOVZX_r_rm8 (/* GROUP_0F */ 0xb6) +#define MOVZX_r_rm16 (/* GROUP_0F */ 0xb7) +#define MUL (/* GROUP_F7 */ 4 << 3) +#define MULSD_x_xm 0x59 +#define NEG_rm (/* GROUP_F7 */ 3 << 3) +#define NOP 0x90 +#define NOT_rm (/* GROUP_F7 */ 2 << 3) +#define OR (/* BINARY */ 1 << 3) +#define OR_r_rm 0x0b +#define OR_EAX_i32 0x0d +#define OR_rm_r 0x09 +#define OR_rm8_r8 0x08 +#define POP_r 0x58 +#define POP_rm 0x8f +#define POPF 0x9d +#define PREFETCH 0x18 +#define PUSH_i32 0x68 +#define PUSH_r 0x50 +#define PUSH_rm (/* GROUP_FF */ 6 << 3) +#define PUSHF 0x9c +#define RET_near 0xc3 +#define RET_i16 0xc2 +#define SBB (/* BINARY */ 3 << 3) +#define SBB_EAX_i32 0x1d +#define SBB_r_rm 0x1b +#define SBB_rm_r 0x19 +#define SAR (/* SHIFT */ 7 << 3) +#define SHL (/* SHIFT */ 4 << 3) +#define SHR (/* SHIFT */ 5 << 3) +#define SUB (/* BINARY */ 5 << 3) +#define SUB_EAX_i32 0x2d +#define SUB_r_rm 0x2b +#define SUB_rm_r 0x29 +#define SUBSD_x_xm 0x5c +#define TEST_EAX_i32 0xa9 +#define TEST_rm_r 0x85 +#define UCOMISD_x_xm 0x2e +#define UNPCKLPD_x_xm 0x14 +#define XCHG_EAX_r 0x90 +#define XCHG_r_rm 0x87 +#define XOR (/* BINARY */ 6 << 3) +#define XOR_EAX_i32 0x35 +#define XOR_r_rm 0x33 +#define XOR_rm_r 0x31 +#define XORPD_x_xm 0x57 + +#define GROUP_0F 0x0f +#define GROUP_F7 0xf7 +#define GROUP_FF 0xff +#define GROUP_BINARY_81 0x81 +#define GROUP_BINARY_83 0x83 +#define GROUP_SHIFT_1 0xd1 +#define GROUP_SHIFT_N 0xc1 +#define GROUP_SHIFT_CL 0xd3 + +#define MOD_REG 0xc0 +#define MOD_DISP8 0x40 + +#define INC_SIZE(s) (*inst++ = (s), compiler->size += (s)) + +#define PUSH_REG(r) (*inst++ = (PUSH_r + (r))) +#define POP_REG(r) (*inst++ = (POP_r + (r))) +#define RET() (*inst++ = (RET_near)) +#define RET_I16(n) (*inst++ = (RET_i16), *inst++ = n, *inst++ = 0) +/* r32, r/m32 */ +#define MOV_RM(mod, reg, rm) (*inst++ = (MOV_r_rm), *inst++ = (mod) << 6 | (reg) << 3 | (rm)) + +/* Multithreading does not affect these static variables, since they store + built-in CPU features. Therefore they can be overwritten by different threads + if they detect the CPU features in the same time. */ +#if (defined SLJIT_DETECT_SSE2 && SLJIT_DETECT_SSE2) +static sljit_s32 cpu_has_sse2 = -1; +#endif +static sljit_s32 cpu_has_cmov = -1; + +#ifdef _WIN32_WCE +#include +#elif defined(_MSC_VER) && _MSC_VER >= 1400 +#include +#endif + +/******************************************************/ +/* Unaligned-store functions */ +/******************************************************/ + +static SLJIT_INLINE void sljit_unaligned_store_s16(void *addr, sljit_s16 value) +{ + SLJIT_MEMCPY(addr, &value, sizeof(value)); +} + +static SLJIT_INLINE void sljit_unaligned_store_s32(void *addr, sljit_s32 value) +{ + SLJIT_MEMCPY(addr, &value, sizeof(value)); +} + +static SLJIT_INLINE void sljit_unaligned_store_sw(void *addr, sljit_sw value) +{ + SLJIT_MEMCPY(addr, &value, sizeof(value)); +} + +/******************************************************/ +/* Utility functions */ +/******************************************************/ + +static void get_cpu_features(void) +{ + sljit_u32 features; + +#if defined(_MSC_VER) && _MSC_VER >= 1400 + + int CPUInfo[4]; + __cpuid(CPUInfo, 1); + features = (sljit_u32)CPUInfo[3]; + +#elif defined(__GNUC__) || defined(__INTEL_COMPILER) || defined(__SUNPRO_C) + + /* AT&T syntax. */ + __asm__ ( + "movl $0x1, %%eax\n" +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + /* On x86-32, there is no red zone, so this + should work (no need for a local variable). */ + "push %%ebx\n" +#endif + "cpuid\n" +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + "pop %%ebx\n" +#endif + "movl %%edx, %0\n" + : "=g" (features) + : +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + : "%eax", "%ecx", "%edx" +#else + : "%rax", "%rbx", "%rcx", "%rdx" +#endif + ); + +#else /* _MSC_VER && _MSC_VER >= 1400 */ + + /* Intel syntax. */ + __asm { + mov eax, 1 + cpuid + mov features, edx + } + +#endif /* _MSC_VER && _MSC_VER >= 1400 */ + +#if (defined SLJIT_DETECT_SSE2 && SLJIT_DETECT_SSE2) + cpu_has_sse2 = (features >> 26) & 0x1; +#endif + cpu_has_cmov = (features >> 15) & 0x1; +} + +static sljit_u8 get_jump_code(sljit_s32 type) +{ + switch (type) { + case SLJIT_EQUAL: + case SLJIT_EQUAL_F64: + return 0x84 /* je */; + + case SLJIT_NOT_EQUAL: + case SLJIT_NOT_EQUAL_F64: + return 0x85 /* jne */; + + case SLJIT_LESS: + case SLJIT_LESS_F64: + return 0x82 /* jc */; + + case SLJIT_GREATER_EQUAL: + case SLJIT_GREATER_EQUAL_F64: + return 0x83 /* jae */; + + case SLJIT_GREATER: + case SLJIT_GREATER_F64: + return 0x87 /* jnbe */; + + case SLJIT_LESS_EQUAL: + case SLJIT_LESS_EQUAL_F64: + return 0x86 /* jbe */; + + case SLJIT_SIG_LESS: + return 0x8c /* jl */; + + case SLJIT_SIG_GREATER_EQUAL: + return 0x8d /* jnl */; + + case SLJIT_SIG_GREATER: + return 0x8f /* jnle */; + + case SLJIT_SIG_LESS_EQUAL: + return 0x8e /* jle */; + + case SLJIT_OVERFLOW: + case SLJIT_MUL_OVERFLOW: + return 0x80 /* jo */; + + case SLJIT_NOT_OVERFLOW: + case SLJIT_MUL_NOT_OVERFLOW: + return 0x81 /* jno */; + + case SLJIT_UNORDERED_F64: + return 0x8a /* jp */; + + case SLJIT_ORDERED_F64: + return 0x8b /* jpo */; + } + return 0; +} + +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) +static sljit_u8* generate_far_jump_code(struct sljit_jump *jump, sljit_u8 *code_ptr, sljit_sw executable_offset); +#else +static sljit_u8* generate_far_jump_code(struct sljit_jump *jump, sljit_u8 *code_ptr); +static sljit_u8* generate_put_label_code(struct sljit_put_label *put_label, sljit_u8 *code_ptr, sljit_uw max_label); +#endif + +static sljit_u8* generate_near_jump_code(struct sljit_jump *jump, sljit_u8 *code_ptr, sljit_u8 *code, sljit_sw executable_offset) +{ + sljit_s32 type = jump->flags >> TYPE_SHIFT; + sljit_s32 short_jump; + sljit_uw label_addr; + + if (jump->flags & JUMP_LABEL) + label_addr = (sljit_uw)(code + jump->u.label->size); + else + label_addr = jump->u.target - executable_offset; + + short_jump = (sljit_sw)(label_addr - (jump->addr + 2)) >= -128 && (sljit_sw)(label_addr - (jump->addr + 2)) <= 127; + +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + if ((sljit_sw)(label_addr - (jump->addr + 1)) > HALFWORD_MAX || (sljit_sw)(label_addr - (jump->addr + 1)) < HALFWORD_MIN) + return generate_far_jump_code(jump, code_ptr); +#endif + + if (type == SLJIT_JUMP) { + if (short_jump) + *code_ptr++ = JMP_i8; + else + *code_ptr++ = JMP_i32; + jump->addr++; + } + else if (type >= SLJIT_FAST_CALL) { + short_jump = 0; + *code_ptr++ = CALL_i32; + jump->addr++; + } + else if (short_jump) { + *code_ptr++ = get_jump_code(type) - 0x10; + jump->addr++; + } + else { + *code_ptr++ = GROUP_0F; + *code_ptr++ = get_jump_code(type); + jump->addr += 2; + } + + if (short_jump) { + jump->flags |= PATCH_MB; + code_ptr += sizeof(sljit_s8); + } else { + jump->flags |= PATCH_MW; + code_ptr += sizeof(sljit_s32); + } + + return code_ptr; +} + +SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler) +{ + struct sljit_memory_fragment *buf; + sljit_u8 *code; + sljit_u8 *code_ptr; + sljit_u8 *buf_ptr; + sljit_u8 *buf_end; + sljit_u8 len; + sljit_sw executable_offset; + sljit_sw jump_addr; + + struct sljit_label *label; + struct sljit_jump *jump; + struct sljit_const *const_; + struct sljit_put_label *put_label; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_generate_code(compiler)); + reverse_buf(compiler); + + /* Second code generation pass. */ + code = (sljit_u8*)SLJIT_MALLOC_EXEC(compiler->size); + PTR_FAIL_WITH_EXEC_IF(code); + buf = compiler->buf; + + code_ptr = code; + label = compiler->labels; + jump = compiler->jumps; + const_ = compiler->consts; + put_label = compiler->put_labels; + executable_offset = SLJIT_EXEC_OFFSET(code); + + do { + buf_ptr = buf->memory; + buf_end = buf_ptr + buf->used_size; + do { + len = *buf_ptr++; + if (len > 0) { + /* The code is already generated. */ + SLJIT_MEMCPY(code_ptr, buf_ptr, len); + code_ptr += len; + buf_ptr += len; + } + else { + switch (*buf_ptr) { + case 0: + label->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset); + label->size = code_ptr - code; + label = label->next; + break; + case 1: + jump->addr = (sljit_uw)code_ptr; + if (!(jump->flags & SLJIT_REWRITABLE_JUMP)) + code_ptr = generate_near_jump_code(jump, code_ptr, code, executable_offset); + else { +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + code_ptr = generate_far_jump_code(jump, code_ptr, executable_offset); +#else + code_ptr = generate_far_jump_code(jump, code_ptr); +#endif + } + jump = jump->next; + break; + case 2: + const_->addr = ((sljit_uw)code_ptr) - sizeof(sljit_sw); + const_ = const_->next; + break; + default: + SLJIT_ASSERT(*buf_ptr == 3); + SLJIT_ASSERT(put_label->label); + put_label->addr = (sljit_uw)code_ptr; +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + code_ptr = generate_put_label_code(put_label, code_ptr, (sljit_uw)(SLJIT_ADD_EXEC_OFFSET(code, executable_offset) + put_label->label->size)); +#endif + put_label = put_label->next; + break; + } + buf_ptr++; + } + } while (buf_ptr < buf_end); + SLJIT_ASSERT(buf_ptr == buf_end); + buf = buf->next; + } while (buf); + + SLJIT_ASSERT(!label); + SLJIT_ASSERT(!jump); + SLJIT_ASSERT(!const_); + SLJIT_ASSERT(!put_label); + SLJIT_ASSERT(code_ptr <= code + compiler->size); + + jump = compiler->jumps; + while (jump) { + jump_addr = jump->addr + executable_offset; + + if (jump->flags & PATCH_MB) { + SLJIT_ASSERT((sljit_sw)(jump->u.label->addr - (jump_addr + sizeof(sljit_s8))) >= -128 && (sljit_sw)(jump->u.label->addr - (jump_addr + sizeof(sljit_s8))) <= 127); + *(sljit_u8*)jump->addr = (sljit_u8)(jump->u.label->addr - (jump_addr + sizeof(sljit_s8))); + } else if (jump->flags & PATCH_MW) { + if (jump->flags & JUMP_LABEL) { +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + sljit_unaligned_store_sw((void*)jump->addr, (sljit_sw)(jump->u.label->addr - (jump_addr + sizeof(sljit_sw)))); +#else + SLJIT_ASSERT((sljit_sw)(jump->u.label->addr - (jump_addr + sizeof(sljit_s32))) >= HALFWORD_MIN && (sljit_sw)(jump->u.label->addr - (jump_addr + sizeof(sljit_s32))) <= HALFWORD_MAX); + sljit_unaligned_store_s32((void*)jump->addr, (sljit_s32)(jump->u.label->addr - (jump_addr + sizeof(sljit_s32)))); +#endif + } + else { +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + sljit_unaligned_store_sw((void*)jump->addr, (sljit_sw)(jump->u.target - (jump_addr + sizeof(sljit_sw)))); +#else + SLJIT_ASSERT((sljit_sw)(jump->u.target - (jump_addr + sizeof(sljit_s32))) >= HALFWORD_MIN && (sljit_sw)(jump->u.target - (jump_addr + sizeof(sljit_s32))) <= HALFWORD_MAX); + sljit_unaligned_store_s32((void*)jump->addr, (sljit_s32)(jump->u.target - (jump_addr + sizeof(sljit_s32)))); +#endif + } + } +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + else if (jump->flags & PATCH_MD) + sljit_unaligned_store_sw((void*)jump->addr, jump->u.label->addr); +#endif + + jump = jump->next; + } + + put_label = compiler->put_labels; + while (put_label) { +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + sljit_unaligned_store_sw((void*)(put_label->addr - sizeof(sljit_sw)), (sljit_sw)put_label->label->addr); +#else + if (put_label->flags & PATCH_MD) { + SLJIT_ASSERT(put_label->label->addr > HALFWORD_MAX); + sljit_unaligned_store_sw((void*)(put_label->addr - sizeof(sljit_sw)), (sljit_sw)put_label->label->addr); + } + else { + SLJIT_ASSERT(put_label->label->addr <= HALFWORD_MAX); + sljit_unaligned_store_s32((void*)(put_label->addr - sizeof(sljit_s32)), (sljit_s32)put_label->label->addr); + } +#endif + + put_label = put_label->next; + } + + compiler->error = SLJIT_ERR_COMPILED; + compiler->executable_offset = executable_offset; + compiler->executable_size = code_ptr - code; + return (void*)(code + executable_offset); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type) +{ + switch (feature_type) { + case SLJIT_HAS_FPU: +#ifdef SLJIT_IS_FPU_AVAILABLE + return SLJIT_IS_FPU_AVAILABLE; +#elif (defined SLJIT_DETECT_SSE2 && SLJIT_DETECT_SSE2) + if (cpu_has_sse2 == -1) + get_cpu_features(); + return cpu_has_sse2; +#else /* SLJIT_DETECT_SSE2 */ + return 1; +#endif /* SLJIT_DETECT_SSE2 */ + +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + case SLJIT_HAS_VIRTUAL_REGISTERS: + return 1; +#endif + + case SLJIT_HAS_CLZ: + case SLJIT_HAS_CMOV: + if (cpu_has_cmov == -1) + get_cpu_features(); + return cpu_has_cmov; + + case SLJIT_HAS_SSE2: +#if (defined SLJIT_DETECT_SSE2 && SLJIT_DETECT_SSE2) + if (cpu_has_sse2 == -1) + get_cpu_features(); + return cpu_has_sse2; +#else + return 1; +#endif + + default: + return 0; + } +} + +/* --------------------------------------------------------------------- */ +/* Operators */ +/* --------------------------------------------------------------------- */ + +#define BINARY_OPCODE(opcode) (((opcode ## _EAX_i32) << 24) | ((opcode ## _r_rm) << 16) | ((opcode ## _rm_r) << 8) | (opcode)) + +static sljit_s32 emit_cum_binary(struct sljit_compiler *compiler, + sljit_u32 op_types, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w); + +static sljit_s32 emit_non_cum_binary(struct sljit_compiler *compiler, + sljit_u32 op_types, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w); + +static sljit_s32 emit_mov(struct sljit_compiler *compiler, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw); + +#define EMIT_MOV(compiler, dst, dstw, src, srcw) \ + FAIL_IF(emit_mov(compiler, dst, dstw, src, srcw)); + +static SLJIT_INLINE sljit_s32 emit_sse2_store(struct sljit_compiler *compiler, + sljit_s32 single, sljit_s32 dst, sljit_sw dstw, sljit_s32 src); + +static SLJIT_INLINE sljit_s32 emit_sse2_load(struct sljit_compiler *compiler, + sljit_s32 single, sljit_s32 dst, sljit_s32 src, sljit_sw srcw); + +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) +#include "sljitNativeX86_32.c" +#else +#include "sljitNativeX86_64.c" +#endif + +static sljit_s32 emit_mov(struct sljit_compiler *compiler, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + sljit_u8* inst; + + SLJIT_ASSERT(dst != SLJIT_UNUSED); + + if (FAST_IS_REG(src)) { + inst = emit_x86_instruction(compiler, 1, src, 0, dst, dstw); + FAIL_IF(!inst); + *inst = MOV_rm_r; + return SLJIT_SUCCESS; + } + if (src & SLJIT_IMM) { + if (FAST_IS_REG(dst)) { +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + return emit_do_imm(compiler, MOV_r_i32 + reg_map[dst], srcw); +#else + if (!compiler->mode32) { + if (NOT_HALFWORD(srcw)) + return emit_load_imm64(compiler, dst, srcw); + } + else + return emit_do_imm32(compiler, (reg_map[dst] >= 8) ? REX_B : 0, MOV_r_i32 + reg_lmap[dst], srcw); +#endif + } +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + if (!compiler->mode32 && NOT_HALFWORD(srcw)) { + /* Immediate to memory move. Only SLJIT_MOV operation copies + an immediate directly into memory so TMP_REG1 can be used. */ + FAIL_IF(emit_load_imm64(compiler, TMP_REG1, srcw)); + inst = emit_x86_instruction(compiler, 1, TMP_REG1, 0, dst, dstw); + FAIL_IF(!inst); + *inst = MOV_rm_r; + return SLJIT_SUCCESS; + } +#endif + inst = emit_x86_instruction(compiler, 1, SLJIT_IMM, srcw, dst, dstw); + FAIL_IF(!inst); + *inst = MOV_rm_i32; + return SLJIT_SUCCESS; + } + if (FAST_IS_REG(dst)) { + inst = emit_x86_instruction(compiler, 1, dst, 0, src, srcw); + FAIL_IF(!inst); + *inst = MOV_r_rm; + return SLJIT_SUCCESS; + } + + /* Memory to memory move. Only SLJIT_MOV operation copies + data from memory to memory so TMP_REG1 can be used. */ + inst = emit_x86_instruction(compiler, 1, TMP_REG1, 0, src, srcw); + FAIL_IF(!inst); + *inst = MOV_r_rm; + inst = emit_x86_instruction(compiler, 1, TMP_REG1, 0, dst, dstw); + FAIL_IF(!inst); + *inst = MOV_rm_r; + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compiler, sljit_s32 op) +{ + sljit_u8 *inst; +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + sljit_s32 size; +#endif + + CHECK_ERROR(); + CHECK(check_sljit_emit_op0(compiler, op)); + + switch (GET_OPCODE(op)) { + case SLJIT_BREAKPOINT: + inst = (sljit_u8*)ensure_buf(compiler, 1 + 1); + FAIL_IF(!inst); + INC_SIZE(1); + *inst = INT3; + break; + case SLJIT_NOP: + inst = (sljit_u8*)ensure_buf(compiler, 1 + 1); + FAIL_IF(!inst); + INC_SIZE(1); + *inst = NOP; + break; + case SLJIT_LMUL_UW: + case SLJIT_LMUL_SW: + case SLJIT_DIVMOD_UW: + case SLJIT_DIVMOD_SW: + case SLJIT_DIV_UW: + case SLJIT_DIV_SW: +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) +#ifdef _WIN64 + SLJIT_ASSERT( + reg_map[SLJIT_R0] == 0 + && reg_map[SLJIT_R1] == 2 + && reg_map[TMP_REG1] > 7); +#else + SLJIT_ASSERT( + reg_map[SLJIT_R0] == 0 + && reg_map[SLJIT_R1] < 7 + && reg_map[TMP_REG1] == 2); +#endif + compiler->mode32 = op & SLJIT_I32_OP; +#endif + SLJIT_COMPILE_ASSERT((SLJIT_DIVMOD_UW & 0x2) == 0 && SLJIT_DIV_UW - 0x2 == SLJIT_DIVMOD_UW, bad_div_opcode_assignments); + + op = GET_OPCODE(op); + if ((op | 0x2) == SLJIT_DIV_UW) { +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) || defined(_WIN64) + EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_R1, 0); + inst = emit_x86_instruction(compiler, 1, SLJIT_R1, 0, SLJIT_R1, 0); +#else + inst = emit_x86_instruction(compiler, 1, TMP_REG1, 0, TMP_REG1, 0); +#endif + FAIL_IF(!inst); + *inst = XOR_r_rm; + } + + if ((op | 0x2) == SLJIT_DIV_SW) { +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) || defined(_WIN64) + EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_R1, 0); +#endif + +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + inst = (sljit_u8*)ensure_buf(compiler, 1 + 1); + FAIL_IF(!inst); + INC_SIZE(1); + *inst = CDQ; +#else + if (compiler->mode32) { + inst = (sljit_u8*)ensure_buf(compiler, 1 + 1); + FAIL_IF(!inst); + INC_SIZE(1); + *inst = CDQ; + } else { + inst = (sljit_u8*)ensure_buf(compiler, 1 + 2); + FAIL_IF(!inst); + INC_SIZE(2); + *inst++ = REX_W; + *inst = CDQ; + } +#endif + } + +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + inst = (sljit_u8*)ensure_buf(compiler, 1 + 2); + FAIL_IF(!inst); + INC_SIZE(2); + *inst++ = GROUP_F7; + *inst = MOD_REG | ((op >= SLJIT_DIVMOD_UW) ? reg_map[TMP_REG1] : reg_map[SLJIT_R1]); +#else +#ifdef _WIN64 + size = (!compiler->mode32 || op >= SLJIT_DIVMOD_UW) ? 3 : 2; +#else + size = (!compiler->mode32) ? 3 : 2; +#endif + inst = (sljit_u8*)ensure_buf(compiler, 1 + size); + FAIL_IF(!inst); + INC_SIZE(size); +#ifdef _WIN64 + if (!compiler->mode32) + *inst++ = REX_W | ((op >= SLJIT_DIVMOD_UW) ? REX_B : 0); + else if (op >= SLJIT_DIVMOD_UW) + *inst++ = REX_B; + *inst++ = GROUP_F7; + *inst = MOD_REG | ((op >= SLJIT_DIVMOD_UW) ? reg_lmap[TMP_REG1] : reg_lmap[SLJIT_R1]); +#else + if (!compiler->mode32) + *inst++ = REX_W; + *inst++ = GROUP_F7; + *inst = MOD_REG | reg_map[SLJIT_R1]; +#endif +#endif + switch (op) { + case SLJIT_LMUL_UW: + *inst |= MUL; + break; + case SLJIT_LMUL_SW: + *inst |= IMUL; + break; + case SLJIT_DIVMOD_UW: + case SLJIT_DIV_UW: + *inst |= DIV; + break; + case SLJIT_DIVMOD_SW: + case SLJIT_DIV_SW: + *inst |= IDIV; + break; + } +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) && !defined(_WIN64) + if (op <= SLJIT_DIVMOD_SW) + EMIT_MOV(compiler, SLJIT_R1, 0, TMP_REG1, 0); +#else + if (op >= SLJIT_DIV_UW) + EMIT_MOV(compiler, SLJIT_R1, 0, TMP_REG1, 0); +#endif + break; + } + + return SLJIT_SUCCESS; +} + +#define ENCODE_PREFIX(prefix) \ + do { \ + inst = (sljit_u8*)ensure_buf(compiler, 1 + 1); \ + FAIL_IF(!inst); \ + INC_SIZE(1); \ + *inst = (prefix); \ + } while (0) + +static sljit_s32 emit_mov_byte(struct sljit_compiler *compiler, sljit_s32 sign, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + sljit_u8* inst; + sljit_s32 dst_r; +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + sljit_s32 work_r; +#endif + +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + compiler->mode32 = 0; +#endif + + if (src & SLJIT_IMM) { + if (FAST_IS_REG(dst)) { +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + return emit_do_imm(compiler, MOV_r_i32 + reg_map[dst], srcw); +#else + inst = emit_x86_instruction(compiler, 1, SLJIT_IMM, srcw, dst, 0); + FAIL_IF(!inst); + *inst = MOV_rm_i32; + return SLJIT_SUCCESS; +#endif + } + inst = emit_x86_instruction(compiler, 1 | EX86_BYTE_ARG | EX86_NO_REXW, SLJIT_IMM, srcw, dst, dstw); + FAIL_IF(!inst); + *inst = MOV_rm8_i8; + return SLJIT_SUCCESS; + } + + dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1; + + if ((dst & SLJIT_MEM) && FAST_IS_REG(src)) { +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + if (reg_map[src] >= 4) { + SLJIT_ASSERT(dst_r == TMP_REG1); + EMIT_MOV(compiler, TMP_REG1, 0, src, 0); + } else + dst_r = src; +#else + dst_r = src; +#endif + } +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + else if (FAST_IS_REG(src) && reg_map[src] >= 4) { + /* src, dst are registers. */ + SLJIT_ASSERT(SLOW_IS_REG(dst)); + if (reg_map[dst] < 4) { + if (dst != src) + EMIT_MOV(compiler, dst, 0, src, 0); + inst = emit_x86_instruction(compiler, 2, dst, 0, dst, 0); + FAIL_IF(!inst); + *inst++ = GROUP_0F; + *inst = sign ? MOVSX_r_rm8 : MOVZX_r_rm8; + } + else { + if (dst != src) + EMIT_MOV(compiler, dst, 0, src, 0); + if (sign) { + /* shl reg, 24 */ + inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, SLJIT_IMM, 24, dst, 0); + FAIL_IF(!inst); + *inst |= SHL; + /* sar reg, 24 */ + inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, SLJIT_IMM, 24, dst, 0); + FAIL_IF(!inst); + *inst |= SAR; + } + else { + inst = emit_x86_instruction(compiler, 1 | EX86_BIN_INS, SLJIT_IMM, 0xff, dst, 0); + FAIL_IF(!inst); + *(inst + 1) |= AND; + } + } + return SLJIT_SUCCESS; + } +#endif + else { + /* src can be memory addr or reg_map[src] < 4 on x86_32 architectures. */ + inst = emit_x86_instruction(compiler, 2, dst_r, 0, src, srcw); + FAIL_IF(!inst); + *inst++ = GROUP_0F; + *inst = sign ? MOVSX_r_rm8 : MOVZX_r_rm8; + } + + if (dst & SLJIT_MEM) { +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + if (dst_r == TMP_REG1) { + /* Find a non-used register, whose reg_map[src] < 4. */ + if ((dst & REG_MASK) == SLJIT_R0) { + if ((dst & OFFS_REG_MASK) == TO_OFFS_REG(SLJIT_R1)) + work_r = SLJIT_R2; + else + work_r = SLJIT_R1; + } + else { + if ((dst & OFFS_REG_MASK) != TO_OFFS_REG(SLJIT_R0)) + work_r = SLJIT_R0; + else if ((dst & REG_MASK) == SLJIT_R1) + work_r = SLJIT_R2; + else + work_r = SLJIT_R1; + } + + if (work_r == SLJIT_R0) { + ENCODE_PREFIX(XCHG_EAX_r + reg_map[TMP_REG1]); + } + else { + inst = emit_x86_instruction(compiler, 1, work_r, 0, dst_r, 0); + FAIL_IF(!inst); + *inst = XCHG_r_rm; + } + + inst = emit_x86_instruction(compiler, 1, work_r, 0, dst, dstw); + FAIL_IF(!inst); + *inst = MOV_rm8_r8; + + if (work_r == SLJIT_R0) { + ENCODE_PREFIX(XCHG_EAX_r + reg_map[TMP_REG1]); + } + else { + inst = emit_x86_instruction(compiler, 1, work_r, 0, dst_r, 0); + FAIL_IF(!inst); + *inst = XCHG_r_rm; + } + } + else { + inst = emit_x86_instruction(compiler, 1, dst_r, 0, dst, dstw); + FAIL_IF(!inst); + *inst = MOV_rm8_r8; + } +#else + inst = emit_x86_instruction(compiler, 1 | EX86_REX | EX86_NO_REXW, dst_r, 0, dst, dstw); + FAIL_IF(!inst); + *inst = MOV_rm8_r8; +#endif + } + + return SLJIT_SUCCESS; +} + +static sljit_s32 emit_prefetch(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 src, sljit_sw srcw) +{ + sljit_u8* inst; + +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + compiler->mode32 = 1; +#endif + + inst = emit_x86_instruction(compiler, 2, 0, 0, src, srcw); + FAIL_IF(!inst); + *inst++ = GROUP_0F; + *inst++ = PREFETCH; + + if (op >= SLJIT_MOV_U8 && op <= SLJIT_MOV_S8) + *inst |= (3 << 3); + else if (op >= SLJIT_MOV_U16 && op <= SLJIT_MOV_S16) + *inst |= (2 << 3); + else + *inst |= (1 << 3); + + return SLJIT_SUCCESS; +} + +static sljit_s32 emit_mov_half(struct sljit_compiler *compiler, sljit_s32 sign, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + sljit_u8* inst; + sljit_s32 dst_r; + +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + compiler->mode32 = 0; +#endif + + if (src & SLJIT_IMM) { + if (FAST_IS_REG(dst)) { +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + return emit_do_imm(compiler, MOV_r_i32 + reg_map[dst], srcw); +#else + inst = emit_x86_instruction(compiler, 1, SLJIT_IMM, srcw, dst, 0); + FAIL_IF(!inst); + *inst = MOV_rm_i32; + return SLJIT_SUCCESS; +#endif + } + inst = emit_x86_instruction(compiler, 1 | EX86_HALF_ARG | EX86_NO_REXW | EX86_PREF_66, SLJIT_IMM, srcw, dst, dstw); + FAIL_IF(!inst); + *inst = MOV_rm_i32; + return SLJIT_SUCCESS; + } + + dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1; + + if ((dst & SLJIT_MEM) && FAST_IS_REG(src)) + dst_r = src; + else { + inst = emit_x86_instruction(compiler, 2, dst_r, 0, src, srcw); + FAIL_IF(!inst); + *inst++ = GROUP_0F; + *inst = sign ? MOVSX_r_rm16 : MOVZX_r_rm16; + } + + if (dst & SLJIT_MEM) { + inst = emit_x86_instruction(compiler, 1 | EX86_NO_REXW | EX86_PREF_66, dst_r, 0, dst, dstw); + FAIL_IF(!inst); + *inst = MOV_rm_r; + } + + return SLJIT_SUCCESS; +} + +static sljit_s32 emit_unary(struct sljit_compiler *compiler, sljit_u8 opcode, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + sljit_u8* inst; + + if (dst == src && dstw == srcw) { + /* Same input and output */ + inst = emit_x86_instruction(compiler, 1, 0, 0, dst, dstw); + FAIL_IF(!inst); + *inst++ = GROUP_F7; + *inst |= opcode; + return SLJIT_SUCCESS; + } + + if (SLJIT_UNLIKELY(dst == SLJIT_UNUSED)) + dst = TMP_REG1; + + if (FAST_IS_REG(dst)) { + EMIT_MOV(compiler, dst, 0, src, srcw); + inst = emit_x86_instruction(compiler, 1, 0, 0, dst, 0); + FAIL_IF(!inst); + *inst++ = GROUP_F7; + *inst |= opcode; + return SLJIT_SUCCESS; + } + + EMIT_MOV(compiler, TMP_REG1, 0, src, srcw); + inst = emit_x86_instruction(compiler, 1, 0, 0, TMP_REG1, 0); + FAIL_IF(!inst); + *inst++ = GROUP_F7; + *inst |= opcode; + EMIT_MOV(compiler, dst, dstw, TMP_REG1, 0); + return SLJIT_SUCCESS; +} + +static sljit_s32 emit_not_with_flags(struct sljit_compiler *compiler, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + sljit_u8* inst; + + if (dst == SLJIT_UNUSED) + dst = TMP_REG1; + + if (FAST_IS_REG(dst)) { + EMIT_MOV(compiler, dst, 0, src, srcw); + inst = emit_x86_instruction(compiler, 1, 0, 0, dst, 0); + FAIL_IF(!inst); + *inst++ = GROUP_F7; + *inst |= NOT_rm; + inst = emit_x86_instruction(compiler, 1, dst, 0, dst, 0); + FAIL_IF(!inst); + *inst = OR_r_rm; + return SLJIT_SUCCESS; + } + + EMIT_MOV(compiler, TMP_REG1, 0, src, srcw); + inst = emit_x86_instruction(compiler, 1, 0, 0, TMP_REG1, 0); + FAIL_IF(!inst); + *inst++ = GROUP_F7; + *inst |= NOT_rm; + inst = emit_x86_instruction(compiler, 1, TMP_REG1, 0, TMP_REG1, 0); + FAIL_IF(!inst); + *inst = OR_r_rm; + EMIT_MOV(compiler, dst, dstw, TMP_REG1, 0); + return SLJIT_SUCCESS; +} + +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) +static const sljit_sw emit_clz_arg = 32 + 31; +#endif + +static sljit_s32 emit_clz(struct sljit_compiler *compiler, sljit_s32 op_flags, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + sljit_u8* inst; + sljit_s32 dst_r; + + SLJIT_UNUSED_ARG(op_flags); + + if (cpu_has_cmov == -1) + get_cpu_features(); + + dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1; + + inst = emit_x86_instruction(compiler, 2, dst_r, 0, src, srcw); + FAIL_IF(!inst); + *inst++ = GROUP_0F; + *inst = BSR_r_rm; + +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + if (cpu_has_cmov) { + if (dst_r != TMP_REG1) { + EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_IMM, 32 + 31); + inst = emit_x86_instruction(compiler, 2, dst_r, 0, TMP_REG1, 0); + } + else + inst = emit_x86_instruction(compiler, 2, dst_r, 0, SLJIT_MEM0(), (sljit_sw)&emit_clz_arg); + + FAIL_IF(!inst); + *inst++ = GROUP_0F; + *inst = CMOVE_r_rm; + } + else + FAIL_IF(sljit_emit_cmov_generic(compiler, SLJIT_EQUAL, dst_r, SLJIT_IMM, 32 + 31)); + + inst = emit_x86_instruction(compiler, 1 | EX86_BIN_INS, SLJIT_IMM, 31, dst_r, 0); +#else + if (cpu_has_cmov) { + EMIT_MOV(compiler, TMP_REG2, 0, SLJIT_IMM, !(op_flags & SLJIT_I32_OP) ? (64 + 63) : (32 + 31)); + + inst = emit_x86_instruction(compiler, 2, dst_r, 0, TMP_REG2, 0); + FAIL_IF(!inst); + *inst++ = GROUP_0F; + *inst = CMOVE_r_rm; + } + else + FAIL_IF(sljit_emit_cmov_generic(compiler, SLJIT_EQUAL, dst_r, SLJIT_IMM, !(op_flags & SLJIT_I32_OP) ? (64 + 63) : (32 + 31))); + + inst = emit_x86_instruction(compiler, 1 | EX86_BIN_INS, SLJIT_IMM, !(op_flags & SLJIT_I32_OP) ? 63 : 31, dst_r, 0); +#endif + + FAIL_IF(!inst); + *(inst + 1) |= XOR; + + if (dst & SLJIT_MEM) + EMIT_MOV(compiler, dst, dstw, TMP_REG1, 0); + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + sljit_s32 op_flags = GET_ALL_FLAGS(op); +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + sljit_s32 dst_is_ereg = 0; +#endif + + CHECK_ERROR(); + CHECK(check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw)); + ADJUST_LOCAL_OFFSET(dst, dstw); + ADJUST_LOCAL_OFFSET(src, srcw); + + CHECK_EXTRA_REGS(dst, dstw, dst_is_ereg = 1); + CHECK_EXTRA_REGS(src, srcw, (void)0); +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + compiler->mode32 = op_flags & SLJIT_I32_OP; +#endif + + if (dst == SLJIT_UNUSED && !HAS_FLAGS(op)) { + if (op <= SLJIT_MOV_P && (src & SLJIT_MEM)) + return emit_prefetch(compiler, op, src, srcw); + return SLJIT_SUCCESS; + } + + op = GET_OPCODE(op); + + if (op >= SLJIT_MOV && op <= SLJIT_MOV_P) { +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + compiler->mode32 = 0; +#endif + + if (FAST_IS_REG(src) && src == dst) { + if (!TYPE_CAST_NEEDED(op)) + return SLJIT_SUCCESS; + } + + if (op_flags & SLJIT_I32_OP) { +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + if (src & SLJIT_MEM) { + if (op == SLJIT_MOV_S32) + op = SLJIT_MOV_U32; + } + else if (src & SLJIT_IMM) { + if (op == SLJIT_MOV_U32) + op = SLJIT_MOV_S32; + } +#endif + } + + if (src & SLJIT_IMM) { + switch (op) { + case SLJIT_MOV_U8: + srcw = (sljit_u8)srcw; + break; + case SLJIT_MOV_S8: + srcw = (sljit_s8)srcw; + break; + case SLJIT_MOV_U16: + srcw = (sljit_u16)srcw; + break; + case SLJIT_MOV_S16: + srcw = (sljit_s16)srcw; + break; +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + case SLJIT_MOV_U32: + srcw = (sljit_u32)srcw; + break; + case SLJIT_MOV_S32: + srcw = (sljit_s32)srcw; + break; +#endif + } +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + if (SLJIT_UNLIKELY(dst_is_ereg)) + return emit_mov(compiler, dst, dstw, src, srcw); +#endif + } + +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + if (SLJIT_UNLIKELY(dst_is_ereg) && (!(op == SLJIT_MOV || op == SLJIT_MOV_U32 || op == SLJIT_MOV_S32 || op == SLJIT_MOV_P) || (src & SLJIT_MEM))) { + SLJIT_ASSERT(dst == SLJIT_MEM1(SLJIT_SP)); + dst = TMP_REG1; + } +#endif + + switch (op) { + case SLJIT_MOV: + case SLJIT_MOV_P: +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + case SLJIT_MOV_U32: + case SLJIT_MOV_S32: +#endif + FAIL_IF(emit_mov(compiler, dst, dstw, src, srcw)); + break; + case SLJIT_MOV_U8: + FAIL_IF(emit_mov_byte(compiler, 0, dst, dstw, src, srcw)); + break; + case SLJIT_MOV_S8: + FAIL_IF(emit_mov_byte(compiler, 1, dst, dstw, src, srcw)); + break; + case SLJIT_MOV_U16: + FAIL_IF(emit_mov_half(compiler, 0, dst, dstw, src, srcw)); + break; + case SLJIT_MOV_S16: + FAIL_IF(emit_mov_half(compiler, 1, dst, dstw, src, srcw)); + break; +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + case SLJIT_MOV_U32: + FAIL_IF(emit_mov_int(compiler, 0, dst, dstw, src, srcw)); + break; + case SLJIT_MOV_S32: + FAIL_IF(emit_mov_int(compiler, 1, dst, dstw, src, srcw)); + break; +#endif + } + +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + if (SLJIT_UNLIKELY(dst_is_ereg) && dst == TMP_REG1) + return emit_mov(compiler, SLJIT_MEM1(SLJIT_SP), dstw, TMP_REG1, 0); +#endif + return SLJIT_SUCCESS; + } + + switch (op) { + case SLJIT_NOT: + if (SLJIT_UNLIKELY(op_flags & SLJIT_SET_Z)) + return emit_not_with_flags(compiler, dst, dstw, src, srcw); + return emit_unary(compiler, NOT_rm, dst, dstw, src, srcw); + + case SLJIT_NEG: + return emit_unary(compiler, NEG_rm, dst, dstw, src, srcw); + + case SLJIT_CLZ: + return emit_clz(compiler, op_flags, dst, dstw, src, srcw); + } + + return SLJIT_SUCCESS; +} + +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + +#define BINARY_IMM(op_imm, op_mr, immw, arg, argw) \ + if (IS_HALFWORD(immw) || compiler->mode32) { \ + inst = emit_x86_instruction(compiler, 1 | EX86_BIN_INS, SLJIT_IMM, immw, arg, argw); \ + FAIL_IF(!inst); \ + *(inst + 1) |= (op_imm); \ + } \ + else { \ + FAIL_IF(emit_load_imm64(compiler, (arg == TMP_REG1) ? TMP_REG2 : TMP_REG1, immw)); \ + inst = emit_x86_instruction(compiler, 1, (arg == TMP_REG1) ? TMP_REG2 : TMP_REG1, 0, arg, argw); \ + FAIL_IF(!inst); \ + *inst = (op_mr); \ + } + +#define BINARY_EAX_IMM(op_eax_imm, immw) \ + FAIL_IF(emit_do_imm32(compiler, (!compiler->mode32) ? REX_W : 0, (op_eax_imm), immw)) + +#else + +#define BINARY_IMM(op_imm, op_mr, immw, arg, argw) \ + inst = emit_x86_instruction(compiler, 1 | EX86_BIN_INS, SLJIT_IMM, immw, arg, argw); \ + FAIL_IF(!inst); \ + *(inst + 1) |= (op_imm); + +#define BINARY_EAX_IMM(op_eax_imm, immw) \ + FAIL_IF(emit_do_imm(compiler, (op_eax_imm), immw)) + +#endif + +static sljit_s32 emit_cum_binary(struct sljit_compiler *compiler, + sljit_u32 op_types, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + sljit_u8* inst; + sljit_u8 op_eax_imm = (op_types >> 24); + sljit_u8 op_rm = (op_types >> 16) & 0xff; + sljit_u8 op_mr = (op_types >> 8) & 0xff; + sljit_u8 op_imm = op_types & 0xff; + + if (dst == SLJIT_UNUSED) { + EMIT_MOV(compiler, TMP_REG1, 0, src1, src1w); + if (src2 & SLJIT_IMM) { + BINARY_IMM(op_imm, op_mr, src2w, TMP_REG1, 0); + } + else { + inst = emit_x86_instruction(compiler, 1, TMP_REG1, 0, src2, src2w); + FAIL_IF(!inst); + *inst = op_rm; + } + return SLJIT_SUCCESS; + } + + if (dst == src1 && dstw == src1w) { + if (src2 & SLJIT_IMM) { +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + if ((dst == SLJIT_R0) && (src2w > 127 || src2w < -128) && (compiler->mode32 || IS_HALFWORD(src2w))) { +#else + if ((dst == SLJIT_R0) && (src2w > 127 || src2w < -128)) { +#endif + BINARY_EAX_IMM(op_eax_imm, src2w); + } + else { + BINARY_IMM(op_imm, op_mr, src2w, dst, dstw); + } + } + else if (FAST_IS_REG(dst)) { + inst = emit_x86_instruction(compiler, 1, dst, dstw, src2, src2w); + FAIL_IF(!inst); + *inst = op_rm; + } + else if (FAST_IS_REG(src2)) { + /* Special exception for sljit_emit_op_flags. */ + inst = emit_x86_instruction(compiler, 1, src2, src2w, dst, dstw); + FAIL_IF(!inst); + *inst = op_mr; + } + else { + EMIT_MOV(compiler, TMP_REG1, 0, src2, src2w); + inst = emit_x86_instruction(compiler, 1, TMP_REG1, 0, dst, dstw); + FAIL_IF(!inst); + *inst = op_mr; + } + return SLJIT_SUCCESS; + } + + /* Only for cumulative operations. */ + if (dst == src2 && dstw == src2w) { + if (src1 & SLJIT_IMM) { +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + if ((dst == SLJIT_R0) && (src1w > 127 || src1w < -128) && (compiler->mode32 || IS_HALFWORD(src1w))) { +#else + if ((dst == SLJIT_R0) && (src1w > 127 || src1w < -128)) { +#endif + BINARY_EAX_IMM(op_eax_imm, src1w); + } + else { + BINARY_IMM(op_imm, op_mr, src1w, dst, dstw); + } + } + else if (FAST_IS_REG(dst)) { + inst = emit_x86_instruction(compiler, 1, dst, dstw, src1, src1w); + FAIL_IF(!inst); + *inst = op_rm; + } + else if (FAST_IS_REG(src1)) { + inst = emit_x86_instruction(compiler, 1, src1, src1w, dst, dstw); + FAIL_IF(!inst); + *inst = op_mr; + } + else { + EMIT_MOV(compiler, TMP_REG1, 0, src1, src1w); + inst = emit_x86_instruction(compiler, 1, TMP_REG1, 0, dst, dstw); + FAIL_IF(!inst); + *inst = op_mr; + } + return SLJIT_SUCCESS; + } + + /* General version. */ + if (FAST_IS_REG(dst)) { + EMIT_MOV(compiler, dst, 0, src1, src1w); + if (src2 & SLJIT_IMM) { + BINARY_IMM(op_imm, op_mr, src2w, dst, 0); + } + else { + inst = emit_x86_instruction(compiler, 1, dst, 0, src2, src2w); + FAIL_IF(!inst); + *inst = op_rm; + } + } + else { + /* This version requires less memory writing. */ + EMIT_MOV(compiler, TMP_REG1, 0, src1, src1w); + if (src2 & SLJIT_IMM) { + BINARY_IMM(op_imm, op_mr, src2w, TMP_REG1, 0); + } + else { + inst = emit_x86_instruction(compiler, 1, TMP_REG1, 0, src2, src2w); + FAIL_IF(!inst); + *inst = op_rm; + } + EMIT_MOV(compiler, dst, dstw, TMP_REG1, 0); + } + + return SLJIT_SUCCESS; +} + +static sljit_s32 emit_non_cum_binary(struct sljit_compiler *compiler, + sljit_u32 op_types, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + sljit_u8* inst; + sljit_u8 op_eax_imm = (op_types >> 24); + sljit_u8 op_rm = (op_types >> 16) & 0xff; + sljit_u8 op_mr = (op_types >> 8) & 0xff; + sljit_u8 op_imm = op_types & 0xff; + + if (dst == SLJIT_UNUSED) { + EMIT_MOV(compiler, TMP_REG1, 0, src1, src1w); + if (src2 & SLJIT_IMM) { + BINARY_IMM(op_imm, op_mr, src2w, TMP_REG1, 0); + } + else { + inst = emit_x86_instruction(compiler, 1, TMP_REG1, 0, src2, src2w); + FAIL_IF(!inst); + *inst = op_rm; + } + return SLJIT_SUCCESS; + } + + if (dst == src1 && dstw == src1w) { + if (src2 & SLJIT_IMM) { +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + if ((dst == SLJIT_R0) && (src2w > 127 || src2w < -128) && (compiler->mode32 || IS_HALFWORD(src2w))) { +#else + if ((dst == SLJIT_R0) && (src2w > 127 || src2w < -128)) { +#endif + BINARY_EAX_IMM(op_eax_imm, src2w); + } + else { + BINARY_IMM(op_imm, op_mr, src2w, dst, dstw); + } + } + else if (FAST_IS_REG(dst)) { + inst = emit_x86_instruction(compiler, 1, dst, dstw, src2, src2w); + FAIL_IF(!inst); + *inst = op_rm; + } + else if (FAST_IS_REG(src2)) { + inst = emit_x86_instruction(compiler, 1, src2, src2w, dst, dstw); + FAIL_IF(!inst); + *inst = op_mr; + } + else { + EMIT_MOV(compiler, TMP_REG1, 0, src2, src2w); + inst = emit_x86_instruction(compiler, 1, TMP_REG1, 0, dst, dstw); + FAIL_IF(!inst); + *inst = op_mr; + } + return SLJIT_SUCCESS; + } + + /* General version. */ + if (FAST_IS_REG(dst) && dst != src2) { + EMIT_MOV(compiler, dst, 0, src1, src1w); + if (src2 & SLJIT_IMM) { + BINARY_IMM(op_imm, op_mr, src2w, dst, 0); + } + else { + inst = emit_x86_instruction(compiler, 1, dst, 0, src2, src2w); + FAIL_IF(!inst); + *inst = op_rm; + } + } + else { + /* This version requires less memory writing. */ + EMIT_MOV(compiler, TMP_REG1, 0, src1, src1w); + if (src2 & SLJIT_IMM) { + BINARY_IMM(op_imm, op_mr, src2w, TMP_REG1, 0); + } + else { + inst = emit_x86_instruction(compiler, 1, TMP_REG1, 0, src2, src2w); + FAIL_IF(!inst); + *inst = op_rm; + } + EMIT_MOV(compiler, dst, dstw, TMP_REG1, 0); + } + + return SLJIT_SUCCESS; +} + +static sljit_s32 emit_mul(struct sljit_compiler *compiler, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + sljit_u8* inst; + sljit_s32 dst_r; + + dst_r = SLOW_IS_REG(dst) ? dst : TMP_REG1; + + /* Register destination. */ + if (dst_r == src1 && !(src2 & SLJIT_IMM)) { + inst = emit_x86_instruction(compiler, 2, dst_r, 0, src2, src2w); + FAIL_IF(!inst); + *inst++ = GROUP_0F; + *inst = IMUL_r_rm; + } + else if (dst_r == src2 && !(src1 & SLJIT_IMM)) { + inst = emit_x86_instruction(compiler, 2, dst_r, 0, src1, src1w); + FAIL_IF(!inst); + *inst++ = GROUP_0F; + *inst = IMUL_r_rm; + } + else if (src1 & SLJIT_IMM) { + if (src2 & SLJIT_IMM) { + EMIT_MOV(compiler, dst_r, 0, SLJIT_IMM, src2w); + src2 = dst_r; + src2w = 0; + } + + if (src1w <= 127 && src1w >= -128) { + inst = emit_x86_instruction(compiler, 1, dst_r, 0, src2, src2w); + FAIL_IF(!inst); + *inst = IMUL_r_rm_i8; + inst = (sljit_u8*)ensure_buf(compiler, 1 + 1); + FAIL_IF(!inst); + INC_SIZE(1); + *inst = (sljit_s8)src1w; + } +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + else { + inst = emit_x86_instruction(compiler, 1, dst_r, 0, src2, src2w); + FAIL_IF(!inst); + *inst = IMUL_r_rm_i32; + inst = (sljit_u8*)ensure_buf(compiler, 1 + 4); + FAIL_IF(!inst); + INC_SIZE(4); + sljit_unaligned_store_sw(inst, src1w); + } +#else + else if (IS_HALFWORD(src1w)) { + inst = emit_x86_instruction(compiler, 1, dst_r, 0, src2, src2w); + FAIL_IF(!inst); + *inst = IMUL_r_rm_i32; + inst = (sljit_u8*)ensure_buf(compiler, 1 + 4); + FAIL_IF(!inst); + INC_SIZE(4); + sljit_unaligned_store_s32(inst, (sljit_s32)src1w); + } + else { + if (dst_r != src2) + EMIT_MOV(compiler, dst_r, 0, src2, src2w); + FAIL_IF(emit_load_imm64(compiler, TMP_REG2, src1w)); + inst = emit_x86_instruction(compiler, 2, dst_r, 0, TMP_REG2, 0); + FAIL_IF(!inst); + *inst++ = GROUP_0F; + *inst = IMUL_r_rm; + } +#endif + } + else if (src2 & SLJIT_IMM) { + /* Note: src1 is NOT immediate. */ + + if (src2w <= 127 && src2w >= -128) { + inst = emit_x86_instruction(compiler, 1, dst_r, 0, src1, src1w); + FAIL_IF(!inst); + *inst = IMUL_r_rm_i8; + inst = (sljit_u8*)ensure_buf(compiler, 1 + 1); + FAIL_IF(!inst); + INC_SIZE(1); + *inst = (sljit_s8)src2w; + } +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + else { + inst = emit_x86_instruction(compiler, 1, dst_r, 0, src1, src1w); + FAIL_IF(!inst); + *inst = IMUL_r_rm_i32; + inst = (sljit_u8*)ensure_buf(compiler, 1 + 4); + FAIL_IF(!inst); + INC_SIZE(4); + sljit_unaligned_store_sw(inst, src2w); + } +#else + else if (IS_HALFWORD(src2w)) { + inst = emit_x86_instruction(compiler, 1, dst_r, 0, src1, src1w); + FAIL_IF(!inst); + *inst = IMUL_r_rm_i32; + inst = (sljit_u8*)ensure_buf(compiler, 1 + 4); + FAIL_IF(!inst); + INC_SIZE(4); + sljit_unaligned_store_s32(inst, (sljit_s32)src2w); + } + else { + if (dst_r != src1) + EMIT_MOV(compiler, dst_r, 0, src1, src1w); + FAIL_IF(emit_load_imm64(compiler, TMP_REG2, src2w)); + inst = emit_x86_instruction(compiler, 2, dst_r, 0, TMP_REG2, 0); + FAIL_IF(!inst); + *inst++ = GROUP_0F; + *inst = IMUL_r_rm; + } +#endif + } + else { + /* Neither argument is immediate. */ + if (ADDRESSING_DEPENDS_ON(src2, dst_r)) + dst_r = TMP_REG1; + EMIT_MOV(compiler, dst_r, 0, src1, src1w); + inst = emit_x86_instruction(compiler, 2, dst_r, 0, src2, src2w); + FAIL_IF(!inst); + *inst++ = GROUP_0F; + *inst = IMUL_r_rm; + } + + if (dst & SLJIT_MEM) + EMIT_MOV(compiler, dst, dstw, TMP_REG1, 0); + + return SLJIT_SUCCESS; +} + +static sljit_s32 emit_lea_binary(struct sljit_compiler *compiler, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + sljit_u8* inst; + sljit_s32 dst_r, done = 0; + + /* These cases better be left to handled by normal way. */ + if (dst == src1 && dstw == src1w) + return SLJIT_ERR_UNSUPPORTED; + if (dst == src2 && dstw == src2w) + return SLJIT_ERR_UNSUPPORTED; + + dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1; + + if (FAST_IS_REG(src1)) { + if (FAST_IS_REG(src2)) { + inst = emit_x86_instruction(compiler, 1, dst_r, 0, SLJIT_MEM2(src1, src2), 0); + FAIL_IF(!inst); + *inst = LEA_r_m; + done = 1; + } +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + if ((src2 & SLJIT_IMM) && (compiler->mode32 || IS_HALFWORD(src2w))) { + inst = emit_x86_instruction(compiler, 1, dst_r, 0, SLJIT_MEM1(src1), (sljit_s32)src2w); +#else + if (src2 & SLJIT_IMM) { + inst = emit_x86_instruction(compiler, 1, dst_r, 0, SLJIT_MEM1(src1), src2w); +#endif + FAIL_IF(!inst); + *inst = LEA_r_m; + done = 1; + } + } + else if (FAST_IS_REG(src2)) { +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + if ((src1 & SLJIT_IMM) && (compiler->mode32 || IS_HALFWORD(src1w))) { + inst = emit_x86_instruction(compiler, 1, dst_r, 0, SLJIT_MEM1(src2), (sljit_s32)src1w); +#else + if (src1 & SLJIT_IMM) { + inst = emit_x86_instruction(compiler, 1, dst_r, 0, SLJIT_MEM1(src2), src1w); +#endif + FAIL_IF(!inst); + *inst = LEA_r_m; + done = 1; + } + } + + if (done) { + if (dst_r == TMP_REG1) + return emit_mov(compiler, dst, dstw, TMP_REG1, 0); + return SLJIT_SUCCESS; + } + return SLJIT_ERR_UNSUPPORTED; +} + +static sljit_s32 emit_cmp_binary(struct sljit_compiler *compiler, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + sljit_u8* inst; + +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + if (src1 == SLJIT_R0 && (src2 & SLJIT_IMM) && (src2w > 127 || src2w < -128) && (compiler->mode32 || IS_HALFWORD(src2w))) { +#else + if (src1 == SLJIT_R0 && (src2 & SLJIT_IMM) && (src2w > 127 || src2w < -128)) { +#endif + BINARY_EAX_IMM(CMP_EAX_i32, src2w); + return SLJIT_SUCCESS; + } + + if (FAST_IS_REG(src1)) { + if (src2 & SLJIT_IMM) { + BINARY_IMM(CMP, CMP_rm_r, src2w, src1, 0); + } + else { + inst = emit_x86_instruction(compiler, 1, src1, 0, src2, src2w); + FAIL_IF(!inst); + *inst = CMP_r_rm; + } + return SLJIT_SUCCESS; + } + + if (FAST_IS_REG(src2) && !(src1 & SLJIT_IMM)) { + inst = emit_x86_instruction(compiler, 1, src2, 0, src1, src1w); + FAIL_IF(!inst); + *inst = CMP_rm_r; + return SLJIT_SUCCESS; + } + + if (src2 & SLJIT_IMM) { + if (src1 & SLJIT_IMM) { + EMIT_MOV(compiler, TMP_REG1, 0, src1, src1w); + src1 = TMP_REG1; + src1w = 0; + } + BINARY_IMM(CMP, CMP_rm_r, src2w, src1, src1w); + } + else { + EMIT_MOV(compiler, TMP_REG1, 0, src1, src1w); + inst = emit_x86_instruction(compiler, 1, TMP_REG1, 0, src2, src2w); + FAIL_IF(!inst); + *inst = CMP_r_rm; + } + return SLJIT_SUCCESS; +} + +static sljit_s32 emit_test_binary(struct sljit_compiler *compiler, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + sljit_u8* inst; + +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + if (src1 == SLJIT_R0 && (src2 & SLJIT_IMM) && (src2w > 127 || src2w < -128) && (compiler->mode32 || IS_HALFWORD(src2w))) { +#else + if (src1 == SLJIT_R0 && (src2 & SLJIT_IMM) && (src2w > 127 || src2w < -128)) { +#endif + BINARY_EAX_IMM(TEST_EAX_i32, src2w); + return SLJIT_SUCCESS; + } + +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + if (src2 == SLJIT_R0 && (src1 & SLJIT_IMM) && (src1w > 127 || src1w < -128) && (compiler->mode32 || IS_HALFWORD(src1w))) { +#else + if (src2 == SLJIT_R0 && (src1 & SLJIT_IMM) && (src1w > 127 || src1w < -128)) { +#endif + BINARY_EAX_IMM(TEST_EAX_i32, src1w); + return SLJIT_SUCCESS; + } + + if (!(src1 & SLJIT_IMM)) { + if (src2 & SLJIT_IMM) { +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + if (IS_HALFWORD(src2w) || compiler->mode32) { + inst = emit_x86_instruction(compiler, 1, SLJIT_IMM, src2w, src1, src1w); + FAIL_IF(!inst); + *inst = GROUP_F7; + } + else { + FAIL_IF(emit_load_imm64(compiler, TMP_REG1, src2w)); + inst = emit_x86_instruction(compiler, 1, TMP_REG1, 0, src1, src1w); + FAIL_IF(!inst); + *inst = TEST_rm_r; + } +#else + inst = emit_x86_instruction(compiler, 1, SLJIT_IMM, src2w, src1, src1w); + FAIL_IF(!inst); + *inst = GROUP_F7; +#endif + return SLJIT_SUCCESS; + } + else if (FAST_IS_REG(src1)) { + inst = emit_x86_instruction(compiler, 1, src1, 0, src2, src2w); + FAIL_IF(!inst); + *inst = TEST_rm_r; + return SLJIT_SUCCESS; + } + } + + if (!(src2 & SLJIT_IMM)) { + if (src1 & SLJIT_IMM) { +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + if (IS_HALFWORD(src1w) || compiler->mode32) { + inst = emit_x86_instruction(compiler, 1, SLJIT_IMM, src1w, src2, src2w); + FAIL_IF(!inst); + *inst = GROUP_F7; + } + else { + FAIL_IF(emit_load_imm64(compiler, TMP_REG1, src1w)); + inst = emit_x86_instruction(compiler, 1, TMP_REG1, 0, src2, src2w); + FAIL_IF(!inst); + *inst = TEST_rm_r; + } +#else + inst = emit_x86_instruction(compiler, 1, src1, src1w, src2, src2w); + FAIL_IF(!inst); + *inst = GROUP_F7; +#endif + return SLJIT_SUCCESS; + } + else if (FAST_IS_REG(src2)) { + inst = emit_x86_instruction(compiler, 1, src2, 0, src1, src1w); + FAIL_IF(!inst); + *inst = TEST_rm_r; + return SLJIT_SUCCESS; + } + } + + EMIT_MOV(compiler, TMP_REG1, 0, src1, src1w); + if (src2 & SLJIT_IMM) { +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + if (IS_HALFWORD(src2w) || compiler->mode32) { + inst = emit_x86_instruction(compiler, 1, SLJIT_IMM, src2w, TMP_REG1, 0); + FAIL_IF(!inst); + *inst = GROUP_F7; + } + else { + FAIL_IF(emit_load_imm64(compiler, TMP_REG2, src2w)); + inst = emit_x86_instruction(compiler, 1, TMP_REG2, 0, TMP_REG1, 0); + FAIL_IF(!inst); + *inst = TEST_rm_r; + } +#else + inst = emit_x86_instruction(compiler, 1, SLJIT_IMM, src2w, TMP_REG1, 0); + FAIL_IF(!inst); + *inst = GROUP_F7; +#endif + } + else { + inst = emit_x86_instruction(compiler, 1, TMP_REG1, 0, src2, src2w); + FAIL_IF(!inst); + *inst = TEST_rm_r; + } + return SLJIT_SUCCESS; +} + +static sljit_s32 emit_shift(struct sljit_compiler *compiler, + sljit_u8 mode, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + sljit_u8* inst; + + if ((src2 & SLJIT_IMM) || (src2 == SLJIT_PREF_SHIFT_REG)) { + if (dst == src1 && dstw == src1w) { + inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, src2, src2w, dst, dstw); + FAIL_IF(!inst); + *inst |= mode; + return SLJIT_SUCCESS; + } + if (dst == SLJIT_UNUSED) { + EMIT_MOV(compiler, TMP_REG1, 0, src1, src1w); + inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, src2, src2w, TMP_REG1, 0); + FAIL_IF(!inst); + *inst |= mode; + return SLJIT_SUCCESS; + } + if (dst == SLJIT_PREF_SHIFT_REG && src2 == SLJIT_PREF_SHIFT_REG) { + EMIT_MOV(compiler, TMP_REG1, 0, src1, src1w); + inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, SLJIT_PREF_SHIFT_REG, 0, TMP_REG1, 0); + FAIL_IF(!inst); + *inst |= mode; + EMIT_MOV(compiler, SLJIT_PREF_SHIFT_REG, 0, TMP_REG1, 0); + return SLJIT_SUCCESS; + } + if (FAST_IS_REG(dst)) { + EMIT_MOV(compiler, dst, 0, src1, src1w); + inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, src2, src2w, dst, 0); + FAIL_IF(!inst); + *inst |= mode; + return SLJIT_SUCCESS; + } + + EMIT_MOV(compiler, TMP_REG1, 0, src1, src1w); + inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, src2, src2w, TMP_REG1, 0); + FAIL_IF(!inst); + *inst |= mode; + EMIT_MOV(compiler, dst, dstw, TMP_REG1, 0); + return SLJIT_SUCCESS; + } + + if (dst == SLJIT_PREF_SHIFT_REG) { + EMIT_MOV(compiler, TMP_REG1, 0, src1, src1w); + EMIT_MOV(compiler, SLJIT_PREF_SHIFT_REG, 0, src2, src2w); + inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, SLJIT_PREF_SHIFT_REG, 0, TMP_REG1, 0); + FAIL_IF(!inst); + *inst |= mode; + EMIT_MOV(compiler, SLJIT_PREF_SHIFT_REG, 0, TMP_REG1, 0); + } + else if (SLOW_IS_REG(dst) && dst != src2 && !ADDRESSING_DEPENDS_ON(src2, dst)) { + if (src1 != dst) + EMIT_MOV(compiler, dst, 0, src1, src1w); + EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_PREF_SHIFT_REG, 0); + EMIT_MOV(compiler, SLJIT_PREF_SHIFT_REG, 0, src2, src2w); + inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, SLJIT_PREF_SHIFT_REG, 0, dst, 0); + FAIL_IF(!inst); + *inst |= mode; + EMIT_MOV(compiler, SLJIT_PREF_SHIFT_REG, 0, TMP_REG1, 0); + } + else { + /* This case is complex since ecx itself may be used for + addressing, and this case must be supported as well. */ + EMIT_MOV(compiler, TMP_REG1, 0, src1, src1w); +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + EMIT_MOV(compiler, SLJIT_MEM1(SLJIT_SP), 0, SLJIT_PREF_SHIFT_REG, 0); + EMIT_MOV(compiler, SLJIT_PREF_SHIFT_REG, 0, src2, src2w); + inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, SLJIT_PREF_SHIFT_REG, 0, TMP_REG1, 0); + FAIL_IF(!inst); + *inst |= mode; + EMIT_MOV(compiler, SLJIT_PREF_SHIFT_REG, 0, SLJIT_MEM1(SLJIT_SP), 0); +#else + EMIT_MOV(compiler, TMP_REG2, 0, SLJIT_PREF_SHIFT_REG, 0); + EMIT_MOV(compiler, SLJIT_PREF_SHIFT_REG, 0, src2, src2w); + inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, SLJIT_PREF_SHIFT_REG, 0, TMP_REG1, 0); + FAIL_IF(!inst); + *inst |= mode; + EMIT_MOV(compiler, SLJIT_PREF_SHIFT_REG, 0, TMP_REG2, 0); +#endif + if (dst != SLJIT_UNUSED) + return emit_mov(compiler, dst, dstw, TMP_REG1, 0); + } + + return SLJIT_SUCCESS; +} + +static sljit_s32 emit_shift_with_flags(struct sljit_compiler *compiler, + sljit_u8 mode, sljit_s32 set_flags, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + /* The CPU does not set flags if the shift count is 0. */ + if (src2 & SLJIT_IMM) { +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + if ((src2w & 0x3f) != 0 || (compiler->mode32 && (src2w & 0x1f) != 0)) + return emit_shift(compiler, mode, dst, dstw, src1, src1w, src2, src2w); +#else + if ((src2w & 0x1f) != 0) + return emit_shift(compiler, mode, dst, dstw, src1, src1w, src2, src2w); +#endif + if (!set_flags) + return emit_mov(compiler, dst, dstw, src1, src1w); + /* OR dst, src, 0 */ + return emit_cum_binary(compiler, BINARY_OPCODE(OR), + dst, dstw, src1, src1w, SLJIT_IMM, 0); + } + + if (!set_flags) + return emit_shift(compiler, mode, dst, dstw, src1, src1w, src2, src2w); + + if (!FAST_IS_REG(dst)) + FAIL_IF(emit_cmp_binary(compiler, src1, src1w, SLJIT_IMM, 0)); + + FAIL_IF(emit_shift(compiler, mode, dst, dstw, src1, src1w, src2, src2w)); + + if (FAST_IS_REG(dst)) + return emit_cmp_binary(compiler, (dst == SLJIT_UNUSED) ? TMP_REG1 : dst, dstw, SLJIT_IMM, 0); + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + CHECK_ERROR(); + CHECK(check_sljit_emit_op2(compiler, op, dst, dstw, src1, src1w, src2, src2w)); + ADJUST_LOCAL_OFFSET(dst, dstw); + ADJUST_LOCAL_OFFSET(src1, src1w); + ADJUST_LOCAL_OFFSET(src2, src2w); + + CHECK_EXTRA_REGS(dst, dstw, (void)0); + CHECK_EXTRA_REGS(src1, src1w, (void)0); + CHECK_EXTRA_REGS(src2, src2w, (void)0); +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + compiler->mode32 = op & SLJIT_I32_OP; +#endif + + if (dst == SLJIT_UNUSED && !HAS_FLAGS(op)) + return SLJIT_SUCCESS; + + switch (GET_OPCODE(op)) { + case SLJIT_ADD: + if (!HAS_FLAGS(op)) { + if (emit_lea_binary(compiler, dst, dstw, src1, src1w, src2, src2w) != SLJIT_ERR_UNSUPPORTED) + return compiler->error; + } + return emit_cum_binary(compiler, BINARY_OPCODE(ADD), + dst, dstw, src1, src1w, src2, src2w); + case SLJIT_ADDC: + return emit_cum_binary(compiler, BINARY_OPCODE(ADC), + dst, dstw, src1, src1w, src2, src2w); + case SLJIT_SUB: + if (!HAS_FLAGS(op)) { + if ((src2 & SLJIT_IMM) && emit_lea_binary(compiler, dst, dstw, src1, src1w, SLJIT_IMM, -src2w) != SLJIT_ERR_UNSUPPORTED) + return compiler->error; + } + + if (dst == SLJIT_UNUSED) + return emit_cmp_binary(compiler, src1, src1w, src2, src2w); + return emit_non_cum_binary(compiler, BINARY_OPCODE(SUB), + dst, dstw, src1, src1w, src2, src2w); + case SLJIT_SUBC: + return emit_non_cum_binary(compiler, BINARY_OPCODE(SBB), + dst, dstw, src1, src1w, src2, src2w); + case SLJIT_MUL: + return emit_mul(compiler, dst, dstw, src1, src1w, src2, src2w); + case SLJIT_AND: + if (dst == SLJIT_UNUSED) + return emit_test_binary(compiler, src1, src1w, src2, src2w); + return emit_cum_binary(compiler, BINARY_OPCODE(AND), + dst, dstw, src1, src1w, src2, src2w); + case SLJIT_OR: + return emit_cum_binary(compiler, BINARY_OPCODE(OR), + dst, dstw, src1, src1w, src2, src2w); + case SLJIT_XOR: + return emit_cum_binary(compiler, BINARY_OPCODE(XOR), + dst, dstw, src1, src1w, src2, src2w); + case SLJIT_SHL: + return emit_shift_with_flags(compiler, SHL, HAS_FLAGS(op), + dst, dstw, src1, src1w, src2, src2w); + case SLJIT_LSHR: + return emit_shift_with_flags(compiler, SHR, HAS_FLAGS(op), + dst, dstw, src1, src1w, src2, src2w); + case SLJIT_ASHR: + return emit_shift_with_flags(compiler, SAR, HAS_FLAGS(op), + dst, dstw, src1, src1w, src2, src2w); + } + + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg) +{ + CHECK_REG_INDEX(check_sljit_get_register_index(reg)); +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + if (reg >= SLJIT_R3 && reg <= SLJIT_R8) + return -1; +#endif + return reg_map[reg]; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_float_register_index(sljit_s32 reg) +{ + CHECK_REG_INDEX(check_sljit_get_float_register_index(reg)); +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + return reg; +#else + return freg_map[reg]; +#endif +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler, + void *instruction, sljit_s32 size) +{ + sljit_u8 *inst; + + CHECK_ERROR(); + CHECK(check_sljit_emit_op_custom(compiler, instruction, size)); + + inst = (sljit_u8*)ensure_buf(compiler, 1 + size); + FAIL_IF(!inst); + INC_SIZE(size); + SLJIT_MEMCPY(inst, instruction, size); + return SLJIT_SUCCESS; +} + +/* --------------------------------------------------------------------- */ +/* Floating point operators */ +/* --------------------------------------------------------------------- */ + +/* Alignment(3) + 4 * 16 bytes. */ +static sljit_s32 sse2_data[3 + (4 * 4)]; +static sljit_s32 *sse2_buffer; + +static void init_compiler(void) +{ + /* Align to 16 bytes. */ + sse2_buffer = (sljit_s32*)(((sljit_uw)sse2_data + 15) & ~0xf); + + /* Single precision constants (each constant is 16 byte long). */ + sse2_buffer[0] = 0x80000000; + sse2_buffer[4] = 0x7fffffff; + /* Double precision constants (each constant is 16 byte long). */ + sse2_buffer[8] = 0; + sse2_buffer[9] = 0x80000000; + sse2_buffer[12] = 0xffffffff; + sse2_buffer[13] = 0x7fffffff; +} + +static sljit_s32 emit_sse2(struct sljit_compiler *compiler, sljit_u8 opcode, + sljit_s32 single, sljit_s32 xmm1, sljit_s32 xmm2, sljit_sw xmm2w) +{ + sljit_u8 *inst; + + inst = emit_x86_instruction(compiler, 2 | (single ? EX86_PREF_F3 : EX86_PREF_F2) | EX86_SSE2, xmm1, 0, xmm2, xmm2w); + FAIL_IF(!inst); + *inst++ = GROUP_0F; + *inst = opcode; + return SLJIT_SUCCESS; +} + +static sljit_s32 emit_sse2_logic(struct sljit_compiler *compiler, sljit_u8 opcode, + sljit_s32 pref66, sljit_s32 xmm1, sljit_s32 xmm2, sljit_sw xmm2w) +{ + sljit_u8 *inst; + + inst = emit_x86_instruction(compiler, 2 | (pref66 ? EX86_PREF_66 : 0) | EX86_SSE2, xmm1, 0, xmm2, xmm2w); + FAIL_IF(!inst); + *inst++ = GROUP_0F; + *inst = opcode; + return SLJIT_SUCCESS; +} + +static SLJIT_INLINE sljit_s32 emit_sse2_load(struct sljit_compiler *compiler, + sljit_s32 single, sljit_s32 dst, sljit_s32 src, sljit_sw srcw) +{ + return emit_sse2(compiler, MOVSD_x_xm, single, dst, src, srcw); +} + +static SLJIT_INLINE sljit_s32 emit_sse2_store(struct sljit_compiler *compiler, + sljit_s32 single, sljit_s32 dst, sljit_sw dstw, sljit_s32 src) +{ + return emit_sse2(compiler, MOVSD_xm_x, single, src, dst, dstw); +} + +static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_sw_from_f64(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1; + sljit_u8 *inst; + +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + if (GET_OPCODE(op) == SLJIT_CONV_SW_FROM_F64) + compiler->mode32 = 0; +#endif + + inst = emit_x86_instruction(compiler, 2 | ((op & SLJIT_F32_OP) ? EX86_PREF_F3 : EX86_PREF_F2) | EX86_SSE2_OP2, dst_r, 0, src, srcw); + FAIL_IF(!inst); + *inst++ = GROUP_0F; + *inst = CVTTSD2SI_r_xm; + + if (dst & SLJIT_MEM) + return emit_mov(compiler, dst, dstw, TMP_REG1, 0); + return SLJIT_SUCCESS; +} + +static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG; + sljit_u8 *inst; + +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_SW) + compiler->mode32 = 0; +#endif + + if (src & SLJIT_IMM) { +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32) + srcw = (sljit_s32)srcw; +#endif + EMIT_MOV(compiler, TMP_REG1, 0, src, srcw); + src = TMP_REG1; + srcw = 0; + } + + inst = emit_x86_instruction(compiler, 2 | ((op & SLJIT_F32_OP) ? EX86_PREF_F3 : EX86_PREF_F2) | EX86_SSE2_OP1, dst_r, 0, src, srcw); + FAIL_IF(!inst); + *inst++ = GROUP_0F; + *inst = CVTSI2SD_x_rm; + +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + compiler->mode32 = 1; +#endif + if (dst_r == TMP_FREG) + return emit_sse2_store(compiler, op & SLJIT_F32_OP, dst, dstw, TMP_FREG); + return SLJIT_SUCCESS; +} + +static SLJIT_INLINE sljit_s32 sljit_emit_fop1_cmp(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + if (!FAST_IS_REG(src1)) { + FAIL_IF(emit_sse2_load(compiler, op & SLJIT_F32_OP, TMP_FREG, src1, src1w)); + src1 = TMP_FREG; + } + + return emit_sse2_logic(compiler, UCOMISD_x_xm, !(op & SLJIT_F32_OP), src1, src2, src2w); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src, sljit_sw srcw) +{ + sljit_s32 dst_r; + +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + compiler->mode32 = 1; +#endif + + CHECK_ERROR(); + SELECT_FOP1_OPERATION_WITH_CHECKS(compiler, op, dst, dstw, src, srcw); + + if (GET_OPCODE(op) == SLJIT_MOV_F64) { + if (FAST_IS_REG(dst)) + return emit_sse2_load(compiler, op & SLJIT_F32_OP, dst, src, srcw); + if (FAST_IS_REG(src)) + return emit_sse2_store(compiler, op & SLJIT_F32_OP, dst, dstw, src); + FAIL_IF(emit_sse2_load(compiler, op & SLJIT_F32_OP, TMP_FREG, src, srcw)); + return emit_sse2_store(compiler, op & SLJIT_F32_OP, dst, dstw, TMP_FREG); + } + + if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_F32) { + dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG; + if (FAST_IS_REG(src)) { + /* We overwrite the high bits of source. From SLJIT point of view, + this is not an issue. + Note: In SSE3, we could also use MOVDDUP and MOVSLDUP. */ + FAIL_IF(emit_sse2_logic(compiler, UNPCKLPD_x_xm, op & SLJIT_F32_OP, src, src, 0)); + } + else { + FAIL_IF(emit_sse2_load(compiler, !(op & SLJIT_F32_OP), TMP_FREG, src, srcw)); + src = TMP_FREG; + } + + FAIL_IF(emit_sse2_logic(compiler, CVTPD2PS_x_xm, op & SLJIT_F32_OP, dst_r, src, 0)); + if (dst_r == TMP_FREG) + return emit_sse2_store(compiler, op & SLJIT_F32_OP, dst, dstw, TMP_FREG); + return SLJIT_SUCCESS; + } + + if (FAST_IS_REG(dst)) { + dst_r = dst; + if (dst != src) + FAIL_IF(emit_sse2_load(compiler, op & SLJIT_F32_OP, dst_r, src, srcw)); + } + else { + dst_r = TMP_FREG; + FAIL_IF(emit_sse2_load(compiler, op & SLJIT_F32_OP, dst_r, src, srcw)); + } + + switch (GET_OPCODE(op)) { + case SLJIT_NEG_F64: + FAIL_IF(emit_sse2_logic(compiler, XORPD_x_xm, 1, dst_r, SLJIT_MEM0(), (sljit_sw)(op & SLJIT_F32_OP ? sse2_buffer : sse2_buffer + 8))); + break; + + case SLJIT_ABS_F64: + FAIL_IF(emit_sse2_logic(compiler, ANDPD_x_xm, 1, dst_r, SLJIT_MEM0(), (sljit_sw)(op & SLJIT_F32_OP ? sse2_buffer + 4 : sse2_buffer + 12))); + break; + } + + if (dst_r == TMP_FREG) + return emit_sse2_store(compiler, op & SLJIT_F32_OP, dst, dstw, TMP_FREG); + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 src1, sljit_sw src1w, + sljit_s32 src2, sljit_sw src2w) +{ + sljit_s32 dst_r; + + CHECK_ERROR(); + CHECK(check_sljit_emit_fop2(compiler, op, dst, dstw, src1, src1w, src2, src2w)); + ADJUST_LOCAL_OFFSET(dst, dstw); + ADJUST_LOCAL_OFFSET(src1, src1w); + ADJUST_LOCAL_OFFSET(src2, src2w); + +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + compiler->mode32 = 1; +#endif + + if (FAST_IS_REG(dst)) { + dst_r = dst; + if (dst == src1) + ; /* Do nothing here. */ + else if (dst == src2 && (op == SLJIT_ADD_F64 || op == SLJIT_MUL_F64)) { + /* Swap arguments. */ + src2 = src1; + src2w = src1w; + } + else if (dst != src2) + FAIL_IF(emit_sse2_load(compiler, op & SLJIT_F32_OP, dst_r, src1, src1w)); + else { + dst_r = TMP_FREG; + FAIL_IF(emit_sse2_load(compiler, op & SLJIT_F32_OP, TMP_FREG, src1, src1w)); + } + } + else { + dst_r = TMP_FREG; + FAIL_IF(emit_sse2_load(compiler, op & SLJIT_F32_OP, TMP_FREG, src1, src1w)); + } + + switch (GET_OPCODE(op)) { + case SLJIT_ADD_F64: + FAIL_IF(emit_sse2(compiler, ADDSD_x_xm, op & SLJIT_F32_OP, dst_r, src2, src2w)); + break; + + case SLJIT_SUB_F64: + FAIL_IF(emit_sse2(compiler, SUBSD_x_xm, op & SLJIT_F32_OP, dst_r, src2, src2w)); + break; + + case SLJIT_MUL_F64: + FAIL_IF(emit_sse2(compiler, MULSD_x_xm, op & SLJIT_F32_OP, dst_r, src2, src2w)); + break; + + case SLJIT_DIV_F64: + FAIL_IF(emit_sse2(compiler, DIVSD_x_xm, op & SLJIT_F32_OP, dst_r, src2, src2w)); + break; + } + + if (dst_r == TMP_FREG) + return emit_sse2_store(compiler, op & SLJIT_F32_OP, dst, dstw, TMP_FREG); + return SLJIT_SUCCESS; +} + +/* --------------------------------------------------------------------- */ +/* Conditional instructions */ +/* --------------------------------------------------------------------- */ + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compiler *compiler) +{ + sljit_u8 *inst; + struct sljit_label *label; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_label(compiler)); + + if (compiler->last_label && compiler->last_label->size == compiler->size) + return compiler->last_label; + + label = (struct sljit_label*)ensure_abuf(compiler, sizeof(struct sljit_label)); + PTR_FAIL_IF(!label); + set_label(label, compiler); + + inst = (sljit_u8*)ensure_buf(compiler, 2); + PTR_FAIL_IF(!inst); + + *inst++ = 0; + *inst++ = 0; + + return label; +} + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, sljit_s32 type) +{ + sljit_u8 *inst; + struct sljit_jump *jump; + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_jump(compiler, type)); + + jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump)); + PTR_FAIL_IF_NULL(jump); + set_jump(jump, compiler, (type & SLJIT_REWRITABLE_JUMP) | ((type & 0xff) << TYPE_SHIFT)); + type &= 0xff; + + /* Worst case size. */ +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + compiler->size += (type >= SLJIT_JUMP) ? 5 : 6; +#else + compiler->size += (type >= SLJIT_JUMP) ? (10 + 3) : (2 + 10 + 3); +#endif + + inst = (sljit_u8*)ensure_buf(compiler, 2); + PTR_FAIL_IF_NULL(inst); + + *inst++ = 0; + *inst++ = 1; + return jump; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 src, sljit_sw srcw) +{ + sljit_u8 *inst; + struct sljit_jump *jump; + + CHECK_ERROR(); + CHECK(check_sljit_emit_ijump(compiler, type, src, srcw)); + ADJUST_LOCAL_OFFSET(src, srcw); + + CHECK_EXTRA_REGS(src, srcw, (void)0); + + if (src == SLJIT_IMM) { + jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump)); + FAIL_IF_NULL(jump); + set_jump(jump, compiler, JUMP_ADDR | (type << TYPE_SHIFT)); + jump->u.target = srcw; + + /* Worst case size. */ +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + compiler->size += 5; +#else + compiler->size += 10 + 3; +#endif + + inst = (sljit_u8*)ensure_buf(compiler, 2); + FAIL_IF_NULL(inst); + + *inst++ = 0; + *inst++ = 1; + } + else { +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + /* REX_W is not necessary (src is not immediate). */ + compiler->mode32 = 1; +#endif + inst = emit_x86_instruction(compiler, 1, 0, 0, src, srcw); + FAIL_IF(!inst); + *inst++ = GROUP_FF; + *inst |= (type >= SLJIT_FAST_CALL) ? CALL_rm : JMP_rm; + } + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_s32 op, + sljit_s32 dst, sljit_sw dstw, + sljit_s32 type) +{ + sljit_u8 *inst; + sljit_u8 cond_set = 0; +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + sljit_s32 reg; +#endif + /* ADJUST_LOCAL_OFFSET and CHECK_EXTRA_REGS might overwrite these values. */ + sljit_s32 dst_save = dst; + sljit_sw dstw_save = dstw; + + CHECK_ERROR(); + CHECK(check_sljit_emit_op_flags(compiler, op, dst, dstw, type)); + + ADJUST_LOCAL_OFFSET(dst, dstw); + CHECK_EXTRA_REGS(dst, dstw, (void)0); + + type &= 0xff; + /* setcc = jcc + 0x10. */ + cond_set = get_jump_code(type) + 0x10; + +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + if (GET_OPCODE(op) == SLJIT_OR && !GET_ALL_FLAGS(op) && FAST_IS_REG(dst)) { + inst = (sljit_u8*)ensure_buf(compiler, 1 + 4 + 3); + FAIL_IF(!inst); + INC_SIZE(4 + 3); + /* Set low register to conditional flag. */ + *inst++ = (reg_map[TMP_REG1] <= 7) ? REX : REX_B; + *inst++ = GROUP_0F; + *inst++ = cond_set; + *inst++ = MOD_REG | reg_lmap[TMP_REG1]; + *inst++ = REX | (reg_map[TMP_REG1] <= 7 ? 0 : REX_R) | (reg_map[dst] <= 7 ? 0 : REX_B); + *inst++ = OR_rm8_r8; + *inst++ = MOD_REG | (reg_lmap[TMP_REG1] << 3) | reg_lmap[dst]; + return SLJIT_SUCCESS; + } + + reg = (GET_OPCODE(op) < SLJIT_ADD && FAST_IS_REG(dst)) ? dst : TMP_REG1; + + inst = (sljit_u8*)ensure_buf(compiler, 1 + 4 + 4); + FAIL_IF(!inst); + INC_SIZE(4 + 4); + /* Set low register to conditional flag. */ + *inst++ = (reg_map[reg] <= 7) ? REX : REX_B; + *inst++ = GROUP_0F; + *inst++ = cond_set; + *inst++ = MOD_REG | reg_lmap[reg]; + *inst++ = REX_W | (reg_map[reg] <= 7 ? 0 : (REX_B | REX_R)); + /* The movzx instruction does not affect flags. */ + *inst++ = GROUP_0F; + *inst++ = MOVZX_r_rm8; + *inst = MOD_REG | (reg_lmap[reg] << 3) | reg_lmap[reg]; + + if (reg != TMP_REG1) + return SLJIT_SUCCESS; + + if (GET_OPCODE(op) < SLJIT_ADD) { + compiler->mode32 = GET_OPCODE(op) != SLJIT_MOV; + return emit_mov(compiler, dst, dstw, TMP_REG1, 0); + } + +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \ + || (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + compiler->skip_checks = 1; +#endif + return sljit_emit_op2(compiler, op, dst_save, dstw_save, dst_save, dstw_save, TMP_REG1, 0); + +#else + /* The SLJIT_CONFIG_X86_32 code path starts here. */ + if (GET_OPCODE(op) < SLJIT_ADD && FAST_IS_REG(dst)) { + if (reg_map[dst] <= 4) { + /* Low byte is accessible. */ + inst = (sljit_u8*)ensure_buf(compiler, 1 + 3 + 3); + FAIL_IF(!inst); + INC_SIZE(3 + 3); + /* Set low byte to conditional flag. */ + *inst++ = GROUP_0F; + *inst++ = cond_set; + *inst++ = MOD_REG | reg_map[dst]; + + *inst++ = GROUP_0F; + *inst++ = MOVZX_r_rm8; + *inst = MOD_REG | (reg_map[dst] << 3) | reg_map[dst]; + return SLJIT_SUCCESS; + } + + /* Low byte is not accessible. */ + if (cpu_has_cmov == -1) + get_cpu_features(); + + if (cpu_has_cmov) { + EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_IMM, 1); + /* a xor reg, reg operation would overwrite the flags. */ + EMIT_MOV(compiler, dst, 0, SLJIT_IMM, 0); + + inst = (sljit_u8*)ensure_buf(compiler, 1 + 3); + FAIL_IF(!inst); + INC_SIZE(3); + + *inst++ = GROUP_0F; + /* cmovcc = setcc - 0x50. */ + *inst++ = cond_set - 0x50; + *inst++ = MOD_REG | (reg_map[dst] << 3) | reg_map[TMP_REG1]; + return SLJIT_SUCCESS; + } + + inst = (sljit_u8*)ensure_buf(compiler, 1 + 1 + 3 + 3 + 1); + FAIL_IF(!inst); + INC_SIZE(1 + 3 + 3 + 1); + *inst++ = XCHG_EAX_r + reg_map[TMP_REG1]; + /* Set al to conditional flag. */ + *inst++ = GROUP_0F; + *inst++ = cond_set; + *inst++ = MOD_REG | 0 /* eax */; + + *inst++ = GROUP_0F; + *inst++ = MOVZX_r_rm8; + *inst++ = MOD_REG | (reg_map[dst] << 3) | 0 /* eax */; + *inst++ = XCHG_EAX_r + reg_map[TMP_REG1]; + return SLJIT_SUCCESS; + } + + if (GET_OPCODE(op) == SLJIT_OR && !GET_ALL_FLAGS(op) && FAST_IS_REG(dst) && reg_map[dst] <= 4) { + SLJIT_ASSERT(reg_map[SLJIT_R0] == 0); + + if (dst != SLJIT_R0) { + inst = (sljit_u8*)ensure_buf(compiler, 1 + 1 + 3 + 2 + 1); + FAIL_IF(!inst); + INC_SIZE(1 + 3 + 2 + 1); + /* Set low register to conditional flag. */ + *inst++ = XCHG_EAX_r + reg_map[TMP_REG1]; + *inst++ = GROUP_0F; + *inst++ = cond_set; + *inst++ = MOD_REG | 0 /* eax */; + *inst++ = OR_rm8_r8; + *inst++ = MOD_REG | (0 /* eax */ << 3) | reg_map[dst]; + *inst++ = XCHG_EAX_r + reg_map[TMP_REG1]; + } + else { + inst = (sljit_u8*)ensure_buf(compiler, 1 + 2 + 3 + 2 + 2); + FAIL_IF(!inst); + INC_SIZE(2 + 3 + 2 + 2); + /* Set low register to conditional flag. */ + *inst++ = XCHG_r_rm; + *inst++ = MOD_REG | (1 /* ecx */ << 3) | reg_map[TMP_REG1]; + *inst++ = GROUP_0F; + *inst++ = cond_set; + *inst++ = MOD_REG | 1 /* ecx */; + *inst++ = OR_rm8_r8; + *inst++ = MOD_REG | (1 /* ecx */ << 3) | 0 /* eax */; + *inst++ = XCHG_r_rm; + *inst++ = MOD_REG | (1 /* ecx */ << 3) | reg_map[TMP_REG1]; + } + return SLJIT_SUCCESS; + } + + /* Set TMP_REG1 to the bit. */ + inst = (sljit_u8*)ensure_buf(compiler, 1 + 1 + 3 + 3 + 1); + FAIL_IF(!inst); + INC_SIZE(1 + 3 + 3 + 1); + *inst++ = XCHG_EAX_r + reg_map[TMP_REG1]; + /* Set al to conditional flag. */ + *inst++ = GROUP_0F; + *inst++ = cond_set; + *inst++ = MOD_REG | 0 /* eax */; + + *inst++ = GROUP_0F; + *inst++ = MOVZX_r_rm8; + *inst++ = MOD_REG | (0 << 3) /* eax */ | 0 /* eax */; + + *inst++ = XCHG_EAX_r + reg_map[TMP_REG1]; + + if (GET_OPCODE(op) < SLJIT_ADD) + return emit_mov(compiler, dst, dstw, TMP_REG1, 0); + +#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \ + || (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) + compiler->skip_checks = 1; +#endif + return sljit_emit_op2(compiler, op, dst_save, dstw_save, dst_save, dstw_save, TMP_REG1, 0); +#endif /* SLJIT_CONFIG_X86_64 */ +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compiler, sljit_s32 type, + sljit_s32 dst_reg, + sljit_s32 src, sljit_sw srcw) +{ + sljit_u8* inst; + + CHECK_ERROR(); + CHECK(check_sljit_emit_cmov(compiler, type, dst_reg, src, srcw)); + +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + dst_reg &= ~SLJIT_I32_OP; + + if (!sljit_has_cpu_feature(SLJIT_HAS_CMOV) || (dst_reg >= SLJIT_R3 && dst_reg <= SLJIT_S3)) + return sljit_emit_cmov_generic(compiler, type, dst_reg, src, srcw); +#else + if (!sljit_has_cpu_feature(SLJIT_HAS_CMOV)) + return sljit_emit_cmov_generic(compiler, type, dst_reg, src, srcw); +#endif + + /* ADJUST_LOCAL_OFFSET is not needed. */ + CHECK_EXTRA_REGS(src, srcw, (void)0); + +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + compiler->mode32 = dst_reg & SLJIT_I32_OP; + dst_reg &= ~SLJIT_I32_OP; +#endif + + if (SLJIT_UNLIKELY(src & SLJIT_IMM)) { + EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_IMM, srcw); + src = TMP_REG1; + srcw = 0; + } + + inst = emit_x86_instruction(compiler, 2, dst_reg, 0, src, srcw); + FAIL_IF(!inst); + *inst++ = GROUP_0F; + *inst = get_jump_code(type & 0xff) - 0x40; + return SLJIT_SUCCESS; +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_local_base(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw offset) +{ + CHECK_ERROR(); + CHECK(check_sljit_get_local_base(compiler, dst, dstw, offset)); + ADJUST_LOCAL_OFFSET(dst, dstw); + + CHECK_EXTRA_REGS(dst, dstw, (void)0); + +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + compiler->mode32 = 0; +#endif + + ADJUST_LOCAL_OFFSET(SLJIT_MEM1(SLJIT_SP), offset); + +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + if (NOT_HALFWORD(offset)) { + FAIL_IF(emit_load_imm64(compiler, TMP_REG1, offset)); +#if (defined SLJIT_DEBUG && SLJIT_DEBUG) + SLJIT_ASSERT(emit_lea_binary(compiler, dst, dstw, SLJIT_SP, 0, TMP_REG1, 0) != SLJIT_ERR_UNSUPPORTED); + return compiler->error; +#else + return emit_lea_binary(compiler, dst, dstw, SLJIT_SP, 0, TMP_REG1, 0); +#endif + } +#endif + + if (offset != 0) + return emit_lea_binary(compiler, dst, dstw, SLJIT_SP, 0, SLJIT_IMM, offset); + return emit_mov(compiler, dst, dstw, SLJIT_SP, 0); +} + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw init_value) +{ + sljit_u8 *inst; + struct sljit_const *const_; +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + sljit_s32 reg; +#endif + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value)); + ADJUST_LOCAL_OFFSET(dst, dstw); + + CHECK_EXTRA_REGS(dst, dstw, (void)0); + + const_ = (struct sljit_const*)ensure_abuf(compiler, sizeof(struct sljit_const)); + PTR_FAIL_IF(!const_); + set_const(const_, compiler); + +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + compiler->mode32 = 0; + reg = FAST_IS_REG(dst) ? dst : TMP_REG1; + + if (emit_load_imm64(compiler, reg, init_value)) + return NULL; +#else + if (emit_mov(compiler, dst, dstw, SLJIT_IMM, init_value)) + return NULL; +#endif + + inst = (sljit_u8*)ensure_buf(compiler, 2); + PTR_FAIL_IF(!inst); + + *inst++ = 0; + *inst++ = 2; + +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + if (dst & SLJIT_MEM) + if (emit_mov(compiler, dst, dstw, TMP_REG1, 0)) + return NULL; +#endif + + return const_; +} + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_put_label* sljit_emit_put_label(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw) +{ + struct sljit_put_label *put_label; + sljit_u8 *inst; +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + sljit_s32 reg; + sljit_uw start_size; +#endif + + CHECK_ERROR_PTR(); + CHECK_PTR(check_sljit_emit_put_label(compiler, dst, dstw)); + ADJUST_LOCAL_OFFSET(dst, dstw); + + CHECK_EXTRA_REGS(dst, dstw, (void)0); + + put_label = (struct sljit_put_label*)ensure_abuf(compiler, sizeof(struct sljit_put_label)); + PTR_FAIL_IF(!put_label); + set_put_label(put_label, compiler, 0); + +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + compiler->mode32 = 0; + reg = FAST_IS_REG(dst) ? dst : TMP_REG1; + + if (emit_load_imm64(compiler, reg, 0)) + return NULL; +#else + if (emit_mov(compiler, dst, dstw, SLJIT_IMM, 0)) + return NULL; +#endif + +#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) + if (dst & SLJIT_MEM) { + start_size = compiler->size; + if (emit_mov(compiler, dst, dstw, TMP_REG1, 0)) + return NULL; + put_label->flags = compiler->size - start_size; + } +#endif + + inst = (sljit_u8*)ensure_buf(compiler, 2); + PTR_FAIL_IF(!inst); + + *inst++ = 0; + *inst++ = 3; + + return put_label; +} + +SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset) +{ + SLJIT_UNUSED_ARG(executable_offset); +#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) + sljit_unaligned_store_sw((void*)addr, new_target - (addr + 4) - (sljit_uw)executable_offset); +#else + sljit_unaligned_store_sw((void*)addr, (sljit_sw) new_target); +#endif +} + +SLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_constant, sljit_sw executable_offset) +{ + SLJIT_UNUSED_ARG(executable_offset); + sljit_unaligned_store_sw((void*)addr, new_constant); +} diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitUtils.c b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitUtils.c new file mode 100755 index 000000000..857492a17 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/sljit/sljitUtils.c @@ -0,0 +1,339 @@ +/* + * Stack-less Just-In-Time compiler + * + * Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* ------------------------------------------------------------------------ */ +/* Locks */ +/* ------------------------------------------------------------------------ */ + +#if (defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR) || (defined SLJIT_UTIL_GLOBAL_LOCK && SLJIT_UTIL_GLOBAL_LOCK) + +#if (defined SLJIT_SINGLE_THREADED && SLJIT_SINGLE_THREADED) + +#if (defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR) + +static SLJIT_INLINE void allocator_grab_lock(void) +{ + /* Always successful. */ +} + +static SLJIT_INLINE void allocator_release_lock(void) +{ + /* Always successful. */ +} + +#endif /* SLJIT_EXECUTABLE_ALLOCATOR */ + +#if (defined SLJIT_UTIL_GLOBAL_LOCK && SLJIT_UTIL_GLOBAL_LOCK) + +SLJIT_API_FUNC_ATTRIBUTE void SLJIT_FUNC sljit_grab_lock(void) +{ + /* Always successful. */ +} + +SLJIT_API_FUNC_ATTRIBUTE void SLJIT_FUNC sljit_release_lock(void) +{ + /* Always successful. */ +} + +#endif /* SLJIT_UTIL_GLOBAL_LOCK */ + +#elif defined(_WIN32) /* SLJIT_SINGLE_THREADED */ + +#include "windows.h" + +#if (defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR) + +static HANDLE allocator_mutex = 0; + +static SLJIT_INLINE void allocator_grab_lock(void) +{ + /* No idea what to do if an error occures. Static mutexes should never fail... */ + if (!allocator_mutex) + allocator_mutex = CreateMutex(NULL, TRUE, NULL); + else + WaitForSingleObject(allocator_mutex, INFINITE); +} + +static SLJIT_INLINE void allocator_release_lock(void) +{ + ReleaseMutex(allocator_mutex); +} + +#endif /* SLJIT_EXECUTABLE_ALLOCATOR */ + +#if (defined SLJIT_UTIL_GLOBAL_LOCK && SLJIT_UTIL_GLOBAL_LOCK) + +static HANDLE global_mutex = 0; + +SLJIT_API_FUNC_ATTRIBUTE void SLJIT_FUNC sljit_grab_lock(void) +{ + /* No idea what to do if an error occures. Static mutexes should never fail... */ + if (!global_mutex) + global_mutex = CreateMutex(NULL, TRUE, NULL); + else + WaitForSingleObject(global_mutex, INFINITE); +} + +SLJIT_API_FUNC_ATTRIBUTE void SLJIT_FUNC sljit_release_lock(void) +{ + ReleaseMutex(global_mutex); +} + +#endif /* SLJIT_UTIL_GLOBAL_LOCK */ + +#else /* _WIN32 */ + +#if (defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR) + +#include + +static pthread_mutex_t allocator_mutex = PTHREAD_MUTEX_INITIALIZER; + +static SLJIT_INLINE void allocator_grab_lock(void) +{ + pthread_mutex_lock(&allocator_mutex); +} + +static SLJIT_INLINE void allocator_release_lock(void) +{ + pthread_mutex_unlock(&allocator_mutex); +} + +#endif /* SLJIT_EXECUTABLE_ALLOCATOR */ + +#if (defined SLJIT_UTIL_GLOBAL_LOCK && SLJIT_UTIL_GLOBAL_LOCK) + +#include + +static pthread_mutex_t global_mutex = PTHREAD_MUTEX_INITIALIZER; + +SLJIT_API_FUNC_ATTRIBUTE void SLJIT_FUNC sljit_grab_lock(void) +{ + pthread_mutex_lock(&global_mutex); +} + +SLJIT_API_FUNC_ATTRIBUTE void SLJIT_FUNC sljit_release_lock(void) +{ + pthread_mutex_unlock(&global_mutex); +} + +#endif /* SLJIT_UTIL_GLOBAL_LOCK */ + +#endif /* _WIN32 */ + +/* ------------------------------------------------------------------------ */ +/* Stack */ +/* ------------------------------------------------------------------------ */ + +#if (defined SLJIT_UTIL_STACK && SLJIT_UTIL_STACK) || (defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR) + +#ifdef _WIN32 +#include "windows.h" +#else +/* Provides mmap function. */ +#include +#include +#ifndef MAP_ANON +#ifdef MAP_ANONYMOUS +#define MAP_ANON MAP_ANONYMOUS +#endif +#endif +/* For detecting the page size. */ +#include + +#ifndef MAP_ANON + +#include + +/* Some old systems does not have MAP_ANON. */ +static sljit_s32 dev_zero = -1; + +#if (defined SLJIT_SINGLE_THREADED && SLJIT_SINGLE_THREADED) + +static SLJIT_INLINE sljit_s32 open_dev_zero(void) +{ + dev_zero = open("/dev/zero", O_RDWR); + return dev_zero < 0; +} + +#else /* SLJIT_SINGLE_THREADED */ + +#include + +static pthread_mutex_t dev_zero_mutex = PTHREAD_MUTEX_INITIALIZER; + +static SLJIT_INLINE sljit_s32 open_dev_zero(void) +{ + pthread_mutex_lock(&dev_zero_mutex); + /* The dev_zero might be initialized by another thread during the waiting. */ + if (dev_zero < 0) { + dev_zero = open("/dev/zero", O_RDWR); + } + pthread_mutex_unlock(&dev_zero_mutex); + return dev_zero < 0; +} + +#endif /* SLJIT_SINGLE_THREADED */ + +#endif + +#endif + +#endif /* SLJIT_UTIL_STACK || SLJIT_EXECUTABLE_ALLOCATOR */ + +#if (defined SLJIT_UTIL_STACK && SLJIT_UTIL_STACK) + +/* Planning to make it even more clever in the future. */ +static sljit_sw sljit_page_align = 0; + +SLJIT_API_FUNC_ATTRIBUTE struct sljit_stack* SLJIT_FUNC sljit_allocate_stack(sljit_uw start_size, sljit_uw max_size, void *allocator_data) +{ + struct sljit_stack *stack; + void *ptr; +#ifdef _WIN32 + SYSTEM_INFO si; +#endif + + SLJIT_UNUSED_ARG(allocator_data); + if (start_size > max_size || start_size < 1) + return NULL; + +#ifdef _WIN32 + if (!sljit_page_align) { + GetSystemInfo(&si); + sljit_page_align = si.dwPageSize - 1; + } +#else + if (!sljit_page_align) { + sljit_page_align = sysconf(_SC_PAGESIZE); + /* Should never happen. */ + if (sljit_page_align < 0) + sljit_page_align = 4096; + sljit_page_align--; + } +#endif + + stack = (struct sljit_stack*)SLJIT_MALLOC(sizeof(struct sljit_stack), allocator_data); + if (!stack) + return NULL; + + /* Align max_size. */ + max_size = (max_size + sljit_page_align) & ~sljit_page_align; + +#ifdef _WIN32 + ptr = VirtualAlloc(NULL, max_size, MEM_RESERVE, PAGE_READWRITE); + if (!ptr) { + SLJIT_FREE(stack, allocator_data); + return NULL; + } + + stack->min_start = (sljit_u8 *)ptr; + stack->end = stack->min_start + max_size; + stack->start = stack->end; + + if (sljit_stack_resize(stack, stack->end - start_size) == NULL) { + sljit_free_stack(stack, allocator_data); + return NULL; + } +#else +#ifdef MAP_ANON + ptr = mmap(NULL, max_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0); +#else + if (dev_zero < 0) { + if (open_dev_zero()) { + SLJIT_FREE(stack, allocator_data); + return NULL; + } + } + ptr = mmap(NULL, max_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, dev_zero, 0); +#endif + if (ptr == MAP_FAILED) { + SLJIT_FREE(stack, allocator_data); + return NULL; + } + stack->min_start = (sljit_u8 *)ptr; + stack->end = stack->min_start + max_size; + stack->start = stack->end - start_size; +#endif + stack->top = stack->end; + return stack; +} + +#undef PAGE_ALIGN + +SLJIT_API_FUNC_ATTRIBUTE void SLJIT_FUNC sljit_free_stack(struct sljit_stack *stack, void *allocator_data) +{ + SLJIT_UNUSED_ARG(allocator_data); +#ifdef _WIN32 + VirtualFree((void*)stack->min_start, 0, MEM_RELEASE); +#else + munmap((void*)stack->min_start, stack->end - stack->min_start); +#endif + SLJIT_FREE(stack, allocator_data); +} + +SLJIT_API_FUNC_ATTRIBUTE sljit_u8 *SLJIT_FUNC sljit_stack_resize(struct sljit_stack *stack, sljit_u8 *new_start) +{ + sljit_uw aligned_old_start; + sljit_uw aligned_new_start; + + if ((new_start < stack->min_start) || (new_start >= stack->end)) + return NULL; + +#ifdef _WIN32 + aligned_new_start = (sljit_uw)new_start & ~sljit_page_align; + aligned_old_start = ((sljit_uw)stack->start) & ~sljit_page_align; + if (aligned_new_start != aligned_old_start) { + if (aligned_new_start < aligned_old_start) { + if (!VirtualAlloc((void*)aligned_new_start, aligned_old_start - aligned_new_start, MEM_COMMIT, PAGE_READWRITE)) + return NULL; + } + else { + if (!VirtualFree((void*)aligned_old_start, aligned_new_start - aligned_old_start, MEM_DECOMMIT)) + return NULL; + } + } +#else + if (stack->start < new_start) { + aligned_new_start = (sljit_uw)new_start & ~sljit_page_align; + aligned_old_start = ((sljit_uw)stack->start) & ~sljit_page_align; + /* If madvise is available, we release the unnecessary space. */ +#if defined(MADV_DONTNEED) + if (aligned_new_start > aligned_old_start) + madvise((void*)aligned_old_start, aligned_new_start - aligned_old_start, MADV_DONTNEED); +#elif defined(POSIX_MADV_DONTNEED) + if (aligned_new_start > aligned_old_start) + posix_madvise((void*)aligned_old_start, aligned_new_start - aligned_old_start, POSIX_MADV_DONTNEED); +#endif + } +#endif + stack->start = new_start; + return new_start; +} + +#endif /* SLJIT_UTIL_STACK */ + +#endif diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/test-driver b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/test-driver new file mode 100755 index 000000000..b8521a482 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/test-driver @@ -0,0 +1,148 @@ +#! /bin/sh +# test-driver - basic testsuite driver script. + +scriptversion=2018-03-07.03; # UTC + +# Copyright (C) 2011-2018 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +# Make unconditional expansion of undefined variables an error. This +# helps a lot in preventing typo-related bugs. +set -u + +usage_error () +{ + echo "$0: $*" >&2 + print_usage >&2 + exit 2 +} + +print_usage () +{ + cat <$log_file 2>&1 +estatus=$? + +if test $enable_hard_errors = no && test $estatus -eq 99; then + tweaked_estatus=1 +else + tweaked_estatus=$estatus +fi + +case $tweaked_estatus:$expect_failure in + 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;; + 0:*) col=$grn res=PASS recheck=no gcopy=no;; + 77:*) col=$blu res=SKIP recheck=no gcopy=yes;; + 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;; + *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;; + *:*) col=$red res=FAIL recheck=yes gcopy=yes;; +esac + +# Report the test outcome and exit status in the logs, so that one can +# know whether the test passed or failed simply by looking at the '.log' +# file, without the need of also peaking into the corresponding '.trs' +# file (automake bug#11814). +echo "$res $test_name (exit status: $estatus)" >>$log_file + +# Report outcome to console. +echo "${col}${res}${std}: $test_name" + +# Register the test result, and other relevant metadata. +echo ":test-result: $res" > $trs_file +echo ":global-test-result: $res" >> $trs_file +echo ":recheck: $recheck" >> $trs_file +echo ":copy-in-global-log: $gcopy" >> $trs_file + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/grepbinary b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/grepbinary new file mode 100755 index 0000000000000000000000000000000000000000..5efa1302049e4541d1acf53b63d6caaf5f9c439c GIT binary patch literal 45 zcmWH^NL45-%}mZ#NGi%N&r?Was8Gl%%`GTa$S+GRQYZmR=Ok8DDx~D6>u~`9Z_*E= literal 0 HcmV?d00001 diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/grepfilelist b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/grepfilelist new file mode 100755 index 000000000..dd73ec7f9 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/grepfilelist @@ -0,0 +1,3 @@ +testdata/grepinputv + +testdata/grepinputx diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/grepinput b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/grepinput new file mode 100755 index 000000000..0f00edd93 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/grepinput @@ -0,0 +1,611 @@ +This is a file of miscellaneous text that is used as test data for checking +that the pcregrep command is working correctly. The file must be more than 24K +long so that it needs more than a single read() call to process it. New +features should be added at the end, because some of the tests involve the +output of line numbers, and we don't want these to change. + +PATTERN at the start of a line. +In the middle of a line, PATTERN appears. + +This pattern is in lower case. + +Here follows a whole lot of stuff that makes the file over 24K long. + +------------------------------------------------------------------------------- +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. + +The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the +lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox +jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick +brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. +------------------------------------------------------------------------------- + +aaaaa0 +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +bbbbbb +cccccccccccccccccccccccccccccccccccccccccc +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +eeeee +aaaaa2 +ffffffffff + +This is a line before the binary zero. +This line contains a binary zero here >< for testing. +This is a line after the binary zero. + +ABOVE the elephant +ABOVE +ABOVE theatre +AB.VE +AB.VE the turtle + +010203040506 + +PUT NEW DATA ABOVE THIS LINE. +============================= + +Check up on PATTERN near the end. +This is the last line of this file. diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/grepinput3 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/grepinput3 new file mode 100755 index 000000000..7409cfc07 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/grepinput3 @@ -0,0 +1,15 @@ +triple: t1_txt s1_tag s_txt p_tag p_txt o_tag o_txt + +triple: t2_txt s1_tag s_txt p_tag p_txt o_tag +Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + +triple: t3_txt s2_tag s_txt p_tag p_txt o_tag o_txt + +triple: t4_txt s1_tag s_txt p_tag p_txt o_tag o_txt + +triple: t5_txt s1_tag s_txt p_tag p_txt o_tag +o_txt + +triple: t6_txt s2_tag s_txt p_tag p_txt o_tag o_txt + +triple: t7_txt s1_tag s_txt p_tag p_txt o_tag o_txt diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/grepinput8 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/grepinput8 new file mode 100755 index 000000000..c4b8c440f --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/grepinput8 @@ -0,0 +1,11 @@ +X one +X two X three X four X five +X six +X sevenÂ…X eight
X nine
X ten + +Before 111 +Before 222
Before 333Â…Match +After 111 +After 222
After 333 +And so on and so on +And so on and so on diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/grepinputv b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/grepinputv new file mode 100755 index 000000000..d33d326b0 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/grepinputv @@ -0,0 +1,4 @@ +The quick brown +fox jumps +over the lazy dog. +This time it jumps and jumps and jumps. diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/grepinputx b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/grepinputx new file mode 100755 index 000000000..730cc8a0d --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/grepinputx @@ -0,0 +1,43 @@ +This is a second file of input for the pcregrep tests. + +Here is the pattern again. + +Pattern +That time it was on a line by itself. + +To pat or not to pat, that is the question. + +complete pair +of lines + +That was a complete pair +of lines all by themselves. + +complete pair +of lines + +And there they were again, to check line numbers. + +one +two +three +four +five +six +seven +eight +nine +ten +eleven +twelve +thirteen +fourteen +fifteen +sixteen +seventeen +eighteen +nineteen +twenty + +This line contains pattern not on a line by itself. +This is the last line of this file. diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/greplist b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/greplist new file mode 100755 index 000000000..1434ae96f --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/greplist @@ -0,0 +1,7 @@ +This is a file of patterns for testing the -f option. Don't include any blank +lines because they will match everything! This is no longer true, so have one. + +pattern +line by itself + +End of the list of patterns. diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/grepoutput b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/grepoutput new file mode 100755 index 000000000..f23dac769 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/grepoutput @@ -0,0 +1,757 @@ +---------------------------- Test 1 ------------------------------ +PATTERN at the start of a line. +In the middle of a line, PATTERN appears. +Check up on PATTERN near the end. +RC=0 +---------------------------- Test 2 ------------------------------ +PATTERN at the start of a line. +RC=0 +---------------------------- Test 3 ------------------------------ +7:PATTERN at the start of a line. +8:In the middle of a line, PATTERN appears. +10:This pattern is in lower case. +610:Check up on PATTERN near the end. +RC=0 +---------------------------- Test 4 ------------------------------ +4 +RC=0 +---------------------------- Test 5 ------------------------------ +./testdata/grepinput:7:PATTERN at the start of a line. +./testdata/grepinput:8:In the middle of a line, PATTERN appears. +./testdata/grepinput:10:This pattern is in lower case. +./testdata/grepinput:610:Check up on PATTERN near the end. +./testdata/grepinputx:3:Here is the pattern again. +./testdata/grepinputx:5:Pattern +./testdata/grepinputx:42:This line contains pattern not on a line by itself. +RC=0 +---------------------------- Test 6 ------------------------------ +7:PATTERN at the start of a line. +8:In the middle of a line, PATTERN appears. +10:This pattern is in lower case. +610:Check up on PATTERN near the end. +3:Here is the pattern again. +5:Pattern +42:This line contains pattern not on a line by itself. +RC=0 +---------------------------- Test 7 ------------------------------ +./testdata/grepinput +./testdata/grepinputx +RC=0 +---------------------------- Test 8 ------------------------------ +./testdata/grepinput +RC=0 +---------------------------- Test 9 ------------------------------ +RC=0 +---------------------------- Test 10 ----------------------------- +RC=1 +---------------------------- Test 11 ----------------------------- +1:This is a second file of input for the pcregrep tests. +2: +4: +5:Pattern +6:That time it was on a line by itself. +7: +8:To pat or not to pat, that is the question. +9: +10:complete pair +11:of lines +12: +13:That was a complete pair +14:of lines all by themselves. +15: +16:complete pair +17:of lines +18: +19:And there they were again, to check line numbers. +20: +21:one +22:two +23:three +24:four +25:five +26:six +27:seven +28:eight +29:nine +30:ten +31:eleven +32:twelve +33:thirteen +34:fourteen +35:fifteen +36:sixteen +37:seventeen +38:eighteen +39:nineteen +40:twenty +41: +43:This is the last line of this file. +RC=0 +---------------------------- Test 12 ----------------------------- +Pattern +RC=0 +---------------------------- Test 13 ----------------------------- +Here is the pattern again. +That time it was on a line by itself. +seventeen +This line contains pattern not on a line by itself. +RC=0 +---------------------------- Test 14 ----------------------------- +./testdata/grepinputx:To pat or not to pat, that is the question. +RC=0 +---------------------------- Test 15 ----------------------------- +pcregrep: Error in command-line regex at offset 4: nothing to repeat +RC=2 +---------------------------- Test 16 ----------------------------- +pcregrep: Failed to open ./testdata/nonexistfile: No such file or directory +RC=2 +---------------------------- Test 17 ----------------------------- +features should be added at the end, because some of the tests involve the +output of line numbers, and we don't want these to change. +RC=0 +---------------------------- Test 18 ----------------------------- +4:features should be added at the end, because some of the tests involve the +output of line numbers, and we don't want these to change. +583:brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. +------------------------------------------------------------------------------- +RC=0 +---------------------------- Test 19 ----------------------------- +Pattern +RC=0 +---------------------------- Test 20 ----------------------------- +10:complete pair +of lines +16:complete pair +of lines +RC=0 +---------------------------- Test 21 ----------------------------- +24:four +25-five +26-six +27-seven +-- +34:fourteen +35-fifteen +36-sixteen +37-seventeen +RC=0 +---------------------------- Test 22 ----------------------------- +21-one +22-two +23-three +24:four +-- +31-eleven +32-twelve +33-thirteen +34:fourteen +RC=0 +---------------------------- Test 23 ----------------------------- +one +two +three +four +five +six +seven +-- +eleven +twelve +thirteen +fourteen +fifteen +sixteen +seventeen +RC=0 +---------------------------- Test 24 ----------------------------- +four +five +six +seven +eight +nine +ten +eleven +twelve +thirteen +fourteen +fifteen +sixteen +seventeen +eighteen +nineteen +twenty + +This line contains pattern not on a line by itself. +This is the last line of this file. +RC=0 +---------------------------- Test 25 ----------------------------- +15- +16-complete pair +17-of lines +18- +19-And there they were again, to check line numbers. +20- +21-one +22-two +23-three +24:four +25-five +26-six +27-seven +28-eight +29-nine +30-ten +31-eleven +32-twelve +33-thirteen +34:fourteen +RC=0 +---------------------------- Test 26 ----------------------------- + +complete pair +of lines + +And there they were again, to check line numbers. + +one +two +three +four +five +six +seven +eight +nine +ten +eleven +twelve +thirteen +fourteen +fifteen +sixteen +seventeen +eighteen +nineteen +twenty + +This line contains pattern not on a line by itself. +This is the last line of this file. +RC=0 +---------------------------- Test 27 ----------------------------- +four +five +six +seven +eight +nine +ten +eleven +twelve +thirteen +fourteen +fifteen +sixteen +seventeen +eighteen +nineteen +twenty + +This line contains pattern not on a line by itself. +This is the last line of this file. +RC=0 +---------------------------- Test 28 ----------------------------- +14-of lines all by themselves. +15- +16-complete pair +17-of lines +18- +19-And there they were again, to check line numbers. +20- +21-one +22-two +23-three +24:four +25-five +26-six +27-seven +28-eight +29-nine +30-ten +31-eleven +32-twelve +33-thirteen +34:fourteen +RC=0 +---------------------------- Test 29 ----------------------------- +of lines all by themselves. + +complete pair +of lines + +And there they were again, to check line numbers. + +one +two +three +four +five +six +seven +eight +nine +ten +eleven +twelve +thirteen +fourteen +fifteen +sixteen +seventeen +eighteen +nineteen +twenty + +This line contains pattern not on a line by itself. +This is the last line of this file. +RC=0 +---------------------------- Test 30 ----------------------------- +./testdata/grepinput-4-features should be added at the end, because some of the tests involve the +./testdata/grepinput-5-output of line numbers, and we don't want these to change. +./testdata/grepinput-6- +./testdata/grepinput:7:PATTERN at the start of a line. +./testdata/grepinput:8:In the middle of a line, PATTERN appears. +./testdata/grepinput-9- +./testdata/grepinput:10:This pattern is in lower case. +-- +./testdata/grepinput-607-PUT NEW DATA ABOVE THIS LINE. +./testdata/grepinput-608-============================= +./testdata/grepinput-609- +./testdata/grepinput:610:Check up on PATTERN near the end. +-- +./testdata/grepinputx-1-This is a second file of input for the pcregrep tests. +./testdata/grepinputx-2- +./testdata/grepinputx:3:Here is the pattern again. +./testdata/grepinputx-4- +./testdata/grepinputx:5:Pattern +-- +./testdata/grepinputx-39-nineteen +./testdata/grepinputx-40-twenty +./testdata/grepinputx-41- +./testdata/grepinputx:42:This line contains pattern not on a line by itself. +RC=0 +---------------------------- Test 31 ----------------------------- +./testdata/grepinput:7:PATTERN at the start of a line. +./testdata/grepinput:8:In the middle of a line, PATTERN appears. +./testdata/grepinput-9- +./testdata/grepinput:10:This pattern is in lower case. +./testdata/grepinput-11- +./testdata/grepinput-12-Here follows a whole lot of stuff that makes the file over 24K long. +./testdata/grepinput-13- +-- +./testdata/grepinput:610:Check up on PATTERN near the end. +./testdata/grepinput-611-This is the last line of this file. +-- +./testdata/grepinputx:3:Here is the pattern again. +./testdata/grepinputx-4- +./testdata/grepinputx:5:Pattern +./testdata/grepinputx-6-That time it was on a line by itself. +./testdata/grepinputx-7- +./testdata/grepinputx-8-To pat or not to pat, that is the question. +-- +./testdata/grepinputx:42:This line contains pattern not on a line by itself. +./testdata/grepinputx-43-This is the last line of this file. +RC=0 +---------------------------- Test 32 ----------------------------- +./testdata/grepinputx +RC=0 +---------------------------- Test 33 ----------------------------- +pcregrep: Failed to open ./testdata/grepnonexist: No such file or directory +RC=2 +---------------------------- Test 34 ----------------------------- +RC=2 +---------------------------- Test 35 ----------------------------- +./testdata/grepinput8 +./testdata/grepinputx +RC=0 +---------------------------- Test 36 ----------------------------- +./testdata/grepinput3 +./testdata/grepinputx +RC=0 +---------------------------- Test 37 ----------------------------- +aaaaa0 +aaaaa2 +010203040506 +RC=0 +======== STDERR ======== +pcregrep: pcre_exec() gave error -8 while matching this text: + +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + +pcregrep: pcre_exec() gave error -8 while matching this text: + +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + +pcregrep: Error -8, -21 or -27 means that a resource limit was exceeded. +pcregrep: Check your regex for nested unlimited loops. +---------------------------- Test 38 ------------------------------ +This line contains a binary zero here >< for testing. +RC=0 +---------------------------- Test 39 ------------------------------ +This is a line before the binary zero. +This line contains a binary zero here >< for testing. +RC=0 +---------------------------- Test 40 ------------------------------ +This line contains a binary zero here >< for testing. +This is a line after the binary zero. +RC=0 +---------------------------- Test 41 ------------------------------ +before the binary zero +after the binary zero +RC=0 +---------------------------- Test 42 ------------------------------ +./testdata/grepinput:595:before the binary zero +./testdata/grepinput:597:after the binary zero +RC=0 +---------------------------- Test 43 ------------------------------ +595:before +595:zero +596:zero +597:after +597:zero +RC=0 +---------------------------- Test 44 ------------------------------ +595:before +595:zero +596:zero +597:zero +RC=0 +---------------------------- Test 45 ------------------------------ +10:pattern +595:binary +596:binary +597:binary +RC=0 +---------------------------- Test 46 ------------------------------ +pcregrep: Error in 2nd command-line regex at offset 9: missing ) +RC=2 +---------------------------- Test 47 ------------------------------ +AB.VE +RC=0 +---------------------------- Test 48 ------------------------------ +ABOVE the elephant +AB.VE +AB.VE the turtle +RC=0 +---------------------------- Test 49 ------------------------------ +ABOVE the elephant +AB.VE +AB.VE the turtle +PUT NEW DATA ABOVE THIS LINE. +RC=0 +---------------------------- Test 50 ------------------------------ +RC=1 +---------------------------- Test 51 ------------------------------ +over the lazy dog. +This time it jumps and jumps and jumps. +RC=0 +---------------------------- Test 52 ------------------------------ +fox jumps +This time it jumps and jumps and jumps. +RC=0 +---------------------------- Test 53 ------------------------------ +36972,6 +36990,4 +37024,4 +37066,5 +37083,4 +RC=0 +---------------------------- Test 54 ------------------------------ +595:15,6 +595:33,4 +596:28,4 +597:15,5 +597:32,4 +RC=0 +---------------------------- Test 55 ----------------------------- +Here is the pattern again. +That time it was on a line by itself. +This line contains pattern not on a line by itself. +RC=0 +---------------------------- Test 56 ----------------------------- +./testdata/grepinput:456 +./testdata/grepinput3:0 +./testdata/grepinput8:0 +./testdata/grepinputv:1 +./testdata/grepinputx:0 +RC=0 +---------------------------- Test 57 ----------------------------- +./testdata/grepinput:456 +./testdata/grepinputv:1 +RC=0 +---------------------------- Test 58 ----------------------------- +PATTERN at the start of a line. +In the middle of a line, PATTERN appears. +Check up on PATTERN near the end. +RC=0 +---------------------------- Test 59 ----------------------------- +PATTERN at the start of a line. +In the middle of a line, PATTERN appears. +Check up on PATTERN near the end. +RC=0 +---------------------------- Test 60 ----------------------------- +PATTERN at the start of a line. +In the middle of a line, PATTERN appears. +Check up on PATTERN near the end. +RC=0 +---------------------------- Test 61 ----------------------------- +PATTERN at the start of a line. +In the middle of a line, PATTERN appears. +Check up on PATTERN near the end. +RC=0 +---------------------------- Test 62 ----------------------------- +pcregrep: pcre_exec() gave error -8 while matching text that starts: + +This is a file of miscellaneous text that is used as test data for checking +that the pcregrep command is working correctly. The file must be more than 24K +long so that it needs more than a single read + +pcregrep: Error -8, -21 or -27 means that a resource limit was exceeded. +pcregrep: Check your regex for nested unlimited loops. +RC=1 +---------------------------- Test 63 ----------------------------- +pcregrep: pcre_exec() gave error -21 while matching text that starts: + +This is a file of miscellaneous text that is used as test data for checking +that the pcregrep command is working correctly. The file must be more than 24K +long so that it needs more than a single read + +pcregrep: Error -8, -21 or -27 means that a resource limit was exceeded. +pcregrep: Check your regex for nested unlimited loops. +RC=1 +---------------------------- Test 64 ------------------------------ +appears +RC=0 +---------------------------- Test 65 ------------------------------ +pear +RC=0 +---------------------------- Test 66 ------------------------------ +RC=0 +---------------------------- Test 67 ------------------------------ +RC=0 +---------------------------- Test 68 ------------------------------ +pear +RC=0 +---------------------------- Test 69 ----------------------------- +1:This is a second file of input for the pcregrep tests. +2: +4: +5:Pattern +6:That time it was on a line by itself. +7: +8:To pat or not to pat, that is the question. +9: +10:complete pair +11:of lines +12: +13:That was a complete pair +14:of lines all by themselves. +15: +16:complete pair +17:of lines +18: +19:And there they were again, to check line numbers. +20: +21:one +22:two +23:three +24:four +25:five +26:six +27:seven +28:eight +29:nine +30:ten +31:eleven +32:twelve +33:thirteen +34:fourteen +35:fifteen +36:sixteen +37:seventeen +38:eighteen +39:nineteen +40:twenty +41: +43:This is the last line of this file. +RC=0 +---------------------------- Test 70 ----------------------------- +triple: t1_txt s1_tag s_txt p_tag p_txt o_tag o_txt + +triple: t3_txt s2_tag s_txt p_tag p_txt o_tag o_txt + +triple: t4_txt s1_tag s_txt p_tag p_txt o_tag o_txt + +triple: t6_txt s2_tag s_txt p_tag p_txt o_tag o_txt + +RC=0 +---------------------------- Test 71 ----------------------------- +01 +RC=0 +---------------------------- Test 72 ----------------------------- +010203040506 +RC=0 +---------------------------- Test 73 ----------------------------- +01 +RC=0 +---------------------------- Test 74 ----------------------------- +01 +02 +RC=0 +---------------------------- Test 75 ----------------------------- +010203040506 +RC=0 +---------------------------- Test 76 ----------------------------- +01 +02 +RC=0 +---------------------------- Test 77 ----------------------------- +01 +03 +RC=0 +---------------------------- Test 78 ----------------------------- +010203040506 +RC=0 +---------------------------- Test 79 ----------------------------- +01 +03 +RC=0 +---------------------------- Test 80 ----------------------------- +01 +RC=0 +---------------------------- Test 81 ----------------------------- +010203040506 +RC=0 +---------------------------- Test 82 ----------------------------- +01 +RC=0 +---------------------------- Test 83 ----------------------------- +pcregrep: line 4 of file ./testdata/grepinput3 is too long for the internal buffer +pcregrep: check the --buffer-size option +RC=2 +---------------------------- Test 84 ----------------------------- +testdata/grepinputv:fox jumps +testdata/grepinputx:complete pair +testdata/grepinputx:That was a complete pair +testdata/grepinputx:complete pair +testdata/grepinput3:triple: t7_txt s1_tag s_txt p_tag p_txt o_tag o_txt +RC=0 +---------------------------- Test 85 ----------------------------- +./testdata/grepinput3:Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. +RC=0 +---------------------------- Test 86 ----------------------------- +Binary file ./testdata/grepbinary matches +RC=0 +---------------------------- Test 87 ----------------------------- +RC=1 +---------------------------- Test 88 ----------------------------- +Binary file ./testdata/grepbinary matches +RC=0 +---------------------------- Test 89 ----------------------------- +RC=1 +---------------------------- Test 90 ----------------------------- +RC=1 +---------------------------- Test 91 ----------------------------- +The quick brown fx jumps over the lazy dog. +RC=0 +---------------------------- Test 92 ----------------------------- +The quick brown fx jumps over the lazy dog. +RC=0 +---------------------------- Test 93 ----------------------------- +The quick brown fx jumps over the lazy dog. +RC=0 +---------------------------- Test 94 ----------------------------- +./testdata/grepinput8 +./testdata/grepinputx +RC=0 +---------------------------- Test 95 ----------------------------- +testdata/grepinputx:complete pair +testdata/grepinputx:That was a complete pair +testdata/grepinputx:complete pair +RC=0 +---------------------------- Test 96 ----------------------------- +./testdata/grepinput3 +./testdata/grepinput8 +./testdata/grepinputx +RC=0 +---------------------------- Test 97 ----------------------------- +./testdata/grepinput3 +./testdata/grepinputx +RC=0 +---------------------------- Test 98 ----------------------------- +./testdata/grepinputx +RC=0 +---------------------------- Test 99 ----------------------------- +./testdata/grepinput3 +./testdata/grepinputx +RC=0 +---------------------------- Test 100 ------------------------------ +./testdata/grepinput:zerothe. +./testdata/grepinput:zeroa +./testdata/grepinput:zerothe. +RC=0 +---------------------------- Test 101 ------------------------------ +./testdata/grepinput:.|zero|the|. +./testdata/grepinput:zero|a +./testdata/grepinput:.|zero|the|. +RC=0 +---------------------------- Test 102 ----------------------------- +2: +5: +7: +9: +12: +14: +RC=0 +---------------------------- Test 103 ----------------------------- +RC=0 +---------------------------- Test 104 ----------------------------- +2: +5: +7: +9: +12: +14: +RC=0 +---------------------------- Test 105 ----------------------------- +triple: t1_txt s1_tag s_txt p_tag p_txt o_tag o_txt + +triple: t2_txt s1_tag s_txt p_tag p_txt o_tag +Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + +triple: t3_txt s2_tag s_txt p_tag p_txt o_tag o_txt + +triple: t4_txt s1_tag s_txt p_tag p_txt o_tag o_txt + +triple: t5_txt s1_tag s_txt p_tag p_txt o_tag +o_txt + +triple: t6_txt s2_tag s_txt p_tag p_txt o_tag o_txt + +triple: t7_txt s1_tag s_txt p_tag p_txt o_tag o_txt +RC=0 +---------------------------- Test 106 ----------------------------- +a +RC=0 +---------------------------- Test 107 ----------------------------- +1:0,1 +2:0,1 +2:1,1 +2:2,1 +2:3,1 +2:4,1 +RC=0 +---------------------------- Test 108 ------------------------------ +RC=0 +---------------------------- Test 109 ----------------------------- +RC=0 diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/grepoutput8 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/grepoutput8 new file mode 100755 index 000000000..91493bdcf --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/grepoutput8 @@ -0,0 +1,12 @@ +---------------------------- Test U1 ------------------------------ +1:X one +2:X two 3:X three 4:X four 5:X five +6:X six +7:X sevenÂ…8:X eight
9:X nine
10:X ten +RC=0 +---------------------------- Test U2 ------------------------------ +12-Before 111 +13-Before 222
14-Before 333Â…15:Match +16-After 111 +17-After 222
18-After 333 +RC=0 diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/grepoutputN b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/grepoutputN new file mode 100755 index 000000000..1f9f8801e --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/grepoutputN @@ -0,0 +1,16 @@ +---------------------------- Test N1 ------------------------------ +1:abc 2:def ---------------------------- Test N2 ------------------------------ +1:abc def +2:ghi +jkl---------------------------- Test N3 ------------------------------ +2:def 3: +ghi +jkl---------------------------- Test N4 ------------------------------ +2:ghi +jkl---------------------------- Test N5 ------------------------------ +1:abc 2:def +3:ghi +4:jkl---------------------------- Test N6 ------------------------------ +1:abc 2:def +3:ghi +4:jkl \ No newline at end of file diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/greppatN4 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/greppatN4 new file mode 100755 index 000000000..7112d84fa --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/greppatN4 @@ -0,0 +1,2 @@ +xxx +jkl \ No newline at end of file diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/saved16 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/saved16 new file mode 100755 index 0000000000000000000000000000000000000000..f86326c9f876add7c53d1f5afd72953688b1ee63 GIT binary patch literal 86 zcmZQzVDMuA0@ont05Ai{4g%u;P>{%w43Y){83=_&)-!N0$TB1XaS{+GGn4@N3=9Ci C^KNzN7l-orsc!uk1|BEn+(i&F=Vo#gbd+p)WTZ?GfdHJ*uuyF5Ec6y)AH0F6kj5m4pkOI_HLqZoV_0eYcGaNCgV~)o z`)23uN+y;xna!tRY@{B<68Q(Dz*UB7_}v#Oi&3nFHd^}=t3*3Rur2(giw2w*=)7+% z_$N7QEQ7lHqqR;;l(EtQUGnysd9zPe7k^ly8#BL+_f##eu?kISd1_7C<11C4^xO2v uuepmd&^P&oTb@Zrjp*vRF6Q0K(jQJ&K;S<@9Wd#D7rxv3D8H%7>y%!X_It1Z literal 0 HcmV?d00001 diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/saved16LE-2 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/saved16LE-2 new file mode 100755 index 0000000000000000000000000000000000000000..656c058d2603f646877d69cd34c453ba8f94cf44 GIT binary patch literal 344 zcmZvYzYYOG5XOIdxr9okP>6<-f@pLSR2uOH2+_G{TrZx*Yh2+WF1ZWOpcYx*p8w)Y zW@hKxZ)Rr}Obw_H#=TL^Kt2zi2>XDJf@8|$vX~Js=P_eSOL={@Cj&7A@WB{xx*o{l0Ag7n2B`(nNl+T3uLOue H@*n^J-RTXH literal 0 HcmV?d00001 diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/saved32BE-1 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/saved32BE-1 new file mode 100755 index 0000000000000000000000000000000000000000..609d97cdeba0099867aa8a4cc700c0d6c4f02da7 GIT binary patch literal 560 zcmaiwOAY~15JjuCZ(`75LJVx6cOm8-3y=sB6Iw(AXc=j59IMRbb*-#T38EVQ~Q?n8OrusV0Oq%s_i9koGWy4yZnr zXTJ_QV31emskRQ!x`OK9izcjXLH;m#UX+Y?M)4**bc O`V0NL-<0r&`uDJ2)x6q>hi1IM8;3Tn{UJK@(b_OAE^yuks~y+_!A z={vGC(2Jm)i8${=VUJR%p>tZnGxs^f8=fg@>*=;P3H=>e-{`bib literal 0 HcmV?d00001 diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/saved32LE-1 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/saved32LE-1 new file mode 100755 index 0000000000000000000000000000000000000000..901dfb63487c45cde0aeb6af073131a36d33728e GIT binary patch literal 560 zcmaiw%L+kJ6o!}MUIt`B243L2h0ISLKnZ2yk`!eqUd=0*oyRc2@%_6^$D#c7?d$s2 zUTd4>Ze|wt2fgT)Gi$LaK;p&HD`2i$*))F(t1VyzbC|+Qax7s3Gtk`{qyr401MEGq$*xI1K O(7#I|sF!~#5%2`q4tyQ} literal 0 HcmV?d00001 diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/saved32LE-2 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/saved32LE-2 new file mode 100755 index 0000000000000000000000000000000000000000..5f64af9b9d558b47cb4255bb9b2d4d4a96748046 GIT binary patch literal 456 zcmZvYF$%&!5Ji7NAOR)DcmlCaqolDGt;HLtAa;t4_Tmk42hV3Mvi`rjF;N_N`)79l z&Q1aZ6@X&Cnk}mUND?68hVjAFM@UT(L)wI@E!mKX-yVBqyU*E)`I^*cSLO?HBSRwZ zk@U#-3y6MdI=qL28k5<2&sB3P)Td)J*LU=AI^`>_SBNrq*^a(584%s;llFTlYewv( xS)C`t9hsfI%-tLpT1ukt>Js@5r2e1Mmod+Ftz7rym+HSL3euj%ZvI*1c?0s*Im!S4 literal 0 HcmV?d00001 diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/saved8 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/saved8 new file mode 100755 index 0000000000000000000000000000000000000000..8cf0c1312de4941ee8e45f5d935a2117f770dcbe GIT binary patch literal 77 ycmZQzU~pvs0@ont05Ai{4g})=P>{%w43Y){3kZcq)-!O*CdwwsCYLa9G5`QgwGDg# literal 0 HcmV?d00001 diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput1 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput1 new file mode 100755 index 000000000..02e4f4825 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput1 @@ -0,0 +1,5760 @@ +/-- This set of tests is for features that are compatible with all versions of + Perl >= 5.10, in non-UTF-8 mode. It should run clean for the 8-bit, 16-bit, + and 32-bit PCRE libraries. --/ + +< forbid 89?=ABCDEFfGILMNPTUWXZ< + +/the quick brown fox/ + the quick brown fox + The quick brown FOX + What do you know about the quick brown fox? + What do you know about THE QUICK BROWN FOX? + +/The quick brown fox/i + the quick brown fox + The quick brown FOX + What do you know about the quick brown fox? + What do you know about THE QUICK BROWN FOX? + +/abcd\t\n\r\f\a\e\071\x3b\$\\\?caxyz/ + abcd\t\n\r\f\a\e9;\$\\?caxyz + +/a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/ + abxyzpqrrrabbxyyyypqAzz + abxyzpqrrrabbxyyyypqAzz + aabxyzpqrrrabbxyyyypqAzz + aaabxyzpqrrrabbxyyyypqAzz + aaaabxyzpqrrrabbxyyyypqAzz + abcxyzpqrrrabbxyyyypqAzz + aabcxyzpqrrrabbxyyyypqAzz + aaabcxyzpqrrrabbxyyyypAzz + aaabcxyzpqrrrabbxyyyypqAzz + aaabcxyzpqrrrabbxyyyypqqAzz + aaabcxyzpqrrrabbxyyyypqqqAzz + aaabcxyzpqrrrabbxyyyypqqqqAzz + aaabcxyzpqrrrabbxyyyypqqqqqAzz + aaabcxyzpqrrrabbxyyyypqqqqqqAzz + aaaabcxyzpqrrrabbxyyyypqAzz + abxyzzpqrrrabbxyyyypqAzz + aabxyzzzpqrrrabbxyyyypqAzz + aaabxyzzzzpqrrrabbxyyyypqAzz + aaaabxyzzzzpqrrrabbxyyyypqAzz + abcxyzzpqrrrabbxyyyypqAzz + aabcxyzzzpqrrrabbxyyyypqAzz + aaabcxyzzzzpqrrrabbxyyyypqAzz + aaaabcxyzzzzpqrrrabbxyyyypqAzz + aaaabcxyzzzzpqrrrabbbxyyyypqAzz + aaaabcxyzzzzpqrrrabbbxyyyyypqAzz + aaabcxyzpqrrrabbxyyyypABzz + aaabcxyzpqrrrabbxyyyypABBzz + >>>aaabxyzpqrrrabbxyyyypqAzz + >aaaabxyzpqrrrabbxyyyypqAzz + >>>>abcxyzpqrrrabbxyyyypqAzz + *** Failers + abxyzpqrrabbxyyyypqAzz + abxyzpqrrrrabbxyyyypqAzz + abxyzpqrrrabxyyyypqAzz + aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz + aaaabcxyzzzzpqrrrabbbxyyypqAzz + aaabcxyzpqrrrabbxyyyypqqqqqqqAzz + +/^(abc){1,2}zz/ + abczz + abcabczz + *** Failers + zz + abcabcabczz + >>abczz + +/^(b+?|a){1,2}?c/ + bc + bbc + bbbc + bac + bbac + aac + abbbbbbbbbbbc + bbbbbbbbbbbac + *** Failers + aaac + abbbbbbbbbbbac + +/^(b+|a){1,2}c/ + bc + bbc + bbbc + bac + bbac + aac + abbbbbbbbbbbc + bbbbbbbbbbbac + *** Failers + aaac + abbbbbbbbbbbac + +/^(b+|a){1,2}?bc/ + bbc + +/^(b*|ba){1,2}?bc/ + babc + bbabc + bababc + *** Failers + bababbc + babababc + +/^(ba|b*){1,2}?bc/ + babc + bbabc + bababc + *** Failers + bababbc + babababc + +/^\ca\cA\c[;\c:/ + \x01\x01\e;z + +/^[ab\]cde]/ + athing + bthing + ]thing + cthing + dthing + ething + *** Failers + fthing + [thing + \\thing + +/^[]cde]/ + ]thing + cthing + dthing + ething + *** Failers + athing + fthing + +/^[^ab\]cde]/ + fthing + [thing + \\thing + *** Failers + athing + bthing + ]thing + cthing + dthing + ething + +/^[^]cde]/ + athing + fthing + *** Failers + ]thing + cthing + dthing + ething + +/^\/ + + +/^ÿ/ + ÿ + +/^[0-9]+$/ + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 100 + *** Failers + abc + +/^.*nter/ + enter + inter + uponter + +/^xxx[0-9]+$/ + xxx0 + xxx1234 + *** Failers + xxx + +/^.+[0-9][0-9][0-9]$/ + x123 + xx123 + 123456 + *** Failers + 123 + x1234 + +/^.+?[0-9][0-9][0-9]$/ + x123 + xx123 + 123456 + *** Failers + 123 + x1234 + +/^([^!]+)!(.+)=apquxz\.ixr\.zzz\.ac\.uk$/ + abc!pqr=apquxz.ixr.zzz.ac.uk + *** Failers + !pqr=apquxz.ixr.zzz.ac.uk + abc!=apquxz.ixr.zzz.ac.uk + abc!pqr=apquxz:ixr.zzz.ac.uk + abc!pqr=apquxz.ixr.zzz.ac.ukk + +/:/ + Well, we need a colon: somewhere + *** Fail if we don't + +/([\da-f:]+)$/i + 0abc + abc + fed + E + :: + 5f03:12C0::932e + fed def + Any old stuff + *** Failers + 0zzz + gzzz + fed\x20 + Any old rubbish + +/^.*\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/ + .1.2.3 + A.12.123.0 + *** Failers + .1.2.3333 + 1.2.3 + 1234.2.3 + +/^(\d+)\s+IN\s+SOA\s+(\S+)\s+(\S+)\s*\(\s*$/ + 1 IN SOA non-sp1 non-sp2( + 1 IN SOA non-sp1 non-sp2 ( + *** Failers + 1IN SOA non-sp1 non-sp2( + +/^[a-zA-Z\d][a-zA-Z\d\-]*(\.[a-zA-Z\d][a-zA-z\d\-]*)*\.$/ + a. + Z. + 2. + ab-c.pq-r. + sxk.zzz.ac.uk. + x-.y-. + *** Failers + -abc.peq. + +/^\*\.[a-z]([a-z\-\d]*[a-z\d]+)?(\.[a-z]([a-z\-\d]*[a-z\d]+)?)*$/ + *.a + *.b0-a + *.c3-b.c + *.c-a.b-c + *** Failers + *.0 + *.a- + *.a-b.c- + *.c-a.0-c + +/^(?=ab(de))(abd)(e)/ + abde + +/^(?!(ab)de|x)(abd)(f)/ + abdf + +/^(?=(ab(cd)))(ab)/ + abcd + +/^[\da-f](\.[\da-f])*$/i + a.b.c.d + A.B.C.D + a.b.c.1.2.3.C + +/^\".*\"\s*(;.*)?$/ + \"1234\" + \"abcd\" ; + \"\" ; rhubarb + *** Failers + \"1234\" : things + +/^$/ + \ + *** Failers + +/ ^ a (?# begins with a) b\sc (?# then b c) $ (?# then end)/x + ab c + *** Failers + abc + ab cde + +/(?x) ^ a (?# begins with a) b\sc (?# then b c) $ (?# then end)/ + ab c + *** Failers + abc + ab cde + +/^ a\ b[c ]d $/x + a bcd + a b d + *** Failers + abcd + ab d + +/^(a(b(c)))(d(e(f)))(h(i(j)))(k(l(m)))$/ + abcdefhijklm + +/^(?:a(b(c)))(?:d(e(f)))(?:h(i(j)))(?:k(l(m)))$/ + abcdefhijklm + +/^[\w][\W][\s][\S][\d][\D][\b][\n][\c]][\022]/ + a+ Z0+\x08\n\x1d\x12 + +/^[.^$|()*+?{,}]+/ + .^\$(*+)|{?,?} + +/^a*\w/ + z + az + aaaz + a + aa + aaaa + a+ + aa+ + +/^a*?\w/ + z + az + aaaz + a + aa + aaaa + a+ + aa+ + +/^a+\w/ + az + aaaz + aa + aaaa + aa+ + +/^a+?\w/ + az + aaaz + aa + aaaa + aa+ + +/^\d{8}\w{2,}/ + 1234567890 + 12345678ab + 12345678__ + *** Failers + 1234567 + +/^[aeiou\d]{4,5}$/ + uoie + 1234 + 12345 + aaaaa + *** Failers + 123456 + +/^[aeiou\d]{4,5}?/ + uoie + 1234 + 12345 + aaaaa + 123456 + +/\A(abc|def)=(\1){2,3}\Z/ + abc=abcabc + def=defdefdef + *** Failers + abc=defdef + +/^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\11*(\3\4)\1(?#)2$/ + abcdefghijkcda2 + abcdefghijkkkkcda2 + +/(cat(a(ract|tonic)|erpillar)) \1()2(3)/ + cataract cataract23 + catatonic catatonic23 + caterpillar caterpillar23 + + +/^From +([^ ]+) +[a-zA-Z][a-zA-Z][a-zA-Z] +[a-zA-Z][a-zA-Z][a-zA-Z] +[0-9]?[0-9] +[0-9][0-9]:[0-9][0-9]/ + From abcd Mon Sep 01 12:33:02 1997 + +/^From\s+\S+\s+([a-zA-Z]{3}\s+){2}\d{1,2}\s+\d\d:\d\d/ + From abcd Mon Sep 01 12:33:02 1997 + From abcd Mon Sep 1 12:33:02 1997 + *** Failers + From abcd Sep 01 12:33:02 1997 + +/^12.34/s + 12\n34 + 12\r34 + +/\w+(?=\t)/ + the quick brown\t fox + +/foo(?!bar)(.*)/ + foobar is foolish see? + +/(?:(?!foo)...|^.{0,2})bar(.*)/ + foobar crowbar etc + barrel + 2barrel + A barrel + +/^(\D*)(?=\d)(?!123)/ + abc456 + *** Failers + abc123 + +/^1234(?# test newlines + inside)/ + 1234 + +/^1234 #comment in extended re + /x + 1234 + +/#rhubarb + abcd/x + abcd + +/^abcd#rhubarb/x + abcd + +/^(a)\1{2,3}(.)/ + aaab + aaaab + aaaaab + aaaaaab + +/(?!^)abc/ + the abc + *** Failers + abc + +/(?=^)abc/ + abc + *** Failers + the abc + +/^[ab]{1,3}(ab*|b)/ + aabbbbb + +/^[ab]{1,3}?(ab*|b)/ + aabbbbb + +/^[ab]{1,3}?(ab*?|b)/ + aabbbbb + +/^[ab]{1,3}(ab*?|b)/ + aabbbbb + +/ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # optional leading comment +(?: (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # initial word +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) )* # further okay, if led by a period +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] | # atom and space parts, or... +\( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) | # comments, or... + +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +# quoted strings +)* +< (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # leading < +(?: @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* + +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* , (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* )? # optional route +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # initial word +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) )* # further okay, if led by a period +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +# address spec +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* > # trailing > +# name and address +) (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # optional trailing comment +/x + Alan Other + + user\@dom.ain + \"A. Other\" (a comment) + A. Other (a comment) + \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay + A missing angle @,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +# Quoted string +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +# Quoted string +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +# Quoted string +) +# leading word +[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] * # "normal" atoms and or spaces +(?: +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +| +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +) # "special" comment or quoted string +[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] * # more "normal" +)* +< +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +@ +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +# Quoted string +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +# Quoted string +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +) +/x + Alan Other + + user\@dom.ain + \"A. Other\" (a comment) + A. Other (a comment) + \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay + A missing angle ]{0,})>]{0,})>([\d]{0,}\.)(.*)((
([\w\W\s\d][^<>]{0,})|[\s]{0,}))<\/a><\/TD>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD><\/TR>/is + 43.
Word Processor
(N-1286)
Lega lstaff.comCA - Statewide + +/a[^a]b/ + acb + a\nb + +/a.b/ + acb + *** Failers + a\nb + +/a[^a]b/s + acb + a\nb + +/a.b/s + acb + a\nb + +/^(b+?|a){1,2}?c/ + bac + bbac + bbbac + bbbbac + bbbbbac + +/^(b+|a){1,2}?c/ + bac + bbac + bbbac + bbbbac + bbbbbac + +/(?!\A)x/m + x\nb\n + a\bx\n + +/\x0{ab}/ + \0{ab} + +/(A|B)*?CD/ + CD + +/(A|B)*CD/ + CD + +/(AB)*?\1/ + ABABAB + +/(AB)*\1/ + ABABAB + +/(?.*/)foo" + /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/it/you/see/ + +"(?>.*/)foo" + /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo + +/(?>(\.\d\d[1-9]?))\d+/ + 1.230003938 + 1.875000282 + *** Failers + 1.235 + +/^((?>\w+)|(?>\s+))*$/ + now is the time for all good men to come to the aid of the party + *** Failers + this is not a line with only words and spaces! + +/(\d+)(\w)/ + 12345a + 12345+ + +/((?>\d+))(\w)/ + 12345a + *** Failers + 12345+ + +/(?>a+)b/ + aaab + +/((?>a+)b)/ + aaab + +/(?>(a+))b/ + aaab + +/(?>b)+/ + aaabbbccc + +/(?>a+|b+|c+)*c/ + aaabbbbccccd + +/((?>[^()]+)|\([^()]*\))+/ + ((abc(ade)ufh()()x + +/\(((?>[^()]+)|\([^()]+\))+\)/ + (abc) + (abc(def)xyz) + *** Failers + ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + +/a(?-i)b/i + ab + Ab + *** Failers + aB + AB + +/(a (?x)b c)d e/ + a bcd e + *** Failers + a b cd e + abcd e + a bcde + +/(a b(?x)c d (?-x)e f)/ + a bcde f + *** Failers + abcdef + +/(a(?i)b)c/ + abc + aBc + *** Failers + abC + aBC + Abc + ABc + ABC + AbC + +/a(?i:b)c/ + abc + aBc + *** Failers + ABC + abC + aBC + +/a(?i:b)*c/ + aBc + aBBc + *** Failers + aBC + aBBC + +/a(?=b(?i)c)\w\wd/ + abcd + abCd + *** Failers + aBCd + abcD + +/(?s-i:more.*than).*million/i + more than million + more than MILLION + more \n than Million + *** Failers + MORE THAN MILLION + more \n than \n million + +/(?:(?s-i)more.*than).*million/i + more than million + more than MILLION + more \n than Million + *** Failers + MORE THAN MILLION + more \n than \n million + +/(?>a(?i)b+)+c/ + abc + aBbc + aBBc + *** Failers + Abc + abAb + abbC + +/(?=a(?i)b)\w\wc/ + abc + aBc + *** Failers + Ab + abC + aBC + +/(?<=a(?i)b)(\w\w)c/ + abxxc + aBxxc + *** Failers + Abxxc + ABxxc + abxxC + +/(?:(a)|b)(?(1)A|B)/ + aA + bB + *** Failers + aB + bA + +/^(a)?(?(1)a|b)+$/ + aa + b + bb + *** Failers + ab + +/^(?(?=abc)\w{3}:|\d\d)$/ + abc: + 12 + *** Failers + 123 + xyz + +/^(?(?!abc)\d\d|\w{3}:)$/ + abc: + 12 + *** Failers + 123 + xyz + +/(?(?<=foo)bar|cat)/ + foobar + cat + fcat + focat + *** Failers + foocat + +/(?(?a*)*/ + a + aa + aaaa + +/(abc|)+/ + abc + abcabc + abcabcabc + xyz + +/([a]*)*/ + a + aaaaa + +/([ab]*)*/ + a + b + ababab + aaaabcde + bbbb + +/([^a]*)*/ + b + bbbb + aaa + +/([^ab]*)*/ + cccc + abab + +/([a]*?)*/ + a + aaaa + +/([ab]*?)*/ + a + b + abab + baba + +/([^a]*?)*/ + b + bbbb + aaa + +/([^ab]*?)*/ + c + cccc + baba + +/(?>a*)*/ + a + aaabcde + +/((?>a*))*/ + aaaaa + aabbaa + +/((?>a*?))*/ + aaaaa + aabbaa + +/(?(?=[^a-z]+[a-z]) \d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} ) /x + 12-sep-98 + 12-09-98 + *** Failers + sep-12-98 + +/(?<=(foo))bar\1/ + foobarfoo + foobarfootling + *** Failers + foobar + barfoo + +/(?i:saturday|sunday)/ + saturday + sunday + Saturday + Sunday + SATURDAY + SUNDAY + SunDay + +/(a(?i)bc|BB)x/ + abcx + aBCx + bbx + BBx + *** Failers + abcX + aBCX + bbX + BBX + +/^([ab](?i)[cd]|[ef])/ + ac + aC + bD + elephant + Europe + frog + France + *** Failers + Africa + +/^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/ + ab + aBd + xy + xY + zebra + Zambesi + *** Failers + aCD + XY + +/(?<=foo\n)^bar/m + foo\nbar + *** Failers + bar + baz\nbar + +/(?<=(?]&/ + <&OUT + +/^(a\1?){4}$/ + aaaaaaaaaa + *** Failers + AB + aaaaaaaaa + aaaaaaaaaaa + +/^(a(?(1)\1)){4}$/ + aaaaaaaaaa + *** Failers + aaaaaaaaa + aaaaaaaaaaa + +/(?:(f)(o)(o)|(b)(a)(r))*/ + foobar + +/(?<=a)b/ + ab + *** Failers + cb + b + +/(?a+)ab/ + +/(?>a+)b/ + aaab + +/([[:]+)/ + a:[b]: + +/([[=]+)/ + a=[b]= + +/([[.]+)/ + a.[b]. + +/((?>a+)b)/ + aaab + +/(?>(a+))b/ + aaab + +/((?>[^()]+)|\([^()]*\))+/ + ((abc(ade)ufh()()x + +/a\Z/ + *** Failers + aaab + a\nb\n + +/b\Z/ + a\nb\n + +/b\z/ + +/b\Z/ + a\nb + +/b\z/ + a\nb + *** Failers + +/^(?>(?(1)\.|())[^\W_](?>[a-z0-9-]*[^\W_])?)+$/ + a + abc + a-b + 0-9 + a.b + 5.6.7 + the.quick.brown.fox + a100.b200.300c + 12-ab.1245 + *** Failers + \ + .a + -a + a- + a. + a_b + a.- + a.. + ab..bc + the.quick.brown.fox- + the.quick.brown.fox. + the.quick.brown.fox_ + the.quick.brown.fox+ + +/(?>.*)(?<=(abcd|wxyz))/ + alphabetabcd + endingwxyz + *** Failers + a rather long string that doesn't end with one of them + +/word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword/ + word cat dog elephant mussel cow horse canary baboon snake shark otherword + word cat dog elephant mussel cow horse canary baboon snake shark + +/word (?>[a-zA-Z0-9]+ ){0,30}otherword/ + word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope + +/(?<=\d{3}(?!999))foo/ + 999foo + 123999foo + *** Failers + 123abcfoo + +/(?<=(?!...999)\d{3})foo/ + 999foo + 123999foo + *** Failers + 123abcfoo + +/(?<=\d{3}(?!999)...)foo/ + 123abcfoo + 123456foo + *** Failers + 123999foo + +/(?<=\d{3}...)(?\s*)=(?>\s*) # find Z)+|A)*/ + ZABCDEFG + +/((?>)+|A)*/ + ZABCDEFG + +/a*/g + abbab + +/^[\d-a]/ + abcde + -things + 0digit + *** Failers + bcdef + +/[[:space:]]+/ + > \x09\x0a\x0c\x0d\x0b< + +/[[:blank:]]+/ + > \x09\x0a\x0c\x0d\x0b< + +/[\s]+/ + > \x09\x0a\x0c\x0d\x0b< + +/\s+/ + > \x09\x0a\x0c\x0d\x0b< + +/a b/x + ab + +/(?!\A)x/m + a\nxb\n + +/(?!^)x/m + a\nxb\n + +/abc\Qabc\Eabc/ + abcabcabc + +/abc\Q(*+|\Eabc/ + abc(*+|abc + +/ abc\Q abc\Eabc/x + abc abcabc + *** Failers + abcabcabc + +/abc#comment + \Q#not comment + literal\E/x + abc#not comment\n literal + +/abc#comment + \Q#not comment + literal/x + abc#not comment\n literal + +/abc#comment + \Q#not comment + literal\E #more comment + /x + abc#not comment\n literal + +/abc#comment + \Q#not comment + literal\E #more comment/x + abc#not comment\n literal + +/\Qabc\$xyz\E/ + abc\\\$xyz + +/\Qabc\E\$\Qxyz\E/ + abc\$xyz + +/\Gabc/ + abc + *** Failers + xyzabc + +/\Gabc./g + abc1abc2xyzabc3 + +/abc./g + abc1abc2xyzabc3 + +/a(?x: b c )d/ + XabcdY + *** Failers + Xa b c d Y + +/((?x)x y z | a b c)/ + XabcY + AxyzB + +/(?i)AB(?-i)C/ + XabCY + *** Failers + XabcY + +/((?i)AB(?-i)C|D)E/ + abCE + DE + *** Failers + abcE + abCe + dE + De + +/(.*)\d+\1/ + abc123abc + abc123bc + +/(.*)\d+\1/s + abc123abc + abc123bc + +/((.*))\d+\1/ + abc123abc + abc123bc + +/-- This tests for an IPv6 address in the form where it can have up to + eight components, one and only one of which is empty. This must be + an internal component. --/ + +/^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + /xi + a123::a123 + a123:b342::abcd + a123:b342::324e:abcd + a123:ddde:b342::324e:abcd + a123:ddde:b342::324e:dcba:abcd + a123:ddde:9999:b342::324e:dcba:abcd + *** Failers + 1:2:3:4:5:6:7:8 + a123:bce:ddde:9999:b342::324e:dcba:abcd + a123::9999:b342::324e:dcba:abcd + abcde:2:3:4:5:6:7:8 + ::1 + abcd:fee0:123:: + :1 + 1: + +/[z\Qa-d]\E]/ + z + a + - + d + ] + *** Failers + b + +/[\z\C]/ + z + C + +/\M/ + M + +/(a+)*b/ + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + +/(?i)reg(?:ul(?:[aä]|ae)r|ex)/ + REGular + regulaer + Regex + regulär + +/Åæåä[à-ÿÀ-ß]+/ + Åæåäà + Åæåäÿ + ÅæåäÀ + Åæåäß + +/(?<=Z)X./ + \x84XAZXB + +/ab cd (?x) de fg/ + ab cd defg + +/ab cd(?x) de fg/ + ab cddefg + ** Failers + abcddefg + +/(?a|)*\d/ + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4 + +/(?:a|)*\d/ + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4 + +/\Z/g + abc\n + +/^(?s)(?>.*)(?(a))b|(a)c/ + ac + +/(?=(a))ab|(a)c/ + ac + +/((?>(a))b|(a)c)/ + ac + +/((?>(a))b|(a)c)++/ + ac + +/(?:(?>(a))b|(a)c)++/ + ac + +/(?=(?>(a))b|(a)c)(..)/ + ac + +/(?>(?>(a))b|(a)c)/ + ac + +/(?:(?>([ab])))+a=/+ + =ba= + +/(?>([ab]))+a=/+ + =ba= + +/((?>(a+)b)+(aabab))/ + aaaabaaabaabab + +/(?>a+|ab)+?c/ + aabc + +/(?>a+|ab)+c/ + aabc + +/(?:a+|ab)+c/ + aabc + +/(?(?=(a))a)/ + a + +/(?(?=(a))a)(b)/ + ab + +/^(?:a|ab)++c/ + aaaabc + +/^(?>a|ab)++c/ + aaaabc + +/^(?:a|ab)+c/ + aaaabc + +/(?=abc){3}abc/+ + abcabcabc + ** Failers + xyz + +/(?=abc)+abc/+ + abcabcabc + ** Failers + xyz + +/(?=abc)++abc/+ + abcabcabc + ** Failers + xyz + +/(?=abc){0}xyz/ + xyz + +/(?=abc){1}xyz/ + ** Failers + xyz + +/(?=(a))?./ + ab + bc + +/(?=(a))??./ + ab + bc + +/^(?=(?1))?[az]([abc])d/ + abd + zcdxx + +/^(?!a){0}\w+/ + aaaaa + +/(?<=(abc))?xyz/ + abcxyz + pqrxyz + +/^[\g]+/ + ggg<<>> + ** Failers + \\ga + +/^[\ga]+/ + gggagagaxyz + +/^[:a[:digit:]]+/ + aaaa444:::Z + +/^[:a[:digit:]:b]+/ + aaaa444:::bbbZ + +/[:a]xxx[b:]/ + :xxx: + +/(?<=a{2})b/i + xaabc + ** Failers + xabc + +/(?XNNNYZ + > X NYQZ + ** Failers + >XYZ + > X NY Z + +/\v*X\v?Y\v+Z\V*\x0a\V+\x0b\V{2,3}\x0c/ + >XY\x0aZ\x0aA\x0bNN\x0c + >\x0a\x0dX\x0aY\x0a\x0bZZZ\x0aAAA\x0bNNN\x0c + +/(foo)\Kbar/ + foobar + +/(foo)(\Kbar|baz)/ + foobar + foobaz + +/(foo\Kbar)baz/ + foobarbaz + +/abc\K|def\K/g+ + Xabcdefghi + +/ab\Kc|de\Kf/g+ + Xabcdefghi + +/(?=C)/g+ + ABCDECBA + +/^abc\K/+ + abcdef + ** Failers + defabcxyz + +/^(a(b))\1\g1\g{1}\g-1\g{-1}\g{-02}Z/ + ababababbbabZXXXX + +/(?tom|bon)-\g{A}/ + tom-tom + bon-bon + +/(^(a|b\g{-1}))/ + bacxxx + +/(?|(abc)|(xyz))\1/ + abcabc + xyzxyz + ** Failers + abcxyz + xyzabc + +/(?|(abc)|(xyz))(?1)/ + abcabc + xyzabc + ** Failers + xyzxyz + +/^X(?5)(a)(?|(b)|(q))(c)(d)(Y)/ + XYabcdY + +/^X(?7)(a)(?|(b|(r)(s))|(q))(c)(d)(Y)/ + XYabcdY + +/^X(?7)(a)(?|(b|(?|(r)|(t))(s))|(q))(c)(d)(Y)/ + XYabcdY + +/(?'abc'\w+):\k{2}/ + a:aaxyz + ab:ababxyz + ** Failers + a:axyz + ab:abxyz + +/(?'abc'\w+):\g{abc}{2}/ + a:aaxyz + ab:ababxyz + ** Failers + a:axyz + ab:abxyz + +/^(?a)? (?()b|c) (?('ab')d|e)/x + abd + ce + +/^(a.)\g-1Z/ + aXaXZ + +/^(a.)\g{-1}Z/ + aXaXZ + +/^(?(DEFINE) (? a) (? b) ) (?&A) (?&B) /x + abcd + +/(?(?&NAME_PAT))\s+(?(?&ADDRESS_PAT)) + (?(DEFINE) + (?[a-z]+) + (?\d+) + )/x + metcalfe 33 + +/(?(DEFINE)(?2[0-4]\d|25[0-5]|1\d\d|[1-9]?\d))\b(?&byte)(\.(?&byte)){3}/ + 1.2.3.4 + 131.111.10.206 + 10.0.0.0 + ** Failers + 10.6 + 455.3.4.5 + +/\b(?&byte)(\.(?&byte)){3}(?(DEFINE)(?2[0-4]\d|25[0-5]|1\d\d|[1-9]?\d))/ + 1.2.3.4 + 131.111.10.206 + 10.0.0.0 + ** Failers + 10.6 + 455.3.4.5 + +/^(\w++|\s++)*$/ + now is the time for all good men to come to the aid of the party + *** Failers + this is not a line with only words and spaces! + +/(\d++)(\w)/ + 12345a + *** Failers + 12345+ + +/a++b/ + aaab + +/(a++b)/ + aaab + +/(a++)b/ + aaab + +/([^()]++|\([^()]*\))+/ + ((abc(ade)ufh()()x + +/\(([^()]++|\([^()]+\))+\)/ + (abc) + (abc(def)xyz) + *** Failers + ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + +/^([^()]|\((?1)*\))*$/ + abc + a(b)c + a(b(c))d + *** Failers) + a(b(c)d + +/^>abc>([^()]|\((?1)*\))*abc>123abc>1(2)3abc>(1(2)3)]*+) | (?2)) * >))/x + <> + + hij> + hij> + def> + + *** Failers + a)(?<=b(?&X))/ + baz + +/^(?|(abc)|(def))\1/ + abcabc + defdef + ** Failers + abcdef + defabc + +/^(?|(abc)|(def))(?1)/ + abcabc + defabc + ** Failers + defdef + abcdef + +/(?:a(? (?')|(?")) |b(? (?')|(?")) ) (?('quote')[a-z]+|[0-9]+)/xJ + a\"aaaaa + b\"aaaaa + ** Failers + b\"11111 + +/(?:(?1)|B)(A(*F)|C)/ + ABCD + CCD + ** Failers + CAD + +/^(?:(?1)|B)(A(*F)|C)/ + CCD + BCD + ** Failers + ABCD + CAD + BAD + +/(?:(?1)|B)(A(*ACCEPT)XX|C)D/ + AAD + ACD + BAD + BCD + BAX + ** Failers + ACX + ABC + +/(?(DEFINE)(A))B(?1)C/ + BAC + +/(?(DEFINE)((A)\2))B(?1)C/ + BAAC + +/(? \( ( [^()]++ | (?&pn) )* \) )/x + (ab(cd)ef) + +/^(?=a(*SKIP)b|ac)/ + ** Failers + ac + +/^(?=a(*PRUNE)b)/ + ab + ** Failers + ac + +/^(?=a(*ACCEPT)b)/ + ac + +/(?>a\Kb)/ + ab + +/((?>a\Kb))/ + ab + +/(a\Kb)/ + ab + +/^a\Kcz|ac/ + ac + +/(?>a\Kbz|ab)/ + ab + +/^(?&t)(?(DEFINE)(?a\Kb))$/ + ab + +/^([^()]|\((?1)*\))*$/ + a(b)c + a(b(c)d)e + +/(?P(?P0)(?P>L1)|(?P>L2))/ + 0 + 00 + 0000 + +/(?P(?P0)|(?P>L2)(?P>L1))/ + 0 + 00 + 0000 + +/--- This one does fail, as expected, in Perl. It needs the complex item at the + end of the pattern. A single letter instead of (B|D) makes it not fail, + which I think is a Perl bug. --- / + +/A(*COMMIT)(B|D)/ + ACABX + +/--- Check the use of names for failure ---/ + +/^(A(*PRUNE:A)B|C(*PRUNE:B)D)/K + ** Failers + AC + CB + +/--- Force no study, otherwise mark is not seen. The studied version is in + test 2 because it isn't Perl-compatible. ---/ + +/(*MARK:A)(*SKIP:B)(C|X)/KSS + C + D + +/^(A(*THEN:A)B|C(*THEN:B)D)/K + ** Failers + CB + +/^(?:A(*THEN:A)B|C(*THEN:B)D)/K + CB + +/^(?>A(*THEN:A)B|C(*THEN:B)D)/K + CB + +/--- This should succeed, as the skip causes bump to offset 1 (the mark). Note +that we have to have something complicated such as (B|Z) at the end because, +for Perl, a simple character somehow causes an unwanted optimization to mess +with the handling of backtracking verbs. ---/ + +/A(*MARK:A)A+(*SKIP:A)(B|Z) | AC/xK + AAAC + +/--- Test skipping over a non-matching mark. ---/ + +/A(*MARK:A)A+(*MARK:B)(*SKIP:A)(B|Z) | AC/xK + AAAC + +/--- Check shorthand for MARK ---/ + +/A(*:A)A+(*SKIP:A)(B|Z) | AC/xK + AAAC + +/--- Don't loop! Force no study, otherwise mark is not seen. ---/ + +/(*:A)A+(*SKIP:A)(B|Z)/KSS + AAAC + +/--- This should succeed, as a non-existent skip name disables the skip ---/ + +/A(*MARK:A)A+(*SKIP:B)(B|Z) | AC/xK + AAAC + +/A(*MARK:A)A+(*SKIP:B)(B|Z) | AC(*:B)/xK + AAAC + +/--- COMMIT at the start of a pattern should act like an anchor. Again, +however, we need the complication for Perl. ---/ + +/(*COMMIT)(A|P)(B|P)(C|P)/ + ABCDEFG + ** Failers + DEFGABC + +/--- COMMIT inside an atomic group can't stop backtracking over the group. ---/ + +/(\w+)(?>b(*COMMIT))\w{2}/ + abbb + +/(\w+)b(*COMMIT)\w{2}/ + abbb + +/--- Check opening parens in comment when seeking forward reference. ---/ + +/(?&t)(?#()(?(DEFINE)(?a))/ + bac + +/--- COMMIT should override THEN ---/ + +/(?>(*COMMIT)(?>yes|no)(*THEN)(*F))?/ + yes + +/(?>(*COMMIT)(yes|no)(*THEN)(*F))?/ + yes + +/b?(*SKIP)c/ + bc + abc + +/(*SKIP)bc/ + a + +/(*SKIP)b/ + a + +/(?P(?P=abn)xxx|)+/ + xxx + +/(?i:([^b]))(?1)/ + aa + aA + ** Failers + ab + aB + Ba + ba + +/^(?&t)*+(?(DEFINE)(?a))\w$/ + aaaaaaX + ** Failers + aaaaaa + +/^(?&t)*(?(DEFINE)(?a))\w$/ + aaaaaaX + aaaaaa + +/^(a)*+(\w)/ + aaaaX + YZ + ** Failers + aaaa + +/^(?:a)*+(\w)/ + aaaaX + YZ + ** Failers + aaaa + +/^(a)++(\w)/ + aaaaX + ** Failers + aaaa + YZ + +/^(?:a)++(\w)/ + aaaaX + ** Failers + aaaa + YZ + +/^(a)?+(\w)/ + aaaaX + YZ + +/^(?:a)?+(\w)/ + aaaaX + YZ + +/^(a){2,}+(\w)/ + aaaaX + ** Failers + aaa + YZ + +/^(?:a){2,}+(\w)/ + aaaaX + ** Failers + aaa + YZ + +/(a|)*(?1)b/ + b + ab + aab + +/(a)++(?1)b/ + ** Failers + ab + aab + +/(a)*+(?1)b/ + ** Failers + ab + aab + +/(?1)(?:(b)){0}/ + b + +/(foo ( \( ((?:(?> [^()]+ )|(?2))*) \) ) )/x + foo(bar(baz)+baz(bop)) + +/(A (A|B(*ACCEPT)|C) D)(E)/x + AB + +/\A.*?(a|bc)/ + ba + +/\A.*?(?:a|bc)++/ + ba + +/\A.*?(a|bc)++/ + ba + +/\A.*?(?:a|bc|d)/ + ba + +/(?:(b))++/ + beetle + +/(?(?=(a(*ACCEPT)z))a)/ + a + +/^(a)(?1)+ab/ + aaaab + +/^(a)(?1)++ab/ + aaaab + +/^(?=a(*:M))aZ/K + aZbc + +/^(?!(*:M)b)aZ/K + aZbc + +/(?(DEFINE)(a))?b(?1)/ + backgammon + +/^\N+/ + abc\ndef + +/^\N{1,}/ + abc\ndef + +/(?(R)a+|(?R)b)/ + aaaabcde + +/(?(R)a+|((?R))b)/ + aaaabcde + +/((?(R)a+|(?1)b))/ + aaaabcde + +/((?(R1)a+|(?1)b))/ + aaaabcde + +/((?(R)a|(?1)))*/ + aaa + +/((?(R)a|(?1)))+/ + aaa + +/a(*:any +name)/K + abc + +/(?>(?&t)c|(?&t))(?(DEFINE)(?a|b(*PRUNE)c))/ + a + ba + bba + +/--- Checking revised (*THEN) handling ---/ + +/--- Capture ---/ + +/^.*? (a(*THEN)b) c/x + aabc + +/^.*? (a(*THEN)b|(*F)) c/x + aabc + +/^.*? ( (a(*THEN)b) | (*F) ) c/x + aabc + +/^.*? ( (a(*THEN)b) ) c/x + aabc + +/--- Non-capture ---/ + +/^.*? (?:a(*THEN)b) c/x + aabc + +/^.*? (?:a(*THEN)b|(*F)) c/x + aabc + +/^.*? (?: (?:a(*THEN)b) | (*F) ) c/x + aabc + +/^.*? (?: (?:a(*THEN)b) ) c/x + aabc + +/--- Atomic ---/ + +/^.*? (?>a(*THEN)b) c/x + aabc + +/^.*? (?>a(*THEN)b|(*F)) c/x + aabc + +/^.*? (?> (?>a(*THEN)b) | (*F) ) c/x + aabc + +/^.*? (?> (?>a(*THEN)b) ) c/x + aabc + +/--- Possessive capture ---/ + +/^.*? (a(*THEN)b)++ c/x + aabc + +/^.*? (a(*THEN)b|(*F))++ c/x + aabc + +/^.*? ( (a(*THEN)b)++ | (*F) )++ c/x + aabc + +/^.*? ( (a(*THEN)b)++ )++ c/x + aabc + +/--- Possessive non-capture ---/ + +/^.*? (?:a(*THEN)b)++ c/x + aabc + +/^.*? (?:a(*THEN)b|(*F))++ c/x + aabc + +/^.*? (?: (?:a(*THEN)b)++ | (*F) )++ c/x + aabc + +/^.*? (?: (?:a(*THEN)b)++ )++ c/x + aabc + +/--- Condition assertion ---/ + +/^(?(?=a(*THEN)b)ab|ac)/ + ac + +/--- Condition ---/ + +/^.*?(?(?=a)a|b(*THEN)c)/ + ba + +/^.*?(?:(?(?=a)a|b(*THEN)c)|d)/ + ba + +/^.*?(?(?=a)a(*THEN)b|c)/ + ac + +/--- Assertion ---/ + +/^.*(?=a(*THEN)b)/ + aabc + +/------------------------------/ + +/(?>a(*:m))/imsxSK + a + +/(?>(a)(*:m))/imsxSK + a + +/(?<=a(*ACCEPT)b)c/ + xacd + +/(?<=(a(*ACCEPT)b))c/ + xacd + +/(?<=(a(*COMMIT)b))c/ + xabcd + ** Failers + xacd + +/(?a?)*)*c/ + aac + +/(?>.*?a)(?<=ba)/ + aba + +/(?:.*?a)(?<=ba)/ + aba + +/.*?a(*PRUNE)b/ + aab + +/.*?a(*PRUNE)b/s + aab + +/^a(*PRUNE)b/s + aab + +/.*?a(*SKIP)b/ + aab + +/(?>.*?a)b/s + aab + +/(?>.*?a)b/ + aab + +/(?>^a)b/s + aab + +/(?>.*?)(?<=(abcd)|(wxyz))/ + alphabetabcd + endingwxyz + +/(?>.*)(?<=(abcd)|(wxyz))/ + alphabetabcd + endingwxyz + +"(?>.*)foo" + abcdfooxyz + +"(?>.*?)foo" + abcdfooxyz + +/(?:(a(*PRUNE)b)){0}(?:(?1)|ac)/ + ac + +/(?:(a(*SKIP)b)){0}(?:(?1)|ac)/ + ac + +/(?<=(*SKIP)ac)a/ + aa + +/A(*MARK:A)A+(*SKIP:B)(B|Z) | AC/xK + AAAC + +/a(*SKIP:m)x|ac(*:n)(*SKIP:n)d|ac/K + acacd + +/A(*SKIP:m)x|A(*SKIP:n)x|AB/K + AB + +/((*SKIP:r)d){0}a(*SKIP:m)x|ac(*:n)|ac/K + acacd + +/-- Tests that try to figure out how Perl works. My hypothesis is that the + first verb that is backtracked onto is the one that acts. This seems to be + the case almost all the time, but there is one exception that is perhaps a + bug. --/ + +/-- This matches "aaaac"; each PRUNE advances one character until the subject + no longer starts with 5 'a's. --/ + +/aaaaa(*PRUNE)b|a+c/ + aaaaaac + +/-- Putting SKIP in front of PRUNE makes no difference, as it is never +backtracked onto, whether or not it has a label. --/ + +/aaaaa(*SKIP)(*PRUNE)b|a+c/ + aaaaaac + +/aaaaa(*SKIP:N)(*PRUNE)b|a+c/ + aaaaaac + +/aaaa(*:N)a(*SKIP:N)(*PRUNE)b|a+c/ + aaaaaac + +/-- Putting THEN in front makes no difference. */ + +/aaaaa(*THEN)(*PRUNE)b|a+c/ + aaaaaac + +/-- However, putting COMMIT in front of the prune changes it to "no match". I + think this is inconsistent and possibly a bug. For the moment, running this + test is moved out of the Perl-compatible file. --/ + +/aaaaa(*COMMIT)(*PRUNE)b|a+c/ + + +/---- OK, lets play the same game again using SKIP instead of PRUNE. ----/ + +/-- This matches "ac" because SKIP forces the next match to start on the + sixth "a". --/ + +/aaaaa(*SKIP)b|a+c/ + aaaaaac + +/-- Putting PRUNE in front makes no difference. --/ + +/aaaaa(*PRUNE)(*SKIP)b|a+c/ + aaaaaac + +/-- Putting THEN in front makes no difference. --/ + +/aaaaa(*THEN)(*SKIP)b|a+c/ + aaaaaac + +/-- In this case, neither does COMMIT. This still matches "ac". --/ + +/aaaaa(*COMMIT)(*SKIP)b|a+c/ + aaaaaac + +/-- This gives "no match", as expected. --/ + +/aaaaa(*COMMIT)b|a+c/ + aaaaaac + + +/------ Tests using THEN ------/ + +/-- This matches "aaaaaac", as expected. --/ + +/aaaaa(*THEN)b|a+c/ + aaaaaac + +/-- Putting SKIP in front makes no difference. --/ + +/aaaaa(*SKIP)(*THEN)b|a+c/ + aaaaaac + +/-- Putting PRUNE in front makes no difference. --/ + +/aaaaa(*PRUNE)(*THEN)b|a+c/ + aaaaaac + +/-- Putting COMMIT in front makes no difference. --/ + +/aaaaa(*COMMIT)(*THEN)b|a+c/ + aaaaaac + +/-- End of "priority" tests --/ + +/aaaaa(*:m)(*PRUNE:m)(*SKIP:m)m|a+/ + aaaaaa + +/aaaaa(*:m)(*MARK:m)(*PRUNE)(*SKIP:m)m|a+/ + aaaaaa + +/aaaaa(*:n)(*PRUNE:m)(*SKIP:m)m|a+/ + aaaaaa + +/aaaaa(*:n)(*MARK:m)(*PRUNE)(*SKIP:m)m|a+/ + aaaaaa + +/a(*MARK:A)aa(*PRUNE:A)a(*SKIP:A)b|a+c/ + aaaac + +/a(*MARK:A)aa(*MARK:A)a(*SKIP:A)b|a+c/ + aaaac + +/aaa(*PRUNE:A)a(*SKIP:A)b|a+c/ + aaaac + +/aaa(*MARK:A)a(*SKIP:A)b|a+c/ + aaaac + +/a(*:m)a(*COMMIT)(*SKIP:m)b|a+c/K + aaaaaac + +/.?(a|b(*THEN)c)/ + ba + +/(a(*COMMIT)b)c|abd/ + abc + abd + +/(?=a(*COMMIT)b)abc|abd/ + abc + abd + +/(?>a(*COMMIT)b)c|abd/ + abc + abd + +/a(?=b(*COMMIT)c)[^d]|abd/ + abd + abc + +/a(?=bc).|abd/ + abd + abc + +/a(?>b(*COMMIT)c)d|abd/ + abceabd + +/a(?>bc)d|abd/ + abceabd + +/(?>a(*COMMIT)b)c|abd/ + abd + +/(?>a(*COMMIT)c)d|abd/ + abd + +/((?=a(*COMMIT)b)ab|ac){0}(?:(?1)|a(c))/ + ac + +/-- These tests were formerly in test 2, but changes in PCRE and Perl have + made them compatible. --/ + +/^(a)?(?(1)a|b)+$/ + *** Failers + a + +/(?=a\Kb)ab/ + ab + +/(?!a\Kb)ac/ + ac + +/^abc(?<=b\Kc)d/ + abcd + +/^abc(?b))/K + abc + +/(*PRUNE:m(m)(?&y)(?(DEFINE)(?b))/K + abc + +/(*SKIP:m(m)(?&y)(?(DEFINE)(?b))/K + abc + +/(*THEN:m(m)(?&y)(?(DEFINE)(?b))/K + abc + +/^\d*\w{4}/ + 1234 + 123 + +/^[^b]*\w{4}/ + aaaa + aaa + +/^[^b]*\w{4}/i + aaaa + aaa + +/^a*\w{4}/ + aaaa + aaa + +/^a*\w{4}/i + aaaa + aaa + +/(?(?=ab)ab)/+ + ca + cd + +/(?:(?foo)|(?bar))\k/J + foofoo + barbar + +/(?A)(?:(?foo)|(?bar))\k/J + AfooA + AbarA + ** Failers + Afoofoo + Abarbar + +/^(\d+)\s+IN\s+SOA\s+(\S+)\s+(\S+)\s*\(\s*$/ + 1 IN SOA non-sp1 non-sp2( + +/^ (?:(?A)|(?'B'B)(?A)) (?('A')x) (?()y)$/xJ + Ax + BAxy + +/^A\xZ/ + A\0Z + +/^A\o{123}B/ + A\123B + +/ ^ a + + b $ /x + aaaab + +/ ^ a + #comment + + b $ /x + aaaab + +/ ^ a + #comment + #comment + + b $ /x + aaaab + +/ ^ (?> a + ) b $ /x + aaaab + +/ ^ ( a + ) + + \w $ /x + aaaab + +/(?:a\Kb)*+/+ + ababc + +/(?>a\Kb)*/+ + ababc + +/(?:a\Kb)*/+ + ababc + +/(a\Kb)*+/+ + ababc + +/(a\Kb)*/+ + ababc + +/(?:x|(?:(xx|yy)+|x|x|x|x|x)|a|a|a)bc/ + acb + +'\A(?:[^\"]++|\"(?:[^\"]*+|\"\")*+\")++' + NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED + +'\A(?:[^\"]++|\"(?:[^\"]++|\"\")*+\")++' + NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED + +'\A(?:[^\"]++|\"(?:[^\"]++|\"\")++\")++' + NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED + +'\A([^\"1]++|[\"2]([^\"3]*+|[\"4][\"5])*+[\"6])++' + NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED + +/^\w+(?>\s*)(?<=\w)/ + test test + +/(?Pa)(?Pb)/gJ + abbaba + +/(?Pa)(?Pb)(?P=same)/gJ + abbaba + +/(?P=same)?(?Pa)(?Pb)/gJ + abbaba + +/(?:(?P=same)?(?:(?Pa)|(?Pb))(?P=same))+/gJ + bbbaaabaabb + +/(?:(?P=same)?(?:(?P=same)(?Pa)(?P=same)|(?P=same)?(?Pb)(?P=same)){2}(?P=same)(?Pc)(?P=same)){2}(?Pz)?/gJ + bbbaaaccccaaabbbcc + +/(?Pa)?(?Pb)?(?()c|d)*l/ + acl + bdl + adl + bcl + +/\sabc/ + \x{0b}abc + +/[\Qa]\E]+/ + aa]] + +/[\Q]a\E]+/ + aa]] + +/(?:((abcd))|(((?:(?:(?:(?:abc|(?:abcdef))))b)abcdefghi)abc)|((*ACCEPT)))/ + 1234abcd + +/(\2)(\1)/ + +"Z*(|d*){216}" + +"(?1)(?#?'){8}(a)" + baaaaaaaaac + +"(?|(\k'Pm')|(?'Pm'))" + abcd + +/(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[,;:])(?=.{8,16})(?!.*[\s])/ + \ Fred:099 + +/(?=.*X)X$/ + \ X + +/X+(?#comment)?/ + >XXX< + +/ (? \w+ )* \. /xi + pokus. + +/(?(DEFINE) (? \w+ ) ) (?&word)* \./xi + pokus. + +/(?(DEFINE) (? \w+ ) ) ( (?&word)* ) \./xi + pokus. + +/(?&word)* (?(DEFINE) (? \w+ ) ) \./xi + pokus. + +/(?&word)* \. (? \w+ )/xi + pokus.hokus + +/-- End of testinput1 --/ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput10 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput10 new file mode 100755 index 000000000..93ddb3a75 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput10 @@ -0,0 +1,1419 @@ +/-- This set of tests check Unicode property support with the DFA matching + functionality of pcre_dfa_exec(). The -dfa flag must be used with pcretest + when running it. --/ + +/\pL\P{Nd}/8 + AB + *** Failers + A0 + 00 + +/\X./8 + AB + A\x{300}BC + A\x{300}\x{301}\x{302}BC + *** Failers + \x{300} + +/\X\X/8 + ABC + A\x{300}B\x{300}\x{301}C + A\x{300}\x{301}\x{302}BC + *** Failers + \x{300} + +/^\pL+/8 + abcd + a + *** Failers + +/^\PL+/8 + 1234 + = + *** Failers + abcd + +/^\X+/8 + abcdA\x{300}\x{301}\x{302} + A\x{300}\x{301}\x{302} + A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302} + a + *** Failers + \x{300}\x{301}\x{302} + +/\X?abc/8 + abc + A\x{300}abc + A\x{300}\x{301}\x{302}A\x{300}A\x{300}A\x{300}abcxyz + \x{300}abc + *** Failers + +/^\X?abc/8 + abc + A\x{300}abc + *** Failers + A\x{300}\x{301}\x{302}A\x{300}A\x{300}A\x{300}abcxyz + \x{300}abc + +/\X*abc/8 + abc + A\x{300}abc + A\x{300}\x{301}\x{302}A\x{300}A\x{300}A\x{300}abcxyz + \x{300}abc + *** Failers + +/^\X*abc/8 + abc + A\x{300}abc + A\x{300}\x{301}\x{302}A\x{300}A\x{300}A\x{300}abcxyz + *** Failers + \x{300}abc + +/^\pL?=./8 + A=b + =c + *** Failers + 1=2 + AAAA=b + +/^\pL*=./8 + AAAA=b + =c + *** Failers + 1=2 + +/^\X{2,3}X/8 + A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302}X + A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302}X + *** Failers + X + A\x{300}\x{301}\x{302}X + A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302}X + +/^\pC\pL\pM\pN\pP\pS\pZ\p{Xsp}/8 + >\x{1680}\x{2028}\x{0b} + ** Failers + \x{0b} + +/^>\p{Xsp}+/8O + > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + +/^>\p{Xsp}*/8O + > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + +/^>\p{Xsp}{2,9}/8O + > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + +/^>[\p{Xsp}]/8O + >\x{2028}\x{0b} + +/^>[\p{Xsp}]+/8O + > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + +/^>\p{Xps}/8 + >\x{1680}\x{2028}\x{0b} + >\x{a0} + ** Failers + \x{0b} + +/^>\p{Xps}+/8 + > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + +/^>\p{Xps}+?/8 + >\x{1680}\x{2028}\x{0b} + +/^>\p{Xps}*/8 + > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + +/^>\p{Xps}{2,9}/8 + > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + +/^>\p{Xps}{2,9}?/8 + > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + +/^>[\p{Xps}]/8 + >\x{2028}\x{0b} + +/^>[\p{Xps}]+/8 + > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + +/^\p{Xwd}/8 + ABCD + 1234 + \x{6ca} + \x{a6c} + \x{10a7} + _ABC + ** Failers + [] + +/^\p{Xwd}+/8 + ABCD1234\x{6ca}\x{a6c}\x{10a7}_ + +/^\p{Xwd}*/8 + ABCD1234\x{6ca}\x{a6c}\x{10a7}_ + +/^\p{Xwd}{2,9}/8 + A_12\x{6ca}\x{a6c}\x{10a7} + +/^[\p{Xwd}]/8 + ABCD1234_ + 1234abcd_ + \x{6ca} + \x{a6c} + \x{10a7} + _ABC + ** Failers + [] + +/^[\p{Xwd}]+/8 + ABCD1234\x{6ca}\x{a6c}\x{10a7}_ + +/-- Unicode properties for \b abd \B --/ + +/\b...\B/8W + abc_ + \x{37e}abc\x{376} + \x{37e}\x{376}\x{371}\x{393}\x{394} + !\x{c0}++\x{c1}\x{c2} + !\x{c0}+++++ + +/-- Without PCRE_UCP, non-ASCII always fail, even if < 256 --/ + +/\b...\B/8 + abc_ + ** Failers + \x{37e}abc\x{376} + \x{37e}\x{376}\x{371}\x{393}\x{394} + !\x{c0}++\x{c1}\x{c2} + !\x{c0}+++++ + +/-- With PCRE_UCP, non-UTF8 chars that are < 256 still check properties --/ + +/\b...\B/W + abc_ + !\x{c0}++\x{c1}\x{c2} + !\x{c0}+++++ + +/-- Caseless single negated characters > 127 need UCP support --/ + +/[^\x{100}]/8i + \x{100}\x{101}X + +/[^\x{100}]+/8i + \x{100}\x{101}XX + +/^\X/8 + A\P + A\P\P + A\x{300}\x{301}\P + A\x{300}\x{301}\P\P + A\x{301}\P + A\x{301}\P\P + +/^\X{2,3}/8 + A\P + A\P\P + AA\P + AA\P\P + A\x{300}\x{301}\P + A\x{300}\x{301}\P\P + A\x{300}\x{301}A\x{300}\x{301}\P + A\x{300}\x{301}A\x{300}\x{301}\P\P + +/^\X{2}/8 + AA\P + AA\P\P + A\x{300}\x{301}A\x{300}\x{301}\P + A\x{300}\x{301}A\x{300}\x{301}\P\P + +/^\X+/8 + AA\P + AA\P\P + +/^\X+?Z/8 + AA\P + AA\P\P + +/-- These are tests for extended grapheme clusters --/ + +/^\X/8+ + G\x{34e}\x{34e}X + \x{34e}\x{34e}X + \x04X + \x{1100}X + \x{1100}\x{34e}X + \x{1b04}\x{1b04}X + *These match up to the roman letters + \x{1111}\x{1111}L,L + \x{1111}\x{1111}\x{1169}L,L,V + \x{1111}\x{ae4c}L, LV + \x{1111}\x{ad89}L, LVT + \x{1111}\x{ae4c}\x{1169}L, LV, V + \x{1111}\x{ae4c}\x{1169}\x{1169}L, LV, V, V + \x{1111}\x{ae4c}\x{1169}\x{11fe}L, LV, V, T + \x{1111}\x{ad89}\x{11fe}L, LVT, T + \x{1111}\x{ad89}\x{11fe}\x{11fe}L, LVT, T, T + \x{ad89}\x{11fe}\x{11fe}LVT, T, T + *These match just the first codepoint (invalid sequence) + \x{1111}\x{11fe}L, T + \x{ae4c}\x{1111}LV, L + \x{ae4c}\x{ae4c}LV, LV + \x{ae4c}\x{ad89}LV, LVT + \x{1169}\x{1111}V, L + \x{1169}\x{ae4c}V, LV + \x{1169}\x{ad89}V, LVT + \x{ad89}\x{1111}LVT, L + \x{ad89}\x{1169}LVT, V + \x{ad89}\x{ae4c}LVT, LV + \x{ad89}\x{ad89}LVT, LVT + \x{11fe}\x{1111}T, L + \x{11fe}\x{1169}T, V + \x{11fe}\x{ae4c}T, LV + \x{11fe}\x{ad89}T, LVT + *Test extend and spacing mark + \x{1111}\x{ae4c}\x{0711}L, LV, extend + \x{1111}\x{ae4c}\x{1b04}L, LV, spacing mark + \x{1111}\x{ae4c}\x{1b04}\x{0711}\x{1b04}L, LV, spacing mark, extend, spacing mark + *Test CR, LF, and control + \x0d\x{0711}CR, extend + \x0d\x{1b04}CR, spacingmark + \x0a\x{0711}LF, extend + \x0a\x{1b04}LF, spacingmark + \x0b\x{0711}Control, extend + \x09\x{1b04}Control, spacingmark + *There are no Prepend characters, so we can't test Prepend, CR + +/^(?>\X{2})X/8+ + \x{1111}\x{ae4c}\x{1111}\x{ae4c}X + +/^\X{2,4}X/8+ + \x{1111}\x{ae4c}\x{1111}\x{ae4c}X + \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X + \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X + +/^\X{2,4}?X/8+ + \x{1111}\x{ae4c}\x{1111}\x{ae4c}X + \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X + \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X + +/-- --/ + +/\x{1e9e}+/8i + \x{1e9e}\x{00df} + +/[z\x{1e9e}]+/8i + \x{1e9e}\x{00df} + +/\x{00df}+/8i + \x{1e9e}\x{00df} + +/[z\x{00df}]+/8i + \x{1e9e}\x{00df} + +/\x{1f88}+/8i + \x{1f88}\x{1f80} + +/[z\x{1f88}]+/8i + \x{1f88}\x{1f80} + +/-- Perl matches these --/ + +/\x{00b5}+/8i + \x{00b5}\x{039c}\x{03bc} + +/\x{039c}+/8i + \x{00b5}\x{039c}\x{03bc} + +/\x{03bc}+/8i + \x{00b5}\x{039c}\x{03bc} + + +/\x{00c5}+/8i + \x{00c5}\x{00e5}\x{212b} + +/\x{00e5}+/8i + \x{00c5}\x{00e5}\x{212b} + +/\x{212b}+/8i + \x{00c5}\x{00e5}\x{212b} + + +/\x{01c4}+/8i + \x{01c4}\x{01c5}\x{01c6} + +/\x{01c5}+/8i + \x{01c4}\x{01c5}\x{01c6} + +/\x{01c6}+/8i + \x{01c4}\x{01c5}\x{01c6} + + +/\x{01c7}+/8i + \x{01c7}\x{01c8}\x{01c9} + +/\x{01c8}+/8i + \x{01c7}\x{01c8}\x{01c9} + +/\x{01c9}+/8i + \x{01c7}\x{01c8}\x{01c9} + + +/\x{01ca}+/8i + \x{01ca}\x{01cb}\x{01cc} + +/\x{01cb}+/8i + \x{01ca}\x{01cb}\x{01cc} + +/\x{01cc}+/8i + \x{01ca}\x{01cb}\x{01cc} + + +/\x{01f1}+/8i + \x{01f1}\x{01f2}\x{01f3} + +/\x{01f2}+/8i + \x{01f1}\x{01f2}\x{01f3} + +/\x{01f3}+/8i + \x{01f1}\x{01f2}\x{01f3} + + +/\x{0345}+/8i + \x{0345}\x{0399}\x{03b9}\x{1fbe} + +/\x{0399}+/8i + \x{0345}\x{0399}\x{03b9}\x{1fbe} + +/\x{03b9}+/8i + \x{0345}\x{0399}\x{03b9}\x{1fbe} + +/\x{1fbe}+/8i + \x{0345}\x{0399}\x{03b9}\x{1fbe} + + +/\x{0392}+/8i + \x{0392}\x{03b2}\x{03d0} + +/\x{03b2}+/8i + \x{0392}\x{03b2}\x{03d0} + +/\x{03d0}+/8i + \x{0392}\x{03b2}\x{03d0} + + +/\x{0395}+/8i + \x{0395}\x{03b5}\x{03f5} + +/\x{03b5}+/8i + \x{0395}\x{03b5}\x{03f5} + +/\x{03f5}+/8i + \x{0395}\x{03b5}\x{03f5} + + +/\x{0398}+/8i + \x{0398}\x{03b8}\x{03d1}\x{03f4} + +/\x{03b8}+/8i + \x{0398}\x{03b8}\x{03d1}\x{03f4} + +/\x{03d1}+/8i + \x{0398}\x{03b8}\x{03d1}\x{03f4} + +/\x{03f4}+/8i + \x{0398}\x{03b8}\x{03d1}\x{03f4} + + +/\x{039a}+/8i + \x{039a}\x{03ba}\x{03f0} + +/\x{03ba}+/8i + \x{039a}\x{03ba}\x{03f0} + +/\x{03f0}+/8i + \x{039a}\x{03ba}\x{03f0} + + +/\x{03a0}+/8i + \x{03a0}\x{03c0}\x{03d6} + +/\x{03c0}+/8i + \x{03a0}\x{03c0}\x{03d6} + +/\x{03d6}+/8i + \x{03a0}\x{03c0}\x{03d6} + + +/\x{03a1}+/8i + \x{03a1}\x{03c1}\x{03f1} + +/\x{03c1}+/8i + \x{03a1}\x{03c1}\x{03f1} + +/\x{03f1}+/8i + \x{03a1}\x{03c1}\x{03f1} + + +/\x{03a3}+/8i + \x{03A3}\x{03C2}\x{03C3} + +/\x{03c2}+/8i + \x{03A3}\x{03C2}\x{03C3} + +/\x{03c3}+/8i + \x{03A3}\x{03C2}\x{03C3} + + +/\x{03a6}+/8i + \x{03a6}\x{03c6}\x{03d5} + +/\x{03c6}+/8i + \x{03a6}\x{03c6}\x{03d5} + +/\x{03d5}+/8i + \x{03a6}\x{03c6}\x{03d5} + + +/\x{03c9}+/8i + \x{03c9}\x{03a9}\x{2126} + +/\x{03a9}+/8i + \x{03c9}\x{03a9}\x{2126} + +/\x{2126}+/8i + \x{03c9}\x{03a9}\x{2126} + + +/\x{1e60}+/8i + \x{1e60}\x{1e61}\x{1e9b} + +/\x{1e61}+/8i + \x{1e60}\x{1e61}\x{1e9b} + +/\x{1e9b}+/8i + \x{1e60}\x{1e61}\x{1e9b} + + +/\x{1e9e}+/8i + \x{1e9e}\x{00df} + +/\x{00df}+/8i + \x{1e9e}\x{00df} + + +/\x{1f88}+/8i + \x{1f88}\x{1f80} + +/\x{1f80}+/8i + \x{1f88}\x{1f80} + +/\x{004b}+/8i + \x{004b}\x{006b}\x{212a} + +/\x{006b}+/8i + \x{004b}\x{006b}\x{212a} + +/\x{212a}+/8i + \x{004b}\x{006b}\x{212a} + + +/\x{0053}+/8i + \x{0053}\x{0073}\x{017f} + +/\x{0073}+/8i + \x{0053}\x{0073}\x{017f} + +/\x{017f}+/8i + \x{0053}\x{0073}\x{017f} + +/ist/8i + ikt + +/is+t/8i + iSs\x{17f}t + ikt + +/is+?t/8i + ikt + +/is?t/8i + ikt + +/is{2}t/8i + iskt + +/^\p{Xuc}/8 + $abc + @abc + `abc + \x{1234}abc + ** Failers + abc + +/^\p{Xuc}+/8 + $@`\x{a0}\x{1234}\x{e000}** + ** Failers + \x{9f} + +/^\p{Xuc}+?/8 + $@`\x{a0}\x{1234}\x{e000}** + ** Failers + \x{9f} + +/^\p{Xuc}+?\*/8 + $@`\x{a0}\x{1234}\x{e000}** + ** Failers + \x{9f} + +/^\p{Xuc}++/8 + $@`\x{a0}\x{1234}\x{e000}** + ** Failers + \x{9f} + +/^\p{Xuc}{3,5}/8 + $@`\x{a0}\x{1234}\x{e000}** + ** Failers + \x{9f} + +/^\p{Xuc}{3,5}?/8 + $@`\x{a0}\x{1234}\x{e000}** + ** Failers + \x{9f} + +/^[\p{Xuc}]/8 + $@`\x{a0}\x{1234}\x{e000}** + ** Failers + \x{9f} + +/^[\p{Xuc}]+/8 + $@`\x{a0}\x{1234}\x{e000}** + ** Failers + \x{9f} + +/^\P{Xuc}/8 + abc + ** Failers + $abc + @abc + `abc + \x{1234}abc + +/^[\P{Xuc}]/8 + abc + ** Failers + $abc + @abc + `abc + \x{1234}abc + +/^A\s+Z/8W + A\x{2005}Z + A\x{85}\x{180e}\x{2005}Z + +/^A[\s]+Z/8W + A\x{2005}Z + A\x{85}\x{180e}\x{2005}Z + +/-- End of testinput10 --/ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput11 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput11 new file mode 100755 index 000000000..6f0989a14 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput11 @@ -0,0 +1,143 @@ +/-- These are a few representative patterns whose lengths and offsets are to be +shown when the link size is 2. This is just a doublecheck test to ensure the +sizes don't go horribly wrong when something is changed. The pattern contents +are all themselves checked in other tests. Unicode, including property support, +is required for these tests. --/ + +/((?i)b)/BM + +/(?s)(.*X|^B)/BM + +/(?s:.*X|^B)/BM + +/^[[:alnum:]]/BM + +/#/IxMD + +/a#/IxMD + +/x?+/BM + +/x++/BM + +/x{1,3}+/BM + +/(x)*+/BM + +/^((a+)(?U)([ab]+)(?-U)([bc]+)(\w*))/BM + +|8J\$WE\<\.rX\+ix\[d1b\!H\#\?vV0vrK\:ZH1\=2M\>iV\;\?aPhFB\<\*vW\@QW\@sO9\}cfZA\-i\'w\%hKd6gt1UJP\,15_\#QY\$M\^Mss_U\/\]\&LK9\[5vQub\^w\[KDD\qmj\;2\}YWFdYx\.Ap\]hjCPTP\(n28k\+3\;o\&WXqs\/gOXdr\$\:r\'do0\;b4c\(f_Gr\=\"\\4\)\[01T7ajQJvL\$W\~mL_sS\/4h\:x\*\[ZN\=KLs\&L5zX\/\/\>it\,o\:aU\(\;Z\>pW\&T7oP\'2K\^E\:x9\'c\[\%z\-\,64JQ5AeH_G\#KijUKghQw\^\\vea3a\?kka_G\$8\#\`\*kynsxzBLru\'\]k_\[7FrVx\}\^\=\$blx\>s\-N\%j\;D\*aZDnsw\:YKZ\%Q\.Kne9\#hP\?\+b3\(SOvL\,\^\;\&u5\@\?5C5Bhb\=m\-vEh_L15Jl\]U\)0RP6\{q\%L\^_z5E\'Dw6X\b|BM + +|\$\<\.X\+ix\[d1b\!H\#\?vV0vrK\:ZH1\=2M\>iV\;\?aPhFB\<\*vW\@QW\@sO9\}cfZA\-i\'w\%hKd6gt1UJP\,15_\#QY\$M\^Mss_U\/\]\&LK9\[5vQub\^w\[KDD\qmj\;2\}YWFdYx\.Ap\]hjCPTP\(n28k\+3\;o\&WXqs\/gOXdr\$\:r\'do0\;b4c\(f_Gr\=\"\\4\)\[01T7ajQJvL\$W\~mL_sS\/4h\:x\*\[ZN\=KLs\&L5zX\/\/\>it\,o\:aU\(\;Z\>pW\&T7oP\'2K\^E\:x9\'c\[\%z\-\,64JQ5AeH_G\#KijUKghQw\^\\vea3a\?kka_G\$8\#\`\*kynsxzBLru\'\]k_\[7FrVx\}\^\=\$blx\>s\-N\%j\;D\*aZDnsw\:YKZ\%Q\.Kne9\#hP\?\+b3\(SOvL\,\^\;\&u5\@\?5C5Bhb\=m\-vEh_L15Jl\]U\)0RP6\{q\%L\^_z5E\'Dw6X\b|BM + +/(a(?1)b)/BM + +/(a(?1)+b)/BM + +/a(?Pb|c)d(?Pe)/BM + +/(?:a(?Pc(?Pd)))(?Pa)/BM + +/(?Pa)...(?P=a)bbb(?P>a)d/BM + +/abc(?C255)de(?C)f/BM + +/abcde/CBM + +/\x{100}/8BM + +/\x{1000}/8BM + +/\x{10000}/8BM + +/\x{100000}/8BM + +/\x{10ffff}/8BM + +/\x{110000}/8BM + +/[\x{ff}]/8BM + +/[\x{100}]/8BM + +/\x80/8BM + +/\xff/8BM + +/\x{0041}\x{2262}\x{0391}\x{002e}/D8M + +/\x{D55c}\x{ad6d}\x{C5B4}/D8M + +/\x{65e5}\x{672c}\x{8a9e}/D8M + +/[\x{100}]/8BM + +/[Z\x{100}]/8BM + +/^[\x{100}\E-\Q\E\x{150}]/B8M + +/^[\QÄ€\E-\QÅ\E]/B8M + +/^[\QÄ€\E-\QÅ\E/B8M + +/[\p{L}]/BM + +/[\p{^L}]/BM + +/[\P{L}]/BM + +/[\P{^L}]/BM + +/[abc\p{L}\x{0660}]/8BM + +/[\p{Nd}]/8BM + +/[\p{Nd}+-]+/8BM + +/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8iBM + +/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8BM + +/[\x{105}-\x{109}]/8iBM + +/( ( (?(1)0|) )* )/xBM + +/( (?(1)0|)* )/xBM + +/[a]/BM + +/[a]/8BM + +/[\xaa]/BM + +/[\xaa]/8BM + +/[^a]/BM + +/[^a]/8BM + +/[^\xaa]/BM + +/[^\xaa]/8BM + +/[^\d]/8WB + +/[[:^alpha:][:^cntrl:]]+/8WB + +/[[:^cntrl:][:^alpha:]]+/8WB + +/[[:alpha:]]+/8WB + +/[[:^alpha:]\S]+/8WB + +/abc(d|e)(*THEN)x(123(*THEN)4|567(b|q)(*THEN)xx)/B + +/(((a\2)|(a*)\g<-1>))*a?/B + +/((?+1)(\1))/B + +/.((?2)(?R)\1)()/B + +/([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00](*ACCEPT)/ + +/-- End of testinput11 --/ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput12 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput12 new file mode 100755 index 000000000..89ed4564b --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput12 @@ -0,0 +1,109 @@ +/-- This test is run only when JIT support is available. It checks for a +successful and an unsuccessful JIT compile and save and restore behaviour, +and a couple of things that are different with JIT. --/ + +/abc/S+I + +/(?(?C1)(?=a)a)/S+I + +/(?(?C1)(?=a)a)/S!+I + +/b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*/S+I + +/abc/S+I>testsavedregex + +b)c/PN + abc + +/a?|b?/P + abc + ** Failers + ddd\N + +/\w+A/P + CDAAAAB + +/\w+A/PU + CDAAAAB + +/\Biss\B/I+P + Mississippi + +/abc/\P + +/-- End of POSIX tests --/ + +/a\Cb/ + aXb + a\nb + ** Failers (too big char) + A\x{123}B + A\o{443}B + +/\x{100}/I + +/\o{400}/I + +/ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # optional leading comment +(?: (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # initial word +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) )* # further okay, if led by a period +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] | # atom and space parts, or... +\( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) | # comments, or... + +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +# quoted strings +)* +< (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # leading < +(?: @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* + +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* , (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* )? # optional route +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # initial word +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) )* # further okay, if led by a period +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +# address spec +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* > # trailing > +# name and address +) (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # optional trailing comment +/xSI + +/-- Although this saved pattern was compiled with link-size=2, it does no harm +to run this test with other link sizes because it is going to generated a +"compiled in wrong mode" error as soon as it is loaded, so the link size does +not matter. --/ + +\x09< + +/[\h]+/BZ + >\x09\x20\xa0< + +/[\v]/BZ + +/[\H]/BZ + +/[^\h]/BZ + +/[\V]/BZ + +/[\x0a\V]/BZ + +/\777/I + +/(*:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF)XX/K + XX + +/(*:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDE)XX/K + XX + +/\u0100/ + +/[\u0100-\u0200]/ + +/[^\x00-a]{12,}[^b-\xff]*/BZ + +/[^\s]*\s* [^\W]+\W+ [^\d]*?\d0 [^\d\w]{4,6}?\w*A/BZ + +/(?'ABC'[bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar](*THEN:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))/ + +/-- End of testinput14 --/ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput15 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput15 new file mode 100755 index 000000000..c065105b1 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput15 @@ -0,0 +1,369 @@ +/-- This set of tests is for UTF-8 support but not Unicode property support, + and is relevant only to the 8-bit library. --/ + +< forbid W + +/X(\C{3})/8 + X\x{1234} + +/X(\C{4})/8 + X\x{1234}YZ + +/X\C*/8 + XYZabcdce + +/X\C*?/8 + XYZabcde + +/X\C{3,5}/8 + Xabcdefg + X\x{1234} + X\x{1234}YZ + X\x{1234}\x{512} + X\x{1234}\x{512}YZ + +/X\C{3,5}?/8 + Xabcdefg + X\x{1234} + X\x{1234}YZ + X\x{1234}\x{512} + +/a\Cb/8 + aXb + a\nb + +/a\C\Cb/8 + a\x{100}b + +/ab\Cde/8 + abXde + +/a\C\Cb/8 + a\x{100}b + ** Failers + a\x{12257}b + +/[Ã]/8 + +/Ã/8 + +/ÃÃÃxxx/8 + +/ÃÃÃxxx/8?DZSSO + +/badutf/8 + \xdf + \xef + \xef\x80 + \xf7 + \xf7\x80 + \xf7\x80\x80 + \xfb + \xfb\x80 + \xfb\x80\x80 + \xfb\x80\x80\x80 + \xfd + \xfd\x80 + \xfd\x80\x80 + \xfd\x80\x80\x80 + \xfd\x80\x80\x80\x80 + \xdf\x7f + \xef\x7f\x80 + \xef\x80\x7f + \xf7\x7f\x80\x80 + \xf7\x80\x7f\x80 + \xf7\x80\x80\x7f + \xfb\x7f\x80\x80\x80 + \xfb\x80\x7f\x80\x80 + \xfb\x80\x80\x7f\x80 + \xfb\x80\x80\x80\x7f + \xfd\x7f\x80\x80\x80\x80 + \xfd\x80\x7f\x80\x80\x80 + \xfd\x80\x80\x7f\x80\x80 + \xfd\x80\x80\x80\x7f\x80 + \xfd\x80\x80\x80\x80\x7f + \xed\xa0\x80 + \xc0\x8f + \xe0\x80\x8f + \xf0\x80\x80\x8f + \xf8\x80\x80\x80\x8f + \xfc\x80\x80\x80\x80\x8f + \x80 + \xfe + \xff + +/badutf/8 + \xfb\x80\x80\x80\x80 + \xfd\x80\x80\x80\x80\x80 + \xf7\xbf\xbf\xbf + +/shortutf/8 + \P\P\xdf + \P\P\xef + \P\P\xef\x80 + \P\P\xf7 + \P\P\xf7\x80 + \P\P\xf7\x80\x80 + \P\P\xfb + \P\P\xfb\x80 + \P\P\xfb\x80\x80 + \P\P\xfb\x80\x80\x80 + \P\P\xfd + \P\P\xfd\x80 + \P\P\xfd\x80\x80 + \P\P\xfd\x80\x80\x80 + \P\P\xfd\x80\x80\x80\x80 + +/anything/8 + \xc0\x80 + \xc1\x8f + \xe0\x9f\x80 + \xf0\x8f\x80\x80 + \xf8\x87\x80\x80\x80 + \xfc\x83\x80\x80\x80\x80 + \xfe\x80\x80\x80\x80\x80 + \xff\x80\x80\x80\x80\x80 + \xc3\x8f + \xe0\xaf\x80 + \xe1\x80\x80 + \xf0\x9f\x80\x80 + \xf1\x8f\x80\x80 + \xf8\x88\x80\x80\x80 + \xf9\x87\x80\x80\x80 + \xfc\x84\x80\x80\x80\x80 + \xfd\x83\x80\x80\x80\x80 + \?\xf8\x88\x80\x80\x80 + \?\xf9\x87\x80\x80\x80 + \?\xfc\x84\x80\x80\x80\x80 + \?\xfd\x83\x80\x80\x80\x80 + +/\x{100}/8DZ + +/\x{1000}/8DZ + +/\x{10000}/8DZ + +/\x{100000}/8DZ + +/\x{10ffff}/8DZ + +/[\x{ff}]/8DZ + +/[\x{100}]/8DZ + +/\x80/8DZ + +/\xff/8DZ + +/\x{D55c}\x{ad6d}\x{C5B4}/DZ8 + \x{D55c}\x{ad6d}\x{C5B4} + +/\x{65e5}\x{672c}\x{8a9e}/DZ8 + \x{65e5}\x{672c}\x{8a9e} + +/\x{80}/DZ8 + +/\x{084}/DZ8 + +/\x{104}/DZ8 + +/\x{861}/DZ8 + +/\x{212ab}/DZ8 + +/-- This one is here not because it's different to Perl, but because the way +the captured single-byte is displayed. (In Perl it becomes a character, and you +can't tell the difference.) --/ + +/X(\C)(.*)/8 + X\x{1234} + X\nabc + +/-- This one is here because Perl gives out a grumbly error message (quite +correctly, but that messes up comparisons). --/ + +/a\Cb/8 + *** Failers + a\x{100}b + +/[^ab\xC0-\xF0]/8SDZ + \x{f1} + \x{bf} + \x{100} + \x{1000} + *** Failers + \x{c0} + \x{f0} + +/Ä€{3,4}/8SDZ + \x{100}\x{100}\x{100}\x{100\x{100} + +/(\x{100}+|x)/8SDZ + +/(\x{100}*a|x)/8SDZ + +/(\x{100}{0,2}a|x)/8SDZ + +/(\x{100}{1,2}a|x)/8SDZ + +/\x{100}/8DZ + +/a\x{100}\x{101}*/8DZ + +/a\x{100}\x{101}+/8DZ + +/[^\x{c4}]/DZ + +/[\x{100}]/8DZ + \x{100} + Z\x{100} + \x{100}Z + *** Failers + +/[\xff]/DZ8 + >\x{ff}< + +/[^\xff]/8DZ + +/\x{100}abc(xyz(?1))/8DZ + +/a\x{1234}b/P8 + a\x{1234}b + +/\777/8I + \x{1ff} + \777 + +/\x{100}+\x{200}/8DZ + +/\x{100}+X/8DZ + +/^[\QÄ€\E-\QÅ\E/BZ8 + +/-- This tests the stricter UTF-8 check according to RFC 3629. --/ + +/X/8 + \x{d800} + \x{d800}\? + \x{da00} + \x{da00}\? + \x{dfff} + \x{dfff}\? + \x{110000} + \x{110000}\? + \x{2000000} + \x{2000000}\? + \x{7fffffff} + \x{7fffffff}\? + +/(*UTF8)\x{1234}/ + abcd\x{1234}pqr + +/(*CRLF)(*UTF)(*BSR_UNICODE)a\Rb/I + +/\h/SI8 + ABC\x{09} + ABC\x{20} + ABC\x{a0} + ABC\x{1680} + ABC\x{180e} + ABC\x{2000} + ABC\x{202f} + ABC\x{205f} + ABC\x{3000} + +/\v/SI8 + ABC\x{0a} + ABC\x{0b} + ABC\x{0c} + ABC\x{0d} + ABC\x{85} + ABC\x{2028} + +/\h*A/SI8 + CDBABC + +/\v+A/SI8 + +/\s?xxx\s/8SI + +/\sxxx\s/I8ST1 + AB\x{85}xxx\x{a0}XYZ + AB\x{a0}xxx\x{85}XYZ + +/\S \S/I8ST1 + \x{a2} \x{84} + A Z + +/a+/8 + a\x{123}aa\>1 + a\x{123}aa\>2 + a\x{123}aa\>3 + a\x{123}aa\>4 + a\x{123}aa\>5 + a\x{123}aa\>6 + +/\x{1234}+/iS8I + +/\x{1234}+?/iS8I + +/\x{1234}++/iS8I + +/\x{1234}{2}/iS8I + +/[^\x{c4}]/8DZ + +/X+\x{200}/8DZ + +/\R/SI8 + +/\777/8DZ + +/\w+\x{C4}/8BZ + a\x{C4}\x{C4} + +/\w+\x{C4}/8BZT1 + a\x{C4}\x{C4} + +/\W+\x{C4}/8BZ + !\x{C4} + +/\W+\x{C4}/8BZT1 + !\x{C4} + +/\W+\x{A1}/8BZ + !\x{A1} + +/\W+\x{A1}/8BZT1 + !\x{A1} + +/X\s+\x{A0}/8BZ + X\x20\x{A0}\x{A0} + +/X\s+\x{A0}/8BZT1 + X\x20\x{A0}\x{A0} + +/\S+\x{A0}/8BZ + X\x{A0}\x{A0} + +/\S+\x{A0}/8BZT1 + X\x{A0}\x{A0} + +/\x{a0}+\s!/8BZ + \x{a0}\x20! + +/\x{a0}+\s!/8BZT1 + \x{a0}\x20! + +/A/8 + \x{ff000041} + \x{7f000041} + +/(*UTF8)abc/9 + +/abc/89 + +//8+L + \xf1\xad\xae\xae + +/-- End of testinput15 --/ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput16 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput16 new file mode 100755 index 000000000..7ccde0a8c --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput16 @@ -0,0 +1,67 @@ +/-- This set of tests is run only with the 8-bit library when Unicode property + support is available. It starts with tests of the POSIX interface, because + that is supported only with the 8-bit library. --/ + +/\w/P + +++\x{c2} + +/\w/WP + +++\x{c2} + +/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8iDZ + +/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8DZ + +/AB\x{1fb0}/8DZ + +/AB\x{1fb0}/8DZi + +/\x{401}\x{420}\x{421}\x{422}\x{423}\x{424}\x{425}\x{426}\x{427}\x{428}\x{429}\x{42a}\x{42b}\x{42c}\x{42d}\x{42e}\x{42f}/8iSI + \x{401}\x{420}\x{421}\x{422}\x{423}\x{424}\x{425}\x{426}\x{427}\x{428}\x{429}\x{42a}\x{42b}\x{42c}\x{42d}\x{42e}\x{42f} + \x{451}\x{440}\x{441}\x{442}\x{443}\x{444}\x{445}\x{446}\x{447}\x{448}\x{449}\x{44a}\x{44b}\x{44c}\x{44d}\x{44e}\x{44f} + +/[â±¥]/8iBZ + +/[^â±¥]/8iBZ + +/\h/SI + +/\v/SI + +/\R/SI + +/[[:blank:]]/WBZ + +/\x{212a}+/i8SI + KKkk\x{212a} + +/s+/i8SI + SSss\x{17f} + +/[\W\p{Any}]/BZ + abc + 123 + +/[\W\pL]/BZ + abc + ** Failers + 123 + +/[\D]/8 + \x{1d7cf} + +/[\D\P{Nd}]/8 + \x{1d7cf} + +/[^\D]/8 + a9b + ** Failers + \x{1d7cf} + +/[^\D\P{Nd}]/8 + a9b + \x{1d7cf} + ** Failers + \x{10000} + +/-- End of testinput16 --/ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput17 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput17 new file mode 100755 index 000000000..c48e77f97 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput17 @@ -0,0 +1,309 @@ +/-- This set of tests is for the 16- and 32-bit library's basic (non-UTF-16 + or -32) features that are not compatible with the 8-bit library, or which + give different output in 16- or 32-bit mode. --/ + +< forbid 8W + +/a\Cb/ + aXb + a\nb + +/[^\x{c4}]/DZ + +/\x{100}/I + +/ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # optional leading comment +(?: (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # initial word +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) )* # further okay, if led by a period +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] | # atom and space parts, or... +\( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) | # comments, or... + +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +# quoted strings +)* +< (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # leading < +(?: @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* + +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* , (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* )? # optional route +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # initial word +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) )* # further okay, if led by a period +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +# address spec +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* > # trailing > +# name and address +) (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # optional trailing comment +/xSI + +/[\h]/BZ + >\x09< + +/[\h]+/BZ + >\x09\x20\xa0< + +/[\v]/BZ + +/[^\h]/BZ + +/\h+/SI + \x{1681}\x{200b}\x{1680}\x{2000}\x{202f}\x{3000} + \x{3001}\x{2fff}\x{200a}\xa0\x{2000} + +/[\h\x{dc00}]+/BZSI + \x{1681}\x{200b}\x{1680}\x{2000}\x{202f}\x{3000} + \x{3001}\x{2fff}\x{200a}\xa0\x{2000} + +/\H+/SI + \x{1680}\x{180e}\x{167f}\x{1681}\x{180d}\x{180f} + \x{2000}\x{200a}\x{1fff}\x{200b} + \x{202f}\x{205f}\x{202e}\x{2030}\x{205e}\x{2060} + \xa0\x{3000}\x9f\xa1\x{2fff}\x{3001} + +/[\H\x{d800}]+/ + \x{1680}\x{180e}\x{167f}\x{1681}\x{180d}\x{180f} + \x{2000}\x{200a}\x{1fff}\x{200b} + \x{202f}\x{205f}\x{202e}\x{2030}\x{205e}\x{2060} + \xa0\x{3000}\x9f\xa1\x{2fff}\x{3001} + +/\v+/SI + \x{2027}\x{2030}\x{2028}\x{2029} + \x09\x0e\x84\x86\x85\x0a\x0b\x0c\x0d + +/[\v\x{dc00}]+/BZSI + \x{2027}\x{2030}\x{2028}\x{2029} + \x09\x0e\x84\x86\x85\x0a\x0b\x0c\x0d + +/\V+/SI + \x{2028}\x{2029}\x{2027}\x{2030} + \x85\x0a\x0b\x0c\x0d\x09\x0e\x84\x86 + +/[\V\x{d800}]+/ + \x{2028}\x{2029}\x{2027}\x{2030} + \x85\x0a\x0b\x0c\x0d\x09\x0e\x84\x86 + +/\R+/SI + \x{2027}\x{2030}\x{2028}\x{2029} + \x09\x0e\x84\x86\x85\x0a\x0b\x0c\x0d + +/\x{d800}\x{d7ff}\x{dc00}\x{dc00}\x{dcff}\x{dd00}/I + \x{d800}\x{d7ff}\x{dc00}\x{dc00}\x{dcff}\x{dd00} + +/[^\x{80}][^\x{ff}][^\x{100}][^\x{1000}][^\x{ffff}]/BZ + +/[^\x{80}][^\x{ff}][^\x{100}][^\x{1000}][^\x{ffff}]/BZi + +/[^\x{100}]*[^\x{1000}]+[^\x{ffff}]??[^\x{8000}]{4,}[^\x{7fff}]{2,9}?[^\x{100}]{5,6}+/BZ + +/[^\x{100}]*[^\x{1000}]+[^\x{ffff}]??[^\x{8000}]{4,}[^\x{7fff}]{2,9}?[^\x{100}]{5,6}+/BZi + +/(*:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF)XX/K + XX + +/(*:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDE)XX/K + XX + +/\u0100/BZ + +/[\u0100-\u0200]/BZ + +/\ud800/BZ + +/^\x{ffff}+/i + \x{ffff} + +/^\x{ffff}?/i + \x{ffff} + +/^\x{ffff}*/i + \x{ffff} + +/^\x{ffff}{3}/i + \x{ffff}\x{ffff}\x{ffff} + +/^\x{ffff}{0,3}/i + \x{ffff} + +/[^\x00-a]{12,}[^b-\xff]*/BZ + +/[^\s]*\s* [^\W]+\W+ [^\d]*?\d0 [^\d\w]{4,6}?\w*A/BZ + +/a*[b-\x{200}]?a#a*[b-\x{200}]?b#[a-f]*[g-\x{200}]*#[g-\x{200}]*[a-c]*#[g-\x{200}]*[a-h]*/BZ + +/^[\x{1234}\x{4321}]{2,4}?/ + \x{1234}\x{1234}\x{1234} + +/(*THEN:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA)/ + +/-- End of testinput17 --/ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput18 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput18 new file mode 100755 index 000000000..2dfb54cdf --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput18 @@ -0,0 +1,300 @@ +/-- This set of tests is for UTF-16 and UTF-32 support, and is relevant only to + the 16- and 32-bit libraries. --/ + +< forbid W + +/ÃÃÃxxx/8?DZSS + +/abc/8 + Ã] + +/X(\C{3})/8 + X\x{11234}Y + X\x{11234}YZ + +/X(\C{4})/8 + X\x{11234}YZ + X\x{11234}YZW + +/X\C*/8 + XYZabcdce + +/X\C*?/8 + XYZabcde + +/X\C{3,5}/8 + Xabcdefg + X\x{11234}Y + X\x{11234}YZ + X\x{11234}\x{512} + X\x{11234}\x{512}YZ + X\x{11234}\x{512}\x{11234}Z + +/X\C{3,5}?/8 + Xabcdefg + X\x{11234}Y + X\x{11234}YZ + X\x{11234}\x{512}YZ + *** Failers + X\x{11234} + +/a\Cb/8 + aXb + a\nb + +/a\C\Cb/8 + a\x{12257}b + a\x{12257}\x{11234}b + ** Failers + a\x{100}b + +/ab\Cde/8 + abXde + +/-- Check maximum character size --/ + +/\x{ffff}/8DZ + +/\x{10000}/8DZ + +/\x{100}/8DZ + +/\x{1000}/8DZ + +/\x{10000}/8DZ + +/\x{100000}/8DZ + +/\x{10ffff}/8DZ + +/[\x{ff}]/8DZ + +/[\x{100}]/8DZ + +/\x80/8DZ + +/\xff/8DZ + +/\x{D55c}\x{ad6d}\x{C5B4}/DZ8 + \x{D55c}\x{ad6d}\x{C5B4} + +/\x{65e5}\x{672c}\x{8a9e}/DZ8 + \x{65e5}\x{672c}\x{8a9e} + +/\x{80}/DZ8 + +/\x{084}/DZ8 + +/\x{104}/DZ8 + +/\x{861}/DZ8 + +/\x{212ab}/DZ8 + +/-- This one is here not because it's different to Perl, but because the way +the captured single-byte is displayed. (In Perl it becomes a character, and you +can't tell the difference.) --/ + +/X(\C)(.*)/8 + X\x{1234} + X\nabc + +/-- This one is here because Perl gives out a grumbly error message (quite +correctly, but that messes up comparisons). --/ + +/a\Cb/8 + *** Failers + a\x{100}b + +/[^ab\xC0-\xF0]/8SDZ + \x{f1} + \x{bf} + \x{100} + \x{1000} + *** Failers + \x{c0} + \x{f0} + +/Ä€{3,4}/8SDZ + \x{100}\x{100}\x{100}\x{100\x{100} + +/(\x{100}+|x)/8SDZ + +/(\x{100}*a|x)/8SDZ + +/(\x{100}{0,2}a|x)/8SDZ + +/(\x{100}{1,2}a|x)/8SDZ + +/\x{100}/8DZ + +/a\x{100}\x{101}*/8DZ + +/a\x{100}\x{101}+/8DZ + +/[^\x{c4}]/DZ + +/[\x{100}]/8DZ + \x{100} + Z\x{100} + \x{100}Z + *** Failers + +/[\xff]/DZ8 + >\x{ff}< + +/[^\xff]/8DZ + +/\x{100}abc(xyz(?1))/8DZ + +/\777/8I + \x{1ff} + \777 + +/\x{100}+\x{200}/8DZ + +/\x{100}+X/8DZ + +/^[\QÄ€\E-\QÅ\E/BZ8 + +/X/8 + \x{d800} + \x{d800}\? + \x{da00} + \x{da00}\? + \x{dc00} + \x{dc00}\? + \x{de00} + \x{de00}\? + \x{dfff} + \x{dfff}\? + \x{110000} + \x{d800}\x{1234} + +/(*UTF16)\x{11234}/ + abcd\x{11234}pqr + +/(*UTF)\x{11234}/I + abcd\x{11234}pqr + +/(*UTF-32)\x{11234}/ + abcd\x{11234}pqr + +/(*CRLF)(*UTF16)(*BSR_UNICODE)a\Rb/I + +/(*CRLF)(*UTF32)(*BSR_UNICODE)a\Rb/I + +/\h/SI8 + ABC\x{09} + ABC\x{20} + ABC\x{a0} + ABC\x{1680} + ABC\x{180e} + ABC\x{2000} + ABC\x{202f} + ABC\x{205f} + ABC\x{3000} + +/\v/SI8 + ABC\x{0a} + ABC\x{0b} + ABC\x{0c} + ABC\x{0d} + ABC\x{85} + ABC\x{2028} + +/\h*A/SI8 + CDBABC + \x{2000}ABC + +/\R*A/SI8 + CDBABC + \x{2028}A + +/\v+A/SI8 + +/\s?xxx\s/8SI + +/\sxxx\s/I8ST1 + AB\x{85}xxx\x{a0}XYZ + AB\x{a0}xxx\x{85}XYZ + +/\S \S/I8ST1 + \x{a2} \x{84} + A Z + +/a+/8 + a\x{123}aa\>1 + a\x{123}aa\>2 + a\x{123}aa\>3 + a\x{123}aa\>4 + a\x{123}aa\>5 + a\x{123}aa\>6 + +/\x{1234}+/iS8I + +/\x{1234}+?/iS8I + +/\x{1234}++/iS8I + +/\x{1234}{2}/iS8I + +/[^\x{c4}]/8DZ + +/X+\x{200}/8DZ + +/\R/SI8 + +/-- Check bad offset --/ + +/a/8 + \x{10000}\>1 + \x{10000}ab\>1 + \x{10000}ab\>2 + \x{10000}ab\>3 + \x{10000}ab\>4 + \x{10000}ab\>5 + +/í¼€/8 + +/\w+\x{C4}/8BZ + a\x{C4}\x{C4} + +/\w+\x{C4}/8BZT1 + a\x{C4}\x{C4} + +/\W+\x{C4}/8BZ + !\x{C4} + +/\W+\x{C4}/8BZT1 + !\x{C4} + +/\W+\x{A1}/8BZ + !\x{A1} + +/\W+\x{A1}/8BZT1 + !\x{A1} + +/X\s+\x{A0}/8BZ + X\x20\x{A0}\x{A0} + +/X\s+\x{A0}/8BZT1 + X\x20\x{A0}\x{A0} + +/\S+\x{A0}/8BZ + X\x{A0}\x{A0} + +/\S+\x{A0}/8BZT1 + X\x{A0}\x{A0} + +/\x{a0}+\s!/8BZ + \x{a0}\x20! + +/\x{a0}+\s!/8BZT1 + \x{a0}\x20! + +/(*UTF)abc/9 + +/abc/89 + +/-- End of testinput18 --/ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput19 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput19 new file mode 100755 index 000000000..dfe8c7bef --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput19 @@ -0,0 +1,45 @@ +/-- This set of tests is for Unicode property support, relevant only to the + 16- and 32-bit library. --/ + +/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8iDZ + +/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8DZ + +/AB\x{1fb0}/8DZ + +/AB\x{1fb0}/8DZi + +/\x{401}\x{420}\x{421}\x{422}\x{423}\x{424}\x{425}\x{426}\x{427}\x{428}\x{429}\x{42a}\x{42b}\x{42c}\x{42d}\x{42e}\x{42f}/8iSI + \x{401}\x{420}\x{421}\x{422}\x{423}\x{424}\x{425}\x{426}\x{427}\x{428}\x{429}\x{42a}\x{42b}\x{42c}\x{42d}\x{42e}\x{42f} + \x{451}\x{440}\x{441}\x{442}\x{443}\x{444}\x{445}\x{446}\x{447}\x{448}\x{449}\x{44a}\x{44b}\x{44c}\x{44d}\x{44e}\x{44f} + +/[â±¥]/8iBZ + +/[^â±¥]/8iBZ + +/[[:blank:]]/WBZ + +/\x{212a}+/i8SI + KKkk\x{212a} + +/s+/i8SI + SSss\x{17f} + +/[\D]/8 + \x{1d7cf} + +/[\D\P{Nd}]/8 + \x{1d7cf} + +/[^\D]/8 + a9b + ** Failers + \x{1d7cf} + +/[^\D\P{Nd}]/8 + a9b + \x{1d7cf} + ** Failers + \x{10000} + +/-- End of testinput19 --/ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput2 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput2 new file mode 100755 index 000000000..53c9825ae --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput2 @@ -0,0 +1,4263 @@ +/-- This set of tests is not Perl-compatible. It checks on special features + of PCRE's API, error diagnostics, and the compiled code of some patterns. + It also checks the non-Perl syntax the PCRE supports (Python, .NET, + Oniguruma). Finally, there are some tests where PCRE and Perl differ, + either because PCRE can't be compatible, or there is a possible Perl + bug. + + NOTE: This is a non-UTF set of tests. When UTF support is needed, use + test 5, and if Unicode Property Support is needed, use test 7. --/ + +< forbid 8W + +/(a)b|/I + +/abc/I + abc + defabc + \Aabc + *** Failers + \Adefabc + ABC + +/^abc/I + abc + \Aabc + *** Failers + defabc + \Adefabc + +/a+bc/I + +/a*bc/I + +/a{3}bc/I + +/(abc|a+z)/I + +/^abc$/I + abc + *** Failers + def\nabc + +/ab\idef/X + +/(?X)ab\idef/X + +/x{5,4}/ + +/z{65536}/ + +/[abcd/ + +/(?X)[\B]/ + +/(?X)[\R]/ + +/(?X)[\X]/ + +/[\B]/BZ + +/[\R]/BZ + +/[\X]/BZ + +/[z-a]/ + +/^*/ + +/(abc/ + +/(?# abc/ + +/(?z)abc/ + +/.*b/I + +/.*?b/I + +/cat|dog|elephant/I + this sentence eventually mentions a cat + this sentences rambles on and on for a while and then reaches elephant + +/cat|dog|elephant/IS + this sentence eventually mentions a cat + this sentences rambles on and on for a while and then reaches elephant + +/cat|dog|elephant/IiS + this sentence eventually mentions a CAT cat + this sentences rambles on and on for a while to elephant ElePhant + +/a|[bcd]/IS + +/(a|[^\dZ])/IS + +/(a|b)*[\s]/IS + +/(ab\2)/ + +/{4,5}abc/ + +/(a)(b)(c)\2/I + abcb + \O0abcb + \O3abcb + \O6abcb + \O9abcb + \O12abcb + +/(a)bc|(a)(b)\2/I + abc + \O0abc + \O3abc + \O6abc + aba + \O0aba + \O3aba + \O6aba + \O9aba + \O12aba + +/abc$/IE + abc + *** Failers + abc\n + abc\ndef + +/(a)(b)(c)(d)(e)\6/ + +/the quick brown fox/I + the quick brown fox + this is a line with the quick brown fox + +/the quick brown fox/IA + the quick brown fox + *** Failers + this is a line with the quick brown fox + +/ab(?z)cd/ + +/^abc|def/I + abcdef + abcdef\B + +/.*((abc)$|(def))/I + defabc + \Zdefabc + +/)/ + +/a[]b/ + +/[^aeiou ]{3,}/I + co-processors, and for + +/<.*>/I + abcghinop + +/<.*?>/I + abcghinop + +/<.*>/IU + abcghinop + +/(?U)<.*>/I + abcghinop + +/<.*?>/IU + abcghinop + +/={3,}/IU + abc========def + +/(?U)={3,}?/I + abc========def + +/(?^abc)/Im + abc + def\nabc + *** Failers + defabc + +/(?<=ab(c+)d)ef/ + +/(?<=ab(?<=c+)d)ef/ + +/(?<=ab(c|de)f)g/ + +/The next three are in testinput2 because they have variable length branches/ + +/(?<=bullock|donkey)-cart/I + the bullock-cart + a donkey-cart race + *** Failers + cart + horse-and-cart + +/(?<=ab(?i)x|y|z)/I + +/(?>.*)(?<=(abcd)|(xyz))/I + alphabetabcd + endingxyz + +/(?<=ab(?i)x(?-i)y|(?i)z|b)ZZ/I + abxyZZ + abXyZZ + ZZZ + zZZ + bZZ + BZZ + *** Failers + ZZ + abXYZZ + zzz + bzz + +/(?[^()]+) # Either a sequence of non-brackets (no backtracking) + | # Or + (?R) # Recurse - i.e. nested bracketed string + )* # Zero or more contents + \) # Closing ) + /Ix + (abcd) + (abcd)xyz + xyz(abcd) + (ab(xy)cd)pqr + (ab(xycd)pqr + () abc () + 12(abcde(fsh)xyz(foo(bar))lmno)89 + *** Failers + abcd + abcd) + (abcd + +/\( ( (?>[^()]+) | (?R) )* \) /Ixg + (ab(xy)cd)pqr + 1(abcd)(x(y)z)pqr + +/\( (?: (?>[^()]+) | (?R) ) \) /Ix + (abcd) + (ab(xy)cd) + (a(b(c)d)e) + ((ab)) + *** Failers + () + +/\( (?: (?>[^()]+) | (?R) )? \) /Ix + () + 12(abcde(fsh)xyz(foo(bar))lmno)89 + +/\( ( (?>[^()]+) | (?R) )* \) /Ix + (ab(xy)cd) + +/\( ( ( (?>[^()]+) | (?R) )* ) \) /Ix + (ab(xy)cd) + +/\( (123)? ( ( (?>[^()]+) | (?R) )* ) \) /Ix + (ab(xy)cd) + (123ab(xy)cd) + +/\( ( (123)? ( (?>[^()]+) | (?R) )* ) \) /Ix + (ab(xy)cd) + (123ab(xy)cd) + +/\( (((((((((( ( (?>[^()]+) | (?R) )* )))))))))) \) /Ix + (ab(xy)cd) + +/\( ( ( (?>[^()<>]+) | ((?>[^()]+)) | (?R) )* ) \) /Ix + (abcd(xyz

qrs)123) + +/\( ( ( (?>[^()]+) | ((?R)) )* ) \) /Ix + (ab(cd)ef) + (ab(cd(ef)gh)ij) + +/^[[:alnum:]]/DZ + +/^[[:^alnum:]]/DZ + +/^[[:alpha:]]/DZ + +/^[[:^alpha:]]/DZ + +/[_[:alpha:]]/IS + +/^[[:ascii:]]/DZ + +/^[[:^ascii:]]/DZ + +/^[[:blank:]]/DZ + +/^[[:^blank:]]/DZ + +/[\n\x0b\x0c\x0d[:blank:]]/IS + +/^[[:cntrl:]]/DZ + +/^[[:digit:]]/DZ + +/^[[:graph:]]/DZ + +/^[[:lower:]]/DZ + +/^[[:print:]]/DZ + +/^[[:punct:]]/DZ + +/^[[:space:]]/DZ + +/^[[:upper:]]/DZ + +/^[[:xdigit:]]/DZ + +/^[[:word:]]/DZ + +/^[[:^cntrl:]]/DZ + +/^[12[:^digit:]]/DZ + +/^[[:^blank:]]/DZ + +/[01[:alpha:]%]/DZ + +/[[.ch.]]/I + +/[[=ch=]]/I + +/[[:rhubarb:]]/I + +/[[:upper:]]/Ii + A + a + +/[[:lower:]]/Ii + A + a + +/((?-i)[[:lower:]])[[:lower:]]/Ii + ab + aB + *** Failers + Ab + AB + +/[\200-\110]/I + +/^(?(0)f|b)oo/I + +/This one's here because of the large output vector needed/I + +/(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\w+)\s+(\270)/I + \O900 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 ABC ABC + +/This one's here because Perl does this differently and PCRE can't at present/I + +/(main(O)?)+/I + mainmain + mainOmain + +/These are all cases where Perl does it differently (nested captures)/I + +/^(a(b)?)+$/I + aba + +/^(aa(bb)?)+$/I + aabbaa + +/^(aa|aa(bb))+$/I + aabbaa + +/^(aa(bb)??)+$/I + aabbaa + +/^(?:aa(bb)?)+$/I + aabbaa + +/^(aa(b(b))?)+$/I + aabbaa + +/^(?:aa(b(b))?)+$/I + aabbaa + +/^(?:aa(b(?:b))?)+$/I + aabbaa + +/^(?:aa(bb(?:b))?)+$/I + aabbbaa + +/^(?:aa(b(?:bb))?)+$/I + aabbbaa + +/^(?:aa(?:b(b))?)+$/I + aabbaa + +/^(?:aa(?:b(bb))?)+$/I + aabbbaa + +/^(aa(b(bb))?)+$/I + aabbbaa + +/^(aa(bb(bb))?)+$/I + aabbbbaa + +/--------------------------------------------------------------------/I + +/#/IxDZ + +/a#/IxDZ + +/[\s]/DZ + +/[\S]/DZ + +/a(?i)b/DZ + ab + aB + *** Failers + AB + +/(a(?i)b)/DZ + ab + aB + *** Failers + AB + +/ (?i)abc/IxDZ + +/#this is a comment + (?i)abc/IxDZ + +/123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890/DZ + +/\Q123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890/DZ + +/\Q\E/DZ + \ + +/\Q\Ex/DZ + +/ \Q\E/DZ + +/a\Q\E/DZ + abc + bca + bac + +/a\Q\Eb/DZ + abc + +/\Q\Eabc/DZ + +/x*+\w/DZ + *** Failers + xxxxx + +/x?+/DZ + +/x++/DZ + +/x{1,3}+/BZO + +/x{1,3}+/BZOi + +/[^x]{1,3}+/BZO + +/[^x]{1,3}+/BZOi + +/(x)*+/DZ + +/^(\w++|\s++)*$/I + now is the time for all good men to come to the aid of the party + *** Failers + this is not a line with only words and spaces! + +/(\d++)(\w)/I + 12345a + *** Failers + 12345+ + +/a++b/I + aaab + +/(a++b)/I + aaab + +/(a++)b/I + aaab + +/([^()]++|\([^()]*\))+/I + ((abc(ade)ufh()()x + +/\(([^()]++|\([^()]+\))+\)/I + (abc) + (abc(def)xyz) + *** Failers + ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + +/(abc){1,3}+/DZ + +/a+?+/I + +/a{2,3}?+b/I + +/(?U)a+?+/I + +/a{2,3}?+b/IU + +/x(?U)a++b/DZ + xaaaab + +/(?U)xa++b/DZ + xaaaab + +/^((a+)(?U)([ab]+)(?-U)([bc]+)(\w*))/DZ + +/^x(?U)a+b/DZ + +/^x(?U)(a+)b/DZ + +/[.x.]/I + +/[=x=]/I + +/[:x:]/I + +/\l/I + +/\L/I + +/\N{name}/I + +/\u/I + +/\U/I + +/a{1,3}b/U + ab + +/[/I + +/[a-/I + +/[[:space:]/I + +/[\s]/IDZ + +/[[:space:]]/IDZ + +/[[:space:]abcde]/IDZ + +/< (?: (?(R) \d++ | [^<>]*+) | (?R)) * >/Ix + <> + + hij> + hij> + def> + + *** Failers + iV\;\?aPhFB\<\*vW\@QW\@sO9\}cfZA\-i\'w\%hKd6gt1UJP\,15_\#QY\$M\^Mss_U\/\]\&LK9\[5vQub\^w\[KDD\qmj\;2\}YWFdYx\.Ap\]hjCPTP\(n28k\+3\;o\&WXqs\/gOXdr\$\:r\'do0\;b4c\(f_Gr\=\"\\4\)\[01T7ajQJvL\$W\~mL_sS\/4h\:x\*\[ZN\=KLs\&L5zX\/\/\>it\,o\:aU\(\;Z\>pW\&T7oP\'2K\^E\:x9\'c\[\%z\-\,64JQ5AeH_G\#KijUKghQw\^\\vea3a\?kka_G\$8\#\`\*kynsxzBLru\'\]k_\[7FrVx\}\^\=\$blx\>s\-N\%j\;D\*aZDnsw\:YKZ\%Q\.Kne9\#hP\?\+b3\(SOvL\,\^\;\&u5\@\?5C5Bhb\=m\-vEh_L15Jl\]U\)0RP6\{q\%L\^_z5E\'Dw6X\b|IDZ + +|\$\<\.X\+ix\[d1b\!H\#\?vV0vrK\:ZH1\=2M\>iV\;\?aPhFB\<\*vW\@QW\@sO9\}cfZA\-i\'w\%hKd6gt1UJP\,15_\#QY\$M\^Mss_U\/\]\&LK9\[5vQub\^w\[KDD\qmj\;2\}YWFdYx\.Ap\]hjCPTP\(n28k\+3\;o\&WXqs\/gOXdr\$\:r\'do0\;b4c\(f_Gr\=\"\\4\)\[01T7ajQJvL\$W\~mL_sS\/4h\:x\*\[ZN\=KLs\&L5zX\/\/\>it\,o\:aU\(\;Z\>pW\&T7oP\'2K\^E\:x9\'c\[\%z\-\,64JQ5AeH_G\#KijUKghQw\^\\vea3a\?kka_G\$8\#\`\*kynsxzBLru\'\]k_\[7FrVx\}\^\=\$blx\>s\-N\%j\;D\*aZDnsw\:YKZ\%Q\.Kne9\#hP\?\+b3\(SOvL\,\^\;\&u5\@\?5C5Bhb\=m\-vEh_L15Jl\]U\)0RP6\{q\%L\^_z5E\'Dw6X\b|IDZ + +/(.*)\d+\1/I + +/(.*)\d+/I + +/(.*)\d+\1/Is + +/(.*)\d+/Is + +/(.*(xyz))\d+\2/I + +/((.*))\d+\1/I + abc123bc + +/a[b]/I + +/(?=a).*/I + +/(?=abc).xyz/IiI + +/(?=abc)(?i).xyz/I + +/(?=a)(?=b)/I + +/(?=.)a/I + +/((?=abcda)a)/I + +/((?=abcda)ab)/I + +/()a/I + +/(?(1)ab|ac)(.)/I + +/(?(1)abz|acz)(.)/I + +/(?(1)abz)(.)/I + +/(?(1)abz)(1)23/I + +/(a)+/I + +/(a){2,3}/I + +/(a)*/I + +/[a]/I + +/[ab]/I + +/[ab]/IS + +/[^a]/I + +/\d456/I + +/\d456/IS + +/a^b/I + +/^a/Im + abcde + xy\nabc + *** Failers + xyabc + +/c|abc/I + +/(?i)[ab]/IS + +/[ab](?i)cd/IS + +/abc(?C)def/I + abcdef + 1234abcdef + *** Failers + abcxyz + abcxyzf + +/abc(?C)de(?C1)f/I + 123abcdef + +/(?C1)\dabc(?C2)def/IS + 1234abcdef + *** Failers + abcdef + +/(?C1)\dabc(?C2)def/ISS + 1234abcdef + *** Failers + abcdef + +/(?C255)ab/I + +/(?C256)ab/I + +/(?Cab)xx/I + +/(?C12vr)x/I + +/abc(?C)def/I + *** Failers + \x83\x0\x61bcdef + +/(abc)(?C)de(?C1)f/I + 123abcdef + 123abcdef\C+ + 123abcdef\C- + *** Failers + 123abcdef\C!1 + +/(?C0)(abc(?C1))*/I + abcabcabc + abcabc\C!1!3 + *** Failers + abcabcabc\C!1!3 + +/(\d{3}(?C))*/I + 123\C+ + 123456\C+ + 123456789\C+ + +/((xyz)(?C)p|(?C1)xyzabc)/I + xyzabc\C+ + +/(X)((xyz)(?C)p|(?C1)xyzabc)/I + Xxyzabc\C+ + +/(?=(abc))(?C)abcdef/I + abcdef\C+ + +/(?!(abc)(?C1)d)(?C2)abcxyz/I + abcxyz\C+ + +/(?<=(abc)(?C))xyz/I + abcxyz\C+ + +/a(b+)(c*)(?C1)/I + abbbbbccc\C*1 + +/a(b+?)(c*?)(?C1)/I + abbbbbccc\C*1 + +/(?C)abc/I + +/(?C)^abc/I + +/(?C)a|b/IS + +/(?R)/I + +/(a|(?R))/I + +/(ab|(bc|(de|(?R))))/I + +/x(ab|(bc|(de|(?R))))/I + xab + xbc + xde + xxab + xxxab + *** Failers + xyab + +/(ab|(bc|(de|(?1))))/I + +/x(ab|(bc|(de|(?1)x)x)x)/I + +/^([^()]|\((?1)*\))*$/I + abc + a(b)c + a(b(c))d + *** Failers) + a(b(c)d + +/^>abc>([^()]|\((?1)*\))*abc>123abc>1(2)3abc>(1(2)3)]*+) | (?2)) * >))/Ix + <> + + hij> + hij> + def> + + *** Failers + b|c)d(?Pe)/DZ + abde + acde + +/(?:a(?Pc(?Pd)))(?Pa)/DZ + +/(?Pa)...(?P=a)bbb(?P>a)d/DZ + +/^\W*(?:(?P(?P.)\W*(?P>one)\W*(?P=two)|)|(?P(?P.)\W*(?P>three)\W*(?P=four)|\W*.\W*))\W*$/Ii + 1221 + Satan, oscillate my metallic sonatas! + A man, a plan, a canal: Panama! + Able was I ere I saw Elba. + *** Failers + The quick brown fox + +/((?(R)a|b))\1(?1)?/I + bb + bbaa + +/(.*)a/Is + +/(.*)a\1/Is + +/(.*)a(b)\2/Is + +/((.*)a|(.*)b)z/Is + +/((.*)a|(.*)b)z\1/Is + +/((.*)a|(.*)b)z\2/Is + +/((.*)a|(.*)b)z\3/Is + +/((.*)a|^(.*)b)z\3/Is + +/(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)a/Is + +/(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)a\31/Is + +/(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)a\32/Is + +/(a)(bc)/INDZ + abc + +/(?Pa)(bc)/INDZ + abc + +/(a)(?Pbc)/INDZ + +/(a+)*zz/I + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazzbbbbbb\M + aaaaaaaaaaaaaz\M + +/(aaa(?C1)bbb|ab)/I + aaabbb + aaabbb\C*0 + aaabbb\C*1 + aaabbb\C*-1 + +/ab(?Pcd)ef(?Pgh)/I + abcdefgh + abcdefgh\C1\Gtwo + abcdefgh\Cone\Ctwo + abcdefgh\Cthree + +/(?P)(?P)/DZ + +/(?P)(?P)/DZ + +/(?Pzz)(?Paa)/I + zzaa\CZ + zzaa\CA + +/(?Peks)(?Peccs)/I + +/(?Pabc(?Pdef)(?Pxyz))/I + +"\[((?P\d+)(,(?P>elem))*)\]"I + [10,20,30,5,5,4,4,2,43,23,4234] + *** Failers + [] + +"\[((?P\d+)(,(?P>elem))*)?\]"I + [10,20,30,5,5,4,4,2,43,23,4234] + [] + +/(a(b(?2)c))?/DZ + +/(a(b(?2)c))*/DZ + +/(a(b(?2)c)){0,2}/DZ + +/[ab]{1}+/DZ + +/((w\/|-|with)*(free|immediate)*.*?shipping\s*[!.-]*)/Ii + Baby Bjorn Active Carrier - With free SHIPPING!! + +/((w\/|-|with)*(free|immediate)*.*?shipping\s*[!.-]*)/IiS + Baby Bjorn Active Carrier - With free SHIPPING!! + +/a*.*b/ISDZ + +/(a|b)*.?c/ISDZ + +/abc(?C255)de(?C)f/DZ + +/abcde/ICDZ + abcde + abcdfe + +/a*b/ICDZS + ab + aaaab + aaaacb + +/a*b/ICDZSS + ab + aaaab + aaaacb + +/a+b/ICDZ + ab + aaaab + aaaacb + +/(abc|def)x/ICDZS + abcx + defx + ** Failers + abcdefzx + +/(abc|def)x/ICDZSS + abcx + defx + ** Failers + abcdefzx + +/(ab|cd){3,4}/IC + ababab + abcdabcd + abcdcdcdcdcd + +/([ab]{,4}c|xy)/ICDZS + Note: that { does NOT introduce a quantifier + +/([ab]{,4}c|xy)/ICDZSS + Note: that { does NOT introduce a quantifier + +/([ab]{1,4}c|xy){4,5}?123/ICDZ + aacaacaacaacaac123 + +/\b.*/I + ab cd\>1 + +/\b.*/Is + ab cd\>1 + +/(?!.bcd).*/I + Xbcd12345 + +/abcde/I + ab\P + abc\P + abcd\P + abcde\P + the quick brown abc\P + ** Failers\P + the quick brown abxyz fox\P + +"^(0?[1-9]|[12][0-9]|3[01])/(0?[1-9]|1[012])/(20)?\d\d$"I + 13/05/04\P + 13/5/2004\P + 02/05/09\P + 1\P + 1/2\P + 1/2/0\P + 1/2/04\P + 0\P + 02/\P + 02/0\P + 02/1\P + ** Failers\P + \P + 123\P + 33/4/04\P + 3/13/04\P + 0/1/2003\P + 0/\P + 02/0/\P + 02/13\P + +/0{0,2}ABC/I + +/\d{3,}ABC/I + +/\d*ABC/I + +/[abc]+DE/I + +/[abc]?123/I + 123\P + a\P + b\P + c\P + c12\P + c123\P + +/^(?:\d){3,5}X/I + 1\P + 123\P + 123X + 1234\P + 1234X + 12345\P + 12345X + *** Failers + 1X + 123456\P + +//S-KF>testsavedregex + +/abc/IS>testsavedregex +testsavedregex +testsavedregex +testsavedregex +testsavedregex +testsavedregex +testsavedregex +testsavedregex +(.)*~smgI + \J1024\n\n\nPartner der LCO\nde\nPartner der LINEAS Consulting\nGmbH\nLINEAS Consulting GmbH Hamburg\nPartnerfirmen\n30 days\nindex,follow\n\nja\n3\nPartner\n\n\nLCO\nLINEAS Consulting\n15.10.2003\n\n\n\n\nDie Partnerfirmen der LINEAS Consulting\nGmbH\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n + +/^a/IF + +/line\nbreak/I + this is a line\nbreak + line one\nthis is a line\nbreak in the second line + +/line\nbreak/If + this is a line\nbreak + ** Failers + line one\nthis is a line\nbreak in the second line + +/line\nbreak/Imf + this is a line\nbreak + ** Failers + line one\nthis is a line\nbreak in the second line + +/(?i)(?-i)AbCd/I + AbCd + ** Failers + abcd + +/a{11111111111111111111}/I + +/(){64294967295}/I + +/(){2,4294967295}/I + +"(?i:a)(?i:b)(?i:c)(?i:d)(?i:e)(?i:f)(?i:g)(?i:h)(?i:i)(?i:j)(k)(?i:l)A\1B"I + abcdefghijklAkB + +"(?Pa)(?Pb)(?Pc)(?Pd)(?Pe)(?Pf)(?Pg)(?Ph)(?Pi)(?Pj)(?Pk)(?Pl)A\11B"I + abcdefghijklAkB + +"(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)A\11B"I + abcdefghijklAkB + +"(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)"I + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + +"(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)"I + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + +/[^()]*(?:\((?R)\)[^()]*)*/I + (this(and)that + (this(and)that) + (this(and)that)stuff + +/[^()]*(?:\((?>(?R))\)[^()]*)*/I + (this(and)that + (this(and)that) + +/[^()]*(?:\((?R)\))*[^()]*/I + (this(and)that + (this(and)that) + +/(?:\((?R)\))*[^()]*/I + (this(and)that + (this(and)that) + ((this)) + +/(?:\((?R)\))|[^()]*/I + (this(and)that + (this(and)that) + (this) + ((this)) + +/\x{0000ff}/I + +/^((?Pa1)|(?Pa2)b)/I + +/^((?Pa1)|(?Pa2)b)/IJ + a1b\CA + a2b\CA + ** Failers + a1b\CZ\CA + +/(?|(?)(?)(?)|(?)(?)(?))/IJ + +/^(?Pa)(?Pb)/IJ + ab\CA + +/^(?Pa)(?Pb)|cd/IJ + ab\CA + cd\CA + +/^(?Pa)(?Pb)|cd(?Pef)(?Pgh)/IJ + cdefgh\CA + +/^((?Pa1)|(?Pa2)b)/IJ + a1b\GA + a2b\GA + ** Failers + a1b\GZ\GA + +/^(?Pa)(?Pb)/IJ + ab\GA + +/^(?Pa)(?Pb)|cd/IJ + ab\GA + cd\GA + +/^(?Pa)(?Pb)|cd(?Pef)(?Pgh)/IJ + cdefgh\GA + +/(?J)^((?Pa1)|(?Pa2)b)/I + a1b\CA + a2b\CA + +/^(?Pa) (?J:(?Pb)(?Pc)) (?Pd)/I + +/ In this next test, J is not set at the outer level; consequently it isn't +set in the pattern's options; consequently pcre_get_named_substring() produces +a random value. /Ix + +/^(?Pa) (?J:(?Pb)(?Pc)) (?Pd)/I + a bc d\CA\CB\CC + +/^(?Pa)?(?(A)a|b)/I + aabc + bc + ** Failers + abc + +/(?:(?(ZZ)a|b)(?PX))+/I + bXaX + +/(?:(?(2y)a|b)(X))+/I + +/(?:(?(ZA)a|b)(?PX))+/I + +/(?:(?(ZZ)a|b)(?(ZZ)a|b)(?PX))+/I + bbXaaX + +/(?:(?(ZZ)a|\(b\))\\(?PX))+/I + (b)\\Xa\\X + +/(?PX|Y))+/I + bXXaYYaY + bXYaXXaX + +/()()()()()()()()()(?:(?(A)(?P=A)a|b)(?PX|Y))+/I + bXXaYYaY + +/\s*,\s*/IS + \x0b,\x0b + \x0c,\x0d + +/^abc/Im + xyz\nabc + xyz\nabc\ + xyz\r\nabc\ + xyz\rabc\ + xyz\r\nabc\ + ** Failers + xyz\nabc\ + xyz\r\nabc\ + xyz\nabc\ + xyz\rabc\ + xyz\rabc\ + +/abc$/Im + xyzabc + xyzabc\n + xyzabc\npqr + xyzabc\r\ + xyzabc\rpqr\ + xyzabc\r\n\ + xyzabc\r\npqr\ + ** Failers + xyzabc\r + xyzabc\rpqr + xyzabc\r\n + xyzabc\r\npqr + +/^abc/Im + xyz\rabcdef + xyz\nabcdef\ + ** Failers + xyz\nabcdef + +/^abc/Im + xyz\nabcdef + xyz\rabcdef\ + ** Failers + xyz\rabcdef + +/^abc/Im + xyz\r\nabcdef + xyz\rabcdef\ + ** Failers + xyz\rabcdef + +/^abc/Im + +/abc/I + xyz\rabc\ + abc + +/.*/I + abc\ndef + abc\rdef + abc\r\ndef + \abc\ndef + \abc\rdef + \abc\r\ndef + \abc\ndef + \abc\rdef + \abc\r\ndef + +/\w+(.)(.)?def/Is + abc\ndef + abc\rdef + abc\r\ndef + ++((?:\s|//.*\\n|/[*](?:\\n|.)*?[*]/)*)+I + /* this is a C style comment */\M + +/(?P25[0-5]|2[0-4]\d|[01]?\d?\d)(?:\.(?P>B)){3}/I + +/()()()()()()()()()()()()()()()()()()()() + ()()()()()()()()()()()()()()()()()()()() + ()()()()()()()()()()()()()()()()()()()() + ()()()()()()()()()()()()()()()()()()()() + ()()()()()()()()()()()()()()()()()()()() + (.(.))/Ix + XY\O400 + +/(a*b|(?i:c*(?-i)d))/IS + +/()[ab]xyz/IS + +/(|)[ab]xyz/IS + +/(|c)[ab]xyz/IS + +/(|c?)[ab]xyz/IS + +/(d?|c?)[ab]xyz/IS + +/(d?|c)[ab]xyz/IS + +/^a*b\d/DZ + +/^a*+b\d/DZ + +/^a*?b\d/DZ + +/^a+A\d/DZ + aaaA5 + ** Failers + aaaa5 + +/^a*A\d/IiDZ + aaaA5 + aaaa5 + +/(a*|b*)[cd]/IS + +/(a+|b*)[cd]/IS + +/(a*|b+)[cd]/IS + +/(a+|b+)[cd]/IS + +/(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( + (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( + ((( + a + )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) + )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) + ))) +/Ix + large nest + +/a*\d/BZ + +/a*\D/BZ + +/0*\d/BZ + +/0*\D/BZ + +/a*\s/BZ + +/a*\S/BZ + +/ *\s/BZ + +/ *\S/BZ + +/a*\w/BZ + +/a*\W/BZ + +/=*\w/BZ + +/=*\W/BZ + +/\d*a/BZ + +/\d*2/BZ + +/\d*\d/BZ + +/\d*\D/BZ + +/\d*\s/BZ + +/\d*\S/BZ + +/\d*\w/BZ + +/\d*\W/BZ + +/\D*a/BZ + +/\D*2/BZ + +/\D*\d/BZ + +/\D*\D/BZ + +/\D*\s/BZ + +/\D*\S/BZ + +/\D*\w/BZ + +/\D*\W/BZ + +/\s*a/BZ + +/\s*2/BZ + +/\s*\d/BZ + +/\s*\D/BZ + +/\s*\s/BZ + +/\s*\S/BZ + +/\s*\w/BZ + +/\s*\W/BZ + +/\S*a/BZ + +/\S*2/BZ + +/\S*\d/BZ + +/\S*\D/BZ + +/\S*\s/BZ + +/\S*\S/BZ + +/\S*\w/BZ + +/\S*\W/BZ + +/\w*a/BZ + +/\w*2/BZ + +/\w*\d/BZ + +/\w*\D/BZ + +/\w*\s/BZ + +/\w*\S/BZ + +/\w*\w/BZ + +/\w*\W/BZ + +/\W*a/BZ + +/\W*2/BZ + +/\W*\d/BZ + +/\W*\D/BZ + +/\W*\s/BZ + +/\W*\S/BZ + +/\W*\w/BZ + +/\W*\W/BZ + +/[^a]+a/BZ + +/[^a]+a/BZi + +/[^a]+A/BZi + +/[^a]+b/BZ + +/[^a]+\d/BZ + +/a*[^a]/BZ + +/(?Px)(?Py)/I + xy\Cabc\Cxyz + +/(?x)(?'xyz'y)/I + xy\Cabc\Cxyz + +/(?x)(?'xyz>y)/I + +/(?P'abc'x)(?Py)/I + +/^(?:(?(ZZ)a|b)(?X))+/ + bXaX + bXbX + ** Failers + aXaX + aXbX + +/^(?P>abc)(?xxx)/ + +/^(?P>abc)(?x|y)/ + xx + xy + yy + yx + +/^(?P>abc)(?Px|y)/ + xx + xy + yy + yx + +/^((?(abc)a|b)(?x|y))+/ + bxay + bxby + ** Failers + axby + +/^(((?P=abc)|X)(?x|y))+/ + XxXxxx + XxXyyx + XxXyxx + ** Failers + x + +/^(?1)(abc)/ + abcabc + +/^(?:(?:\1|X)(a|b))+/ + Xaaa + Xaba + +/^[\E\Qa\E-\Qz\E]+/BZ + +/^[a\Q]bc\E]/BZ + +/^[a-\Q\E]/BZ + +/^(?P>abc)[()](?)/BZ + +/^((?(abc)y)[()](?Px))+/BZ + (xy)x + +/^(?P>abc)\Q()\E(?)/BZ + +/^(?P>abc)[a\Q(]\E(](?)/BZ + +/^(?P>abc) # this is (a comment) + (?)/BZx + +/^\W*(?:(?(?.)\W*(?&one)\W*\k|)|(?(?.)\W*(?&three)\W*\k'four'|\W*.\W*))\W*$/Ii + 1221 + Satan, oscillate my metallic sonatas! + A man, a plan, a canal: Panama! + Able was I ere I saw Elba. + *** Failers + The quick brown fox + +/(?=(\w+))\1:/I + abcd: + +/(?=(?'abc'\w+))\k:/I + abcd: + +/(?'abc'a|b)(?d|e)\k{2}/J + adaa + ** Failers + addd + adbb + +/(?'abc'a|b)(?d|e)(?&abc){2}/J + bdaa + bdab + ** Failers + bddd + +/(?( (?'B' abc (?(R) (?(R&A)1) (?(R&B)2) X | (?1) (?2) (?R) ))) /x + abcabc1Xabc2XabcXabcabc + +/(? (?'B' abc (?(R) (?(R&C)1) (?(R&B)2) X | (?1) (?2) (?R) ))) /x + +/^(?(DEFINE) abc | xyz ) /x + +/(?(DEFINE) abc) xyz/xI + +/(a|)*\d/ + \O0aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + \O0aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4 + +/^a.b/ + a\rb + a\nb\ + a\x85b\ + ** Failers + a\nb + a\nb\ + a\rb\ + a\rb\ + a\x85b\ + a\rb\ + +/^abc./mgx + abc1 \x0aabc2 \x0babc3xx \x0cabc4 \x0dabc5xx \x0d\x0aabc6 \x85abc7 JUNK + +/abc.$/mgx + abc1\x0a abc2\x0b abc3\x0c abc4\x0d abc5\x0d\x0a abc6\x85 abc7 abc9 + +/a/ + +/a/ + +/^a\Rb/ + a\nb + a\rb + a\r\nb + a\x0bb + a\x0cb + a\x85b + ** Failers + a\n\rb + +/^a\R*b/ + ab + a\nb + a\rb + a\r\nb + a\x0bb + a\x0cb + a\x85b + a\n\rb + a\n\r\x85\x0cb + +/^a\R+b/ + a\nb + a\rb + a\r\nb + a\x0bb + a\x0cb + a\x85b + a\n\rb + a\n\r\x85\x0cb + ** Failers + ab + +/^a\R{1,3}b/ + a\nb + a\n\rb + a\n\r\x85b + a\r\n\r\nb + a\r\n\r\n\r\nb + a\n\r\n\rb + a\n\n\r\nb + ** Failers + a\n\n\n\rb + a\r + +/^a[\R]b/ + aRb + ** Failers + a\nb + +/(?&abc)X(?P)/I + abcPXP123 + +/(?1)X(?P)/I + abcPXP123 + +/(?:a(?&abc)b)*(?x)/ + 123axbaxbaxbx456 + 123axbaxbaxb456 + +/(?:a(?&abc)b){1,5}(?x)/ + 123axbaxbaxbx456 + +/(?:a(?&abc)b){2,5}(?x)/ + 123axbaxbaxbx456 + +/(?:a(?&abc)b){2,}(?x)/ + 123axbaxbaxbx456 + +/(abc)(?i:(?1))/ + defabcabcxyz + DEFabcABCXYZ + +/(abc)(?:(?i)(?1))/ + defabcabcxyz + DEFabcABCXYZ + +/^(a)\g-2/ + +/^(a)\g/ + +/^(a)\g{0}/ + +/^(a)\g{3/ + +/^(a)\g{aa}/ + +/^a.b/ + a\rb + *** Failers + a\nb + +/.+foo/ + afoo + ** Failers + \r\nfoo + \nfoo + +/.+foo/ + afoo + \nfoo + ** Failers + \r\nfoo + +/.+foo/ + afoo + ** Failers + \nfoo + \r\nfoo + +/.+foo/s + afoo + \r\nfoo + \nfoo + +/^$/mg + abc\r\rxyz + abc\n\rxyz + ** Failers + abc\r\nxyz + +/(?m)^$/g+ + abc\r\n\r\n + +/(?m)^$|^\r\n/g+ + abc\r\n\r\n + +/(?m)$/g+ + abc\r\n\r\n + +/abc.$/mgx + abc1\x0a abc2\x0b abc3\x0c abc4\x0d abc5\x0d\x0a abc6\x85 abc9 + +/^X/m + XABC + ** Failers + XABC\B + +/(ab|c)(?-1)/BZ + abc + +/xy(?+1)(abc)/BZ + xyabcabc + ** Failers + xyabc + +/x(?-0)y/ + +/x(?-1)y/ + +/x(?+0)y/ + +/x(?+1)y/ + +/^(abc)?(?(-1)X|Y)/BZ + abcX + Y + ** Failers + abcY + +/^((?(+1)X|Y)(abc))+/BZ + YabcXabc + YabcXabcXabc + ** Failers + XabcXabc + +/(?(-1)a)/BZ + +/((?(-1)a))/BZ + +/((?(-2)a))/BZ + +/^(?(+1)X|Y)(.)/BZ + Y! + +/(?tom|bon)-\k{A}/ + tom-tom + bon-bon + ** Failers + tom-bon + +/\g{A/ + +/(?|(abc)|(xyz))/BZ + >abc< + >xyz< + +/(x)(?|(abc)|(xyz))(x)/BZ + xabcx + xxyzx + +/(x)(?|(abc)(pqr)|(xyz))(x)/BZ + xabcpqrx + xxyzx + +/\H++X/BZ + ** Failers + XXXX + +/\H+\hY/BZ + XXXX Y + +/\H+ Y/BZ + +/\h+A/BZ + +/\v*B/BZ + +/\V+\x0a/BZ + +/A+\h/BZ + +/ *\H/BZ + +/A*\v/BZ + +/\x0b*\V/BZ + +/\d+\h/BZ + +/\d*\v/BZ + +/S+\h\S+\v/BZ + +/\w{3,}\h\w+\v/BZ + +/\h+\d\h+\w\h+\S\h+\H/BZ + +/\v+\d\v+\w\v+\S\v+\V/BZ + +/\H+\h\H+\d/BZ + +/\V+\v\V+\w/BZ + +/\( (?: [^()]* | (?R) )* \)/x +\J1024(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(00)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0) + +/[\E]AAA/ + +/[\Q\E]AAA/ + +/[^\E]AAA/ + +/[^\Q\E]AAA/ + +/[\E^]AAA/ + +/[\Q\E^]AAA/ + +/A(*PRUNE)B(*SKIP)C(*THEN)D(*COMMIT)E(*F)F(*FAIL)G(?!)H(*ACCEPT)I/BZ + +/^a+(*FAIL)/C + aaaaaa + +/a+b?c+(*FAIL)/C + aaabccc + +/a+b?(*PRUNE)c+(*FAIL)/C + aaabccc + +/a+b?(*COMMIT)c+(*FAIL)/C + aaabccc + +/a+b?(*SKIP)c+(*FAIL)/C + aaabcccaaabccc + +/a+b?(*THEN)c+(*FAIL)/C + aaabccc + +/a(*MARK)b/ + +/(?i:A{1,}\6666666666)/ + +/\g6666666666/ + +/[\g6666666666]/BZ + +/(?1)\c[/ + +/.+A/ + \r\nA + +/\nA/ + \r\nA + +/[\r\n]A/ + \r\nA + +/(\r|\n)A/ + \r\nA + +/a(*CR)b/ + +/(*CR)a.b/ + a\nb + ** Failers + a\rb + +/(*CR)a.b/ + a\nb + ** Failers + a\rb + +/(*LF)a.b/ + a\rb + ** Failers + a\nb + +/(*CRLF)a.b/ + a\rb + a\nb + ** Failers + a\r\nb + +/(*ANYCRLF)a.b/ + ** Failers + a\rb + a\nb + a\r\nb + +/(*ANY)a.b/ + ** Failers + a\rb + a\nb + a\r\nb + a\x85b + +/(*ANY).*/g + abc\r\ndef + +/(*ANYCRLF).*/g + abc\r\ndef + +/(*CRLF).*/g + abc\r\ndef + +/a\Rb/I + a\rb + a\nb + a\r\nb + ** Failers + a\x85b + a\x0bb + +/a\Rb/I + a\rb + a\nb + a\r\nb + a\x85b + a\x0bb + ** Failers + a\x85b\ + a\x0bb\ + +/a\R?b/I + a\rb + a\nb + a\r\nb + ** Failers + a\x85b + a\x0bb + +/a\R?b/I + a\rb + a\nb + a\r\nb + a\x85b + a\x0bb + ** Failers + a\x85b\ + a\x0bb\ + +/a\R{2,4}b/I + a\r\n\nb + a\n\r\rb + a\r\n\r\n\r\n\r\nb + ** Failers + a\x85\85b + a\x0b\0bb + +/a\R{2,4}b/I + a\r\rb + a\n\n\nb + a\r\n\n\r\rb + a\x85\85b + a\x0b\0bb + ** Failers + a\r\r\r\r\rb + a\x85\85b\ + a\x0b\0bb\ + +/(*BSR_ANYCRLF)a\Rb/I + a\nb + a\rb + +/(*BSR_UNICODE)a\Rb/I + a\x85b + +/(*BSR_ANYCRLF)(*CRLF)a\Rb/I + a\nb + a\rb + +/(*CRLF)(*BSR_UNICODE)a\Rb/I + a\x85b + +/(*CRLF)(*BSR_ANYCRLF)(*CR)ab/I + +/(?)(?&)/ + +/(?)(?&a)/ + +/(?)(?&aaaaaaaaaaaaaaaaaaaaaaa)/ + +/(?+-a)/ + +/(?-+a)/ + +/(?(-1))/ + +/(?(+10))/ + +/(?(10))/ + +/(?(+2))()()/ + +/(?(2))()()/ + +/\k''/ + +/\k<>/ + +/\k{}/ + +/\k/ + +/\kabc/ + +/(?P=)/ + +/(?P>)/ + +/(?!\w)(?R)/ + +/(?=\w)(?R)/ + +/(?x|y){0}z/ + xzxx + yzyy + ** Failers + xxz + +/(\3)(\1)(a)/ + cat + +/(\3)(\1)(a)/ + cat + +/TA]/ + The ACTA] comes + +/TA]/ + The ACTA] comes + +/(?2)[]a()b](abc)/ + abcbabc + +/(?2)[^]a()b](abc)/ + abcbabc + +/(?1)[]a()b](abc)/ + abcbabc + ** Failers + abcXabc + +/(?1)[^]a()b](abc)/ + abcXabc + ** Failers + abcbabc + +/(?2)[]a()b](abc)(xyz)/ + xyzbabcxyz + +/(?&N)[]a(?)](?abc)/ + abc)](abc)/ + abc + ** Failers + ab + +/a[]+b/ + ** Failers + ab + +/a[]*+b/ + ** Failers + ab + +/a[^]b/ + aXb + a\nb + ** Failers + ab + +/a[^]+b/ + aXb + a\nX\nXb + ** Failers + ab + +/a(?!)b/BZ + +/(?!)?a/BZ + ab + +/a(*FAIL)+b/ + +/(abc|pqr|123){0}[xyz]/SI + +/(?(?=.*b)b|^)/CI + adc + abc + +/(?(?=b).*b|^d)/I + +/(?(?=.*b).*b|^d)/I + +/xyz/C + xyz + abcxyz + abcxyz\Y + ** Failers + abc + abc\Y + abcxypqr + abcxypqr\Y + +/(*NO_START_OPT)xyz/C + abcxyz + +/(*NO_AUTO_POSSESS)a+b/BZ + +/xyz/CY + abcxyz + +/^"((?(?=[a])[^"])|b)*"$/C + "ab" + +/^"((?(?=[a])[^"])|b)*"$/ + "ab" + +/^X(?5)(a)(?|(b)|(q))(c)(d)Y/ + XYabcdY + +/^X(?&N)(a)(?|(b)|(q))(c)(d)(?Y)/ + XYabcdY + +/Xa{2,4}b/ + X\P + Xa\P + Xaa\P + Xaaa\P + Xaaaa\P + +/Xa{2,4}?b/ + X\P + Xa\P + Xaa\P + Xaaa\P + Xaaaa\P + +/Xa{2,4}+b/ + X\P + Xa\P + Xaa\P + Xaaa\P + Xaaaa\P + +/X\d{2,4}b/ + X\P + X3\P + X33\P + X333\P + X3333\P + +/X\d{2,4}?b/ + X\P + X3\P + X33\P + X333\P + X3333\P + +/X\d{2,4}+b/ + X\P + X3\P + X33\P + X333\P + X3333\P + +/X\D{2,4}b/ + X\P + Xa\P + Xaa\P + Xaaa\P + Xaaaa\P + +/X\D{2,4}?b/ + X\P + Xa\P + Xaa\P + Xaaa\P + Xaaaa\P + +/X\D{2,4}+b/ + X\P + Xa\P + Xaa\P + Xaaa\P + Xaaaa\P + +/X[abc]{2,4}b/ + X\P + Xa\P + Xaa\P + Xaaa\P + Xaaaa\P + +/X[abc]{2,4}?b/ + X\P + Xa\P + Xaa\P + Xaaa\P + Xaaaa\P + +/X[abc]{2,4}+b/ + X\P + Xa\P + Xaa\P + Xaaa\P + Xaaaa\P + +/X[^a]{2,4}b/ + X\P + Xz\P + Xzz\P + Xzzz\P + Xzzzz\P + +/X[^a]{2,4}?b/ + X\P + Xz\P + Xzz\P + Xzzz\P + Xzzzz\P + +/X[^a]{2,4}+b/ + X\P + Xz\P + Xzz\P + Xzzz\P + Xzzzz\P + +/(Y)X\1{2,4}b/ + YX\P + YXY\P + YXYY\P + YXYYY\P + YXYYYY\P + +/(Y)X\1{2,4}?b/ + YX\P + YXY\P + YXYY\P + YXYYY\P + YXYYYY\P + +/(Y)X\1{2,4}+b/ + YX\P + YXY\P + YXYY\P + YXYYY\P + YXYYYY\P + +/\++\KZ|\d+X|9+Y/ + ++++123999\P + ++++123999Y\P + ++++Z1234\P + +/Z(*F)/ + Z\P + ZA\P + +/Z(?!)/ + Z\P + ZA\P + +/dog(sbody)?/ + dogs\P + dogs\P\P + +/dog(sbody)??/ + dogs\P + dogs\P\P + +/dog|dogsbody/ + dogs\P + dogs\P\P + +/dogsbody|dog/ + dogs\P + dogs\P\P + +/\bthe cat\b/ + the cat\P + the cat\P\P + +/abc/ + abc\P + abc\P\P + +/abc\K123/ + xyzabc123pqr + xyzabc12\P + xyzabc12\P\P + +/(?<=abc)123/ + xyzabc123pqr + xyzabc12\P + xyzabc12\P\P + +/\babc\b/ + +++abc+++ + +++ab\P + +++ab\P\P + +/(?&word)(?&element)(?(DEFINE)(?<[^m][^>]>[^<])(?\w*+))/BZ + +/(?&word)(?&element)(?(DEFINE)(?<[^\d][^>]>[^<])(?\w*+))/BZ + +/(ab)(x(y)z(cd(*ACCEPT)))pq/BZ + +/abc\K/+ + abcdef + abcdef\N\N + xyzabcdef\N\N + ** Failers + abcdef\N + xyzabcdef\N + +/^(?:(?=abc)|abc\K)/+ + abcdef + abcdef\N\N + ** Failers + abcdef\N + +/a?b?/+ + xyz + xyzabc + xyzabc\N + xyzabc\N\N + xyz\N\N + ** Failers + xyz\N + +/^a?b?/+ + xyz + xyzabc + ** Failers + xyzabc\N + xyzabc\N\N + xyz\N\N + xyz\N + +/^(?a|b\gc)/ + aaaa + bacxxx + bbaccxxx + bbbacccxx + +/^(?a|b\g'name'c)/ + aaaa + bacxxx + bbaccxxx + bbbacccxx + +/^(a|b\g<1>c)/ + aaaa + bacxxx + bbaccxxx + bbbacccxx + +/^(a|b\g'1'c)/ + aaaa + bacxxx + bbaccxxx + bbbacccxx + +/^(a|b\g'-1'c)/ + aaaa + bacxxx + bbaccxxx + bbbacccxx + +/(^(a|b\g<-1>c))/ + aaaa + bacxxx + bbaccxxx + bbbacccxx + +/(?-i:\g)(?i:(?a))/ + XaaX + XAAX + +/(?i:\g)(?-i:(?a))/ + XaaX + ** Failers + XAAX + +/(?-i:\g<+1>)(?i:(a))/ + XaaX + XAAX + +/(?=(?(?#simplesyntax)\$(?[a-zA-Z_\x{7f}-\x{ff}][a-zA-Z0-9_\x{7f}-\x{ff}]*)(?:\[(?[a-zA-Z0-9_\x{7f}-\x{ff}]+|\$\g)\]|->\g(\(.*?\))?)?|(?#simple syntax withbraces)\$\{(?:\g(?\[(?:\g|'(?:\\.|[^'\\])*'|"(?:\g|\\.|[^"\\])*")\])?|\g|\$\{\g\})\}|(?#complexsyntax)\{(?\$(?\g(\g*|\(.*?\))?)(?:->\g)*|\$\g|\$\{\g\})\}))\{/ + +/(?a|b|c)\g*/ + abc + accccbbb + +/^X(?7)(a)(?|(b)|(q)(r)(s))(c)(d)(Y)/ + XYabcdY + +/(?<=b(?1)|zzz)(a)/ + xbaax + xzzzax + +/(a)(?<=b\1)/ + +/(a)(?<=b+(?1))/ + +/(a+)(?<=b(?1))/ + +/(a(?<=b(?1)))/ + +/(?<=b(?1))xyz/ + +/(?<=b(?1))xyz(b+)pqrstuvew/ + +/(a|bc)\1/SI + +/(a|bc)\1{2,3}/SI + +/(a|bc)(?1)/SI + +/(a|b\1)(a|b\1)/SI + +/(a|b\1){2}/SI + +/(a|bbbb\1)(a|bbbb\1)/SI + +/(a|bbbb\1){2}/SI + +/^From +([^ ]+) +[a-zA-Z][a-zA-Z][a-zA-Z] +[a-zA-Z][a-zA-Z][a-zA-Z] +[0-9]?[0-9] +[0-9][0-9]:[0-9][0-9]/SI + +/]{0,})>]{0,})>([\d]{0,}\.)(.*)((
([\w\W\s\d][^<>]{0,})|[\s]{0,}))<\/a><\/TD>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD><\/TR>/isIS + +"(?>.*/)foo"SI + +/(?(?=[^a-z]+[a-z]) \d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} ) /xSI + +/(?:(?:(?:(?:(?:(?:(?:(?:(?:(a|b|c))))))))))/iSI + +/(?:c|d)(?:)(?:aaaaaaaa(?:)(?:bbbbbbbb)(?:bbbbbbbb(?:))(?:bbbbbbbb(?:)(?:bbbbbbbb)))/SI + +/A)|(?
B))/I + AB\Ca + BA\Ca + +/(?|(?A)|(?B))/ + +/(?:a(? (?')|(?")) | + b(? (?')|(?")) ) + (?('quote')[a-z]+|[0-9]+)/JIx + a"aaaaa + b"aaaaa + ** Failers + b"11111 + a"11111 + +/^(?|(a)(b)(c)(?d)|(?e)) (?('D')X|Y)/JDZx + abcdX + eX + ** Failers + abcdY + ey + +/(?a) (b)(c) (?d (?(R&A)$ | (?4)) )/JDZx + abcdd + ** Failers + abcdde + +/abcd*/ + xxxxabcd\P + xxxxabcd\P\P + +/abcd*/i + xxxxabcd\P + xxxxabcd\P\P + XXXXABCD\P + XXXXABCD\P\P + +/abc\d*/ + xxxxabc1\P + xxxxabc1\P\P + +/(a)bc\1*/ + xxxxabca\P + xxxxabca\P\P + +/abc[de]*/ + xxxxabcde\P + xxxxabcde\P\P + +/-- This is not in the Perl-compatible test because Perl seems currently to be + broken and not behaving as specified in that it *does* bumpalong after + hitting (*COMMIT). --/ + +/(?1)(A(*COMMIT)|B)D/ + ABD + XABD + BAD + ABXABD + ** Failers + ABX + BAXBAD + +/(\3)(\1)(a)/ + cat + +/(\3)(\1)(a)/SI + cat + +/(\3)(\1)(a)/SI + cat + +/i(?(DEFINE)(?a))/SI + i + +/()i(?(1)a)/SI + ia + +/(?i)a(?-i)b|c/BZ + XabX + XAbX + CcC + ** Failers + XABX + +/(?i)a(?s)b|c/BZ + +/(?i)a(?s-i)b|c/BZ + +/^(ab(c\1)d|x){2}$/BZ + xabcxd + +/^(?&t)*+(?(DEFINE)(?.))$/BZ + +/^(?&t)*(?(DEFINE)(?.))$/BZ + +/ -- This one is here because Perl gives the match as "b" rather than "ab". I + believe this to be a Perl bug. --/ + +/(?>a\Kb)z|(ab)/ + ab + +/(?P(?P0|)|(?P>L2)(?P>L1))/ + +/abc(*MARK:)pqr/ + +/abc(*:)pqr/ + +/abc(*FAIL:123)xyz/ + +/--- This should, and does, fail. In Perl, it does not, which I think is a + bug because replacing the B in the pattern by (B|D) does make it fail. ---/ + +/A(*COMMIT)B/+K + ACABX + +/--- These should be different, but in Perl they are not, which I think + is a bug in Perl. ---/ + +/A(*THEN)B|A(*THEN)C/K + AC + +/A(*PRUNE)B|A(*PRUNE)C/K + AC + +/--- Mark names can be duplicated. Perl doesn't give a mark for this one, +though PCRE does. ---/ + +/^A(*:A)B|^X(*:A)Y/K + ** Failers + XAQQ + +/--- COMMIT at the start of a pattern should be the same as an anchor. Perl +optimizations defeat this. So does the PCRE optimization unless we disable it +with \Y. ---/ + +/(*COMMIT)ABC/ + ABCDEFG + ** Failers + DEFGABC\Y + +/^(ab (c+(*THEN)cd) | xyz)/x + abcccd + +/^(ab (c+(*PRUNE)cd) | xyz)/x + abcccd + +/^(ab (c+(*FAIL)cd) | xyz)/x + abcccd + +/--- Perl gets some of these wrong ---/ + +/(?>.(*ACCEPT))*?5/ + abcde + +/(.(*ACCEPT))*?5/ + abcde + +/(.(*ACCEPT))5/ + abcde + +/(.(*ACCEPT))*5/ + abcde + +/A\NB./BZ + ACBD + *** Failers + A\nB + ACB\n + +/A\NB./sBZ + ACBD + ACB\n + *** Failers + A\nB + +/A\NB/ + A\nB + A\rB + ** Failers + A\r\nB + +/\R+b/BZ + +/\R+\n/BZ + +/\R+\d/BZ + +/\d*\R/BZ + +/\s*\R/BZ + \x20\x0a + \x20\x0d + \x20\x0d\x0a + +/\S*\R/BZ + a\x0a + +/X\h*\R/BZ + X\x20\x0a + +/X\H*\R/BZ + X\x0d\x0a + +/X\H+\R/BZ + X\x0d\x0a + +/X\H++\R/BZ + X\x0d\x0a + +/(?<=abc)def/ + abc\P\P + +/abc$/ + abc + abc\P + abc\P\P + +/abc$/m + abc + abc\n + abc\P\P + abc\n\P\P + abc\P + abc\n\P + +/abc\z/ + abc + abc\P + abc\P\P + +/abc\Z/ + abc + abc\P + abc\P\P + +/abc\b/ + abc + abc\P + abc\P\P + +/abc\B/ + abc + abc\P + abc\P\P + +/.+/ + abc\>0 + abc\>1 + abc\>2 + abc\>3 + abc\>4 + abc\>-4 + +/^\cÄ£/ + +/(?P(?P=abn)xxx)/BZ + +/(a\1z)/BZ + +/(?P(?P=abn)(?(?P=axn)xxx)/BZ + +/(?P(?P=axn)xxx)(?yy)/BZ + +/-- These tests are here because Perl gets the first one wrong. --/ + +/(\R*)(.)/s + \r\n + \r\r\n\n\r + \r\r\n\n\r\n + +/(\R)*(.)/s + \r\n + \r\r\n\n\r + \r\r\n\n\r\n + +/((?>\r\n|\n|\x0b|\f|\r|\x85)*)(.)/s + \r\n + \r\r\n\n\r + \r\r\n\n\r\n + +/-- --/ + +/^abc$/BZ + +/^abc$/BZm + +/^(a)*+(\w)/S + aaaaX + ** Failers + aaaa + +/^(?:a)*+(\w)/S + aaaaX + ** Failers + aaaa + +/(a)++1234/SDZ + +/([abc])++1234/SI + +/(?<=(abc)+)X/ + +/(^ab)/I + +/(^ab)++/I + +/(^ab|^)+/I + +/(^ab|^)++/I + +/(?:^ab)/I + +/(?:^ab)++/I + +/(?:^ab|^)+/I + +/(?:^ab|^)++/I + +/(.*ab)/I + +/(.*ab)++/I + +/(.*ab|.*)+/I + +/(.*ab|.*)++/I + +/(?:.*ab)/I + +/(?:.*ab)++/I + +/(?:.*ab|.*)+/I + +/(?:.*ab|.*)++/I + +/(?=a)[bcd]/I + +/((?=a))[bcd]/I + +/((?=a))+[bcd]/I + +/((?=a))++[bcd]/I + +/(?=a+)[bcd]/iI + +/(?=a+?)[bcd]/iI + +/(?=a++)[bcd]/iI + +/(?=a{3})[bcd]/iI + +/(abc)\1+/S + +/-- Perl doesn't get these right IMO (the 3rd is PCRE-specific) --/ + +/(?1)(?:(b(*ACCEPT))){0}/ + b + +/(?1)(?:(b(*ACCEPT))){0}c/ + bc + ** Failers + b + +/(?1)(?:((*ACCEPT))){0}c/ + c + c\N + +/^.*?(?(?=a)a|b(*THEN)c)/ + ba + +/^.*?(?(?=a)a|bc)/ + ba + +/^.*?(?(?=a)a(*THEN)b|c)/ + ac + +/^.*?(?(?=a)a(*THEN)b)c/ + ac + +/^.*?(a(*THEN)b)c/ + aabc + +/^.*? (?1) c (?(DEFINE)(a(*THEN)b))/x + aabc + +/^.*?(a(*THEN)b|z)c/ + aabc + +/^.*?(z|a(*THEN)b)c/ + aabc + +/-- --/ + +/-- These studied versions are here because they are not Perl-compatible; the + studying means the mark is not seen. --/ + +/(*MARK:A)(*SKIP:B)(C|X)/KS + C + D + +/(*:A)A+(*SKIP:A)(B|Z)/KS + AAAC + +/-- --/ + +"(?=a*(*ACCEPT)b)c" + c + c\N + +/(?1)c(?(DEFINE)((*ACCEPT)b))/ + c + c\N + +/(?>(*ACCEPT)b)c/ + c + c\N + +/(?:(?>(a)))+a%/++ + %aa% + +/(a)b|ac/++SS + ac\O3 + +/(a)(b)x|abc/++ + abc\O6 + +/(a)bc|(a)(b)\2/ + \O3abc + \O4abc + +/(?(DEFINE)(a(?2)|b)(b(?1)|a))(?:(?1)|(?2))/SI + +/(a(?2)|b)(b(?1)|a)(?:(?1)|(?2))/SI + +/(a(?2)|b)(b(?1)|a)(?1)(?2)/SI + +/(abc)(?1)/SI + +/^(?>a)++/ + aa\M + aaaaaaaaa\M + +/(a)(?1)++/ + aa\M + aaaaaaaaa\M + +/(?:(foo)|(bar)|(baz))X/SS= + bazfooX + foobazbarX + barfooX + bazX + foobarbazX + bazfooX\O0 + bazfooX\O2 + bazfooX\O4 + bazfooX\O6 + bazfooX\O8 + bazfooX\O10 + +/(?=abc){3}abc/BZ + +/(?=abc)+abc/BZ + +/(?=abc)++abc/BZ + +/(?=abc){0}xyz/BZ + +/(?=(a))?./BZ + +/(?=(a))??./BZ + +/^(?=(a)){0}b(?1)/BZ + +/(?(DEFINE)(a))?b(?1)/BZ + +/^(?=(?1))?[az]([abc])d/BZ + +/^(?!a){0}\w+/BZ + +/(?<=(abc))?xyz/BZ + +/[:a[:abc]b:]/BZ + +/((?2))((?1))/SS + abc + +/((?(R2)a+|(?1)b))/SS + aaaabcde + +/(?(R)a*(?1)|((?R))b)/SS + aaaabcde + +/(a+|(?R)b)/ + +/^(a(*:A)(d|e(*:B))z|aeq)/C + adz + aez + aeqwerty + +/.(*F)/ + \P\Pabc + +/\btype\b\W*?\btext\b\W*?\bjavascript\b/IS + +/\btype\b\W*?\btext\b\W*?\bjavascript\b|\burl\b\W*?\bshell:|a+)(?>(z+))\w/BZ + aaaazzzzb + ** Failers + aazz + +/(.)(\1|a(?2))/ + bab + +/\1|(.)(?R)\1/ + cbbbc + +/(.)((?(1)c|a)|a(?2))/ + baa + +/(?P(?P=abn)xxx)/BZ + +/(a\1z)/BZ + +/^(?>a+)(?>b+)(?>c+)(?>d+)(?>e+)/ + \Maabbccddee + +/^(?>(a+))(?>(b+))(?>(c+))(?>(d+))(?>(e+))/ + \Maabbccddee + +/^(?>(a+))(?>b+)(?>(c+))(?>d+)(?>(e+))/ + \Maabbccddee + +/^a\x41z/ + aAz + *** Failers + ax41z + +/^a[m\x41]z/ + aAz + +/^a\x1z/ + ax1z + +/^a\u0041z/ + aAz + *** Failers + au0041z + +/^a[m\u0041]z/ + aAz + +/^a\u041z/ + au041z + *** Failers + aAz + +/^a\U0041z/ + aU0041z + *** Failers + aAz + +/(?(?=c)c|d)++Y/BZ + +/(?(?=c)c|d)*+Y/BZ + +/a[\NB]c/ + aNc + +/a[B-\Nc]/ + +/a[B\Nc]/ + +/(a)(?2){0,1999}?(b)/ + +/(a)(?(DEFINE)(b))(?2){0,1999}?(?2)/ + +/--- This test, with something more complicated than individual letters, causes +different behaviour in Perl. Perhaps it disables some optimization; no tag is +passed back for the failures, whereas in PCRE there is a tag. ---/ + +/(A|P)(*:A)(B|P) | (X|P)(X|P)(*:B)(Y|P)/xK + AABC + XXYZ + ** Failers + XAQQ + XAQQXZZ + AXQQQ + AXXQQQ + +/-- Perl doesn't give marks for these, though it does if the alternatives are +replaced by single letters. --/ + +/(b|q)(*:m)f|a(*:n)w/K + aw + ** Failers + abc + +/(q|b)(*:m)f|a(*:n)w/K + aw + ** Failers + abc + +/-- After a partial match, the behaviour is as for a failure. --/ + +/^a(*:X)bcde/K + abc\P + +/-- These are here because Perl doesn't return a mark, except for the first --/ + +/(?=(*:x))(q|)/K+ + abc + +/(?=(*:x))((*:y)q|)/K+ + abc + +/(?=(*:x))(?:(*:y)q|)/K+ + abc + +/(?=(*:x))(?>(*:y)q|)/K+ + abc + +/(?=a(*:x))(?!a(*:y)c)/K+ + ab + +/(?=a(*:x))(?=a(*:y)c|)/K+ + ab + +/(..)\1/ + ab\P + aba\P + abab\P + +/(..)\1/i + ab\P + abA\P + aBAb\P + +/(..)\1{2,}/ + ab\P + aba\P + abab\P + ababa\P + ababab\P + ababab\P\P + abababa\P + abababa\P\P + +/(..)\1{2,}/i + ab\P + aBa\P + aBAb\P + AbaBA\P + abABAb\P + aBAbaB\P\P + abABabA\P + abaBABa\P\P + +/(..)\1{2,}?x/i + ab\P + abA\P + aBAb\P + abaBA\P + abAbaB\P + abaBabA\P + abAbABaBx\P + +/^(..)\1/ + aba\P + +/^(..)\1{2,3}x/ + aba\P + ababa\P + ababa\P\P + abababx + ababababx + +/^(..)\1{2,3}?x/ + aba\P + ababa\P + ababa\P\P + abababx + ababababx + +/^(..)(\1{2,3})ab/ + abababab + +/^\R/ + \r\P + \r\P\P + +/^\R{2,3}x/ + \r\P + \r\P\P + \r\r\P + \r\r\P\P + \r\r\r\P + \r\r\r\P\P + \r\rx + \r\r\rx + +/^\R{2,3}?x/ + \r\P + \r\P\P + \r\r\P + \r\r\P\P + \r\r\r\P + \r\r\r\P\P + \r\rx + \r\r\rx + +/^\R?x/ + \r\P + \r\P\P + x + \rx + +/^\R+x/ + \r\P + \r\P\P + \r\n\P + \r\n\P\P + \rx + +/^a$/ + a\r\P + a\r\P\P + +/^a$/m + a\r\P + a\r\P\P + +/^(a$|a\r)/ + a\r\P + a\r\P\P + +/^(a$|a\r)/m + a\r\P + a\r\P\P + +/./ + \r\P + \r\P\P + +/.{2,3}/ + \r\P + \r\P\P + \r\r\P + \r\r\P\P + \r\r\r\P + \r\r\r\P\P + +/.{2,3}?/ + \r\P + \r\P\P + \r\r\P + \r\r\P\P + \r\r\r\P + \r\r\r\P\P + +"AB(C(D))(E(F))?(?(?=\2)(?=\4))" + ABCDGHI\O03 + +/-- These are all run as real matches in test 1; here we are just checking the +settings of the anchored and startline bits. --/ + +/(?>.*?a)(?<=ba)/I + +/(?:.*?a)(?<=ba)/I + +/.*?a(*PRUNE)b/I + +/.*?a(*PRUNE)b/sI + +/^a(*PRUNE)b/sI + +/.*?a(*SKIP)b/I + +/(?>.*?a)b/sI + +/(?>.*?a)b/I + +/(?>^a)b/sI + +/(?>.*?)(?<=(abcd)|(wxyz))/I + +/(?>.*)(?<=(abcd)|(wxyz))/I + +"(?>.*)foo"I + +"(?>.*?)foo"I + +/(?>^abc)/mI + +/(?>.*abc)/mI + +/(?:.*abc)/mI + +/-- Check PCRE_STUDY_EXTRA_NEEDED --/ + +/.?/S-I + +/.?/S!I + +/(?:(a)+(?C1)bb|aa(?C2)b)/ + aab\C+ + +/(?:(a)++(?C1)bb|aa(?C2)b)/ + aab\C+ + +/(?:(?>(a))(?C1)bb|aa(?C2)b)/ + aab\C+ + +/(?:(?1)(?C1)x|ab(?C2))((a)){0}/ + aab\C+ + +/(?1)(?C1)((a)(?C2)){0}/ + aab\C+ + +/(?:(a)+(?C1)bb|aa(?C2)b)++/ + aab\C+ + aab\C+\O2 + +/(ab)x|ab/ + ab\O3 + ab\O2 + +/(ab)/ + ab\O3 + ab\O2 + +/(?<=123)(*MARK:xx)abc/K + xxxx123a\P\P + xxxx123a\P + +/123\Kabc/ + xxxx123a\P\P + xxxx123a\P + +/^(?(?=a)aa|bb)/C + bb + +/(?C1)^(?C2)(?(?C99)(?=(?C3)a(?C4))(?C5)a(?C6)a(?C7)|(?C8)b(?C9)b(?C10))(?C11)/ + bb + +/-- Perl seems to have a bug with this one --/ + +/aaaaa(*COMMIT)(*PRUNE)b|a+c/ + aaaaaac + +/-- Here are some that Perl treats differently because of the way it handles +backtracking verbs. --/ + + /(?!a(*COMMIT)b)ac|ad/ + ac + ad + +/^(?!a(*THEN)b|ac)../ + ac + ad + +/^(?=a(*THEN)b|ac)/ + ac + +/\A.*?(?:a|b(*THEN)c)/ + ba + +/\A.*?(?:a|b(*THEN)c)++/ + ba + +/\A.*?(?:a|b(*THEN)c|d)/ + ba + +/(?:(a(*MARK:X)a+(*SKIP:X)b)){0}(?:(?1)|aac)/ + aac + +/\A.*?(a|b(*THEN)c)/ + ba + +/^(A(*THEN)B|A(*THEN)D)/ + AD + +/(?!b(*THEN)a)bn|bnn/ + bnn + +/(?(?=b(*SKIP)a)bn|bnn)/ + bnn + +/(?=b(*THEN)a|)bn|bnn/ + bnn + +/-------------------------/ + +/(*LIMIT_MATCH=12bc)abc/ + +/(*LIMIT_MATCH=4294967290)abc/ + +/(*LIMIT_RECURSION=4294967280)abc/I + +/(a+)*zz/ + aaaaaaaaaaaaaz + aaaaaaaaaaaaaz\q3000 + +/(a+)*zz/S- + aaaaaaaaaaaaaz\Q10 + +/(*LIMIT_MATCH=3000)(a+)*zz/I + aaaaaaaaaaaaaz + aaaaaaaaaaaaaz\q60000 + +/(*LIMIT_MATCH=60000)(*LIMIT_MATCH=3000)(a+)*zz/I + aaaaaaaaaaaaaz + +/(*LIMIT_MATCH=60000)(a+)*zz/I + aaaaaaaaaaaaaz + aaaaaaaaaaaaaz\q3000 + +/(*LIMIT_RECURSION=10)(a+)*zz/IS- + aaaaaaaaaaaaaz + aaaaaaaaaaaaaz\Q1000 + +/(*LIMIT_RECURSION=10)(*LIMIT_RECURSION=1000)(a+)*zz/IS- + aaaaaaaaaaaaaz + +/(*LIMIT_RECURSION=1000)(a+)*zz/IS- + aaaaaaaaaaaaaz + aaaaaaaaaaaaaz\Q10 + +/-- This test causes a segfault with Perl 5.18.0 --/ + +/^(?=(a)){0}b(?1)/ + backgammon + +/(?|(?f)|(?b))/JI + +/(?abc)(?z)\k()/JDZS + +/a*[bcd]/BZ + +/[bcd]*a/BZ + +/-- A complete set of tests for auto-possessification of character types --/ + +/\D+\D \D+\d \D+\S \D+\s \D+\W \D+\w \D+. \D+\C \D+\R \D+\H \D+\h \D+\V \D+\v \D+\Z \D+\z \D+$/BZx + +/\d+\D \d+\d \d+\S \d+\s \d+\W \d+\w \d+. \d+\C \d+\R \d+\H \d+\h \d+\V \d+\v \d+\Z \d+\z \d+$/BZx + +/\S+\D \S+\d \S+\S \S+\s \S+\W \S+\w \S+. \S+\C \S+\R \S+\H \S+\h \S+\V \S+\v \S+\Z \S+\z \S+$/BZx + +/\s+\D \s+\d \s+\S \s+\s \s+\W \s+\w \s+. \s+\C \s+\R \s+\H \s+\h \s+\V \s+\v \s+\Z \s+\z \s+$/BZx + +/\W+\D \W+\d \W+\S \W+\s \W+\W \W+\w \W+. \W+\C \W+\R \W+\H \W+\h \W+\V \W+\v \W+\Z \W+\z \W+$/BZx + +/\w+\D \w+\d \w+\S \w+\s \w+\W \w+\w \w+. \w+\C \w+\R \w+\H \w+\h \w+\V \w+\v \w+\Z \w+\z \w+$/BZx + +/\C+\D \C+\d \C+\S \C+\s \C+\W \C+\w \C+. \C+\C \C+\R \C+\H \C+\h \C+\V \C+\v \C+\Z \C+\z \C+$/BZx + +/\R+\D \R+\d \R+\S \R+\s \R+\W \R+\w \R+. \R+\C \R+\R \R+\H \R+\h \R+\V \R+\v \R+\Z \R+\z \R+$/BZx + +/\H+\D \H+\d \H+\S \H+\s \H+\W \H+\w \H+. \H+\C \H+\R \H+\H \H+\h \H+\V \H+\v \H+\Z \H+\z \H+$/BZx + +/\h+\D \h+\d \h+\S \h+\s \h+\W \h+\w \h+. \h+\C \h+\R \h+\H \h+\h \h+\V \h+\v \h+\Z \h+\z \h+$/BZx + +/\V+\D \V+\d \V+\S \V+\s \V+\W \V+\w \V+. \V+\C \V+\R \V+\H \V+\h \V+\V \V+\v \V+\Z \V+\z \V+$/BZx + +/\v+\D \v+\d \v+\S \v+\s \v+\W \v+\w \v+. \v+\C \v+\R \v+\H \v+\h \v+\V \v+\v \v+\Z \v+\z \v+$/BZx + +/ a+\D a+\d a+\S a+\s a+\W a+\w a+. a+\C a+\R a+\H a+\h a+\V a+\v a+\Z a+\z a+$/BZx + +/\n+\D \n+\d \n+\S \n+\s \n+\W \n+\w \n+. \n+\C \n+\R \n+\H \n+\h \n+\V \n+\v \n+\Z \n+\z \n+$/BZx + +/ .+\D .+\d .+\S .+\s .+\W .+\w .+. .+\C .+\R .+\H .+\h .+\V .+\v .+\Z .+\z .+$/BZx + +/ .+\D .+\d .+\S .+\s .+\W .+\w .+. .+\C .+\R .+\H .+\h .+\V .+\v .+\Z .+\z .+$/BZxs + +/\D+$ \d+$ \S+$ \s+$ \W+$ \w+$ \C+$ \R+$ \H+$ \h+$ \V+$ \v+$ a+$ \n+$ .+$ .+$/BZxm + +/(?=a+)a(a+)++a/BZ + +/a+(bb|cc)a+(?:bb|cc)a+(?>bb|cc)a+(?:bb|cc)+a+(aa)a+(?:bb|aa)/BZ + +/a+(bb|cc)?#a+(?:bb|cc)??#a+(?:bb|cc)?+#a+(?:bb|cc)*#a+(bb|cc)?a#a+(?:aa)?/BZ + +/a+(?:bb)?a#a+(?:|||)#a+(?:|b)a#a+(?:|||)?a/BZ + +/[ab]*/BZ + aaaa + +/[ab]*?/BZ + aaaa + +/[ab]?/BZ + aaaa + +/[ab]??/BZ + aaaa + +/[ab]+/BZ + aaaa + +/[ab]+?/BZ + aaaa + +/[ab]{2,3}/BZ + aaaa + +/[ab]{2,3}?/BZ + aaaa + +/[ab]{2,}/BZ + aaaa + +/[ab]{2,}?/BZ + aaaa + +/\d+\s{0,5}=\s*\S?=\w{0,4}\W*/BZ + +/[a-d]{5,12}[e-z0-9]*#[^a-z]+[b-y]*a[2-7]?[^0-9a-z]+/BZ + +/[a-z]*\s#[ \t]?\S#[a-c]*\S#[C-G]+?\d#[4-8]*\D#[4-9,]*\D#[!$]{0,5}\w#[M-Xf-l]+\W#[a-c,]?\W/BZ + +/a+(aa|bb)*c#a*(bb|cc)*a#a?(bb|cc)*d#[a-f]*(g|hh)*f/BZ + +/[a-f]*(g|hh|i)*i#[a-x]{4,}(y{0,6})*y#[a-k]+(ll|mm)+n/BZ + +/[a-f]*(?>gg|hh)+#[a-f]*(?>gg|hh)?#[a-f]*(?>gg|hh)*a#[a-f]*(?>gg|hh)*h/BZ + +/[a-c]*d/DZS + +/[a-c]+d/DZS + +/[a-c]?d/DZS + +/[a-c]{4,6}d/DZS + +/[a-c]{0,6}d/DZS + +/-- End of special auto-possessive tests --/ + +/^A\o{1239}B/ + A\123B + +/^A\oB/ + +/^A\x{zz}B/ + +/^A\x{12Z/ + +/^A\x{/ + +/[ab]++/BZO + +/[^ab]*+/BZO + +/a{4}+/BZO + +/a{4}+/BZOi + +/[a-[:digit:]]+/ + +/[A-[:digit:]]+/ + +/[a-[.xxx.]]+/ + +/[a-[=xxx=]]+/ + +/[a-[!xxx!]]+/ + +/[A-[!xxx!]]+/ + A]]] + +/[a-\d]+/ + +/(?<0abc>xx)/ + +/(?&1abc)xx(?<1abc>y)/ + +/(?xx)/ + +/(?'0abc'xx)/ + +/(?P<0abc>xx)/ + +/\k<5ghj>/ + +/\k'5ghj'/ + +/\k{2fgh}/ + +/(?P=8yuki)/ + +/\g{4df}/ + +/(?&1abc)xx(?<1abc>y)/ + +/(?P>1abc)xx(?<1abc>y)/ + +/\g'3gh'/ + +/\g<5fg>/ + +/(?(<4gh>)abc)/ + +/(?('4gh')abc)/ + +/(?(4gh)abc)/ + +/(?(R&6yh)abc)/ + +/(((a\2)|(a*)\g<-1>))*a?/BZ + +/-- Test the ugly "start or end of word" compatibility syntax --/ + +/[[:<:]]red[[:>:]]/BZ + little red riding hood + a /red/ thing + red is a colour + put it all on red + ** Failers + no reduction + Alfred Winifred + +/[a[:<:]] should give error/ + +/(?=ab\K)/+ + abcd + +/abcd/f + xx\nxabcd + +/ -- Test stack check external calls --/ + +/(((((a)))))/Q0 + +/(((((a)))))/Q1 + +/(((((a)))))/Q + +/^\w+(?>\s*)(?<=\w)/BZ + +/\othing/ + +/\o{}/ + +/\o{whatever}/ + +/\xthing/ + +/\x{}/ + +/\x{whatever}/ + +"((?=(?(?=(?(?=(?(?=()))))))))" + a + +"(?(?=)==)(((((((((?=)))))))))" + a + +/^(?:(a)|b)(?(1)A|B)/I + aA123\O3 + aA123\O6 + +'^(?:(?a)|b)(?()A|B)' + aA123\O3 + aA123\O6 + +'^(?)(?:(?a)|b)(?()A|B)'J + aA123\O3 + aA123\O6 + +'^(?:(?X)|)(?:(?a)|b)\k{AA}'J + aa123\O3 + aa123\O6 + +/(?(?J)(?1(111111)11|)1|1|)(?()1)/ + +/(?(?=0)?)+/ + +/(?(?=0)(?=00)?00765)/ + 00765 + +/(?(?=0)(?=00)?00765|(?!3).56)/ + 00765 + 456 + ** Failers + 356 + +'^(a)*+(\w)' + g + g\O3 + +'^(?:a)*+(\w)' + g + g\O3 + +//C + \O\C+ + +"((?2){0,1999}())?" + +/((?+1)(\1))/BZ + +/(?(?!)a|b)/ + bbb + aaa + +"((?2)+)((?1))" + +"(?(?.*!.*)?)" + +"X((?2)()*+){2}+"BZ + +"X((?2)()*+){2}"BZ + +"(?<=((?2))((?1)))" + +/(?<=\Ka)/g+ + aaaaa + +/(?<=\Ka)/G+ + aaaaa + +/((?2){73}(?2))((?1))/ + +/.((?2)(?R)\1)()/BZ + +/(?1)()((((((\1++))\x85)+)|))/ + +/(\9*+(?2);\3++()2|)++{/ + +/\V\x85\9*+((?2)\3++()2)*:2/ + +/(((?(R)){0,2}) (?''((?'R')((?'R')))))/J + +/(((?(X)){0,2}) (?''((?'X')((?'X')))))/J + +/(((?(R)){0,2}) (?''((?'X')((?'R')))))/ + +"(?J)(?'d'(?'d'\g{d}))" + +".*?\h.+.\.+\R*?\xd(?i)(?=!(?=b`b`b`\`b\xa9b!)`\a`bbbbbbbbbbbbb`bbbbbbbbbbbb*R\x85bbbbbbb\C?{((?2)(?))(( +\H){8(?<=(?1){29}\xa8bbbb\x16\xd\xc6^($(?1)/ + +/a[[:punct:]b]/BZ + +/L(?#(|++)(?J:(?)(?))(?)/ + \O\CC + +/(?=a\K)/ + ring bpattingbobnd $ 1,oern cou \rb\L + +/(?<=((?C)0))/ + 9010 + abcd + +/((?J)(?'R'(?'R'(?'R'(?'R'(?'R'(?|(\k'R'))))))))/ + +/\N(?(?C)0?!.)*/ + +/(?abc)(?(R)xyz)/BZ + +/(?abc)(?(R)xyz)/BZ + +/(?=.*[A-Z])/I + +"(?<=(a))\1?b" + ab + aaab + +"(?=(a))\1?b" + ab + aaab + +/(?(?=^))b/ + abc + +/-- End of testinput2 --/ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput20 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput20 new file mode 100755 index 000000000..2a6b8f23f --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput20 @@ -0,0 +1,19 @@ +/-- These DFA tests are for the handling of characters greater than 255 in + 16- or 32-bit, non-UTF mode. --/ + +/^\x{ffff}+/i + \x{ffff} + +/^\x{ffff}?/i + \x{ffff} + +/^\x{ffff}*/i + \x{ffff} + +/^\x{ffff}{3}/i + \x{ffff}\x{ffff}\x{ffff} + +/^\x{ffff}{0,3}/i + \x{ffff} + +/-- End of testinput20 --/ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput21 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput21 new file mode 100755 index 000000000..30895eef2 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput21 @@ -0,0 +1,26 @@ +/-- Tests for reloading pre-compiled patterns. The first one gives an error +right away, and can be any old pattern compiled in 8-bit mode ("abc" is +typical). The others require the link size to be 2. */x + +(?:[AaLl]+)[^xX-]*?)(?P[\x{150}-\x{250}\x{300}]| + [^\x{800}aAs-uS-U\x{d800}-\x{dfff}])++[^#\b\x{500}\x{1000}]{3,5}$ + /x + + In 16-bit mode with options: S>testdata/saved16LE-1 + FS>testdata/saved16BE-1 + In 32-bit mode with options: S>testdata/saved32LE-1 + FS>testdata/saved32BE-1 +--%x + +[aZ\x{400}-\x{10ffff}]{4,} + [\x{f123}\x{10039}\x{20000}-\x{21234}]?| + [A-Cx-z\x{100000}-\x{1000a7}\x{101234}]) + (?[^az])/x + + In 16-bit mode with options: S8>testdata/saved16LE-2 + FS8>testdata/saved16BE-2 + In 32-bit mode with options: S8>testdata/saved32LE-2 + FS8>testdata/saved32BE-2 +--%8x + +>>\xaa<<< + >>>\xba<<< + +/[\W]+/Lfr_FR + >>>\xaa<<< + >>>\xba<<< + +/[^[:alpha:]]+/Lfr_FR + >>>\xaa<<< + >>>\xba<<< + +/\w+/Lfr_FR + >>>\xaa<<< + >>>\xba<<< + +/[\w]+/Lfr_FR + >>>\xaa<<< + >>>\xba<<< + +/[[:alpha:]]+/Lfr_FR + >>>\xaa<<< + >>>\xba<<< + +/[[:alpha:]][[:lower:]][[:upper:]]/DZLfr_FR + +/-- End of testinput3 --/ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput4 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput4 new file mode 100755 index 000000000..63368c0a0 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput4 @@ -0,0 +1,733 @@ +/-- This set of tests is for UTF support, excluding Unicode properties. It is + compatible with all versions of Perl >= 5.10 and both the 8-bit and 16-bit + PCRE libraries. --/ + +< forbid 9?=ABCDEFfGILMNPTUWXZ< + +/a.b/8 + acb + a\x7fb + a\x{100}b + *** Failers + a\nb + +/a(.{3})b/8 + a\x{4000}xyb + a\x{4000}\x7fyb + a\x{4000}\x{100}yb + *** Failers + a\x{4000}b + ac\ncb + +/a(.*?)(.)/ + a\xc0\x88b + +/a(.*?)(.)/8 + a\x{100}b + +/a(.*)(.)/ + a\xc0\x88b + +/a(.*)(.)/8 + a\x{100}b + +/a(.)(.)/ + a\xc0\x92bcd + +/a(.)(.)/8 + a\x{240}bcd + +/a(.?)(.)/ + a\xc0\x92bcd + +/a(.?)(.)/8 + a\x{240}bcd + +/a(.??)(.)/ + a\xc0\x92bcd + +/a(.??)(.)/8 + a\x{240}bcd + +/a(.{3})b/8 + a\x{1234}xyb + a\x{1234}\x{4321}yb + a\x{1234}\x{4321}\x{3412}b + *** Failers + a\x{1234}b + ac\ncb + +/a(.{3,})b/8 + a\x{1234}xyb + a\x{1234}\x{4321}yb + a\x{1234}\x{4321}\x{3412}b + axxxxbcdefghijb + a\x{1234}\x{4321}\x{3412}\x{3421}b + *** Failers + a\x{1234}b + +/a(.{3,}?)b/8 + a\x{1234}xyb + a\x{1234}\x{4321}yb + a\x{1234}\x{4321}\x{3412}b + axxxxbcdefghijb + a\x{1234}\x{4321}\x{3412}\x{3421}b + *** Failers + a\x{1234}b + +/a(.{3,5})b/8 + a\x{1234}xyb + a\x{1234}\x{4321}yb + a\x{1234}\x{4321}\x{3412}b + axxxxbcdefghijb + a\x{1234}\x{4321}\x{3412}\x{3421}b + axbxxbcdefghijb + axxxxxbcdefghijb + *** Failers + a\x{1234}b + axxxxxxbcdefghijb + +/a(.{3,5}?)b/8 + a\x{1234}xyb + a\x{1234}\x{4321}yb + a\x{1234}\x{4321}\x{3412}b + axxxxbcdefghijb + a\x{1234}\x{4321}\x{3412}\x{3421}b + axbxxbcdefghijb + axxxxxbcdefghijb + *** Failers + a\x{1234}b + axxxxxxbcdefghijb + +/^[a\x{c0}]/8 + *** Failers + \x{100} + +/(?<=aXb)cd/8 + aXbcd + +/(?<=a\x{100}b)cd/8 + a\x{100}bcd + +/(?<=a\x{100000}b)cd/8 + a\x{100000}bcd + +/(?:\x{100}){3}b/8 + \x{100}\x{100}\x{100}b + *** Failers + \x{100}\x{100}b + +/\x{ab}/8 + \x{ab} + \xc2\xab + *** Failers + \x00{ab} + +/(?<=(.))X/8 + WXYZ + \x{256}XYZ + *** Failers + XYZ + +/[^a]+/8g + bcd + \x{100}aY\x{256}Z + +/^[^a]{2}/8 + \x{100}bc + +/^[^a]{2,}/8 + \x{100}bcAa + +/^[^a]{2,}?/8 + \x{100}bca + +/[^a]+/8ig + bcd + \x{100}aY\x{256}Z + +/^[^a]{2}/8i + \x{100}bc + +/^[^a]{2,}/8i + \x{100}bcAa + +/^[^a]{2,}?/8i + \x{100}bca + +/\x{100}{0,0}/8 + abcd + +/\x{100}?/8 + abcd + \x{100}\x{100} + +/\x{100}{0,3}/8 + \x{100}\x{100} + \x{100}\x{100}\x{100}\x{100} + +/\x{100}*/8 + abce + \x{100}\x{100}\x{100}\x{100} + +/\x{100}{1,1}/8 + abcd\x{100}\x{100}\x{100}\x{100} + +/\x{100}{1,3}/8 + abcd\x{100}\x{100}\x{100}\x{100} + +/\x{100}+/8 + abcd\x{100}\x{100}\x{100}\x{100} + +/\x{100}{3}/8 + abcd\x{100}\x{100}\x{100}XX + +/\x{100}{3,5}/8 + abcd\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}XX + +/\x{100}{3,}/8 + abcd\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}XX + +/(?<=a\x{100}{2}b)X/8+ + Xyyya\x{100}\x{100}bXzzz + +/\D*/8 + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + +/\D*/8 + \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} + +/\D/8 + 1X2 + 1\x{100}2 + +/>\S/8 + > >X Y + > >\x{100} Y + +/\d/8 + \x{100}3 + +/\s/8 + \x{100} X + +/\D+/8 + 12abcd34 + *** Failers + 1234 + +/\D{2,3}/8 + 12abcd34 + 12ab34 + *** Failers + 1234 + 12a34 + +/\D{2,3}?/8 + 12abcd34 + 12ab34 + *** Failers + 1234 + 12a34 + +/\d+/8 + 12abcd34 + *** Failers + +/\d{2,3}/8 + 12abcd34 + 1234abcd + *** Failers + 1.4 + +/\d{2,3}?/8 + 12abcd34 + 1234abcd + *** Failers + 1.4 + +/\S+/8 + 12abcd34 + *** Failers + \ \ + +/\S{2,3}/8 + 12abcd34 + 1234abcd + *** Failers + \ \ + +/\S{2,3}?/8 + 12abcd34 + 1234abcd + *** Failers + \ \ + +/>\s+ <34 + *** Failers + +/>\s{2,3} \s{2,3}? \xff< + +/[\xff]/8 + >\x{ff}< + +/[^\xFF]/ + XYZ + +/[^\xff]/8 + XYZ + \x{123} + +/^[ac]*b/8 + xb + +/^[ac\x{100}]*b/8 + xb + +/^[^x]*b/8i + xb + +/^[^x]*b/8 + xb + +/^\d*b/8 + xb + +/(|a)/g8 + catac + a\x{256}a + +/^\x{85}$/8i + \x{85} + +/^ሴ/8 + ሴ + +/^\ሴ/8 + ሴ + +"(?s)(.{1,5})"8 + abcdefg + ab + +/a*\x{100}*\w/8 + a + +/\S\S/8g + A\x{a3}BC + +/\S{2}/8g + A\x{a3}BC + +/\W\W/8g + +\x{a3}== + +/\W{2}/8g + +\x{a3}== + +/\S/8g + \x{442}\x{435}\x{441}\x{442} + +/[\S]/8g + \x{442}\x{435}\x{441}\x{442} + +/\D/8g + \x{442}\x{435}\x{441}\x{442} + +/[\D]/8g + \x{442}\x{435}\x{441}\x{442} + +/\W/8g + \x{2442}\x{2435}\x{2441}\x{2442} + +/[\W]/8g + \x{2442}\x{2435}\x{2441}\x{2442} + +/[\S\s]*/8 + abc\n\r\x{442}\x{435}\x{441}\x{442}xyz + +/[\x{41f}\S]/8g + \x{442}\x{435}\x{441}\x{442} + +/.[^\S]./8g + abc def\x{442}\x{443}xyz\npqr + +/.[^\S\n]./8g + abc def\x{442}\x{443}xyz\npqr + +/[[:^alnum:]]/8g + +\x{2442} + +/[[:^alpha:]]/8g + +\x{2442} + +/[[:^ascii:]]/8g + A\x{442} + +/[[:^blank:]]/8g + A\x{442} + +/[[:^cntrl:]]/8g + A\x{442} + +/[[:^digit:]]/8g + A\x{442} + +/[[:^graph:]]/8g + \x19\x{e01ff} + +/[[:^lower:]]/8g + A\x{422} + +/[[:^print:]]/8g + \x{19}\x{e01ff} + +/[[:^punct:]]/8g + A\x{442} + +/[[:^space:]]/8g + A\x{442} + +/[[:^upper:]]/8g + a\x{442} + +/[[:^word:]]/8g + +\x{2442} + +/[[:^xdigit:]]/8g + M\x{442} + +/[^ABCDEFGHIJKLMNOPQRSTUVWXYZÀÃÂÃÄÅÆÇÈÉÊËÌÃÃŽÃÃÑÒÓÔÕÖØÙÚÛÜÃÞĀĂĄĆĈĊČĎÄĒĔĖĘĚĜĞĠĢĤĦĨĪĬĮİIJĴĶĹĻĽĿÅŃŅŇŊŌŎÅŒŔŖŘŚŜŞŠŢŤŦŨŪŬŮŰŲŴŶŸŹŻŽÆƂƄƆƇƉƊƋƎÆÆƑƓƔƖƗƘƜÆƟƠƢƤƦƧƩƬƮƯƱƲƳƵƷƸƼDŽLJNJÇÇǑǓǕǗǙǛǞǠǢǤǦǨǪǬǮDZǴǶǷǸǺǼǾȀȂȄȆȈȊȌȎÈȒȔȖȘȚȜȞȠȢȤȦȨȪȬȮȰȲȺȻȽȾÉΆΈΉΊΌΎÎΑΒΓΔΕΖΗΘΙΚΛΜÎΞΟΠΡΣΤΥΦΧΨΩΪΫϒϓϔϘϚϜϞϠϢϤϦϨϪϬϮϴϷϹϺϽϾϿЀÐЂЃЄЅІЇЈЉЊЋЌÐÐŽÐÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬЭЮЯѠѢѤѦѨѪѬѮѰѲѴѶѸѺѼѾҀҊҌҎÒҒҔҖҘҚҜҞҠҢҤҦҨҪҬҮҰҲҴҶҸҺҼҾӀÓÓƒÓ…Ó‡Ó‰Ó‹ÓÓӒӔӖӘӚӜӞӠӢӤӦӨӪӬӮӰӲӴӶӸԀԂԄԆԈԊԌԎԱԲԳԴԵԶԷԸԹԺԻԼԽԾԿՀÕÕ‚ÕƒÕ„Õ…Õ†Õ‡ÕˆÕ‰ÕŠÕ‹ÕŒÕÕŽÕÕՑՒՓՔՕՖႠႡႢႣႤႥႦႧႨႩႪႫႬႭႮႯႰႱႲႳႴႵႶႷႸႹႺႻႼႽႾႿჀáƒáƒ‚ჃჄჅḀḂḄḆḈḊḌḎá¸á¸’ḔḖḘḚḜḞḠḢḤḦḨḪḬḮḰḲḴḶḸḺḼḾṀṂṄṆṈṊṌṎá¹á¹’ṔṖṘṚṜṞṠṢṤṦṨṪṬṮṰṲṴṶṸṺṼṾẀẂẄẆẈẊẌẎáºáº’ẔẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼẾỀỂỄỆỈỊỌỎá»á»’ỔỖỘỚỜỞỠỢỤỦỨỪỬỮỰỲỴỶỸἈἉἊἋἌá¼á¼Žá¼á¼˜á¼™á¼šá¼›á¼œá¼á¼¨á¼©á¼ªá¼«á¼¬á¼­á¼®á¼¯á¼¸á¼¹á¼ºá¼»á¼¼á¼½á¼¾á¼¿á½ˆá½‰á½Šá½‹á½Œá½á½™á½›á½á½Ÿá½¨á½©á½ªá½«á½¬á½­á½®á½¯á¾¸á¾¹á¾ºá¾»á¿ˆá¿‰á¿Šá¿‹á¿˜á¿™á¿šá¿›á¿¨á¿©á¿ªá¿«á¿¬á¿¸á¿¹á¿ºá¿»abcdefghijklmnopqrstuvwxyzªµºßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿÄăąćĉċÄÄđēĕėęěÄğġģĥħĩīĭįıijĵķĸĺļľŀłńņňʼnŋÅÅőœŕŗřśÅşšţťŧũūŭůűųŵŷźżžſƀƃƅƈƌƃƕƙƚƛƞơƣƥƨƪƫƭưƴƶƹƺƽƾƿdžljnjǎÇǒǔǖǘǚǜÇǟǡǣǥǧǩǫǭǯǰdzǵǹǻǽǿÈȃȅȇȉȋÈÈȑȓȕȗșțÈȟȡȣȥȧȩȫȭȯȱȳȴȵȶȷȸȹȼȿɀÉɑɒɓɔɕɖɗɘəɚɛɜÉɞɟɠɡɢɣɤɥɦɧɨɩɪɫɬɭɮɯɰɱɲɳɴɵɶɷɸɹɺɻɼɽɾɿʀÊʂʃʄʅʆʇʈʉʊʋʌÊÊŽÊÊʑʒʓʔʕʖʗʘʙʚʛʜÊʞʟʠʡʢʣʤʥʦʧʨʩʪʫʬʭʮʯÎάέήίΰαβγδεζηθικλμνξοπÏςστυφχψωϊϋόÏÏŽÏϑϕϖϗϙϛÏϟϡϣϥϧϩϫϭϯϰϱϲϳϵϸϻϼабвгдежзийклмнопрÑтуфхцчшщъыьÑÑŽÑÑёђѓєѕіїјљњћќÑўџѡѣѥѧѩѫѭѯѱѳѵѷѹѻѽѿÒÒ‹ÒÒÒ‘Ò“Ò•Ò—Ò™Ò›ÒҟҡңҥҧҩҫҭүұҳҵҷҹһҽҿӂӄӆӈӊӌӎӑӓӕӗәӛÓÓŸÓ¡Ó£Ó¥Ó§Ó©Ó«Ó­Ó¯Ó±Ó³ÓµÓ·Ó¹ÔÔƒÔ…Ô‡Ô‰Ô‹ÔÔÕ¡Õ¢Õ£Õ¤Õ¥Õ¦Õ§Õ¨Õ©ÕªÕ«Õ¬Õ­Õ®Õ¯Õ°Õ±Õ²Õ³Õ´ÕµÕ¶Õ·Õ¸Õ¹ÕºÕ»Õ¼Õ½Õ¾Õ¿Ö€Öւփքօֆևᴀá´á´‚ᴃᴄᴅᴆᴇᴈᴉᴊᴋᴌá´á´Žá´á´á´‘ᴒᴓᴔᴕᴖᴗᴘᴙᴚᴛᴜá´á´žá´Ÿá´ á´¡á´¢á´£á´¤á´¥á´¦á´§á´¨á´©á´ªá´«áµ¢áµ£áµ¤áµ¥áµ¦áµ§áµ¨áµ©áµªáµ«áµ¬áµ­áµ®áµ¯áµ°áµ±áµ²áµ³áµ´áµµáµ¶áµ·áµ¹áµºáµ»áµ¼áµ½áµ¾áµ¿á¶€á¶á¶‚ᶃᶄᶅᶆᶇᶈᶉᶊᶋᶌá¶á¶Žá¶á¶á¶‘ᶒᶓᶔᶕᶖᶗᶘᶙᶚá¸á¸ƒá¸…ḇḉḋá¸á¸á¸‘ḓḕḗḙḛá¸á¸Ÿá¸¡á¸£á¸¥á¸§á¸©á¸«á¸­á¸¯á¸±á¸³á¸µá¸·á¸¹á¸»á¸½á¸¿á¹á¹ƒá¹…ṇṉṋá¹á¹á¹‘ṓṕṗṙṛá¹á¹Ÿá¹¡á¹£á¹¥á¹§á¹©á¹«á¹­á¹¯á¹±á¹³á¹µá¹·á¹¹á¹»á¹½á¹¿áºáºƒáº…ẇẉẋáºáºáº‘ẓẕẖẗẘẙẚẛạảấầẩẫậắằẳẵặẹẻẽếá»á»ƒá»…ệỉịá»á»á»‘ồổỗộớá»á»Ÿá»¡á»£á»¥á»§á»©á»«á»­á»¯á»±á»³á»µá»·á»¹á¼€á¼á¼‚ἃἄἅἆἇá¼á¼‘ἒἓἔἕἠἡἢἣἤἥἦἧἰἱἲἳἴἵἶἷὀá½á½‚ὃὄὅá½á½‘ὒὓὔὕὖὗὠὡὢὣὤὥὦὧὰάὲέὴήὶίὸόὺύὼώᾀá¾á¾‚ᾃᾄᾅᾆᾇá¾á¾‘ᾒᾓᾔᾕᾖᾗᾠᾡᾢᾣᾤᾥᾦᾧᾰᾱᾲᾳᾴᾶᾷιῂῃῄῆῇá¿á¿‘ῒΐῖῗῠῡῢΰῤῥῦῧῲῳῴῶῷâ²â²ƒâ²…ⲇⲉⲋâ²â²â²‘ⲓⲕⲗⲙⲛâ²â²Ÿâ²¡â²£â²¥â²§â²©â²«â²­â²¯â²±â²³â²µâ²·â²¹â²»â²½â²¿â³â³ƒâ³…ⳇⳉⳋâ³â³â³‘ⳓⳕⳗⳙⳛâ³â³Ÿâ³¡â³£â³¤â´€â´â´‚ⴃⴄⴅⴆⴇⴈⴉⴊⴋⴌâ´â´Žâ´â´â´‘ⴒⴓⴔⴕⴖⴗⴘⴙⴚⴛⴜâ´â´žâ´Ÿâ´ â´¡â´¢â´£â´¤â´¥ï¬€ï¬ï¬‚ffifflſtstﬓﬔﬕﬖﬗ\d-_^]/8 + +/^[^d]*?$/ + abc + +/^[^d]*?$/8 + abc + +/^[^d]*?$/i + abc + +/^[^d]*?$/8i + abc + +/(?i)[\xc3\xa9\xc3\xbd]|[\xc3\xa9\xc3\xbdA]/8 + +/^[a\x{c0}]b/8 + \x{c0}b + +/^([a\x{c0}]*?)aa/8 + a\x{c0}aaaa/ + +/^([a\x{c0}]*?)aa/8 + a\x{c0}aaaa/ + a\x{c0}a\x{c0}aaa/ + +/^([a\x{c0}]*)aa/8 + a\x{c0}aaaa/ + a\x{c0}a\x{c0}aaa/ + +/^([a\x{c0}]*)a\x{c0}/8 + a\x{c0}aaaa/ + a\x{c0}a\x{c0}aaa/ + +/A*/g8 + AAB\x{123}BAA + +/(abc)\1/8i + abc + +/(abc)\1/8 + abc + +/a(*:a\x{1234}b)/8K + abc + +/a(*:a£b)/8K + abc + +/-- Noncharacters --/ + +/./8 + \x{fffe} + \x{ffff} + \x{1fffe} + \x{1ffff} + \x{2fffe} + \x{2ffff} + \x{3fffe} + \x{3ffff} + \x{4fffe} + \x{4ffff} + \x{5fffe} + \x{5ffff} + \x{6fffe} + \x{6ffff} + \x{7fffe} + \x{7ffff} + \x{8fffe} + \x{8ffff} + \x{9fffe} + \x{9ffff} + \x{afffe} + \x{affff} + \x{bfffe} + \x{bffff} + \x{cfffe} + \x{cffff} + \x{dfffe} + \x{dffff} + \x{efffe} + \x{effff} + \x{ffffe} + \x{fffff} + \x{10fffe} + \x{10ffff} + \x{fdd0} + \x{fdd1} + \x{fdd2} + \x{fdd3} + \x{fdd4} + \x{fdd5} + \x{fdd6} + \x{fdd7} + \x{fdd8} + \x{fdd9} + \x{fdda} + \x{fddb} + \x{fddc} + \x{fddd} + \x{fdde} + \x{fddf} + \x{fde0} + \x{fde1} + \x{fde2} + \x{fde3} + \x{fde4} + \x{fde5} + \x{fde6} + \x{fde7} + \x{fde8} + \x{fde9} + \x{fdea} + \x{fdeb} + \x{fdec} + \x{fded} + \x{fdee} + \x{fdef} + +/^\d*\w{4}/8 + 1234 + 123 + +/^[^b]*\w{4}/8 + aaaa + aaa + +/^[^b]*\w{4}/8i + aaaa + aaa + +/^\x{100}*.{4}/8 + \x{100}\x{100}\x{100}\x{100} + \x{100}\x{100}\x{100} + +/^\x{100}*.{4}/8i + \x{100}\x{100}\x{100}\x{100} + \x{100}\x{100}\x{100} + +/^a+[a\x{200}]/8 + aa + +/^.\B.\B./8 + \x{10123}\x{10124}\x{10125} + +/^#[^\x{ffff}]#[^\x{ffff}]#[^\x{ffff}]#/8 + #\x{10000}#\x{100}#\x{10ffff}# + +"[\S\V\H]"8 + +/\C(\W?Å¿)'?{{/8 + \\C(\\W?Å¿)'?{{ + +/[^\x{100}-\x{ffff}]*[\x80-\xff]/8 + \x{99}\x{99}\x{99} + +/-- End of testinput4 --/ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput5 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput5 new file mode 100755 index 000000000..c94008c3f --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput5 @@ -0,0 +1,807 @@ +/-- This set of tests checks the API, internals, and non-Perl stuff for UTF + support, excluding Unicode properties. However, tests that give different + results in 8-bit and 16-bit modes are excluded (see tests 16 and 17). --/ + +< forbid W + +/\x{110000}/8DZ + +/\o{4200000}/8DZ + +/\x{ffffffff}/8 + +/\o{37777777777}/8 + +/\x{100000000}/8 + +/\o{77777777777}/8 + +/\x{d800}/8 + +/\o{154000}/8 + +/\x{dfff}/8 + +/\o{157777}/8 + +/\x{d7ff}/8 + +/\o{153777}/8 + +/\x{e000}/8 + +/\o{170000}/8 + +/^\x{100}a\x{1234}/8 + \x{100}a\x{1234}bcd + +/\x{0041}\x{2262}\x{0391}\x{002e}/DZ8 + \x{0041}\x{2262}\x{0391}\x{002e} + +/.{3,5}X/DZ8 + \x{212ab}\x{212ab}\x{212ab}\x{861}X + +/.{3,5}?/DZ8 + \x{212ab}\x{212ab}\x{212ab}\x{861} + +/(?<=\C)X/8 + Should produce an error diagnostic + +/^[ab]/8DZ + bar + *** Failers + c + \x{ff} + \x{100} + +/^[^ab]/8DZ + c + \x{ff} + \x{100} + *** Failers + aaa + +/\x{100}*(\d+|"(?1)")/8 + 1234 + "1234" + \x{100}1234 + "\x{100}1234" + \x{100}\x{100}12ab + \x{100}\x{100}"12" + *** Failers + \x{100}\x{100}abcd + +/\x{100}*/8DZ + +/a\x{100}*/8DZ + +/ab\x{100}*/8DZ + +/\x{100}*A/8DZ + A + +/\x{100}*\d(?R)/8DZ + +/[Z\x{100}]/8DZ + Z\x{100} + \x{100} + \x{100}Z + *** Failers + +/[\x{200}-\x{100}]/8 + +/[Ä€-Ä„]/8 + \x{100} + \x{104} + *** Failers + \x{105} + \x{ff} + +/[z-\x{100}]/8DZ + +/[z\Qa-d]Ä€\E]/8DZ + \x{100} + Ä€ + +/[\xFF]/DZ + >\xff< + +/[^\xFF]/DZ + +/[Ä-Ãœ]/8 + Ö # Matches without Study + \x{d6} + +/[Ä-Ãœ]/8S + Ö <-- Same with Study + \x{d6} + +/[\x{c4}-\x{dc}]/8 + Ö # Matches without Study + \x{d6} + +/[\x{c4}-\x{dc}]/8S + Ö <-- Same with Study + \x{d6} + +/[^\x{100}]abc(xyz(?1))/8DZ + +/[ab\x{100}]abc(xyz(?1))/8DZ + +/(\x{100}(b(?2)c))?/DZ8 + +/(\x{100}(b(?2)c)){0,2}/DZ8 + +/(\x{100}(b(?1)c))?/DZ8 + +/(\x{100}(b(?1)c)){0,2}/DZ8 + +/\W/8 + A.B + A\x{100}B + +/\w/8 + \x{100}X + +/^\ሴ/8DZ + +/\x{100}*\d/8DZ + +/\x{100}*\s/8DZ + +/\x{100}*\w/8DZ + +/\x{100}*\D/8DZ + +/\x{100}*\S/8DZ + +/\x{100}*\W/8DZ + +/()()()()()()()()()() + ()()()()()()()()()() + ()()()()()()()()()() + ()()()()()()()()()() + A (x) (?41) B/8x + AxxB + +/^[\x{100}\E-\Q\E\x{150}]/BZ8 + +/^[\QÄ€\E-\QÅ\E]/BZ8 + +/^abc./mgx8 + abc1 \x0aabc2 \x0babc3xx \x0cabc4 \x0dabc5xx \x0d\x0aabc6 \x{0085}abc7 \x{2028}abc8 \x{2029}abc9 JUNK + +/abc.$/mgx8 + abc1\x0a abc2\x0b abc3\x0c abc4\x0d abc5\x0d\x0a abc6\x{0085} abc7\x{2028} abc8\x{2029} abc9 + +/^a\Rb/8 + a\nb + a\rb + a\r\nb + a\x0bb + a\x0cb + a\x{85}b + a\x{2028}b + a\x{2029}b + ** Failers + a\n\rb + +/^a\R*b/8 + ab + a\nb + a\rb + a\r\nb + a\x0bb + a\x0c\x{2028}\x{2029}b + a\x{85}b + a\n\rb + a\n\r\x{85}\x0cb + +/^a\R+b/8 + a\nb + a\rb + a\r\nb + a\x0bb + a\x0c\x{2028}\x{2029}b + a\x{85}b + a\n\rb + a\n\r\x{85}\x0cb + ** Failers + ab + +/^a\R{1,3}b/8 + a\nb + a\n\rb + a\n\r\x{85}b + a\r\n\r\nb + a\r\n\r\n\r\nb + a\n\r\n\rb + a\n\n\r\nb + ** Failers + a\n\n\n\rb + a\r + +/\H\h\V\v/8 + X X\x0a + X\x09X\x0b + ** Failers + \x{a0} X\x0a + +/\H*\h+\V?\v{3,4}/8 + \x09\x20\x{a0}X\x0a\x0b\x0c\x0d\x0a + \x09\x20\x{a0}\x0a\x0b\x0c\x0d\x0a + \x09\x20\x{a0}\x0a\x0b\x0c + ** Failers + \x09\x20\x{a0}\x0a\x0b + +/\H\h\V\v/8 + \x{3001}\x{3000}\x{2030}\x{2028} + X\x{180e}X\x{85} + ** Failers + \x{2009} X\x0a + +/\H*\h+\V?\v{3,4}/8 + \x{1680}\x{180e}\x{2007}X\x{2028}\x{2029}\x0c\x0d\x0a + \x09\x{205f}\x{a0}\x0a\x{2029}\x0c\x{2028}\x0a + \x09\x20\x{202f}\x0a\x0b\x0c + ** Failers + \x09\x{200a}\x{a0}\x{2028}\x0b + +/[\h]/8BZ + >\x{1680} + +/[\h]{3,}/8BZ + >\x{1680}\x{180e}\x{2000}\x{2003}\x{200a}\x{202f}\x{205f}\x{3000}< + +/[\v]/8BZ + +/[\H]/8BZ + +/[\V]/8BZ + +/.*$/8 + \x{1ec5} + +/a\Rb/I8 + a\rb + a\nb + a\r\nb + ** Failers + a\x{85}b + a\x0bb + +/a\Rb/I8 + a\rb + a\nb + a\r\nb + a\x{85}b + a\x0bb + ** Failers + a\x{85}b\ + a\x0bb\ + +/a\R?b/I8 + a\rb + a\nb + a\r\nb + ** Failers + a\x{85}b + a\x0bb + +/a\R?b/I8 + a\rb + a\nb + a\r\nb + a\x{85}b + a\x0bb + ** Failers + a\x{85}b\ + a\x0bb\ + +/.*a.*=.b.*/8 + QQQ\x{2029}ABCaXYZ=!bPQR + ** Failers + a\x{2029}b + \x61\xe2\x80\xa9\x62 + +/[[:a\x{100}b:]]/8 + +/a[^]b/8 + a\x{1234}b + a\nb + ** Failers + ab + +/a[^]+b/8 + aXb + a\nX\nX\x{1234}b + ** Failers + ab + +/(\x{de})\1/ + \x{de}\x{de} + +/X/8f + A\x{1ec5}ABCXYZ + +/Xa{2,4}b/8 + X\P + Xa\P + Xaa\P + Xaaa\P + Xaaaa\P + +/Xa{2,4}?b/8 + X\P + Xa\P + Xaa\P + Xaaa\P + Xaaaa\P + +/Xa{2,4}+b/8 + X\P + Xa\P + Xaa\P + Xaaa\P + Xaaaa\P + +/X\x{123}{2,4}b/8 + X\P + X\x{123}\P + X\x{123}\x{123}\P + X\x{123}\x{123}\x{123}\P + X\x{123}\x{123}\x{123}\x{123}\P + +/X\x{123}{2,4}?b/8 + X\P + X\x{123}\P + X\x{123}\x{123}\P + X\x{123}\x{123}\x{123}\P + X\x{123}\x{123}\x{123}\x{123}\P + +/X\x{123}{2,4}+b/8 + X\P + X\x{123}\P + X\x{123}\x{123}\P + X\x{123}\x{123}\x{123}\P + X\x{123}\x{123}\x{123}\x{123}\P + +/X\x{123}{2,4}b/8 + Xx\P + X\x{123}x\P + X\x{123}\x{123}x\P + X\x{123}\x{123}\x{123}x\P + X\x{123}\x{123}\x{123}\x{123}x\P + +/X\x{123}{2,4}?b/8 + Xx\P + X\x{123}x\P + X\x{123}\x{123}x\P + X\x{123}\x{123}\x{123}x\P + X\x{123}\x{123}\x{123}\x{123}x\P + +/X\x{123}{2,4}+b/8 + Xx\P + X\x{123}x\P + X\x{123}\x{123}x\P + X\x{123}\x{123}\x{123}x\P + X\x{123}\x{123}\x{123}\x{123}x\P + +/X\d{2,4}b/8 + X\P + X3\P + X33\P + X333\P + X3333\P + +/X\d{2,4}?b/8 + X\P + X3\P + X33\P + X333\P + X3333\P + +/X\d{2,4}+b/8 + X\P + X3\P + X33\P + X333\P + X3333\P + +/X\D{2,4}b/8 + X\P + Xa\P + Xaa\P + Xaaa\P + Xaaaa\P + +/X\D{2,4}?b/8 + X\P + Xa\P + Xaa\P + Xaaa\P + Xaaaa\P + +/X\D{2,4}+b/8 + X\P + Xa\P + Xaa\P + Xaaa\P + Xaaaa\P + +/X\D{2,4}b/8 + X\P + X\x{123}\P + X\x{123}\x{123}\P + X\x{123}\x{123}\x{123}\P + X\x{123}\x{123}\x{123}\x{123}\P + +/X\D{2,4}?b/8 + X\P + X\x{123}\P + X\x{123}\x{123}\P + X\x{123}\x{123}\x{123}\P + X\x{123}\x{123}\x{123}\x{123}\P + +/X\D{2,4}+b/8 + X\P + X\x{123}\P + X\x{123}\x{123}\P + X\x{123}\x{123}\x{123}\P + X\x{123}\x{123}\x{123}\x{123}\P + +/X[abc]{2,4}b/8 + X\P + Xa\P + Xaa\P + Xaaa\P + Xaaaa\P + +/X[abc]{2,4}?b/8 + X\P + Xa\P + Xaa\P + Xaaa\P + Xaaaa\P + +/X[abc]{2,4}+b/8 + X\P + Xa\P + Xaa\P + Xaaa\P + Xaaaa\P + +/X[abc\x{123}]{2,4}b/8 + X\P + X\x{123}\P + X\x{123}\x{123}\P + X\x{123}\x{123}\x{123}\P + X\x{123}\x{123}\x{123}\x{123}\P + +/X[abc\x{123}]{2,4}?b/8 + X\P + X\x{123}\P + X\x{123}\x{123}\P + X\x{123}\x{123}\x{123}\P + X\x{123}\x{123}\x{123}\x{123}\P + +/X[abc\x{123}]{2,4}+b/8 + X\P + X\x{123}\P + X\x{123}\x{123}\P + X\x{123}\x{123}\x{123}\P + X\x{123}\x{123}\x{123}\x{123}\P + +/X[^a]{2,4}b/8 + X\P + Xz\P + Xzz\P + Xzzz\P + Xzzzz\P + +/X[^a]{2,4}?b/8 + X\P + Xz\P + Xzz\P + Xzzz\P + Xzzzz\P + +/X[^a]{2,4}+b/8 + X\P + Xz\P + Xzz\P + Xzzz\P + Xzzzz\P + +/X[^a]{2,4}b/8 + X\P + X\x{123}\P + X\x{123}\x{123}\P + X\x{123}\x{123}\x{123}\P + X\x{123}\x{123}\x{123}\x{123}\P + +/X[^a]{2,4}?b/8 + X\P + X\x{123}\P + X\x{123}\x{123}\P + X\x{123}\x{123}\x{123}\P + X\x{123}\x{123}\x{123}\x{123}\P + +/X[^a]{2,4}+b/8 + X\P + X\x{123}\P + X\x{123}\x{123}\P + X\x{123}\x{123}\x{123}\P + X\x{123}\x{123}\x{123}\x{123}\P + +/(Y)X\1{2,4}b/8 + YX\P + YXY\P + YXYY\P + YXYYY\P + YXYYYY\P + +/(Y)X\1{2,4}?b/8 + YX\P + YXY\P + YXYY\P + YXYYY\P + YXYYYY\P + +/(Y)X\1{2,4}+b/8 + YX\P + YXY\P + YXYY\P + YXYYY\P + YXYYYY\P + +/(\x{123})X\1{2,4}b/8 + \x{123}X\P + \x{123}X\x{123}\P + \x{123}X\x{123}\x{123}\P + \x{123}X\x{123}\x{123}\x{123}\P + \x{123}X\x{123}\x{123}\x{123}\x{123}\P + +/(\x{123})X\1{2,4}?b/8 + \x{123}X\P + \x{123}X\x{123}\P + \x{123}X\x{123}\x{123}\P + \x{123}X\x{123}\x{123}\x{123}\P + \x{123}X\x{123}\x{123}\x{123}\x{123}\P + +/(\x{123})X\1{2,4}+b/8 + \x{123}X\P + \x{123}X\x{123}\P + \x{123}X\x{123}\x{123}\P + \x{123}X\x{123}\x{123}\x{123}\P + \x{123}X\x{123}\x{123}\x{123}\x{123}\P + +/\bthe cat\b/8 + the cat\P + the cat\P\P + +/abcd*/8 + xxxxabcd\P + xxxxabcd\P\P + +/abcd*/i8 + xxxxabcd\P + xxxxabcd\P\P + XXXXABCD\P + XXXXABCD\P\P + +/abc\d*/8 + xxxxabc1\P + xxxxabc1\P\P + +/(a)bc\1*/8 + xxxxabca\P + xxxxabca\P\P + +/abc[de]*/8 + xxxxabcde\P + xxxxabcde\P\P + +/X\W{3}X/8 + \PX + +/\sxxx\s/8T1 + AB\x{85}xxx\x{a0}XYZ + AB\x{a0}xxx\x{85}XYZ + +/\S \S/8T1 + \x{a2} \x{84} + +'A#хц'8xBZ + +'A#хц + PQ'8xBZ + +/a+#Ñ…aa + z#XX?/8xBZ + +/a+#Ñ…aa + z#Ñ…?/8xBZ + +/\g{A}xxx#bXX(?'A'123) (?'A'456)/8xBZ + +/\g{A}xxx#bÑ…(?'A'123) (?'A'456)/8xBZ + +/^\cÄ£/8 + +/(\R*)(.)/s8 + \r\n + \r\r\n\n\r + \r\r\n\n\r\n + +/(\R)*(.)/s8 + \r\n + \r\r\n\n\r + \r\r\n\n\r\n + +/[^\x{1234}]+/iS8I + +/[^\x{1234}]+?/iS8I + +/[^\x{1234}]++/iS8I + +/[^\x{1234}]{2}/iS8I + +// + +/f.*/ + \P\Pfor + +/f.*/s + \P\Pfor + +/f.*/8 + \P\Pfor + +/f.*/8s + \P\Pfor + +/\x{d7ff}\x{e000}/8 + +/\x{d800}/8 + +/\x{dfff}/8 + +/\h+/8 + \x{1681}\x{200b}\x{1680}\x{2000}\x{202f}\x{3000} + \x{3001}\x{2fff}\x{200a}\x{a0}\x{2000} + +/[\h\x{e000}]+/8BZ + \x{1681}\x{200b}\x{1680}\x{2000}\x{202f}\x{3000} + \x{3001}\x{2fff}\x{200a}\x{a0}\x{2000} + +/\H+/8 + \x{1680}\x{180e}\x{167f}\x{1681}\x{180d}\x{180f} + \x{2000}\x{200a}\x{1fff}\x{200b} + \x{202f}\x{205f}\x{202e}\x{2030}\x{205e}\x{2060} + \x{a0}\x{3000}\x{9f}\x{a1}\x{2fff}\x{3001} + +/[\H\x{d7ff}]+/8BZ + \x{1680}\x{180e}\x{167f}\x{1681}\x{180d}\x{180f} + \x{2000}\x{200a}\x{1fff}\x{200b} + \x{202f}\x{205f}\x{202e}\x{2030}\x{205e}\x{2060} + \x{a0}\x{3000}\x{9f}\x{a1}\x{2fff}\x{3001} + +/\v+/8 + \x{2027}\x{2030}\x{2028}\x{2029} + \x09\x0e\x{84}\x{86}\x{85}\x0a\x0b\x0c\x0d + +/[\v\x{e000}]+/8BZ + \x{2027}\x{2030}\x{2028}\x{2029} + \x09\x0e\x{84}\x{86}\x{85}\x0a\x0b\x0c\x0d + +/\V+/8 + \x{2028}\x{2029}\x{2027}\x{2030} + \x{85}\x0a\x0b\x0c\x0d\x09\x0e\x{84}\x{86} + +/[\V\x{d7ff}]+/8BZ + \x{2028}\x{2029}\x{2027}\x{2030} + \x{85}\x0a\x0b\x0c\x0d\x09\x0e\x{84}\x{86} + +/\R+/8 + \x{2027}\x{2030}\x{2028}\x{2029} + \x09\x0e\x{84}\x{86}\x{85}\x0a\x0b\x0c\x0d + +/(..)\1/8 + ab\P + aba\P + abab\P + +/(..)\1/8i + ab\P + abA\P + aBAb\P + +/(..)\1{2,}/8 + ab\P + aba\P + abab\P + ababa\P + ababab\P + ababab\P\P + abababa\P + abababa\P\P + +/(..)\1{2,}/8i + ab\P + aBa\P + aBAb\P + AbaBA\P + abABAb\P + aBAbaB\P\P + abABabA\P + abaBABa\P\P + +/(..)\1{2,}?x/8i + ab\P + abA\P + aBAb\P + abaBA\P + abAbaB\P + abaBabA\P + abAbABaBx\P + +/./8 + \r\P + \r\P\P + +/.{2,3}/8 + \r\P + \r\P\P + \r\r\P + \r\r\P\P + \r\r\r\P + \r\r\r\P\P + +/.{2,3}?/8 + \r\P + \r\P\P + \r\r\P + \r\r\P\P + \r\r\r\P + \r\r\r\P\P + +/[^\x{100}][^\x{1234}][^\x{ffff}][^\x{10000}][^\x{10ffff}]/8BZ + +/[^\x{100}][^\x{1234}][^\x{ffff}][^\x{10000}][^\x{10ffff}]/8BZi + +/[^\x{100}]*[^\x{10000}]+[^\x{10ffff}]??[^\x{8000}]{4,}[^\x{7fff}]{2,9}?[^\x{fffff}]{5,6}+/8BZ + +/[^\x{100}]*[^\x{10000}]+[^\x{10ffff}]??[^\x{8000}]{4,}[^\x{7fff}]{2,9}?[^\x{fffff}]{5,6}+/8BZi + +/(?<=\x{1234}\x{1234})\bxy/I8 + +/(?8BZ + +/[\u0100-\u0200]/8BZ + +/\ud800/8 + +/^a+[a\x{200}]/8BZ + aa + +/[b-d\x{200}-\x{250}]*[ae-h]?#[\x{200}-\x{250}]{0,8}[\x00-\xff]*#[\x{200}-\x{250}]+[a-z]/8BZ + +/[^\xff]*PRUNE:\x{100}abc(xyz(?1))/8DZ + +/(?<=\K\x{17f})/8g+ + \x{17f}\x{17f}\x{17f}\x{17f}\x{17f} + +/(?<=\K\x{17f})/8G+ + \x{17f}\x{17f}\x{17f}\x{17f}\x{17f} + +/\C[^\v]+\x80/8 + [Aá¿»BÅ€C] + +/\C[^\d]+\x80/8 + [Aá¿»BÅ€C] + +/-- End of testinput5 --/ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput6 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput6 new file mode 100755 index 000000000..22ed1e64d --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput6 @@ -0,0 +1,1571 @@ +/-- This set of tests is for Unicode property support. It is compatible with + Perl >= 5.15. --/ + +< forbid 9?=ABCDEFfGILMNPTUXZ< + +/^\pC\pL\pM\pN\pP\pS\pZ\s+/8W + >\x{20}\x{a0}\x{1680}\x{2028}\x{2029}\x{202f}\x{9}\x{b} + +/^>\pZ+/8W + >\x{20}\x{a0}\x{1680}\x{2028}\x{2029}\x{202f}\x{9}\x{b} + +/^>[[:space:]]*/8W + >\x{20}\x{a0}\x{1680}\x{2028}\x{2029}\x{202f}\x{9}\x{b} + +/^>[[:blank:]]*/8W + >\x{20}\x{a0}\x{1680}\x{180e}\x{2000}\x{202f}\x{9}\x{b}\x{2028} + +/^[[:alpha:]]*/8W + Az\x{aa}\x{c0}\x{1c5}\x{2b0}\x{3b6}\x{1d7c9}\x{2fa1d} + +/^[[:alnum:]]*/8W + Az\x{aa}\x{c0}\x{1c5}\x{2b0}\x{3b6}\x{1d7c9}\x{2fa1d}1\x{660}\x{bef}\x{16ee} + +/^[[:cntrl:]]*/8W + \x{0}\x{09}\x{1f}\x{7f}\x{9f} + +/^[[:graph:]]*/8W + A\x{a1}\x{a0} + +/^[[:print:]]*/8W + A z\x{a0}\x{a1} + +/^[[:punct:]]*/8W + .+\x{a1}\x{a0} + +/\p{Zs}*?\R/ + ** Failers + a\xFCb + +/\p{Zs}*\R/ + ** Failers + a\xFCb + +/â±¥/8i + â±¥ + Ⱥx + Ⱥ + +/[â±¥]/8i + â±¥ + Ⱥx + Ⱥ + +/Ⱥ/8i + Ⱥ + â±¥ + +/-- These are tests for extended grapheme clusters --/ + +/^\X/8+ + G\x{34e}\x{34e}X + \x{34e}\x{34e}X + \x04X + \x{1100}X + \x{1100}\x{34e}X + \x{1b04}\x{1b04}X + *These match up to the roman letters + \x{1111}\x{1111}L,L + \x{1111}\x{1111}\x{1169}L,L,V + \x{1111}\x{ae4c}L, LV + \x{1111}\x{ad89}L, LVT + \x{1111}\x{ae4c}\x{1169}L, LV, V + \x{1111}\x{ae4c}\x{1169}\x{1169}L, LV, V, V + \x{1111}\x{ae4c}\x{1169}\x{11fe}L, LV, V, T + \x{1111}\x{ad89}\x{11fe}L, LVT, T + \x{1111}\x{ad89}\x{11fe}\x{11fe}L, LVT, T, T + \x{ad89}\x{11fe}\x{11fe}LVT, T, T + *These match just the first codepoint (invalid sequence) + \x{1111}\x{11fe}L, T + \x{ae4c}\x{1111}LV, L + \x{ae4c}\x{ae4c}LV, LV + \x{ae4c}\x{ad89}LV, LVT + \x{1169}\x{1111}V, L + \x{1169}\x{ae4c}V, LV + \x{1169}\x{ad89}V, LVT + \x{ad89}\x{1111}LVT, L + \x{ad89}\x{1169}LVT, V + \x{ad89}\x{ae4c}LVT, LV + \x{ad89}\x{ad89}LVT, LVT + \x{11fe}\x{1111}T, L + \x{11fe}\x{1169}T, V + \x{11fe}\x{ae4c}T, LV + \x{11fe}\x{ad89}T, LVT + *Test extend and spacing mark + \x{1111}\x{ae4c}\x{0711}L, LV, extend + \x{1111}\x{ae4c}\x{1b04}L, LV, spacing mark + \x{1111}\x{ae4c}\x{1b04}\x{0711}\x{1b04}L, LV, spacing mark, extend, spacing mark + *Test CR, LF, and control + \x0d\x{0711}CR, extend + \x0d\x{1b04}CR, spacingmark + \x0a\x{0711}LF, extend + \x0a\x{1b04}LF, spacingmark + \x0b\x{0711}Control, extend + \x09\x{1b04}Control, spacingmark + *There are no Prepend characters, so we can't test Prepend, CR + +/^(?>\X{2})X/8+ + \x{1111}\x{ae4c}\x{1111}\x{ae4c}X + +/^\X{2,4}X/8+ + \x{1111}\x{ae4c}\x{1111}\x{ae4c}X + \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X + \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X + +/^\X{2,4}?X/8+ + \x{1111}\x{ae4c}\x{1111}\x{ae4c}X + \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X + \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X + +/\X*Z/8Y + A\x{300} + +/\X*(.)/8Y + A\x{1111}\x{ae4c}\x{1169} + +/\X?abc/8Y +\xff\x7f\x00\x00\x03\x00\x41\xcc\x80\x41\x{300}\x61\x62\x63\x00\>06\? + +/-- --/ + +/\x{1e9e}+/8i + \x{1e9e}\x{00df} + +/[z\x{1e9e}]+/8i + \x{1e9e}\x{00df} + +/\x{00df}+/8i + \x{1e9e}\x{00df} + +/[z\x{00df}]+/8i + \x{1e9e}\x{00df} + +/\x{1f88}+/8i + \x{1f88}\x{1f80} + +/[z\x{1f88}]+/8i + \x{1f88}\x{1f80} + +/-- Characters with more than one other case; test in classes --/ + +/[z\x{00b5}]+/8i + \x{00b5}\x{039c}\x{03bc} + +/[z\x{039c}]+/8i + \x{00b5}\x{039c}\x{03bc} + +/[z\x{03bc}]+/8i + \x{00b5}\x{039c}\x{03bc} + +/[z\x{00c5}]+/8i + \x{00c5}\x{00e5}\x{212b} + +/[z\x{00e5}]+/8i + \x{00c5}\x{00e5}\x{212b} + +/[z\x{212b}]+/8i + \x{00c5}\x{00e5}\x{212b} + +/[z\x{01c4}]+/8i + \x{01c4}\x{01c5}\x{01c6} + +/[z\x{01c5}]+/8i + \x{01c4}\x{01c5}\x{01c6} + +/[z\x{01c6}]+/8i + \x{01c4}\x{01c5}\x{01c6} + +/[z\x{01c7}]+/8i + \x{01c7}\x{01c8}\x{01c9} + +/[z\x{01c8}]+/8i + \x{01c7}\x{01c8}\x{01c9} + +/[z\x{01c9}]+/8i + \x{01c7}\x{01c8}\x{01c9} + +/[z\x{01ca}]+/8i + \x{01ca}\x{01cb}\x{01cc} + +/[z\x{01cb}]+/8i + \x{01ca}\x{01cb}\x{01cc} + +/[z\x{01cc}]+/8i + \x{01ca}\x{01cb}\x{01cc} + +/[z\x{01f1}]+/8i + \x{01f1}\x{01f2}\x{01f3} + +/[z\x{01f2}]+/8i + \x{01f1}\x{01f2}\x{01f3} + +/[z\x{01f3}]+/8i + \x{01f1}\x{01f2}\x{01f3} + +/[z\x{0345}]+/8i + \x{0345}\x{0399}\x{03b9}\x{1fbe} + +/[z\x{0399}]+/8i + \x{0345}\x{0399}\x{03b9}\x{1fbe} + +/[z\x{03b9}]+/8i + \x{0345}\x{0399}\x{03b9}\x{1fbe} + +/[z\x{1fbe}]+/8i + \x{0345}\x{0399}\x{03b9}\x{1fbe} + +/[z\x{0392}]+/8i + \x{0392}\x{03b2}\x{03d0} + +/[z\x{03b2}]+/8i + \x{0392}\x{03b2}\x{03d0} + +/[z\x{03d0}]+/8i + \x{0392}\x{03b2}\x{03d0} + +/[z\x{0395}]+/8i + \x{0395}\x{03b5}\x{03f5} + +/[z\x{03b5}]+/8i + \x{0395}\x{03b5}\x{03f5} + +/[z\x{03f5}]+/8i + \x{0395}\x{03b5}\x{03f5} + +/[z\x{0398}]+/8i + \x{0398}\x{03b8}\x{03d1}\x{03f4} + +/[z\x{03b8}]+/8i + \x{0398}\x{03b8}\x{03d1}\x{03f4} + +/[z\x{03d1}]+/8i + \x{0398}\x{03b8}\x{03d1}\x{03f4} + +/[z\x{03f4}]+/8i + \x{0398}\x{03b8}\x{03d1}\x{03f4} + +/[z\x{039a}]+/8i + \x{039a}\x{03ba}\x{03f0} + +/[z\x{03ba}]+/8i + \x{039a}\x{03ba}\x{03f0} + +/[z\x{03f0}]+/8i + \x{039a}\x{03ba}\x{03f0} + +/[z\x{03a0}]+/8i + \x{03a0}\x{03c0}\x{03d6} + +/[z\x{03c0}]+/8i + \x{03a0}\x{03c0}\x{03d6} + +/[z\x{03d6}]+/8i + \x{03a0}\x{03c0}\x{03d6} + +/[z\x{03a1}]+/8i + \x{03a1}\x{03c1}\x{03f1} + +/[z\x{03c1}]+/8i + \x{03a1}\x{03c1}\x{03f1} + +/[z\x{03f1}]+/8i + \x{03a1}\x{03c1}\x{03f1} + +/[z\x{03a3}]+/8i + \x{03A3}\x{03C2}\x{03C3} + +/[z\x{03c2}]+/8i + \x{03A3}\x{03C2}\x{03C3} + +/[z\x{03c3}]+/8i + \x{03A3}\x{03C2}\x{03C3} + +/[z\x{03a6}]+/8i + \x{03a6}\x{03c6}\x{03d5} + +/[z\x{03c6}]+/8i + \x{03a6}\x{03c6}\x{03d5} + +/[z\x{03d5}]+/8i + \x{03a6}\x{03c6}\x{03d5} + +/[z\x{03c9}]+/8i + \x{03c9}\x{03a9}\x{2126} + +/[z\x{03a9}]+/8i + \x{03c9}\x{03a9}\x{2126} + +/[z\x{2126}]+/8i + \x{03c9}\x{03a9}\x{2126} + +/[z\x{1e60}]+/8i + \x{1e60}\x{1e61}\x{1e9b} + +/[z\x{1e61}]+/8i + \x{1e60}\x{1e61}\x{1e9b} + +/[z\x{1e9b}]+/8i + \x{1e60}\x{1e61}\x{1e9b} + +/-- Perl 5.12.4 gets these wrong, but 5.15.3 is OK --/ + +/[z\x{004b}]+/8i + \x{004b}\x{006b}\x{212a} + +/[z\x{006b}]+/8i + \x{004b}\x{006b}\x{212a} + +/[z\x{212a}]+/8i + \x{004b}\x{006b}\x{212a} + +/[z\x{0053}]+/8i + \x{0053}\x{0073}\x{017f} + +/[z\x{0073}]+/8i + \x{0053}\x{0073}\x{017f} + +/[z\x{017f}]+/8i + \x{0053}\x{0073}\x{017f} + +/-- --/ + +/(ΣΆΜΟΣ) \1/8i + ΣΆΜΟΣ ΣΆΜΟΣ + ΣΆΜΟΣ σάμος + σάμος σάμος + σάμος σάμοσ + σάμος ΣΆΜΟΣ + +/(σάμος) \1/8i + ΣΆΜΟΣ ΣΆΜΟΣ + ΣΆΜΟΣ σάμος + σάμος σάμος + σάμος σάμοσ + σάμος ΣΆΜΟΣ + +/(ΣΆΜΟΣ) \1*/8i + ΣΆΜΟΣ\x20 + ΣΆΜΟΣ ΣΆΜΟΣσάμοςσάμος + +/-- Perl matches these --/ + +/\x{00b5}+/8i + \x{00b5}\x{039c}\x{03bc} + +/\x{039c}+/8i + \x{00b5}\x{039c}\x{03bc} + +/\x{03bc}+/8i + \x{00b5}\x{039c}\x{03bc} + + +/\x{00c5}+/8i + \x{00c5}\x{00e5}\x{212b} + +/\x{00e5}+/8i + \x{00c5}\x{00e5}\x{212b} + +/\x{212b}+/8i + \x{00c5}\x{00e5}\x{212b} + + +/\x{01c4}+/8i + \x{01c4}\x{01c5}\x{01c6} + +/\x{01c5}+/8i + \x{01c4}\x{01c5}\x{01c6} + +/\x{01c6}+/8i + \x{01c4}\x{01c5}\x{01c6} + + +/\x{01c7}+/8i + \x{01c7}\x{01c8}\x{01c9} + +/\x{01c8}+/8i + \x{01c7}\x{01c8}\x{01c9} + +/\x{01c9}+/8i + \x{01c7}\x{01c8}\x{01c9} + + +/\x{01ca}+/8i + \x{01ca}\x{01cb}\x{01cc} + +/\x{01cb}+/8i + \x{01ca}\x{01cb}\x{01cc} + +/\x{01cc}+/8i + \x{01ca}\x{01cb}\x{01cc} + + +/\x{01f1}+/8i + \x{01f1}\x{01f2}\x{01f3} + +/\x{01f2}+/8i + \x{01f1}\x{01f2}\x{01f3} + +/\x{01f3}+/8i + \x{01f1}\x{01f2}\x{01f3} + + +/\x{0345}+/8i + \x{0345}\x{0399}\x{03b9}\x{1fbe} + +/\x{0399}+/8i + \x{0345}\x{0399}\x{03b9}\x{1fbe} + +/\x{03b9}+/8i + \x{0345}\x{0399}\x{03b9}\x{1fbe} + +/\x{1fbe}+/8i + \x{0345}\x{0399}\x{03b9}\x{1fbe} + + +/\x{0392}+/8i + \x{0392}\x{03b2}\x{03d0} + +/\x{03b2}+/8i + \x{0392}\x{03b2}\x{03d0} + +/\x{03d0}+/8i + \x{0392}\x{03b2}\x{03d0} + + +/\x{0395}+/8i + \x{0395}\x{03b5}\x{03f5} + +/\x{03b5}+/8i + \x{0395}\x{03b5}\x{03f5} + +/\x{03f5}+/8i + \x{0395}\x{03b5}\x{03f5} + + +/\x{0398}+/8i + \x{0398}\x{03b8}\x{03d1}\x{03f4} + +/\x{03b8}+/8i + \x{0398}\x{03b8}\x{03d1}\x{03f4} + +/\x{03d1}+/8i + \x{0398}\x{03b8}\x{03d1}\x{03f4} + +/\x{03f4}+/8i + \x{0398}\x{03b8}\x{03d1}\x{03f4} + + +/\x{039a}+/8i + \x{039a}\x{03ba}\x{03f0} + +/\x{03ba}+/8i + \x{039a}\x{03ba}\x{03f0} + +/\x{03f0}+/8i + \x{039a}\x{03ba}\x{03f0} + + +/\x{03a0}+/8i + \x{03a0}\x{03c0}\x{03d6} + +/\x{03c0}+/8i + \x{03a0}\x{03c0}\x{03d6} + +/\x{03d6}+/8i + \x{03a0}\x{03c0}\x{03d6} + + +/\x{03a1}+/8i + \x{03a1}\x{03c1}\x{03f1} + +/\x{03c1}+/8i + \x{03a1}\x{03c1}\x{03f1} + +/\x{03f1}+/8i + \x{03a1}\x{03c1}\x{03f1} + + +/\x{03a3}+/8i + \x{03A3}\x{03C2}\x{03C3} + +/\x{03c2}+/8i + \x{03A3}\x{03C2}\x{03C3} + +/\x{03c3}+/8i + \x{03A3}\x{03C2}\x{03C3} + + +/\x{03a6}+/8i + \x{03a6}\x{03c6}\x{03d5} + +/\x{03c6}+/8i + \x{03a6}\x{03c6}\x{03d5} + +/\x{03d5}+/8i + \x{03a6}\x{03c6}\x{03d5} + + +/\x{03c9}+/8i + \x{03c9}\x{03a9}\x{2126} + +/\x{03a9}+/8i + \x{03c9}\x{03a9}\x{2126} + +/\x{2126}+/8i + \x{03c9}\x{03a9}\x{2126} + + +/\x{1e60}+/8i + \x{1e60}\x{1e61}\x{1e9b} + +/\x{1e61}+/8i + \x{1e60}\x{1e61}\x{1e9b} + +/\x{1e9b}+/8i + \x{1e60}\x{1e61}\x{1e9b} + + +/\x{1e9e}+/8i + \x{1e9e}\x{00df} + +/\x{00df}+/8i + \x{1e9e}\x{00df} + + +/\x{1f88}+/8i + \x{1f88}\x{1f80} + +/\x{1f80}+/8i + \x{1f88}\x{1f80} + + +/-- Perl 5.12.4 gets these wrong, but 5.15.3 is OK --/ + +/\x{004b}+/8i + \x{004b}\x{006b}\x{212a} + +/\x{006b}+/8i + \x{004b}\x{006b}\x{212a} + +/\x{212a}+/8i + \x{004b}\x{006b}\x{212a} + + +/\x{0053}+/8i + \x{0053}\x{0073}\x{017f} + +/\x{0073}+/8i + \x{0053}\x{0073}\x{017f} + +/\x{017f}+/8i + \x{0053}\x{0073}\x{017f} + +/^\p{Any}*\d{4}/8 + 1234 + 123 + +/^\X*\w{4}/8 + 1234 + 123 + +/^A\s+Z/8W + A\x{2005}Z + A\x{85}\x{180e}\x{2005}Z + +/^A[\s]+Z/8W + A\x{2005}Z + A\x{85}\x{180e}\x{2005}Z + +/^[[:graph:]]+$/8W + Letter:ABC + Mark:\x{300}\x{1d172}\x{1d17b} + Number:9\x{660} + Punctuation:\x{66a},; + Symbol:\x{6de}<>\x{fffc} + Cf-property:\x{ad}\x{600}\x{601}\x{602}\x{603}\x{604}\x{6dd}\x{70f} + \x{200b}\x{200c}\x{200d}\x{200e}\x{200f} + \x{202a}\x{202b}\x{202c}\x{202d}\x{202e} + \x{2060}\x{2061}\x{2062}\x{2063}\x{2064} + \x{206a}\x{206b}\x{206c}\x{206d}\x{206e}\x{206f} + \x{feff} + \x{fff9}\x{fffa}\x{fffb} + \x{110bd} + \x{1d173}\x{1d174}\x{1d175}\x{1d176}\x{1d177}\x{1d178}\x{1d179}\x{1d17a} + \x{e0001} + \x{e0020}\x{e0030}\x{e0040}\x{e0050}\x{e0060}\x{e0070}\x{e007f} + ** Failers + \x{09} + \x{0a} + \x{1D} + \x{20} + \x{85} + \x{a0} + \x{61c} + \x{1680} + \x{180e} + \x{2028} + \x{2029} + \x{202f} + \x{2065} + \x{2066} + \x{2067} + \x{2068} + \x{2069} + \x{3000} + \x{e0002} + \x{e001f} + \x{e0080} + +/^[[:print:]]+$/8W + Space: \x{a0} + \x{1680}\x{2000}\x{2001}\x{2002}\x{2003}\x{2004}\x{2005} + \x{2006}\x{2007}\x{2008}\x{2009}\x{200a} + \x{202f}\x{205f} + \x{3000} + Letter:ABC + Mark:\x{300}\x{1d172}\x{1d17b} + Number:9\x{660} + Punctuation:\x{66a},; + Symbol:\x{6de}<>\x{fffc} + Cf-property:\x{ad}\x{600}\x{601}\x{602}\x{603}\x{604}\x{6dd}\x{70f} + \x{180e} + \x{200b}\x{200c}\x{200d}\x{200e}\x{200f} + \x{202a}\x{202b}\x{202c}\x{202d}\x{202e} + \x{202f} + \x{2060}\x{2061}\x{2062}\x{2063}\x{2064} + \x{206a}\x{206b}\x{206c}\x{206d}\x{206e}\x{206f} + \x{feff} + \x{fff9}\x{fffa}\x{fffb} + \x{110bd} + \x{1d173}\x{1d174}\x{1d175}\x{1d176}\x{1d177}\x{1d178}\x{1d179}\x{1d17a} + \x{e0001} + \x{e0020}\x{e0030}\x{e0040}\x{e0050}\x{e0060}\x{e0070}\x{e007f} + ** Failers + \x{09} + \x{1D} + \x{85} + \x{61c} + \x{2028} + \x{2029} + \x{2065} + \x{2066} + \x{2067} + \x{2068} + \x{2069} + \x{e0002} + \x{e001f} + \x{e0080} + +/^[[:punct:]]+$/8W + \$+<=>^`|~ + !\"#%&'()*,-./:;?@[\\]_{} + \x{a1}\x{a7} + \x{37e} + ** Failers + abcde + +/^[[:^graph:]]+$/8W + \x{09}\x{0a}\x{1D}\x{20}\x{85}\x{a0}\x{61c}\x{1680}\x{180e} + \x{2028}\x{2029}\x{202f}\x{2065}\x{2066}\x{2067}\x{2068}\x{2069} + \x{3000}\x{e0002}\x{e001f}\x{e0080} + ** Failers + Letter:ABC + Mark:\x{300}\x{1d172}\x{1d17b} + Number:9\x{660} + Punctuation:\x{66a},; + Symbol:\x{6de}<>\x{fffc} + Cf-property:\x{ad}\x{600}\x{601}\x{602}\x{603}\x{604}\x{6dd}\x{70f} + \x{200b}\x{200c}\x{200d}\x{200e}\x{200f} + \x{202a}\x{202b}\x{202c}\x{202d}\x{202e} + \x{2060}\x{2061}\x{2062}\x{2063}\x{2064} + \x{206a}\x{206b}\x{206c}\x{206d}\x{206e}\x{206f} + \x{feff} + \x{fff9}\x{fffa}\x{fffb} + \x{110bd} + \x{1d173}\x{1d174}\x{1d175}\x{1d176}\x{1d177}\x{1d178}\x{1d179}\x{1d17a} + \x{e0001} + \x{e0020}\x{e0030}\x{e0040}\x{e0050}\x{e0060}\x{e0070}\x{e007f} + +/^[[:^print:]]+$/8W + \x{09}\x{1D}\x{85}\x{61c}\x{2028}\x{2029}\x{2065}\x{2066}\x{2067} + \x{2068}\x{2069}\x{e0002}\x{e001f}\x{e0080} + ** Failers + Space: \x{a0} + \x{1680}\x{2000}\x{2001}\x{2002}\x{2003}\x{2004}\x{2005} + \x{2006}\x{2007}\x{2008}\x{2009}\x{200a} + \x{202f}\x{205f} + \x{3000} + Letter:ABC + Mark:\x{300}\x{1d172}\x{1d17b} + Number:9\x{660} + Punctuation:\x{66a},; + Symbol:\x{6de}<>\x{fffc} + Cf-property:\x{ad}\x{600}\x{601}\x{602}\x{603}\x{604}\x{6dd}\x{70f} + \x{180e} + \x{200b}\x{200c}\x{200d}\x{200e}\x{200f} + \x{202a}\x{202b}\x{202c}\x{202d}\x{202e} + \x{202f} + \x{2060}\x{2061}\x{2062}\x{2063}\x{2064} + \x{206a}\x{206b}\x{206c}\x{206d}\x{206e}\x{206f} + \x{feff} + \x{fff9}\x{fffa}\x{fffb} + \x{110bd} + \x{1d173}\x{1d174}\x{1d175}\x{1d176}\x{1d177}\x{1d178}\x{1d179}\x{1d17a} + \x{e0001} + \x{e0020}\x{e0030}\x{e0040}\x{e0050}\x{e0060}\x{e0070}\x{e007f} + +/^[[:^punct:]]+$/8W + abcde + ** Failers + \$+<=>^`|~ + !\"#%&'()*,-./:;?@[\\]_{} + \x{a1}\x{a7} + \x{37e} + +/[RST]+/8iW + Ss\x{17f} + +/[R-T]+/8iW + Ss\x{17f} + +/[q-u]+/8iW + Ss\x{17f} + +/^s?c/mi8 + scat + +/[A-`]/i8 + abcdefghijklmno + +/\C\X*QT/8 + Ó…\x0aT + +/[\pS#moq]/ + = + +/[[:punct:]]/8W + \xc2\xb4 + \x{b4} + +/[[:^ascii:]]/8W + \x{100} + \x{200} + \x{300} + \x{37e} + a + 9 + g + +/[[:^ascii:]\w]/8W + a + 9 + g + \x{100} + \x{200} + \x{300} + \x{37e} + +/[\w[:^ascii:]]/8W + a + 9 + g + \x{100} + \x{200} + \x{300} + \x{37e} + +/[^[:ascii:]\W]/8W + a + 9 + g + \x{100} + \x{200} + \x{300} + \x{37e} + +/[[:^ascii:]a]/8W + a + 9 + g + \x{100} + \x{200} + \x{37e} + +/[^[:^ascii:]\d]/8W + a + ~ + 0 + \a + \x{7f} + \x{389} + \x{20ac} + +/(?=.*b)\pL/ + 11bb + +/(?(?=.*b)(?=.*b)\pL|.*c)/ + 11bb + +/-- End of testinput6 --/ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput7 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput7 new file mode 100755 index 000000000..f44a810f0 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput7 @@ -0,0 +1,851 @@ +/-- These tests for Unicode property support test PCRE's API and show some of + the compiled code. They are not Perl-compatible. --/ + +/[\p{L}]/DZ + +/[\p{^L}]/DZ + +/[\P{L}]/DZ + +/[\P{^L}]/DZ + +/[abc\p{L}\x{0660}]/8DZ + +/[\p{Nd}]/8DZ + 1234 + +/[\p{Nd}+-]+/8DZ + 1234 + 12-34 + 12+\x{661}-34 + ** Failers + abcd + +/[\x{105}-\x{109}]/8iDZ + \x{104} + \x{105} + \x{109} + ** Failers + \x{100} + \x{10a} + +/[z-\x{100}]/8iDZ + Z + z + \x{39c} + \x{178} + | + \x{80} + \x{ff} + \x{100} + \x{101} + ** Failers + \x{102} + Y + y + +/[z-\x{100}]/8DZi + +/(?:[\PPa*]*){8,}/ + +/[\P{Any}]/BZ + +/[\P{Any}\E]/BZ + +/(\P{Yi}+\277)/ + +/(\P{Yi}+\277)?/ + +/(?<=\P{Yi}{3}A)X/ + +/\p{Yi}+(\P{Yi}+)(?1)/ + +/(\P{Yi}{2}\277)?/ + +/[\P{Yi}A]/ + +/[\P{Yi}\P{Yi}\P{Yi}A]/ + +/[^\P{Yi}A]/ + +/[^\P{Yi}\P{Yi}\P{Yi}A]/ + +/(\P{Yi}*\277)*/ + +/(\P{Yi}*?\277)*/ + +/(\p{Yi}*+\277)*/ + +/(\P{Yi}?\277)*/ + +/(\P{Yi}??\277)*/ + +/(\p{Yi}?+\277)*/ + +/(\P{Yi}{0,3}\277)*/ + +/(\P{Yi}{0,3}?\277)*/ + +/(\p{Yi}{0,3}+\277)*/ + +/\p{Zl}{2,3}+/8BZ + 

 + \x{2028}\x{2028}\x{2028} + +/\p{Zl}/8BZ + +/\p{Lu}{3}+/8BZ + +/\pL{2}+/8BZ + +/\p{Cc}{2}+/8BZ + +/^\p{Cf}/8 + \x{180e} + \x{061c} + \x{2066} + \x{2067} + \x{2068} + \x{2069} + +/^\p{Cs}/8 + \?\x{dfff} + ** Failers + \x{09f} + +/^\p{Mn}/8 + \x{1a1b} + +/^\p{Pe}/8 + \x{2309} + \x{230b} + +/^\p{Ps}/8 + \x{2308} + \x{230a} + +/^\p{Sc}+/8 + $\x{a2}\x{a3}\x{a4}\x{a5}\x{a6} + \x{9f2} + ** Failers + X + \x{2c2} + +/^\p{Zs}/8 + \ \ + \x{a0} + \x{1680} + \x{2000} + \x{2001} + ** Failers + \x{2028} + \x{200d} + +/-- These are here rather than in test 6 because Perl has problems with + the negative versions of the properties and behaves has changed how + it behaves for caseless matching. --/ + +/\p{^Lu}/8i + 1234 + ** Failers + ABC + +/\P{Lu}/8i + 1234 + ** Failers + ABC + +/\p{Ll}/8i + a + Az + ** Failers + ABC + +/\p{Lu}/8i + A + a\x{10a0}B + ** Failers + a + \x{1d00} + +/\p{Lu}/8i + A + aZ + ** Failers + abc + +/[\x{c0}\x{391}]/8i + \x{c0} + \x{e0} + +/-- The next two are special cases where the lengths of the different cases of +the same character differ. The first went wrong with heap frame storage; the +second was broken in all cases. --/ + +/^\x{023a}+?(\x{0130}+)/8i + \x{023a}\x{2c65}\x{0130} + +/^\x{023a}+([^X])/8i + \x{023a}\x{2c65}X + +/\x{c0}+\x{116}+/8i + \x{c0}\x{e0}\x{116}\x{117} + +/[\x{c0}\x{116}]+/8i + \x{c0}\x{e0}\x{116}\x{117} + +/(\x{de})\1/8i + \x{de}\x{de} + \x{de}\x{fe} + \x{fe}\x{fe} + \x{fe}\x{de} + +/^\x{c0}$/8i + \x{c0} + \x{e0} + +/^\x{e0}$/8i + \x{c0} + \x{e0} + +/-- The next two should be Perl-compatible, but it fails to match \x{e0}. PCRE +will match it only with UCP support, because without that it has no notion +of case for anything other than the ASCII letters. --/ + +/((?i)[\x{c0}])/8 + \x{c0} + \x{e0} + +/(?i:[\x{c0}])/8 + \x{c0} + \x{e0} + +/-- These are PCRE's extra properties to help with Unicodizing \d etc. --/ + +/^\p{Xan}/8 + ABCD + 1234 + \x{6ca} + \x{a6c} + \x{10a7} + ** Failers + _ABC + +/^\p{Xan}+/8 + ABCD1234\x{6ca}\x{a6c}\x{10a7}_ + ** Failers + _ABC + +/^\p{Xan}+?/8 + \x{6ca}\x{a6c}\x{10a7}_ + +/^\p{Xan}*/8 + ABCD1234\x{6ca}\x{a6c}\x{10a7}_ + +/^\p{Xan}{2,9}/8 + ABCD1234\x{6ca}\x{a6c}\x{10a7}_ + +/^\p{Xan}{2,9}?/8 + \x{6ca}\x{a6c}\x{10a7}_ + +/^[\p{Xan}]/8 + ABCD1234_ + 1234abcd_ + \x{6ca} + \x{a6c} + \x{10a7} + ** Failers + _ABC + +/^[\p{Xan}]+/8 + ABCD1234\x{6ca}\x{a6c}\x{10a7}_ + ** Failers + _ABC + +/^>\p{Xsp}/8 + >\x{1680}\x{2028}\x{0b} + >\x{a0} + ** Failers + \x{0b} + +/^>\p{Xsp}+/8 + > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + +/^>\p{Xsp}+?/8 + >\x{1680}\x{2028}\x{0b} + +/^>\p{Xsp}*/8 + > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + +/^>\p{Xsp}{2,9}/8 + > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + +/^>\p{Xsp}{2,9}?/8 + > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + +/^>[\p{Xsp}]/8 + >\x{2028}\x{0b} + +/^>[\p{Xsp}]+/8 + > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + +/^>\p{Xps}/8 + >\x{1680}\x{2028}\x{0b} + >\x{a0} + ** Failers + \x{0b} + +/^>\p{Xps}+/8 + > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + +/^>\p{Xps}+?/8 + >\x{1680}\x{2028}\x{0b} + +/^>\p{Xps}*/8 + > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + +/^>\p{Xps}{2,9}/8 + > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + +/^>\p{Xps}{2,9}?/8 + > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + +/^>[\p{Xps}]/8 + >\x{2028}\x{0b} + +/^>[\p{Xps}]+/8 + > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + +/^\p{Xwd}/8 + ABCD + 1234 + \x{6ca} + \x{a6c} + \x{10a7} + _ABC + ** Failers + [] + +/^\p{Xwd}+/8 + ABCD1234\x{6ca}\x{a6c}\x{10a7}_ + +/^\p{Xwd}+?/8 + \x{6ca}\x{a6c}\x{10a7}_ + +/^\p{Xwd}*/8 + ABCD1234\x{6ca}\x{a6c}\x{10a7}_ + +/^\p{Xwd}{2,9}/8 + A_B12\x{6ca}\x{a6c}\x{10a7} + +/^\p{Xwd}{2,9}?/8 + \x{6ca}\x{a6c}\x{10a7}_ + +/^[\p{Xwd}]/8 + ABCD1234_ + 1234abcd_ + \x{6ca} + \x{a6c} + \x{10a7} + _ABC + ** Failers + [] + +/^[\p{Xwd}]+/8 + ABCD1234\x{6ca}\x{a6c}\x{10a7}_ + +/-- A check not in UTF-8 mode --/ + +/^[\p{Xwd}]+/ + ABCD1234_ + +/-- Some negative checks --/ + +/^[\P{Xwd}]+/8 + !.+\x{019}\x{35a}AB + +/^[\p{^Xwd}]+/8 + !.+\x{019}\x{35a}AB + +/[\D]/WBZ8 + 1\x{3c8}2 + +/[\d]/WBZ8 + >\x{6f4}< + +/[\S]/WBZ8 + \x{1680}\x{6f4}\x{1680} + +/[\s]/WBZ8 + >\x{1680}< + +/[\W]/WBZ8 + A\x{1712}B + +/[\w]/WBZ8 + >\x{1723}< + +/\D/WBZ8 + 1\x{3c8}2 + +/\d/WBZ8 + >\x{6f4}< + +/\S/WBZ8 + \x{1680}\x{6f4}\x{1680} + +/\s/WBZ8 + >\x{1680}> + +/\W/WBZ8 + A\x{1712}B + +/\w/WBZ8 + >\x{1723}< + +/[[:alpha:]]/WBZ + +/[[:lower:]]/WBZ + +/[[:upper:]]/WBZ + +/[[:alnum:]]/WBZ + +/[[:ascii:]]/WBZ + +/[[:cntrl:]]/WBZ + +/[[:digit:]]/WBZ + +/[[:graph:]]/WBZ + +/[[:print:]]/WBZ + +/[[:punct:]]/WBZ + +/[[:space:]]/WBZ + +/[[:word:]]/WBZ + +/[[:xdigit:]]/WBZ + +/-- Unicode properties for \b abd \B --/ + +/\b...\B/8W + abc_ + \x{37e}abc\x{376} + \x{37e}\x{376}\x{371}\x{393}\x{394} + !\x{c0}++\x{c1}\x{c2} + !\x{c0}+++++ + +/-- Without PCRE_UCP, non-ASCII always fail, even if < 256 --/ + +/\b...\B/8 + abc_ + ** Failers + \x{37e}abc\x{376} + \x{37e}\x{376}\x{371}\x{393}\x{394} + !\x{c0}++\x{c1}\x{c2} + !\x{c0}+++++ + +/-- With PCRE_UCP, non-UTF8 chars that are < 256 still check properties --/ + +/\b...\B/W + abc_ + !\x{c0}++\x{c1}\x{c2} + !\x{c0}+++++ + +/-- Some of these are silly, but they check various combinations --/ + +/[[:^alpha:][:^cntrl:]]+/8WBZ + 123 + abc + +/[[:^cntrl:][:^alpha:]]+/8WBZ + 123 + abc + +/[[:alpha:]]+/8WBZ + abc + +/[[:^alpha:]\S]+/8WBZ + 123 + abc + +/[^\d]+/8WBZ + abc123 + abc\x{123} + \x{660}abc + +/\p{Lu}+9\p{Lu}+B\p{Lu}+b/BZ + +/\p{^Lu}+9\p{^Lu}+B\p{^Lu}+b/BZ + +/\P{Lu}+9\P{Lu}+B\P{Lu}+b/BZ + +/\p{Han}+X\p{Greek}+\x{370}/BZ8 + +/\p{Xan}+!\p{Xan}+A/BZ + +/\p{Xsp}+!\p{Xsp}\t/BZ + +/\p{Xps}+!\p{Xps}\t/BZ + +/\p{Xwd}+!\p{Xwd}_/BZ + +/A+\p{N}A+\dB+\p{N}*B+\d*/WBZ + +/-- These behaved oddly in Perl, so they are kept in this test --/ + +/(\x{23a}\x{23a}\x{23a})?\1/8i + \x{23a}\x{23a}\x{23a}\x{2c65}\x{2c65} + +/(ȺȺȺ)?\1/8i + ȺȺȺⱥⱥ + +/(\x{23a}\x{23a}\x{23a})?\1/8i + \x{23a}\x{23a}\x{23a}\x{2c65}\x{2c65}\x{2c65} + +/(ȺȺȺ)?\1/8i + ȺȺȺⱥⱥⱥ + +/(\x{23a}\x{23a}\x{23a})\1/8i + \x{23a}\x{23a}\x{23a}\x{2c65}\x{2c65} + +/(ȺȺȺ)\1/8i + ȺȺȺⱥⱥ + +/(\x{23a}\x{23a}\x{23a})\1/8i + \x{23a}\x{23a}\x{23a}\x{2c65}\x{2c65}\x{2c65} + +/(ȺȺȺ)\1/8i + ȺȺȺⱥⱥⱥ + +/(\x{2c65}\x{2c65})\1/8i + \x{2c65}\x{2c65}\x{23a}\x{23a} + +/(ⱥⱥ)\1/8i + ⱥⱥȺȺ + +/(\x{23a}\x{23a}\x{23a})\1Y/8i + X\x{23a}\x{23a}\x{23a}\x{2c65}\x{2c65}\x{2c65}YZ + +/(\x{2c65}\x{2c65})\1Y/8i + X\x{2c65}\x{2c65}\x{23a}\x{23a}YZ + +/-- --/ + +/-- These scripts weren't yet in Perl when I added Unicode 6.0.0 to PCRE --/ + +/^[\p{Batak}]/8 + \x{1bc0} + \x{1bff} + ** Failers + \x{1bf4} + +/^[\p{Brahmi}]/8 + \x{11000} + \x{1106f} + ** Failers + \x{1104e} + +/^[\p{Mandaic}]/8 + \x{840} + \x{85e} + ** Failers + \x{85c} + \x{85d} + +/-- --/ + +/(\X*)(.)/s8 + A\x{300} + +/^S(\X*)e(\X*)$/8 + SteÌreÌo + +/^\X/8 + ÌreÌo + +/^a\X41z/ + aX41z + *** Failers + aAz + +/(?<=ab\Cde)X/8 + +/\X/ + a\P + a\P\P + +/\Xa/ + aa\P + aa\P\P + +/\X{2}/ + aa\P + aa\P\P + +/\X+a/ + a\P + aa\P + aa\P\P + +/\X+?a/ + a\P + ab\P + aa\P + aa\P\P + aba\P + +/-- These Unicode 6.1.0 scripts are not known to Perl. --/ + +/\p{Chakma}\d/8W + \x{11100}\x{1113c} + +/\p{Takri}\d/8W + \x{11680}\x{116c0} + +/^\X/8 + A\P + A\P\P + A\x{300}\x{301}\P + A\x{300}\x{301}\P\P + A\x{301}\P + A\x{301}\P\P + +/^\X{2,3}/8 + A\P + A\P\P + AA\P + AA\P\P + A\x{300}\x{301}\P + A\x{300}\x{301}\P\P + A\x{300}\x{301}A\x{300}\x{301}\P + A\x{300}\x{301}A\x{300}\x{301}\P\P + +/^\X{2}/8 + AA\P + AA\P\P + A\x{300}\x{301}A\x{300}\x{301}\P + A\x{300}\x{301}A\x{300}\x{301}\P\P + +/^\X+/8 + AA\P + AA\P\P + +/^\X+?Z/8 + AA\P + AA\P\P + +/A\x{3a3}B/8iDZ + +/\x{3a3}B/8iDZ + +/[\x{3a3}]/8iBZ + +/[^\x{3a3}]/8iBZ + +/[\x{3a3}]+/8iBZ + +/[^\x{3a3}]+/8iBZ + +/a*\x{3a3}/8iBZ + +/\x{3a3}+a/8iBZ + +/\x{3a3}*\x{3c2}/8iBZ + +/\x{3a3}{3}/8i+ + \x{3a3}\x{3c3}\x{3c2}\x{3a3}\x{3c3}\x{3c2} + +/\x{3a3}{2,4}/8i+ + \x{3a3}\x{3c3}\x{3c2}\x{3a3}\x{3c3}\x{3c2} + +/\x{3a3}{2,4}?/8i+ + \x{3a3}\x{3c3}\x{3c2}\x{3a3}\x{3c3}\x{3c2} + +/\x{3a3}+./8i+ + \x{3a3}\x{3c3}\x{3c2}\x{3a3}\x{3c3}\x{3c2} + +/\x{3a3}++./8i+ + ** Failers + \x{3a3}\x{3c3}\x{3c2}\x{3a3}\x{3c3}\x{3c2} + +/\x{3a3}*\x{3c2}/8iBZ + +/[^\x{3a3}]*\x{3c2}/8iBZ + +/[^a]*\x{3c2}/8iBZ + +/ist/8iBZ + ikt + +/is+t/8i + iSs\x{17f}t + ikt + +/is+?t/8i + ikt + +/is?t/8i + ikt + +/is{2}t/8i + iskt + +/-- This property is a PCRE special --/ + +/^\p{Xuc}/8 + $abc + @abc + `abc + \x{1234}abc + ** Failers + abc + +/^\p{Xuc}+/8 + $@`\x{a0}\x{1234}\x{e000}** + ** Failers + \x{9f} + +/^\p{Xuc}+?/8 + $@`\x{a0}\x{1234}\x{e000}** + ** Failers + \x{9f} + +/^\p{Xuc}+?\*/8 + $@`\x{a0}\x{1234}\x{e000}** + ** Failers + \x{9f} + +/^\p{Xuc}++/8 + $@`\x{a0}\x{1234}\x{e000}** + ** Failers + \x{9f} + +/^\p{Xuc}{3,5}/8 + $@`\x{a0}\x{1234}\x{e000}** + ** Failers + \x{9f} + +/^\p{Xuc}{3,5}?/8 + $@`\x{a0}\x{1234}\x{e000}** + ** Failers + \x{9f} + +/^[\p{Xuc}]/8 + $@`\x{a0}\x{1234}\x{e000}** + ** Failers + \x{9f} + +/^[\p{Xuc}]+/8 + $@`\x{a0}\x{1234}\x{e000}** + ** Failers + \x{9f} + +/^\P{Xuc}/8 + abc + ** Failers + $abc + @abc + `abc + \x{1234}abc + +/^[\P{Xuc}]/8 + abc + ** Failers + $abc + @abc + `abc + \x{1234}abc + +/-- Some auto-possessification tests --/ + +/\pN+\z/BZ + +/\PN+\z/BZ + +/\pN+/BZ + +/\PN+/BZ + +/\p{Any}+\p{Any} \p{Any}+\P{Any} \p{Any}+\p{L&} \p{Any}+\p{L} \p{Any}+\p{Lu} \p{Any}+\p{Han} \p{Any}+\p{Xan} \p{Any}+\p{Xsp} \p{Any}+\p{Xps} \p{Xwd}+\p{Any} \p{Any}+\p{Xuc}/BWZx + +/\p{L&}+\p{Any} \p{L&}+\p{L&} \P{L&}+\p{L&} \p{L&}+\p{L} \p{L&}+\p{Lu} \p{L&}+\p{Han} \p{L&}+\p{Xan} \p{L&}+\P{Xan} \p{L&}+\p{Xsp} \p{L&}+\p{Xps} \p{Xwd}+\p{L&} \p{L&}+\p{Xuc}/BWZx + +/\p{N}+\p{Any} \p{N}+\p{L&} \p{N}+\p{L} \p{N}+\P{L} \p{N}+\P{N} \p{N}+\p{Lu} \p{N}+\p{Han} \p{N}+\p{Xan} \p{N}+\p{Xsp} \p{N}+\p{Xps} \p{Xwd}+\p{N} \p{N}+\p{Xuc}/BWZx + +/\p{Lu}+\p{Any} \p{Lu}+\p{L&} \p{Lu}+\p{L} \p{Lu}+\p{Lu} \P{Lu}+\p{Lu} \p{Lu}+\p{Nd} \p{Lu}+\P{Nd} \p{Lu}+\p{Han} \p{Lu}+\p{Xan} \p{Lu}+\p{Xsp} \p{Lu}+\p{Xps} \p{Xwd}+\p{Lu} \p{Lu}+\p{Xuc}/BWZx + +/\p{Han}+\p{Lu} \p{Han}+\p{L&} \p{Han}+\p{L} \p{Han}+\p{Lu} \p{Han}+\p{Arabic} \p{Arabic}+\p{Arabic} \p{Han}+\p{Xan} \p{Han}+\p{Xsp} \p{Han}+\p{Xps} \p{Xwd}+\p{Han} \p{Han}+\p{Xuc}/BWZx + +/\p{Xan}+\p{Any} \p{Xan}+\p{L&} \P{Xan}+\p{L&} \p{Xan}+\p{L} \p{Xan}+\p{Lu} \p{Xan}+\p{Han} \p{Xan}+\p{Xan} \p{Xan}+\P{Xan} \p{Xan}+\p{Xsp} \p{Xan}+\p{Xps} \p{Xwd}+\p{Xan} \p{Xan}+\p{Xuc}/BWZx + +/\p{Xsp}+\p{Any} \p{Xsp}+\p{L&} \p{Xsp}+\p{L} \p{Xsp}+\p{Lu} \p{Xsp}+\p{Han} \p{Xsp}+\p{Xan} \p{Xsp}+\p{Xsp} \P{Xsp}+\p{Xsp} \p{Xsp}+\p{Xps} \p{Xwd}+\p{Xsp} \p{Xsp}+\p{Xuc}/BWZx + +/\p{Xwd}+\p{Any} \p{Xwd}+\p{L&} \p{Xwd}+\p{L} \p{Xwd}+\p{Lu} \p{Xwd}+\p{Han} \p{Xwd}+\p{Xan} \p{Xwd}+\p{Xsp} \p{Xwd}+\p{Xps} \p{Xwd}+\p{Xwd} \p{Xwd}+\P{Xwd} \p{Xwd}+\p{Xuc}/BWZx + +/\p{Xuc}+\p{Any} \p{Xuc}+\p{L&} \p{Xuc}+\p{L} \p{Xuc}+\p{Lu} \p{Xuc}+\p{Han} \p{Xuc}+\p{Xan} \p{Xuc}+\p{Xsp} \p{Xuc}+\p{Xps} \p{Xwd}+\p{Xuc} \p{Xuc}+\p{Xuc} \p{Xuc}+\P{Xuc}/BWZx + +/\p{N}+\p{Ll} \p{N}+\p{Nd} \p{N}+\P{Nd}/BWZx + +/\p{Xan}+\p{L} \p{Xan}+\p{N} \p{Xan}+\p{C} \p{Xan}+\P{L} \P{Xan}+\p{N} \p{Xan}+\P{C}/BWZx + +/\p{L}+\p{Xan} \p{N}+\p{Xan} \p{C}+\p{Xan} \P{L}+\p{Xan} \p{N}+\p{Xan} \P{C}+\p{Xan} \p{L}+\P{Xan}/BWZx + +/\p{Xan}+\p{Lu} \p{Xan}+\p{Nd} \p{Xan}+\p{Cc} \p{Xan}+\P{Ll} \P{Xan}+\p{No} \p{Xan}+\P{Cf}/BWZx + +/\p{Lu}+\p{Xan} \p{Nd}+\p{Xan} \p{Cs}+\p{Xan} \P{Lt}+\p{Xan} \p{Nl}+\p{Xan} \P{Cc}+\p{Xan} \p{Lt}+\P{Xan}/BWZx + +/\w+\p{P} \w+\p{Po} \w+\s \p{Xan}+\s \s+\p{Xan} \s+\w/BWZx + +/\w+\P{P} \W+\p{Po} \w+\S \P{Xan}+\s \s+\P{Xan} \s+\W/BWZx + +/\w+\p{Po} \w+\p{Pc} \W+\p{Po} \W+\p{Pc} \w+\P{Po} \w+\P{Pc}/BWZx + +/\p{Nl}+\p{Xan} \P{Nl}+\p{Xan} \p{Nl}+\P{Xan} \P{Nl}+\P{Xan}/BWZx + +/\p{Xan}+\p{Nl} \P{Xan}+\p{Nl} \p{Xan}+\P{Nl} \P{Xan}+\P{Nl}/BWZx + +/\p{Xan}+\p{Nd} \P{Xan}+\p{Nd} \p{Xan}+\P{Nd} \P{Xan}+\P{Nd}/BWZx + +/-- End auto-possessification tests --/ + +/\w+/8CWBZ + abcd + +/[\p{N}]?+/BZO + +/[\p{L}ab]{2,3}+/BZO + +/\D+\X \d+\X \S+\X \s+\X \W+\X \w+\X \C+\X \R+\X \H+\X \h+\X \V+\X \v+\X a+\X \n+\X .+\X/BZx + +/.+\X/BZxs + +/\X+$/BZxm + +/\X+\D \X+\d \X+\S \X+\s \X+\W \X+\w \X+. \X+\C \X+\R \X+\H \X+\h \X+\V \X+\v \X+\X \X+\Z \X+\z \X+$/BZx + +/\d+\s{0,5}=\s*\S?=\w{0,4}\W*/8WBZ + +/[RST]+/8iWBZ + +/[R-T]+/8iWBZ + +/[Q-U]+/8iWBZ + +/^s?c/mi8I + scat + +/a[[:punct:]b]/WBZ + +/a[[:punct:]b]/8WBZ + +/a[b[:punct:]]/8WBZ + +/L(?#(|++3 + *** Failers + xyzabc + xyzabc\>2 + +/x\dy\Dz/ + x9yzz + x0y+z + *** Failers + xyz + xxy0z + +/x\sy\Sz/ + x yzz + x y+z + *** Failers + xyz + xxyyz + +/x\wy\Wz/ + xxy+z + *** Failers + xxy0z + x+y+z + +/x.y/ + x+y + x-y + *** Failers + x\ny + +/x.y/s + x+y + x-y + x\ny + +/(a.b(?s)c.d|x.y)p.q/ + a+bc+dp+q + a+bc\ndp+q + x\nyp+q + *** Failers + a\nbc\ndp+q + a+bc\ndp\nq + x\nyp\nq + +/a\d\z/ + ba0 + *** Failers + ba0\n + ba0\ncd + +/a\d\z/m + ba0 + *** Failers + ba0\n + ba0\ncd + +/a\d\Z/ + ba0 + ba0\n + *** Failers + ba0\ncd + +/a\d\Z/m + ba0 + ba0\n + *** Failers + ba0\ncd + +/a\d$/ + ba0 + ba0\n + *** Failers + ba0\ncd + +/a\d$/m + ba0 + ba0\n + ba0\ncd + *** Failers + +/abc/i + abc + aBc + ABC + +/[^a]/ + abcd + +/ab?\w/ + abz + abbz + azz + +/x{0,3}yz/ + ayzq + axyzq + axxyz + axxxyzq + axxxxyzq + *** Failers + ax + axx + +/x{3}yz/ + axxxyzq + axxxxyzq + *** Failers + ax + axx + ayzq + axyzq + axxyz + +/x{2,3}yz/ + axxyz + axxxyzq + axxxxyzq + *** Failers + ax + axx + ayzq + axyzq + +/[^a]+/O + bac + bcdefax + *** Failers + aaaaa + +/[^a]*/O + bac + bcdefax + *** Failers + aaaaa + +/[^a]{3,5}/O + xyz + awxyza + abcdefa + abcdefghijk + *** Failers + axya + axa + aaaaa + +/\d*/ + 1234b567 + xyz + +/\D*/ + a1234b567 + xyz + +/\d+/ + ab1234c56 + *** Failers + xyz + +/\D+/ + ab123c56 + *** Failers + 789 + +/\d?A/ + 045ABC + ABC + *** Failers + XYZ + +/\D?A/ + ABC + BAC + 9ABC + *** Failers + +/a+/ + aaaa + +/^.*xyz/ + xyz + ggggggggxyz + +/^.+xyz/ + abcdxyz + axyz + *** Failers + xyz + +/^.?xyz/ + xyz + cxyz + +/^\d{2,3}X/ + 12X + 123X + *** Failers + X + 1X + 1234X + +/^[abcd]\d/ + a45 + b93 + c99z + d04 + *** Failers + e45 + abcd + abcd1234 + 1234 + +/^[abcd]*\d/ + a45 + b93 + c99z + d04 + abcd1234 + 1234 + *** Failers + e45 + abcd + +/^[abcd]+\d/ + a45 + b93 + c99z + d04 + abcd1234 + *** Failers + 1234 + e45 + abcd + +/^a+X/ + aX + aaX + +/^[abcd]?\d/ + a45 + b93 + c99z + d04 + 1234 + *** Failers + abcd1234 + e45 + +/^[abcd]{2,3}\d/ + ab45 + bcd93 + *** Failers + 1234 + a36 + abcd1234 + ee45 + +/^(abc)*\d/ + abc45 + abcabcabc45 + 42xyz + *** Failers + +/^(abc)+\d/ + abc45 + abcabcabc45 + *** Failers + 42xyz + +/^(abc)?\d/ + abc45 + 42xyz + *** Failers + abcabcabc45 + +/^(abc){2,3}\d/ + abcabc45 + abcabcabc45 + *** Failers + abcabcabcabc45 + abc45 + 42xyz + +/1(abc|xyz)2(?1)3/ + 1abc2abc3456 + 1abc2xyz3456 + +/^(a*\w|ab)=(a*\w|ab)/ + ab=ab + +/^(a*\w|ab)=(?1)/ + ab=ab + +/^([^()]|\((?1)*\))*$/ + abc + a(b)c + a(b(c))d + *** Failers) + a(b(c)d + +/^>abc>([^()]|\((?1)*\))*abc>123abc>1(2)3abc>(1(2)3)a*)\d/ + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9876 + *** Failers + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + +/< (?: (?(R) \d++ | [^<>]*+) | (?R)) * >/x + <> + + hij> + hij> + def> + + *** Failers + 3 + *** Failers + defabcxyz + +/^abcdef/ + ab\P + abcde\P + abcdef\P + *** Failers + abx\P + +/^a{2,4}\d+z/ + a\P + aa\P + aa2\P + aaa\P + aaa23\P + aaaa12345\P + aa0z\P + aaaa4444444444444z\P + *** Failers + az\P + aaaaa\P + a56\P + +/^abcdef/ + abc\P + def\R + +/(?<=foo)bar/ + xyzfo\P + foob\P\>2 + foobar...\R\P\>4 + xyzfo\P + foobar\>2 + *** Failers + xyzfo\P + obar\R + +/(ab*(cd|ef))+X/ + adfadadaklhlkalkajhlkjahdfasdfasdfladsfjkj\P\Z + lkjhlkjhlkjhlkjhabbbbbbcdaefabbbbbbbefa\P\B\Z + cdabbbbbbbb\P\R\B\Z + efabbbbbbbbbbbbbbbb\P\R\B\Z + bbbbbbbbbbbbcdXyasdfadf\P\R\B\Z + +/(a|b)/SF>testsavedregex +>>aaabxyzpqrrrabbxyyyypqAzz + >aaaabxyzpqrrrabbxyyyypqAzz + >>>>abcxyzpqrrrabbxyyyypqAzz + *** Failers + abxyzpqrrabbxyyyypqAzz + abxyzpqrrrrabbxyyyypqAzz + abxyzpqrrrabxyyyypqAzz + aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz + aaaabcxyzzzzpqrrrabbbxyyypqAzz + aaabcxyzpqrrrabbxyyyypqqqqqqqAzz + +/^(abc){1,2}zz/ + abczz + abcabczz + *** Failers + zz + abcabcabczz + >>abczz + +/^(b+?|a){1,2}?c/ + bc + bbc + bbbc + bac + bbac + aac + abbbbbbbbbbbc + bbbbbbbbbbbac + *** Failers + aaac + abbbbbbbbbbbac + +/^(b+|a){1,2}c/ + bc + bbc + bbbc + bac + bbac + aac + abbbbbbbbbbbc + bbbbbbbbbbbac + *** Failers + aaac + abbbbbbbbbbbac + +/^(b+|a){1,2}?bc/ + bbc + +/^(b*|ba){1,2}?bc/ + babc + bbabc + bababc + *** Failers + bababbc + babababc + +/^(ba|b*){1,2}?bc/ + babc + bbabc + bababc + *** Failers + bababbc + babababc + +/^\ca\cA\c[\c{\c:/ + \x01\x01\e;z + +/^[ab\]cde]/ + athing + bthing + ]thing + cthing + dthing + ething + *** Failers + fthing + [thing + \\thing + +/^[]cde]/ + ]thing + cthing + dthing + ething + *** Failers + athing + fthing + +/^[^ab\]cde]/ + fthing + [thing + \\thing + *** Failers + athing + bthing + ]thing + cthing + dthing + ething + +/^[^]cde]/ + athing + fthing + *** Failers + ]thing + cthing + dthing + ething + +/^\/ + + +/^ÿ/ + ÿ + +/^[0-9]+$/ + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 100 + *** Failers + abc + +/^.*nter/ + enter + inter + uponter + +/^xxx[0-9]+$/ + xxx0 + xxx1234 + *** Failers + xxx + +/^.+[0-9][0-9][0-9]$/ + x123 + xx123 + 123456 + *** Failers + 123 + x1234 + +/^.+?[0-9][0-9][0-9]$/ + x123 + xx123 + 123456 + *** Failers + 123 + x1234 + +/^([^!]+)!(.+)=apquxz\.ixr\.zzz\.ac\.uk$/ + abc!pqr=apquxz.ixr.zzz.ac.uk + *** Failers + !pqr=apquxz.ixr.zzz.ac.uk + abc!=apquxz.ixr.zzz.ac.uk + abc!pqr=apquxz:ixr.zzz.ac.uk + abc!pqr=apquxz.ixr.zzz.ac.ukk + +/:/ + Well, we need a colon: somewhere + *** Fail if we don't + +/([\da-f:]+)$/i + 0abc + abc + fed + E + :: + 5f03:12C0::932e + fed def + Any old stuff + *** Failers + 0zzz + gzzz + fed\x20 + Any old rubbish + +/^.*\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/ + .1.2.3 + A.12.123.0 + *** Failers + .1.2.3333 + 1.2.3 + 1234.2.3 + +/^(\d+)\s+IN\s+SOA\s+(\S+)\s+(\S+)\s*\(\s*$/ + 1 IN SOA non-sp1 non-sp2( + 1 IN SOA non-sp1 non-sp2 ( + *** Failers + 1IN SOA non-sp1 non-sp2( + +/^[a-zA-Z\d][a-zA-Z\d\-]*(\.[a-zA-Z\d][a-zA-z\d\-]*)*\.$/ + a. + Z. + 2. + ab-c.pq-r. + sxk.zzz.ac.uk. + x-.y-. + *** Failers + -abc.peq. + +/^\*\.[a-z]([a-z\-\d]*[a-z\d]+)?(\.[a-z]([a-z\-\d]*[a-z\d]+)?)*$/ + *.a + *.b0-a + *.c3-b.c + *.c-a.b-c + *** Failers + *.0 + *.a- + *.a-b.c- + *.c-a.0-c + +/^(?=ab(de))(abd)(e)/ + abde + +/^(?!(ab)de|x)(abd)(f)/ + abdf + +/^(?=(ab(cd)))(ab)/ + abcd + +/^[\da-f](\.[\da-f])*$/i + a.b.c.d + A.B.C.D + a.b.c.1.2.3.C + +/^\".*\"\s*(;.*)?$/ + \"1234\" + \"abcd\" ; + \"\" ; rhubarb + *** Failers + \"1234\" : things + +/^$/ + \ + *** Failers + +/ ^ a (?# begins with a) b\sc (?# then b c) $ (?# then end)/x + ab c + *** Failers + abc + ab cde + +/(?x) ^ a (?# begins with a) b\sc (?# then b c) $ (?# then end)/ + ab c + *** Failers + abc + ab cde + +/^ a\ b[c ]d $/x + a bcd + a b d + *** Failers + abcd + ab d + +/^(a(b(c)))(d(e(f)))(h(i(j)))(k(l(m)))$/ + abcdefhijklm + +/^(?:a(b(c)))(?:d(e(f)))(?:h(i(j)))(?:k(l(m)))$/ + abcdefhijklm + +/^[\w][\W][\s][\S][\d][\D][\b][\n][\c]][\022]/ + a+ Z0+\x08\n\x1d\x12 + +/^[.^$|()*+?{,}]+/ + .^\$(*+)|{?,?} + +/^a*\w/ + z + az + aaaz + a + aa + aaaa + a+ + aa+ + +/^a*?\w/ + z + az + aaaz + a + aa + aaaa + a+ + aa+ + +/^a+\w/ + az + aaaz + aa + aaaa + aa+ + +/^a+?\w/ + az + aaaz + aa + aaaa + aa+ + +/^\d{8}\w{2,}/ + 1234567890 + 12345678ab + 12345678__ + *** Failers + 1234567 + +/^[aeiou\d]{4,5}$/ + uoie + 1234 + 12345 + aaaaa + *** Failers + 123456 + +/^[aeiou\d]{4,5}?/ + uoie + 1234 + 12345 + aaaaa + 123456 + +/^From +([^ ]+) +[a-zA-Z][a-zA-Z][a-zA-Z] +[a-zA-Z][a-zA-Z][a-zA-Z] +[0-9]?[0-9] +[0-9][0-9]:[0-9][0-9]/ + From abcd Mon Sep 01 12:33:02 1997 + +/^From\s+\S+\s+([a-zA-Z]{3}\s+){2}\d{1,2}\s+\d\d:\d\d/ + From abcd Mon Sep 01 12:33:02 1997 + From abcd Mon Sep 1 12:33:02 1997 + *** Failers + From abcd Sep 01 12:33:02 1997 + +/^12.34/s + 12\n34 + 12\r34 + +/\w+(?=\t)/ + the quick brown\t fox + +/foo(?!bar)(.*)/ + foobar is foolish see? + +/(?:(?!foo)...|^.{0,2})bar(.*)/ + foobar crowbar etc + barrel + 2barrel + A barrel + +/^(\D*)(?=\d)(?!123)/ + abc456 + *** Failers + abc123 + +/^1234(?# test newlines + inside)/ + 1234 + +/^1234 #comment in extended re + /x + 1234 + +/#rhubarb + abcd/x + abcd + +/^abcd#rhubarb/x + abcd + +/(?!^)abc/ + the abc + *** Failers + abc + +/(?=^)abc/ + abc + *** Failers + the abc + +/^[ab]{1,3}(ab*|b)/O + aabbbbb + +/^[ab]{1,3}?(ab*|b)/O + aabbbbb + +/^[ab]{1,3}?(ab*?|b)/O + aabbbbb + +/^[ab]{1,3}(ab*?|b)/O + aabbbbb + +/ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # optional leading comment +(?: (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # initial word +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) )* # further okay, if led by a period +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] | # atom and space parts, or... +\( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) | # comments, or... + +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +# quoted strings +)* +< (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # leading < +(?: @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* + +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* , (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* )? # optional route +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # initial word +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) )* # further okay, if led by a period +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +# address spec +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* > # trailing > +# name and address +) (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # optional trailing comment +/x + Alan Other + + user\@dom.ain + \"A. Other\" (a comment) + A. Other (a comment) + \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay + A missing angle @,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +# Quoted string +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +# Quoted string +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +# Quoted string +) +# leading word +[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] * # "normal" atoms and or spaces +(?: +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +| +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +) # "special" comment or quoted string +[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] * # more "normal" +)* +< +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +@ +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +# Quoted string +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +# Quoted string +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +) +/x + Alan Other + + user\@dom.ain + \"A. Other\" (a comment) + A. Other (a comment) + \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay + A missing angle + a\rb + *** Failers + a\nb + +/abc$/ + abc + abc\n + *** Failers + abc\ndef + +/(abc)\123/ + abc\x53 + +/(abc)\223/ + abc\x93 + +/(abc)\323/ + abc\xd3 + +/(abc)\100/ + abc\x40 + abc\100 + +/(abc)\1000/ + abc\x400 + abc\x40\x30 + abc\1000 + abc\100\x30 + abc\100\060 + abc\100\60 + +/^A\8B\9C$/ + A8B9C + *** Failers + A\08B\09C + +/^[A\8B\9C]+$/ + A8B9C + *** Failers + A8B9C\x00 + +/(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\12\123/ + abcdefghijk\12S + +/ab\idef/ + abidef + +/a{0}bc/ + bc + +/(a|(bc)){0,0}?xyz/ + xyz + +/abc[\10]de/ + abc\010de + +/abc[\1]de/ + abc\1de + +/(abc)[\1]de/ + abc\1de + +/(?s)a.b/ + a\nb + +/^([^a])([^\b])([^c]*)([^d]{3,4})/ + baNOTccccd + baNOTcccd + baNOTccd + bacccd + *** Failers + anything + b\bc + baccd + +/[^a]/ + Abc + +/[^a]/i + Abc + +/[^a]+/ + AAAaAbc + +/[^a]+/i + AAAaAbc + +/[^a]+/ + bbb\nccc + +/[^k]$/ + abc + *** Failers + abk + +/[^k]{2,3}$/ + abc + kbc + kabc + *** Failers + abk + akb + akk + +/^\d{8,}\@.+[^k]$/ + 12345678\@a.b.c.d + 123456789\@x.y.z + *** Failers + 12345678\@x.y.uk + 1234567\@a.b.c.d + +/[^a]/ + aaaabcd + aaAabcd + +/[^a]/i + aaaabcd + aaAabcd + +/[^az]/ + aaaabcd + aaAabcd + +/[^az]/i + aaaabcd + aaAabcd + +/\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037\040\041\042\043\044\045\046\047\050\051\052\053\054\055\056\057\060\061\062\063\064\065\066\067\070\071\072\073\074\075\076\077\100\101\102\103\104\105\106\107\110\111\112\113\114\115\116\117\120\121\122\123\124\125\126\127\130\131\132\133\134\135\136\137\140\141\142\143\144\145\146\147\150\151\152\153\154\155\156\157\160\161\162\163\164\165\166\167\170\171\172\173\174\175\176\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377/ + \000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037\040\041\042\043\044\045\046\047\050\051\052\053\054\055\056\057\060\061\062\063\064\065\066\067\070\071\072\073\074\075\076\077\100\101\102\103\104\105\106\107\110\111\112\113\114\115\116\117\120\121\122\123\124\125\126\127\130\131\132\133\134\135\136\137\140\141\142\143\144\145\146\147\150\151\152\153\154\155\156\157\160\161\162\163\164\165\166\167\170\171\172\173\174\175\176\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377 + +/P[^*]TAIRE[^*]{1,6}?LL/ + xxxxxxxxxxxPSTAIREISLLxxxxxxxxx + +/P[^*]TAIRE[^*]{1,}?LL/ + xxxxxxxxxxxPSTAIREISLLxxxxxxxxx + +/(\.\d\d[1-9]?)\d+/ + 1.230003938 + 1.875000282 + 1.235 + +/(\.\d\d((?=0)|\d(?=\d)))/ + 1.230003938 + 1.875000282 + *** Failers + 1.235 + +/a(?)b/ + ab + +/\b(foo)\s+(\w+)/i + Food is on the foo table + +/foo(.*)bar/ + The food is under the bar in the barn. + +/foo(.*?)bar/ + The food is under the bar in the barn. + +/(.*)(\d*)/O + I have 2 numbers: 53147 + +/(.*)(\d+)/ + I have 2 numbers: 53147 + +/(.*?)(\d*)/O + I have 2 numbers: 53147 + +/(.*?)(\d+)/ + I have 2 numbers: 53147 + +/(.*)(\d+)$/ + I have 2 numbers: 53147 + +/(.*?)(\d+)$/ + I have 2 numbers: 53147 + +/(.*)\b(\d+)$/ + I have 2 numbers: 53147 + +/(.*\D)(\d+)$/ + I have 2 numbers: 53147 + +/^\D*(?!123)/ + ABC123 + +/^(\D*)(?=\d)(?!123)/ + ABC445 + *** Failers + ABC123 + +/^[W-]46]/ + W46]789 + -46]789 + *** Failers + Wall + Zebra + 42 + [abcd] + ]abcd[ + +/^[W-\]46]/ + W46]789 + Wall + Zebra + Xylophone + 42 + [abcd] + ]abcd[ + \\backslash + *** Failers + -46]789 + well + +/\d\d\/\d\d\/\d\d\d\d/ + 01/01/2000 + +/word (?:[a-zA-Z0-9]+ ){0,10}otherword/ + word cat dog elephant mussel cow horse canary baboon snake shark otherword + word cat dog elephant mussel cow horse canary baboon snake shark + +/word (?:[a-zA-Z0-9]+ ){0,300}otherword/ + word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope + +/^(a){0,0}/ + bcd + abc + aab + +/^(a){0,1}/ + bcd + abc + aab + +/^(a){0,2}/ + bcd + abc + aab + +/^(a){0,3}/ + bcd + abc + aab + aaa + +/^(a){0,}/ + bcd + abc + aab + aaa + aaaaaaaa + +/^(a){1,1}/ + bcd + abc + aab + +/^(a){1,2}/ + bcd + abc + aab + +/^(a){1,3}/ + bcd + abc + aab + aaa + +/^(a){1,}/ + bcd + abc + aab + aaa + aaaaaaaa + +/.*\.gif/ + borfle\nbib.gif\nno + +/.{0,}\.gif/ + borfle\nbib.gif\nno + +/.*\.gif/m + borfle\nbib.gif\nno + +/.*\.gif/s + borfle\nbib.gif\nno + +/.*\.gif/ms + borfle\nbib.gif\nno + +/.*$/ + borfle\nbib.gif\nno + +/.*$/m + borfle\nbib.gif\nno + +/.*$/s + borfle\nbib.gif\nno + +/.*$/ms + borfle\nbib.gif\nno + +/.*$/ + borfle\nbib.gif\nno\n + +/.*$/m + borfle\nbib.gif\nno\n + +/.*$/s + borfle\nbib.gif\nno\n + +/.*$/ms + borfle\nbib.gif\nno\n + +/(.*X|^B)/ + abcde\n1234Xyz + BarFoo + *** Failers + abcde\nBar + +/(.*X|^B)/m + abcde\n1234Xyz + BarFoo + abcde\nBar + +/(.*X|^B)/s + abcde\n1234Xyz + BarFoo + *** Failers + abcde\nBar + +/(.*X|^B)/ms + abcde\n1234Xyz + BarFoo + abcde\nBar + +/(?s)(.*X|^B)/ + abcde\n1234Xyz + BarFoo + *** Failers + abcde\nBar + +/(?s:.*X|^B)/ + abcde\n1234Xyz + BarFoo + *** Failers + abcde\nBar + +/^.*B/ + **** Failers + abc\nB + +/(?s)^.*B/ + abc\nB + +/(?m)^.*B/ + abc\nB + +/(?ms)^.*B/ + abc\nB + +/(?ms)^B/ + abc\nB + +/(?s)B$/ + B\n + +/^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/ + 123456654321 + +/^\d\d\d\d\d\d\d\d\d\d\d\d/ + 123456654321 + +/^[\d][\d][\d][\d][\d][\d][\d][\d][\d][\d][\d][\d]/ + 123456654321 + +/^[abc]{12}/ + abcabcabcabc + +/^[a-c]{12}/ + abcabcabcabc + +/^(a|b|c){12}/ + abcabcabcabc + +/^[abcdefghijklmnopqrstuvwxy0123456789]/ + n + *** Failers + z + +/abcde{0,0}/ + abcd + *** Failers + abce + +/ab[cd]{0,0}e/ + abe + *** Failers + abcde + +/ab(c){0,0}d/ + abd + *** Failers + abcd + +/a(b*)/ + a + ab + abbbb + *** Failers + bbbbb + +/ab\d{0}e/ + abe + *** Failers + ab1e + +/"([^\\"]+|\\.)*"/ + the \"quick\" brown fox + \"the \\\"quick\\\" brown fox\" + +/.*?/g+ + abc + +/\b/g+ + abc + +/\b/+g + abc + +//g + abc + +/]{0,})>]{0,})>([\d]{0,}\.)(.*)((
([\w\W\s\d][^<>]{0,})|[\s]{0,}))<\/a><\/TD>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD><\/TR>/is + 43.
Word Processor
(N-1286)
Lega lstaff.comCA - Statewide + +/a[^a]b/ + acb + a\nb + +/a.b/ + acb + *** Failers + a\nb + +/a[^a]b/s + acb + a\nb + +/a.b/s + acb + a\nb + +/^(b+?|a){1,2}?c/ + bac + bbac + bbbac + bbbbac + bbbbbac + +/^(b+|a){1,2}?c/ + bac + bbac + bbbac + bbbbac + bbbbbac + +/(?!\A)x/m + x\nb\n + a\bx\n + +/\x0{ab}/ + \0{ab} + +/(A|B)*?CD/ + CD + +/(A|B)*CD/ + CD + +/(?.*/)foo" + /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/it/you/see/ + +"(?>.*/)foo" + /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo + +/(?>(\.\d\d[1-9]?))\d+/ + 1.230003938 + 1.875000282 + *** Failers + 1.235 + +/^((?>\w+)|(?>\s+))*$/ + now is the time for all good men to come to the aid of the party + *** Failers + this is not a line with only words and spaces! + +/(\d+)(\w)/ + 12345a + 12345+ + +/((?>\d+))(\w)/ + 12345a + *** Failers + 12345+ + +/(?>a+)b/ + aaab + +/((?>a+)b)/ + aaab + +/(?>(a+))b/ + aaab + +/(?>b)+/ + aaabbbccc + +/(?>a+|b+|c+)*c/ + aaabbbbccccd + +/(a+|b+|c+)*c/ + aaabbbbccccd + +/((?>[^()]+)|\([^()]*\))+/ + ((abc(ade)ufh()()x + +/\(((?>[^()]+)|\([^()]+\))+\)/ + (abc) + (abc(def)xyz) + *** Failers + ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + +/a(?-i)b/i + ab + Ab + *** Failers + aB + AB + +/(a (?x)b c)d e/ + a bcd e + *** Failers + a b cd e + abcd e + a bcde + +/(a b(?x)c d (?-x)e f)/ + a bcde f + *** Failers + abcdef + +/(a(?i)b)c/ + abc + aBc + *** Failers + abC + aBC + Abc + ABc + ABC + AbC + +/a(?i:b)c/ + abc + aBc + *** Failers + ABC + abC + aBC + +/a(?i:b)*c/ + aBc + aBBc + *** Failers + aBC + aBBC + +/a(?=b(?i)c)\w\wd/ + abcd + abCd + *** Failers + aBCd + abcD + +/(?s-i:more.*than).*million/i + more than million + more than MILLION + more \n than Million + *** Failers + MORE THAN MILLION + more \n than \n million + +/(?:(?s-i)more.*than).*million/i + more than million + more than MILLION + more \n than Million + *** Failers + MORE THAN MILLION + more \n than \n million + +/(?>a(?i)b+)+c/ + abc + aBbc + aBBc + *** Failers + Abc + abAb + abbC + +/(?=a(?i)b)\w\wc/ + abc + aBc + *** Failers + Ab + abC + aBC + +/(?<=a(?i)b)(\w\w)c/ + abxxc + aBxxc + *** Failers + Abxxc + ABxxc + abxxC + +/^(?(?=abc)\w{3}:|\d\d)$/ + abc: + 12 + *** Failers + 123 + xyz + +/^(?(?!abc)\d\d|\w{3}:)$/ + abc: + 12 + *** Failers + 123 + xyz + +/(?(?<=foo)bar|cat)/ + foobar + cat + fcat + focat + *** Failers + foocat + +/(?(?a*)*/ + a + aa + aaaa + +/(abc|)+/ + abc + abcabc + abcabcabc + xyz + +/([a]*)*/ + a + aaaaa + +/([ab]*)*/ + a + b + ababab + aaaabcde + bbbb + +/([^a]*)*/ + b + bbbb + aaa + +/([^ab]*)*/ + cccc + abab + +/([a]*?)*/ + a + aaaa + +/([ab]*?)*/ + a + b + abab + baba + +/([^a]*?)*/ + b + bbbb + aaa + +/([^ab]*?)*/ + c + cccc + baba + +/(?>a*)*/ + a + aaabcde + +/((?>a*))*/ + aaaaa + aabbaa + +/((?>a*?))*/ + aaaaa + aabbaa + +/(?(?=[^a-z]+[a-z]) \d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} ) /x + 12-sep-98 + 12-09-98 + *** Failers + sep-12-98 + +/(?i:saturday|sunday)/ + saturday + sunday + Saturday + Sunday + SATURDAY + SUNDAY + SunDay + +/(a(?i)bc|BB)x/ + abcx + aBCx + bbx + BBx + *** Failers + abcX + aBCX + bbX + BBX + +/^([ab](?i)[cd]|[ef])/ + ac + aC + bD + elephant + Europe + frog + France + *** Failers + Africa + +/^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/ + ab + aBd + xy + xY + zebra + Zambesi + *** Failers + aCD + XY + +/(?<=foo\n)^bar/m + foo\nbar + *** Failers + bar + baz\nbar + +/(?<=(?]&/ + <&OUT + +/(?:(f)(o)(o)|(b)(a)(r))*/ + foobar + +/(?<=a)b/ + ab + *** Failers + cb + b + +/(?a+)ab/ + +/(?>a+)b/ + aaab + +/([[:]+)/ + a:[b]: + +/([[=]+)/ + a=[b]= + +/([[.]+)/ + a.[b]. + +/((?>a+)b)/ + aaab + +/(?>(a+))b/ + aaab + +/((?>[^()]+)|\([^()]*\))+/ + ((abc(ade)ufh()()x + +/a\Z/ + *** Failers + aaab + a\nb\n + +/b\Z/ + a\nb\n + +/b\z/ + +/b\Z/ + a\nb + +/b\z/ + a\nb + *** Failers + +/(?>.*)(?<=(abcd|wxyz))/ + alphabetabcd + endingwxyz + *** Failers + a rather long string that doesn't end with one of them + +/word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword/ + word cat dog elephant mussel cow horse canary baboon snake shark otherword + word cat dog elephant mussel cow horse canary baboon snake shark + +/word (?>[a-zA-Z0-9]+ ){0,30}otherword/ + word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope + +/(?<=\d{3}(?!999))foo/ + 999foo + 123999foo + *** Failers + 123abcfoo + +/(?<=(?!...999)\d{3})foo/ + 999foo + 123999foo + *** Failers + 123abcfoo + +/(?<=\d{3}(?!999)...)foo/ + 123abcfoo + 123456foo + *** Failers + 123999foo + +/(?<=\d{3}...)(?Z)+|A)*/ + ZABCDEFG + +/((?>)+|A)*/ + ZABCDEFG + +/a*/g + abbab + +/^[\d-a]/ + abcde + -things + 0digit + *** Failers + bcdef + +/[[:space:]]+/ + > \x09\x0a\x0c\x0d\x0b< + +/[[:blank:]]+/ + > \x09\x0a\x0c\x0d\x0b< + +/[\s]+/ + > \x09\x0a\x0c\x0d\x0b< + +/\s+/ + > \x09\x0a\x0c\x0d\x0b< + +/a b/x + ab + +/(?!\A)x/m + a\nxb\n + +/(?!^)x/m + a\nxb\n + +/abc\Qabc\Eabc/ + abcabcabc + +/abc\Q(*+|\Eabc/ + abc(*+|abc + +/ abc\Q abc\Eabc/x + abc abcabc + *** Failers + abcabcabc + +/abc#comment + \Q#not comment + literal\E/x + abc#not comment\n literal + +/abc#comment + \Q#not comment + literal/x + abc#not comment\n literal + +/abc#comment + \Q#not comment + literal\E #more comment + /x + abc#not comment\n literal + +/abc#comment + \Q#not comment + literal\E #more comment/x + abc#not comment\n literal + +/\Qabc\$xyz\E/ + abc\\\$xyz + +/\Qabc\E\$\Qxyz\E/ + abc\$xyz + +/\Gabc/ + abc + *** Failers + xyzabc + +/\Gabc./g + abc1abc2xyzabc3 + +/abc./g + abc1abc2xyzabc3 + +/a(?x: b c )d/ + XabcdY + *** Failers + Xa b c d Y + +/((?x)x y z | a b c)/ + XabcY + AxyzB + +/(?i)AB(?-i)C/ + XabCY + *** Failers + XabcY + +/((?i)AB(?-i)C|D)E/ + abCE + DE + *** Failers + abcE + abCe + dE + De + +/[z\Qa-d]\E]/ + z + a + - + d + ] + *** Failers + b + +/[\z\C]/ + z + C + +/\M/ + M + +/(a+)*b/ + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + +/(?i)reg(?:ul(?:[aä]|ae)r|ex)/ + REGular + regulaer + Regex + regulär + +/Åæåä[à-ÿÀ-ß]+/ + Åæåäà + Åæåäÿ + ÅæåäÀ + Åæåäß + +/(?<=Z)X./ + \x84XAZXB + +/^(?(2)a|(1)(2))+$/ + 123a + +/(?<=a|bbbb)c/ + ac + bbbbc + +/abc/SS>testsavedregex +testsavedregex +testsavedregex +testsavedregex + + xyz\r\nabc\ + xyz\rabc\ + xyz\r\nabc\ + ** Failers + xyz\nabc\ + xyz\r\nabc\ + xyz\nabc\ + xyz\rabc\ + xyz\rabc\ + +/abc$/m + xyzabc + xyzabc\n + xyzabc\npqr + xyzabc\r\ + xyzabc\rpqr\ + xyzabc\r\n\ + xyzabc\r\npqr\ + ** Failers + xyzabc\r + xyzabc\rpqr + xyzabc\r\n + xyzabc\r\npqr + +/^abc/m + xyz\rabcdef + xyz\nabcdef\ + ** Failers + xyz\nabcdef + +/^abc/m + xyz\nabcdef + xyz\rabcdef\ + ** Failers + xyz\rabcdef + +/^abc/m + xyz\r\nabcdef + xyz\rabcdef\ + ** Failers + xyz\rabcdef + +/.*/ + abc\ndef + abc\rdef + abc\r\ndef + \abc\ndef + \abc\rdef + \abc\r\ndef + \abc\ndef + \abc\rdef + \abc\r\ndef + +/\w+(.)(.)?def/s + abc\ndef + abc\rdef + abc\r\ndef + +/^\w+=.*(\\\n.*)*/ + abc=xyz\\\npqr + +/^(a()*)*/ + aaaa + +/^(?:a(?:(?:))*)*/ + aaaa + +/^(a()+)+/ + aaaa + +/^(?:a(?:(?:))+)+/ + aaaa + +/(a|)*\d/ + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4 + +/(?>a|)*\d/ + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4 + +/(?:a|)*\d/ + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4 + +/^a.b/ + a\rb + a\nb\ + ** Failers + a\nb + a\nb\ + a\rb\ + a\rb\ + +/^abc./mgx + abc1 \x0aabc2 \x0babc3xx \x0cabc4 \x0dabc5xx \x0d\x0aabc6 \x85abc7 JUNK + +/abc.$/mgx + abc1\x0a abc2\x0b abc3\x0c abc4\x0d abc5\x0d\x0a abc6\x85 abc9 + +/^a\Rb/ + a\nb + a\rb + a\r\nb + a\x0bb + a\x0cb + a\x85b + ** Failers + a\n\rb + +/^a\R*b/ + ab + a\nb + a\rb + a\r\nb + a\x0bb + a\x0cb + a\x85b + a\n\rb + a\n\r\x85\x0cb + +/^a\R+b/ + a\nb + a\rb + a\r\nb + a\x0bb + a\x0cb + a\x85b + a\n\rb + a\n\r\x85\x0cb + ** Failers + ab + +/^a\R{1,3}b/ + a\nb + a\n\rb + a\n\r\x85b + a\r\n\r\nb + a\r\n\r\n\r\nb + a\n\r\n\rb + a\n\n\r\nb + ** Failers + a\n\n\n\rb + a\r + +/^a[\R]b/ + aRb + ** Failers + a\nb + +/.+foo/ + afoo + ** Failers + \r\nfoo + \nfoo + +/.+foo/ + afoo + \nfoo + ** Failers + \r\nfoo + +/.+foo/ + afoo + ** Failers + \nfoo + \r\nfoo + +/.+foo/s + afoo + \r\nfoo + \nfoo + +/^$/mg + abc\r\rxyz + abc\n\rxyz + ** Failers + abc\r\nxyz + +/^X/m + XABC + ** Failers + XABC\B + +/(?m)^$/g+ + abc\r\n\r\n + +/(?m)^$|^\r\n/g+ + abc\r\n\r\n + +/(?m)$/g+ + abc\r\n\r\n + +/(?|(abc)|(xyz))/ + >abc< + >xyz< + +/(x)(?|(abc)|(xyz))(x)/ + xabcx + xxyzx + +/(x)(?|(abc)(pqr)|(xyz))(x)/ + xabcpqrx + xxyzx + +/(?|(abc)|(xyz))(?1)/ + abcabc + xyzabc + ** Failers + xyzxyz + +/\H\h\V\v/ + X X\x0a + X\x09X\x0b + ** Failers + \xa0 X\x0a + +/\H*\h+\V?\v{3,4}/ + \x09\x20\xa0X\x0a\x0b\x0c\x0d\x0a + \x09\x20\xa0\x0a\x0b\x0c\x0d\x0a + \x09\x20\xa0\x0a\x0b\x0c + ** Failers + \x09\x20\xa0\x0a\x0b + +/\H{3,4}/ + XY ABCDE + XY PQR ST + +/.\h{3,4}./ + XY AB PQRS + +/\h*X\h?\H+Y\H?Z/ + >XNNNYZ + > X NYQZ + ** Failers + >XYZ + > X NY Z + +/\v*X\v?Y\v+Z\V*\x0a\V+\x0b\V{2,3}\x0c/ + >XY\x0aZ\x0aA\x0bNN\x0c + >\x0a\x0dX\x0aY\x0a\x0bZZZ\x0aAAA\x0bNNN\x0c + +/.+A/ + \r\nA + +/\nA/ + \r\nA + +/[\r\n]A/ + \r\nA + +/(\r|\n)A/ + \r\nA + +/a\Rb/I + a\rb + a\nb + a\r\nb + ** Failers + a\x85b + a\x0bb + +/a\Rb/I + a\rb + a\nb + a\r\nb + a\x85b + a\x0bb + ** Failers + a\x85b\ + a\x0bb\ + +/a\R?b/I + a\rb + a\nb + a\r\nb + ** Failers + a\x85b + a\x0bb + +/a\R?b/I + a\rb + a\nb + a\r\nb + a\x85b + a\x0bb + ** Failers + a\x85b\ + a\x0bb\ + +/a\R{2,4}b/I + a\r\n\nb + a\n\r\rb + a\r\n\r\n\r\n\r\nb + ** Failers + a\x85\85b + a\x0b\0bb + +/a\R{2,4}b/I + a\r\rb + a\n\n\nb + a\r\n\n\r\rb + a\x85\85b + a\x0b\0bb + ** Failers + a\r\r\r\r\rb + a\x85\85b\ + a\x0b\0bb\ + +/a(?!)|\wbc/ + abc + +/a[]b/ + ** Failers + ab + +/a[]+b/ + ** Failers + ab + +/a[]*+b/ + ** Failers + ab + +/a[^]b/ + aXb + a\nb + ** Failers + ab + +/a[^]+b/ + aXb + a\nX\nXb + ** Failers + ab + +/X$/E + X + ** Failers + X\n + +/X$/ + X + X\n + +/xyz/C + xyz + abcxyz + abcxyz\Y + ** Failers + abc + abc\Y + abcxypqr + abcxypqr\Y + +/(*NO_START_OPT)xyz/C + abcxyz + +/(?C)ab/ + ab + \C-ab + +/ab/C + ab + \C-ab + +/^"((?(?=[a])[^"])|b)*"$/C + "ab" + \C-"ab" + +/\d+X|9+Y/ + ++++123999\P + ++++123999Y\P + +/Z(*F)/ + Z\P + ZA\P + +/Z(?!)/ + Z\P + ZA\P + +/dog(sbody)?/ + dogs\P + dogs\P\P + +/dog(sbody)??/ + dogs\P + dogs\P\P + +/dog|dogsbody/ + dogs\P + dogs\P\P + +/dogsbody|dog/ + dogs\P + dogs\P\P + +/Z(*F)Q|ZXY/ + Z\P + ZA\P + X\P + +/\bthe cat\b/ + the cat\P + the cat\P\P + +/dog(sbody)?/ + dogs\D\P + body\D\R + +/dog(sbody)?/ + dogs\D\P\P + body\D\R + +/abc/ + abc\P + abc\P\P + +/abc\K123/ + xyzabc123pqr + +/(?<=abc)123/ + xyzabc123pqr + xyzabc12\P + xyzabc12\P\P + +/\babc\b/ + +++abc+++ + +++ab\P + +++ab\P\P + +/(?=C)/g+ + ABCDECBA + +/(abc|def|xyz)/I + terhjk;abcdaadsfe + the quick xyz brown fox + \Yterhjk;abcdaadsfe + \Ythe quick xyz brown fox + ** Failers + thejk;adlfj aenjl;fda asdfasd ehj;kjxyasiupd + \Ythejk;adlfj aenjl;fda asdfasd ehj;kjxyasiupd + +/(abc|def|xyz)/SI + terhjk;abcdaadsfe + the quick xyz brown fox + \Yterhjk;abcdaadsfe + \Ythe quick xyz brown fox + ** Failers + thejk;adlfj aenjl;fda asdfasd ehj;kjxyasiupd + \Ythejk;adlfj aenjl;fda asdfasd ehj;kjxyasiupd + +/abcd*/+ + xxxxabcd\P + xxxxabcd\P\P + dddxxx\R + xxxxabcd\P\P + xxx\R + +/abcd*/i + xxxxabcd\P + xxxxabcd\P\P + XXXXABCD\P + XXXXABCD\P\P + +/abc\d*/ + xxxxabc1\P + xxxxabc1\P\P + +/abc[de]*/ + xxxxabcde\P + xxxxabcde\P\P + +/(?:(?1)|B)(A(*F)|C)/ + ABCD + CCD + ** Failers + CAD + +/^(?:(?1)|B)(A(*F)|C)/ + CCD + BCD + ** Failers + ABCD + CAD + BAD + +/^(?!a(*SKIP)b)/ + ac + +/^(?=a(*SKIP)b|ac)/ + ** Failers + ac + +/^(?=a(*THEN)b|ac)/ + ac + +/^(?=a(*PRUNE)b)/ + ab + ** Failers + ac + +/^(?(?!a(*SKIP)b))/ + ac + +/(?<=abc)def/ + abc\P\P + +/abc$/ + abc + abc\P + abc\P\P + +/abc$/m + abc + abc\n + abc\P\P + abc\n\P\P + abc\P + abc\n\P + +/abc\z/ + abc + abc\P + abc\P\P + +/abc\Z/ + abc + abc\P + abc\P\P + +/abc\b/ + abc + abc\P + abc\P\P + +/abc\B/ + abc + abc\P + abc\P\P + +/.+/ + abc\>0 + abc\>1 + abc\>2 + abc\>3 + abc\>4 + abc\>-4 + +/^(?:a)++\w/ + aaaab + ** Failers + aaaa + bbb + +/^(?:aa|(?:a)++\w)/ + aaaab + aaaa + ** Failers + bbb + +/^(?:a)*+\w/ + aaaab + bbb + ** Failers + aaaa + +/^(a)++\w/ + aaaab + ** Failers + aaaa + bbb + +/^(a|)++\w/ + aaaab + ** Failers + aaaa + bbb + +/(?=abc){3}abc/+ + abcabcabc + ** Failers + xyz + +/(?=abc)+abc/+ + abcabcabc + ** Failers + xyz + +/(?=abc)++abc/+ + abcabcabc + ** Failers + xyz + +/(?=abc){0}xyz/ + xyz + +/(?=abc){1}xyz/ + ** Failers + xyz + +/(?=(a))?./ + ab + bc + +/(?=(a))??./ + ab + bc + +/^(?=(a)){0}b(?1)/ + backgammon + +/^(?=(?1))?[az]([abc])d/ + abd + zcdxx + +/^(?!a){0}\w+/ + aaaaa + +/(?<=(abc))?xyz/ + abcxyz + pqrxyz + +/((?2))((?1))/ + abc + +/(?(R)a+|(?R)b)/ + aaaabcde + +/(?(R)a+|((?R))b)/ + aaaabcde + +/((?(R)a+|(?1)b))/ + aaaabcde + +/((?(R2)a+|(?1)b))/ + aaaabcde + +/(?(R)a*(?1)|((?R))b)/ + aaaabcde + +/(a+)/O + \O6aaaa + \O8aaaa + +/ab\Cde/ + abXde + +/(?<=ab\Cde)X/ + abZdeX + +/^\R/ + \r\P + \r\P\P + +/^\R{2,3}x/ + \r\P + \r\P\P + \r\r\P + \r\r\P\P + \r\r\r\P + \r\r\r\P\P + \r\rx + \r\r\rx + +/^\R{2,3}?x/ + \r\P + \r\P\P + \r\r\P + \r\r\P\P + \r\r\r\P + \r\r\r\P\P + \r\rx + \r\r\rx + +/^\R?x/ + \r\P + \r\P\P + x + \rx + +/^\R+x/ + \r\P + \r\P\P + \r\n\P + \r\n\P\P + \rx + +/^a$/ + a\r\P + a\r\P\P + +/^a$/m + a\r\P + a\r\P\P + +/^(a$|a\r)/ + a\r\P + a\r\P\P + +/^(a$|a\r)/m + a\r\P + a\r\P\P + +/./ + \r\P + \r\P\P + +/.{2,3}/ + \r\P + \r\P\P + \r\r\P + \r\r\P\P + \r\r\r\P + \r\r\r\P\P + +/.{2,3}?/ + \r\P + \r\P\P + \r\r\P + \r\r\P\P + \r\r\r\P + \r\r\r\P\P + +/-- Test simple validity check for restarts --/ + +/abcdef/ + abc\R + +/)(.)|(?R))++)*F>/ + text text xxxxx text F> text2 more text. + +/^(?>.{4})abc|^\w\w.xabcd/ + xxxxabcd + xx\xa0xabcd + +/^(.{4}){2}+abc|^\w\w.x\w\w\w\wabcd/ + xxxxxxxxabcd + xx\xa0xxxxxabcd + +/abcd/ + abcd\O0 + +/-- These tests show up auto-possessification --/ + +/[ab]*/ + aaaa + +/[ab]*?/ + aaaa + +/[ab]?/ + aaaa + +/[ab]??/ + aaaa + +/[ab]+/ + aaaa + +/[ab]+?/ + aaaa + +/[ab]{2,3}/ + aaaa + +/[ab]{2,3}?/ + aaaa + +/[ab]{2,}/ + aaaa + +/[ab]{2,}?/ + aaaa + +'\A(?:[^\"]++|\"(?:[^\"]*+|\"\")*+\")++' + NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED + +'\A(?:[^\"]++|\"(?:[^\"]++|\"\")*+\")++' + NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED + +/(?(?!)a|b)/ + bbb + aaa + +/()()a+/O= + aaa\D + a\D + +/(02-)?[0-9]{3}-[0-9]{3}/ + 02-123-123 + +/-- End of testinput8 --/ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput9 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput9 new file mode 100755 index 000000000..4575ffe31 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinput9 @@ -0,0 +1,719 @@ +/-- This set of tests checks UTF-8 support with the DFA matching functionality + of pcre_dfa_exec(), excluding Unicode property support. The -dfa flag must + be used with pcretest when running it. --/ + +< forbid W + +/\x{100}ab/8 + \x{100}ab + +/a\x{100}*b/8 + ab + a\x{100}b + a\x{100}\x{100}b + +/a\x{100}+b/8 + a\x{100}b + a\x{100}\x{100}b + *** Failers + ab + +/\bX/8 + Xoanon + +Xoanon + \x{300}Xoanon + *** Failers + YXoanon + +/\BX/8 + YXoanon + *** Failers + Xoanon + +Xoanon + \x{300}Xoanon + +/X\b/8 + X+oanon + ZX\x{300}oanon + FAX + *** Failers + Xoanon + +/X\B/8 + Xoanon + *** Failers + X+oanon + ZX\x{300}oanon + FAX + +/[^a]/8 + abcd + a\x{100} + +/^[abc\x{123}\x{400}-\x{402}]{2,3}\d/8 + ab99 + \x{123}\x{123}45 + \x{400}\x{401}\x{402}6 + *** Failers + d99 + \x{123}\x{122}4 + \x{400}\x{403}6 + \x{400}\x{401}\x{402}\x{402}6 + +/a.b/8 + acb + a\x7fb + a\x{100}b + *** Failers + a\nb + +/a(.{3})b/8 + a\x{4000}xyb + a\x{4000}\x7fyb + a\x{4000}\x{100}yb + *** Failers + a\x{4000}b + ac\ncb + +/a(.*?)(.)/ + a\xc0\x88b + +/a(.*?)(.)/8 + a\x{100}b + +/a(.*)(.)/ + a\xc0\x88b + +/a(.*)(.)/8 + a\x{100}b + +/a(.)(.)/ + a\xc0\x92bcd + +/a(.)(.)/8 + a\x{240}bcd + +/a(.?)(.)/ + a\xc0\x92bcd + +/a(.?)(.)/8 + a\x{240}bcd + +/a(.??)(.)/ + a\xc0\x92bcd + +/a(.??)(.)/8 + a\x{240}bcd + +/a(.{3})b/8 + a\x{1234}xyb + a\x{1234}\x{4321}yb + a\x{1234}\x{4321}\x{3412}b + *** Failers + a\x{1234}b + ac\ncb + +/a(.{3,})b/8 + a\x{1234}xyb + a\x{1234}\x{4321}yb + a\x{1234}\x{4321}\x{3412}b + axxxxbcdefghijb + a\x{1234}\x{4321}\x{3412}\x{3421}b + *** Failers + a\x{1234}b + +/a(.{3,}?)b/8 + a\x{1234}xyb + a\x{1234}\x{4321}yb + a\x{1234}\x{4321}\x{3412}b + axxxxbcdefghijb + a\x{1234}\x{4321}\x{3412}\x{3421}b + *** Failers + a\x{1234}b + +/a(.{3,5})b/8 + a\x{1234}xyb + a\x{1234}\x{4321}yb + a\x{1234}\x{4321}\x{3412}b + axxxxbcdefghijb + a\x{1234}\x{4321}\x{3412}\x{3421}b + axbxxbcdefghijb + axxxxxbcdefghijb + *** Failers + a\x{1234}b + axxxxxxbcdefghijb + +/a(.{3,5}?)b/8 + a\x{1234}xyb + a\x{1234}\x{4321}yb + a\x{1234}\x{4321}\x{3412}b + axxxxbcdefghijb + a\x{1234}\x{4321}\x{3412}\x{3421}b + axbxxbcdefghijb + axxxxxbcdefghijb + *** Failers + a\x{1234}b + axxxxxxbcdefghijb + +/^[a\x{c0}]/8 + *** Failers + \x{100} + +/(?<=aXb)cd/8 + aXbcd + +/(?<=a\x{100}b)cd/8 + a\x{100}bcd + +/(?<=a\x{100000}b)cd/8 + a\x{100000}bcd + +/(?:\x{100}){3}b/8 + \x{100}\x{100}\x{100}b + *** Failers + \x{100}\x{100}b + +/\x{ab}/8 + \x{ab} + \xc2\xab + *** Failers + \x00{ab} + +/(?<=(.))X/8 + WXYZ + \x{256}XYZ + *** Failers + XYZ + +/[^a]+/8g + bcd + \x{100}aY\x{256}Z + +/^[^a]{2}/8 + \x{100}bc + +/^[^a]{2,}/8 + \x{100}bcAa + +/^[^a]{2,}?/8 + \x{100}bca + +/[^a]+/8ig + bcd + \x{100}aY\x{256}Z + +/^[^a]{2}/8i + \x{100}bc + +/^[^a]{2,}/8i + \x{100}bcAa + +/^[^a]{2,}?/8i + \x{100}bca + +/\x{100}{0,0}/8 + abcd + +/\x{100}?/8 + abcd + \x{100}\x{100} + +/\x{100}{0,3}/8 + \x{100}\x{100} + \x{100}\x{100}\x{100}\x{100} + +/\x{100}*/8 + abce + \x{100}\x{100}\x{100}\x{100} + +/\x{100}{1,1}/8 + abcd\x{100}\x{100}\x{100}\x{100} + +/\x{100}{1,3}/8 + abcd\x{100}\x{100}\x{100}\x{100} + +/\x{100}+/8 + abcd\x{100}\x{100}\x{100}\x{100} + +/\x{100}{3}/8 + abcd\x{100}\x{100}\x{100}XX + +/\x{100}{3,5}/8 + abcd\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}XX + +/\x{100}{3,}/8O + abcd\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}XX + +/(?<=a\x{100}{2}b)X/8 + Xyyya\x{100}\x{100}bXzzz + +/\D*/8O + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + +/\D*/8O + \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} + +/\D/8 + 1X2 + 1\x{100}2 + +/>\S/8 + > >X Y + > >\x{100} Y + +/\d/8 + \x{100}3 + +/\s/8 + \x{100} X + +/\D+/8 + 12abcd34 + *** Failers + 1234 + +/\D{2,3}/8 + 12abcd34 + 12ab34 + *** Failers + 1234 + 12a34 + +/\D{2,3}?/8 + 12abcd34 + 12ab34 + *** Failers + 1234 + 12a34 + +/\d+/8 + 12abcd34 + *** Failers + +/\d{2,3}/8 + 12abcd34 + 1234abcd + *** Failers + 1.4 + +/\d{2,3}?/8 + 12abcd34 + 1234abcd + *** Failers + 1.4 + +/\S+/8 + 12abcd34 + *** Failers + \ \ + +/\S{2,3}/8 + 12abcd34 + 1234abcd + *** Failers + \ \ + +/\S{2,3}?/8 + 12abcd34 + 1234abcd + *** Failers + \ \ + +/>\s+ <34 + *** Failers + +/>\s{2,3} \s{2,3}? \xff< + +/[\xff]/8 + >\x{ff}< + +/[^\xFF]/ + XYZ + +/[^\xff]/8 + XYZ + \x{123} + +/^[ac]*b/8 + xb + +/^[ac\x{100}]*b/8 + xb + +/^[^x]*b/8i + xb + +/^[^x]*b/8 + xb + +/^\d*b/8 + xb + +/(|a)/g8 + catac + a\x{256}a + +/^\x{85}$/8i + \x{85} + +/^abc./mgx8 + abc1 \x0aabc2 \x0babc3xx \x0cabc4 \x0dabc5xx \x0d\x0aabc6 \x{0085}abc7 \x{2028}abc8 \x{2029}abc9 JUNK + +/abc.$/mgx8 + abc1\x0a abc2\x0b abc3\x0c abc4\x0d abc5\x0d\x0a abc6\x{0085} abc7\x{2028} abc8\x{2029} abc9 + +/^a\Rb/8 + a\nb + a\rb + a\r\nb + a\x0bb + a\x0cb + a\x{85}b + a\x{2028}b + a\x{2029}b + ** Failers + a\n\rb + +/^a\R*b/8 + ab + a\nb + a\rb + a\r\nb + a\x0bb + a\x0c\x{2028}\x{2029}b + a\x{85}b + a\n\rb + a\n\r\x{85}\x0cb + +/^a\R+b/8 + a\nb + a\rb + a\r\nb + a\x0bb + a\x0c\x{2028}\x{2029}b + a\x{85}b + a\n\rb + a\n\r\x{85}\x0cb + ** Failers + ab + +/^a\R{1,3}b/8 + a\nb + a\n\rb + a\n\r\x{85}b + a\r\n\r\nb + a\r\n\r\n\r\nb + a\n\r\n\rb + a\n\n\r\nb + ** Failers + a\n\n\n\rb + a\r + +/\h+\V?\v{3,4}/8O + \x09\x20\x{a0}X\x0a\x0b\x0c\x0d\x0a + +/\V?\v{3,4}/8O + \x20\x{a0}X\x0a\x0b\x0c\x0d\x0a + +/\h+\V?\v{3,4}/8O + >\x09\x20\x{a0}X\x0a\x0a\x0a< + +/\V?\v{3,4}/8O + >\x09\x20\x{a0}X\x0a\x0a\x0a< + +/\H\h\V\v/8 + X X\x0a + X\x09X\x0b + ** Failers + \x{a0} X\x0a + +/\H*\h+\V?\v{3,4}/8O + \x09\x20\x{a0}X\x0a\x0b\x0c\x0d\x0a + \x09\x20\x{a0}\x0a\x0b\x0c\x0d\x0a + \x09\x20\x{a0}\x0a\x0b\x0c + ** Failers + \x09\x20\x{a0}\x0a\x0b + +/\H\h\V\v/8 + \x{3001}\x{3000}\x{2030}\x{2028} + X\x{180e}X\x{85} + ** Failers + \x{2009} X\x0a + +/\H*\h+\V?\v{3,4}/8O + \x{1680}\x{180e}\x{2007}X\x{2028}\x{2029}\x0c\x0d\x0a + \x09\x{205f}\x{a0}\x0a\x{2029}\x0c\x{2028}\x0a + \x09\x20\x{202f}\x0a\x0b\x0c + ** Failers + \x09\x{200a}\x{a0}\x{2028}\x0b + +/a\Rb/I8 + a\rb + a\nb + a\r\nb + ** Failers + a\x{85}b + a\x0bb + +/a\Rb/I8 + a\rb + a\nb + a\r\nb + a\x{85}b + a\x0bb + ** Failers + a\x{85}b\ + a\x0bb\ + +/a\R?b/I8 + a\rb + a\nb + a\r\nb + ** Failers + a\x{85}b + a\x0bb + +/a\R?b/I8 + a\rb + a\nb + a\r\nb + a\x{85}b + a\x0bb + ** Failers + a\x{85}b\ + a\x0bb\ + +/X/8f + A\x{1ec5}ABCXYZ + +/abcd*/8 + xxxxabcd\P + xxxxabcd\P\P + +/abcd*/i8 + xxxxabcd\P + xxxxabcd\P\P + XXXXABCD\P + XXXXABCD\P\P + +/abc\d*/8 + xxxxabc1\P + xxxxabc1\P\P + +/abc[de]*/8 + xxxxabcde\P + xxxxabcde\P\P + +/\bthe cat\b/8 + the cat\P + the cat\P\P + +/ab\Cde/8 + abXde + +/(?<=ab\Cde)X/8 + +/./8 + \r\P + \r\P\P + +/.{2,3}/8 + \r\P + \r\P\P + \r\r\P + \r\r\P\P + \r\r\r\P + \r\r\r\P\P + +/.{2,3}?/8 + \r\P + \r\P\P + \r\r\P + \r\r\P\P + \r\r\r\P + \r\r\r\P\P + +/[^\x{100}]/8 + \x{100}\x{101}X + +/[^\x{100}]+/8 + \x{100}\x{101}X + +/-- End of testinput9 --/ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinputEBC b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinputEBC new file mode 100755 index 000000000..378755d3b --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testinputEBC @@ -0,0 +1,124 @@ +/-- This is a specialized test for checking, when PCRE is compiled with the +EBCDIC option but in an ASCII environment, that newline and white space +functionality is working. It catches cases where explicit values such as 0x0a +have been used instead of names like CHAR_LF. Needless to say, it is not a +genuine EBCDIC test! In patterns, alphabetic characters that follow a backslash +must be in EBCDIC code. In data, newlines and other spacing characters must be +in EBCDIC, but can be specified as escapes. --/ + +/-- Test default newline and variations --/ + +/^A/m + ABC + 12\x15ABC + +/^A/m + 12\x15ABC + 12\x0dABC + 12\x0d\x15ABC + 12\x25ABC + +/^A/m + 12\x15ABC + 12\x0dABC + 12\x0d\x15ABC + ** Fail + 12\x25ABC + +/-- Test \h --/ + +/^A\ˆ/ + A B + A\x41B + +/-- Test \H --/ + +/^A\È/ + AB + A\x42B + ** Fail + A B + A\x41B + +/-- Test \R --/ + +/^A\Ù/ + A\x15B + A\x0dB + A\x25B + A\x0bB + A\x0cB + ** Fail + A B + +/-- Test \v --/ + +/^A\¥/ + A\x15B + A\x0dB + A\x25B + A\x0bB + A\x0cB + ** Fail + A B + +/-- Test \V --/ + +/^A\å/ + A B + ** Fail + A\x15B + A\x0dB + A\x25B + A\x0bB + A\x0cB + +/-- For repeated items, use an atomic group so that the output is the same +for DFA matching (otherwise it may show multiple matches). --/ + +/-- Test \h+ --/ + +/^A(?>\ˆ+)/ + A B + +/-- Test \H+ --/ + +/^A(?>\È+)/ + AB + ** Fail + A B + +/-- Test \R+ --/ + +/^A(?>\Ù+)/ + A\x15B + A\x0dB + A\x25B + A\x0bB + A\x0cB + ** Fail + A B + +/-- Test \v+ --/ + +/^A(?>\¥+)/ + A\x15B + A\x0dB + A\x25B + A\x0bB + A\x0cB + ** Fail + A B + +/-- Test \V+ --/ + +/^A(?>\å+)/ + A B + ** Fail + A\x15B + A\x0dB + A\x25B + A\x0bB + A\x0cB + +/-- End --/ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput1 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput1 new file mode 100755 index 000000000..e6147e60b --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput1 @@ -0,0 +1,9473 @@ +/-- This set of tests is for features that are compatible with all versions of + Perl >= 5.10, in non-UTF-8 mode. It should run clean for the 8-bit, 16-bit, + and 32-bit PCRE libraries. --/ + +< forbid 89?=ABCDEFfGILMNPTUWXZ< + +/the quick brown fox/ + the quick brown fox + 0: the quick brown fox + The quick brown FOX +No match + What do you know about the quick brown fox? + 0: the quick brown fox + What do you know about THE QUICK BROWN FOX? +No match + +/The quick brown fox/i + the quick brown fox + 0: the quick brown fox + The quick brown FOX + 0: The quick brown FOX + What do you know about the quick brown fox? + 0: the quick brown fox + What do you know about THE QUICK BROWN FOX? + 0: THE QUICK BROWN FOX + +/abcd\t\n\r\f\a\e\071\x3b\$\\\?caxyz/ + abcd\t\n\r\f\a\e9;\$\\?caxyz + 0: abcd\x09\x0a\x0d\x0c\x07\x1b9;$\?caxyz + +/a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/ + abxyzpqrrrabbxyyyypqAzz + 0: abxyzpqrrrabbxyyyypqAzz + abxyzpqrrrabbxyyyypqAzz + 0: abxyzpqrrrabbxyyyypqAzz + aabxyzpqrrrabbxyyyypqAzz + 0: aabxyzpqrrrabbxyyyypqAzz + aaabxyzpqrrrabbxyyyypqAzz + 0: aaabxyzpqrrrabbxyyyypqAzz + aaaabxyzpqrrrabbxyyyypqAzz + 0: aaaabxyzpqrrrabbxyyyypqAzz + abcxyzpqrrrabbxyyyypqAzz + 0: abcxyzpqrrrabbxyyyypqAzz + aabcxyzpqrrrabbxyyyypqAzz + 0: aabcxyzpqrrrabbxyyyypqAzz + aaabcxyzpqrrrabbxyyyypAzz + 0: aaabcxyzpqrrrabbxyyyypAzz + aaabcxyzpqrrrabbxyyyypqAzz + 0: aaabcxyzpqrrrabbxyyyypqAzz + aaabcxyzpqrrrabbxyyyypqqAzz + 0: aaabcxyzpqrrrabbxyyyypqqAzz + aaabcxyzpqrrrabbxyyyypqqqAzz + 0: aaabcxyzpqrrrabbxyyyypqqqAzz + aaabcxyzpqrrrabbxyyyypqqqqAzz + 0: aaabcxyzpqrrrabbxyyyypqqqqAzz + aaabcxyzpqrrrabbxyyyypqqqqqAzz + 0: aaabcxyzpqrrrabbxyyyypqqqqqAzz + aaabcxyzpqrrrabbxyyyypqqqqqqAzz + 0: aaabcxyzpqrrrabbxyyyypqqqqqqAzz + aaaabcxyzpqrrrabbxyyyypqAzz + 0: aaaabcxyzpqrrrabbxyyyypqAzz + abxyzzpqrrrabbxyyyypqAzz + 0: abxyzzpqrrrabbxyyyypqAzz + aabxyzzzpqrrrabbxyyyypqAzz + 0: aabxyzzzpqrrrabbxyyyypqAzz + aaabxyzzzzpqrrrabbxyyyypqAzz + 0: aaabxyzzzzpqrrrabbxyyyypqAzz + aaaabxyzzzzpqrrrabbxyyyypqAzz + 0: aaaabxyzzzzpqrrrabbxyyyypqAzz + abcxyzzpqrrrabbxyyyypqAzz + 0: abcxyzzpqrrrabbxyyyypqAzz + aabcxyzzzpqrrrabbxyyyypqAzz + 0: aabcxyzzzpqrrrabbxyyyypqAzz + aaabcxyzzzzpqrrrabbxyyyypqAzz + 0: aaabcxyzzzzpqrrrabbxyyyypqAzz + aaaabcxyzzzzpqrrrabbxyyyypqAzz + 0: aaaabcxyzzzzpqrrrabbxyyyypqAzz + aaaabcxyzzzzpqrrrabbbxyyyypqAzz + 0: aaaabcxyzzzzpqrrrabbbxyyyypqAzz + aaaabcxyzzzzpqrrrabbbxyyyyypqAzz + 0: aaaabcxyzzzzpqrrrabbbxyyyyypqAzz + aaabcxyzpqrrrabbxyyyypABzz + 0: aaabcxyzpqrrrabbxyyyypABzz + aaabcxyzpqrrrabbxyyyypABBzz + 0: aaabcxyzpqrrrabbxyyyypABBzz + >>>aaabxyzpqrrrabbxyyyypqAzz + 0: aaabxyzpqrrrabbxyyyypqAzz + >aaaabxyzpqrrrabbxyyyypqAzz + 0: aaaabxyzpqrrrabbxyyyypqAzz + >>>>abcxyzpqrrrabbxyyyypqAzz + 0: abcxyzpqrrrabbxyyyypqAzz + *** Failers +No match + abxyzpqrrabbxyyyypqAzz +No match + abxyzpqrrrrabbxyyyypqAzz +No match + abxyzpqrrrabxyyyypqAzz +No match + aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz +No match + aaaabcxyzzzzpqrrrabbbxyyypqAzz +No match + aaabcxyzpqrrrabbxyyyypqqqqqqqAzz +No match + +/^(abc){1,2}zz/ + abczz + 0: abczz + 1: abc + abcabczz + 0: abcabczz + 1: abc + *** Failers +No match + zz +No match + abcabcabczz +No match + >>abczz +No match + +/^(b+?|a){1,2}?c/ + bc + 0: bc + 1: b + bbc + 0: bbc + 1: b + bbbc + 0: bbbc + 1: bb + bac + 0: bac + 1: a + bbac + 0: bbac + 1: a + aac + 0: aac + 1: a + abbbbbbbbbbbc + 0: abbbbbbbbbbbc + 1: bbbbbbbbbbb + bbbbbbbbbbbac + 0: bbbbbbbbbbbac + 1: a + *** Failers +No match + aaac +No match + abbbbbbbbbbbac +No match + +/^(b+|a){1,2}c/ + bc + 0: bc + 1: b + bbc + 0: bbc + 1: bb + bbbc + 0: bbbc + 1: bbb + bac + 0: bac + 1: a + bbac + 0: bbac + 1: a + aac + 0: aac + 1: a + abbbbbbbbbbbc + 0: abbbbbbbbbbbc + 1: bbbbbbbbbbb + bbbbbbbbbbbac + 0: bbbbbbbbbbbac + 1: a + *** Failers +No match + aaac +No match + abbbbbbbbbbbac +No match + +/^(b+|a){1,2}?bc/ + bbc + 0: bbc + 1: b + +/^(b*|ba){1,2}?bc/ + babc + 0: babc + 1: ba + bbabc + 0: bbabc + 1: ba + bababc + 0: bababc + 1: ba + *** Failers +No match + bababbc +No match + babababc +No match + +/^(ba|b*){1,2}?bc/ + babc + 0: babc + 1: ba + bbabc + 0: bbabc + 1: ba + bababc + 0: bababc + 1: ba + *** Failers +No match + bababbc +No match + babababc +No match + +/^\ca\cA\c[;\c:/ + \x01\x01\e;z + 0: \x01\x01\x1b;z + +/^[ab\]cde]/ + athing + 0: a + bthing + 0: b + ]thing + 0: ] + cthing + 0: c + dthing + 0: d + ething + 0: e + *** Failers +No match + fthing +No match + [thing +No match + \\thing +No match + +/^[]cde]/ + ]thing + 0: ] + cthing + 0: c + dthing + 0: d + ething + 0: e + *** Failers +No match + athing +No match + fthing +No match + +/^[^ab\]cde]/ + fthing + 0: f + [thing + 0: [ + \\thing + 0: \ + *** Failers + 0: * + athing +No match + bthing +No match + ]thing +No match + cthing +No match + dthing +No match + ething +No match + +/^[^]cde]/ + athing + 0: a + fthing + 0: f + *** Failers + 0: * + ]thing +No match + cthing +No match + dthing +No match + ething +No match + +/^\/ + + 0: \x81 + +/^ÿ/ + ÿ + 0: \xff + +/^[0-9]+$/ + 0 + 0: 0 + 1 + 0: 1 + 2 + 0: 2 + 3 + 0: 3 + 4 + 0: 4 + 5 + 0: 5 + 6 + 0: 6 + 7 + 0: 7 + 8 + 0: 8 + 9 + 0: 9 + 10 + 0: 10 + 100 + 0: 100 + *** Failers +No match + abc +No match + +/^.*nter/ + enter + 0: enter + inter + 0: inter + uponter + 0: uponter + +/^xxx[0-9]+$/ + xxx0 + 0: xxx0 + xxx1234 + 0: xxx1234 + *** Failers +No match + xxx +No match + +/^.+[0-9][0-9][0-9]$/ + x123 + 0: x123 + xx123 + 0: xx123 + 123456 + 0: 123456 + *** Failers +No match + 123 +No match + x1234 + 0: x1234 + +/^.+?[0-9][0-9][0-9]$/ + x123 + 0: x123 + xx123 + 0: xx123 + 123456 + 0: 123456 + *** Failers +No match + 123 +No match + x1234 + 0: x1234 + +/^([^!]+)!(.+)=apquxz\.ixr\.zzz\.ac\.uk$/ + abc!pqr=apquxz.ixr.zzz.ac.uk + 0: abc!pqr=apquxz.ixr.zzz.ac.uk + 1: abc + 2: pqr + *** Failers +No match + !pqr=apquxz.ixr.zzz.ac.uk +No match + abc!=apquxz.ixr.zzz.ac.uk +No match + abc!pqr=apquxz:ixr.zzz.ac.uk +No match + abc!pqr=apquxz.ixr.zzz.ac.ukk +No match + +/:/ + Well, we need a colon: somewhere + 0: : + *** Fail if we don't +No match + +/([\da-f:]+)$/i + 0abc + 0: 0abc + 1: 0abc + abc + 0: abc + 1: abc + fed + 0: fed + 1: fed + E + 0: E + 1: E + :: + 0: :: + 1: :: + 5f03:12C0::932e + 0: 5f03:12C0::932e + 1: 5f03:12C0::932e + fed def + 0: def + 1: def + Any old stuff + 0: ff + 1: ff + *** Failers +No match + 0zzz +No match + gzzz +No match + fed\x20 +No match + Any old rubbish +No match + +/^.*\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/ + .1.2.3 + 0: .1.2.3 + 1: 1 + 2: 2 + 3: 3 + A.12.123.0 + 0: A.12.123.0 + 1: 12 + 2: 123 + 3: 0 + *** Failers +No match + .1.2.3333 +No match + 1.2.3 +No match + 1234.2.3 +No match + +/^(\d+)\s+IN\s+SOA\s+(\S+)\s+(\S+)\s*\(\s*$/ + 1 IN SOA non-sp1 non-sp2( + 0: 1 IN SOA non-sp1 non-sp2( + 1: 1 + 2: non-sp1 + 3: non-sp2 + 1 IN SOA non-sp1 non-sp2 ( + 0: 1 IN SOA non-sp1 non-sp2 ( + 1: 1 + 2: non-sp1 + 3: non-sp2 + *** Failers +No match + 1IN SOA non-sp1 non-sp2( +No match + +/^[a-zA-Z\d][a-zA-Z\d\-]*(\.[a-zA-Z\d][a-zA-z\d\-]*)*\.$/ + a. + 0: a. + Z. + 0: Z. + 2. + 0: 2. + ab-c.pq-r. + 0: ab-c.pq-r. + 1: .pq-r + sxk.zzz.ac.uk. + 0: sxk.zzz.ac.uk. + 1: .uk + x-.y-. + 0: x-.y-. + 1: .y- + *** Failers +No match + -abc.peq. +No match + +/^\*\.[a-z]([a-z\-\d]*[a-z\d]+)?(\.[a-z]([a-z\-\d]*[a-z\d]+)?)*$/ + *.a + 0: *.a + *.b0-a + 0: *.b0-a + 1: 0-a + *.c3-b.c + 0: *.c3-b.c + 1: 3-b + 2: .c + *.c-a.b-c + 0: *.c-a.b-c + 1: -a + 2: .b-c + 3: -c + *** Failers +No match + *.0 +No match + *.a- +No match + *.a-b.c- +No match + *.c-a.0-c +No match + +/^(?=ab(de))(abd)(e)/ + abde + 0: abde + 1: de + 2: abd + 3: e + +/^(?!(ab)de|x)(abd)(f)/ + abdf + 0: abdf + 1: + 2: abd + 3: f + +/^(?=(ab(cd)))(ab)/ + abcd + 0: ab + 1: abcd + 2: cd + 3: ab + +/^[\da-f](\.[\da-f])*$/i + a.b.c.d + 0: a.b.c.d + 1: .d + A.B.C.D + 0: A.B.C.D + 1: .D + a.b.c.1.2.3.C + 0: a.b.c.1.2.3.C + 1: .C + +/^\".*\"\s*(;.*)?$/ + \"1234\" + 0: "1234" + \"abcd\" ; + 0: "abcd" ; + 1: ; + \"\" ; rhubarb + 0: "" ; rhubarb + 1: ; rhubarb + *** Failers +No match + \"1234\" : things +No match + +/^$/ + \ + 0: + *** Failers +No match + +/ ^ a (?# begins with a) b\sc (?# then b c) $ (?# then end)/x + ab c + 0: ab c + *** Failers +No match + abc +No match + ab cde +No match + +/(?x) ^ a (?# begins with a) b\sc (?# then b c) $ (?# then end)/ + ab c + 0: ab c + *** Failers +No match + abc +No match + ab cde +No match + +/^ a\ b[c ]d $/x + a bcd + 0: a bcd + a b d + 0: a b d + *** Failers +No match + abcd +No match + ab d +No match + +/^(a(b(c)))(d(e(f)))(h(i(j)))(k(l(m)))$/ + abcdefhijklm + 0: abcdefhijklm + 1: abc + 2: bc + 3: c + 4: def + 5: ef + 6: f + 7: hij + 8: ij + 9: j +10: klm +11: lm +12: m + +/^(?:a(b(c)))(?:d(e(f)))(?:h(i(j)))(?:k(l(m)))$/ + abcdefhijklm + 0: abcdefhijklm + 1: bc + 2: c + 3: ef + 4: f + 5: ij + 6: j + 7: lm + 8: m + +/^[\w][\W][\s][\S][\d][\D][\b][\n][\c]][\022]/ + a+ Z0+\x08\n\x1d\x12 + 0: a+ Z0+\x08\x0a\x1d\x12 + +/^[.^$|()*+?{,}]+/ + .^\$(*+)|{?,?} + 0: .^$(*+)|{?,?} + +/^a*\w/ + z + 0: z + az + 0: az + aaaz + 0: aaaz + a + 0: a + aa + 0: aa + aaaa + 0: aaaa + a+ + 0: a + aa+ + 0: aa + +/^a*?\w/ + z + 0: z + az + 0: a + aaaz + 0: a + a + 0: a + aa + 0: a + aaaa + 0: a + a+ + 0: a + aa+ + 0: a + +/^a+\w/ + az + 0: az + aaaz + 0: aaaz + aa + 0: aa + aaaa + 0: aaaa + aa+ + 0: aa + +/^a+?\w/ + az + 0: az + aaaz + 0: aa + aa + 0: aa + aaaa + 0: aa + aa+ + 0: aa + +/^\d{8}\w{2,}/ + 1234567890 + 0: 1234567890 + 12345678ab + 0: 12345678ab + 12345678__ + 0: 12345678__ + *** Failers +No match + 1234567 +No match + +/^[aeiou\d]{4,5}$/ + uoie + 0: uoie + 1234 + 0: 1234 + 12345 + 0: 12345 + aaaaa + 0: aaaaa + *** Failers +No match + 123456 +No match + +/^[aeiou\d]{4,5}?/ + uoie + 0: uoie + 1234 + 0: 1234 + 12345 + 0: 1234 + aaaaa + 0: aaaa + 123456 + 0: 1234 + +/\A(abc|def)=(\1){2,3}\Z/ + abc=abcabc + 0: abc=abcabc + 1: abc + 2: abc + def=defdefdef + 0: def=defdefdef + 1: def + 2: def + *** Failers +No match + abc=defdef +No match + +/^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\11*(\3\4)\1(?#)2$/ + abcdefghijkcda2 + 0: abcdefghijkcda2 + 1: a + 2: b + 3: c + 4: d + 5: e + 6: f + 7: g + 8: h + 9: i +10: j +11: k +12: cd + abcdefghijkkkkcda2 + 0: abcdefghijkkkkcda2 + 1: a + 2: b + 3: c + 4: d + 5: e + 6: f + 7: g + 8: h + 9: i +10: j +11: k +12: cd + +/(cat(a(ract|tonic)|erpillar)) \1()2(3)/ + cataract cataract23 + 0: cataract cataract23 + 1: cataract + 2: aract + 3: ract + 4: + 5: 3 + catatonic catatonic23 + 0: catatonic catatonic23 + 1: catatonic + 2: atonic + 3: tonic + 4: + 5: 3 + caterpillar caterpillar23 + 0: caterpillar caterpillar23 + 1: caterpillar + 2: erpillar + 3: + 4: + 5: 3 + + +/^From +([^ ]+) +[a-zA-Z][a-zA-Z][a-zA-Z] +[a-zA-Z][a-zA-Z][a-zA-Z] +[0-9]?[0-9] +[0-9][0-9]:[0-9][0-9]/ + From abcd Mon Sep 01 12:33:02 1997 + 0: From abcd Mon Sep 01 12:33 + 1: abcd + +/^From\s+\S+\s+([a-zA-Z]{3}\s+){2}\d{1,2}\s+\d\d:\d\d/ + From abcd Mon Sep 01 12:33:02 1997 + 0: From abcd Mon Sep 01 12:33 + 1: Sep + From abcd Mon Sep 1 12:33:02 1997 + 0: From abcd Mon Sep 1 12:33 + 1: Sep + *** Failers +No match + From abcd Sep 01 12:33:02 1997 +No match + +/^12.34/s + 12\n34 + 0: 12\x0a34 + 12\r34 + 0: 12\x0d34 + +/\w+(?=\t)/ + the quick brown\t fox + 0: brown + +/foo(?!bar)(.*)/ + foobar is foolish see? + 0: foolish see? + 1: lish see? + +/(?:(?!foo)...|^.{0,2})bar(.*)/ + foobar crowbar etc + 0: rowbar etc + 1: etc + barrel + 0: barrel + 1: rel + 2barrel + 0: 2barrel + 1: rel + A barrel + 0: A barrel + 1: rel + +/^(\D*)(?=\d)(?!123)/ + abc456 + 0: abc + 1: abc + *** Failers +No match + abc123 +No match + +/^1234(?# test newlines + inside)/ + 1234 + 0: 1234 + +/^1234 #comment in extended re + /x + 1234 + 0: 1234 + +/#rhubarb + abcd/x + abcd + 0: abcd + +/^abcd#rhubarb/x + abcd + 0: abcd + +/^(a)\1{2,3}(.)/ + aaab + 0: aaab + 1: a + 2: b + aaaab + 0: aaaab + 1: a + 2: b + aaaaab + 0: aaaaa + 1: a + 2: a + aaaaaab + 0: aaaaa + 1: a + 2: a + +/(?!^)abc/ + the abc + 0: abc + *** Failers +No match + abc +No match + +/(?=^)abc/ + abc + 0: abc + *** Failers +No match + the abc +No match + +/^[ab]{1,3}(ab*|b)/ + aabbbbb + 0: aabb + 1: b + +/^[ab]{1,3}?(ab*|b)/ + aabbbbb + 0: aabbbbb + 1: abbbbb + +/^[ab]{1,3}?(ab*?|b)/ + aabbbbb + 0: aa + 1: a + +/^[ab]{1,3}(ab*?|b)/ + aabbbbb + 0: aabb + 1: b + +/ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # optional leading comment +(?: (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # initial word +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) )* # further okay, if led by a period +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] | # atom and space parts, or... +\( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) | # comments, or... + +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +# quoted strings +)* +< (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # leading < +(?: @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* + +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* , (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* )? # optional route +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # initial word +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) )* # further okay, if led by a period +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +# address spec +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* > # trailing > +# name and address +) (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # optional trailing comment +/x + Alan Other + 0: Alan Other + + 0: user@dom.ain + user\@dom.ain + 0: user@dom.ain + \"A. Other\" (a comment) + 0: "A. Other" (a comment) + A. Other (a comment) + 0: Other (a comment) + \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay + 0: "/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/"@x400-re.lay + A missing angle @,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +# Quoted string +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +# Quoted string +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +# Quoted string +) +# leading word +[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] * # "normal" atoms and or spaces +(?: +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +| +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +) # "special" comment or quoted string +[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] * # more "normal" +)* +< +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +@ +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +# Quoted string +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +# Quoted string +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +) +/x + Alan Other + 0: Alan Other + + 0: user@dom.ain + user\@dom.ain + 0: user@dom.ain + \"A. Other\" (a comment) + 0: "A. Other" + A. Other (a comment) + 0: Other + \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay + 0: "/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/"@x400-re.lay + A missing angle ?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff + +/P[^*]TAIRE[^*]{1,6}?LL/ + xxxxxxxxxxxPSTAIREISLLxxxxxxxxx + 0: PSTAIREISLL + +/P[^*]TAIRE[^*]{1,}?LL/ + xxxxxxxxxxxPSTAIREISLLxxxxxxxxx + 0: PSTAIREISLL + +/(\.\d\d[1-9]?)\d+/ + 1.230003938 + 0: .230003938 + 1: .23 + 1.875000282 + 0: .875000282 + 1: .875 + 1.235 + 0: .235 + 1: .23 + +/(\.\d\d((?=0)|\d(?=\d)))/ + 1.230003938 + 0: .23 + 1: .23 + 2: + 1.875000282 + 0: .875 + 1: .875 + 2: 5 + *** Failers +No match + 1.235 +No match + +/a(?)b/ + ab + 0: ab + +/\b(foo)\s+(\w+)/i + Food is on the foo table + 0: foo table + 1: foo + 2: table + +/foo(.*)bar/ + The food is under the bar in the barn. + 0: food is under the bar in the bar + 1: d is under the bar in the + +/foo(.*?)bar/ + The food is under the bar in the barn. + 0: food is under the bar + 1: d is under the + +/(.*)(\d*)/ + I have 2 numbers: 53147 + 0: I have 2 numbers: 53147 + 1: I have 2 numbers: 53147 + 2: + +/(.*)(\d+)/ + I have 2 numbers: 53147 + 0: I have 2 numbers: 53147 + 1: I have 2 numbers: 5314 + 2: 7 + +/(.*?)(\d*)/ + I have 2 numbers: 53147 + 0: + 1: + 2: + +/(.*?)(\d+)/ + I have 2 numbers: 53147 + 0: I have 2 + 1: I have + 2: 2 + +/(.*)(\d+)$/ + I have 2 numbers: 53147 + 0: I have 2 numbers: 53147 + 1: I have 2 numbers: 5314 + 2: 7 + +/(.*?)(\d+)$/ + I have 2 numbers: 53147 + 0: I have 2 numbers: 53147 + 1: I have 2 numbers: + 2: 53147 + +/(.*)\b(\d+)$/ + I have 2 numbers: 53147 + 0: I have 2 numbers: 53147 + 1: I have 2 numbers: + 2: 53147 + +/(.*\D)(\d+)$/ + I have 2 numbers: 53147 + 0: I have 2 numbers: 53147 + 1: I have 2 numbers: + 2: 53147 + +/^\D*(?!123)/ + ABC123 + 0: AB + +/^(\D*)(?=\d)(?!123)/ + ABC445 + 0: ABC + 1: ABC + *** Failers +No match + ABC123 +No match + +/^[W-]46]/ + W46]789 + 0: W46] + -46]789 + 0: -46] + *** Failers +No match + Wall +No match + Zebra +No match + 42 +No match + [abcd] +No match + ]abcd[ +No match + +/^[W-\]46]/ + W46]789 + 0: W + Wall + 0: W + Zebra + 0: Z + Xylophone + 0: X + 42 + 0: 4 + [abcd] + 0: [ + ]abcd[ + 0: ] + \\backslash + 0: \ + *** Failers +No match + -46]789 +No match + well +No match + +/\d\d\/\d\d\/\d\d\d\d/ + 01/01/2000 + 0: 01/01/2000 + +/word (?:[a-zA-Z0-9]+ ){0,10}otherword/ + word cat dog elephant mussel cow horse canary baboon snake shark otherword + 0: word cat dog elephant mussel cow horse canary baboon snake shark otherword + word cat dog elephant mussel cow horse canary baboon snake shark +No match + +/word (?:[a-zA-Z0-9]+ ){0,300}otherword/ + word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope +No match + +/^(a){0,0}/ + bcd + 0: + abc + 0: + aab + 0: + +/^(a){0,1}/ + bcd + 0: + abc + 0: a + 1: a + aab + 0: a + 1: a + +/^(a){0,2}/ + bcd + 0: + abc + 0: a + 1: a + aab + 0: aa + 1: a + +/^(a){0,3}/ + bcd + 0: + abc + 0: a + 1: a + aab + 0: aa + 1: a + aaa + 0: aaa + 1: a + +/^(a){0,}/ + bcd + 0: + abc + 0: a + 1: a + aab + 0: aa + 1: a + aaa + 0: aaa + 1: a + aaaaaaaa + 0: aaaaaaaa + 1: a + +/^(a){1,1}/ + bcd +No match + abc + 0: a + 1: a + aab + 0: a + 1: a + +/^(a){1,2}/ + bcd +No match + abc + 0: a + 1: a + aab + 0: aa + 1: a + +/^(a){1,3}/ + bcd +No match + abc + 0: a + 1: a + aab + 0: aa + 1: a + aaa + 0: aaa + 1: a + +/^(a){1,}/ + bcd +No match + abc + 0: a + 1: a + aab + 0: aa + 1: a + aaa + 0: aaa + 1: a + aaaaaaaa + 0: aaaaaaaa + 1: a + +/.*\.gif/ + borfle\nbib.gif\nno + 0: bib.gif + +/.{0,}\.gif/ + borfle\nbib.gif\nno + 0: bib.gif + +/.*\.gif/m + borfle\nbib.gif\nno + 0: bib.gif + +/.*\.gif/s + borfle\nbib.gif\nno + 0: borfle\x0abib.gif + +/.*\.gif/ms + borfle\nbib.gif\nno + 0: borfle\x0abib.gif + +/.*$/ + borfle\nbib.gif\nno + 0: no + +/.*$/m + borfle\nbib.gif\nno + 0: borfle + +/.*$/s + borfle\nbib.gif\nno + 0: borfle\x0abib.gif\x0ano + +/.*$/ms + borfle\nbib.gif\nno + 0: borfle\x0abib.gif\x0ano + +/.*$/ + borfle\nbib.gif\nno\n + 0: no + +/.*$/m + borfle\nbib.gif\nno\n + 0: borfle + +/.*$/s + borfle\nbib.gif\nno\n + 0: borfle\x0abib.gif\x0ano\x0a + +/.*$/ms + borfle\nbib.gif\nno\n + 0: borfle\x0abib.gif\x0ano\x0a + +/(.*X|^B)/ + abcde\n1234Xyz + 0: 1234X + 1: 1234X + BarFoo + 0: B + 1: B + *** Failers +No match + abcde\nBar +No match + +/(.*X|^B)/m + abcde\n1234Xyz + 0: 1234X + 1: 1234X + BarFoo + 0: B + 1: B + abcde\nBar + 0: B + 1: B + +/(.*X|^B)/s + abcde\n1234Xyz + 0: abcde\x0a1234X + 1: abcde\x0a1234X + BarFoo + 0: B + 1: B + *** Failers +No match + abcde\nBar +No match + +/(.*X|^B)/ms + abcde\n1234Xyz + 0: abcde\x0a1234X + 1: abcde\x0a1234X + BarFoo + 0: B + 1: B + abcde\nBar + 0: B + 1: B + +/(?s)(.*X|^B)/ + abcde\n1234Xyz + 0: abcde\x0a1234X + 1: abcde\x0a1234X + BarFoo + 0: B + 1: B + *** Failers +No match + abcde\nBar +No match + +/(?s:.*X|^B)/ + abcde\n1234Xyz + 0: abcde\x0a1234X + BarFoo + 0: B + *** Failers +No match + abcde\nBar +No match + +/^.*B/ + **** Failers +No match + abc\nB +No match + +/(?s)^.*B/ + abc\nB + 0: abc\x0aB + +/(?m)^.*B/ + abc\nB + 0: B + +/(?ms)^.*B/ + abc\nB + 0: abc\x0aB + +/(?ms)^B/ + abc\nB + 0: B + +/(?s)B$/ + B\n + 0: B + +/^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/ + 123456654321 + 0: 123456654321 + +/^\d\d\d\d\d\d\d\d\d\d\d\d/ + 123456654321 + 0: 123456654321 + +/^[\d][\d][\d][\d][\d][\d][\d][\d][\d][\d][\d][\d]/ + 123456654321 + 0: 123456654321 + +/^[abc]{12}/ + abcabcabcabc + 0: abcabcabcabc + +/^[a-c]{12}/ + abcabcabcabc + 0: abcabcabcabc + +/^(a|b|c){12}/ + abcabcabcabc + 0: abcabcabcabc + 1: c + +/^[abcdefghijklmnopqrstuvwxy0123456789]/ + n + 0: n + *** Failers +No match + z +No match + +/abcde{0,0}/ + abcd + 0: abcd + *** Failers +No match + abce +No match + +/ab[cd]{0,0}e/ + abe + 0: abe + *** Failers +No match + abcde +No match + +/ab(c){0,0}d/ + abd + 0: abd + *** Failers +No match + abcd +No match + +/a(b*)/ + a + 0: a + 1: + ab + 0: ab + 1: b + abbbb + 0: abbbb + 1: bbbb + *** Failers + 0: a + 1: + bbbbb +No match + +/ab\d{0}e/ + abe + 0: abe + *** Failers +No match + ab1e +No match + +/"([^\\"]+|\\.)*"/ + the \"quick\" brown fox + 0: "quick" + 1: quick + \"the \\\"quick\\\" brown fox\" + 0: "the \"quick\" brown fox" + 1: brown fox + +/.*?/g+ + abc + 0: + 0+ abc + 0: a + 0+ bc + 0: + 0+ bc + 0: b + 0+ c + 0: + 0+ c + 0: c + 0+ + 0: + 0+ + +/\b/g+ + abc + 0: + 0+ abc + 0: + 0+ + +/\b/+g + abc + 0: + 0+ abc + 0: + 0+ + +//g + abc + 0: + 0: + 0: + 0: + +/]{0,})>]{0,})>([\d]{0,}\.)(.*)((
([\w\W\s\d][^<>]{0,})|[\s]{0,}))<\/a><\/TD>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD><\/TR>/is + 43.Word Processor
(N-1286)
Lega lstaff.comCA - Statewide + 0: 43.Word Processor
(N-1286)
Lega lstaff.comCA - Statewide + 1: BGCOLOR='#DBE9E9' + 2: align=left valign=top + 3: 43. + 4: Word Processor
(N-1286) + 5: + 6: + 7: + 8: align=left valign=top + 9: Lega lstaff.com +10: align=left valign=top +11: CA - Statewide + +/a[^a]b/ + acb + 0: acb + a\nb + 0: a\x0ab + +/a.b/ + acb + 0: acb + *** Failers +No match + a\nb +No match + +/a[^a]b/s + acb + 0: acb + a\nb + 0: a\x0ab + +/a.b/s + acb + 0: acb + a\nb + 0: a\x0ab + +/^(b+?|a){1,2}?c/ + bac + 0: bac + 1: a + bbac + 0: bbac + 1: a + bbbac + 0: bbbac + 1: a + bbbbac + 0: bbbbac + 1: a + bbbbbac + 0: bbbbbac + 1: a + +/^(b+|a){1,2}?c/ + bac + 0: bac + 1: a + bbac + 0: bbac + 1: a + bbbac + 0: bbbac + 1: a + bbbbac + 0: bbbbac + 1: a + bbbbbac + 0: bbbbbac + 1: a + +/(?!\A)x/m + x\nb\n +No match + a\bx\n + 0: x + +/\x0{ab}/ + \0{ab} + 0: \x00{ab} + +/(A|B)*?CD/ + CD + 0: CD + +/(A|B)*CD/ + CD + 0: CD + +/(AB)*?\1/ + ABABAB + 0: ABAB + 1: AB + +/(AB)*\1/ + ABABAB + 0: ABABAB + 1: AB + +/(?.*/)foo" + /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/it/you/see/ +No match + +"(?>.*/)foo" + /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo + 0: /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo + +/(?>(\.\d\d[1-9]?))\d+/ + 1.230003938 + 0: .230003938 + 1: .23 + 1.875000282 + 0: .875000282 + 1: .875 + *** Failers +No match + 1.235 +No match + +/^((?>\w+)|(?>\s+))*$/ + now is the time for all good men to come to the aid of the party + 0: now is the time for all good men to come to the aid of the party + 1: party + *** Failers +No match + this is not a line with only words and spaces! +No match + +/(\d+)(\w)/ + 12345a + 0: 12345a + 1: 12345 + 2: a + 12345+ + 0: 12345 + 1: 1234 + 2: 5 + +/((?>\d+))(\w)/ + 12345a + 0: 12345a + 1: 12345 + 2: a + *** Failers +No match + 12345+ +No match + +/(?>a+)b/ + aaab + 0: aaab + +/((?>a+)b)/ + aaab + 0: aaab + 1: aaab + +/(?>(a+))b/ + aaab + 0: aaab + 1: aaa + +/(?>b)+/ + aaabbbccc + 0: bbb + +/(?>a+|b+|c+)*c/ + aaabbbbccccd + 0: aaabbbbc + +/((?>[^()]+)|\([^()]*\))+/ + ((abc(ade)ufh()()x + 0: abc(ade)ufh()()x + 1: x + +/\(((?>[^()]+)|\([^()]+\))+\)/ + (abc) + 0: (abc) + 1: abc + (abc(def)xyz) + 0: (abc(def)xyz) + 1: xyz + *** Failers +No match + ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +No match + +/a(?-i)b/i + ab + 0: ab + Ab + 0: Ab + *** Failers +No match + aB +No match + AB +No match + +/(a (?x)b c)d e/ + a bcd e + 0: a bcd e + 1: a bc + *** Failers +No match + a b cd e +No match + abcd e +No match + a bcde +No match + +/(a b(?x)c d (?-x)e f)/ + a bcde f + 0: a bcde f + 1: a bcde f + *** Failers +No match + abcdef +No match + +/(a(?i)b)c/ + abc + 0: abc + 1: ab + aBc + 0: aBc + 1: aB + *** Failers +No match + abC +No match + aBC +No match + Abc +No match + ABc +No match + ABC +No match + AbC +No match + +/a(?i:b)c/ + abc + 0: abc + aBc + 0: aBc + *** Failers +No match + ABC +No match + abC +No match + aBC +No match + +/a(?i:b)*c/ + aBc + 0: aBc + aBBc + 0: aBBc + *** Failers +No match + aBC +No match + aBBC +No match + +/a(?=b(?i)c)\w\wd/ + abcd + 0: abcd + abCd + 0: abCd + *** Failers +No match + aBCd +No match + abcD +No match + +/(?s-i:more.*than).*million/i + more than million + 0: more than million + more than MILLION + 0: more than MILLION + more \n than Million + 0: more \x0a than Million + *** Failers +No match + MORE THAN MILLION +No match + more \n than \n million +No match + +/(?:(?s-i)more.*than).*million/i + more than million + 0: more than million + more than MILLION + 0: more than MILLION + more \n than Million + 0: more \x0a than Million + *** Failers +No match + MORE THAN MILLION +No match + more \n than \n million +No match + +/(?>a(?i)b+)+c/ + abc + 0: abc + aBbc + 0: aBbc + aBBc + 0: aBBc + *** Failers +No match + Abc +No match + abAb +No match + abbC +No match + +/(?=a(?i)b)\w\wc/ + abc + 0: abc + aBc + 0: aBc + *** Failers +No match + Ab +No match + abC +No match + aBC +No match + +/(?<=a(?i)b)(\w\w)c/ + abxxc + 0: xxc + 1: xx + aBxxc + 0: xxc + 1: xx + *** Failers +No match + Abxxc +No match + ABxxc +No match + abxxC +No match + +/(?:(a)|b)(?(1)A|B)/ + aA + 0: aA + 1: a + bB + 0: bB + *** Failers +No match + aB +No match + bA +No match + +/^(a)?(?(1)a|b)+$/ + aa + 0: aa + 1: a + b + 0: b + bb + 0: bb + *** Failers +No match + ab +No match + +/^(?(?=abc)\w{3}:|\d\d)$/ + abc: + 0: abc: + 12 + 0: 12 + *** Failers +No match + 123 +No match + xyz +No match + +/^(?(?!abc)\d\d|\w{3}:)$/ + abc: + 0: abc: + 12 + 0: 12 + *** Failers +No match + 123 +No match + xyz +No match + +/(?(?<=foo)bar|cat)/ + foobar + 0: bar + cat + 0: cat + fcat + 0: cat + focat + 0: cat + *** Failers +No match + foocat +No match + +/(?(?a*)*/ + a + 0: a + aa + 0: aa + aaaa + 0: aaaa + +/(abc|)+/ + abc + 0: abc + 1: + abcabc + 0: abcabc + 1: + abcabcabc + 0: abcabcabc + 1: + xyz + 0: + 1: + +/([a]*)*/ + a + 0: a + 1: + aaaaa + 0: aaaaa + 1: + +/([ab]*)*/ + a + 0: a + 1: + b + 0: b + 1: + ababab + 0: ababab + 1: + aaaabcde + 0: aaaab + 1: + bbbb + 0: bbbb + 1: + +/([^a]*)*/ + b + 0: b + 1: + bbbb + 0: bbbb + 1: + aaa + 0: + 1: + +/([^ab]*)*/ + cccc + 0: cccc + 1: + abab + 0: + 1: + +/([a]*?)*/ + a + 0: + 1: + aaaa + 0: + 1: + +/([ab]*?)*/ + a + 0: + 1: + b + 0: + 1: + abab + 0: + 1: + baba + 0: + 1: + +/([^a]*?)*/ + b + 0: + 1: + bbbb + 0: + 1: + aaa + 0: + 1: + +/([^ab]*?)*/ + c + 0: + 1: + cccc + 0: + 1: + baba + 0: + 1: + +/(?>a*)*/ + a + 0: a + aaabcde + 0: aaa + +/((?>a*))*/ + aaaaa + 0: aaaaa + 1: + aabbaa + 0: aa + 1: + +/((?>a*?))*/ + aaaaa + 0: + 1: + aabbaa + 0: + 1: + +/(?(?=[^a-z]+[a-z]) \d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} ) /x + 12-sep-98 + 0: 12-sep-98 + 12-09-98 + 0: 12-09-98 + *** Failers +No match + sep-12-98 +No match + +/(?<=(foo))bar\1/ + foobarfoo + 0: barfoo + 1: foo + foobarfootling + 0: barfoo + 1: foo + *** Failers +No match + foobar +No match + barfoo +No match + +/(?i:saturday|sunday)/ + saturday + 0: saturday + sunday + 0: sunday + Saturday + 0: Saturday + Sunday + 0: Sunday + SATURDAY + 0: SATURDAY + SUNDAY + 0: SUNDAY + SunDay + 0: SunDay + +/(a(?i)bc|BB)x/ + abcx + 0: abcx + 1: abc + aBCx + 0: aBCx + 1: aBC + bbx + 0: bbx + 1: bb + BBx + 0: BBx + 1: BB + *** Failers +No match + abcX +No match + aBCX +No match + bbX +No match + BBX +No match + +/^([ab](?i)[cd]|[ef])/ + ac + 0: ac + 1: ac + aC + 0: aC + 1: aC + bD + 0: bD + 1: bD + elephant + 0: e + 1: e + Europe + 0: E + 1: E + frog + 0: f + 1: f + France + 0: F + 1: F + *** Failers +No match + Africa +No match + +/^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/ + ab + 0: ab + 1: ab + aBd + 0: aBd + 1: aBd + xy + 0: xy + 1: xy + xY + 0: xY + 1: xY + zebra + 0: z + 1: z + Zambesi + 0: Z + 1: Z + *** Failers +No match + aCD +No match + XY +No match + +/(?<=foo\n)^bar/m + foo\nbar + 0: bar + *** Failers +No match + bar +No match + baz\nbar +No match + +/(?<=(?]&/ + <&OUT + 0: <& + +/^(a\1?){4}$/ + aaaaaaaaaa + 0: aaaaaaaaaa + 1: aaaa + *** Failers +No match + AB +No match + aaaaaaaaa +No match + aaaaaaaaaaa +No match + +/^(a(?(1)\1)){4}$/ + aaaaaaaaaa + 0: aaaaaaaaaa + 1: aaaa + *** Failers +No match + aaaaaaaaa +No match + aaaaaaaaaaa +No match + +/(?:(f)(o)(o)|(b)(a)(r))*/ + foobar + 0: foobar + 1: f + 2: o + 3: o + 4: b + 5: a + 6: r + +/(?<=a)b/ + ab + 0: b + *** Failers +No match + cb +No match + b +No match + +/(? + 2: abcd + xy:z:::abcd + 0: xy:z:::abcd + 1: xy:z::: + 2: abcd + +/^[^bcd]*(c+)/ + aexycd + 0: aexyc + 1: c + +/(a*)b+/ + caab + 0: aab + 1: aa + +/([\w:]+::)?(\w+)$/ + abcd + 0: abcd + 1: + 2: abcd + xy:z:::abcd + 0: xy:z:::abcd + 1: xy:z::: + 2: abcd + *** Failers + 0: Failers + 1: + 2: Failers + abcd: +No match + abcd: +No match + +/^[^bcd]*(c+)/ + aexycd + 0: aexyc + 1: c + +/(>a+)ab/ + +/(?>a+)b/ + aaab + 0: aaab + +/([[:]+)/ + a:[b]: + 0: :[ + 1: :[ + +/([[=]+)/ + a=[b]= + 0: =[ + 1: =[ + +/([[.]+)/ + a.[b]. + 0: .[ + 1: .[ + +/((?>a+)b)/ + aaab + 0: aaab + 1: aaab + +/(?>(a+))b/ + aaab + 0: aaab + 1: aaa + +/((?>[^()]+)|\([^()]*\))+/ + ((abc(ade)ufh()()x + 0: abc(ade)ufh()()x + 1: x + +/a\Z/ + *** Failers +No match + aaab +No match + a\nb\n +No match + +/b\Z/ + a\nb\n + 0: b + +/b\z/ + +/b\Z/ + a\nb + 0: b + +/b\z/ + a\nb + 0: b + *** Failers +No match + +/^(?>(?(1)\.|())[^\W_](?>[a-z0-9-]*[^\W_])?)+$/ + a + 0: a + 1: + abc + 0: abc + 1: + a-b + 0: a-b + 1: + 0-9 + 0: 0-9 + 1: + a.b + 0: a.b + 1: + 5.6.7 + 0: 5.6.7 + 1: + the.quick.brown.fox + 0: the.quick.brown.fox + 1: + a100.b200.300c + 0: a100.b200.300c + 1: + 12-ab.1245 + 0: 12-ab.1245 + 1: + *** Failers +No match + \ +No match + .a +No match + -a +No match + a- +No match + a. +No match + a_b +No match + a.- +No match + a.. +No match + ab..bc +No match + the.quick.brown.fox- +No match + the.quick.brown.fox. +No match + the.quick.brown.fox_ +No match + the.quick.brown.fox+ +No match + +/(?>.*)(?<=(abcd|wxyz))/ + alphabetabcd + 0: alphabetabcd + 1: abcd + endingwxyz + 0: endingwxyz + 1: wxyz + *** Failers +No match + a rather long string that doesn't end with one of them +No match + +/word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword/ + word cat dog elephant mussel cow horse canary baboon snake shark otherword + 0: word cat dog elephant mussel cow horse canary baboon snake shark otherword + word cat dog elephant mussel cow horse canary baboon snake shark +No match + +/word (?>[a-zA-Z0-9]+ ){0,30}otherword/ + word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope +No match + +/(?<=\d{3}(?!999))foo/ + 999foo + 0: foo + 123999foo + 0: foo + *** Failers +No match + 123abcfoo +No match + +/(?<=(?!...999)\d{3})foo/ + 999foo + 0: foo + 123999foo + 0: foo + *** Failers +No match + 123abcfoo +No match + +/(?<=\d{3}(?!999)...)foo/ + 123abcfoo + 0: foo + 123456foo + 0: foo + *** Failers +No match + 123999foo +No match + +/(?<=\d{3}...)(? + 2: + 3: abcd +
+ 2: + 3: abcd + \s*)=(?>\s*) # find + 2: + 3: abcd + Z)+|A)*/ + ZABCDEFG + 0: ZA + 1: A + +/((?>)+|A)*/ + ZABCDEFG + 0: + 1: + +/a*/g + abbab + 0: a + 0: + 0: + 0: a + 0: + 0: + +/^[\d-a]/ + abcde + 0: a + -things + 0: - + 0digit + 0: 0 + *** Failers +No match + bcdef +No match + +/[[:space:]]+/ + > \x09\x0a\x0c\x0d\x0b< + 0: \x09\x0a\x0c\x0d\x0b + +/[[:blank:]]+/ + > \x09\x0a\x0c\x0d\x0b< + 0: \x09 + +/[\s]+/ + > \x09\x0a\x0c\x0d\x0b< + 0: \x09\x0a\x0c\x0d\x0b + +/\s+/ + > \x09\x0a\x0c\x0d\x0b< + 0: \x09\x0a\x0c\x0d\x0b + +/a b/x + ab + 0: ab + +/(?!\A)x/m + a\nxb\n + 0: x + +/(?!^)x/m + a\nxb\n +No match + +/abc\Qabc\Eabc/ + abcabcabc + 0: abcabcabc + +/abc\Q(*+|\Eabc/ + abc(*+|abc + 0: abc(*+|abc + +/ abc\Q abc\Eabc/x + abc abcabc + 0: abc abcabc + *** Failers +No match + abcabcabc +No match + +/abc#comment + \Q#not comment + literal\E/x + abc#not comment\n literal + 0: abc#not comment\x0a literal + +/abc#comment + \Q#not comment + literal/x + abc#not comment\n literal + 0: abc#not comment\x0a literal + +/abc#comment + \Q#not comment + literal\E #more comment + /x + abc#not comment\n literal + 0: abc#not comment\x0a literal + +/abc#comment + \Q#not comment + literal\E #more comment/x + abc#not comment\n literal + 0: abc#not comment\x0a literal + +/\Qabc\$xyz\E/ + abc\\\$xyz + 0: abc\$xyz + +/\Qabc\E\$\Qxyz\E/ + abc\$xyz + 0: abc$xyz + +/\Gabc/ + abc + 0: abc + *** Failers +No match + xyzabc +No match + +/\Gabc./g + abc1abc2xyzabc3 + 0: abc1 + 0: abc2 + +/abc./g + abc1abc2xyzabc3 + 0: abc1 + 0: abc2 + 0: abc3 + +/a(?x: b c )d/ + XabcdY + 0: abcd + *** Failers +No match + Xa b c d Y +No match + +/((?x)x y z | a b c)/ + XabcY + 0: abc + 1: abc + AxyzB + 0: xyz + 1: xyz + +/(?i)AB(?-i)C/ + XabCY + 0: abC + *** Failers +No match + XabcY +No match + +/((?i)AB(?-i)C|D)E/ + abCE + 0: abCE + 1: abC + DE + 0: DE + 1: D + *** Failers +No match + abcE +No match + abCe +No match + dE +No match + De +No match + +/(.*)\d+\1/ + abc123abc + 0: abc123abc + 1: abc + abc123bc + 0: bc123bc + 1: bc + +/(.*)\d+\1/s + abc123abc + 0: abc123abc + 1: abc + abc123bc + 0: bc123bc + 1: bc + +/((.*))\d+\1/ + abc123abc + 0: abc123abc + 1: abc + 2: abc + abc123bc + 0: bc123bc + 1: bc + 2: bc + +/-- This tests for an IPv6 address in the form where it can have up to + eight components, one and only one of which is empty. This must be + an internal component. --/ + +/^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + /xi + a123::a123 + 0: a123::a123 + 1: + a123:b342::abcd + 0: a123:b342::abcd + 1: + a123:b342::324e:abcd + 0: a123:b342::324e:abcd + 1: + a123:ddde:b342::324e:abcd + 0: a123:ddde:b342::324e:abcd + 1: + a123:ddde:b342::324e:dcba:abcd + 0: a123:ddde:b342::324e:dcba:abcd + 1: + a123:ddde:9999:b342::324e:dcba:abcd + 0: a123:ddde:9999:b342::324e:dcba:abcd + 1: + *** Failers +No match + 1:2:3:4:5:6:7:8 +No match + a123:bce:ddde:9999:b342::324e:dcba:abcd +No match + a123::9999:b342::324e:dcba:abcd +No match + abcde:2:3:4:5:6:7:8 +No match + ::1 +No match + abcd:fee0:123:: +No match + :1 +No match + 1: +No match + +/[z\Qa-d]\E]/ + z + 0: z + a + 0: a + - + 0: - + d + 0: d + ] + 0: ] + *** Failers + 0: a + b +No match + +/[\z\C]/ + z + 0: z + C + 0: C + +/\M/ + M + 0: M + +/(a+)*b/ + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +No match + +/(?i)reg(?:ul(?:[aä]|ae)r|ex)/ + REGular + 0: REGular + regulaer + 0: regulaer + Regex + 0: Regex + regulär + 0: regul\xe4r + +/Åæåä[à-ÿÀ-ß]+/ + Åæåäà + 0: \xc5\xe6\xe5\xe4\xe0 + Åæåäÿ + 0: \xc5\xe6\xe5\xe4\xff + ÅæåäÀ + 0: \xc5\xe6\xe5\xe4\xc0 + Åæåäß + 0: \xc5\xe6\xe5\xe4\xdf + +/(?<=Z)X./ + \x84XAZXB + 0: XB + +/ab cd (?x) de fg/ + ab cd defg + 0: ab cd defg + +/ab cd(?x) de fg/ + ab cddefg + 0: ab cddefg + ** Failers +No match + abcddefg +No match + +/(? + 2: + D + 0: D + 1: + 2: + +/(a|)*\d/ + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +No match + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4 + 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4 + 1: + +/(?>a|)*\d/ + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +No match + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4 + 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4 + +/(?:a|)*\d/ + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +No match + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4 + 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4 + +/\Z/g + abc\n + 0: + 0: + +/^(?s)(?>.*)(? + 2: a + +/(?>(a))b|(a)c/ + ac + 0: ac + 1: + 2: a + +/(?=(a))ab|(a)c/ + ac + 0: ac + 1: + 2: a + +/((?>(a))b|(a)c)/ + ac + 0: ac + 1: ac + 2: + 3: a + +/((?>(a))b|(a)c)++/ + ac + 0: ac + 1: ac + 2: + 3: a + +/(?:(?>(a))b|(a)c)++/ + ac + 0: ac + 1: + 2: a + +/(?=(?>(a))b|(a)c)(..)/ + ac + 0: ac + 1: + 2: a + 3: ac + +/(?>(?>(a))b|(a)c)/ + ac + 0: ac + 1: + 2: a + +/(?:(?>([ab])))+a=/+ + =ba= + 0: ba= + 0+ + 1: b + +/(?>([ab]))+a=/+ + =ba= + 0: ba= + 0+ + 1: b + +/((?>(a+)b)+(aabab))/ + aaaabaaabaabab + 0: aaaabaaabaabab + 1: aaaabaaabaabab + 2: aaa + 3: aabab + +/(?>a+|ab)+?c/ + aabc +No match + +/(?>a+|ab)+c/ + aabc +No match + +/(?:a+|ab)+c/ + aabc + 0: aabc + +/(?(?=(a))a)/ + a + 0: a + 1: a + +/(?(?=(a))a)(b)/ + ab + 0: ab + 1: a + 2: b + +/^(?:a|ab)++c/ + aaaabc +No match + +/^(?>a|ab)++c/ + aaaabc +No match + +/^(?:a|ab)+c/ + aaaabc + 0: aaaabc + +/(?=abc){3}abc/+ + abcabcabc + 0: abc + 0+ abcabc + ** Failers +No match + xyz +No match + +/(?=abc)+abc/+ + abcabcabc + 0: abc + 0+ abcabc + ** Failers +No match + xyz +No match + +/(?=abc)++abc/+ + abcabcabc + 0: abc + 0+ abcabc + ** Failers +No match + xyz +No match + +/(?=abc){0}xyz/ + xyz + 0: xyz + +/(?=abc){1}xyz/ + ** Failers +No match + xyz +No match + +/(?=(a))?./ + ab + 0: a + 1: a + bc + 0: b + +/(?=(a))??./ + ab + 0: a + bc + 0: b + +/^(?=(?1))?[az]([abc])d/ + abd + 0: abd + 1: b + zcdxx + 0: zcd + 1: c + +/^(?!a){0}\w+/ + aaaaa + 0: aaaaa + +/(?<=(abc))?xyz/ + abcxyz + 0: xyz + 1: abc + pqrxyz + 0: xyz + +/^[\g]+/ + ggg<<>> + 0: ggg<<>> + ** Failers +No match + \\ga +No match + +/^[\ga]+/ + gggagagaxyz + 0: gggagaga + +/^[:a[:digit:]]+/ + aaaa444:::Z + 0: aaaa444::: + +/^[:a[:digit:]:b]+/ + aaaa444:::bbbZ + 0: aaaa444:::bbb + +/[:a]xxx[b:]/ + :xxx: + 0: :xxx: + +/(?<=a{2})b/i + xaabc + 0: b + ** Failers +No match + xabc +No match + +/(?XNNNYZ + 0: XNNNYZ + > X NYQZ + 0: X NYQZ + ** Failers +No match + >XYZ +No match + > X NY Z +No match + +/\v*X\v?Y\v+Z\V*\x0a\V+\x0b\V{2,3}\x0c/ + >XY\x0aZ\x0aA\x0bNN\x0c + 0: XY\x0aZ\x0aA\x0bNN\x0c + >\x0a\x0dX\x0aY\x0a\x0bZZZ\x0aAAA\x0bNNN\x0c + 0: \x0a\x0dX\x0aY\x0a\x0bZZZ\x0aAAA\x0bNNN\x0c + +/(foo)\Kbar/ + foobar + 0: bar + 1: foo + +/(foo)(\Kbar|baz)/ + foobar + 0: bar + 1: foo + 2: bar + foobaz + 0: foobaz + 1: foo + 2: baz + +/(foo\Kbar)baz/ + foobarbaz + 0: barbaz + 1: foobar + +/abc\K|def\K/g+ + Xabcdefghi + 0: + 0+ defghi + 0: + 0+ ghi + +/ab\Kc|de\Kf/g+ + Xabcdefghi + 0: c + 0+ defghi + 0: f + 0+ ghi + +/(?=C)/g+ + ABCDECBA + 0: + 0+ CDECBA + 0: + 0+ CBA + +/^abc\K/+ + abcdef + 0: + 0+ def + ** Failers +No match + defabcxyz +No match + +/^(a(b))\1\g1\g{1}\g-1\g{-1}\g{-02}Z/ + ababababbbabZXXXX + 0: ababababbbabZ + 1: ab + 2: b + +/(?tom|bon)-\g{A}/ + tom-tom + 0: tom-tom + 1: tom + bon-bon + 0: bon-bon + 1: bon + +/(^(a|b\g{-1}))/ + bacxxx +No match + +/(?|(abc)|(xyz))\1/ + abcabc + 0: abcabc + 1: abc + xyzxyz + 0: xyzxyz + 1: xyz + ** Failers +No match + abcxyz +No match + xyzabc +No match + +/(?|(abc)|(xyz))(?1)/ + abcabc + 0: abcabc + 1: abc + xyzabc + 0: xyzabc + 1: xyz + ** Failers +No match + xyzxyz +No match + +/^X(?5)(a)(?|(b)|(q))(c)(d)(Y)/ + XYabcdY + 0: XYabcdY + 1: a + 2: b + 3: c + 4: d + 5: Y + +/^X(?7)(a)(?|(b|(r)(s))|(q))(c)(d)(Y)/ + XYabcdY + 0: XYabcdY + 1: a + 2: b + 3: + 4: + 5: c + 6: d + 7: Y + +/^X(?7)(a)(?|(b|(?|(r)|(t))(s))|(q))(c)(d)(Y)/ + XYabcdY + 0: XYabcdY + 1: a + 2: b + 3: + 4: + 5: c + 6: d + 7: Y + +/(?'abc'\w+):\k{2}/ + a:aaxyz + 0: a:aa + 1: a + ab:ababxyz + 0: ab:abab + 1: ab + ** Failers +No match + a:axyz +No match + ab:abxyz +No match + +/(?'abc'\w+):\g{abc}{2}/ + a:aaxyz + 0: a:aa + 1: a + ab:ababxyz + 0: ab:abab + 1: ab + ** Failers +No match + a:axyz +No match + ab:abxyz +No match + +/^(?a)? (?()b|c) (?('ab')d|e)/x + abd + 0: abd + 1: a + ce + 0: ce + +/^(a.)\g-1Z/ + aXaXZ + 0: aXaXZ + 1: aX + +/^(a.)\g{-1}Z/ + aXaXZ + 0: aXaXZ + 1: aX + +/^(?(DEFINE) (? a) (? b) ) (?&A) (?&B) /x + abcd + 0: ab + +/(?(?&NAME_PAT))\s+(?(?&ADDRESS_PAT)) + (?(DEFINE) + (?[a-z]+) + (?\d+) + )/x + metcalfe 33 + 0: metcalfe 33 + 1: metcalfe + 2: 33 + +/(?(DEFINE)(?2[0-4]\d|25[0-5]|1\d\d|[1-9]?\d))\b(?&byte)(\.(?&byte)){3}/ + 1.2.3.4 + 0: 1.2.3.4 + 1: + 2: .4 + 131.111.10.206 + 0: 131.111.10.206 + 1: + 2: .206 + 10.0.0.0 + 0: 10.0.0.0 + 1: + 2: .0 + ** Failers +No match + 10.6 +No match + 455.3.4.5 +No match + +/\b(?&byte)(\.(?&byte)){3}(?(DEFINE)(?2[0-4]\d|25[0-5]|1\d\d|[1-9]?\d))/ + 1.2.3.4 + 0: 1.2.3.4 + 1: .4 + 131.111.10.206 + 0: 131.111.10.206 + 1: .206 + 10.0.0.0 + 0: 10.0.0.0 + 1: .0 + ** Failers +No match + 10.6 +No match + 455.3.4.5 +No match + +/^(\w++|\s++)*$/ + now is the time for all good men to come to the aid of the party + 0: now is the time for all good men to come to the aid of the party + 1: party + *** Failers +No match + this is not a line with only words and spaces! +No match + +/(\d++)(\w)/ + 12345a + 0: 12345a + 1: 12345 + 2: a + *** Failers +No match + 12345+ +No match + +/a++b/ + aaab + 0: aaab + +/(a++b)/ + aaab + 0: aaab + 1: aaab + +/(a++)b/ + aaab + 0: aaab + 1: aaa + +/([^()]++|\([^()]*\))+/ + ((abc(ade)ufh()()x + 0: abc(ade)ufh()()x + 1: x + +/\(([^()]++|\([^()]+\))+\)/ + (abc) + 0: (abc) + 1: abc + (abc(def)xyz) + 0: (abc(def)xyz) + 1: xyz + *** Failers +No match + ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +No match + +/^([^()]|\((?1)*\))*$/ + abc + 0: abc + 1: c + a(b)c + 0: a(b)c + 1: c + a(b(c))d + 0: a(b(c))d + 1: d + *** Failers) +No match + a(b(c)d +No match + +/^>abc>([^()]|\((?1)*\))*abc>123abc>123abc>1(2)3abc>1(2)3abc>(1(2)3)abc>(1(2)3) + 2: + 3: Satanoscillatemymetallicsonatas + 4: S + AmanaplanacanalPanama + 0: AmanaplanacanalPanama + 1: + 2: + 3: AmanaplanacanalPanama + 4: A + AblewasIereIsawElba + 0: AblewasIereIsawElba + 1: + 2: + 3: AblewasIereIsawElba + 4: A + *** Failers +No match + Thequickbrownfox +No match + +/^(\d+|\((?1)([+*-])(?1)\)|-(?1))$/ + 12 + 0: 12 + 1: 12 + (((2+2)*-3)-7) + 0: (((2+2)*-3)-7) + 1: (((2+2)*-3)-7) + 2: - + -12 + 0: -12 + 1: -12 + *** Failers +No match + ((2+2)*-3)-7) +No match + +/^(x(y|(?1){2})z)/ + xyz + 0: xyz + 1: xyz + 2: y + xxyzxyzz + 0: xxyzxyzz + 1: xxyzxyzz + 2: xyzxyz + *** Failers +No match + xxyzz +No match + xxyzxyzxyzz +No match + +/((< (?: (?(R) \d++ | [^<>]*+) | (?2)) * >))/x + <> + 0: <> + 1: <> + 2: <> + + 0: + 1: + 2: + hij> + 0: hij> + 1: hij> + 2: hij> + hij> + 0: + 1: + 2: + def> + 0: def> + 1: def> + 2: def> + + 0: <> + 1: <> + 2: <> + *** Failers +No match + + 2: + 3: Satan, oscillate my metallic sonatas + 4: S + A man, a plan, a canal: Panama! + 0: A man, a plan, a canal: Panama! + 1: + 2: + 3: A man, a plan, a canal: Panama + 4: A + Able was I ere I saw Elba. + 0: Able was I ere I saw Elba. + 1: + 2: + 3: Able was I ere I saw Elba + 4: A + *** Failers +No match + The quick brown fox +No match + +/^((.)(?1)\2|.)$/ + a + 0: a + 1: a + aba + 0: aba + 1: aba + 2: a + aabaa + 0: aabaa + 1: aabaa + 2: a + abcdcba + 0: abcdcba + 1: abcdcba + 2: a + pqaabaaqp + 0: pqaabaaqp + 1: pqaabaaqp + 2: p + ablewasiereisawelba + 0: ablewasiereisawelba + 1: ablewasiereisawelba + 2: a + rhubarb +No match + the quick brown fox +No match + +/(a)(?<=b(?1))/ + baz + 0: a + 1: a + ** Failers +No match + caz +No match + +/(?<=b(?1))(a)/ + zbaaz + 0: a + 1: a + ** Failers +No match + aaa +No match + +/(?a)(?<=b(?&X))/ + baz + 0: a + 1: a + +/^(?|(abc)|(def))\1/ + abcabc + 0: abcabc + 1: abc + defdef + 0: defdef + 1: def + ** Failers +No match + abcdef +No match + defabc +No match + +/^(?|(abc)|(def))(?1)/ + abcabc + 0: abcabc + 1: abc + defabc + 0: defabc + 1: def + ** Failers +No match + defdef +No match + abcdef +No match + +/(?:a(? (?')|(?")) |b(? (?')|(?")) ) (?('quote')[a-z]+|[0-9]+)/xJ + a\"aaaaa + 0: a"aaaaa + 1: " + 2: + 3: " + b\"aaaaa + 0: b"aaaaa + 1: + 2: + 3: + 4: " + 5: + 6: " + ** Failers +No match + b\"11111 +No match + +/(?:(?1)|B)(A(*F)|C)/ + ABCD + 0: BC + 1: C + CCD + 0: CC + 1: C + ** Failers +No match + CAD +No match + +/^(?:(?1)|B)(A(*F)|C)/ + CCD + 0: CC + 1: C + BCD + 0: BC + 1: C + ** Failers +No match + ABCD +No match + CAD +No match + BAD +No match + +/(?:(?1)|B)(A(*ACCEPT)XX|C)D/ + AAD + 0: AA + 1: A + ACD + 0: ACD + 1: C + BAD + 0: BA + 1: A + BCD + 0: BCD + 1: C + BAX + 0: BA + 1: A + ** Failers +No match + ACX +No match + ABC +No match + +/(?(DEFINE)(A))B(?1)C/ + BAC + 0: BAC + +/(?(DEFINE)((A)\2))B(?1)C/ + BAAC + 0: BAAC + +/(? \( ( [^()]++ | (?&pn) )* \) )/x + (ab(cd)ef) + 0: (ab(cd)ef) + 1: (ab(cd)ef) + 2: ef + +/^(?=a(*SKIP)b|ac)/ + ** Failers +No match + ac +No match + +/^(?=a(*PRUNE)b)/ + ab + 0: + ** Failers +No match + ac +No match + +/^(?=a(*ACCEPT)b)/ + ac + 0: + +/(?>a\Kb)/ + ab + 0: b + +/((?>a\Kb))/ + ab + 0: b + 1: ab + +/(a\Kb)/ + ab + 0: b + 1: ab + +/^a\Kcz|ac/ + ac + 0: ac + +/(?>a\Kbz|ab)/ + ab + 0: ab + +/^(?&t)(?(DEFINE)(?a\Kb))$/ + ab + 0: b + +/^([^()]|\((?1)*\))*$/ + a(b)c + 0: a(b)c + 1: c + a(b(c)d)e + 0: a(b(c)d)e + 1: e + +/(?P(?P0)(?P>L1)|(?P>L2))/ + 0 + 0: 0 + 1: 0 + 00 + 0: 00 + 1: 00 + 2: 0 + 0000 + 0: 0000 + 1: 0000 + 2: 0 + +/(?P(?P0)|(?P>L2)(?P>L1))/ + 0 + 0: 0 + 1: 0 + 2: 0 + 00 + 0: 0 + 1: 0 + 2: 0 + 0000 + 0: 0 + 1: 0 + 2: 0 + +/--- This one does fail, as expected, in Perl. It needs the complex item at the + end of the pattern. A single letter instead of (B|D) makes it not fail, + which I think is a Perl bug. --- / + +/A(*COMMIT)(B|D)/ + ACABX +No match + +/--- Check the use of names for failure ---/ + +/^(A(*PRUNE:A)B|C(*PRUNE:B)D)/K + ** Failers +No match + AC +No match, mark = A + CB +No match, mark = B + +/--- Force no study, otherwise mark is not seen. The studied version is in + test 2 because it isn't Perl-compatible. ---/ + +/(*MARK:A)(*SKIP:B)(C|X)/KSS + C + 0: C + 1: C +MK: A + D +No match, mark = A + +/^(A(*THEN:A)B|C(*THEN:B)D)/K + ** Failers +No match + CB +No match, mark = B + +/^(?:A(*THEN:A)B|C(*THEN:B)D)/K + CB +No match, mark = B + +/^(?>A(*THEN:A)B|C(*THEN:B)D)/K + CB +No match, mark = B + +/--- This should succeed, as the skip causes bump to offset 1 (the mark). Note +that we have to have something complicated such as (B|Z) at the end because, +for Perl, a simple character somehow causes an unwanted optimization to mess +with the handling of backtracking verbs. ---/ + +/A(*MARK:A)A+(*SKIP:A)(B|Z) | AC/xK + AAAC + 0: AC + +/--- Test skipping over a non-matching mark. ---/ + +/A(*MARK:A)A+(*MARK:B)(*SKIP:A)(B|Z) | AC/xK + AAAC + 0: AC + +/--- Check shorthand for MARK ---/ + +/A(*:A)A+(*SKIP:A)(B|Z) | AC/xK + AAAC + 0: AC + +/--- Don't loop! Force no study, otherwise mark is not seen. ---/ + +/(*:A)A+(*SKIP:A)(B|Z)/KSS + AAAC +No match, mark = A + +/--- This should succeed, as a non-existent skip name disables the skip ---/ + +/A(*MARK:A)A+(*SKIP:B)(B|Z) | AC/xK + AAAC + 0: AC + +/A(*MARK:A)A+(*SKIP:B)(B|Z) | AC(*:B)/xK + AAAC + 0: AC +MK: B + +/--- COMMIT at the start of a pattern should act like an anchor. Again, +however, we need the complication for Perl. ---/ + +/(*COMMIT)(A|P)(B|P)(C|P)/ + ABCDEFG + 0: ABC + 1: A + 2: B + 3: C + ** Failers +No match + DEFGABC +No match + +/--- COMMIT inside an atomic group can't stop backtracking over the group. ---/ + +/(\w+)(?>b(*COMMIT))\w{2}/ + abbb + 0: abbb + 1: a + +/(\w+)b(*COMMIT)\w{2}/ + abbb +No match + +/--- Check opening parens in comment when seeking forward reference. ---/ + +/(?&t)(?#()(?(DEFINE)(?a))/ + bac + 0: a + +/--- COMMIT should override THEN ---/ + +/(?>(*COMMIT)(?>yes|no)(*THEN)(*F))?/ + yes +No match + +/(?>(*COMMIT)(yes|no)(*THEN)(*F))?/ + yes +No match + +/b?(*SKIP)c/ + bc + 0: bc + abc + 0: bc + +/(*SKIP)bc/ + a +No match + +/(*SKIP)b/ + a +No match + +/(?P(?P=abn)xxx|)+/ + xxx + 0: + 1: + +/(?i:([^b]))(?1)/ + aa + 0: aa + 1: a + aA + 0: aA + 1: a + ** Failers + 0: ** + 1: * + ab +No match + aB +No match + Ba +No match + ba +No match + +/^(?&t)*+(?(DEFINE)(?a))\w$/ + aaaaaaX + 0: aaaaaaX + ** Failers +No match + aaaaaa +No match + +/^(?&t)*(?(DEFINE)(?a))\w$/ + aaaaaaX + 0: aaaaaaX + aaaaaa + 0: aaaaaa + +/^(a)*+(\w)/ + aaaaX + 0: aaaaX + 1: a + 2: X + YZ + 0: Y + 1: + 2: Y + ** Failers +No match + aaaa +No match + +/^(?:a)*+(\w)/ + aaaaX + 0: aaaaX + 1: X + YZ + 0: Y + 1: Y + ** Failers +No match + aaaa +No match + +/^(a)++(\w)/ + aaaaX + 0: aaaaX + 1: a + 2: X + ** Failers +No match + aaaa +No match + YZ +No match + +/^(?:a)++(\w)/ + aaaaX + 0: aaaaX + 1: X + ** Failers +No match + aaaa +No match + YZ +No match + +/^(a)?+(\w)/ + aaaaX + 0: aa + 1: a + 2: a + YZ + 0: Y + 1: + 2: Y + +/^(?:a)?+(\w)/ + aaaaX + 0: aa + 1: a + YZ + 0: Y + 1: Y + +/^(a){2,}+(\w)/ + aaaaX + 0: aaaaX + 1: a + 2: X + ** Failers +No match + aaa +No match + YZ +No match + +/^(?:a){2,}+(\w)/ + aaaaX + 0: aaaaX + 1: X + ** Failers +No match + aaa +No match + YZ +No match + +/(a|)*(?1)b/ + b + 0: b + 1: + ab + 0: ab + 1: + aab + 0: aab + 1: + +/(a)++(?1)b/ + ** Failers +No match + ab +No match + aab +No match + +/(a)*+(?1)b/ + ** Failers +No match + ab +No match + aab +No match + +/(?1)(?:(b)){0}/ + b + 0: b + +/(foo ( \( ((?:(?> [^()]+ )|(?2))*) \) ) )/x + foo(bar(baz)+baz(bop)) + 0: foo(bar(baz)+baz(bop)) + 1: foo(bar(baz)+baz(bop)) + 2: (bar(baz)+baz(bop)) + 3: bar(baz)+baz(bop) + +/(A (A|B(*ACCEPT)|C) D)(E)/x + AB + 0: AB + 1: AB + 2: B + +/\A.*?(a|bc)/ + ba + 0: ba + 1: a + +/\A.*?(?:a|bc)++/ + ba + 0: ba + +/\A.*?(a|bc)++/ + ba + 0: ba + 1: a + +/\A.*?(?:a|bc|d)/ + ba + 0: ba + +/(?:(b))++/ + beetle + 0: b + 1: b + +/(?(?=(a(*ACCEPT)z))a)/ + a + 0: a + 1: a + +/^(a)(?1)+ab/ + aaaab + 0: aaaab + 1: a + +/^(a)(?1)++ab/ + aaaab +No match + +/^(?=a(*:M))aZ/K + aZbc + 0: aZ +MK: M + +/^(?!(*:M)b)aZ/K + aZbc + 0: aZ + +/(?(DEFINE)(a))?b(?1)/ + backgammon + 0: ba + +/^\N+/ + abc\ndef + 0: abc + +/^\N{1,}/ + abc\ndef + 0: abc + +/(?(R)a+|(?R)b)/ + aaaabcde + 0: aaaab + +/(?(R)a+|((?R))b)/ + aaaabcde + 0: aaaab + 1: aaaa + +/((?(R)a+|(?1)b))/ + aaaabcde + 0: aaaab + 1: aaaab + +/((?(R1)a+|(?1)b))/ + aaaabcde + 0: aaaab + 1: aaaab + +/((?(R)a|(?1)))*/ + aaa + 0: aaa + 1: a + +/((?(R)a|(?1)))+/ + aaa + 0: aaa + 1: a + +/a(*:any +name)/K + abc + 0: a +MK: any \x0aname + +/(?>(?&t)c|(?&t))(?(DEFINE)(?a|b(*PRUNE)c))/ + a + 0: a + ba + 0: a + bba + 0: a + +/--- Checking revised (*THEN) handling ---/ + +/--- Capture ---/ + +/^.*? (a(*THEN)b) c/x + aabc +No match + +/^.*? (a(*THEN)b|(*F)) c/x + aabc + 0: aabc + 1: ab + +/^.*? ( (a(*THEN)b) | (*F) ) c/x + aabc + 0: aabc + 1: ab + 2: ab + +/^.*? ( (a(*THEN)b) ) c/x + aabc +No match + +/--- Non-capture ---/ + +/^.*? (?:a(*THEN)b) c/x + aabc +No match + +/^.*? (?:a(*THEN)b|(*F)) c/x + aabc + 0: aabc + +/^.*? (?: (?:a(*THEN)b) | (*F) ) c/x + aabc + 0: aabc + +/^.*? (?: (?:a(*THEN)b) ) c/x + aabc +No match + +/--- Atomic ---/ + +/^.*? (?>a(*THEN)b) c/x + aabc +No match + +/^.*? (?>a(*THEN)b|(*F)) c/x + aabc + 0: aabc + +/^.*? (?> (?>a(*THEN)b) | (*F) ) c/x + aabc + 0: aabc + +/^.*? (?> (?>a(*THEN)b) ) c/x + aabc +No match + +/--- Possessive capture ---/ + +/^.*? (a(*THEN)b)++ c/x + aabc +No match + +/^.*? (a(*THEN)b|(*F))++ c/x + aabc + 0: aabc + 1: ab + +/^.*? ( (a(*THEN)b)++ | (*F) )++ c/x + aabc + 0: aabc + 1: ab + 2: ab + +/^.*? ( (a(*THEN)b)++ )++ c/x + aabc +No match + +/--- Possessive non-capture ---/ + +/^.*? (?:a(*THEN)b)++ c/x + aabc +No match + +/^.*? (?:a(*THEN)b|(*F))++ c/x + aabc + 0: aabc + +/^.*? (?: (?:a(*THEN)b)++ | (*F) )++ c/x + aabc + 0: aabc + +/^.*? (?: (?:a(*THEN)b)++ )++ c/x + aabc +No match + +/--- Condition assertion ---/ + +/^(?(?=a(*THEN)b)ab|ac)/ + ac + 0: ac + +/--- Condition ---/ + +/^.*?(?(?=a)a|b(*THEN)c)/ + ba +No match + +/^.*?(?:(?(?=a)a|b(*THEN)c)|d)/ + ba + 0: ba + +/^.*?(?(?=a)a(*THEN)b|c)/ + ac +No match + +/--- Assertion ---/ + +/^.*(?=a(*THEN)b)/ + aabc + 0: a + +/------------------------------/ + +/(?>a(*:m))/imsxSK + a + 0: a +MK: m + +/(?>(a)(*:m))/imsxSK + a + 0: a + 1: a +MK: m + +/(?<=a(*ACCEPT)b)c/ + xacd + 0: c + +/(?<=(a(*ACCEPT)b))c/ + xacd + 0: c + 1: a + +/(?<=(a(*COMMIT)b))c/ + xabcd + 0: c + 1: ab + ** Failers +No match + xacd +No match + +/(? + 2: + +/(another)?(\1+)test/ + hello world test +No match + +/(a(*COMMIT)b){0}a(?1)|aac/ + aac + 0: aac + +/((?:a?)*)*c/ + aac + 0: aac + 1: + +/((?>a?)*)*c/ + aac + 0: aac + 1: + +/(?>.*?a)(?<=ba)/ + aba + 0: ba + +/(?:.*?a)(?<=ba)/ + aba + 0: aba + +/.*?a(*PRUNE)b/ + aab + 0: ab + +/.*?a(*PRUNE)b/s + aab + 0: ab + +/^a(*PRUNE)b/s + aab +No match + +/.*?a(*SKIP)b/ + aab + 0: ab + +/(?>.*?a)b/s + aab + 0: ab + +/(?>.*?a)b/ + aab + 0: ab + +/(?>^a)b/s + aab +No match + +/(?>.*?)(?<=(abcd)|(wxyz))/ + alphabetabcd + 0: + 1: abcd + endingwxyz + 0: + 1: + 2: wxyz + +/(?>.*)(?<=(abcd)|(wxyz))/ + alphabetabcd + 0: alphabetabcd + 1: abcd + endingwxyz + 0: endingwxyz + 1: + 2: wxyz + +"(?>.*)foo" + abcdfooxyz +No match + +"(?>.*?)foo" + abcdfooxyz + 0: foo + +/(?:(a(*PRUNE)b)){0}(?:(?1)|ac)/ + ac + 0: ac + +/(?:(a(*SKIP)b)){0}(?:(?1)|ac)/ + ac + 0: ac + +/(?<=(*SKIP)ac)a/ + aa +No match + +/A(*MARK:A)A+(*SKIP:B)(B|Z) | AC/xK + AAAC + 0: AC + +/a(*SKIP:m)x|ac(*:n)(*SKIP:n)d|ac/K + acacd + 0: acd +MK: n + +/A(*SKIP:m)x|A(*SKIP:n)x|AB/K + AB + 0: AB + +/((*SKIP:r)d){0}a(*SKIP:m)x|ac(*:n)|ac/K + acacd + 0: ac +MK: n + +/-- Tests that try to figure out how Perl works. My hypothesis is that the + first verb that is backtracked onto is the one that acts. This seems to be + the case almost all the time, but there is one exception that is perhaps a + bug. --/ + +/-- This matches "aaaac"; each PRUNE advances one character until the subject + no longer starts with 5 'a's. --/ + +/aaaaa(*PRUNE)b|a+c/ + aaaaaac + 0: aaaac + +/-- Putting SKIP in front of PRUNE makes no difference, as it is never +backtracked onto, whether or not it has a label. --/ + +/aaaaa(*SKIP)(*PRUNE)b|a+c/ + aaaaaac + 0: aaaac + +/aaaaa(*SKIP:N)(*PRUNE)b|a+c/ + aaaaaac + 0: aaaac + +/aaaa(*:N)a(*SKIP:N)(*PRUNE)b|a+c/ + aaaaaac + 0: aaaac + +/-- Putting THEN in front makes no difference. */ + +/aaaaa(*THEN)(*PRUNE)b|a+c/ + aaaaaac + 0: aaaac + +/-- However, putting COMMIT in front of the prune changes it to "no match". I + think this is inconsistent and possibly a bug. For the moment, running this + test is moved out of the Perl-compatible file. --/ + +/aaaaa(*COMMIT)(*PRUNE)b|a+c/ + + +/---- OK, lets play the same game again using SKIP instead of PRUNE. ----/ + +/-- This matches "ac" because SKIP forces the next match to start on the + sixth "a". --/ + +/aaaaa(*SKIP)b|a+c/ + aaaaaac + 0: ac + +/-- Putting PRUNE in front makes no difference. --/ + +/aaaaa(*PRUNE)(*SKIP)b|a+c/ + aaaaaac + 0: ac + +/-- Putting THEN in front makes no difference. --/ + +/aaaaa(*THEN)(*SKIP)b|a+c/ + aaaaaac + 0: ac + +/-- In this case, neither does COMMIT. This still matches "ac". --/ + +/aaaaa(*COMMIT)(*SKIP)b|a+c/ + aaaaaac + 0: ac + +/-- This gives "no match", as expected. --/ + +/aaaaa(*COMMIT)b|a+c/ + aaaaaac +No match + + +/------ Tests using THEN ------/ + +/-- This matches "aaaaaac", as expected. --/ + +/aaaaa(*THEN)b|a+c/ + aaaaaac + 0: aaaaaac + +/-- Putting SKIP in front makes no difference. --/ + +/aaaaa(*SKIP)(*THEN)b|a+c/ + aaaaaac + 0: aaaaaac + +/-- Putting PRUNE in front makes no difference. --/ + +/aaaaa(*PRUNE)(*THEN)b|a+c/ + aaaaaac + 0: aaaaaac + +/-- Putting COMMIT in front makes no difference. --/ + +/aaaaa(*COMMIT)(*THEN)b|a+c/ + aaaaaac + 0: aaaaaac + +/-- End of "priority" tests --/ + +/aaaaa(*:m)(*PRUNE:m)(*SKIP:m)m|a+/ + aaaaaa + 0: a + +/aaaaa(*:m)(*MARK:m)(*PRUNE)(*SKIP:m)m|a+/ + aaaaaa + 0: a + +/aaaaa(*:n)(*PRUNE:m)(*SKIP:m)m|a+/ + aaaaaa + 0: aaaa + +/aaaaa(*:n)(*MARK:m)(*PRUNE)(*SKIP:m)m|a+/ + aaaaaa + 0: a + +/a(*MARK:A)aa(*PRUNE:A)a(*SKIP:A)b|a+c/ + aaaac + 0: aac + +/a(*MARK:A)aa(*MARK:A)a(*SKIP:A)b|a+c/ + aaaac + 0: ac + +/aaa(*PRUNE:A)a(*SKIP:A)b|a+c/ + aaaac + 0: aac + +/aaa(*MARK:A)a(*SKIP:A)b|a+c/ + aaaac + 0: ac + +/a(*:m)a(*COMMIT)(*SKIP:m)b|a+c/K + aaaaaac + 0: ac + +/.?(a|b(*THEN)c)/ + ba + 0: ba + 1: a + +/(a(*COMMIT)b)c|abd/ + abc + 0: abc + 1: ab + abd +No match + +/(?=a(*COMMIT)b)abc|abd/ + abc + 0: abc + abd + 0: abd + +/(?>a(*COMMIT)b)c|abd/ + abc + 0: abc + abd + 0: abd + +/a(?=b(*COMMIT)c)[^d]|abd/ + abd +No match + abc + 0: ab + +/a(?=bc).|abd/ + abd + 0: abd + abc + 0: ab + +/a(?>b(*COMMIT)c)d|abd/ + abceabd +No match + +/a(?>bc)d|abd/ + abceabd + 0: abd + +/(?>a(*COMMIT)b)c|abd/ + abd + 0: abd + +/(?>a(*COMMIT)c)d|abd/ + abd +No match + +/((?=a(*COMMIT)b)ab|ac){0}(?:(?1)|a(c))/ + ac + 0: ac + 1: + 2: c + +/-- These tests were formerly in test 2, but changes in PCRE and Perl have + made them compatible. --/ + +/^(a)?(?(1)a|b)+$/ + *** Failers +No match + a +No match + +/(?=a\Kb)ab/ + ab + 0: b + +/(?!a\Kb)ac/ + ac + 0: ac + +/^abc(?<=b\Kc)d/ + abcd + 0: cd + +/^abc(?b))/K + abc + 0: b +MK: m(m + +/(*PRUNE:m(m)(?&y)(?(DEFINE)(?b))/K + abc + 0: b +MK: m(m + +/(*SKIP:m(m)(?&y)(?(DEFINE)(?b))/K + abc + 0: b + +/(*THEN:m(m)(?&y)(?(DEFINE)(?b))/K + abc + 0: b +MK: m(m + +/^\d*\w{4}/ + 1234 + 0: 1234 + 123 +No match + +/^[^b]*\w{4}/ + aaaa + 0: aaaa + aaa +No match + +/^[^b]*\w{4}/i + aaaa + 0: aaaa + aaa +No match + +/^a*\w{4}/ + aaaa + 0: aaaa + aaa +No match + +/^a*\w{4}/i + aaaa + 0: aaaa + aaa +No match + +/(?(?=ab)ab)/+ + ca + 0: + 0+ ca + cd + 0: + 0+ cd + +/(?:(?foo)|(?bar))\k/J + foofoo + 0: foofoo + 1: foo + barbar + 0: barbar + 1: + 2: bar + +/(?A)(?:(?foo)|(?bar))\k/J + AfooA + 0: AfooA + 1: A + 2: foo + AbarA + 0: AbarA + 1: A + 2: + 3: bar + ** Failers +No match + Afoofoo +No match + Abarbar +No match + +/^(\d+)\s+IN\s+SOA\s+(\S+)\s+(\S+)\s*\(\s*$/ + 1 IN SOA non-sp1 non-sp2( + 0: 1 IN SOA non-sp1 non-sp2( + 1: 1 + 2: non-sp1 + 3: non-sp2 + +/^ (?:(?A)|(?'B'B)(?A)) (?('A')x) (?()y)$/xJ + Ax + 0: Ax + 1: A + BAxy + 0: BAxy + 1: + 2: B + 3: A + +/^A\xZ/ + A\0Z + 0: A\x00Z + +/^A\o{123}B/ + A\123B + 0: ASB + +/ ^ a + + b $ /x + aaaab + 0: aaaab + +/ ^ a + #comment + + b $ /x + aaaab + 0: aaaab + +/ ^ a + #comment + #comment + + b $ /x + aaaab + 0: aaaab + +/ ^ (?> a + ) b $ /x + aaaab + 0: aaaab + +/ ^ ( a + ) + + \w $ /x + aaaab + 0: aaaab + 1: aaaa + +/(?:a\Kb)*+/+ + ababc + 0: b + 0+ c + +/(?>a\Kb)*/+ + ababc + 0: b + 0+ c + +/(?:a\Kb)*/+ + ababc + 0: b + 0+ c + +/(a\Kb)*+/+ + ababc + 0: b + 0+ c + 1: ab + +/(a\Kb)*/+ + ababc + 0: b + 0+ c + 1: ab + +/(?:x|(?:(xx|yy)+|x|x|x|x|x)|a|a|a)bc/ + acb +No match + +'\A(?:[^\"]++|\"(?:[^\"]*+|\"\")*+\")++' + NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED + 0: NON QUOTED "QUOT""ED" AFTER + +'\A(?:[^\"]++|\"(?:[^\"]++|\"\")*+\")++' + NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED + 0: NON QUOTED "QUOT""ED" AFTER + +'\A(?:[^\"]++|\"(?:[^\"]++|\"\")++\")++' + NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED + 0: NON QUOTED "QUOT""ED" AFTER + +'\A([^\"1]++|[\"2]([^\"3]*+|[\"4][\"5])*+[\"6])++' + NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED + 0: NON QUOTED "QUOT""ED" AFTER + 1: AFTER + 2: + +/^\w+(?>\s*)(?<=\w)/ + test test + 0: tes + +/(?Pa)(?Pb)/gJ + abbaba + 0: ab + 1: a + 2: b + 0: ab + 1: a + 2: b + +/(?Pa)(?Pb)(?P=same)/gJ + abbaba + 0: aba + 1: a + 2: b + +/(?P=same)?(?Pa)(?Pb)/gJ + abbaba + 0: ab + 1: a + 2: b + 0: ab + 1: a + 2: b + +/(?:(?P=same)?(?:(?Pa)|(?Pb))(?P=same))+/gJ + bbbaaabaabb + 0: bbbaaaba + 1: a + 2: b + 0: bb + 1: + 2: b + +/(?:(?P=same)?(?:(?P=same)(?Pa)(?P=same)|(?P=same)?(?Pb)(?P=same)){2}(?P=same)(?Pc)(?P=same)){2}(?Pz)?/gJ + bbbaaaccccaaabbbcc +No match + +/(?Pa)?(?Pb)?(?()c|d)*l/ + acl + 0: acl + 1: a + bdl + 0: bdl + 1: + 2: b + adl + 0: dl + bcl + 0: l + +/\sabc/ + \x{0b}abc + 0: \x0babc + +/[\Qa]\E]+/ + aa]] + 0: aa]] + +/[\Q]a\E]+/ + aa]] + 0: aa]] + +/(?:((abcd))|(((?:(?:(?:(?:abc|(?:abcdef))))b)abcdefghi)abc)|((*ACCEPT)))/ + 1234abcd + 0: + 1: + 2: + 3: + 4: + 5: + +/(\2)(\1)/ + +"Z*(|d*){216}" + +"(?1)(?#?'){8}(a)" + baaaaaaaaac + 0: aaaaaaaaa + 1: a + +"(?|(\k'Pm')|(?'Pm'))" + abcd + 0: + 1: + +/(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[,;:])(?=.{8,16})(?!.*[\s])/ + \ Fred:099 + 0: + +/(?=.*X)X$/ + \ X + 0: X + +/X+(?#comment)?/ + >XXX< + 0: X + +/ (? \w+ )* \. /xi + pokus. + 0: pokus. + 1: pokus + +/(?(DEFINE) (? \w+ ) ) (?&word)* \./xi + pokus. + 0: pokus. + +/(?(DEFINE) (? \w+ ) ) ( (?&word)* ) \./xi + pokus. + 0: pokus. + 1: + 2: pokus + +/(?&word)* (?(DEFINE) (? \w+ ) ) \./xi + pokus. + 0: pokus. + +/(?&word)* \. (? \w+ )/xi + pokus.hokus + 0: pokus.hokus + 1: hokus + +/-- End of testinput1 --/ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput10 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput10 new file mode 100755 index 000000000..b89169cdd --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput10 @@ -0,0 +1,2547 @@ +/-- This set of tests check Unicode property support with the DFA matching + functionality of pcre_dfa_exec(). The -dfa flag must be used with pcretest + when running it. --/ + +/\pL\P{Nd}/8 + AB + 0: AB + *** Failers + 0: Fa + A0 +No match + 00 +No match + +/\X./8 + AB + 0: AB + A\x{300}BC + 0: A\x{300}B + A\x{300}\x{301}\x{302}BC + 0: A\x{300}\x{301}\x{302}B + *** Failers + 0: ** + \x{300} +No match + +/\X\X/8 + ABC + 0: AB + A\x{300}B\x{300}\x{301}C + 0: A\x{300}B\x{300}\x{301} + A\x{300}\x{301}\x{302}BC + 0: A\x{300}\x{301}\x{302}B + *** Failers + 0: ** + \x{300} +No match + +/^\pL+/8 + abcd + 0: abcd + a + 0: a + *** Failers +No match + +/^\PL+/8 + 1234 + 0: 1234 + = + 0: = + *** Failers + 0: *** + abcd +No match + +/^\X+/8 + abcdA\x{300}\x{301}\x{302} + 0: abcdA\x{300}\x{301}\x{302} + A\x{300}\x{301}\x{302} + 0: A\x{300}\x{301}\x{302} + A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302} + 0: A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302} + a + 0: a + *** Failers + 0: *** Failers + \x{300}\x{301}\x{302} + 0: \x{300}\x{301}\x{302} + +/\X?abc/8 + abc + 0: abc + A\x{300}abc + 0: A\x{300}abc + A\x{300}\x{301}\x{302}A\x{300}A\x{300}A\x{300}abcxyz + 0: A\x{300}abc + \x{300}abc + 0: \x{300}abc + *** Failers +No match + +/^\X?abc/8 + abc + 0: abc + A\x{300}abc + 0: A\x{300}abc + *** Failers +No match + A\x{300}\x{301}\x{302}A\x{300}A\x{300}A\x{300}abcxyz +No match + \x{300}abc + 0: \x{300}abc + +/\X*abc/8 + abc + 0: abc + A\x{300}abc + 0: A\x{300}abc + A\x{300}\x{301}\x{302}A\x{300}A\x{300}A\x{300}abcxyz + 0: A\x{300}\x{301}\x{302}A\x{300}A\x{300}A\x{300}abc + \x{300}abc + 0: \x{300}abc + *** Failers +No match + +/^\X*abc/8 + abc + 0: abc + A\x{300}abc + 0: A\x{300}abc + A\x{300}\x{301}\x{302}A\x{300}A\x{300}A\x{300}abcxyz + 0: A\x{300}\x{301}\x{302}A\x{300}A\x{300}A\x{300}abc + *** Failers +No match + \x{300}abc + 0: \x{300}abc + +/^\pL?=./8 + A=b + 0: A=b + =c + 0: =c + *** Failers +No match + 1=2 +No match + AAAA=b +No match + +/^\pL*=./8 + AAAA=b + 0: AAAA=b + =c + 0: =c + *** Failers +No match + 1=2 +No match + +/^\X{2,3}X/8 + A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302}X + 0: A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302}X + A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302}X + 0: A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302}X + *** Failers +No match + X +No match + A\x{300}\x{301}\x{302}X +No match + A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302}X +No match + +/^\pC\pL\pM\pN\pP\pS\pZ\p{Xsp}/8 + >\x{1680}\x{2028}\x{0b} + 0: >\x{1680} + ** Failers +No match + \x{0b} +No match + +/^>\p{Xsp}+/8O + > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + 1: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028} + 2: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680} + 3: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0} + 4: > \x{09}\x{0a}\x{0c}\x{0d} + 5: > \x{09}\x{0a}\x{0c} + 6: > \x{09}\x{0a} + 7: > \x{09} + 8: > + +/^>\p{Xsp}*/8O + > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + 1: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028} + 2: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680} + 3: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0} + 4: > \x{09}\x{0a}\x{0c}\x{0d} + 5: > \x{09}\x{0a}\x{0c} + 6: > \x{09}\x{0a} + 7: > \x{09} + 8: > + 9: > + +/^>\p{Xsp}{2,9}/8O + > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + 1: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028} + 2: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680} + 3: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0} + 4: > \x{09}\x{0a}\x{0c}\x{0d} + 5: > \x{09}\x{0a}\x{0c} + 6: > \x{09}\x{0a} + 7: > \x{09} + +/^>[\p{Xsp}]/8O + >\x{2028}\x{0b} + 0: >\x{2028} + +/^>[\p{Xsp}]+/8O + > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + 1: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028} + 2: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680} + 3: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0} + 4: > \x{09}\x{0a}\x{0c}\x{0d} + 5: > \x{09}\x{0a}\x{0c} + 6: > \x{09}\x{0a} + 7: > \x{09} + 8: > + +/^>\p{Xps}/8 + >\x{1680}\x{2028}\x{0b} + 0: >\x{1680} + >\x{a0} + 0: >\x{a0} + ** Failers +No match + \x{0b} +No match + +/^>\p{Xps}+/8 + > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + +/^>\p{Xps}+?/8 + >\x{1680}\x{2028}\x{0b} + 0: >\x{1680}\x{2028}\x{0b} + 1: >\x{1680}\x{2028} + 2: >\x{1680} + +/^>\p{Xps}*/8 + > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + +/^>\p{Xps}{2,9}/8 + > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + +/^>\p{Xps}{2,9}?/8 + > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + 1: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028} + 2: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680} + 3: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0} + 4: > \x{09}\x{0a}\x{0c}\x{0d} + 5: > \x{09}\x{0a}\x{0c} + 6: > \x{09}\x{0a} + 7: > \x{09} + +/^>[\p{Xps}]/8 + >\x{2028}\x{0b} + 0: >\x{2028} + +/^>[\p{Xps}]+/8 + > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + +/^\p{Xwd}/8 + ABCD + 0: A + 1234 + 0: 1 + \x{6ca} + 0: \x{6ca} + \x{a6c} + 0: \x{a6c} + \x{10a7} + 0: \x{10a7} + _ABC + 0: _ + ** Failers +No match + [] +No match + +/^\p{Xwd}+/8 + ABCD1234\x{6ca}\x{a6c}\x{10a7}_ + 0: ABCD1234\x{6ca}\x{a6c}\x{10a7}_ + +/^\p{Xwd}*/8 + ABCD1234\x{6ca}\x{a6c}\x{10a7}_ + 0: ABCD1234\x{6ca}\x{a6c}\x{10a7}_ + +/^\p{Xwd}{2,9}/8 + A_12\x{6ca}\x{a6c}\x{10a7} + 0: A_12\x{6ca}\x{a6c}\x{10a7} + +/^[\p{Xwd}]/8 + ABCD1234_ + 0: A + 1234abcd_ + 0: 1 + \x{6ca} + 0: \x{6ca} + \x{a6c} + 0: \x{a6c} + \x{10a7} + 0: \x{10a7} + _ABC + 0: _ + ** Failers +No match + [] +No match + +/^[\p{Xwd}]+/8 + ABCD1234\x{6ca}\x{a6c}\x{10a7}_ + 0: ABCD1234\x{6ca}\x{a6c}\x{10a7}_ + +/-- Unicode properties for \b abd \B --/ + +/\b...\B/8W + abc_ + 0: abc + \x{37e}abc\x{376} + 0: abc + \x{37e}\x{376}\x{371}\x{393}\x{394} + 0: \x{376}\x{371}\x{393} + !\x{c0}++\x{c1}\x{c2} + 0: ++\x{c1} + !\x{c0}+++++ + 0: \x{c0}++ + +/-- Without PCRE_UCP, non-ASCII always fail, even if < 256 --/ + +/\b...\B/8 + abc_ + 0: abc + ** Failers + 0: Fai + \x{37e}abc\x{376} +No match + \x{37e}\x{376}\x{371}\x{393}\x{394} +No match + !\x{c0}++\x{c1}\x{c2} +No match + !\x{c0}+++++ +No match + +/-- With PCRE_UCP, non-UTF8 chars that are < 256 still check properties --/ + +/\b...\B/W + abc_ + 0: abc + !\x{c0}++\x{c1}\x{c2} + 0: ++\xc1 + !\x{c0}+++++ + 0: \xc0++ + +/-- Caseless single negated characters > 127 need UCP support --/ + +/[^\x{100}]/8i + \x{100}\x{101}X + 0: X + +/[^\x{100}]+/8i + \x{100}\x{101}XX + 0: XX + +/^\X/8 + A\P + 0: A + A\P\P +Partial match: A + A\x{300}\x{301}\P + 0: A\x{300}\x{301} + A\x{300}\x{301}\P\P +Partial match: A\x{300}\x{301} + A\x{301}\P + 0: A\x{301} + A\x{301}\P\P +Partial match: A\x{301} + +/^\X{2,3}/8 + A\P +Partial match: A + A\P\P +Partial match: A + AA\P + 0: AA + AA\P\P +Partial match: AA + A\x{300}\x{301}\P +Partial match: A\x{300}\x{301} + A\x{300}\x{301}\P\P +Partial match: A\x{300}\x{301} + A\x{300}\x{301}A\x{300}\x{301}\P + 0: A\x{300}\x{301}A\x{300}\x{301} + A\x{300}\x{301}A\x{300}\x{301}\P\P +Partial match: A\x{300}\x{301}A\x{300}\x{301} + +/^\X{2}/8 + AA\P + 0: AA + AA\P\P +Partial match: AA + A\x{300}\x{301}A\x{300}\x{301}\P + 0: A\x{300}\x{301}A\x{300}\x{301} + A\x{300}\x{301}A\x{300}\x{301}\P\P +Partial match: A\x{300}\x{301}A\x{300}\x{301} + +/^\X+/8 + AA\P + 0: AA + AA\P\P +Partial match: AA + +/^\X+?Z/8 + AA\P +Partial match: AA + AA\P\P +Partial match: AA + +/-- These are tests for extended grapheme clusters --/ + +/^\X/8+ + G\x{34e}\x{34e}X + 0: G\x{34e}\x{34e} + 0+ X + \x{34e}\x{34e}X + 0: \x{34e}\x{34e} + 0+ X + \x04X + 0: \x{04} + 0+ X + \x{1100}X + 0: \x{1100} + 0+ X + \x{1100}\x{34e}X + 0: \x{1100}\x{34e} + 0+ X + \x{1b04}\x{1b04}X + 0: \x{1b04}\x{1b04} + 0+ X + *These match up to the roman letters + 0: * + 0+ These match up to the roman letters + \x{1111}\x{1111}L,L + 0: \x{1111}\x{1111} + 0+ L,L + \x{1111}\x{1111}\x{1169}L,L,V + 0: \x{1111}\x{1111}\x{1169} + 0+ L,L,V + \x{1111}\x{ae4c}L, LV + 0: \x{1111}\x{ae4c} + 0+ L, LV + \x{1111}\x{ad89}L, LVT + 0: \x{1111}\x{ad89} + 0+ L, LVT + \x{1111}\x{ae4c}\x{1169}L, LV, V + 0: \x{1111}\x{ae4c}\x{1169} + 0+ L, LV, V + \x{1111}\x{ae4c}\x{1169}\x{1169}L, LV, V, V + 0: \x{1111}\x{ae4c}\x{1169}\x{1169} + 0+ L, LV, V, V + \x{1111}\x{ae4c}\x{1169}\x{11fe}L, LV, V, T + 0: \x{1111}\x{ae4c}\x{1169}\x{11fe} + 0+ L, LV, V, T + \x{1111}\x{ad89}\x{11fe}L, LVT, T + 0: \x{1111}\x{ad89}\x{11fe} + 0+ L, LVT, T + \x{1111}\x{ad89}\x{11fe}\x{11fe}L, LVT, T, T + 0: \x{1111}\x{ad89}\x{11fe}\x{11fe} + 0+ L, LVT, T, T + \x{ad89}\x{11fe}\x{11fe}LVT, T, T + 0: \x{ad89}\x{11fe}\x{11fe} + 0+ LVT, T, T + *These match just the first codepoint (invalid sequence) + 0: * + 0+ These match just the first codepoint (invalid sequence) + \x{1111}\x{11fe}L, T + 0: \x{1111} + 0+ \x{11fe}L, T + \x{ae4c}\x{1111}LV, L + 0: \x{ae4c} + 0+ \x{1111}LV, L + \x{ae4c}\x{ae4c}LV, LV + 0: \x{ae4c} + 0+ \x{ae4c}LV, LV + \x{ae4c}\x{ad89}LV, LVT + 0: \x{ae4c} + 0+ \x{ad89}LV, LVT + \x{1169}\x{1111}V, L + 0: \x{1169} + 0+ \x{1111}V, L + \x{1169}\x{ae4c}V, LV + 0: \x{1169} + 0+ \x{ae4c}V, LV + \x{1169}\x{ad89}V, LVT + 0: \x{1169} + 0+ \x{ad89}V, LVT + \x{ad89}\x{1111}LVT, L + 0: \x{ad89} + 0+ \x{1111}LVT, L + \x{ad89}\x{1169}LVT, V + 0: \x{ad89} + 0+ \x{1169}LVT, V + \x{ad89}\x{ae4c}LVT, LV + 0: \x{ad89} + 0+ \x{ae4c}LVT, LV + \x{ad89}\x{ad89}LVT, LVT + 0: \x{ad89} + 0+ \x{ad89}LVT, LVT + \x{11fe}\x{1111}T, L + 0: \x{11fe} + 0+ \x{1111}T, L + \x{11fe}\x{1169}T, V + 0: \x{11fe} + 0+ \x{1169}T, V + \x{11fe}\x{ae4c}T, LV + 0: \x{11fe} + 0+ \x{ae4c}T, LV + \x{11fe}\x{ad89}T, LVT + 0: \x{11fe} + 0+ \x{ad89}T, LVT + *Test extend and spacing mark + 0: * + 0+ Test extend and spacing mark + \x{1111}\x{ae4c}\x{0711}L, LV, extend + 0: \x{1111}\x{ae4c}\x{711} + 0+ L, LV, extend + \x{1111}\x{ae4c}\x{1b04}L, LV, spacing mark + 0: \x{1111}\x{ae4c}\x{1b04} + 0+ L, LV, spacing mark + \x{1111}\x{ae4c}\x{1b04}\x{0711}\x{1b04}L, LV, spacing mark, extend, spacing mark + 0: \x{1111}\x{ae4c}\x{1b04}\x{711}\x{1b04} + 0+ L, LV, spacing mark, extend, spacing mark + *Test CR, LF, and control + 0: * + 0+ Test CR, LF, and control + \x0d\x{0711}CR, extend + 0: \x{0d} + 0+ \x{711}CR, extend + \x0d\x{1b04}CR, spacingmark + 0: \x{0d} + 0+ \x{1b04}CR, spacingmark + \x0a\x{0711}LF, extend + 0: \x{0a} + 0+ \x{711}LF, extend + \x0a\x{1b04}LF, spacingmark + 0: \x{0a} + 0+ \x{1b04}LF, spacingmark + \x0b\x{0711}Control, extend + 0: \x{0b} + 0+ \x{711}Control, extend + \x09\x{1b04}Control, spacingmark + 0: \x{09} + 0+ \x{1b04}Control, spacingmark + *There are no Prepend characters, so we can't test Prepend, CR + 0: * + 0+ There are no Prepend characters, so we can't test Prepend, CR + +/^(?>\X{2})X/8+ + \x{1111}\x{ae4c}\x{1111}\x{ae4c}X + 0: \x{1111}\x{ae4c}\x{1111}\x{ae4c}X + 0+ + +/^\X{2,4}X/8+ + \x{1111}\x{ae4c}\x{1111}\x{ae4c}X + 0: \x{1111}\x{ae4c}\x{1111}\x{ae4c}X + 0+ + \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X + 0: \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X + 0+ + \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X + 0: \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X + 0+ + +/^\X{2,4}?X/8+ + \x{1111}\x{ae4c}\x{1111}\x{ae4c}X + 0: \x{1111}\x{ae4c}\x{1111}\x{ae4c}X + 0+ + \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X + 0: \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X + 0+ + \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X + 0: \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X + 0+ + +/-- --/ + +/\x{1e9e}+/8i + \x{1e9e}\x{00df} + 0: \x{1e9e}\x{df} + +/[z\x{1e9e}]+/8i + \x{1e9e}\x{00df} + 0: \x{1e9e}\x{df} + +/\x{00df}+/8i + \x{1e9e}\x{00df} + 0: \x{1e9e}\x{df} + +/[z\x{00df}]+/8i + \x{1e9e}\x{00df} + 0: \x{1e9e}\x{df} + +/\x{1f88}+/8i + \x{1f88}\x{1f80} + 0: \x{1f88}\x{1f80} + +/[z\x{1f88}]+/8i + \x{1f88}\x{1f80} + 0: \x{1f88}\x{1f80} + +/-- Perl matches these --/ + +/\x{00b5}+/8i + \x{00b5}\x{039c}\x{03bc} + 0: \x{b5}\x{39c}\x{3bc} + +/\x{039c}+/8i + \x{00b5}\x{039c}\x{03bc} + 0: \x{b5}\x{39c}\x{3bc} + +/\x{03bc}+/8i + \x{00b5}\x{039c}\x{03bc} + 0: \x{b5}\x{39c}\x{3bc} + + +/\x{00c5}+/8i + \x{00c5}\x{00e5}\x{212b} + 0: \x{c5}\x{e5}\x{212b} + +/\x{00e5}+/8i + \x{00c5}\x{00e5}\x{212b} + 0: \x{c5}\x{e5}\x{212b} + +/\x{212b}+/8i + \x{00c5}\x{00e5}\x{212b} + 0: \x{c5}\x{e5}\x{212b} + + +/\x{01c4}+/8i + \x{01c4}\x{01c5}\x{01c6} + 0: \x{1c4}\x{1c5}\x{1c6} + +/\x{01c5}+/8i + \x{01c4}\x{01c5}\x{01c6} + 0: \x{1c4}\x{1c5}\x{1c6} + +/\x{01c6}+/8i + \x{01c4}\x{01c5}\x{01c6} + 0: \x{1c4}\x{1c5}\x{1c6} + + +/\x{01c7}+/8i + \x{01c7}\x{01c8}\x{01c9} + 0: \x{1c7}\x{1c8}\x{1c9} + +/\x{01c8}+/8i + \x{01c7}\x{01c8}\x{01c9} + 0: \x{1c7}\x{1c8}\x{1c9} + +/\x{01c9}+/8i + \x{01c7}\x{01c8}\x{01c9} + 0: \x{1c7}\x{1c8}\x{1c9} + + +/\x{01ca}+/8i + \x{01ca}\x{01cb}\x{01cc} + 0: \x{1ca}\x{1cb}\x{1cc} + +/\x{01cb}+/8i + \x{01ca}\x{01cb}\x{01cc} + 0: \x{1ca}\x{1cb}\x{1cc} + +/\x{01cc}+/8i + \x{01ca}\x{01cb}\x{01cc} + 0: \x{1ca}\x{1cb}\x{1cc} + + +/\x{01f1}+/8i + \x{01f1}\x{01f2}\x{01f3} + 0: \x{1f1}\x{1f2}\x{1f3} + +/\x{01f2}+/8i + \x{01f1}\x{01f2}\x{01f3} + 0: \x{1f1}\x{1f2}\x{1f3} + +/\x{01f3}+/8i + \x{01f1}\x{01f2}\x{01f3} + 0: \x{1f1}\x{1f2}\x{1f3} + + +/\x{0345}+/8i + \x{0345}\x{0399}\x{03b9}\x{1fbe} + 0: \x{345}\x{399}\x{3b9}\x{1fbe} + +/\x{0399}+/8i + \x{0345}\x{0399}\x{03b9}\x{1fbe} + 0: \x{345}\x{399}\x{3b9}\x{1fbe} + +/\x{03b9}+/8i + \x{0345}\x{0399}\x{03b9}\x{1fbe} + 0: \x{345}\x{399}\x{3b9}\x{1fbe} + +/\x{1fbe}+/8i + \x{0345}\x{0399}\x{03b9}\x{1fbe} + 0: \x{345}\x{399}\x{3b9}\x{1fbe} + + +/\x{0392}+/8i + \x{0392}\x{03b2}\x{03d0} + 0: \x{392}\x{3b2}\x{3d0} + +/\x{03b2}+/8i + \x{0392}\x{03b2}\x{03d0} + 0: \x{392}\x{3b2}\x{3d0} + +/\x{03d0}+/8i + \x{0392}\x{03b2}\x{03d0} + 0: \x{392}\x{3b2}\x{3d0} + + +/\x{0395}+/8i + \x{0395}\x{03b5}\x{03f5} + 0: \x{395}\x{3b5}\x{3f5} + +/\x{03b5}+/8i + \x{0395}\x{03b5}\x{03f5} + 0: \x{395}\x{3b5}\x{3f5} + +/\x{03f5}+/8i + \x{0395}\x{03b5}\x{03f5} + 0: \x{395}\x{3b5}\x{3f5} + + +/\x{0398}+/8i + \x{0398}\x{03b8}\x{03d1}\x{03f4} + 0: \x{398}\x{3b8}\x{3d1}\x{3f4} + +/\x{03b8}+/8i + \x{0398}\x{03b8}\x{03d1}\x{03f4} + 0: \x{398}\x{3b8}\x{3d1}\x{3f4} + +/\x{03d1}+/8i + \x{0398}\x{03b8}\x{03d1}\x{03f4} + 0: \x{398}\x{3b8}\x{3d1}\x{3f4} + +/\x{03f4}+/8i + \x{0398}\x{03b8}\x{03d1}\x{03f4} + 0: \x{398}\x{3b8}\x{3d1}\x{3f4} + + +/\x{039a}+/8i + \x{039a}\x{03ba}\x{03f0} + 0: \x{39a}\x{3ba}\x{3f0} + +/\x{03ba}+/8i + \x{039a}\x{03ba}\x{03f0} + 0: \x{39a}\x{3ba}\x{3f0} + +/\x{03f0}+/8i + \x{039a}\x{03ba}\x{03f0} + 0: \x{39a}\x{3ba}\x{3f0} + + +/\x{03a0}+/8i + \x{03a0}\x{03c0}\x{03d6} + 0: \x{3a0}\x{3c0}\x{3d6} + +/\x{03c0}+/8i + \x{03a0}\x{03c0}\x{03d6} + 0: \x{3a0}\x{3c0}\x{3d6} + +/\x{03d6}+/8i + \x{03a0}\x{03c0}\x{03d6} + 0: \x{3a0}\x{3c0}\x{3d6} + + +/\x{03a1}+/8i + \x{03a1}\x{03c1}\x{03f1} + 0: \x{3a1}\x{3c1}\x{3f1} + +/\x{03c1}+/8i + \x{03a1}\x{03c1}\x{03f1} + 0: \x{3a1}\x{3c1}\x{3f1} + +/\x{03f1}+/8i + \x{03a1}\x{03c1}\x{03f1} + 0: \x{3a1}\x{3c1}\x{3f1} + + +/\x{03a3}+/8i + \x{03A3}\x{03C2}\x{03C3} + 0: \x{3a3}\x{3c2}\x{3c3} + +/\x{03c2}+/8i + \x{03A3}\x{03C2}\x{03C3} + 0: \x{3a3}\x{3c2}\x{3c3} + +/\x{03c3}+/8i + \x{03A3}\x{03C2}\x{03C3} + 0: \x{3a3}\x{3c2}\x{3c3} + + +/\x{03a6}+/8i + \x{03a6}\x{03c6}\x{03d5} + 0: \x{3a6}\x{3c6}\x{3d5} + +/\x{03c6}+/8i + \x{03a6}\x{03c6}\x{03d5} + 0: \x{3a6}\x{3c6}\x{3d5} + +/\x{03d5}+/8i + \x{03a6}\x{03c6}\x{03d5} + 0: \x{3a6}\x{3c6}\x{3d5} + + +/\x{03c9}+/8i + \x{03c9}\x{03a9}\x{2126} + 0: \x{3c9}\x{3a9}\x{2126} + +/\x{03a9}+/8i + \x{03c9}\x{03a9}\x{2126} + 0: \x{3c9}\x{3a9}\x{2126} + +/\x{2126}+/8i + \x{03c9}\x{03a9}\x{2126} + 0: \x{3c9}\x{3a9}\x{2126} + + +/\x{1e60}+/8i + \x{1e60}\x{1e61}\x{1e9b} + 0: \x{1e60}\x{1e61}\x{1e9b} + +/\x{1e61}+/8i + \x{1e60}\x{1e61}\x{1e9b} + 0: \x{1e60}\x{1e61}\x{1e9b} + +/\x{1e9b}+/8i + \x{1e60}\x{1e61}\x{1e9b} + 0: \x{1e60}\x{1e61}\x{1e9b} + + +/\x{1e9e}+/8i + \x{1e9e}\x{00df} + 0: \x{1e9e}\x{df} + +/\x{00df}+/8i + \x{1e9e}\x{00df} + 0: \x{1e9e}\x{df} + + +/\x{1f88}+/8i + \x{1f88}\x{1f80} + 0: \x{1f88}\x{1f80} + +/\x{1f80}+/8i + \x{1f88}\x{1f80} + 0: \x{1f88}\x{1f80} + +/\x{004b}+/8i + \x{004b}\x{006b}\x{212a} + 0: Kk\x{212a} + +/\x{006b}+/8i + \x{004b}\x{006b}\x{212a} + 0: Kk\x{212a} + +/\x{212a}+/8i + \x{004b}\x{006b}\x{212a} + 0: Kk\x{212a} + + +/\x{0053}+/8i + \x{0053}\x{0073}\x{017f} + 0: Ss\x{17f} + +/\x{0073}+/8i + \x{0053}\x{0073}\x{017f} + 0: Ss\x{17f} + +/\x{017f}+/8i + \x{0053}\x{0073}\x{017f} + 0: Ss\x{17f} + +/ist/8i + ikt +No match + +/is+t/8i + iSs\x{17f}t + 0: iSs\x{17f}t + ikt +No match + +/is+?t/8i + ikt +No match + +/is?t/8i + ikt +No match + +/is{2}t/8i + iskt +No match + +/^\p{Xuc}/8 + $abc + 0: $ + @abc + 0: @ + `abc + 0: ` + \x{1234}abc + 0: \x{1234} + ** Failers +No match + abc +No match + +/^\p{Xuc}+/8 + $@`\x{a0}\x{1234}\x{e000}** + 0: $@`\x{a0}\x{1234}\x{e000} + ** Failers +No match + \x{9f} +No match + +/^\p{Xuc}+?/8 + $@`\x{a0}\x{1234}\x{e000}** + 0: $@`\x{a0}\x{1234}\x{e000} + 1: $@`\x{a0}\x{1234} + 2: $@`\x{a0} + 3: $@` + 4: $@ + 5: $ + ** Failers +No match + \x{9f} +No match + +/^\p{Xuc}+?\*/8 + $@`\x{a0}\x{1234}\x{e000}** + 0: $@`\x{a0}\x{1234}\x{e000}* + ** Failers +No match + \x{9f} +No match + +/^\p{Xuc}++/8 + $@`\x{a0}\x{1234}\x{e000}** + 0: $@`\x{a0}\x{1234}\x{e000} + ** Failers +No match + \x{9f} +No match + +/^\p{Xuc}{3,5}/8 + $@`\x{a0}\x{1234}\x{e000}** + 0: $@`\x{a0}\x{1234} + ** Failers +No match + \x{9f} +No match + +/^\p{Xuc}{3,5}?/8 + $@`\x{a0}\x{1234}\x{e000}** + 0: $@`\x{a0}\x{1234} + 1: $@`\x{a0} + 2: $@` + ** Failers +No match + \x{9f} +No match + +/^[\p{Xuc}]/8 + $@`\x{a0}\x{1234}\x{e000}** + 0: $ + ** Failers +No match + \x{9f} +No match + +/^[\p{Xuc}]+/8 + $@`\x{a0}\x{1234}\x{e000}** + 0: $@`\x{a0}\x{1234}\x{e000} + ** Failers +No match + \x{9f} +No match + +/^\P{Xuc}/8 + abc + 0: a + ** Failers + 0: * + $abc +No match + @abc +No match + `abc +No match + \x{1234}abc +No match + +/^[\P{Xuc}]/8 + abc + 0: a + ** Failers + 0: * + $abc +No match + @abc +No match + `abc +No match + \x{1234}abc +No match + +/^A\s+Z/8W + A\x{2005}Z + 0: A\x{2005}Z + A\x{85}\x{180e}\x{2005}Z + 0: A\x{85}\x{180e}\x{2005}Z + +/^A[\s]+Z/8W + A\x{2005}Z + 0: A\x{2005}Z + A\x{85}\x{180e}\x{2005}Z + 0: A\x{85}\x{180e}\x{2005}Z + +/-- End of testinput10 --/ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput11-16 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput11-16 new file mode 100755 index 000000000..3c485da70 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput11-16 @@ -0,0 +1,771 @@ +/-- These are a few representative patterns whose lengths and offsets are to be +shown when the link size is 2. This is just a doublecheck test to ensure the +sizes don't go horribly wrong when something is changed. The pattern contents +are all themselves checked in other tests. Unicode, including property support, +is required for these tests. --/ + +/((?i)b)/BM +Memory allocation (code space): 24 +------------------------------------------------------------------ + 0 9 Bra + 2 5 CBra 1 + 5 /i b + 7 5 Ket + 9 9 Ket + 11 End +------------------------------------------------------------------ + +/(?s)(.*X|^B)/BM +Memory allocation (code space): 38 +------------------------------------------------------------------ + 0 16 Bra + 2 7 CBra 1 + 5 AllAny* + 7 X + 9 5 Alt + 11 ^ + 12 B + 14 12 Ket + 16 16 Ket + 18 End +------------------------------------------------------------------ + +/(?s:.*X|^B)/BM +Memory allocation (code space): 36 +------------------------------------------------------------------ + 0 15 Bra + 2 6 Bra + 4 AllAny* + 6 X + 8 5 Alt + 10 ^ + 11 B + 13 11 Ket + 15 15 Ket + 17 End +------------------------------------------------------------------ + +/^[[:alnum:]]/BM +Memory allocation (code space): 46 +------------------------------------------------------------------ + 0 20 Bra + 2 ^ + 3 [0-9A-Za-z] + 20 20 Ket + 22 End +------------------------------------------------------------------ + +/#/IxMD +Memory allocation (code space): 10 +------------------------------------------------------------------ + 0 2 Bra + 2 2 Ket + 4 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +May match empty string +Options: extended +No first char +No need char + +/a#/IxMD +Memory allocation (code space): 14 +------------------------------------------------------------------ + 0 4 Bra + 2 a + 4 4 Ket + 6 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: extended +First char = 'a' +No need char + +/x?+/BM +Memory allocation (code space): 14 +------------------------------------------------------------------ + 0 4 Bra + 2 x?+ + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/x++/BM +Memory allocation (code space): 14 +------------------------------------------------------------------ + 0 4 Bra + 2 x++ + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/x{1,3}+/BM +Memory allocation (code space): 20 +------------------------------------------------------------------ + 0 7 Bra + 2 x + 4 x{0,2}+ + 7 7 Ket + 9 End +------------------------------------------------------------------ + +/(x)*+/BM +Memory allocation (code space): 26 +------------------------------------------------------------------ + 0 10 Bra + 2 Braposzero + 3 5 CBraPos 1 + 6 x + 8 5 KetRpos + 10 10 Ket + 12 End +------------------------------------------------------------------ + +/^((a+)(?U)([ab]+)(?-U)([bc]+)(\w*))/BM +Memory allocation (code space): 142 +------------------------------------------------------------------ + 0 68 Bra + 2 ^ + 3 63 CBra 1 + 6 5 CBra 2 + 9 a+ + 11 5 Ket + 13 21 CBra 3 + 16 [ab]+? + 34 21 Ket + 36 21 CBra 4 + 39 [bc]+ + 57 21 Ket + 59 5 CBra 5 + 62 \w*+ + 64 5 Ket + 66 63 Ket + 68 68 Ket + 70 End +------------------------------------------------------------------ + +|8J\$WE\<\.rX\+ix\[d1b\!H\#\?vV0vrK\:ZH1\=2M\>iV\;\?aPhFB\<\*vW\@QW\@sO9\}cfZA\-i\'w\%hKd6gt1UJP\,15_\#QY\$M\^Mss_U\/\]\&LK9\[5vQub\^w\[KDD\qmj\;2\}YWFdYx\.Ap\]hjCPTP\(n28k\+3\;o\&WXqs\/gOXdr\$\:r\'do0\;b4c\(f_Gr\=\"\\4\)\[01T7ajQJvL\$W\~mL_sS\/4h\:x\*\[ZN\=KLs\&L5zX\/\/\>it\,o\:aU\(\;Z\>pW\&T7oP\'2K\^E\:x9\'c\[\%z\-\,64JQ5AeH_G\#KijUKghQw\^\\vea3a\?kka_G\$8\#\`\*kynsxzBLru\'\]k_\[7FrVx\}\^\=\$blx\>s\-N\%j\;D\*aZDnsw\:YKZ\%Q\.Kne9\#hP\?\+b3\(SOvL\,\^\;\&u5\@\?5C5Bhb\=m\-vEh_L15Jl\]U\)0RP6\{q\%L\^_z5E\'Dw6X\b|BM +Memory allocation (code space): 1648 +------------------------------------------------------------------ + 0 821 Bra + 2 8J$WE<.rX+ix[d1b!H#?vV0vrK:ZH1=2M>iV;?aPhFB<*vW@QW@sO9}cfZA-i'w%hKd6gt1UJP,15_#QY$M^Mss_U/]&LK9[5vQub^w[KDDqmj;2}YWFdYx.Ap]hjCPTP(n28k+3;o&WXqs/gOXdr$:r'do0;b4c(f_Gr="\4)[01T7ajQJvL$W~mL_sS/4h:x*[ZN=KLs&L5zX//>it,o:aU(;Z>pW&T7oP'2K^E:x9'c[%z-,64JQ5AeH_G#KijUKghQw^\vea3a?kka_G$8#`*kynsxzBLru']k_[7FrVx}^=$blx>s-N%j;D*aZDnsw:YKZ%Q.Kne9#hP?+b3(SOvL,^;&u5@?5C5Bhb=m-vEh_L15Jl]U)0RP6{q%L^_z5E'Dw6X +820 \b +821 821 Ket +823 End +------------------------------------------------------------------ + +|\$\<\.X\+ix\[d1b\!H\#\?vV0vrK\:ZH1\=2M\>iV\;\?aPhFB\<\*vW\@QW\@sO9\}cfZA\-i\'w\%hKd6gt1UJP\,15_\#QY\$M\^Mss_U\/\]\&LK9\[5vQub\^w\[KDD\qmj\;2\}YWFdYx\.Ap\]hjCPTP\(n28k\+3\;o\&WXqs\/gOXdr\$\:r\'do0\;b4c\(f_Gr\=\"\\4\)\[01T7ajQJvL\$W\~mL_sS\/4h\:x\*\[ZN\=KLs\&L5zX\/\/\>it\,o\:aU\(\;Z\>pW\&T7oP\'2K\^E\:x9\'c\[\%z\-\,64JQ5AeH_G\#KijUKghQw\^\\vea3a\?kka_G\$8\#\`\*kynsxzBLru\'\]k_\[7FrVx\}\^\=\$blx\>s\-N\%j\;D\*aZDnsw\:YKZ\%Q\.Kne9\#hP\?\+b3\(SOvL\,\^\;\&u5\@\?5C5Bhb\=m\-vEh_L15Jl\]U\)0RP6\{q\%L\^_z5E\'Dw6X\b|BM +Memory allocation (code space): 1628 +------------------------------------------------------------------ + 0 811 Bra + 2 $<.X+ix[d1b!H#?vV0vrK:ZH1=2M>iV;?aPhFB<*vW@QW@sO9}cfZA-i'w%hKd6gt1UJP,15_#QY$M^Mss_U/]&LK9[5vQub^w[KDDqmj;2}YWFdYx.Ap]hjCPTP(n28k+3;o&WXqs/gOXdr$:r'do0;b4c(f_Gr="\4)[01T7ajQJvL$W~mL_sS/4h:x*[ZN=KLs&L5zX//>it,o:aU(;Z>pW&T7oP'2K^E:x9'c[%z-,64JQ5AeH_G#KijUKghQw^\vea3a?kka_G$8#`*kynsxzBLru']k_[7FrVx}^=$blx>s-N%j;D*aZDnsw:YKZ%Q.Kne9#hP?+b3(SOvL,^;&u5@?5C5Bhb=m-vEh_L15Jl]U)0RP6{q%L^_z5E'Dw6X +810 \b +811 811 Ket +813 End +------------------------------------------------------------------ + +/(a(?1)b)/BM +Memory allocation (code space): 32 +------------------------------------------------------------------ + 0 13 Bra + 2 9 CBra 1 + 5 a + 7 2 Recurse + 9 b + 11 9 Ket + 13 13 Ket + 15 End +------------------------------------------------------------------ + +/(a(?1)+b)/BM +Memory allocation (code space): 40 +------------------------------------------------------------------ + 0 17 Bra + 2 13 CBra 1 + 5 a + 7 4 Once + 9 2 Recurse + 11 4 KetRmax + 13 b + 15 13 Ket + 17 17 Ket + 19 End +------------------------------------------------------------------ + +/a(?Pb|c)d(?Pe)/BM +Memory allocation (code space): 80 +------------------------------------------------------------------ + 0 24 Bra + 2 a + 4 5 CBra 1 + 7 b + 9 4 Alt + 11 c + 13 9 Ket + 15 d + 17 5 CBra 2 + 20 e + 22 5 Ket + 24 24 Ket + 26 End +------------------------------------------------------------------ + +/(?:a(?Pc(?Pd)))(?Pa)/BM +Memory allocation (code space): 73 +------------------------------------------------------------------ + 0 29 Bra + 2 18 Bra + 4 a + 6 12 CBra 1 + 9 c + 11 5 CBra 2 + 14 d + 16 5 Ket + 18 12 Ket + 20 18 Ket + 22 5 CBra 3 + 25 a + 27 5 Ket + 29 29 Ket + 31 End +------------------------------------------------------------------ + +/(?Pa)...(?P=a)bbb(?P>a)d/BM +Memory allocation (code space): 93 +------------------------------------------------------------------ + 0 24 Bra + 2 5 CBra 1 + 5 a + 7 5 Ket + 9 Any + 10 Any + 11 Any + 12 \1 + 14 bbb + 20 2 Recurse + 22 d + 24 24 Ket + 26 End +------------------------------------------------------------------ + +/abc(?C255)de(?C)f/BM +Memory allocation (code space): 50 +------------------------------------------------------------------ + 0 22 Bra + 2 abc + 8 Callout 255 10 1 + 12 de + 16 Callout 0 16 1 + 20 f + 22 22 Ket + 24 End +------------------------------------------------------------------ + +/abcde/CBM +Memory allocation (code space): 78 +------------------------------------------------------------------ + 0 36 Bra + 2 Callout 255 0 1 + 6 a + 8 Callout 255 1 1 + 12 b + 14 Callout 255 2 1 + 18 c + 20 Callout 255 3 1 + 24 d + 26 Callout 255 4 1 + 30 e + 32 Callout 255 5 0 + 36 36 Ket + 38 End +------------------------------------------------------------------ + +/\x{100}/8BM +Memory allocation (code space): 14 +------------------------------------------------------------------ + 0 4 Bra + 2 \x{100} + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/\x{1000}/8BM +Memory allocation (code space): 14 +------------------------------------------------------------------ + 0 4 Bra + 2 \x{1000} + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/\x{10000}/8BM +Memory allocation (code space): 16 +------------------------------------------------------------------ + 0 5 Bra + 2 \x{10000} + 5 5 Ket + 7 End +------------------------------------------------------------------ + +/\x{100000}/8BM +Memory allocation (code space): 16 +------------------------------------------------------------------ + 0 5 Bra + 2 \x{100000} + 5 5 Ket + 7 End +------------------------------------------------------------------ + +/\x{10ffff}/8BM +Memory allocation (code space): 16 +------------------------------------------------------------------ + 0 5 Bra + 2 \x{10ffff} + 5 5 Ket + 7 End +------------------------------------------------------------------ + +/\x{110000}/8BM +Failed: character value in \x{} or \o{} is too large at offset 9 + +/[\x{ff}]/8BM +Memory allocation (code space): 14 +------------------------------------------------------------------ + 0 4 Bra + 2 \x{ff} + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/[\x{100}]/8BM +Memory allocation (code space): 14 +------------------------------------------------------------------ + 0 4 Bra + 2 \x{100} + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/\x80/8BM +Memory allocation (code space): 14 +------------------------------------------------------------------ + 0 4 Bra + 2 \x80 + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/\xff/8BM +Memory allocation (code space): 14 +------------------------------------------------------------------ + 0 4 Bra + 2 \x{ff} + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/\x{0041}\x{2262}\x{0391}\x{002e}/D8M +Memory allocation (code space): 26 +------------------------------------------------------------------ + 0 10 Bra + 2 A\x{2262}\x{391}. + 10 10 Ket + 12 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = 'A' +Need char = '.' + +/\x{D55c}\x{ad6d}\x{C5B4}/D8M +Memory allocation (code space): 22 +------------------------------------------------------------------ + 0 8 Bra + 2 \x{d55c}\x{ad6d}\x{c5b4} + 8 8 Ket + 10 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{d55c} +Need char = \x{c5b4} + +/\x{65e5}\x{672c}\x{8a9e}/D8M +Memory allocation (code space): 22 +------------------------------------------------------------------ + 0 8 Bra + 2 \x{65e5}\x{672c}\x{8a9e} + 8 8 Ket + 10 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{65e5} +Need char = \x{8a9e} + +/[\x{100}]/8BM +Memory allocation (code space): 14 +------------------------------------------------------------------ + 0 4 Bra + 2 \x{100} + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/[Z\x{100}]/8BM +Memory allocation (code space): 54 +------------------------------------------------------------------ + 0 24 Bra + 2 [Z\x{100}] + 24 24 Ket + 26 End +------------------------------------------------------------------ + +/^[\x{100}\E-\Q\E\x{150}]/B8M +Memory allocation (code space): 26 +------------------------------------------------------------------ + 0 10 Bra + 2 ^ + 3 [\x{100}-\x{150}] + 10 10 Ket + 12 End +------------------------------------------------------------------ + +/^[\QÄ€\E-\QÅ\E]/B8M +Memory allocation (code space): 26 +------------------------------------------------------------------ + 0 10 Bra + 2 ^ + 3 [\x{100}-\x{150}] + 10 10 Ket + 12 End +------------------------------------------------------------------ + +/^[\QÄ€\E-\QÅ\E/B8M +Failed: missing terminating ] for character class at offset 13 + +/[\p{L}]/BM +Memory allocation (code space): 24 +------------------------------------------------------------------ + 0 9 Bra + 2 [\p{L}] + 9 9 Ket + 11 End +------------------------------------------------------------------ + +/[\p{^L}]/BM +Memory allocation (code space): 24 +------------------------------------------------------------------ + 0 9 Bra + 2 [\P{L}] + 9 9 Ket + 11 End +------------------------------------------------------------------ + +/[\P{L}]/BM +Memory allocation (code space): 24 +------------------------------------------------------------------ + 0 9 Bra + 2 [\P{L}] + 9 9 Ket + 11 End +------------------------------------------------------------------ + +/[\P{^L}]/BM +Memory allocation (code space): 24 +------------------------------------------------------------------ + 0 9 Bra + 2 [\p{L}] + 9 9 Ket + 11 End +------------------------------------------------------------------ + +/[abc\p{L}\x{0660}]/8BM +Memory allocation (code space): 60 +------------------------------------------------------------------ + 0 27 Bra + 2 [a-c\p{L}\x{660}] + 27 27 Ket + 29 End +------------------------------------------------------------------ + +/[\p{Nd}]/8BM +Memory allocation (code space): 24 +------------------------------------------------------------------ + 0 9 Bra + 2 [\p{Nd}] + 9 9 Ket + 11 End +------------------------------------------------------------------ + +/[\p{Nd}+-]+/8BM +Memory allocation (code space): 58 +------------------------------------------------------------------ + 0 26 Bra + 2 [+\-\p{Nd}]++ + 26 26 Ket + 28 End +------------------------------------------------------------------ + +/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8iBM +Memory allocation (code space): 32 +------------------------------------------------------------------ + 0 13 Bra + 2 /i A\x{391}\x{10427}\x{ff3a}\x{1fb0} + 13 13 Ket + 15 End +------------------------------------------------------------------ + +/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8BM +Memory allocation (code space): 32 +------------------------------------------------------------------ + 0 13 Bra + 2 A\x{391}\x{10427}\x{ff3a}\x{1fb0} + 13 13 Ket + 15 End +------------------------------------------------------------------ + +/[\x{105}-\x{109}]/8iBM +Memory allocation (code space): 24 +------------------------------------------------------------------ + 0 9 Bra + 2 [\x{104}-\x{109}] + 9 9 Ket + 11 End +------------------------------------------------------------------ + +/( ( (?(1)0|) )* )/xBM +Memory allocation (code space): 52 +------------------------------------------------------------------ + 0 23 Bra + 2 19 CBra 1 + 5 Brazero + 6 13 SCBra 2 + 9 6 Cond + 11 1 Cond ref + 13 0 + 15 2 Alt + 17 8 Ket + 19 13 KetRmax + 21 19 Ket + 23 23 Ket + 25 End +------------------------------------------------------------------ + +/( (?(1)0|)* )/xBM +Memory allocation (code space): 42 +------------------------------------------------------------------ + 0 18 Bra + 2 14 CBra 1 + 5 Brazero + 6 6 SCond + 8 1 Cond ref + 10 0 + 12 2 Alt + 14 8 KetRmax + 16 14 Ket + 18 18 Ket + 20 End +------------------------------------------------------------------ + +/[a]/BM +Memory allocation (code space): 14 +------------------------------------------------------------------ + 0 4 Bra + 2 a + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/[a]/8BM +Memory allocation (code space): 14 +------------------------------------------------------------------ + 0 4 Bra + 2 a + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/[\xaa]/BM +Memory allocation (code space): 14 +------------------------------------------------------------------ + 0 4 Bra + 2 \x{aa} + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/[\xaa]/8BM +Memory allocation (code space): 14 +------------------------------------------------------------------ + 0 4 Bra + 2 \x{aa} + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/[^a]/BM +Memory allocation (code space): 14 +------------------------------------------------------------------ + 0 4 Bra + 2 [^a] + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/[^a]/8BM +Memory allocation (code space): 14 +------------------------------------------------------------------ + 0 4 Bra + 2 [^a] + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/[^\xaa]/BM +Memory allocation (code space): 14 +------------------------------------------------------------------ + 0 4 Bra + 2 [^\x{aa}] + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/[^\xaa]/8BM +Memory allocation (code space): 14 +------------------------------------------------------------------ + 0 4 Bra + 2 [^\x{aa}] + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/[^\d]/8WB +------------------------------------------------------------------ + 0 9 Bra + 2 [^\p{Nd}] + 9 9 Ket + 11 End +------------------------------------------------------------------ + +/[[:^alpha:][:^cntrl:]]+/8WB +------------------------------------------------------------------ + 0 30 Bra + 2 [ -~\x80-\xff\P{L}\x{100}-\x{10ffff}]++ + 30 30 Ket + 32 End +------------------------------------------------------------------ + +/[[:^cntrl:][:^alpha:]]+/8WB +------------------------------------------------------------------ + 0 30 Bra + 2 [ -~\x80-\xff\x{100}-\x{10ffff}\P{L}]++ + 30 30 Ket + 32 End +------------------------------------------------------------------ + +/[[:alpha:]]+/8WB +------------------------------------------------------------------ + 0 10 Bra + 2 [\p{L}]++ + 10 10 Ket + 12 End +------------------------------------------------------------------ + +/[[:^alpha:]\S]+/8WB +------------------------------------------------------------------ + 0 13 Bra + 2 [\P{L}\P{Xsp}]++ + 13 13 Ket + 15 End +------------------------------------------------------------------ + +/abc(d|e)(*THEN)x(123(*THEN)4|567(b|q)(*THEN)xx)/B +------------------------------------------------------------------ + 0 60 Bra + 2 abc + 8 5 CBra 1 + 11 d + 13 4 Alt + 15 e + 17 9 Ket + 19 *THEN + 20 x + 22 12 CBra 2 + 25 123 + 31 *THEN + 32 4 + 34 24 Alt + 36 567 + 42 5 CBra 3 + 45 b + 47 4 Alt + 49 q + 51 9 Ket + 53 *THEN + 54 xx + 58 36 Ket + 60 60 Ket + 62 End +------------------------------------------------------------------ + +/(((a\2)|(a*)\g<-1>))*a?/B +------------------------------------------------------------------ + 0 39 Bra + 2 Brazero + 3 32 SCBra 1 + 6 27 Once + 8 12 CBra 2 + 11 7 CBra 3 + 14 a + 16 \2 + 18 7 Ket + 20 11 Alt + 22 5 CBra 4 + 25 a* + 27 5 Ket + 29 22 Recurse + 31 23 Ket + 33 27 Ket + 35 32 KetRmax + 37 a?+ + 39 39 Ket + 41 End +------------------------------------------------------------------ + +/((?+1)(\1))/B +------------------------------------------------------------------ + 0 20 Bra + 2 16 Once + 4 12 CBra 1 + 7 9 Recurse + 9 5 CBra 2 + 12 \1 + 14 5 Ket + 16 12 Ket + 18 16 Ket + 20 20 Ket + 22 End +------------------------------------------------------------------ + +/.((?2)(?R)\1)()/B +------------------------------------------------------------------ + 0 23 Bra + 2 Any + 3 13 Once + 5 9 CBra 1 + 8 18 Recurse + 10 0 Recurse + 12 \1 + 14 9 Ket + 16 13 Ket + 18 3 CBra 2 + 21 3 Ket + 23 23 Ket + 25 End +------------------------------------------------------------------ + +/([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00](*ACCEPT)/ +Failed: regular expression is too complicated at offset 490 + +/-- End of testinput11 --/ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput11-32 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput11-32 new file mode 100755 index 000000000..e19518db5 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput11-32 @@ -0,0 +1,771 @@ +/-- These are a few representative patterns whose lengths and offsets are to be +shown when the link size is 2. This is just a doublecheck test to ensure the +sizes don't go horribly wrong when something is changed. The pattern contents +are all themselves checked in other tests. Unicode, including property support, +is required for these tests. --/ + +/((?i)b)/BM +Memory allocation (code space): 48 +------------------------------------------------------------------ + 0 9 Bra + 2 5 CBra 1 + 5 /i b + 7 5 Ket + 9 9 Ket + 11 End +------------------------------------------------------------------ + +/(?s)(.*X|^B)/BM +Memory allocation (code space): 76 +------------------------------------------------------------------ + 0 16 Bra + 2 7 CBra 1 + 5 AllAny* + 7 X + 9 5 Alt + 11 ^ + 12 B + 14 12 Ket + 16 16 Ket + 18 End +------------------------------------------------------------------ + +/(?s:.*X|^B)/BM +Memory allocation (code space): 72 +------------------------------------------------------------------ + 0 15 Bra + 2 6 Bra + 4 AllAny* + 6 X + 8 5 Alt + 10 ^ + 11 B + 13 11 Ket + 15 15 Ket + 17 End +------------------------------------------------------------------ + +/^[[:alnum:]]/BM +Memory allocation (code space): 60 +------------------------------------------------------------------ + 0 12 Bra + 2 ^ + 3 [0-9A-Za-z] + 12 12 Ket + 14 End +------------------------------------------------------------------ + +/#/IxMD +Memory allocation (code space): 20 +------------------------------------------------------------------ + 0 2 Bra + 2 2 Ket + 4 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +May match empty string +Options: extended +No first char +No need char + +/a#/IxMD +Memory allocation (code space): 28 +------------------------------------------------------------------ + 0 4 Bra + 2 a + 4 4 Ket + 6 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: extended +First char = 'a' +No need char + +/x?+/BM +Memory allocation (code space): 28 +------------------------------------------------------------------ + 0 4 Bra + 2 x?+ + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/x++/BM +Memory allocation (code space): 28 +------------------------------------------------------------------ + 0 4 Bra + 2 x++ + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/x{1,3}+/BM +Memory allocation (code space): 40 +------------------------------------------------------------------ + 0 7 Bra + 2 x + 4 x{0,2}+ + 7 7 Ket + 9 End +------------------------------------------------------------------ + +/(x)*+/BM +Memory allocation (code space): 52 +------------------------------------------------------------------ + 0 10 Bra + 2 Braposzero + 3 5 CBraPos 1 + 6 x + 8 5 KetRpos + 10 10 Ket + 12 End +------------------------------------------------------------------ + +/^((a+)(?U)([ab]+)(?-U)([bc]+)(\w*))/BM +Memory allocation (code space): 220 +------------------------------------------------------------------ + 0 52 Bra + 2 ^ + 3 47 CBra 1 + 6 5 CBra 2 + 9 a+ + 11 5 Ket + 13 13 CBra 3 + 16 [ab]+? + 26 13 Ket + 28 13 CBra 4 + 31 [bc]+ + 41 13 Ket + 43 5 CBra 5 + 46 \w*+ + 48 5 Ket + 50 47 Ket + 52 52 Ket + 54 End +------------------------------------------------------------------ + +|8J\$WE\<\.rX\+ix\[d1b\!H\#\?vV0vrK\:ZH1\=2M\>iV\;\?aPhFB\<\*vW\@QW\@sO9\}cfZA\-i\'w\%hKd6gt1UJP\,15_\#QY\$M\^Mss_U\/\]\&LK9\[5vQub\^w\[KDD\qmj\;2\}YWFdYx\.Ap\]hjCPTP\(n28k\+3\;o\&WXqs\/gOXdr\$\:r\'do0\;b4c\(f_Gr\=\"\\4\)\[01T7ajQJvL\$W\~mL_sS\/4h\:x\*\[ZN\=KLs\&L5zX\/\/\>it\,o\:aU\(\;Z\>pW\&T7oP\'2K\^E\:x9\'c\[\%z\-\,64JQ5AeH_G\#KijUKghQw\^\\vea3a\?kka_G\$8\#\`\*kynsxzBLru\'\]k_\[7FrVx\}\^\=\$blx\>s\-N\%j\;D\*aZDnsw\:YKZ\%Q\.Kne9\#hP\?\+b3\(SOvL\,\^\;\&u5\@\?5C5Bhb\=m\-vEh_L15Jl\]U\)0RP6\{q\%L\^_z5E\'Dw6X\b|BM +Memory allocation (code space): 3296 +------------------------------------------------------------------ + 0 821 Bra + 2 8J$WE<.rX+ix[d1b!H#?vV0vrK:ZH1=2M>iV;?aPhFB<*vW@QW@sO9}cfZA-i'w%hKd6gt1UJP,15_#QY$M^Mss_U/]&LK9[5vQub^w[KDDqmj;2}YWFdYx.Ap]hjCPTP(n28k+3;o&WXqs/gOXdr$:r'do0;b4c(f_Gr="\4)[01T7ajQJvL$W~mL_sS/4h:x*[ZN=KLs&L5zX//>it,o:aU(;Z>pW&T7oP'2K^E:x9'c[%z-,64JQ5AeH_G#KijUKghQw^\vea3a?kka_G$8#`*kynsxzBLru']k_[7FrVx}^=$blx>s-N%j;D*aZDnsw:YKZ%Q.Kne9#hP?+b3(SOvL,^;&u5@?5C5Bhb=m-vEh_L15Jl]U)0RP6{q%L^_z5E'Dw6X +820 \b +821 821 Ket +823 End +------------------------------------------------------------------ + +|\$\<\.X\+ix\[d1b\!H\#\?vV0vrK\:ZH1\=2M\>iV\;\?aPhFB\<\*vW\@QW\@sO9\}cfZA\-i\'w\%hKd6gt1UJP\,15_\#QY\$M\^Mss_U\/\]\&LK9\[5vQub\^w\[KDD\qmj\;2\}YWFdYx\.Ap\]hjCPTP\(n28k\+3\;o\&WXqs\/gOXdr\$\:r\'do0\;b4c\(f_Gr\=\"\\4\)\[01T7ajQJvL\$W\~mL_sS\/4h\:x\*\[ZN\=KLs\&L5zX\/\/\>it\,o\:aU\(\;Z\>pW\&T7oP\'2K\^E\:x9\'c\[\%z\-\,64JQ5AeH_G\#KijUKghQw\^\\vea3a\?kka_G\$8\#\`\*kynsxzBLru\'\]k_\[7FrVx\}\^\=\$blx\>s\-N\%j\;D\*aZDnsw\:YKZ\%Q\.Kne9\#hP\?\+b3\(SOvL\,\^\;\&u5\@\?5C5Bhb\=m\-vEh_L15Jl\]U\)0RP6\{q\%L\^_z5E\'Dw6X\b|BM +Memory allocation (code space): 3256 +------------------------------------------------------------------ + 0 811 Bra + 2 $<.X+ix[d1b!H#?vV0vrK:ZH1=2M>iV;?aPhFB<*vW@QW@sO9}cfZA-i'w%hKd6gt1UJP,15_#QY$M^Mss_U/]&LK9[5vQub^w[KDDqmj;2}YWFdYx.Ap]hjCPTP(n28k+3;o&WXqs/gOXdr$:r'do0;b4c(f_Gr="\4)[01T7ajQJvL$W~mL_sS/4h:x*[ZN=KLs&L5zX//>it,o:aU(;Z>pW&T7oP'2K^E:x9'c[%z-,64JQ5AeH_G#KijUKghQw^\vea3a?kka_G$8#`*kynsxzBLru']k_[7FrVx}^=$blx>s-N%j;D*aZDnsw:YKZ%Q.Kne9#hP?+b3(SOvL,^;&u5@?5C5Bhb=m-vEh_L15Jl]U)0RP6{q%L^_z5E'Dw6X +810 \b +811 811 Ket +813 End +------------------------------------------------------------------ + +/(a(?1)b)/BM +Memory allocation (code space): 64 +------------------------------------------------------------------ + 0 13 Bra + 2 9 CBra 1 + 5 a + 7 2 Recurse + 9 b + 11 9 Ket + 13 13 Ket + 15 End +------------------------------------------------------------------ + +/(a(?1)+b)/BM +Memory allocation (code space): 80 +------------------------------------------------------------------ + 0 17 Bra + 2 13 CBra 1 + 5 a + 7 4 Once + 9 2 Recurse + 11 4 KetRmax + 13 b + 15 13 Ket + 17 17 Ket + 19 End +------------------------------------------------------------------ + +/a(?Pb|c)d(?Pe)/BM +Memory allocation (code space): 186 +------------------------------------------------------------------ + 0 24 Bra + 2 a + 4 5 CBra 1 + 7 b + 9 4 Alt + 11 c + 13 9 Ket + 15 d + 17 5 CBra 2 + 20 e + 22 5 Ket + 24 24 Ket + 26 End +------------------------------------------------------------------ + +/(?:a(?Pc(?Pd)))(?Pa)/BM +Memory allocation (code space): 155 +------------------------------------------------------------------ + 0 29 Bra + 2 18 Bra + 4 a + 6 12 CBra 1 + 9 c + 11 5 CBra 2 + 14 d + 16 5 Ket + 18 12 Ket + 20 18 Ket + 22 5 CBra 3 + 25 a + 27 5 Ket + 29 29 Ket + 31 End +------------------------------------------------------------------ + +/(?Pa)...(?P=a)bbb(?P>a)d/BM +Memory allocation (code space): 189 +------------------------------------------------------------------ + 0 24 Bra + 2 5 CBra 1 + 5 a + 7 5 Ket + 9 Any + 10 Any + 11 Any + 12 \1 + 14 bbb + 20 2 Recurse + 22 d + 24 24 Ket + 26 End +------------------------------------------------------------------ + +/abc(?C255)de(?C)f/BM +Memory allocation (code space): 100 +------------------------------------------------------------------ + 0 22 Bra + 2 abc + 8 Callout 255 10 1 + 12 de + 16 Callout 0 16 1 + 20 f + 22 22 Ket + 24 End +------------------------------------------------------------------ + +/abcde/CBM +Memory allocation (code space): 156 +------------------------------------------------------------------ + 0 36 Bra + 2 Callout 255 0 1 + 6 a + 8 Callout 255 1 1 + 12 b + 14 Callout 255 2 1 + 18 c + 20 Callout 255 3 1 + 24 d + 26 Callout 255 4 1 + 30 e + 32 Callout 255 5 0 + 36 36 Ket + 38 End +------------------------------------------------------------------ + +/\x{100}/8BM +Memory allocation (code space): 28 +------------------------------------------------------------------ + 0 4 Bra + 2 \x{100} + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/\x{1000}/8BM +Memory allocation (code space): 28 +------------------------------------------------------------------ + 0 4 Bra + 2 \x{1000} + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/\x{10000}/8BM +Memory allocation (code space): 28 +------------------------------------------------------------------ + 0 4 Bra + 2 \x{10000} + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/\x{100000}/8BM +Memory allocation (code space): 28 +------------------------------------------------------------------ + 0 4 Bra + 2 \x{100000} + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/\x{10ffff}/8BM +Memory allocation (code space): 28 +------------------------------------------------------------------ + 0 4 Bra + 2 \x{10ffff} + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/\x{110000}/8BM +Failed: character value in \x{} or \o{} is too large at offset 9 + +/[\x{ff}]/8BM +Memory allocation (code space): 28 +------------------------------------------------------------------ + 0 4 Bra + 2 \x{ff} + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/[\x{100}]/8BM +Memory allocation (code space): 28 +------------------------------------------------------------------ + 0 4 Bra + 2 \x{100} + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/\x80/8BM +Memory allocation (code space): 28 +------------------------------------------------------------------ + 0 4 Bra + 2 \x80 + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/\xff/8BM +Memory allocation (code space): 28 +------------------------------------------------------------------ + 0 4 Bra + 2 \x{ff} + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/\x{0041}\x{2262}\x{0391}\x{002e}/D8M +Memory allocation (code space): 52 +------------------------------------------------------------------ + 0 10 Bra + 2 A\x{2262}\x{391}. + 10 10 Ket + 12 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = 'A' +Need char = '.' + +/\x{D55c}\x{ad6d}\x{C5B4}/D8M +Memory allocation (code space): 44 +------------------------------------------------------------------ + 0 8 Bra + 2 \x{d55c}\x{ad6d}\x{c5b4} + 8 8 Ket + 10 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{d55c} +Need char = \x{c5b4} + +/\x{65e5}\x{672c}\x{8a9e}/D8M +Memory allocation (code space): 44 +------------------------------------------------------------------ + 0 8 Bra + 2 \x{65e5}\x{672c}\x{8a9e} + 8 8 Ket + 10 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{65e5} +Need char = \x{8a9e} + +/[\x{100}]/8BM +Memory allocation (code space): 28 +------------------------------------------------------------------ + 0 4 Bra + 2 \x{100} + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/[Z\x{100}]/8BM +Memory allocation (code space): 76 +------------------------------------------------------------------ + 0 16 Bra + 2 [Z\x{100}] + 16 16 Ket + 18 End +------------------------------------------------------------------ + +/^[\x{100}\E-\Q\E\x{150}]/B8M +Memory allocation (code space): 52 +------------------------------------------------------------------ + 0 10 Bra + 2 ^ + 3 [\x{100}-\x{150}] + 10 10 Ket + 12 End +------------------------------------------------------------------ + +/^[\QÄ€\E-\QÅ\E]/B8M +Memory allocation (code space): 52 +------------------------------------------------------------------ + 0 10 Bra + 2 ^ + 3 [\x{100}-\x{150}] + 10 10 Ket + 12 End +------------------------------------------------------------------ + +/^[\QÄ€\E-\QÅ\E/B8M +Failed: missing terminating ] for character class at offset 13 + +/[\p{L}]/BM +Memory allocation (code space): 48 +------------------------------------------------------------------ + 0 9 Bra + 2 [\p{L}] + 9 9 Ket + 11 End +------------------------------------------------------------------ + +/[\p{^L}]/BM +Memory allocation (code space): 48 +------------------------------------------------------------------ + 0 9 Bra + 2 [\P{L}] + 9 9 Ket + 11 End +------------------------------------------------------------------ + +/[\P{L}]/BM +Memory allocation (code space): 48 +------------------------------------------------------------------ + 0 9 Bra + 2 [\P{L}] + 9 9 Ket + 11 End +------------------------------------------------------------------ + +/[\P{^L}]/BM +Memory allocation (code space): 48 +------------------------------------------------------------------ + 0 9 Bra + 2 [\p{L}] + 9 9 Ket + 11 End +------------------------------------------------------------------ + +/[abc\p{L}\x{0660}]/8BM +Memory allocation (code space): 88 +------------------------------------------------------------------ + 0 19 Bra + 2 [a-c\p{L}\x{660}] + 19 19 Ket + 21 End +------------------------------------------------------------------ + +/[\p{Nd}]/8BM +Memory allocation (code space): 48 +------------------------------------------------------------------ + 0 9 Bra + 2 [\p{Nd}] + 9 9 Ket + 11 End +------------------------------------------------------------------ + +/[\p{Nd}+-]+/8BM +Memory allocation (code space): 84 +------------------------------------------------------------------ + 0 18 Bra + 2 [+\-\p{Nd}]++ + 18 18 Ket + 20 End +------------------------------------------------------------------ + +/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8iBM +Memory allocation (code space): 60 +------------------------------------------------------------------ + 0 12 Bra + 2 /i A\x{391}\x{10427}\x{ff3a}\x{1fb0} + 12 12 Ket + 14 End +------------------------------------------------------------------ + +/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8BM +Memory allocation (code space): 60 +------------------------------------------------------------------ + 0 12 Bra + 2 A\x{391}\x{10427}\x{ff3a}\x{1fb0} + 12 12 Ket + 14 End +------------------------------------------------------------------ + +/[\x{105}-\x{109}]/8iBM +Memory allocation (code space): 48 +------------------------------------------------------------------ + 0 9 Bra + 2 [\x{104}-\x{109}] + 9 9 Ket + 11 End +------------------------------------------------------------------ + +/( ( (?(1)0|) )* )/xBM +Memory allocation (code space): 104 +------------------------------------------------------------------ + 0 23 Bra + 2 19 CBra 1 + 5 Brazero + 6 13 SCBra 2 + 9 6 Cond + 11 1 Cond ref + 13 0 + 15 2 Alt + 17 8 Ket + 19 13 KetRmax + 21 19 Ket + 23 23 Ket + 25 End +------------------------------------------------------------------ + +/( (?(1)0|)* )/xBM +Memory allocation (code space): 84 +------------------------------------------------------------------ + 0 18 Bra + 2 14 CBra 1 + 5 Brazero + 6 6 SCond + 8 1 Cond ref + 10 0 + 12 2 Alt + 14 8 KetRmax + 16 14 Ket + 18 18 Ket + 20 End +------------------------------------------------------------------ + +/[a]/BM +Memory allocation (code space): 28 +------------------------------------------------------------------ + 0 4 Bra + 2 a + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/[a]/8BM +Memory allocation (code space): 28 +------------------------------------------------------------------ + 0 4 Bra + 2 a + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/[\xaa]/BM +Memory allocation (code space): 28 +------------------------------------------------------------------ + 0 4 Bra + 2 \x{aa} + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/[\xaa]/8BM +Memory allocation (code space): 28 +------------------------------------------------------------------ + 0 4 Bra + 2 \x{aa} + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/[^a]/BM +Memory allocation (code space): 28 +------------------------------------------------------------------ + 0 4 Bra + 2 [^a] + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/[^a]/8BM +Memory allocation (code space): 28 +------------------------------------------------------------------ + 0 4 Bra + 2 [^a] + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/[^\xaa]/BM +Memory allocation (code space): 28 +------------------------------------------------------------------ + 0 4 Bra + 2 [^\x{aa}] + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/[^\xaa]/8BM +Memory allocation (code space): 28 +------------------------------------------------------------------ + 0 4 Bra + 2 [^\x{aa}] + 4 4 Ket + 6 End +------------------------------------------------------------------ + +/[^\d]/8WB +------------------------------------------------------------------ + 0 9 Bra + 2 [^\p{Nd}] + 9 9 Ket + 11 End +------------------------------------------------------------------ + +/[[:^alpha:][:^cntrl:]]+/8WB +------------------------------------------------------------------ + 0 21 Bra + 2 [ -~\x80-\xff\P{L}\x{100}-\x{10ffff}]++ + 21 21 Ket + 23 End +------------------------------------------------------------------ + +/[[:^cntrl:][:^alpha:]]+/8WB +------------------------------------------------------------------ + 0 21 Bra + 2 [ -~\x80-\xff\x{100}-\x{10ffff}\P{L}]++ + 21 21 Ket + 23 End +------------------------------------------------------------------ + +/[[:alpha:]]+/8WB +------------------------------------------------------------------ + 0 10 Bra + 2 [\p{L}]++ + 10 10 Ket + 12 End +------------------------------------------------------------------ + +/[[:^alpha:]\S]+/8WB +------------------------------------------------------------------ + 0 13 Bra + 2 [\P{L}\P{Xsp}]++ + 13 13 Ket + 15 End +------------------------------------------------------------------ + +/abc(d|e)(*THEN)x(123(*THEN)4|567(b|q)(*THEN)xx)/B +------------------------------------------------------------------ + 0 60 Bra + 2 abc + 8 5 CBra 1 + 11 d + 13 4 Alt + 15 e + 17 9 Ket + 19 *THEN + 20 x + 22 12 CBra 2 + 25 123 + 31 *THEN + 32 4 + 34 24 Alt + 36 567 + 42 5 CBra 3 + 45 b + 47 4 Alt + 49 q + 51 9 Ket + 53 *THEN + 54 xx + 58 36 Ket + 60 60 Ket + 62 End +------------------------------------------------------------------ + +/(((a\2)|(a*)\g<-1>))*a?/B +------------------------------------------------------------------ + 0 39 Bra + 2 Brazero + 3 32 SCBra 1 + 6 27 Once + 8 12 CBra 2 + 11 7 CBra 3 + 14 a + 16 \2 + 18 7 Ket + 20 11 Alt + 22 5 CBra 4 + 25 a* + 27 5 Ket + 29 22 Recurse + 31 23 Ket + 33 27 Ket + 35 32 KetRmax + 37 a?+ + 39 39 Ket + 41 End +------------------------------------------------------------------ + +/((?+1)(\1))/B +------------------------------------------------------------------ + 0 20 Bra + 2 16 Once + 4 12 CBra 1 + 7 9 Recurse + 9 5 CBra 2 + 12 \1 + 14 5 Ket + 16 12 Ket + 18 16 Ket + 20 20 Ket + 22 End +------------------------------------------------------------------ + +/.((?2)(?R)\1)()/B +------------------------------------------------------------------ + 0 23 Bra + 2 Any + 3 13 Once + 5 9 CBra 1 + 8 18 Recurse + 10 0 Recurse + 12 \1 + 14 9 Ket + 16 13 Ket + 18 3 CBra 2 + 21 3 Ket + 23 23 Ket + 25 End +------------------------------------------------------------------ + +/([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00](*ACCEPT)/ +Failed: missing ) at offset 509 + +/-- End of testinput11 --/ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput11-8 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput11-8 new file mode 100755 index 000000000..5a4fbb236 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput11-8 @@ -0,0 +1,771 @@ +/-- These are a few representative patterns whose lengths and offsets are to be +shown when the link size is 2. This is just a doublecheck test to ensure the +sizes don't go horribly wrong when something is changed. The pattern contents +are all themselves checked in other tests. Unicode, including property support, +is required for these tests. --/ + +/((?i)b)/BM +Memory allocation (code space): 17 +------------------------------------------------------------------ + 0 13 Bra + 3 7 CBra 1 + 8 /i b + 10 7 Ket + 13 13 Ket + 16 End +------------------------------------------------------------------ + +/(?s)(.*X|^B)/BM +Memory allocation (code space): 25 +------------------------------------------------------------------ + 0 21 Bra + 3 9 CBra 1 + 8 AllAny* + 10 X + 12 6 Alt + 15 ^ + 16 B + 18 15 Ket + 21 21 Ket + 24 End +------------------------------------------------------------------ + +/(?s:.*X|^B)/BM +Memory allocation (code space): 23 +------------------------------------------------------------------ + 0 19 Bra + 3 7 Bra + 6 AllAny* + 8 X + 10 6 Alt + 13 ^ + 14 B + 16 13 Ket + 19 19 Ket + 22 End +------------------------------------------------------------------ + +/^[[:alnum:]]/BM +Memory allocation (code space): 41 +------------------------------------------------------------------ + 0 37 Bra + 3 ^ + 4 [0-9A-Za-z] + 37 37 Ket + 40 End +------------------------------------------------------------------ + +/#/IxMD +Memory allocation (code space): 7 +------------------------------------------------------------------ + 0 3 Bra + 3 3 Ket + 6 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +May match empty string +Options: extended +No first char +No need char + +/a#/IxMD +Memory allocation (code space): 9 +------------------------------------------------------------------ + 0 5 Bra + 3 a + 5 5 Ket + 8 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: extended +First char = 'a' +No need char + +/x?+/BM +Memory allocation (code space): 9 +------------------------------------------------------------------ + 0 5 Bra + 3 x?+ + 5 5 Ket + 8 End +------------------------------------------------------------------ + +/x++/BM +Memory allocation (code space): 9 +------------------------------------------------------------------ + 0 5 Bra + 3 x++ + 5 5 Ket + 8 End +------------------------------------------------------------------ + +/x{1,3}+/BM +Memory allocation (code space): 13 +------------------------------------------------------------------ + 0 9 Bra + 3 x + 5 x{0,2}+ + 9 9 Ket + 12 End +------------------------------------------------------------------ + +/(x)*+/BM +Memory allocation (code space): 18 +------------------------------------------------------------------ + 0 14 Bra + 3 Braposzero + 4 7 CBraPos 1 + 9 x + 11 7 KetRpos + 14 14 Ket + 17 End +------------------------------------------------------------------ + +/^((a+)(?U)([ab]+)(?-U)([bc]+)(\w*))/BM +Memory allocation (code space): 120 +------------------------------------------------------------------ + 0 116 Bra + 3 ^ + 4 109 CBra 1 + 9 7 CBra 2 + 14 a+ + 16 7 Ket + 19 39 CBra 3 + 24 [ab]+? + 58 39 Ket + 61 39 CBra 4 + 66 [bc]+ +100 39 Ket +103 7 CBra 5 +108 \w*+ +110 7 Ket +113 109 Ket +116 116 Ket +119 End +------------------------------------------------------------------ + +|8J\$WE\<\.rX\+ix\[d1b\!H\#\?vV0vrK\:ZH1\=2M\>iV\;\?aPhFB\<\*vW\@QW\@sO9\}cfZA\-i\'w\%hKd6gt1UJP\,15_\#QY\$M\^Mss_U\/\]\&LK9\[5vQub\^w\[KDD\qmj\;2\}YWFdYx\.Ap\]hjCPTP\(n28k\+3\;o\&WXqs\/gOXdr\$\:r\'do0\;b4c\(f_Gr\=\"\\4\)\[01T7ajQJvL\$W\~mL_sS\/4h\:x\*\[ZN\=KLs\&L5zX\/\/\>it\,o\:aU\(\;Z\>pW\&T7oP\'2K\^E\:x9\'c\[\%z\-\,64JQ5AeH_G\#KijUKghQw\^\\vea3a\?kka_G\$8\#\`\*kynsxzBLru\'\]k_\[7FrVx\}\^\=\$blx\>s\-N\%j\;D\*aZDnsw\:YKZ\%Q\.Kne9\#hP\?\+b3\(SOvL\,\^\;\&u5\@\?5C5Bhb\=m\-vEh_L15Jl\]U\)0RP6\{q\%L\^_z5E\'Dw6X\b|BM +Memory allocation (code space): 826 +------------------------------------------------------------------ + 0 822 Bra + 3 8J$WE<.rX+ix[d1b!H#?vV0vrK:ZH1=2M>iV;?aPhFB<*vW@QW@sO9}cfZA-i'w%hKd6gt1UJP,15_#QY$M^Mss_U/]&LK9[5vQub^w[KDDqmj;2}YWFdYx.Ap]hjCPTP(n28k+3;o&WXqs/gOXdr$:r'do0;b4c(f_Gr="\4)[01T7ajQJvL$W~mL_sS/4h:x*[ZN=KLs&L5zX//>it,o:aU(;Z>pW&T7oP'2K^E:x9'c[%z-,64JQ5AeH_G#KijUKghQw^\vea3a?kka_G$8#`*kynsxzBLru']k_[7FrVx}^=$blx>s-N%j;D*aZDnsw:YKZ%Q.Kne9#hP?+b3(SOvL,^;&u5@?5C5Bhb=m-vEh_L15Jl]U)0RP6{q%L^_z5E'Dw6X +821 \b +822 822 Ket +825 End +------------------------------------------------------------------ + +|\$\<\.X\+ix\[d1b\!H\#\?vV0vrK\:ZH1\=2M\>iV\;\?aPhFB\<\*vW\@QW\@sO9\}cfZA\-i\'w\%hKd6gt1UJP\,15_\#QY\$M\^Mss_U\/\]\&LK9\[5vQub\^w\[KDD\qmj\;2\}YWFdYx\.Ap\]hjCPTP\(n28k\+3\;o\&WXqs\/gOXdr\$\:r\'do0\;b4c\(f_Gr\=\"\\4\)\[01T7ajQJvL\$W\~mL_sS\/4h\:x\*\[ZN\=KLs\&L5zX\/\/\>it\,o\:aU\(\;Z\>pW\&T7oP\'2K\^E\:x9\'c\[\%z\-\,64JQ5AeH_G\#KijUKghQw\^\\vea3a\?kka_G\$8\#\`\*kynsxzBLru\'\]k_\[7FrVx\}\^\=\$blx\>s\-N\%j\;D\*aZDnsw\:YKZ\%Q\.Kne9\#hP\?\+b3\(SOvL\,\^\;\&u5\@\?5C5Bhb\=m\-vEh_L15Jl\]U\)0RP6\{q\%L\^_z5E\'Dw6X\b|BM +Memory allocation (code space): 816 +------------------------------------------------------------------ + 0 812 Bra + 3 $<.X+ix[d1b!H#?vV0vrK:ZH1=2M>iV;?aPhFB<*vW@QW@sO9}cfZA-i'w%hKd6gt1UJP,15_#QY$M^Mss_U/]&LK9[5vQub^w[KDDqmj;2}YWFdYx.Ap]hjCPTP(n28k+3;o&WXqs/gOXdr$:r'do0;b4c(f_Gr="\4)[01T7ajQJvL$W~mL_sS/4h:x*[ZN=KLs&L5zX//>it,o:aU(;Z>pW&T7oP'2K^E:x9'c[%z-,64JQ5AeH_G#KijUKghQw^\vea3a?kka_G$8#`*kynsxzBLru']k_[7FrVx}^=$blx>s-N%j;D*aZDnsw:YKZ%Q.Kne9#hP?+b3(SOvL,^;&u5@?5C5Bhb=m-vEh_L15Jl]U)0RP6{q%L^_z5E'Dw6X +811 \b +812 812 Ket +815 End +------------------------------------------------------------------ + +/(a(?1)b)/BM +Memory allocation (code space): 22 +------------------------------------------------------------------ + 0 18 Bra + 3 12 CBra 1 + 8 a + 10 3 Recurse + 13 b + 15 12 Ket + 18 18 Ket + 21 End +------------------------------------------------------------------ + +/(a(?1)+b)/BM +Memory allocation (code space): 28 +------------------------------------------------------------------ + 0 24 Bra + 3 18 CBra 1 + 8 a + 10 6 Once + 13 3 Recurse + 16 6 KetRmax + 19 b + 21 18 Ket + 24 24 Ket + 27 End +------------------------------------------------------------------ + +/a(?Pb|c)d(?Pe)/BM +Memory allocation (code space): 36 +------------------------------------------------------------------ + 0 32 Bra + 3 a + 5 7 CBra 1 + 10 b + 12 5 Alt + 15 c + 17 12 Ket + 20 d + 22 7 CBra 2 + 27 e + 29 7 Ket + 32 32 Ket + 35 End +------------------------------------------------------------------ + +/(?:a(?Pc(?Pd)))(?Pa)/BM +Memory allocation (code space): 45 +------------------------------------------------------------------ + 0 41 Bra + 3 25 Bra + 6 a + 8 17 CBra 1 + 13 c + 15 7 CBra 2 + 20 d + 22 7 Ket + 25 17 Ket + 28 25 Ket + 31 7 CBra 3 + 36 a + 38 7 Ket + 41 41 Ket + 44 End +------------------------------------------------------------------ + +/(?Pa)...(?P=a)bbb(?P>a)d/BM +Memory allocation (code space): 62 +------------------------------------------------------------------ + 0 30 Bra + 3 7 CBra 1 + 8 a + 10 7 Ket + 13 Any + 14 Any + 15 Any + 16 \1 + 19 bbb + 25 3 Recurse + 28 d + 30 30 Ket + 33 End +------------------------------------------------------------------ + +/abc(?C255)de(?C)f/BM +Memory allocation (code space): 31 +------------------------------------------------------------------ + 0 27 Bra + 3 abc + 9 Callout 255 10 1 + 15 de + 19 Callout 0 16 1 + 25 f + 27 27 Ket + 30 End +------------------------------------------------------------------ + +/abcde/CBM +Memory allocation (code space): 53 +------------------------------------------------------------------ + 0 49 Bra + 3 Callout 255 0 1 + 9 a + 11 Callout 255 1 1 + 17 b + 19 Callout 255 2 1 + 25 c + 27 Callout 255 3 1 + 33 d + 35 Callout 255 4 1 + 41 e + 43 Callout 255 5 0 + 49 49 Ket + 52 End +------------------------------------------------------------------ + +/\x{100}/8BM +Memory allocation (code space): 10 +------------------------------------------------------------------ + 0 6 Bra + 3 \x{100} + 6 6 Ket + 9 End +------------------------------------------------------------------ + +/\x{1000}/8BM +Memory allocation (code space): 11 +------------------------------------------------------------------ + 0 7 Bra + 3 \x{1000} + 7 7 Ket + 10 End +------------------------------------------------------------------ + +/\x{10000}/8BM +Memory allocation (code space): 12 +------------------------------------------------------------------ + 0 8 Bra + 3 \x{10000} + 8 8 Ket + 11 End +------------------------------------------------------------------ + +/\x{100000}/8BM +Memory allocation (code space): 12 +------------------------------------------------------------------ + 0 8 Bra + 3 \x{100000} + 8 8 Ket + 11 End +------------------------------------------------------------------ + +/\x{10ffff}/8BM +Memory allocation (code space): 12 +------------------------------------------------------------------ + 0 8 Bra + 3 \x{10ffff} + 8 8 Ket + 11 End +------------------------------------------------------------------ + +/\x{110000}/8BM +Failed: character value in \x{} or \o{} is too large at offset 9 + +/[\x{ff}]/8BM +Memory allocation (code space): 10 +------------------------------------------------------------------ + 0 6 Bra + 3 \x{ff} + 6 6 Ket + 9 End +------------------------------------------------------------------ + +/[\x{100}]/8BM +Memory allocation (code space): 10 +------------------------------------------------------------------ + 0 6 Bra + 3 \x{100} + 6 6 Ket + 9 End +------------------------------------------------------------------ + +/\x80/8BM +Memory allocation (code space): 10 +------------------------------------------------------------------ + 0 6 Bra + 3 \x{80} + 6 6 Ket + 9 End +------------------------------------------------------------------ + +/\xff/8BM +Memory allocation (code space): 10 +------------------------------------------------------------------ + 0 6 Bra + 3 \x{ff} + 6 6 Ket + 9 End +------------------------------------------------------------------ + +/\x{0041}\x{2262}\x{0391}\x{002e}/D8M +Memory allocation (code space): 18 +------------------------------------------------------------------ + 0 14 Bra + 3 A\x{2262}\x{391}. + 14 14 Ket + 17 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = 'A' +Need char = '.' + +/\x{D55c}\x{ad6d}\x{C5B4}/D8M +Memory allocation (code space): 19 +------------------------------------------------------------------ + 0 15 Bra + 3 \x{d55c}\x{ad6d}\x{c5b4} + 15 15 Ket + 18 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{ed} +Need char = \x{b4} + +/\x{65e5}\x{672c}\x{8a9e}/D8M +Memory allocation (code space): 19 +------------------------------------------------------------------ + 0 15 Bra + 3 \x{65e5}\x{672c}\x{8a9e} + 15 15 Ket + 18 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{e6} +Need char = \x{9e} + +/[\x{100}]/8BM +Memory allocation (code space): 10 +------------------------------------------------------------------ + 0 6 Bra + 3 \x{100} + 6 6 Ket + 9 End +------------------------------------------------------------------ + +/[Z\x{100}]/8BM +Memory allocation (code space): 47 +------------------------------------------------------------------ + 0 43 Bra + 3 [Z\x{100}] + 43 43 Ket + 46 End +------------------------------------------------------------------ + +/^[\x{100}\E-\Q\E\x{150}]/B8M +Memory allocation (code space): 18 +------------------------------------------------------------------ + 0 14 Bra + 3 ^ + 4 [\x{100}-\x{150}] + 14 14 Ket + 17 End +------------------------------------------------------------------ + +/^[\QÄ€\E-\QÅ\E]/B8M +Memory allocation (code space): 18 +------------------------------------------------------------------ + 0 14 Bra + 3 ^ + 4 [\x{100}-\x{150}] + 14 14 Ket + 17 End +------------------------------------------------------------------ + +/^[\QÄ€\E-\QÅ\E/B8M +Failed: missing terminating ] for character class at offset 15 + +/[\p{L}]/BM +Memory allocation (code space): 15 +------------------------------------------------------------------ + 0 11 Bra + 3 [\p{L}] + 11 11 Ket + 14 End +------------------------------------------------------------------ + +/[\p{^L}]/BM +Memory allocation (code space): 15 +------------------------------------------------------------------ + 0 11 Bra + 3 [\P{L}] + 11 11 Ket + 14 End +------------------------------------------------------------------ + +/[\P{L}]/BM +Memory allocation (code space): 15 +------------------------------------------------------------------ + 0 11 Bra + 3 [\P{L}] + 11 11 Ket + 14 End +------------------------------------------------------------------ + +/[\P{^L}]/BM +Memory allocation (code space): 15 +------------------------------------------------------------------ + 0 11 Bra + 3 [\p{L}] + 11 11 Ket + 14 End +------------------------------------------------------------------ + +/[abc\p{L}\x{0660}]/8BM +Memory allocation (code space): 50 +------------------------------------------------------------------ + 0 46 Bra + 3 [a-c\p{L}\x{660}] + 46 46 Ket + 49 End +------------------------------------------------------------------ + +/[\p{Nd}]/8BM +Memory allocation (code space): 15 +------------------------------------------------------------------ + 0 11 Bra + 3 [\p{Nd}] + 11 11 Ket + 14 End +------------------------------------------------------------------ + +/[\p{Nd}+-]+/8BM +Memory allocation (code space): 48 +------------------------------------------------------------------ + 0 44 Bra + 3 [+\-\p{Nd}]++ + 44 44 Ket + 47 End +------------------------------------------------------------------ + +/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8iBM +Memory allocation (code space): 25 +------------------------------------------------------------------ + 0 21 Bra + 3 /i A\x{391}\x{10427}\x{ff3a}\x{1fb0} + 21 21 Ket + 24 End +------------------------------------------------------------------ + +/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8BM +Memory allocation (code space): 25 +------------------------------------------------------------------ + 0 21 Bra + 3 A\x{391}\x{10427}\x{ff3a}\x{1fb0} + 21 21 Ket + 24 End +------------------------------------------------------------------ + +/[\x{105}-\x{109}]/8iBM +Memory allocation (code space): 17 +------------------------------------------------------------------ + 0 13 Bra + 3 [\x{104}-\x{109}] + 13 13 Ket + 16 End +------------------------------------------------------------------ + +/( ( (?(1)0|) )* )/xBM +Memory allocation (code space): 38 +------------------------------------------------------------------ + 0 34 Bra + 3 28 CBra 1 + 8 Brazero + 9 19 SCBra 2 + 14 8 Cond + 17 1 Cond ref + 20 0 + 22 3 Alt + 25 11 Ket + 28 19 KetRmax + 31 28 Ket + 34 34 Ket + 37 End +------------------------------------------------------------------ + +/( (?(1)0|)* )/xBM +Memory allocation (code space): 30 +------------------------------------------------------------------ + 0 26 Bra + 3 20 CBra 1 + 8 Brazero + 9 8 SCond + 12 1 Cond ref + 15 0 + 17 3 Alt + 20 11 KetRmax + 23 20 Ket + 26 26 Ket + 29 End +------------------------------------------------------------------ + +/[a]/BM +Memory allocation (code space): 9 +------------------------------------------------------------------ + 0 5 Bra + 3 a + 5 5 Ket + 8 End +------------------------------------------------------------------ + +/[a]/8BM +Memory allocation (code space): 9 +------------------------------------------------------------------ + 0 5 Bra + 3 a + 5 5 Ket + 8 End +------------------------------------------------------------------ + +/[\xaa]/BM +Memory allocation (code space): 9 +------------------------------------------------------------------ + 0 5 Bra + 3 \x{aa} + 5 5 Ket + 8 End +------------------------------------------------------------------ + +/[\xaa]/8BM +Memory allocation (code space): 10 +------------------------------------------------------------------ + 0 6 Bra + 3 \x{aa} + 6 6 Ket + 9 End +------------------------------------------------------------------ + +/[^a]/BM +Memory allocation (code space): 9 +------------------------------------------------------------------ + 0 5 Bra + 3 [^a] + 5 5 Ket + 8 End +------------------------------------------------------------------ + +/[^a]/8BM +Memory allocation (code space): 9 +------------------------------------------------------------------ + 0 5 Bra + 3 [^a] + 5 5 Ket + 8 End +------------------------------------------------------------------ + +/[^\xaa]/BM +Memory allocation (code space): 9 +------------------------------------------------------------------ + 0 5 Bra + 3 [^\x{aa}] + 5 5 Ket + 8 End +------------------------------------------------------------------ + +/[^\xaa]/8BM +Memory allocation (code space): 10 +------------------------------------------------------------------ + 0 6 Bra + 3 [^\x{aa}] + 6 6 Ket + 9 End +------------------------------------------------------------------ + +/[^\d]/8WB +------------------------------------------------------------------ + 0 11 Bra + 3 [^\p{Nd}] + 11 11 Ket + 14 End +------------------------------------------------------------------ + +/[[:^alpha:][:^cntrl:]]+/8WB +------------------------------------------------------------------ + 0 51 Bra + 3 [ -~\x80-\xff\P{L}\x{100}-\x{10ffff}]++ + 51 51 Ket + 54 End +------------------------------------------------------------------ + +/[[:^cntrl:][:^alpha:]]+/8WB +------------------------------------------------------------------ + 0 51 Bra + 3 [ -~\x80-\xff\x{100}-\x{10ffff}\P{L}]++ + 51 51 Ket + 54 End +------------------------------------------------------------------ + +/[[:alpha:]]+/8WB +------------------------------------------------------------------ + 0 12 Bra + 3 [\p{L}]++ + 12 12 Ket + 15 End +------------------------------------------------------------------ + +/[[:^alpha:]\S]+/8WB +------------------------------------------------------------------ + 0 15 Bra + 3 [\P{L}\P{Xsp}]++ + 15 15 Ket + 18 End +------------------------------------------------------------------ + +/abc(d|e)(*THEN)x(123(*THEN)4|567(b|q)(*THEN)xx)/B +------------------------------------------------------------------ + 0 73 Bra + 3 abc + 9 7 CBra 1 + 14 d + 16 5 Alt + 19 e + 21 12 Ket + 24 *THEN + 25 x + 27 14 CBra 2 + 32 123 + 38 *THEN + 39 4 + 41 29 Alt + 44 567 + 50 7 CBra 3 + 55 b + 57 5 Alt + 60 q + 62 12 Ket + 65 *THEN + 66 xx + 70 43 Ket + 73 73 Ket + 76 End +------------------------------------------------------------------ + +/(((a\2)|(a*)\g<-1>))*a?/B +------------------------------------------------------------------ + 0 57 Bra + 3 Brazero + 4 48 SCBra 1 + 9 40 Once + 12 18 CBra 2 + 17 10 CBra 3 + 22 a + 24 \2 + 27 10 Ket + 30 16 Alt + 33 7 CBra 4 + 38 a* + 40 7 Ket + 43 33 Recurse + 46 34 Ket + 49 40 Ket + 52 48 KetRmax + 55 a?+ + 57 57 Ket + 60 End +------------------------------------------------------------------ + +/((?+1)(\1))/B +------------------------------------------------------------------ + 0 31 Bra + 3 25 Once + 6 19 CBra 1 + 11 14 Recurse + 14 8 CBra 2 + 19 \1 + 22 8 Ket + 25 19 Ket + 28 25 Ket + 31 31 Ket + 34 End +------------------------------------------------------------------ + +/.((?2)(?R)\1)()/B +------------------------------------------------------------------ + 0 35 Bra + 3 Any + 4 20 Once + 7 14 CBra 1 + 12 27 Recurse + 15 0 Recurse + 18 \1 + 21 14 Ket + 24 20 Ket + 27 5 CBra 2 + 32 5 Ket + 35 35 Ket + 38 End +------------------------------------------------------------------ + +/([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00](*ACCEPT)/ +Failed: missing ) at offset 509 + +/-- End of testinput11 --/ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput12 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput12 new file mode 100755 index 000000000..7632c4e58 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput12 @@ -0,0 +1,206 @@ +/-- This test is run only when JIT support is available. It checks for a +successful and an unsuccessful JIT compile and save and restore behaviour, +and a couple of things that are different with JIT. --/ + +/abc/S+I +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'c' +Subject length lower bound = 3 +No starting char list +JIT study was successful + +/(?(?C1)(?=a)a)/S+I +Capturing subpattern count = 0 +May match empty string +No options +No first char +No need char +Study returned NULL +JIT study was not successful + +/(?(?C1)(?=a)a)/S!+I +Capturing subpattern count = 0 +May match empty string +No options +No first char +No need char +Subject length lower bound = -1 +No starting char list +JIT study was not successful + +/b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*/S+I +Capturing subpattern count = 0 +May match empty string +No options +No first char +No need char +Study returned NULL +JIT study was not successful + +/abc/S+I>testsavedregex +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'c' +Subject length lower bound = 3 +No starting char list +JIT study was successful +Compiled pattern written to testsavedregex +Study data written to testsavedregex + +b)c/PN + abc +Matched with REG_NOSUB + +/a?|b?/P + abc + 0: a + ** Failers + 0: + ddd\N +No match: POSIX code 17: match failed + +/\w+A/P + CDAAAAB + 0: CDAAAA + +/\w+A/PU + CDAAAAB + 0: CDA + +/\Biss\B/I+P + Mississippi + 0: iss + 0+ issippi + +/abc/\P +Failed: POSIX code 9: bad escape sequence at offset 4 + +/-- End of POSIX tests --/ + +/a\Cb/ + aXb + 0: aXb + a\nb + 0: a\x0ab + ** Failers (too big char) +No match + A\x{123}B +** Character \x{123} is greater than 255 and UTF-8 mode is not enabled. +** Truncation will probably give the wrong result. +No match + A\o{443}B +** Character \x{123} is greater than 255 and UTF-8 mode is not enabled. +** Truncation will probably give the wrong result. +No match + +/\x{100}/I +Failed: character value in \x{} or \o{} is too large at offset 6 + +/\o{400}/I +Failed: character value in \x{} or \o{} is too large at offset 6 + +/ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # optional leading comment +(?: (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # initial word +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) )* # further okay, if led by a period +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] | # atom and space parts, or... +\( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) | # comments, or... + +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +# quoted strings +)* +< (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # leading < +(?: @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* + +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* , (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* )? # optional route +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # initial word +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) )* # further okay, if led by a period +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +# address spec +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* > # trailing > +# name and address +) (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # optional trailing comment +/xSI +Capturing subpattern count = 0 +Contains explicit CR or LF match +Options: extended +No first char +No need char +Subject length lower bound = 3 +Starting chars: \x09 \x20 ! " # $ % & ' ( * + - / 0 1 2 3 4 5 6 7 8 + 9 = ? A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ^ _ ` a b c d e + f g h i j k l m n o p q r s t u v w x y z { | } ~ \x7f + +/-- Although this saved pattern was compiled with link-size=2, it does no harm +to run this test with other link sizes because it is going to generated a +"compiled in wrong mode" error as soon as it is loaded, so the link size does +not matter. --/ + +\x09< + 0: \x09 + +/[\h]+/BZ +------------------------------------------------------------------ + Bra + [\x09 \xa0]++ + Ket + End +------------------------------------------------------------------ + >\x09\x20\xa0< + 0: \x09 \xa0 + +/[\v]/BZ +------------------------------------------------------------------ + Bra + [\x0a-\x0d\x85] + Ket + End +------------------------------------------------------------------ + +/[\H]/BZ +------------------------------------------------------------------ + Bra + [\x00-\x08\x0a-\x1f!-\x9f\xa1-\xff] + Ket + End +------------------------------------------------------------------ + +/[^\h]/BZ +------------------------------------------------------------------ + Bra + [\x00-\x08\x0a-\x1f!-\x9f\xa1-\xff] (neg) + Ket + End +------------------------------------------------------------------ + +/[\V]/BZ +------------------------------------------------------------------ + Bra + [\x00-\x09\x0e-\x84\x86-\xff] + Ket + End +------------------------------------------------------------------ + +/[\x0a\V]/BZ +------------------------------------------------------------------ + Bra + [\x00-\x0a\x0e-\x84\x86-\xff] + Ket + End +------------------------------------------------------------------ + +/\777/I +Failed: octal value is greater than \377 in 8-bit non-UTF-8 mode at offset 3 + +/(*:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF)XX/K +Failed: name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN) at offset 259 + +/(*:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDE)XX/K + XX + 0: XX +MK: 0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDE + +/\u0100/ +Failed: character value in \u.... sequence is too large at offset 5 + +/[\u0100-\u0200]/ +Failed: character value in \u.... sequence is too large at offset 6 + +/[^\x00-a]{12,}[^b-\xff]*/BZ +------------------------------------------------------------------ + Bra + [b-\xff] (neg){12,}+ + [\x00-a] (neg)*+ + Ket + End +------------------------------------------------------------------ + +/[^\s]*\s* [^\W]+\W+ [^\d]*?\d0 [^\d\w]{4,6}?\w*A/BZ +------------------------------------------------------------------ + Bra + [\x00-\x08\x0e-\x1f!-\xff] (neg)*+ + \s* + + [0-9A-Z_a-z]++ + \W+ + + [\x00-/:-\xff] (neg)*+ + \d + 0 + [\x00-/:-@[-^`{-\xff] (neg){4,6}+ + \w* + A + Ket + End +------------------------------------------------------------------ + +/(?'ABC'[bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar](*THEN:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))/ + +/-- End of testinput14 --/ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput15 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput15 new file mode 100755 index 000000000..e4e123c39 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput15 @@ -0,0 +1,1144 @@ +/-- This set of tests is for UTF-8 support but not Unicode property support, + and is relevant only to the 8-bit library. --/ + +< forbid W + +/X(\C{3})/8 + X\x{1234} + 0: X\x{1234} + 1: \x{1234} + +/X(\C{4})/8 + X\x{1234}YZ + 0: X\x{1234}Y + 1: \x{1234}Y + +/X\C*/8 + XYZabcdce + 0: XYZabcdce + +/X\C*?/8 + XYZabcde + 0: X + +/X\C{3,5}/8 + Xabcdefg + 0: Xabcde + X\x{1234} + 0: X\x{1234} + X\x{1234}YZ + 0: X\x{1234}YZ + X\x{1234}\x{512} + 0: X\x{1234}\x{512} + X\x{1234}\x{512}YZ + 0: X\x{1234}\x{512} + +/X\C{3,5}?/8 + Xabcdefg + 0: Xabc + X\x{1234} + 0: X\x{1234} + X\x{1234}YZ + 0: X\x{1234} + X\x{1234}\x{512} + 0: X\x{1234} + +/a\Cb/8 + aXb + 0: aXb + a\nb + 0: a\x{0a}b + +/a\C\Cb/8 + a\x{100}b + 0: a\x{100}b + +/ab\Cde/8 + abXde + 0: abXde + +/a\C\Cb/8 + a\x{100}b + 0: a\x{100}b + ** Failers +No match + a\x{12257}b +No match + +/[Ã]/8 +Failed: invalid UTF-8 string at offset 1 + +/Ã/8 +Failed: invalid UTF-8 string at offset 0 + +/ÃÃÃxxx/8 +Failed: invalid UTF-8 string at offset 0 + +/ÃÃÃxxx/8?DZSSO +------------------------------------------------------------------ + Bra + \X{c0}\X{c0}\X{c0}xxx + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: no_auto_possessify utf no_utf_check +First char = \x{c3} +Need char = 'x' + +/badutf/8 + \xdf +Error -10 (bad UTF-8 string) offset=0 reason=1 + \xef +Error -10 (bad UTF-8 string) offset=0 reason=2 + \xef\x80 +Error -10 (bad UTF-8 string) offset=0 reason=1 + \xf7 +Error -10 (bad UTF-8 string) offset=0 reason=3 + \xf7\x80 +Error -10 (bad UTF-8 string) offset=0 reason=2 + \xf7\x80\x80 +Error -10 (bad UTF-8 string) offset=0 reason=1 + \xfb +Error -10 (bad UTF-8 string) offset=0 reason=4 + \xfb\x80 +Error -10 (bad UTF-8 string) offset=0 reason=3 + \xfb\x80\x80 +Error -10 (bad UTF-8 string) offset=0 reason=2 + \xfb\x80\x80\x80 +Error -10 (bad UTF-8 string) offset=0 reason=1 + \xfd +Error -10 (bad UTF-8 string) offset=0 reason=5 + \xfd\x80 +Error -10 (bad UTF-8 string) offset=0 reason=4 + \xfd\x80\x80 +Error -10 (bad UTF-8 string) offset=0 reason=3 + \xfd\x80\x80\x80 +Error -10 (bad UTF-8 string) offset=0 reason=2 + \xfd\x80\x80\x80\x80 +Error -10 (bad UTF-8 string) offset=0 reason=1 + \xdf\x7f +Error -10 (bad UTF-8 string) offset=0 reason=6 + \xef\x7f\x80 +Error -10 (bad UTF-8 string) offset=0 reason=6 + \xef\x80\x7f +Error -10 (bad UTF-8 string) offset=0 reason=7 + \xf7\x7f\x80\x80 +Error -10 (bad UTF-8 string) offset=0 reason=6 + \xf7\x80\x7f\x80 +Error -10 (bad UTF-8 string) offset=0 reason=7 + \xf7\x80\x80\x7f +Error -10 (bad UTF-8 string) offset=0 reason=8 + \xfb\x7f\x80\x80\x80 +Error -10 (bad UTF-8 string) offset=0 reason=6 + \xfb\x80\x7f\x80\x80 +Error -10 (bad UTF-8 string) offset=0 reason=7 + \xfb\x80\x80\x7f\x80 +Error -10 (bad UTF-8 string) offset=0 reason=8 + \xfb\x80\x80\x80\x7f +Error -10 (bad UTF-8 string) offset=0 reason=9 + \xfd\x7f\x80\x80\x80\x80 +Error -10 (bad UTF-8 string) offset=0 reason=6 + \xfd\x80\x7f\x80\x80\x80 +Error -10 (bad UTF-8 string) offset=0 reason=7 + \xfd\x80\x80\x7f\x80\x80 +Error -10 (bad UTF-8 string) offset=0 reason=8 + \xfd\x80\x80\x80\x7f\x80 +Error -10 (bad UTF-8 string) offset=0 reason=9 + \xfd\x80\x80\x80\x80\x7f +Error -10 (bad UTF-8 string) offset=0 reason=10 + \xed\xa0\x80 +Error -10 (bad UTF-8 string) offset=0 reason=14 + \xc0\x8f +Error -10 (bad UTF-8 string) offset=0 reason=15 + \xe0\x80\x8f +Error -10 (bad UTF-8 string) offset=0 reason=16 + \xf0\x80\x80\x8f +Error -10 (bad UTF-8 string) offset=0 reason=17 + \xf8\x80\x80\x80\x8f +Error -10 (bad UTF-8 string) offset=0 reason=18 + \xfc\x80\x80\x80\x80\x8f +Error -10 (bad UTF-8 string) offset=0 reason=19 + \x80 +Error -10 (bad UTF-8 string) offset=0 reason=20 + \xfe +Error -10 (bad UTF-8 string) offset=0 reason=21 + \xff +Error -10 (bad UTF-8 string) offset=0 reason=21 + +/badutf/8 + \xfb\x80\x80\x80\x80 +Error -10 (bad UTF-8 string) offset=0 reason=11 + \xfd\x80\x80\x80\x80\x80 +Error -10 (bad UTF-8 string) offset=0 reason=12 + \xf7\xbf\xbf\xbf +Error -10 (bad UTF-8 string) offset=0 reason=13 + +/shortutf/8 + \P\P\xdf +Error -25 (short UTF-8 string) offset=0 reason=1 + \P\P\xef +Error -25 (short UTF-8 string) offset=0 reason=2 + \P\P\xef\x80 +Error -25 (short UTF-8 string) offset=0 reason=1 + \P\P\xf7 +Error -25 (short UTF-8 string) offset=0 reason=3 + \P\P\xf7\x80 +Error -25 (short UTF-8 string) offset=0 reason=2 + \P\P\xf7\x80\x80 +Error -25 (short UTF-8 string) offset=0 reason=1 + \P\P\xfb +Error -25 (short UTF-8 string) offset=0 reason=4 + \P\P\xfb\x80 +Error -25 (short UTF-8 string) offset=0 reason=3 + \P\P\xfb\x80\x80 +Error -25 (short UTF-8 string) offset=0 reason=2 + \P\P\xfb\x80\x80\x80 +Error -25 (short UTF-8 string) offset=0 reason=1 + \P\P\xfd +Error -25 (short UTF-8 string) offset=0 reason=5 + \P\P\xfd\x80 +Error -25 (short UTF-8 string) offset=0 reason=4 + \P\P\xfd\x80\x80 +Error -25 (short UTF-8 string) offset=0 reason=3 + \P\P\xfd\x80\x80\x80 +Error -25 (short UTF-8 string) offset=0 reason=2 + \P\P\xfd\x80\x80\x80\x80 +Error -25 (short UTF-8 string) offset=0 reason=1 + +/anything/8 + \xc0\x80 +Error -10 (bad UTF-8 string) offset=0 reason=15 + \xc1\x8f +Error -10 (bad UTF-8 string) offset=0 reason=15 + \xe0\x9f\x80 +Error -10 (bad UTF-8 string) offset=0 reason=16 + \xf0\x8f\x80\x80 +Error -10 (bad UTF-8 string) offset=0 reason=17 + \xf8\x87\x80\x80\x80 +Error -10 (bad UTF-8 string) offset=0 reason=18 + \xfc\x83\x80\x80\x80\x80 +Error -10 (bad UTF-8 string) offset=0 reason=19 + \xfe\x80\x80\x80\x80\x80 +Error -10 (bad UTF-8 string) offset=0 reason=21 + \xff\x80\x80\x80\x80\x80 +Error -10 (bad UTF-8 string) offset=0 reason=21 + \xc3\x8f +No match + \xe0\xaf\x80 +No match + \xe1\x80\x80 +No match + \xf0\x9f\x80\x80 +No match + \xf1\x8f\x80\x80 +No match + \xf8\x88\x80\x80\x80 +Error -10 (bad UTF-8 string) offset=0 reason=11 + \xf9\x87\x80\x80\x80 +Error -10 (bad UTF-8 string) offset=0 reason=11 + \xfc\x84\x80\x80\x80\x80 +Error -10 (bad UTF-8 string) offset=0 reason=12 + \xfd\x83\x80\x80\x80\x80 +Error -10 (bad UTF-8 string) offset=0 reason=12 + \?\xf8\x88\x80\x80\x80 +No match + \?\xf9\x87\x80\x80\x80 +No match + \?\xfc\x84\x80\x80\x80\x80 +No match + \?\xfd\x83\x80\x80\x80\x80 +No match + +/\x{100}/8DZ +------------------------------------------------------------------ + Bra + \x{100} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{c4} +Need char = \x{80} + +/\x{1000}/8DZ +------------------------------------------------------------------ + Bra + \x{1000} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{e1} +Need char = \x{80} + +/\x{10000}/8DZ +------------------------------------------------------------------ + Bra + \x{10000} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{f0} +Need char = \x{80} + +/\x{100000}/8DZ +------------------------------------------------------------------ + Bra + \x{100000} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{f4} +Need char = \x{80} + +/\x{10ffff}/8DZ +------------------------------------------------------------------ + Bra + \x{10ffff} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{f4} +Need char = \x{bf} + +/[\x{ff}]/8DZ +------------------------------------------------------------------ + Bra + \x{ff} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{c3} +Need char = \x{bf} + +/[\x{100}]/8DZ +------------------------------------------------------------------ + Bra + \x{100} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{c4} +Need char = \x{80} + +/\x80/8DZ +------------------------------------------------------------------ + Bra + \x{80} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{c2} +Need char = \x{80} + +/\xff/8DZ +------------------------------------------------------------------ + Bra + \x{ff} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{c3} +Need char = \x{bf} + +/\x{D55c}\x{ad6d}\x{C5B4}/DZ8 +------------------------------------------------------------------ + Bra + \x{d55c}\x{ad6d}\x{c5b4} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{ed} +Need char = \x{b4} + \x{D55c}\x{ad6d}\x{C5B4} + 0: \x{d55c}\x{ad6d}\x{c5b4} + +/\x{65e5}\x{672c}\x{8a9e}/DZ8 +------------------------------------------------------------------ + Bra + \x{65e5}\x{672c}\x{8a9e} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{e6} +Need char = \x{9e} + \x{65e5}\x{672c}\x{8a9e} + 0: \x{65e5}\x{672c}\x{8a9e} + +/\x{80}/DZ8 +------------------------------------------------------------------ + Bra + \x{80} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{c2} +Need char = \x{80} + +/\x{084}/DZ8 +------------------------------------------------------------------ + Bra + \x{84} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{c2} +Need char = \x{84} + +/\x{104}/DZ8 +------------------------------------------------------------------ + Bra + \x{104} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{c4} +Need char = \x{84} + +/\x{861}/DZ8 +------------------------------------------------------------------ + Bra + \x{861} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{e0} +Need char = \x{a1} + +/\x{212ab}/DZ8 +------------------------------------------------------------------ + Bra + \x{212ab} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{f0} +Need char = \x{ab} + +/-- This one is here not because it's different to Perl, but because the way +the captured single-byte is displayed. (In Perl it becomes a character, and you +can't tell the difference.) --/ + +/X(\C)(.*)/8 + X\x{1234} + 0: X\x{1234} + 1: \x{e1} + 2: \x{88}\x{b4} + X\nabc + 0: X\x{0a}abc + 1: \x{0a} + 2: abc + +/-- This one is here because Perl gives out a grumbly error message (quite +correctly, but that messes up comparisons). --/ + +/a\Cb/8 + *** Failers +No match + a\x{100}b +No match + +/[^ab\xC0-\xF0]/8SDZ +------------------------------------------------------------------ + Bra + [\x00-`c-\xbf\xf1-\xff] (neg) + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +No first char +No need char +Subject length lower bound = 1 +Starting chars: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \x0a + \x0b \x0c \x0d \x0e \x0f \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 + \x1a \x1b \x1c \x1d \x1e \x1f \x20 ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 + 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y + Z [ \ ] ^ _ ` c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ \x7f + \xc2 \xc3 \xc4 \xc5 \xc6 \xc7 \xc8 \xc9 \xca \xcb \xcc \xcd \xce \xcf \xd0 + \xd1 \xd2 \xd3 \xd4 \xd5 \xd6 \xd7 \xd8 \xd9 \xda \xdb \xdc \xdd \xde \xdf + \xe0 \xe1 \xe2 \xe3 \xe4 \xe5 \xe6 \xe7 \xe8 \xe9 \xea \xeb \xec \xed \xee + \xef \xf0 \xf1 \xf2 \xf3 \xf4 \xf5 \xf6 \xf7 \xf8 \xf9 \xfa \xfb \xfc \xfd + \xfe \xff + \x{f1} + 0: \x{f1} + \x{bf} + 0: \x{bf} + \x{100} + 0: \x{100} + \x{1000} + 0: \x{1000} + *** Failers + 0: * + \x{c0} +No match + \x{f0} +No match + +/Ä€{3,4}/8SDZ +------------------------------------------------------------------ + Bra + \x{100}{3} + \x{100}?+ + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{c4} +Need char = \x{80} +Subject length lower bound = 3 +No starting char list + \x{100}\x{100}\x{100}\x{100\x{100} + 0: \x{100}\x{100}\x{100} + +/(\x{100}+|x)/8SDZ +------------------------------------------------------------------ + Bra + CBra 1 + \x{100}++ + Alt + x + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Options: utf +No first char +No need char +Subject length lower bound = 1 +Starting chars: x \xc4 + +/(\x{100}*a|x)/8SDZ +------------------------------------------------------------------ + Bra + CBra 1 + \x{100}*+ + a + Alt + x + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Options: utf +No first char +No need char +Subject length lower bound = 1 +Starting chars: a x \xc4 + +/(\x{100}{0,2}a|x)/8SDZ +------------------------------------------------------------------ + Bra + CBra 1 + \x{100}{0,2}+ + a + Alt + x + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Options: utf +No first char +No need char +Subject length lower bound = 1 +Starting chars: a x \xc4 + +/(\x{100}{1,2}a|x)/8SDZ +------------------------------------------------------------------ + Bra + CBra 1 + \x{100} + \x{100}{0,1}+ + a + Alt + x + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Options: utf +No first char +No need char +Subject length lower bound = 1 +Starting chars: x \xc4 + +/\x{100}/8DZ +------------------------------------------------------------------ + Bra + \x{100} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{c4} +Need char = \x{80} + +/a\x{100}\x{101}*/8DZ +------------------------------------------------------------------ + Bra + a\x{100} + \x{101}*+ + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = 'a' +Need char = \x{80} + +/a\x{100}\x{101}+/8DZ +------------------------------------------------------------------ + Bra + a\x{100} + \x{101}++ + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = 'a' +Need char = \x{81} + +/[^\x{c4}]/DZ +------------------------------------------------------------------ + Bra + [^\x{c4}] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +No need char + +/[\x{100}]/8DZ +------------------------------------------------------------------ + Bra + \x{100} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{c4} +Need char = \x{80} + \x{100} + 0: \x{100} + Z\x{100} + 0: \x{100} + \x{100}Z + 0: \x{100} + *** Failers +No match + +/[\xff]/DZ8 +------------------------------------------------------------------ + Bra + \x{ff} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{c3} +Need char = \x{bf} + >\x{ff}< + 0: \x{ff} + +/[^\xff]/8DZ +------------------------------------------------------------------ + Bra + [^\x{ff}] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +No first char +No need char + +/\x{100}abc(xyz(?1))/8DZ +------------------------------------------------------------------ + Bra + \x{100}abc + CBra 1 + xyz + Recurse + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Options: utf +First char = \x{c4} +Need char = 'z' + +/a\x{1234}b/P8 + a\x{1234}b + 0: a\x{1234}b + +/\777/8I +Capturing subpattern count = 0 +Options: utf +First char = \x{c7} +Need char = \x{bf} + \x{1ff} + 0: \x{1ff} + \777 + 0: \x{1ff} + +/\x{100}+\x{200}/8DZ +------------------------------------------------------------------ + Bra + \x{100}++ + \x{200} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{c4} +Need char = \x{80} + +/\x{100}+X/8DZ +------------------------------------------------------------------ + Bra + \x{100}++ + X + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{c4} +Need char = 'X' + +/^[\QÄ€\E-\QÅ\E/BZ8 +Failed: missing terminating ] for character class at offset 15 + +/-- This tests the stricter UTF-8 check according to RFC 3629. --/ + +/X/8 + \x{d800} +Error -10 (bad UTF-8 string) offset=0 reason=14 + \x{d800}\? +No match + \x{da00} +Error -10 (bad UTF-8 string) offset=0 reason=14 + \x{da00}\? +No match + \x{dfff} +Error -10 (bad UTF-8 string) offset=0 reason=14 + \x{dfff}\? +No match + \x{110000} +Error -10 (bad UTF-8 string) offset=0 reason=13 + \x{110000}\? +No match + \x{2000000} +Error -10 (bad UTF-8 string) offset=0 reason=11 + \x{2000000}\? +No match + \x{7fffffff} +Error -10 (bad UTF-8 string) offset=0 reason=12 + \x{7fffffff}\? +No match + +/(*UTF8)\x{1234}/ + abcd\x{1234}pqr + 0: \x{1234} + +/(*CRLF)(*UTF)(*BSR_UNICODE)a\Rb/I +Capturing subpattern count = 0 +Options: bsr_unicode utf +Forced newline sequence: CRLF +First char = 'a' +Need char = 'b' + +/\h/SI8 +Capturing subpattern count = 0 +Options: utf +No first char +No need char +Subject length lower bound = 1 +Starting chars: \x09 \x20 \xc2 \xe1 \xe2 \xe3 + ABC\x{09} + 0: \x{09} + ABC\x{20} + 0: + ABC\x{a0} + 0: \x{a0} + ABC\x{1680} + 0: \x{1680} + ABC\x{180e} + 0: \x{180e} + ABC\x{2000} + 0: \x{2000} + ABC\x{202f} + 0: \x{202f} + ABC\x{205f} + 0: \x{205f} + ABC\x{3000} + 0: \x{3000} + +/\v/SI8 +Capturing subpattern count = 0 +Options: utf +No first char +No need char +Subject length lower bound = 1 +Starting chars: \x0a \x0b \x0c \x0d \xc2 \xe2 + ABC\x{0a} + 0: \x{0a} + ABC\x{0b} + 0: \x{0b} + ABC\x{0c} + 0: \x{0c} + ABC\x{0d} + 0: \x{0d} + ABC\x{85} + 0: \x{85} + ABC\x{2028} + 0: \x{2028} + +/\h*A/SI8 +Capturing subpattern count = 0 +Options: utf +No first char +Need char = 'A' +Subject length lower bound = 1 +Starting chars: \x09 \x20 A \xc2 \xe1 \xe2 \xe3 + CDBABC + 0: A + +/\v+A/SI8 +Capturing subpattern count = 0 +Options: utf +No first char +Need char = 'A' +Subject length lower bound = 2 +Starting chars: \x0a \x0b \x0c \x0d \xc2 \xe2 + +/\s?xxx\s/8SI +Capturing subpattern count = 0 +Options: utf +No first char +Need char = 'x' +Subject length lower bound = 4 +Starting chars: \x09 \x0a \x0b \x0c \x0d \x20 x + +/\sxxx\s/I8ST1 +Capturing subpattern count = 0 +Options: utf +No first char +Need char = 'x' +Subject length lower bound = 5 +Starting chars: \x09 \x0a \x0b \x0c \x0d \x20 \xc2 + AB\x{85}xxx\x{a0}XYZ + 0: \x{85}xxx\x{a0} + AB\x{a0}xxx\x{85}XYZ + 0: \x{a0}xxx\x{85} + +/\S \S/I8ST1 +Capturing subpattern count = 0 +Options: utf +No first char +Need char = ' ' +Subject length lower bound = 3 +Starting chars: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x0e \x0f + \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1a \x1b \x1c \x1d \x1e + \x1f ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C + D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h + i j k l m n o p q r s t u v w x y z { | } ~ \x7f \xc0 \xc1 \xc2 \xc3 \xc4 + \xc5 \xc6 \xc7 \xc8 \xc9 \xca \xcb \xcc \xcd \xce \xcf \xd0 \xd1 \xd2 \xd3 + \xd4 \xd5 \xd6 \xd7 \xd8 \xd9 \xda \xdb \xdc \xdd \xde \xdf \xe0 \xe1 \xe2 + \xe3 \xe4 \xe5 \xe6 \xe7 \xe8 \xe9 \xea \xeb \xec \xed \xee \xef \xf0 \xf1 + \xf2 \xf3 \xf4 \xf5 \xf6 \xf7 \xf8 \xf9 \xfa \xfb \xfc \xfd \xfe \xff + \x{a2} \x{84} + 0: \x{a2} \x{84} + A Z + 0: A Z + +/a+/8 + a\x{123}aa\>1 + 0: aa + a\x{123}aa\>2 +Error -11 (bad UTF-8 offset) + a\x{123}aa\>3 + 0: aa + a\x{123}aa\>4 + 0: a + a\x{123}aa\>5 +No match + a\x{123}aa\>6 +Error -24 (bad offset value) + +/\x{1234}+/iS8I +Capturing subpattern count = 0 +Options: caseless utf +No first char +No need char +Subject length lower bound = 1 +Starting chars: \xe1 + +/\x{1234}+?/iS8I +Capturing subpattern count = 0 +Options: caseless utf +No first char +No need char +Subject length lower bound = 1 +Starting chars: \xe1 + +/\x{1234}++/iS8I +Capturing subpattern count = 0 +Options: caseless utf +No first char +No need char +Subject length lower bound = 1 +Starting chars: \xe1 + +/\x{1234}{2}/iS8I +Capturing subpattern count = 0 +Options: caseless utf +No first char +No need char +Subject length lower bound = 2 +Starting chars: \xe1 + +/[^\x{c4}]/8DZ +------------------------------------------------------------------ + Bra + [^\x{c4}] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +No first char +No need char + +/X+\x{200}/8DZ +------------------------------------------------------------------ + Bra + X++ + \x{200} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = 'X' +Need char = \x{80} + +/\R/SI8 +Capturing subpattern count = 0 +Options: utf +No first char +No need char +Subject length lower bound = 1 +Starting chars: \x0a \x0b \x0c \x0d \xc2 \xe2 + +/\777/8DZ +------------------------------------------------------------------ + Bra + \x{1ff} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{c7} +Need char = \x{bf} + +/\w+\x{C4}/8BZ +------------------------------------------------------------------ + Bra + \w++ + \x{c4} + Ket + End +------------------------------------------------------------------ + a\x{C4}\x{C4} + 0: a\x{c4} + +/\w+\x{C4}/8BZT1 +------------------------------------------------------------------ + Bra + \w+ + \x{c4} + Ket + End +------------------------------------------------------------------ + a\x{C4}\x{C4} + 0: a\x{c4}\x{c4} + +/\W+\x{C4}/8BZ +------------------------------------------------------------------ + Bra + \W+ + \x{c4} + Ket + End +------------------------------------------------------------------ + !\x{C4} + 0: !\x{c4} + +/\W+\x{C4}/8BZT1 +------------------------------------------------------------------ + Bra + \W++ + \x{c4} + Ket + End +------------------------------------------------------------------ + !\x{C4} + 0: !\x{c4} + +/\W+\x{A1}/8BZ +------------------------------------------------------------------ + Bra + \W+ + \x{a1} + Ket + End +------------------------------------------------------------------ + !\x{A1} + 0: !\x{a1} + +/\W+\x{A1}/8BZT1 +------------------------------------------------------------------ + Bra + \W+ + \x{a1} + Ket + End +------------------------------------------------------------------ + !\x{A1} + 0: !\x{a1} + +/X\s+\x{A0}/8BZ +------------------------------------------------------------------ + Bra + X + \s++ + \x{a0} + Ket + End +------------------------------------------------------------------ + X\x20\x{A0}\x{A0} + 0: X \x{a0} + +/X\s+\x{A0}/8BZT1 +------------------------------------------------------------------ + Bra + X + \s+ + \x{a0} + Ket + End +------------------------------------------------------------------ + X\x20\x{A0}\x{A0} + 0: X \x{a0}\x{a0} + +/\S+\x{A0}/8BZ +------------------------------------------------------------------ + Bra + \S+ + \x{a0} + Ket + End +------------------------------------------------------------------ + X\x{A0}\x{A0} + 0: X\x{a0}\x{a0} + +/\S+\x{A0}/8BZT1 +------------------------------------------------------------------ + Bra + \S++ + \x{a0} + Ket + End +------------------------------------------------------------------ + X\x{A0}\x{A0} + 0: X\x{a0} + +/\x{a0}+\s!/8BZ +------------------------------------------------------------------ + Bra + \x{a0}++ + \s + ! + Ket + End +------------------------------------------------------------------ + \x{a0}\x20! + 0: \x{a0} ! + +/\x{a0}+\s!/8BZT1 +------------------------------------------------------------------ + Bra + \x{a0}+ + \s + ! + Ket + End +------------------------------------------------------------------ + \x{a0}\x20! + 0: \x{a0} ! + +/A/8 + \x{ff000041} +** Character \x{ff000041} is greater than 0x7fffffff and so cannot be converted to UTF-8 + \x{7f000041} +Error -10 (bad UTF-8 string) offset=0 reason=12 + +/(*UTF8)abc/9 +Failed: setting UTF is disabled by the application at offset 0 + +/abc/89 +Failed: setting UTF is disabled by the application at offset 0 + +//8+L + \xf1\xad\xae\xae + 0: + 0+ \x{6dbae} + +/-- End of testinput15 --/ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput16 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput16 new file mode 100755 index 000000000..e6ba26acf --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput16 @@ -0,0 +1,193 @@ +/-- This set of tests is run only with the 8-bit library when Unicode property + support is available. It starts with tests of the POSIX interface, because + that is supported only with the 8-bit library. --/ + +/\w/P + +++\x{c2} +No match: POSIX code 17: match failed + +/\w/WP + +++\x{c2} + 0: \xc2 + +/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8iDZ +------------------------------------------------------------------ + Bra + /i A\x{391}\x{10427}\x{ff3a}\x{1fb0} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: caseless utf +First char = 'A' (caseless) +No need char + +/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8DZ +------------------------------------------------------------------ + Bra + A\x{391}\x{10427}\x{ff3a}\x{1fb0} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = 'A' +Need char = \x{b0} + +/AB\x{1fb0}/8DZ +------------------------------------------------------------------ + Bra + AB\x{1fb0} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = 'A' +Need char = \x{b0} + +/AB\x{1fb0}/8DZi +------------------------------------------------------------------ + Bra + /i AB\x{1fb0} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: caseless utf +First char = 'A' (caseless) +Need char = 'B' (caseless) + +/\x{401}\x{420}\x{421}\x{422}\x{423}\x{424}\x{425}\x{426}\x{427}\x{428}\x{429}\x{42a}\x{42b}\x{42c}\x{42d}\x{42e}\x{42f}/8iSI +Capturing subpattern count = 0 +Options: caseless utf +No first char +No need char +Subject length lower bound = 17 +Starting chars: \xd0 \xd1 + \x{401}\x{420}\x{421}\x{422}\x{423}\x{424}\x{425}\x{426}\x{427}\x{428}\x{429}\x{42a}\x{42b}\x{42c}\x{42d}\x{42e}\x{42f} + 0: \x{401}\x{420}\x{421}\x{422}\x{423}\x{424}\x{425}\x{426}\x{427}\x{428}\x{429}\x{42a}\x{42b}\x{42c}\x{42d}\x{42e}\x{42f} + \x{451}\x{440}\x{441}\x{442}\x{443}\x{444}\x{445}\x{446}\x{447}\x{448}\x{449}\x{44a}\x{44b}\x{44c}\x{44d}\x{44e}\x{44f} + 0: \x{451}\x{440}\x{441}\x{442}\x{443}\x{444}\x{445}\x{446}\x{447}\x{448}\x{449}\x{44a}\x{44b}\x{44c}\x{44d}\x{44e}\x{44f} + +/[â±¥]/8iBZ +------------------------------------------------------------------ + Bra + /i \x{2c65} + Ket + End +------------------------------------------------------------------ + +/[^â±¥]/8iBZ +------------------------------------------------------------------ + Bra + /i [^\x{2c65}] + Ket + End +------------------------------------------------------------------ + +/\h/SI +Capturing subpattern count = 0 +No options +No first char +No need char +Subject length lower bound = 1 +Starting chars: \x09 \x20 \xa0 + +/\v/SI +Capturing subpattern count = 0 +No options +No first char +No need char +Subject length lower bound = 1 +Starting chars: \x0a \x0b \x0c \x0d \x85 + +/\R/SI +Capturing subpattern count = 0 +No options +No first char +No need char +Subject length lower bound = 1 +Starting chars: \x0a \x0b \x0c \x0d \x85 + +/[[:blank:]]/WBZ +------------------------------------------------------------------ + Bra + [\x09 \xa0] + Ket + End +------------------------------------------------------------------ + +/\x{212a}+/i8SI +Capturing subpattern count = 0 +Options: caseless utf +No first char +No need char +Subject length lower bound = 1 +Starting chars: K k \xe2 + KKkk\x{212a} + 0: KKkk\x{212a} + +/s+/i8SI +Capturing subpattern count = 0 +Options: caseless utf +No first char +No need char +Subject length lower bound = 1 +Starting chars: S s \xc5 + SSss\x{17f} + 0: SSss\x{17f} + +/[\W\p{Any}]/BZ +------------------------------------------------------------------ + Bra + [\x00-/:-@[-^`{-\xff\p{Any}] + Ket + End +------------------------------------------------------------------ + abc + 0: a + 123 + 0: 1 + +/[\W\pL]/BZ +------------------------------------------------------------------ + Bra + [\x00-/:-@[-^`{-\xff\p{L}] + Ket + End +------------------------------------------------------------------ + abc + 0: a + ** Failers + 0: * + 123 +No match + +/[\D]/8 + \x{1d7cf} + 0: \x{1d7cf} + +/[\D\P{Nd}]/8 + \x{1d7cf} + 0: \x{1d7cf} + +/[^\D]/8 + a9b + 0: 9 + ** Failers +No match + \x{1d7cf} +No match + +/[^\D\P{Nd}]/8 + a9b + 0: 9 + \x{1d7cf} + 0: \x{1d7cf} + ** Failers +No match + \x{10000} +No match + +/-- End of testinput16 --/ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput17 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput17 new file mode 100755 index 000000000..9ef6c7279 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput17 @@ -0,0 +1,560 @@ +/-- This set of tests is for the 16- and 32-bit library's basic (non-UTF-16 + or -32) features that are not compatible with the 8-bit library, or which + give different output in 16- or 32-bit mode. --/ + +< forbid 8W + +/a\Cb/ + aXb + 0: aXb + a\nb + 0: a\x0ab + +/[^\x{c4}]/DZ +------------------------------------------------------------------ + Bra + [^\x{c4}] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +No need char + +/\x{100}/I +Capturing subpattern count = 0 +No options +First char = \x{100} +No need char + +/ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # optional leading comment +(?: (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # initial word +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) )* # further okay, if led by a period +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] | # atom and space parts, or... +\( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) | # comments, or... + +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +# quoted strings +)* +< (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # leading < +(?: @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* + +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* , (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* )? # optional route +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # initial word +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) )* # further okay, if led by a period +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +# address spec +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* > # trailing > +# name and address +) (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # optional trailing comment +/xSI +Capturing subpattern count = 0 +Contains explicit CR or LF match +Options: extended +No first char +No need char +Subject length lower bound = 3 +Starting chars: \x09 \x20 ! " # $ % & ' ( * + - / 0 1 2 3 4 5 6 7 8 + 9 = ? A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ^ _ ` a b c d e + f g h i j k l m n o p q r s t u v w x y z { | } ~ \x7f \xff + +/[\h]/BZ +------------------------------------------------------------------ + Bra + [\x09 \xa0\x{1680}\x{180e}\x{2000}-\x{200a}\x{202f}\x{205f}\x{3000}] + Ket + End +------------------------------------------------------------------ + >\x09< + 0: \x09 + +/[\h]+/BZ +------------------------------------------------------------------ + Bra + [\x09 \xa0\x{1680}\x{180e}\x{2000}-\x{200a}\x{202f}\x{205f}\x{3000}]++ + Ket + End +------------------------------------------------------------------ + >\x09\x20\xa0< + 0: \x09 \xa0 + +/[\v]/BZ +------------------------------------------------------------------ + Bra + [\x0a-\x0d\x85\x{2028}-\x{2029}] + Ket + End +------------------------------------------------------------------ + +/[^\h]/BZ +------------------------------------------------------------------ + Bra + [^\x09 \xa0\x{1680}\x{180e}\x{2000}-\x{200a}\x{202f}\x{205f}\x{3000}] + Ket + End +------------------------------------------------------------------ + +/\h+/SI +Capturing subpattern count = 0 +No options +No first char +No need char +Subject length lower bound = 1 +Starting chars: \x09 \x20 \xa0 \xff + \x{1681}\x{200b}\x{1680}\x{2000}\x{202f}\x{3000} + 0: \x{1680}\x{2000}\x{202f}\x{3000} + \x{3001}\x{2fff}\x{200a}\xa0\x{2000} + 0: \x{200a}\xa0\x{2000} + +/[\h\x{dc00}]+/BZSI +------------------------------------------------------------------ + Bra + [\x09 \xa0\x{1680}\x{180e}\x{2000}-\x{200a}\x{202f}\x{205f}\x{3000}\x{dc00}]++ + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +No need char +Subject length lower bound = 1 +Starting chars: \x09 \x20 \xa0 \xff + \x{1681}\x{200b}\x{1680}\x{2000}\x{202f}\x{3000} + 0: \x{1680}\x{2000}\x{202f}\x{3000} + \x{3001}\x{2fff}\x{200a}\xa0\x{2000} + 0: \x{200a}\xa0\x{2000} + +/\H+/SI +Capturing subpattern count = 0 +No options +No first char +No need char +Subject length lower bound = 1 +No starting char list + \x{1680}\x{180e}\x{167f}\x{1681}\x{180d}\x{180f} + 0: \x{167f}\x{1681}\x{180d}\x{180f} + \x{2000}\x{200a}\x{1fff}\x{200b} + 0: \x{1fff}\x{200b} + \x{202f}\x{205f}\x{202e}\x{2030}\x{205e}\x{2060} + 0: \x{202e}\x{2030}\x{205e}\x{2060} + \xa0\x{3000}\x9f\xa1\x{2fff}\x{3001} + 0: \x9f\xa1\x{2fff}\x{3001} + +/[\H\x{d800}]+/ + \x{1680}\x{180e}\x{167f}\x{1681}\x{180d}\x{180f} + 0: \x{167f}\x{1681}\x{180d}\x{180f} + \x{2000}\x{200a}\x{1fff}\x{200b} + 0: \x{1fff}\x{200b} + \x{202f}\x{205f}\x{202e}\x{2030}\x{205e}\x{2060} + 0: \x{202e}\x{2030}\x{205e}\x{2060} + \xa0\x{3000}\x9f\xa1\x{2fff}\x{3001} + 0: \x9f\xa1\x{2fff}\x{3001} + +/\v+/SI +Capturing subpattern count = 0 +No options +No first char +No need char +Subject length lower bound = 1 +Starting chars: \x0a \x0b \x0c \x0d \x85 \xff + \x{2027}\x{2030}\x{2028}\x{2029} + 0: \x{2028}\x{2029} + \x09\x0e\x84\x86\x85\x0a\x0b\x0c\x0d + 0: \x85\x0a\x0b\x0c\x0d + +/[\v\x{dc00}]+/BZSI +------------------------------------------------------------------ + Bra + [\x0a-\x0d\x85\x{2028}-\x{2029}\x{dc00}]++ + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +No need char +Subject length lower bound = 1 +Starting chars: \x0a \x0b \x0c \x0d \x85 \xff + \x{2027}\x{2030}\x{2028}\x{2029} + 0: \x{2028}\x{2029} + \x09\x0e\x84\x86\x85\x0a\x0b\x0c\x0d + 0: \x85\x0a\x0b\x0c\x0d + +/\V+/SI +Capturing subpattern count = 0 +No options +No first char +No need char +Subject length lower bound = 1 +No starting char list + \x{2028}\x{2029}\x{2027}\x{2030} + 0: \x{2027}\x{2030} + \x85\x0a\x0b\x0c\x0d\x09\x0e\x84\x86 + 0: \x09\x0e\x84\x86 + +/[\V\x{d800}]+/ + \x{2028}\x{2029}\x{2027}\x{2030} + 0: \x{2027}\x{2030} + \x85\x0a\x0b\x0c\x0d\x09\x0e\x84\x86 + 0: \x09\x0e\x84\x86 + +/\R+/SI +Capturing subpattern count = 0 +Options: bsr_unicode +No first char +No need char +Subject length lower bound = 1 +Starting chars: \x0a \x0b \x0c \x0d \x85 \xff + \x{2027}\x{2030}\x{2028}\x{2029} + 0: \x{2028}\x{2029} + \x09\x0e\x84\x86\x85\x0a\x0b\x0c\x0d + 0: \x85\x0a\x0b\x0c\x0d + +/\x{d800}\x{d7ff}\x{dc00}\x{dc00}\x{dcff}\x{dd00}/I +Capturing subpattern count = 0 +No options +First char = \x{d800} +Need char = \x{dd00} + \x{d800}\x{d7ff}\x{dc00}\x{dc00}\x{dcff}\x{dd00} + 0: \x{d800}\x{d7ff}\x{dc00}\x{dc00}\x{dcff}\x{dd00} + +/[^\x{80}][^\x{ff}][^\x{100}][^\x{1000}][^\x{ffff}]/BZ +------------------------------------------------------------------ + Bra + [^\x80] + [^\x{ff}] + [^\x{100}] + [^\x{1000}] + [^\x{ffff}] + Ket + End +------------------------------------------------------------------ + +/[^\x{80}][^\x{ff}][^\x{100}][^\x{1000}][^\x{ffff}]/BZi +------------------------------------------------------------------ + Bra + /i [^\x80] + /i [^\x{ff}] + /i [^\x{100}] + /i [^\x{1000}] + /i [^\x{ffff}] + Ket + End +------------------------------------------------------------------ + +/[^\x{100}]*[^\x{1000}]+[^\x{ffff}]??[^\x{8000}]{4,}[^\x{7fff}]{2,9}?[^\x{100}]{5,6}+/BZ +------------------------------------------------------------------ + Bra + [^\x{100}]* + [^\x{1000}]+ + [^\x{ffff}]?? + [^\x{8000}]{4} + [^\x{8000}]* + [^\x{7fff}]{2} + [^\x{7fff}]{0,7}? + [^\x{100}]{5} + [^\x{100}]?+ + Ket + End +------------------------------------------------------------------ + +/[^\x{100}]*[^\x{1000}]+[^\x{ffff}]??[^\x{8000}]{4,}[^\x{7fff}]{2,9}?[^\x{100}]{5,6}+/BZi +------------------------------------------------------------------ + Bra + /i [^\x{100}]* + /i [^\x{1000}]+ + /i [^\x{ffff}]?? + /i [^\x{8000}]{4} + /i [^\x{8000}]* + /i [^\x{7fff}]{2} + /i [^\x{7fff}]{0,7}? + /i [^\x{100}]{5} + /i [^\x{100}]?+ + Ket + End +------------------------------------------------------------------ + +/(*:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF)XX/K + XX + 0: XX +MK: 0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF + +/(*:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDE)XX/K + XX + 0: XX +MK: 0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDE + +/\u0100/BZ +------------------------------------------------------------------ + Bra + \x{100} + Ket + End +------------------------------------------------------------------ + +/[\u0100-\u0200]/BZ +------------------------------------------------------------------ + Bra + [\x{100}-\x{200}] + Ket + End +------------------------------------------------------------------ + +/\ud800/BZ +------------------------------------------------------------------ + Bra + \x{d800} + Ket + End +------------------------------------------------------------------ + +/^\x{ffff}+/i + \x{ffff} + 0: \x{ffff} + +/^\x{ffff}?/i + \x{ffff} + 0: \x{ffff} + +/^\x{ffff}*/i + \x{ffff} + 0: \x{ffff} + +/^\x{ffff}{3}/i + \x{ffff}\x{ffff}\x{ffff} + 0: \x{ffff}\x{ffff}\x{ffff} + +/^\x{ffff}{0,3}/i + \x{ffff} + 0: \x{ffff} + +/[^\x00-a]{12,}[^b-\xff]*/BZ +------------------------------------------------------------------ + Bra + [b-\xff] (neg){12,} + [\x00-a] (neg)*+ + Ket + End +------------------------------------------------------------------ + +/[^\s]*\s* [^\W]+\W+ [^\d]*?\d0 [^\d\w]{4,6}?\w*A/BZ +------------------------------------------------------------------ + Bra + [\x00-\x08\x0e-\x1f!-\xff] (neg)* + \s* + + [0-9A-Z_a-z]++ + \W+ + + [\x00-/:-\xff] (neg)*? + \d + 0 + [\x00-/:-@[-^`{-\xff] (neg){4,6}? + \w* + A + Ket + End +------------------------------------------------------------------ + +/a*[b-\x{200}]?a#a*[b-\x{200}]?b#[a-f]*[g-\x{200}]*#[g-\x{200}]*[a-c]*#[g-\x{200}]*[a-h]*/BZ +------------------------------------------------------------------ + Bra + a* + [b-\xff\x{100}-\x{200}]?+ + a# + a*+ + [b-\xff\x{100}-\x{200}]? + b# + [a-f]*+ + [g-\xff\x{100}-\x{200}]*+ + # + [g-\xff\x{100}-\x{200}]*+ + [a-c]*+ + # + [g-\xff\x{100}-\x{200}]* + [a-h]*+ + Ket + End +------------------------------------------------------------------ + +/^[\x{1234}\x{4321}]{2,4}?/ + \x{1234}\x{1234}\x{1234} + 0: \x{1234}\x{1234} + +/(*THEN:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA)/ + +/-- End of testinput17 --/ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput18-16 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput18-16 new file mode 100755 index 000000000..1ef87047d --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput18-16 @@ -0,0 +1,1026 @@ +/-- This set of tests is for UTF-16 and UTF-32 support, and is relevant only to + the 16- and 32-bit libraries. --/ + +< forbid W + +/ÃÃÃxxx/8?DZSS +**Failed: invalid UTF-8 string cannot be converted to UTF-16 + +/abc/8 + Ã] +**Failed: invalid UTF-8 string cannot be used as input in UTF mode + +/X(\C{3})/8 + X\x{11234}Y + 0: X\x{11234}Y + 1: \x{11234}Y + X\x{11234}YZ + 0: X\x{11234}Y + 1: \x{11234}Y + +/X(\C{4})/8 + X\x{11234}YZ + 0: X\x{11234}YZ + 1: \x{11234}YZ + X\x{11234}YZW + 0: X\x{11234}YZ + 1: \x{11234}YZ + +/X\C*/8 + XYZabcdce + 0: XYZabcdce + +/X\C*?/8 + XYZabcde + 0: X + +/X\C{3,5}/8 + Xabcdefg + 0: Xabcde + X\x{11234}Y + 0: X\x{11234}Y + X\x{11234}YZ + 0: X\x{11234}YZ + X\x{11234}\x{512} + 0: X\x{11234}\x{512} + X\x{11234}\x{512}YZ + 0: X\x{11234}\x{512}YZ + X\x{11234}\x{512}\x{11234}Z + 0: X\x{11234}\x{512}\x{11234} + +/X\C{3,5}?/8 + Xabcdefg + 0: Xabc + X\x{11234}Y + 0: X\x{11234}Y + X\x{11234}YZ + 0: X\x{11234}Y + X\x{11234}\x{512}YZ + 0: X\x{11234}\x{512} + *** Failers +No match + X\x{11234} +No match + +/a\Cb/8 + aXb + 0: aXb + a\nb + 0: a\x{0a}b + +/a\C\Cb/8 + a\x{12257}b + 0: a\x{12257}b + a\x{12257}\x{11234}b +No match + ** Failers +No match + a\x{100}b +No match + +/ab\Cde/8 + abXde + 0: abXde + +/-- Check maximum character size --/ + +/\x{ffff}/8DZ +------------------------------------------------------------------ + Bra + \x{ffff} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{ffff} +No need char + +/\x{10000}/8DZ +------------------------------------------------------------------ + Bra + \x{10000} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{d800} +Need char = \x{dc00} + +/\x{100}/8DZ +------------------------------------------------------------------ + Bra + \x{100} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{100} +No need char + +/\x{1000}/8DZ +------------------------------------------------------------------ + Bra + \x{1000} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{1000} +No need char + +/\x{10000}/8DZ +------------------------------------------------------------------ + Bra + \x{10000} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{d800} +Need char = \x{dc00} + +/\x{100000}/8DZ +------------------------------------------------------------------ + Bra + \x{100000} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{dbc0} +Need char = \x{dc00} + +/\x{10ffff}/8DZ +------------------------------------------------------------------ + Bra + \x{10ffff} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{dbff} +Need char = \x{dfff} + +/[\x{ff}]/8DZ +------------------------------------------------------------------ + Bra + \x{ff} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{ff} +No need char + +/[\x{100}]/8DZ +------------------------------------------------------------------ + Bra + \x{100} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{100} +No need char + +/\x80/8DZ +------------------------------------------------------------------ + Bra + \x80 + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{80} +No need char + +/\xff/8DZ +------------------------------------------------------------------ + Bra + \x{ff} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{ff} +No need char + +/\x{D55c}\x{ad6d}\x{C5B4}/DZ8 +------------------------------------------------------------------ + Bra + \x{d55c}\x{ad6d}\x{c5b4} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{d55c} +Need char = \x{c5b4} + \x{D55c}\x{ad6d}\x{C5B4} + 0: \x{d55c}\x{ad6d}\x{c5b4} + +/\x{65e5}\x{672c}\x{8a9e}/DZ8 +------------------------------------------------------------------ + Bra + \x{65e5}\x{672c}\x{8a9e} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{65e5} +Need char = \x{8a9e} + \x{65e5}\x{672c}\x{8a9e} + 0: \x{65e5}\x{672c}\x{8a9e} + +/\x{80}/DZ8 +------------------------------------------------------------------ + Bra + \x80 + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{80} +No need char + +/\x{084}/DZ8 +------------------------------------------------------------------ + Bra + \x{84} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{84} +No need char + +/\x{104}/DZ8 +------------------------------------------------------------------ + Bra + \x{104} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{104} +No need char + +/\x{861}/DZ8 +------------------------------------------------------------------ + Bra + \x{861} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{861} +No need char + +/\x{212ab}/DZ8 +------------------------------------------------------------------ + Bra + \x{212ab} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{d844} +Need char = \x{deab} + +/-- This one is here not because it's different to Perl, but because the way +the captured single-byte is displayed. (In Perl it becomes a character, and you +can't tell the difference.) --/ + +/X(\C)(.*)/8 + X\x{1234} + 0: X\x{1234} + 1: \x{1234} + 2: + X\nabc + 0: X\x{0a}abc + 1: \x{0a} + 2: abc + +/-- This one is here because Perl gives out a grumbly error message (quite +correctly, but that messes up comparisons). --/ + +/a\Cb/8 + *** Failers +No match + a\x{100}b + 0: a\x{100}b + +/[^ab\xC0-\xF0]/8SDZ +------------------------------------------------------------------ + Bra + [\x00-`c-\xbf\xf1-\xff] (neg) + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +No first char +No need char +Subject length lower bound = 1 +Starting chars: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \x0a + \x0b \x0c \x0d \x0e \x0f \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 + \x1a \x1b \x1c \x1d \x1e \x1f \x20 ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 + 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y + Z [ \ ] ^ _ ` c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ \x7f + \x80 \x81 \x82 \x83 \x84 \x85 \x86 \x87 \x88 \x89 \x8a \x8b \x8c \x8d \x8e + \x8f \x90 \x91 \x92 \x93 \x94 \x95 \x96 \x97 \x98 \x99 \x9a \x9b \x9c \x9d + \x9e \x9f \xa0 \xa1 \xa2 \xa3 \xa4 \xa5 \xa6 \xa7 \xa8 \xa9 \xaa \xab \xac + \xad \xae \xaf \xb0 \xb1 \xb2 \xb3 \xb4 \xb5 \xb6 \xb7 \xb8 \xb9 \xba \xbb + \xbc \xbd \xbe \xbf \xf1 \xf2 \xf3 \xf4 \xf5 \xf6 \xf7 \xf8 \xf9 \xfa \xfb + \xfc \xfd \xfe \xff + \x{f1} + 0: \x{f1} + \x{bf} + 0: \x{bf} + \x{100} + 0: \x{100} + \x{1000} + 0: \x{1000} + *** Failers + 0: * + \x{c0} +No match + \x{f0} +No match + +/Ä€{3,4}/8SDZ +------------------------------------------------------------------ + Bra + \x{100}{3} + \x{100}?+ + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{100} +Need char = \x{100} +Subject length lower bound = 3 +No starting char list + \x{100}\x{100}\x{100}\x{100\x{100} + 0: \x{100}\x{100}\x{100} + +/(\x{100}+|x)/8SDZ +------------------------------------------------------------------ + Bra + CBra 1 + \x{100}++ + Alt + x + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Options: utf +No first char +No need char +Subject length lower bound = 1 +Starting chars: x \xff + +/(\x{100}*a|x)/8SDZ +------------------------------------------------------------------ + Bra + CBra 1 + \x{100}*+ + a + Alt + x + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Options: utf +No first char +No need char +Subject length lower bound = 1 +Starting chars: a x \xff + +/(\x{100}{0,2}a|x)/8SDZ +------------------------------------------------------------------ + Bra + CBra 1 + \x{100}{0,2}+ + a + Alt + x + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Options: utf +No first char +No need char +Subject length lower bound = 1 +Starting chars: a x \xff + +/(\x{100}{1,2}a|x)/8SDZ +------------------------------------------------------------------ + Bra + CBra 1 + \x{100} + \x{100}{0,1}+ + a + Alt + x + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Options: utf +No first char +No need char +Subject length lower bound = 1 +Starting chars: x \xff + +/\x{100}/8DZ +------------------------------------------------------------------ + Bra + \x{100} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{100} +No need char + +/a\x{100}\x{101}*/8DZ +------------------------------------------------------------------ + Bra + a\x{100} + \x{101}*+ + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = 'a' +Need char = \x{100} + +/a\x{100}\x{101}+/8DZ +------------------------------------------------------------------ + Bra + a\x{100} + \x{101}++ + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = 'a' +Need char = \x{101} + +/[^\x{c4}]/DZ +------------------------------------------------------------------ + Bra + [^\x{c4}] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +No need char + +/[\x{100}]/8DZ +------------------------------------------------------------------ + Bra + \x{100} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{100} +No need char + \x{100} + 0: \x{100} + Z\x{100} + 0: \x{100} + \x{100}Z + 0: \x{100} + *** Failers +No match + +/[\xff]/DZ8 +------------------------------------------------------------------ + Bra + \x{ff} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{ff} +No need char + >\x{ff}< + 0: \x{ff} + +/[^\xff]/8DZ +------------------------------------------------------------------ + Bra + [^\x{ff}] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +No first char +No need char + +/\x{100}abc(xyz(?1))/8DZ +------------------------------------------------------------------ + Bra + \x{100}abc + CBra 1 + xyz + Recurse + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Options: utf +First char = \x{100} +Need char = 'z' + +/\777/8I +Capturing subpattern count = 0 +Options: utf +First char = \x{1ff} +No need char + \x{1ff} + 0: \x{1ff} + \777 + 0: \x{1ff} + +/\x{100}+\x{200}/8DZ +------------------------------------------------------------------ + Bra + \x{100}++ + \x{200} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{100} +Need char = \x{200} + +/\x{100}+X/8DZ +------------------------------------------------------------------ + Bra + \x{100}++ + X + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{100} +Need char = 'X' + +/^[\QÄ€\E-\QÅ\E/BZ8 +Failed: missing terminating ] for character class at offset 13 + +/X/8 + \x{d800} +Error -10 (bad UTF-16 string) offset=0 reason=1 + \x{d800}\? +No match + \x{da00} +Error -10 (bad UTF-16 string) offset=0 reason=1 + \x{da00}\? +No match + \x{dc00} +Error -10 (bad UTF-16 string) offset=0 reason=3 + \x{dc00}\? +No match + \x{de00} +Error -10 (bad UTF-16 string) offset=0 reason=3 + \x{de00}\? +No match + \x{dfff} +Error -10 (bad UTF-16 string) offset=0 reason=3 + \x{dfff}\? +No match + \x{110000} +** Failed: character \x{110000} is greater than 0x10ffff and so cannot be converted to UTF-16 + \x{d800}\x{1234} +Error -10 (bad UTF-16 string) offset=1 reason=2 + +/(*UTF16)\x{11234}/ + abcd\x{11234}pqr + 0: \x{11234} + +/(*UTF)\x{11234}/I +Capturing subpattern count = 0 +Options: utf +First char = \x{d804} +Need char = \x{de34} + abcd\x{11234}pqr + 0: \x{11234} + +/(*UTF-32)\x{11234}/ +Failed: (*VERB) not recognized or malformed at offset 5 + +/(*CRLF)(*UTF16)(*BSR_UNICODE)a\Rb/I +Capturing subpattern count = 0 +Options: bsr_unicode utf +Forced newline sequence: CRLF +First char = 'a' +Need char = 'b' + +/(*CRLF)(*UTF32)(*BSR_UNICODE)a\Rb/I +Failed: (*VERB) not recognized or malformed at offset 12 + +/\h/SI8 +Capturing subpattern count = 0 +Options: utf +No first char +No need char +Subject length lower bound = 1 +Starting chars: \x09 \x20 \xa0 \xff + ABC\x{09} + 0: \x{09} + ABC\x{20} + 0: + ABC\x{a0} + 0: \x{a0} + ABC\x{1680} + 0: \x{1680} + ABC\x{180e} + 0: \x{180e} + ABC\x{2000} + 0: \x{2000} + ABC\x{202f} + 0: \x{202f} + ABC\x{205f} + 0: \x{205f} + ABC\x{3000} + 0: \x{3000} + +/\v/SI8 +Capturing subpattern count = 0 +Options: utf +No first char +No need char +Subject length lower bound = 1 +Starting chars: \x0a \x0b \x0c \x0d \x85 \xff + ABC\x{0a} + 0: \x{0a} + ABC\x{0b} + 0: \x{0b} + ABC\x{0c} + 0: \x{0c} + ABC\x{0d} + 0: \x{0d} + ABC\x{85} + 0: \x{85} + ABC\x{2028} + 0: \x{2028} + +/\h*A/SI8 +Capturing subpattern count = 0 +Options: utf +No first char +Need char = 'A' +Subject length lower bound = 1 +Starting chars: \x09 \x20 A \xa0 \xff + CDBABC + 0: A + \x{2000}ABC + 0: \x{2000}A + +/\R*A/SI8 +Capturing subpattern count = 0 +Options: bsr_unicode utf +No first char +Need char = 'A' +Subject length lower bound = 1 +Starting chars: \x0a \x0b \x0c \x0d A \x85 \xff + CDBABC + 0: A + \x{2028}A + 0: \x{2028}A + +/\v+A/SI8 +Capturing subpattern count = 0 +Options: utf +No first char +Need char = 'A' +Subject length lower bound = 2 +Starting chars: \x0a \x0b \x0c \x0d \x85 \xff + +/\s?xxx\s/8SI +Capturing subpattern count = 0 +Options: utf +No first char +Need char = 'x' +Subject length lower bound = 4 +Starting chars: \x09 \x0a \x0b \x0c \x0d \x20 x + +/\sxxx\s/I8ST1 +Capturing subpattern count = 0 +Options: utf +No first char +Need char = 'x' +Subject length lower bound = 5 +Starting chars: \x09 \x0a \x0b \x0c \x0d \x20 \x85 \xa0 + AB\x{85}xxx\x{a0}XYZ + 0: \x{85}xxx\x{a0} + AB\x{a0}xxx\x{85}XYZ + 0: \x{a0}xxx\x{85} + +/\S \S/I8ST1 +Capturing subpattern count = 0 +Options: utf +No first char +Need char = ' ' +Subject length lower bound = 3 +Starting chars: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x0e \x0f + \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1a \x1b \x1c \x1d \x1e + \x1f ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C + D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h + i j k l m n o p q r s t u v w x y z { | } ~ \x7f \x80 \x81 \x82 \x83 \x84 + \x86 \x87 \x88 \x89 \x8a \x8b \x8c \x8d \x8e \x8f \x90 \x91 \x92 \x93 \x94 + \x95 \x96 \x97 \x98 \x99 \x9a \x9b \x9c \x9d \x9e \x9f \xa1 \xa2 \xa3 \xa4 + \xa5 \xa6 \xa7 \xa8 \xa9 \xaa \xab \xac \xad \xae \xaf \xb0 \xb1 \xb2 \xb3 + \xb4 \xb5 \xb6 \xb7 \xb8 \xb9 \xba \xbb \xbc \xbd \xbe \xbf \xc0 \xc1 \xc2 + \xc3 \xc4 \xc5 \xc6 \xc7 \xc8 \xc9 \xca \xcb \xcc \xcd \xce \xcf \xd0 \xd1 + \xd2 \xd3 \xd4 \xd5 \xd6 \xd7 \xd8 \xd9 \xda \xdb \xdc \xdd \xde \xdf \xe0 + \xe1 \xe2 \xe3 \xe4 \xe5 \xe6 \xe7 \xe8 \xe9 \xea \xeb \xec \xed \xee \xef + \xf0 \xf1 \xf2 \xf3 \xf4 \xf5 \xf6 \xf7 \xf8 \xf9 \xfa \xfb \xfc \xfd \xfe + \xff + \x{a2} \x{84} + 0: \x{a2} \x{84} + A Z + 0: A Z + +/a+/8 + a\x{123}aa\>1 + 0: aa + a\x{123}aa\>2 + 0: aa + a\x{123}aa\>3 + 0: a + a\x{123}aa\>4 +No match + a\x{123}aa\>5 +Error -24 (bad offset value) + a\x{123}aa\>6 +Error -24 (bad offset value) + +/\x{1234}+/iS8I +Capturing subpattern count = 0 +Options: caseless utf +First char = \x{1234} +No need char +Subject length lower bound = 1 +No starting char list + +/\x{1234}+?/iS8I +Capturing subpattern count = 0 +Options: caseless utf +First char = \x{1234} +No need char +Subject length lower bound = 1 +No starting char list + +/\x{1234}++/iS8I +Capturing subpattern count = 0 +Options: caseless utf +First char = \x{1234} +No need char +Subject length lower bound = 1 +No starting char list + +/\x{1234}{2}/iS8I +Capturing subpattern count = 0 +Options: caseless utf +First char = \x{1234} +Need char = \x{1234} +Subject length lower bound = 2 +No starting char list + +/[^\x{c4}]/8DZ +------------------------------------------------------------------ + Bra + [^\x{c4}] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +No first char +No need char + +/X+\x{200}/8DZ +------------------------------------------------------------------ + Bra + X++ + \x{200} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = 'X' +Need char = \x{200} + +/\R/SI8 +Capturing subpattern count = 0 +Options: utf +No first char +No need char +Subject length lower bound = 1 +Starting chars: \x0a \x0b \x0c \x0d \x85 \xff + +/-- Check bad offset --/ + +/a/8 + \x{10000}\>1 +Error -11 (bad UTF-16 offset) + \x{10000}ab\>1 +Error -11 (bad UTF-16 offset) + \x{10000}ab\>2 + 0: a + \x{10000}ab\>3 +No match + \x{10000}ab\>4 +No match + \x{10000}ab\>5 +Error -24 (bad offset value) + +/í¼€/8 +Failed: invalid UTF-16 string at offset 0 + +/\w+\x{C4}/8BZ +------------------------------------------------------------------ + Bra + \w++ + \x{c4} + Ket + End +------------------------------------------------------------------ + a\x{C4}\x{C4} + 0: a\x{c4} + +/\w+\x{C4}/8BZT1 +------------------------------------------------------------------ + Bra + \w+ + \x{c4} + Ket + End +------------------------------------------------------------------ + a\x{C4}\x{C4} + 0: a\x{c4}\x{c4} + +/\W+\x{C4}/8BZ +------------------------------------------------------------------ + Bra + \W+ + \x{c4} + Ket + End +------------------------------------------------------------------ + !\x{C4} + 0: !\x{c4} + +/\W+\x{C4}/8BZT1 +------------------------------------------------------------------ + Bra + \W++ + \x{c4} + Ket + End +------------------------------------------------------------------ + !\x{C4} + 0: !\x{c4} + +/\W+\x{A1}/8BZ +------------------------------------------------------------------ + Bra + \W+ + \x{a1} + Ket + End +------------------------------------------------------------------ + !\x{A1} + 0: !\x{a1} + +/\W+\x{A1}/8BZT1 +------------------------------------------------------------------ + Bra + \W+ + \x{a1} + Ket + End +------------------------------------------------------------------ + !\x{A1} + 0: !\x{a1} + +/X\s+\x{A0}/8BZ +------------------------------------------------------------------ + Bra + X + \s++ + \x{a0} + Ket + End +------------------------------------------------------------------ + X\x20\x{A0}\x{A0} + 0: X \x{a0} + +/X\s+\x{A0}/8BZT1 +------------------------------------------------------------------ + Bra + X + \s+ + \x{a0} + Ket + End +------------------------------------------------------------------ + X\x20\x{A0}\x{A0} + 0: X \x{a0}\x{a0} + +/\S+\x{A0}/8BZ +------------------------------------------------------------------ + Bra + \S+ + \x{a0} + Ket + End +------------------------------------------------------------------ + X\x{A0}\x{A0} + 0: X\x{a0}\x{a0} + +/\S+\x{A0}/8BZT1 +------------------------------------------------------------------ + Bra + \S++ + \x{a0} + Ket + End +------------------------------------------------------------------ + X\x{A0}\x{A0} + 0: X\x{a0} + +/\x{a0}+\s!/8BZ +------------------------------------------------------------------ + Bra + \x{a0}++ + \s + ! + Ket + End +------------------------------------------------------------------ + \x{a0}\x20! + 0: \x{a0} ! + +/\x{a0}+\s!/8BZT1 +------------------------------------------------------------------ + Bra + \x{a0}+ + \s + ! + Ket + End +------------------------------------------------------------------ + \x{a0}\x20! + 0: \x{a0} ! + +/(*UTF)abc/9 +Failed: setting UTF is disabled by the application at offset 0 + +/abc/89 +Failed: setting UTF is disabled by the application at offset 0 + +/-- End of testinput18 --/ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput18-32 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput18-32 new file mode 100755 index 000000000..622ba64aa --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput18-32 @@ -0,0 +1,1023 @@ +/-- This set of tests is for UTF-16 and UTF-32 support, and is relevant only to + the 16- and 32-bit libraries. --/ + +< forbid W + +/ÃÃÃxxx/8?DZSS +**Failed: invalid UTF-8 string cannot be converted to UTF-32 + +/abc/8 + Ã] +**Failed: invalid UTF-8 string cannot be used as input in UTF mode + +/X(\C{3})/8 + X\x{11234}Y +No match + X\x{11234}YZ + 0: X\x{11234}YZ + 1: \x{11234}YZ + +/X(\C{4})/8 + X\x{11234}YZ +No match + X\x{11234}YZW + 0: X\x{11234}YZW + 1: \x{11234}YZW + +/X\C*/8 + XYZabcdce + 0: XYZabcdce + +/X\C*?/8 + XYZabcde + 0: X + +/X\C{3,5}/8 + Xabcdefg + 0: Xabcde + X\x{11234}Y +No match + X\x{11234}YZ + 0: X\x{11234}YZ + X\x{11234}\x{512} +No match + X\x{11234}\x{512}YZ + 0: X\x{11234}\x{512}YZ + X\x{11234}\x{512}\x{11234}Z + 0: X\x{11234}\x{512}\x{11234}Z + +/X\C{3,5}?/8 + Xabcdefg + 0: Xabc + X\x{11234}Y +No match + X\x{11234}YZ + 0: X\x{11234}YZ + X\x{11234}\x{512}YZ + 0: X\x{11234}\x{512}Y + *** Failers +No match + X\x{11234} +No match + +/a\Cb/8 + aXb + 0: aXb + a\nb + 0: a\x{0a}b + +/a\C\Cb/8 + a\x{12257}b +No match + a\x{12257}\x{11234}b + 0: a\x{12257}\x{11234}b + ** Failers +No match + a\x{100}b +No match + +/ab\Cde/8 + abXde + 0: abXde + +/-- Check maximum character size --/ + +/\x{ffff}/8DZ +------------------------------------------------------------------ + Bra + \x{ffff} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{ffff} +No need char + +/\x{10000}/8DZ +------------------------------------------------------------------ + Bra + \x{10000} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{10000} +No need char + +/\x{100}/8DZ +------------------------------------------------------------------ + Bra + \x{100} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{100} +No need char + +/\x{1000}/8DZ +------------------------------------------------------------------ + Bra + \x{1000} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{1000} +No need char + +/\x{10000}/8DZ +------------------------------------------------------------------ + Bra + \x{10000} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{10000} +No need char + +/\x{100000}/8DZ +------------------------------------------------------------------ + Bra + \x{100000} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{100000} +No need char + +/\x{10ffff}/8DZ +------------------------------------------------------------------ + Bra + \x{10ffff} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{10ffff} +No need char + +/[\x{ff}]/8DZ +------------------------------------------------------------------ + Bra + \x{ff} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{ff} +No need char + +/[\x{100}]/8DZ +------------------------------------------------------------------ + Bra + \x{100} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{100} +No need char + +/\x80/8DZ +------------------------------------------------------------------ + Bra + \x80 + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{80} +No need char + +/\xff/8DZ +------------------------------------------------------------------ + Bra + \x{ff} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{ff} +No need char + +/\x{D55c}\x{ad6d}\x{C5B4}/DZ8 +------------------------------------------------------------------ + Bra + \x{d55c}\x{ad6d}\x{c5b4} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{d55c} +Need char = \x{c5b4} + \x{D55c}\x{ad6d}\x{C5B4} + 0: \x{d55c}\x{ad6d}\x{c5b4} + +/\x{65e5}\x{672c}\x{8a9e}/DZ8 +------------------------------------------------------------------ + Bra + \x{65e5}\x{672c}\x{8a9e} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{65e5} +Need char = \x{8a9e} + \x{65e5}\x{672c}\x{8a9e} + 0: \x{65e5}\x{672c}\x{8a9e} + +/\x{80}/DZ8 +------------------------------------------------------------------ + Bra + \x80 + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{80} +No need char + +/\x{084}/DZ8 +------------------------------------------------------------------ + Bra + \x{84} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{84} +No need char + +/\x{104}/DZ8 +------------------------------------------------------------------ + Bra + \x{104} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{104} +No need char + +/\x{861}/DZ8 +------------------------------------------------------------------ + Bra + \x{861} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{861} +No need char + +/\x{212ab}/DZ8 +------------------------------------------------------------------ + Bra + \x{212ab} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{212ab} +No need char + +/-- This one is here not because it's different to Perl, but because the way +the captured single-byte is displayed. (In Perl it becomes a character, and you +can't tell the difference.) --/ + +/X(\C)(.*)/8 + X\x{1234} + 0: X\x{1234} + 1: \x{1234} + 2: + X\nabc + 0: X\x{0a}abc + 1: \x{0a} + 2: abc + +/-- This one is here because Perl gives out a grumbly error message (quite +correctly, but that messes up comparisons). --/ + +/a\Cb/8 + *** Failers +No match + a\x{100}b + 0: a\x{100}b + +/[^ab\xC0-\xF0]/8SDZ +------------------------------------------------------------------ + Bra + [\x00-`c-\xbf\xf1-\xff] (neg) + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +No first char +No need char +Subject length lower bound = 1 +Starting chars: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \x0a + \x0b \x0c \x0d \x0e \x0f \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 + \x1a \x1b \x1c \x1d \x1e \x1f \x20 ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 + 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y + Z [ \ ] ^ _ ` c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ \x7f + \x80 \x81 \x82 \x83 \x84 \x85 \x86 \x87 \x88 \x89 \x8a \x8b \x8c \x8d \x8e + \x8f \x90 \x91 \x92 \x93 \x94 \x95 \x96 \x97 \x98 \x99 \x9a \x9b \x9c \x9d + \x9e \x9f \xa0 \xa1 \xa2 \xa3 \xa4 \xa5 \xa6 \xa7 \xa8 \xa9 \xaa \xab \xac + \xad \xae \xaf \xb0 \xb1 \xb2 \xb3 \xb4 \xb5 \xb6 \xb7 \xb8 \xb9 \xba \xbb + \xbc \xbd \xbe \xbf \xf1 \xf2 \xf3 \xf4 \xf5 \xf6 \xf7 \xf8 \xf9 \xfa \xfb + \xfc \xfd \xfe \xff + \x{f1} + 0: \x{f1} + \x{bf} + 0: \x{bf} + \x{100} + 0: \x{100} + \x{1000} + 0: \x{1000} + *** Failers + 0: * + \x{c0} +No match + \x{f0} +No match + +/Ä€{3,4}/8SDZ +------------------------------------------------------------------ + Bra + \x{100}{3} + \x{100}?+ + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{100} +Need char = \x{100} +Subject length lower bound = 3 +No starting char list + \x{100}\x{100}\x{100}\x{100\x{100} + 0: \x{100}\x{100}\x{100} + +/(\x{100}+|x)/8SDZ +------------------------------------------------------------------ + Bra + CBra 1 + \x{100}++ + Alt + x + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Options: utf +No first char +No need char +Subject length lower bound = 1 +Starting chars: x \xff + +/(\x{100}*a|x)/8SDZ +------------------------------------------------------------------ + Bra + CBra 1 + \x{100}*+ + a + Alt + x + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Options: utf +No first char +No need char +Subject length lower bound = 1 +Starting chars: a x \xff + +/(\x{100}{0,2}a|x)/8SDZ +------------------------------------------------------------------ + Bra + CBra 1 + \x{100}{0,2}+ + a + Alt + x + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Options: utf +No first char +No need char +Subject length lower bound = 1 +Starting chars: a x \xff + +/(\x{100}{1,2}a|x)/8SDZ +------------------------------------------------------------------ + Bra + CBra 1 + \x{100} + \x{100}{0,1}+ + a + Alt + x + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Options: utf +No first char +No need char +Subject length lower bound = 1 +Starting chars: x \xff + +/\x{100}/8DZ +------------------------------------------------------------------ + Bra + \x{100} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{100} +No need char + +/a\x{100}\x{101}*/8DZ +------------------------------------------------------------------ + Bra + a\x{100} + \x{101}*+ + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = 'a' +Need char = \x{100} + +/a\x{100}\x{101}+/8DZ +------------------------------------------------------------------ + Bra + a\x{100} + \x{101}++ + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = 'a' +Need char = \x{101} + +/[^\x{c4}]/DZ +------------------------------------------------------------------ + Bra + [^\x{c4}] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +No need char + +/[\x{100}]/8DZ +------------------------------------------------------------------ + Bra + \x{100} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{100} +No need char + \x{100} + 0: \x{100} + Z\x{100} + 0: \x{100} + \x{100}Z + 0: \x{100} + *** Failers +No match + +/[\xff]/DZ8 +------------------------------------------------------------------ + Bra + \x{ff} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{ff} +No need char + >\x{ff}< + 0: \x{ff} + +/[^\xff]/8DZ +------------------------------------------------------------------ + Bra + [^\x{ff}] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +No first char +No need char + +/\x{100}abc(xyz(?1))/8DZ +------------------------------------------------------------------ + Bra + \x{100}abc + CBra 1 + xyz + Recurse + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Options: utf +First char = \x{100} +Need char = 'z' + +/\777/8I +Capturing subpattern count = 0 +Options: utf +First char = \x{1ff} +No need char + \x{1ff} + 0: \x{1ff} + \777 + 0: \x{1ff} + +/\x{100}+\x{200}/8DZ +------------------------------------------------------------------ + Bra + \x{100}++ + \x{200} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{100} +Need char = \x{200} + +/\x{100}+X/8DZ +------------------------------------------------------------------ + Bra + \x{100}++ + X + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = \x{100} +Need char = 'X' + +/^[\QÄ€\E-\QÅ\E/BZ8 +Failed: missing terminating ] for character class at offset 13 + +/X/8 + \x{d800} +Error -10 (bad UTF-32 string) offset=0 reason=1 + \x{d800}\? +No match + \x{da00} +Error -10 (bad UTF-32 string) offset=0 reason=1 + \x{da00}\? +No match + \x{dc00} +Error -10 (bad UTF-32 string) offset=0 reason=1 + \x{dc00}\? +No match + \x{de00} +Error -10 (bad UTF-32 string) offset=0 reason=1 + \x{de00}\? +No match + \x{dfff} +Error -10 (bad UTF-32 string) offset=0 reason=1 + \x{dfff}\? +No match + \x{110000} +Error -10 (bad UTF-32 string) offset=0 reason=3 + \x{d800}\x{1234} +Error -10 (bad UTF-32 string) offset=0 reason=1 + +/(*UTF16)\x{11234}/ +Failed: (*VERB) not recognized or malformed at offset 5 + +/(*UTF)\x{11234}/I +Capturing subpattern count = 0 +Options: utf +First char = \x{11234} +No need char + abcd\x{11234}pqr + 0: \x{11234} + +/(*UTF-32)\x{11234}/ +Failed: (*VERB) not recognized or malformed at offset 5 + +/(*CRLF)(*UTF16)(*BSR_UNICODE)a\Rb/I +Failed: (*VERB) not recognized or malformed at offset 12 + +/(*CRLF)(*UTF32)(*BSR_UNICODE)a\Rb/I +Capturing subpattern count = 0 +Options: bsr_unicode utf +Forced newline sequence: CRLF +First char = 'a' +Need char = 'b' + +/\h/SI8 +Capturing subpattern count = 0 +Options: utf +No first char +No need char +Subject length lower bound = 1 +Starting chars: \x09 \x20 \xa0 \xff + ABC\x{09} + 0: \x{09} + ABC\x{20} + 0: + ABC\x{a0} + 0: \x{a0} + ABC\x{1680} + 0: \x{1680} + ABC\x{180e} + 0: \x{180e} + ABC\x{2000} + 0: \x{2000} + ABC\x{202f} + 0: \x{202f} + ABC\x{205f} + 0: \x{205f} + ABC\x{3000} + 0: \x{3000} + +/\v/SI8 +Capturing subpattern count = 0 +Options: utf +No first char +No need char +Subject length lower bound = 1 +Starting chars: \x0a \x0b \x0c \x0d \x85 \xff + ABC\x{0a} + 0: \x{0a} + ABC\x{0b} + 0: \x{0b} + ABC\x{0c} + 0: \x{0c} + ABC\x{0d} + 0: \x{0d} + ABC\x{85} + 0: \x{85} + ABC\x{2028} + 0: \x{2028} + +/\h*A/SI8 +Capturing subpattern count = 0 +Options: utf +No first char +Need char = 'A' +Subject length lower bound = 1 +Starting chars: \x09 \x20 A \xa0 \xff + CDBABC + 0: A + \x{2000}ABC + 0: \x{2000}A + +/\R*A/SI8 +Capturing subpattern count = 0 +Options: bsr_unicode utf +No first char +Need char = 'A' +Subject length lower bound = 1 +Starting chars: \x0a \x0b \x0c \x0d A \x85 \xff + CDBABC + 0: A + \x{2028}A + 0: \x{2028}A + +/\v+A/SI8 +Capturing subpattern count = 0 +Options: utf +No first char +Need char = 'A' +Subject length lower bound = 2 +Starting chars: \x0a \x0b \x0c \x0d \x85 \xff + +/\s?xxx\s/8SI +Capturing subpattern count = 0 +Options: utf +No first char +Need char = 'x' +Subject length lower bound = 4 +Starting chars: \x09 \x0a \x0b \x0c \x0d \x20 x + +/\sxxx\s/I8ST1 +Capturing subpattern count = 0 +Options: utf +No first char +Need char = 'x' +Subject length lower bound = 5 +Starting chars: \x09 \x0a \x0b \x0c \x0d \x20 \x85 \xa0 + AB\x{85}xxx\x{a0}XYZ + 0: \x{85}xxx\x{a0} + AB\x{a0}xxx\x{85}XYZ + 0: \x{a0}xxx\x{85} + +/\S \S/I8ST1 +Capturing subpattern count = 0 +Options: utf +No first char +Need char = ' ' +Subject length lower bound = 3 +Starting chars: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x0e \x0f + \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1a \x1b \x1c \x1d \x1e + \x1f ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C + D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h + i j k l m n o p q r s t u v w x y z { | } ~ \x7f \x80 \x81 \x82 \x83 \x84 + \x86 \x87 \x88 \x89 \x8a \x8b \x8c \x8d \x8e \x8f \x90 \x91 \x92 \x93 \x94 + \x95 \x96 \x97 \x98 \x99 \x9a \x9b \x9c \x9d \x9e \x9f \xa1 \xa2 \xa3 \xa4 + \xa5 \xa6 \xa7 \xa8 \xa9 \xaa \xab \xac \xad \xae \xaf \xb0 \xb1 \xb2 \xb3 + \xb4 \xb5 \xb6 \xb7 \xb8 \xb9 \xba \xbb \xbc \xbd \xbe \xbf \xc0 \xc1 \xc2 + \xc3 \xc4 \xc5 \xc6 \xc7 \xc8 \xc9 \xca \xcb \xcc \xcd \xce \xcf \xd0 \xd1 + \xd2 \xd3 \xd4 \xd5 \xd6 \xd7 \xd8 \xd9 \xda \xdb \xdc \xdd \xde \xdf \xe0 + \xe1 \xe2 \xe3 \xe4 \xe5 \xe6 \xe7 \xe8 \xe9 \xea \xeb \xec \xed \xee \xef + \xf0 \xf1 \xf2 \xf3 \xf4 \xf5 \xf6 \xf7 \xf8 \xf9 \xfa \xfb \xfc \xfd \xfe + \xff + \x{a2} \x{84} + 0: \x{a2} \x{84} + A Z + 0: A Z + +/a+/8 + a\x{123}aa\>1 + 0: aa + a\x{123}aa\>2 + 0: aa + a\x{123}aa\>3 + 0: a + a\x{123}aa\>4 +No match + a\x{123}aa\>5 +Error -24 (bad offset value) + a\x{123}aa\>6 +Error -24 (bad offset value) + +/\x{1234}+/iS8I +Capturing subpattern count = 0 +Options: caseless utf +First char = \x{1234} +No need char +Subject length lower bound = 1 +No starting char list + +/\x{1234}+?/iS8I +Capturing subpattern count = 0 +Options: caseless utf +First char = \x{1234} +No need char +Subject length lower bound = 1 +No starting char list + +/\x{1234}++/iS8I +Capturing subpattern count = 0 +Options: caseless utf +First char = \x{1234} +No need char +Subject length lower bound = 1 +No starting char list + +/\x{1234}{2}/iS8I +Capturing subpattern count = 0 +Options: caseless utf +First char = \x{1234} +Need char = \x{1234} +Subject length lower bound = 2 +No starting char list + +/[^\x{c4}]/8DZ +------------------------------------------------------------------ + Bra + [^\x{c4}] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +No first char +No need char + +/X+\x{200}/8DZ +------------------------------------------------------------------ + Bra + X++ + \x{200} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = 'X' +Need char = \x{200} + +/\R/SI8 +Capturing subpattern count = 0 +Options: utf +No first char +No need char +Subject length lower bound = 1 +Starting chars: \x0a \x0b \x0c \x0d \x85 \xff + +/-- Check bad offset --/ + +/a/8 + \x{10000}\>1 +No match + \x{10000}ab\>1 + 0: a + \x{10000}ab\>2 +No match + \x{10000}ab\>3 +No match + \x{10000}ab\>4 +Error -24 (bad offset value) + \x{10000}ab\>5 +Error -24 (bad offset value) + +/í¼€/8 +**Failed: character value is ill-formed UTF-32 + +/\w+\x{C4}/8BZ +------------------------------------------------------------------ + Bra + \w++ + \x{c4} + Ket + End +------------------------------------------------------------------ + a\x{C4}\x{C4} + 0: a\x{c4} + +/\w+\x{C4}/8BZT1 +------------------------------------------------------------------ + Bra + \w+ + \x{c4} + Ket + End +------------------------------------------------------------------ + a\x{C4}\x{C4} + 0: a\x{c4}\x{c4} + +/\W+\x{C4}/8BZ +------------------------------------------------------------------ + Bra + \W+ + \x{c4} + Ket + End +------------------------------------------------------------------ + !\x{C4} + 0: !\x{c4} + +/\W+\x{C4}/8BZT1 +------------------------------------------------------------------ + Bra + \W++ + \x{c4} + Ket + End +------------------------------------------------------------------ + !\x{C4} + 0: !\x{c4} + +/\W+\x{A1}/8BZ +------------------------------------------------------------------ + Bra + \W+ + \x{a1} + Ket + End +------------------------------------------------------------------ + !\x{A1} + 0: !\x{a1} + +/\W+\x{A1}/8BZT1 +------------------------------------------------------------------ + Bra + \W+ + \x{a1} + Ket + End +------------------------------------------------------------------ + !\x{A1} + 0: !\x{a1} + +/X\s+\x{A0}/8BZ +------------------------------------------------------------------ + Bra + X + \s++ + \x{a0} + Ket + End +------------------------------------------------------------------ + X\x20\x{A0}\x{A0} + 0: X \x{a0} + +/X\s+\x{A0}/8BZT1 +------------------------------------------------------------------ + Bra + X + \s+ + \x{a0} + Ket + End +------------------------------------------------------------------ + X\x20\x{A0}\x{A0} + 0: X \x{a0}\x{a0} + +/\S+\x{A0}/8BZ +------------------------------------------------------------------ + Bra + \S+ + \x{a0} + Ket + End +------------------------------------------------------------------ + X\x{A0}\x{A0} + 0: X\x{a0}\x{a0} + +/\S+\x{A0}/8BZT1 +------------------------------------------------------------------ + Bra + \S++ + \x{a0} + Ket + End +------------------------------------------------------------------ + X\x{A0}\x{A0} + 0: X\x{a0} + +/\x{a0}+\s!/8BZ +------------------------------------------------------------------ + Bra + \x{a0}++ + \s + ! + Ket + End +------------------------------------------------------------------ + \x{a0}\x20! + 0: \x{a0} ! + +/\x{a0}+\s!/8BZT1 +------------------------------------------------------------------ + Bra + \x{a0}+ + \s + ! + Ket + End +------------------------------------------------------------------ + \x{a0}\x20! + 0: \x{a0} ! + +/(*UTF)abc/9 +Failed: setting UTF is disabled by the application at offset 0 + +/abc/89 +Failed: setting UTF is disabled by the application at offset 0 + +/-- End of testinput18 --/ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput19 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput19 new file mode 100755 index 000000000..982bea4c1 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput19 @@ -0,0 +1,134 @@ +/-- This set of tests is for Unicode property support, relevant only to the + 16- and 32-bit library. --/ + +/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8iDZ +------------------------------------------------------------------ + Bra + /i A\x{391}\x{10427}\x{ff3a}\x{1fb0} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: caseless utf +First char = 'A' (caseless) +Need char = \x{1fb0} (caseless) + +/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8DZ +------------------------------------------------------------------ + Bra + A\x{391}\x{10427}\x{ff3a}\x{1fb0} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = 'A' +Need char = \x{1fb0} + +/AB\x{1fb0}/8DZ +------------------------------------------------------------------ + Bra + AB\x{1fb0} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = 'A' +Need char = \x{1fb0} + +/AB\x{1fb0}/8DZi +------------------------------------------------------------------ + Bra + /i AB\x{1fb0} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: caseless utf +First char = 'A' (caseless) +Need char = \x{1fb0} (caseless) + +/\x{401}\x{420}\x{421}\x{422}\x{423}\x{424}\x{425}\x{426}\x{427}\x{428}\x{429}\x{42a}\x{42b}\x{42c}\x{42d}\x{42e}\x{42f}/8iSI +Capturing subpattern count = 0 +Options: caseless utf +First char = \x{401} (caseless) +Need char = \x{42f} (caseless) +Subject length lower bound = 17 +No starting char list + \x{401}\x{420}\x{421}\x{422}\x{423}\x{424}\x{425}\x{426}\x{427}\x{428}\x{429}\x{42a}\x{42b}\x{42c}\x{42d}\x{42e}\x{42f} + 0: \x{401}\x{420}\x{421}\x{422}\x{423}\x{424}\x{425}\x{426}\x{427}\x{428}\x{429}\x{42a}\x{42b}\x{42c}\x{42d}\x{42e}\x{42f} + \x{451}\x{440}\x{441}\x{442}\x{443}\x{444}\x{445}\x{446}\x{447}\x{448}\x{449}\x{44a}\x{44b}\x{44c}\x{44d}\x{44e}\x{44f} + 0: \x{451}\x{440}\x{441}\x{442}\x{443}\x{444}\x{445}\x{446}\x{447}\x{448}\x{449}\x{44a}\x{44b}\x{44c}\x{44d}\x{44e}\x{44f} + +/[â±¥]/8iBZ +------------------------------------------------------------------ + Bra + /i \x{2c65} + Ket + End +------------------------------------------------------------------ + +/[^â±¥]/8iBZ +------------------------------------------------------------------ + Bra + /i [^\x{2c65}] + Ket + End +------------------------------------------------------------------ + +/[[:blank:]]/WBZ +------------------------------------------------------------------ + Bra + [\x09 \xa0\x{1680}\x{180e}\x{2000}-\x{200a}\x{202f}\x{205f}\x{3000}] + Ket + End +------------------------------------------------------------------ + +/\x{212a}+/i8SI +Capturing subpattern count = 0 +Options: caseless utf +No first char +No need char +Subject length lower bound = 1 +Starting chars: K k \xff + KKkk\x{212a} + 0: KKkk\x{212a} + +/s+/i8SI +Capturing subpattern count = 0 +Options: caseless utf +No first char +No need char +Subject length lower bound = 1 +Starting chars: S s \xff + SSss\x{17f} + 0: SSss\x{17f} + +/[\D]/8 + \x{1d7cf} + 0: \x{1d7cf} + +/[\D\P{Nd}]/8 + \x{1d7cf} + 0: \x{1d7cf} + +/[^\D]/8 + a9b + 0: 9 + ** Failers +No match + \x{1d7cf} +No match + +/[^\D\P{Nd}]/8 + a9b + 0: 9 + \x{1d7cf} + 0: \x{1d7cf} + ** Failers +No match + \x{10000} +No match + +/-- End of testinput19 --/ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput2 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput2 new file mode 100755 index 000000000..f5d32d6ad --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput2 @@ -0,0 +1,14727 @@ +/-- This set of tests is not Perl-compatible. It checks on special features + of PCRE's API, error diagnostics, and the compiled code of some patterns. + It also checks the non-Perl syntax the PCRE supports (Python, .NET, + Oniguruma). Finally, there are some tests where PCRE and Perl differ, + either because PCRE can't be compatible, or there is a possible Perl + bug. + + NOTE: This is a non-UTF set of tests. When UTF support is needed, use + test 5, and if Unicode Property Support is needed, use test 7. --/ + +< forbid 8W + +/(a)b|/I +Capturing subpattern count = 1 +May match empty string +No options +No first char +No need char + +/abc/I +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'c' + abc + 0: abc + defabc + 0: abc + \Aabc + 0: abc + *** Failers +No match + \Adefabc +No match + ABC +No match + +/^abc/I +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + abc + 0: abc + \Aabc + 0: abc + *** Failers +No match + defabc +No match + \Adefabc +No match + +/a+bc/I +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'c' + +/a*bc/I +Capturing subpattern count = 0 +No options +No first char +Need char = 'c' + +/a{3}bc/I +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'c' + +/(abc|a+z)/I +Capturing subpattern count = 1 +No options +First char = 'a' +No need char + +/^abc$/I +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + abc + 0: abc + *** Failers +No match + def\nabc +No match + +/ab\idef/X +Failed: unrecognized character follows \ at offset 3 + +/(?X)ab\idef/X +Failed: unrecognized character follows \ at offset 7 + +/x{5,4}/ +Failed: numbers out of order in {} quantifier at offset 5 + +/z{65536}/ +Failed: number too big in {} quantifier at offset 7 + +/[abcd/ +Failed: missing terminating ] for character class at offset 5 + +/(?X)[\B]/ +Failed: invalid escape sequence in character class at offset 6 + +/(?X)[\R]/ +Failed: invalid escape sequence in character class at offset 6 + +/(?X)[\X]/ +Failed: invalid escape sequence in character class at offset 6 + +/[\B]/BZ +------------------------------------------------------------------ + Bra + B + Ket + End +------------------------------------------------------------------ + +/[\R]/BZ +------------------------------------------------------------------ + Bra + R + Ket + End +------------------------------------------------------------------ + +/[\X]/BZ +------------------------------------------------------------------ + Bra + X + Ket + End +------------------------------------------------------------------ + +/[z-a]/ +Failed: range out of order in character class at offset 3 + +/^*/ +Failed: nothing to repeat at offset 1 + +/(abc/ +Failed: missing ) at offset 4 + +/(?# abc/ +Failed: missing ) after comment at offset 7 + +/(?z)abc/ +Failed: unrecognized character after (? or (?- at offset 2 + +/.*b/I +Capturing subpattern count = 0 +No options +First char at start or follows newline +Need char = 'b' + +/.*?b/I +Capturing subpattern count = 0 +No options +First char at start or follows newline +Need char = 'b' + +/cat|dog|elephant/I +Capturing subpattern count = 0 +No options +No first char +No need char + this sentence eventually mentions a cat + 0: cat + this sentences rambles on and on for a while and then reaches elephant + 0: elephant + +/cat|dog|elephant/IS +Capturing subpattern count = 0 +No options +No first char +No need char +Subject length lower bound = 3 +Starting chars: c d e + this sentence eventually mentions a cat + 0: cat + this sentences rambles on and on for a while and then reaches elephant + 0: elephant + +/cat|dog|elephant/IiS +Capturing subpattern count = 0 +Options: caseless +No first char +No need char +Subject length lower bound = 3 +Starting chars: C D E c d e + this sentence eventually mentions a CAT cat + 0: CAT + this sentences rambles on and on for a while to elephant ElePhant + 0: elephant + +/a|[bcd]/IS +Capturing subpattern count = 0 +No options +No first char +No need char +Subject length lower bound = 1 +Starting chars: a b c d + +/(a|[^\dZ])/IS +Capturing subpattern count = 1 +No options +No first char +No need char +Subject length lower bound = 1 +Starting chars: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \x0a + \x0b \x0c \x0d \x0e \x0f \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 + \x1a \x1b \x1c \x1d \x1e \x1f \x20 ! " # $ % & ' ( ) * + , - . / : ; < = > + ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y [ \ ] ^ _ ` a b c d + e f g h i j k l m n o p q r s t u v w x y z { | } ~ \x7f \x80 \x81 \x82 \x83 + \x84 \x85 \x86 \x87 \x88 \x89 \x8a \x8b \x8c \x8d \x8e \x8f \x90 \x91 \x92 + \x93 \x94 \x95 \x96 \x97 \x98 \x99 \x9a \x9b \x9c \x9d \x9e \x9f \xa0 \xa1 + \xa2 \xa3 \xa4 \xa5 \xa6 \xa7 \xa8 \xa9 \xaa \xab \xac \xad \xae \xaf \xb0 + \xb1 \xb2 \xb3 \xb4 \xb5 \xb6 \xb7 \xb8 \xb9 \xba \xbb \xbc \xbd \xbe \xbf + \xc0 \xc1 \xc2 \xc3 \xc4 \xc5 \xc6 \xc7 \xc8 \xc9 \xca \xcb \xcc \xcd \xce + \xcf \xd0 \xd1 \xd2 \xd3 \xd4 \xd5 \xd6 \xd7 \xd8 \xd9 \xda \xdb \xdc \xdd + \xde \xdf \xe0 \xe1 \xe2 \xe3 \xe4 \xe5 \xe6 \xe7 \xe8 \xe9 \xea \xeb \xec + \xed \xee \xef \xf0 \xf1 \xf2 \xf3 \xf4 \xf5 \xf6 \xf7 \xf8 \xf9 \xfa \xfb + \xfc \xfd \xfe \xff + +/(a|b)*[\s]/IS +Capturing subpattern count = 1 +No options +No first char +No need char +Subject length lower bound = 1 +Starting chars: \x09 \x0a \x0b \x0c \x0d \x20 a b + +/(ab\2)/ +Failed: reference to non-existent subpattern at offset 6 + +/{4,5}abc/ +Failed: nothing to repeat at offset 4 + +/(a)(b)(c)\2/I +Capturing subpattern count = 3 +Max back reference = 2 +No options +First char = 'a' +Need char = 'c' + abcb + 0: abcb + 1: a + 2: b + 3: c + \O0abcb +Matched, but too many substrings + \O3abcb +Matched, but too many substrings + 0: abcb + \O6abcb +Matched, but too many substrings + 0: abcb + 1: a + \O9abcb +Matched, but too many substrings + 0: abcb + 1: a + 2: b + \O12abcb + 0: abcb + 1: a + 2: b + 3: c + +/(a)bc|(a)(b)\2/I +Capturing subpattern count = 3 +Max back reference = 2 +No options +First char = 'a' +No need char + abc + 0: abc + 1: a + \O0abc +Matched, but too many substrings + \O3abc +Matched, but too many substrings + 0: abc + \O6abc + 0: abc + 1: a + aba + 0: aba + 1: + 2: a + 3: b + \O0aba +Matched, but too many substrings + \O3aba +Matched, but too many substrings + 0: aba + \O6aba +Matched, but too many substrings + 0: aba + 1: + \O9aba +Matched, but too many substrings + 0: aba + 1: + 2: a + \O12aba + 0: aba + 1: + 2: a + 3: b + +/abc$/IE +Capturing subpattern count = 0 +Options: dollar_endonly +First char = 'a' +Need char = 'c' + abc + 0: abc + *** Failers +No match + abc\n +No match + abc\ndef +No match + +/(a)(b)(c)(d)(e)\6/ +Failed: reference to non-existent subpattern at offset 17 + +/the quick brown fox/I +Capturing subpattern count = 0 +No options +First char = 't' +Need char = 'x' + the quick brown fox + 0: the quick brown fox + this is a line with the quick brown fox + 0: the quick brown fox + +/the quick brown fox/IA +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + the quick brown fox + 0: the quick brown fox + *** Failers +No match + this is a line with the quick brown fox +No match + +/ab(?z)cd/ +Failed: unrecognized character after (? or (?- at offset 4 + +/^abc|def/I +Capturing subpattern count = 0 +No options +No first char +No need char + abcdef + 0: abc + abcdef\B + 0: def + +/.*((abc)$|(def))/I +Capturing subpattern count = 3 +No options +First char at start or follows newline +No need char + defabc + 0: defabc + 1: abc + 2: abc + \Zdefabc + 0: def + 1: def + 2: + 3: def + +/)/ +Failed: unmatched parentheses at offset 0 + +/a[]b/ +Failed: missing terminating ] for character class at offset 4 + +/[^aeiou ]{3,}/I +Capturing subpattern count = 0 +No options +No first char +No need char + co-processors, and for + 0: -pr + +/<.*>/I +Capturing subpattern count = 0 +No options +First char = '<' +Need char = '>' + abcghinop + 0: ghi + +/<.*?>/I +Capturing subpattern count = 0 +No options +First char = '<' +Need char = '>' + abcghinop + 0: + +/<.*>/IU +Capturing subpattern count = 0 +Options: ungreedy +First char = '<' +Need char = '>' + abcghinop + 0: + +/(?U)<.*>/I +Capturing subpattern count = 0 +No options +First char = '<' +Need char = '>' + abcghinop + 0: + +/<.*?>/IU +Capturing subpattern count = 0 +Options: ungreedy +First char = '<' +Need char = '>' + abcghinop + 0: ghi + +/={3,}/IU +Capturing subpattern count = 0 +Options: ungreedy +First char = '=' +Need char = '=' + abc========def + 0: === + +/(?U)={3,}?/I +Capturing subpattern count = 0 +No options +First char = '=' +Need char = '=' + abc========def + 0: ======== + +/(?^abc)/Im +Capturing subpattern count = 0 +Options: multiline +First char at start or follows newline +Need char = 'c' + abc + 0: abc + def\nabc + 0: abc + *** Failers +No match + defabc +No match + +/(?<=ab(c+)d)ef/ +Failed: lookbehind assertion is not fixed length at offset 11 + +/(?<=ab(?<=c+)d)ef/ +Failed: lookbehind assertion is not fixed length at offset 12 + +/(?<=ab(c|de)f)g/ +Failed: lookbehind assertion is not fixed length at offset 13 + +/The next three are in testinput2 because they have variable length branches/ + +/(?<=bullock|donkey)-cart/I +Capturing subpattern count = 0 +Max lookbehind = 7 +No options +First char = '-' +Need char = 't' + the bullock-cart + 0: -cart + a donkey-cart race + 0: -cart + *** Failers +No match + cart +No match + horse-and-cart +No match + +/(?<=ab(?i)x|y|z)/I +Capturing subpattern count = 0 +Max lookbehind = 3 +May match empty string +No options +No first char +No need char + +/(?>.*)(?<=(abcd)|(xyz))/I +Capturing subpattern count = 2 +Max lookbehind = 4 +May match empty string +No options +No first char +No need char + alphabetabcd + 0: alphabetabcd + 1: abcd + endingxyz + 0: endingxyz + 1: + 2: xyz + +/(?<=ab(?i)x(?-i)y|(?i)z|b)ZZ/I +Capturing subpattern count = 0 +Max lookbehind = 4 +No options +First char = 'Z' +Need char = 'Z' + abxyZZ + 0: ZZ + abXyZZ + 0: ZZ + ZZZ + 0: ZZ + zZZ + 0: ZZ + bZZ + 0: ZZ + BZZ + 0: ZZ + *** Failers +No match + ZZ +No match + abXYZZ +No match + zzz +No match + bzz +No match + +/(? + 3: f + 1G a (1) + 2G (0) + 3G f (1) +get substring 4 failed -7 + 0L adef + 1L a + 2L + 3L f + bcdef\G1\G2\G3\G4\L + 0: bcdef + 1: bc + 2: bc + 3: f + 1G bc (2) + 2G bc (2) + 3G f (1) +get substring 4 failed -7 + 0L bcdef + 1L bc + 2L bc + 3L f + adefghijk\C0 + 0: adef + 1: a + 2: + 3: f + 0C adef (4) + +/^abc\00def/I +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + abc\00def\L\C0 + 0: abc\x00def + 0C abc\x00def (7) + 0L abc + +/word ((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ +)((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ +)?)?)?)?)?)?)?)?)?otherword/I +Capturing subpattern count = 8 +Contains explicit CR or LF match +No options +First char = 'w' +Need char = 'd' + +/.*X/IDZ +------------------------------------------------------------------ + Bra + Any* + X + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +First char at start or follows newline +Need char = 'X' + +/.*X/IDZs +------------------------------------------------------------------ + Bra + AllAny* + X + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored dotall +No first char +Need char = 'X' + +/(.*X|^B)/IDZ +------------------------------------------------------------------ + Bra + CBra 1 + Any* + X + Alt + ^ + B + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +No options +First char at start or follows newline +No need char + +/(.*X|^B)/IDZs +------------------------------------------------------------------ + Bra + CBra 1 + AllAny* + X + Alt + ^ + B + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Options: anchored dotall +No first char +No need char + +/(?s)(.*X|^B)/IDZ +------------------------------------------------------------------ + Bra + CBra 1 + AllAny* + X + Alt + ^ + B + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Options: anchored +No first char +No need char + +/(?s:.*X|^B)/IDZ +------------------------------------------------------------------ + Bra + Bra + AllAny* + X + Alt + ^ + B + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/\Biss\B/I+ +Capturing subpattern count = 0 +Max lookbehind = 1 +No options +First char = 'i' +Need char = 's' + Mississippi + 0: iss + 0+ issippi + +/iss/IG+ +Capturing subpattern count = 0 +No options +First char = 'i' +Need char = 's' + Mississippi + 0: iss + 0+ issippi + 0: iss + 0+ ippi + +/\Biss\B/IG+ +Capturing subpattern count = 0 +Max lookbehind = 1 +No options +First char = 'i' +Need char = 's' + Mississippi + 0: iss + 0+ issippi + +/\Biss\B/Ig+ +Capturing subpattern count = 0 +Max lookbehind = 1 +No options +First char = 'i' +Need char = 's' + Mississippi + 0: iss + 0+ issippi + 0: iss + 0+ ippi + *** Failers +No match + Mississippi\A +No match + +/(?<=[Ms])iss/Ig+ +Capturing subpattern count = 0 +Max lookbehind = 1 +No options +First char = 'i' +Need char = 's' + Mississippi + 0: iss + 0+ issippi + 0: iss + 0+ ippi + +/(?<=[Ms])iss/IG+ +Capturing subpattern count = 0 +Max lookbehind = 1 +No options +First char = 'i' +Need char = 's' + Mississippi + 0: iss + 0+ issippi + +/^iss/Ig+ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + ississippi + 0: iss + 0+ issippi + +/.*iss/Ig+ +Capturing subpattern count = 0 +No options +First char at start or follows newline +Need char = 's' + abciss\nxyzisspqr + 0: abciss + 0+ \x0axyzisspqr + 0: xyziss + 0+ pqr + +/.i./I+g +Capturing subpattern count = 0 +No options +No first char +Need char = 'i' + Mississippi + 0: Mis + 0+ sissippi + 0: sis + 0+ sippi + 0: sip + 0+ pi + Mississippi\A + 0: Mis + 0+ sissippi + 0: sis + 0+ sippi + 0: sip + 0+ pi + Missouri river + 0: Mis + 0+ souri river + 0: ri + 0+ river + 0: riv + 0+ er + Missouri river\A + 0: Mis + 0+ souri river + +/^.is/I+g +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + Mississippi + 0: Mis + 0+ sissippi + +/^ab\n/Ig+ +Capturing subpattern count = 0 +Contains explicit CR or LF match +Options: anchored +No first char +No need char + ab\nab\ncd + 0: ab\x0a + 0+ ab\x0acd + +/^ab\n/Img+ +Capturing subpattern count = 0 +Contains explicit CR or LF match +Options: multiline +First char at start or follows newline +Need char = \x0a + ab\nab\ncd + 0: ab\x0a + 0+ ab\x0acd + 0: ab\x0a + 0+ cd + +/abc/I +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'c' + +/abc|bac/I +Capturing subpattern count = 0 +No options +No first char +Need char = 'c' + +/(abc|bac)/I +Capturing subpattern count = 1 +No options +No first char +Need char = 'c' + +/(abc|(c|dc))/I +Capturing subpattern count = 2 +No options +No first char +Need char = 'c' + +/(abc|(d|de)c)/I +Capturing subpattern count = 2 +No options +No first char +Need char = 'c' + +/a*/I +Capturing subpattern count = 0 +May match empty string +No options +No first char +No need char + +/a+/I +Capturing subpattern count = 0 +No options +First char = 'a' +No need char + +/(baa|a+)/I +Capturing subpattern count = 1 +No options +No first char +Need char = 'a' + +/a{0,3}/I +Capturing subpattern count = 0 +May match empty string +No options +No first char +No need char + +/baa{3,}/I +Capturing subpattern count = 0 +No options +First char = 'b' +Need char = 'a' + +/"([^\\"]+|\\.)*"/I +Capturing subpattern count = 1 +No options +First char = '"' +Need char = '"' + +/(abc|ab[cd])/I +Capturing subpattern count = 1 +No options +First char = 'a' +No need char + +/(a|.)/I +Capturing subpattern count = 1 +No options +No first char +No need char + +/a|ba|\w/I +Capturing subpattern count = 0 +No options +No first char +No need char + +/abc(?=pqr)/I +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'r' + +/...(?<=abc)/I +Capturing subpattern count = 0 +Max lookbehind = 3 +No options +No first char +No need char + +/abc(?!pqr)/I +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'c' + +/ab./I +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'b' + +/ab[xyz]/I +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'b' + +/abc*/I +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'b' + +/ab.c*/I +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'b' + +/a.c*/I +Capturing subpattern count = 0 +No options +First char = 'a' +No need char + +/.c*/I +Capturing subpattern count = 0 +No options +No first char +No need char + +/ac*/I +Capturing subpattern count = 0 +No options +First char = 'a' +No need char + +/(a.c*|b.c*)/I +Capturing subpattern count = 1 +No options +No first char +No need char + +/a.c*|aba/I +Capturing subpattern count = 0 +No options +First char = 'a' +No need char + +/.+a/I +Capturing subpattern count = 0 +No options +No first char +Need char = 'a' + +/(?=abcda)a.*/I +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'a' + +/(?=a)a.*/I +Capturing subpattern count = 0 +No options +First char = 'a' +No need char + +/a(b)*/I +Capturing subpattern count = 1 +No options +First char = 'a' +No need char + +/a\d*/I +Capturing subpattern count = 0 +No options +First char = 'a' +No need char + +/ab\d*/I +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'b' + +/a(\d)*/I +Capturing subpattern count = 1 +No options +First char = 'a' +No need char + +/abcde{0,0}/I +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'd' + +/ab\d+/I +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'b' + +/a(?(1)b)(.)/I +Capturing subpattern count = 1 +Max back reference = 1 +No options +First char = 'a' +No need char + +/a(?(1)bag|big)(.)/I +Capturing subpattern count = 1 +Max back reference = 1 +No options +First char = 'a' +Need char = 'g' + +/a(?(1)bag|big)*(.)/I +Capturing subpattern count = 1 +Max back reference = 1 +No options +First char = 'a' +No need char + +/a(?(1)bag|big)+(.)/I +Capturing subpattern count = 1 +Max back reference = 1 +No options +First char = 'a' +Need char = 'g' + +/a(?(1)b..|b..)(.)/I +Capturing subpattern count = 1 +Max back reference = 1 +No options +First char = 'a' +Need char = 'b' + +/ab\d{0}e/I +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'e' + +/a?b?/I +Capturing subpattern count = 0 +May match empty string +No options +No first char +No need char + a + 0: a + b + 0: b + ab + 0: ab + \ + 0: + *** Failers + 0: + \N +No match + +/|-/I +Capturing subpattern count = 0 +May match empty string +No options +No first char +No need char + abcd + 0: + -abc + 0: + \Nab-c + 0: - + *** Failers + 0: + \Nabc +No match + +/^.?abcd/IS +Capturing subpattern count = 0 +Options: anchored +No first char +Need char = 'd' +Subject length lower bound = 4 +No starting char list + +/\( # ( at start + (?: # Non-capturing bracket + (?>[^()]+) # Either a sequence of non-brackets (no backtracking) + | # Or + (?R) # Recurse - i.e. nested bracketed string + )* # Zero or more contents + \) # Closing ) + /Ix +Capturing subpattern count = 0 +Options: extended +First char = '(' +Need char = ')' + (abcd) + 0: (abcd) + (abcd)xyz + 0: (abcd) + xyz(abcd) + 0: (abcd) + (ab(xy)cd)pqr + 0: (ab(xy)cd) + (ab(xycd)pqr + 0: (xycd) + () abc () + 0: () + 12(abcde(fsh)xyz(foo(bar))lmno)89 + 0: (abcde(fsh)xyz(foo(bar))lmno) + *** Failers +No match + abcd +No match + abcd) +No match + (abcd +No match + +/\( ( (?>[^()]+) | (?R) )* \) /Ixg +Capturing subpattern count = 1 +Options: extended +First char = '(' +Need char = ')' + (ab(xy)cd)pqr + 0: (ab(xy)cd) + 1: cd + 1(abcd)(x(y)z)pqr + 0: (abcd) + 1: abcd + 0: (x(y)z) + 1: z + +/\( (?: (?>[^()]+) | (?R) ) \) /Ix +Capturing subpattern count = 0 +Options: extended +First char = '(' +Need char = ')' + (abcd) + 0: (abcd) + (ab(xy)cd) + 0: (xy) + (a(b(c)d)e) + 0: (c) + ((ab)) + 0: ((ab)) + *** Failers +No match + () +No match + +/\( (?: (?>[^()]+) | (?R) )? \) /Ix +Capturing subpattern count = 0 +Options: extended +First char = '(' +Need char = ')' + () + 0: () + 12(abcde(fsh)xyz(foo(bar))lmno)89 + 0: (fsh) + +/\( ( (?>[^()]+) | (?R) )* \) /Ix +Capturing subpattern count = 1 +Options: extended +First char = '(' +Need char = ')' + (ab(xy)cd) + 0: (ab(xy)cd) + 1: cd + +/\( ( ( (?>[^()]+) | (?R) )* ) \) /Ix +Capturing subpattern count = 2 +Options: extended +First char = '(' +Need char = ')' + (ab(xy)cd) + 0: (ab(xy)cd) + 1: ab(xy)cd + 2: cd + +/\( (123)? ( ( (?>[^()]+) | (?R) )* ) \) /Ix +Capturing subpattern count = 3 +Options: extended +First char = '(' +Need char = ')' + (ab(xy)cd) + 0: (ab(xy)cd) + 1: + 2: ab(xy)cd + 3: cd + (123ab(xy)cd) + 0: (123ab(xy)cd) + 1: 123 + 2: ab(xy)cd + 3: cd + +/\( ( (123)? ( (?>[^()]+) | (?R) )* ) \) /Ix +Capturing subpattern count = 3 +Options: extended +First char = '(' +Need char = ')' + (ab(xy)cd) + 0: (ab(xy)cd) + 1: ab(xy)cd + 2: + 3: cd + (123ab(xy)cd) + 0: (123ab(xy)cd) + 1: 123ab(xy)cd + 2: 123 + 3: cd + +/\( (((((((((( ( (?>[^()]+) | (?R) )* )))))))))) \) /Ix +Capturing subpattern count = 11 +Options: extended +First char = '(' +Need char = ')' + (ab(xy)cd) + 0: (ab(xy)cd) + 1: ab(xy)cd + 2: ab(xy)cd + 3: ab(xy)cd + 4: ab(xy)cd + 5: ab(xy)cd + 6: ab(xy)cd + 7: ab(xy)cd + 8: ab(xy)cd + 9: ab(xy)cd +10: ab(xy)cd +11: cd + +/\( ( ( (?>[^()<>]+) | ((?>[^()]+)) | (?R) )* ) \) /Ix +Capturing subpattern count = 3 +Options: extended +First char = '(' +Need char = ')' + (abcd(xyz

qrs)123) + 0: (abcd(xyz

qrs)123) + 1: abcd(xyz

qrs)123 + 2: 123 + +/\( ( ( (?>[^()]+) | ((?R)) )* ) \) /Ix +Capturing subpattern count = 3 +Options: extended +First char = '(' +Need char = ')' + (ab(cd)ef) + 0: (ab(cd)ef) + 1: ab(cd)ef + 2: ef + 3: (cd) + (ab(cd(ef)gh)ij) + 0: (ab(cd(ef)gh)ij) + 1: ab(cd(ef)gh)ij + 2: ij + 3: (cd(ef)gh) + +/^[[:alnum:]]/DZ +------------------------------------------------------------------ + Bra + ^ + [0-9A-Za-z] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/^[[:^alnum:]]/DZ +------------------------------------------------------------------ + Bra + ^ + [\x00-/:-@[-`{-\xff] (neg) + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/^[[:alpha:]]/DZ +------------------------------------------------------------------ + Bra + ^ + [A-Za-z] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/^[[:^alpha:]]/DZ +------------------------------------------------------------------ + Bra + ^ + [\x00-@[-`{-\xff] (neg) + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/[_[:alpha:]]/IS +Capturing subpattern count = 0 +No options +No first char +No need char +Subject length lower bound = 1 +Starting chars: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z + _ a b c d e f g h i j k l m n o p q r s t u v w x y z + +/^[[:ascii:]]/DZ +------------------------------------------------------------------ + Bra + ^ + [\x00-\x7f] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/^[[:^ascii:]]/DZ +------------------------------------------------------------------ + Bra + ^ + [\x80-\xff] (neg) + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/^[[:blank:]]/DZ +------------------------------------------------------------------ + Bra + ^ + [\x09 ] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/^[[:^blank:]]/DZ +------------------------------------------------------------------ + Bra + ^ + [\x00-\x08\x0a-\x1f!-\xff] (neg) + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/[\n\x0b\x0c\x0d[:blank:]]/IS +Capturing subpattern count = 0 +Contains explicit CR or LF match +No options +No first char +No need char +Subject length lower bound = 1 +Starting chars: \x09 \x0a \x0b \x0c \x0d \x20 + +/^[[:cntrl:]]/DZ +------------------------------------------------------------------ + Bra + ^ + [\x00-\x1f\x7f] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/^[[:digit:]]/DZ +------------------------------------------------------------------ + Bra + ^ + [0-9] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/^[[:graph:]]/DZ +------------------------------------------------------------------ + Bra + ^ + [!-~] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/^[[:lower:]]/DZ +------------------------------------------------------------------ + Bra + ^ + [a-z] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/^[[:print:]]/DZ +------------------------------------------------------------------ + Bra + ^ + [ -~] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/^[[:punct:]]/DZ +------------------------------------------------------------------ + Bra + ^ + [!-/:-@[-`{-~] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/^[[:space:]]/DZ +------------------------------------------------------------------ + Bra + ^ + [\x09-\x0d ] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/^[[:upper:]]/DZ +------------------------------------------------------------------ + Bra + ^ + [A-Z] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/^[[:xdigit:]]/DZ +------------------------------------------------------------------ + Bra + ^ + [0-9A-Fa-f] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/^[[:word:]]/DZ +------------------------------------------------------------------ + Bra + ^ + [0-9A-Z_a-z] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/^[[:^cntrl:]]/DZ +------------------------------------------------------------------ + Bra + ^ + [ -~\x80-\xff] (neg) + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/^[12[:^digit:]]/DZ +------------------------------------------------------------------ + Bra + ^ + [\x00-/12:-\xff] (neg) + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/^[[:^blank:]]/DZ +------------------------------------------------------------------ + Bra + ^ + [\x00-\x08\x0a-\x1f!-\xff] (neg) + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/[01[:alpha:]%]/DZ +------------------------------------------------------------------ + Bra + [%01A-Za-z] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +No need char + +/[[.ch.]]/I +Failed: POSIX collating elements are not supported at offset 1 + +/[[=ch=]]/I +Failed: POSIX collating elements are not supported at offset 1 + +/[[:rhubarb:]]/I +Failed: unknown POSIX class name at offset 3 + +/[[:upper:]]/Ii +Capturing subpattern count = 0 +Options: caseless +No first char +No need char + A + 0: A + a + 0: a + +/[[:lower:]]/Ii +Capturing subpattern count = 0 +Options: caseless +No first char +No need char + A + 0: A + a + 0: a + +/((?-i)[[:lower:]])[[:lower:]]/Ii +Capturing subpattern count = 1 +Options: caseless +No first char +No need char + ab + 0: ab + 1: a + aB + 0: aB + 1: a + *** Failers + 0: ai + 1: a + Ab +No match + AB +No match + +/[\200-\110]/I +Failed: range out of order in character class at offset 9 + +/^(?(0)f|b)oo/I +Failed: invalid condition (?(0) at offset 6 + +/This one's here because of the large output vector needed/I +Capturing subpattern count = 0 +No options +First char = 'T' +Need char = 'd' + +/(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\w+)\s+(\270)/I +Capturing subpattern count = 271 +Max back reference = 270 +No options +No first char +No need char + \O900 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 ABC ABC + 0: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 ABC ABC + 1: 1 + 2: 2 + 3: 3 + 4: 4 + 5: 5 + 6: 6 + 7: 7 + 8: 8 + 9: 9 +10: 10 +11: 11 +12: 12 +13: 13 +14: 14 +15: 15 +16: 16 +17: 17 +18: 18 +19: 19 +20: 20 +21: 21 +22: 22 +23: 23 +24: 24 +25: 25 +26: 26 +27: 27 +28: 28 +29: 29 +30: 30 +31: 31 +32: 32 +33: 33 +34: 34 +35: 35 +36: 36 +37: 37 +38: 38 +39: 39 +40: 40 +41: 41 +42: 42 +43: 43 +44: 44 +45: 45 +46: 46 +47: 47 +48: 48 +49: 49 +50: 50 +51: 51 +52: 52 +53: 53 +54: 54 +55: 55 +56: 56 +57: 57 +58: 58 +59: 59 +60: 60 +61: 61 +62: 62 +63: 63 +64: 64 +65: 65 +66: 66 +67: 67 +68: 68 +69: 69 +70: 70 +71: 71 +72: 72 +73: 73 +74: 74 +75: 75 +76: 76 +77: 77 +78: 78 +79: 79 +80: 80 +81: 81 +82: 82 +83: 83 +84: 84 +85: 85 +86: 86 +87: 87 +88: 88 +89: 89 +90: 90 +91: 91 +92: 92 +93: 93 +94: 94 +95: 95 +96: 96 +97: 97 +98: 98 +99: 99 +100: 100 +101: 101 +102: 102 +103: 103 +104: 104 +105: 105 +106: 106 +107: 107 +108: 108 +109: 109 +110: 110 +111: 111 +112: 112 +113: 113 +114: 114 +115: 115 +116: 116 +117: 117 +118: 118 +119: 119 +120: 120 +121: 121 +122: 122 +123: 123 +124: 124 +125: 125 +126: 126 +127: 127 +128: 128 +129: 129 +130: 130 +131: 131 +132: 132 +133: 133 +134: 134 +135: 135 +136: 136 +137: 137 +138: 138 +139: 139 +140: 140 +141: 141 +142: 142 +143: 143 +144: 144 +145: 145 +146: 146 +147: 147 +148: 148 +149: 149 +150: 150 +151: 151 +152: 152 +153: 153 +154: 154 +155: 155 +156: 156 +157: 157 +158: 158 +159: 159 +160: 160 +161: 161 +162: 162 +163: 163 +164: 164 +165: 165 +166: 166 +167: 167 +168: 168 +169: 169 +170: 170 +171: 171 +172: 172 +173: 173 +174: 174 +175: 175 +176: 176 +177: 177 +178: 178 +179: 179 +180: 180 +181: 181 +182: 182 +183: 183 +184: 184 +185: 185 +186: 186 +187: 187 +188: 188 +189: 189 +190: 190 +191: 191 +192: 192 +193: 193 +194: 194 +195: 195 +196: 196 +197: 197 +198: 198 +199: 199 +200: 200 +201: 201 +202: 202 +203: 203 +204: 204 +205: 205 +206: 206 +207: 207 +208: 208 +209: 209 +210: 210 +211: 211 +212: 212 +213: 213 +214: 214 +215: 215 +216: 216 +217: 217 +218: 218 +219: 219 +220: 220 +221: 221 +222: 222 +223: 223 +224: 224 +225: 225 +226: 226 +227: 227 +228: 228 +229: 229 +230: 230 +231: 231 +232: 232 +233: 233 +234: 234 +235: 235 +236: 236 +237: 237 +238: 238 +239: 239 +240: 240 +241: 241 +242: 242 +243: 243 +244: 244 +245: 245 +246: 246 +247: 247 +248: 248 +249: 249 +250: 250 +251: 251 +252: 252 +253: 253 +254: 254 +255: 255 +256: 256 +257: 257 +258: 258 +259: 259 +260: 260 +261: 261 +262: 262 +263: 263 +264: 264 +265: 265 +266: 266 +267: 267 +268: 268 +269: 269 +270: ABC +271: ABC + +/This one's here because Perl does this differently and PCRE can't at present/I +Capturing subpattern count = 0 +No options +First char = 'T' +Need char = 't' + +/(main(O)?)+/I +Capturing subpattern count = 2 +No options +First char = 'm' +Need char = 'n' + mainmain + 0: mainmain + 1: main + mainOmain + 0: mainOmain + 1: main + 2: O + +/These are all cases where Perl does it differently (nested captures)/I +Capturing subpattern count = 1 +No options +First char = 'T' +Need char = 's' + +/^(a(b)?)+$/I +Capturing subpattern count = 2 +Options: anchored +No first char +No need char + aba + 0: aba + 1: a + 2: b + +/^(aa(bb)?)+$/I +Capturing subpattern count = 2 +Options: anchored +No first char +No need char + aabbaa + 0: aabbaa + 1: aa + 2: bb + +/^(aa|aa(bb))+$/I +Capturing subpattern count = 2 +Options: anchored +No first char +No need char + aabbaa + 0: aabbaa + 1: aa + 2: bb + +/^(aa(bb)??)+$/I +Capturing subpattern count = 2 +Options: anchored +No first char +No need char + aabbaa + 0: aabbaa + 1: aa + 2: bb + +/^(?:aa(bb)?)+$/I +Capturing subpattern count = 1 +Options: anchored +No first char +No need char + aabbaa + 0: aabbaa + 1: bb + +/^(aa(b(b))?)+$/I +Capturing subpattern count = 3 +Options: anchored +No first char +No need char + aabbaa + 0: aabbaa + 1: aa + 2: bb + 3: b + +/^(?:aa(b(b))?)+$/I +Capturing subpattern count = 2 +Options: anchored +No first char +No need char + aabbaa + 0: aabbaa + 1: bb + 2: b + +/^(?:aa(b(?:b))?)+$/I +Capturing subpattern count = 1 +Options: anchored +No first char +No need char + aabbaa + 0: aabbaa + 1: bb + +/^(?:aa(bb(?:b))?)+$/I +Capturing subpattern count = 1 +Options: anchored +No first char +No need char + aabbbaa + 0: aabbbaa + 1: bbb + +/^(?:aa(b(?:bb))?)+$/I +Capturing subpattern count = 1 +Options: anchored +No first char +No need char + aabbbaa + 0: aabbbaa + 1: bbb + +/^(?:aa(?:b(b))?)+$/I +Capturing subpattern count = 1 +Options: anchored +No first char +No need char + aabbaa + 0: aabbaa + 1: b + +/^(?:aa(?:b(bb))?)+$/I +Capturing subpattern count = 1 +Options: anchored +No first char +No need char + aabbbaa + 0: aabbbaa + 1: bb + +/^(aa(b(bb))?)+$/I +Capturing subpattern count = 3 +Options: anchored +No first char +No need char + aabbbaa + 0: aabbbaa + 1: aa + 2: bbb + 3: bb + +/^(aa(bb(bb))?)+$/I +Capturing subpattern count = 3 +Options: anchored +No first char +No need char + aabbbbaa + 0: aabbbbaa + 1: aa + 2: bbbb + 3: bb + +/--------------------------------------------------------------------/I +Capturing subpattern count = 0 +No options +First char = '-' +Need char = '-' + +/#/IxDZ +------------------------------------------------------------------ + Bra + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +May match empty string +Options: extended +No first char +No need char + +/a#/IxDZ +------------------------------------------------------------------ + Bra + a + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: extended +First char = 'a' +No need char + +/[\s]/DZ +------------------------------------------------------------------ + Bra + [\x09-\x0d ] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +No need char + +/[\S]/DZ +------------------------------------------------------------------ + Bra + [\x00-\x08\x0e-\x1f!-\xff] (neg) + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +No need char + +/a(?i)b/DZ +------------------------------------------------------------------ + Bra + a + /i b + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'b' (caseless) + ab + 0: ab + aB + 0: aB + *** Failers +No match + AB +No match + +/(a(?i)b)/DZ +------------------------------------------------------------------ + Bra + CBra 1 + a + /i b + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +No options +First char = 'a' +Need char = 'b' (caseless) + ab + 0: ab + 1: ab + aB + 0: aB + 1: aB + *** Failers +No match + AB +No match + +/ (?i)abc/IxDZ +------------------------------------------------------------------ + Bra + /i abc + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: extended +First char = 'a' (caseless) +Need char = 'c' (caseless) + +/#this is a comment + (?i)abc/IxDZ +------------------------------------------------------------------ + Bra + /i abc + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: extended +First char = 'a' (caseless) +Need char = 'c' (caseless) + +/123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890/DZ +------------------------------------------------------------------ + Bra + 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +First char = '1' +Need char = '0' + +/\Q123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890/DZ +------------------------------------------------------------------ + Bra + 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +First char = '1' +Need char = '0' + +/\Q\E/DZ +------------------------------------------------------------------ + Bra + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +May match empty string +No options +No first char +No need char + \ + 0: + +/\Q\Ex/DZ +------------------------------------------------------------------ + Bra + x + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +First char = 'x' +No need char + +/ \Q\E/DZ +------------------------------------------------------------------ + Bra + + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +First char = ' ' +No need char + +/a\Q\E/DZ +------------------------------------------------------------------ + Bra + a + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +First char = 'a' +No need char + abc + 0: a + bca + 0: a + bac + 0: a + +/a\Q\Eb/DZ +------------------------------------------------------------------ + Bra + ab + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'b' + abc + 0: ab + +/\Q\Eabc/DZ +------------------------------------------------------------------ + Bra + abc + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'c' + +/x*+\w/DZ +------------------------------------------------------------------ + Bra + x*+ + \w + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +No need char + *** Failers + 0: F + xxxxx +No match + +/x?+/DZ +------------------------------------------------------------------ + Bra + x?+ + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +May match empty string +No options +No first char +No need char + +/x++/DZ +------------------------------------------------------------------ + Bra + x++ + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +First char = 'x' +No need char + +/x{1,3}+/BZO +------------------------------------------------------------------ + Bra + x + x{0,2}+ + Ket + End +------------------------------------------------------------------ + +/x{1,3}+/BZOi +------------------------------------------------------------------ + Bra + /i x + /i x{0,2}+ + Ket + End +------------------------------------------------------------------ + +/[^x]{1,3}+/BZO +------------------------------------------------------------------ + Bra + [^x] + [^x]{0,2}+ + Ket + End +------------------------------------------------------------------ + +/[^x]{1,3}+/BZOi +------------------------------------------------------------------ + Bra + /i [^x] + /i [^x]{0,2}+ + Ket + End +------------------------------------------------------------------ + +/(x)*+/DZ +------------------------------------------------------------------ + Bra + Braposzero + CBraPos 1 + x + KetRpos + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +May match empty string +No options +No first char +No need char + +/^(\w++|\s++)*$/I +Capturing subpattern count = 1 +May match empty string +Options: anchored +No first char +No need char + now is the time for all good men to come to the aid of the party + 0: now is the time for all good men to come to the aid of the party + 1: party + *** Failers +No match + this is not a line with only words and spaces! +No match + +/(\d++)(\w)/I +Capturing subpattern count = 2 +No options +No first char +No need char + 12345a + 0: 12345a + 1: 12345 + 2: a + *** Failers +No match + 12345+ +No match + +/a++b/I +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'b' + aaab + 0: aaab + +/(a++b)/I +Capturing subpattern count = 1 +No options +First char = 'a' +Need char = 'b' + aaab + 0: aaab + 1: aaab + +/(a++)b/I +Capturing subpattern count = 1 +No options +First char = 'a' +Need char = 'b' + aaab + 0: aaab + 1: aaa + +/([^()]++|\([^()]*\))+/I +Capturing subpattern count = 1 +No options +No first char +No need char + ((abc(ade)ufh()()x + 0: abc(ade)ufh()()x + 1: x + +/\(([^()]++|\([^()]+\))+\)/I +Capturing subpattern count = 1 +No options +First char = '(' +Need char = ')' + (abc) + 0: (abc) + 1: abc + (abc(def)xyz) + 0: (abc(def)xyz) + 1: xyz + *** Failers +No match + ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +No match + +/(abc){1,3}+/DZ +------------------------------------------------------------------ + Bra + Once + CBra 1 + abc + Ket + Brazero + Bra + CBra 1 + abc + Ket + Brazero + CBra 1 + abc + Ket + Ket + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +No options +First char = 'a' +Need char = 'c' + +/a+?+/I +Failed: nothing to repeat at offset 3 + +/a{2,3}?+b/I +Failed: nothing to repeat at offset 7 + +/(?U)a+?+/I +Failed: nothing to repeat at offset 7 + +/a{2,3}?+b/IU +Failed: nothing to repeat at offset 7 + +/x(?U)a++b/DZ +------------------------------------------------------------------ + Bra + x + a++ + b + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +First char = 'x' +Need char = 'b' + xaaaab + 0: xaaaab + +/(?U)xa++b/DZ +------------------------------------------------------------------ + Bra + x + a++ + b + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +First char = 'x' +Need char = 'b' + xaaaab + 0: xaaaab + +/^((a+)(?U)([ab]+)(?-U)([bc]+)(\w*))/DZ +------------------------------------------------------------------ + Bra + ^ + CBra 1 + CBra 2 + a+ + Ket + CBra 3 + [ab]+? + Ket + CBra 4 + [bc]+ + Ket + CBra 5 + \w*+ + Ket + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 5 +Options: anchored +No first char +No need char + +/^x(?U)a+b/DZ +------------------------------------------------------------------ + Bra + ^ + x + a++ + b + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +Need char = 'b' + +/^x(?U)(a+)b/DZ +------------------------------------------------------------------ + Bra + ^ + x + CBra 1 + a+? + Ket + b + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Options: anchored +No first char +Need char = 'b' + +/[.x.]/I +Failed: POSIX collating elements are not supported at offset 0 + +/[=x=]/I +Failed: POSIX collating elements are not supported at offset 0 + +/[:x:]/I +Failed: POSIX named classes are supported only within a class at offset 0 + +/\l/I +Failed: PCRE does not support \L, \l, \N{name}, \U, or \u at offset 1 + +/\L/I +Failed: PCRE does not support \L, \l, \N{name}, \U, or \u at offset 1 + +/\N{name}/I +Failed: PCRE does not support \L, \l, \N{name}, \U, or \u at offset 1 + +/\u/I +Failed: PCRE does not support \L, \l, \N{name}, \U, or \u at offset 1 + +/\U/I +Failed: PCRE does not support \L, \l, \N{name}, \U, or \u at offset 1 + +/a{1,3}b/U + ab + 0: ab + +/[/I +Failed: missing terminating ] for character class at offset 1 + +/[a-/I +Failed: missing terminating ] for character class at offset 3 + +/[[:space:]/I +Failed: missing terminating ] for character class at offset 10 + +/[\s]/IDZ +------------------------------------------------------------------ + Bra + [\x09-\x0d ] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +No need char + +/[[:space:]]/IDZ +------------------------------------------------------------------ + Bra + [\x09-\x0d ] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +No need char + +/[[:space:]abcde]/IDZ +------------------------------------------------------------------ + Bra + [\x09-\x0d a-e] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +No need char + +/< (?: (?(R) \d++ | [^<>]*+) | (?R)) * >/Ix +Capturing subpattern count = 0 +Options: extended +First char = '<' +Need char = '>' + <> + 0: <> + + 0: + hij> + 0: hij> + hij> + 0: + def> + 0: def> + + 0: <> + *** Failers +No match + iV\;\?aPhFB\<\*vW\@QW\@sO9\}cfZA\-i\'w\%hKd6gt1UJP\,15_\#QY\$M\^Mss_U\/\]\&LK9\[5vQub\^w\[KDD\qmj\;2\}YWFdYx\.Ap\]hjCPTP\(n28k\+3\;o\&WXqs\/gOXdr\$\:r\'do0\;b4c\(f_Gr\=\"\\4\)\[01T7ajQJvL\$W\~mL_sS\/4h\:x\*\[ZN\=KLs\&L5zX\/\/\>it\,o\:aU\(\;Z\>pW\&T7oP\'2K\^E\:x9\'c\[\%z\-\,64JQ5AeH_G\#KijUKghQw\^\\vea3a\?kka_G\$8\#\`\*kynsxzBLru\'\]k_\[7FrVx\}\^\=\$blx\>s\-N\%j\;D\*aZDnsw\:YKZ\%Q\.Kne9\#hP\?\+b3\(SOvL\,\^\;\&u5\@\?5C5Bhb\=m\-vEh_L15Jl\]U\)0RP6\{q\%L\^_z5E\'Dw6X\b|IDZ +------------------------------------------------------------------ + Bra + 8J$WE<.rX+ix[d1b!H#?vV0vrK:ZH1=2M>iV;?aPhFB<*vW@QW@sO9}cfZA-i'w%hKd6gt1UJP,15_#QY$M^Mss_U/]&LK9[5vQub^w[KDDqmj;2}YWFdYx.Ap]hjCPTP(n28k+3;o&WXqs/gOXdr$:r'do0;b4c(f_Gr="\4)[01T7ajQJvL$W~mL_sS/4h:x*[ZN=KLs&L5zX//>it,o:aU(;Z>pW&T7oP'2K^E:x9'c[%z-,64JQ5AeH_G#KijUKghQw^\vea3a?kka_G$8#`*kynsxzBLru']k_[7FrVx}^=$blx>s-N%j;D*aZDnsw:YKZ%Q.Kne9#hP?+b3(SOvL,^;&u5@?5C5Bhb=m-vEh_L15Jl]U)0RP6{q%L^_z5E'Dw6X + \b + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Max lookbehind = 1 +No options +First char = '8' +Need char = 'X' + +|\$\<\.X\+ix\[d1b\!H\#\?vV0vrK\:ZH1\=2M\>iV\;\?aPhFB\<\*vW\@QW\@sO9\}cfZA\-i\'w\%hKd6gt1UJP\,15_\#QY\$M\^Mss_U\/\]\&LK9\[5vQub\^w\[KDD\qmj\;2\}YWFdYx\.Ap\]hjCPTP\(n28k\+3\;o\&WXqs\/gOXdr\$\:r\'do0\;b4c\(f_Gr\=\"\\4\)\[01T7ajQJvL\$W\~mL_sS\/4h\:x\*\[ZN\=KLs\&L5zX\/\/\>it\,o\:aU\(\;Z\>pW\&T7oP\'2K\^E\:x9\'c\[\%z\-\,64JQ5AeH_G\#KijUKghQw\^\\vea3a\?kka_G\$8\#\`\*kynsxzBLru\'\]k_\[7FrVx\}\^\=\$blx\>s\-N\%j\;D\*aZDnsw\:YKZ\%Q\.Kne9\#hP\?\+b3\(SOvL\,\^\;\&u5\@\?5C5Bhb\=m\-vEh_L15Jl\]U\)0RP6\{q\%L\^_z5E\'Dw6X\b|IDZ +------------------------------------------------------------------ + Bra + $<.X+ix[d1b!H#?vV0vrK:ZH1=2M>iV;?aPhFB<*vW@QW@sO9}cfZA-i'w%hKd6gt1UJP,15_#QY$M^Mss_U/]&LK9[5vQub^w[KDDqmj;2}YWFdYx.Ap]hjCPTP(n28k+3;o&WXqs/gOXdr$:r'do0;b4c(f_Gr="\4)[01T7ajQJvL$W~mL_sS/4h:x*[ZN=KLs&L5zX//>it,o:aU(;Z>pW&T7oP'2K^E:x9'c[%z-,64JQ5AeH_G#KijUKghQw^\vea3a?kka_G$8#`*kynsxzBLru']k_[7FrVx}^=$blx>s-N%j;D*aZDnsw:YKZ%Q.Kne9#hP?+b3(SOvL,^;&u5@?5C5Bhb=m-vEh_L15Jl]U)0RP6{q%L^_z5E'Dw6X + \b + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Max lookbehind = 1 +No options +First char = '$' +Need char = 'X' + +/(.*)\d+\1/I +Capturing subpattern count = 1 +Max back reference = 1 +No options +No first char +No need char + +/(.*)\d+/I +Capturing subpattern count = 1 +No options +First char at start or follows newline +No need char + +/(.*)\d+\1/Is +Capturing subpattern count = 1 +Max back reference = 1 +Options: dotall +No first char +No need char + +/(.*)\d+/Is +Capturing subpattern count = 1 +Options: anchored dotall +No first char +No need char + +/(.*(xyz))\d+\2/I +Capturing subpattern count = 2 +Max back reference = 2 +No options +First char at start or follows newline +Need char = 'z' + +/((.*))\d+\1/I +Capturing subpattern count = 2 +Max back reference = 1 +No options +No first char +No need char + abc123bc + 0: bc123bc + 1: bc + 2: bc + +/a[b]/I +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'b' + +/(?=a).*/I +Capturing subpattern count = 0 +May match empty string +No options +First char = 'a' +No need char + +/(?=abc).xyz/IiI +Capturing subpattern count = 0 +Options: caseless +First char = 'a' (caseless) +Need char = 'z' (caseless) + +/(?=abc)(?i).xyz/I +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'z' (caseless) + +/(?=a)(?=b)/I +Capturing subpattern count = 0 +May match empty string +No options +First char = 'a' +No need char + +/(?=.)a/I +Capturing subpattern count = 0 +No options +First char = 'a' +No need char + +/((?=abcda)a)/I +Capturing subpattern count = 1 +No options +First char = 'a' +Need char = 'a' + +/((?=abcda)ab)/I +Capturing subpattern count = 1 +No options +First char = 'a' +Need char = 'b' + +/()a/I +Capturing subpattern count = 1 +No options +No first char +Need char = 'a' + +/(?(1)ab|ac)(.)/I +Capturing subpattern count = 1 +Max back reference = 1 +No options +First char = 'a' +No need char + +/(?(1)abz|acz)(.)/I +Capturing subpattern count = 1 +Max back reference = 1 +No options +First char = 'a' +Need char = 'z' + +/(?(1)abz)(.)/I +Capturing subpattern count = 1 +Max back reference = 1 +No options +No first char +No need char + +/(?(1)abz)(1)23/I +Capturing subpattern count = 1 +Max back reference = 1 +No options +No first char +Need char = '3' + +/(a)+/I +Capturing subpattern count = 1 +No options +First char = 'a' +No need char + +/(a){2,3}/I +Capturing subpattern count = 1 +No options +First char = 'a' +Need char = 'a' + +/(a)*/I +Capturing subpattern count = 1 +May match empty string +No options +No first char +No need char + +/[a]/I +Capturing subpattern count = 0 +No options +First char = 'a' +No need char + +/[ab]/I +Capturing subpattern count = 0 +No options +No first char +No need char + +/[ab]/IS +Capturing subpattern count = 0 +No options +No first char +No need char +Subject length lower bound = 1 +Starting chars: a b + +/[^a]/I +Capturing subpattern count = 0 +No options +No first char +No need char + +/\d456/I +Capturing subpattern count = 0 +No options +No first char +Need char = '6' + +/\d456/IS +Capturing subpattern count = 0 +No options +No first char +Need char = '6' +Subject length lower bound = 4 +Starting chars: 0 1 2 3 4 5 6 7 8 9 + +/a^b/I +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'b' + +/^a/Im +Capturing subpattern count = 0 +Options: multiline +First char at start or follows newline +Need char = 'a' + abcde + 0: a + xy\nabc + 0: a + *** Failers +No match + xyabc +No match + +/c|abc/I +Capturing subpattern count = 0 +No options +No first char +Need char = 'c' + +/(?i)[ab]/IS +Capturing subpattern count = 0 +No options +No first char +No need char +Subject length lower bound = 1 +Starting chars: A B a b + +/[ab](?i)cd/IS +Capturing subpattern count = 0 +No options +No first char +Need char = 'd' (caseless) +Subject length lower bound = 3 +Starting chars: a b + +/abc(?C)def/I +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'f' + abcdef +--->abcdef + 0 ^ ^ d + 0: abcdef + 1234abcdef +--->1234abcdef + 0 ^ ^ d + 0: abcdef + *** Failers +No match + abcxyz +No match + abcxyzf +--->abcxyzf + 0 ^ ^ d +No match + +/abc(?C)de(?C1)f/I +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'f' + 123abcdef +--->123abcdef + 0 ^ ^ d + 1 ^ ^ f + 0: abcdef + +/(?C1)\dabc(?C2)def/IS +Capturing subpattern count = 0 +No options +No first char +Need char = 'f' +Subject length lower bound = 7 +Starting chars: 0 1 2 3 4 5 6 7 8 9 + 1234abcdef +--->1234abcdef + 1 ^ \d + 1 ^ \d + 1 ^ \d + 1 ^ \d + 2 ^ ^ d + 0: 4abcdef + *** Failers +No match + abcdef +No match + +/(?C1)\dabc(?C2)def/ISS +Capturing subpattern count = 0 +No options +No first char +Need char = 'f' + 1234abcdef +--->1234abcdef + 1 ^ \d + 1 ^ \d + 1 ^ \d + 1 ^ \d + 2 ^ ^ d + 0: 4abcdef + *** Failers +No match + abcdef +--->abcdef + 1 ^ \d + 1 ^ \d + 1 ^ \d + 1 ^ \d + 1 ^ \d + 1 ^ \d +No match + +/(?C255)ab/I +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'b' + +/(?C256)ab/I +Failed: number after (?C is > 255 at offset 6 + +/(?Cab)xx/I +Failed: closing ) for (?C expected at offset 3 + +/(?C12vr)x/I +Failed: closing ) for (?C expected at offset 5 + +/abc(?C)def/I +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'f' + *** Failers +No match + \x83\x0\x61bcdef +--->\x83\x00abcdef + 0 ^ ^ d + 0: abcdef + +/(abc)(?C)de(?C1)f/I +Capturing subpattern count = 1 +No options +First char = 'a' +Need char = 'f' + 123abcdef +--->123abcdef + 0 ^ ^ d + 1 ^ ^ f + 0: abcdef + 1: abc + 123abcdef\C+ +Callout 0: last capture = 1 + 0: + 1: abc +--->123abcdef + ^ ^ d +Callout 1: last capture = 1 + 0: + 1: abc +--->123abcdef + ^ ^ f + 0: abcdef + 1: abc + 123abcdef\C- + 0: abcdef + 1: abc + *** Failers +No match + 123abcdef\C!1 +--->123abcdef + 0 ^ ^ d + 1 ^ ^ f +No match + +/(?C0)(abc(?C1))*/I +Capturing subpattern count = 1 +May match empty string +No options +No first char +No need char + abcabcabc +--->abcabcabc + 0 ^ (abc(?C1))* + 1 ^ ^ ) + 1 ^ ^ ) + 1 ^ ^ ) + 0: abcabcabc + 1: abc + abcabc\C!1!3 +--->abcabc + 0 ^ (abc(?C1))* + 1 ^ ^ ) + 1 ^ ^ ) + 0: abcabc + 1: abc + *** Failers +--->*** Failers + 0 ^ (abc(?C1))* + 0: + abcabcabc\C!1!3 +--->abcabcabc + 0 ^ (abc(?C1))* + 1 ^ ^ ) + 1 ^ ^ ) + 1 ^ ^ ) + 0: abcabc + 1: abc + +/(\d{3}(?C))*/I +Capturing subpattern count = 1 +May match empty string +No options +No first char +No need char + 123\C+ +Callout 0: last capture = -1 + 0: +--->123 + ^ ^ ) + 0: 123 + 1: 123 + 123456\C+ +Callout 0: last capture = -1 + 0: +--->123456 + ^ ^ ) +Callout 0: last capture = 1 + 0: + 1: 123 +--->123456 + ^ ^ ) + 0: 123456 + 1: 456 + 123456789\C+ +Callout 0: last capture = -1 + 0: +--->123456789 + ^ ^ ) +Callout 0: last capture = 1 + 0: + 1: 123 +--->123456789 + ^ ^ ) +Callout 0: last capture = 1 + 0: + 1: 456 +--->123456789 + ^ ^ ) + 0: 123456789 + 1: 789 + +/((xyz)(?C)p|(?C1)xyzabc)/I +Capturing subpattern count = 2 +No options +First char = 'x' +No need char + xyzabc\C+ +Callout 0: last capture = 2 + 0: + 1: + 2: xyz +--->xyzabc + ^ ^ p +Callout 1: last capture = -1 + 0: +--->xyzabc + ^ x + 0: xyzabc + 1: xyzabc + +/(X)((xyz)(?C)p|(?C1)xyzabc)/I +Capturing subpattern count = 3 +No options +First char = 'X' +Need char = 'x' + Xxyzabc\C+ +Callout 0: last capture = 3 + 0: + 1: X + 2: + 3: xyz +--->Xxyzabc + ^ ^ p +Callout 1: last capture = 1 + 0: + 1: X +--->Xxyzabc + ^^ x + 0: Xxyzabc + 1: X + 2: xyzabc + +/(?=(abc))(?C)abcdef/I +Capturing subpattern count = 1 +No options +First char = 'a' +Need char = 'f' + abcdef\C+ +Callout 0: last capture = 1 + 0: + 1: abc +--->abcdef + ^ a + 0: abcdef + 1: abc + +/(?!(abc)(?C1)d)(?C2)abcxyz/I +Capturing subpattern count = 1 +No options +First char = 'a' +Need char = 'z' + abcxyz\C+ +Callout 1: last capture = 1 + 0: + 1: abc +--->abcxyz + ^ ^ d +Callout 2: last capture = -1 + 0: +--->abcxyz + ^ a + 0: abcxyz + +/(?<=(abc)(?C))xyz/I +Capturing subpattern count = 1 +Max lookbehind = 3 +No options +First char = 'x' +Need char = 'z' + abcxyz\C+ +Callout 0: last capture = 1 + 0: + 1: abc +--->abcxyz + ^ ) + 0: xyz + 1: abc + +/a(b+)(c*)(?C1)/I +Capturing subpattern count = 2 +No options +First char = 'a' +Need char = 'b' + abbbbbccc\C*1 +--->abbbbbccc + 1 ^ ^ +Callout data = 1 +No match + +/a(b+?)(c*?)(?C1)/I +Capturing subpattern count = 2 +No options +First char = 'a' +Need char = 'b' + abbbbbccc\C*1 +--->abbbbbccc + 1 ^ ^ +Callout data = 1 + 1 ^ ^ +Callout data = 1 + 1 ^ ^ +Callout data = 1 + 1 ^ ^ +Callout data = 1 + 1 ^ ^ +Callout data = 1 + 1 ^ ^ +Callout data = 1 + 1 ^ ^ +Callout data = 1 + 1 ^ ^ +Callout data = 1 +No match + +/(?C)abc/I +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'c' + +/(?C)^abc/I +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/(?C)a|b/IS +Capturing subpattern count = 0 +No options +No first char +No need char +Subject length lower bound = 1 +Starting chars: a b + +/(?R)/I +Failed: recursive call could loop indefinitely at offset 3 + +/(a|(?R))/I +Failed: recursive call could loop indefinitely at offset 6 + +/(ab|(bc|(de|(?R))))/I +Failed: recursive call could loop indefinitely at offset 15 + +/x(ab|(bc|(de|(?R))))/I +Capturing subpattern count = 3 +No options +First char = 'x' +No need char + xab + 0: xab + 1: ab + xbc + 0: xbc + 1: bc + 2: bc + xde + 0: xde + 1: de + 2: de + 3: de + xxab + 0: xxab + 1: xab + 2: xab + 3: xab + xxxab + 0: xxxab + 1: xxab + 2: xxab + 3: xxab + *** Failers +No match + xyab +No match + +/(ab|(bc|(de|(?1))))/I +Failed: recursive call could loop indefinitely at offset 15 + +/x(ab|(bc|(de|(?1)x)x)x)/I +Failed: recursive call could loop indefinitely at offset 16 + +/^([^()]|\((?1)*\))*$/I +Capturing subpattern count = 1 +May match empty string +Options: anchored +No first char +No need char + abc + 0: abc + 1: c + a(b)c + 0: a(b)c + 1: c + a(b(c))d + 0: a(b(c))d + 1: d + *** Failers) +No match + a(b(c)d +No match + +/^>abc>([^()]|\((?1)*\))*abc>123abc>123abc>1(2)3abc>1(2)3abc>(1(2)3)abc>(1(2)3)]*+) | (?2)) * >))/Ix +Capturing subpattern count = 2 +Options: extended +First char = '<' +Need char = '>' + <> + 0: <> + 1: <> + 2: <> + + 0: + 1: + 2: + hij> + 0: hij> + 1: hij> + 2: hij> + hij> + 0: + 1: + 2: + def> + 0: def> + 1: def> + 2: def> + + 0: <> + 1: <> + 2: <> + *** Failers +No match + b|c)d(?Pe)/DZ +------------------------------------------------------------------ + Bra + a + CBra 1 + b + Alt + c + Ket + d + CBra 2 + e + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 2 +Named capturing subpatterns: + longername2 2 + name1 1 +No options +First char = 'a' +Need char = 'e' + abde + 0: abde + 1: b + 2: e + acde + 0: acde + 1: c + 2: e + +/(?:a(?Pc(?Pd)))(?Pa)/DZ +------------------------------------------------------------------ + Bra + Bra + a + CBra 1 + c + CBra 2 + d + Ket + Ket + Ket + CBra 3 + a + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 3 +Named capturing subpatterns: + a 3 + c 1 + d 2 +No options +First char = 'a' +Need char = 'a' + +/(?Pa)...(?P=a)bbb(?P>a)d/DZ +------------------------------------------------------------------ + Bra + CBra 1 + a + Ket + Any + Any + Any + \1 + bbb + Recurse + d + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Max back reference = 1 +Named capturing subpatterns: + a 1 +No options +First char = 'a' +Need char = 'd' + +/^\W*(?:(?P(?P.)\W*(?P>one)\W*(?P=two)|)|(?P(?P.)\W*(?P>three)\W*(?P=four)|\W*.\W*))\W*$/Ii +Capturing subpattern count = 4 +Max back reference = 4 +Named capturing subpatterns: + four 4 + one 1 + three 3 + two 2 +May match empty string +Options: anchored caseless +No first char +No need char + 1221 + 0: 1221 + 1: 1221 + 2: 1 + Satan, oscillate my metallic sonatas! + 0: Satan, oscillate my metallic sonatas! + 1: + 2: + 3: Satan, oscillate my metallic sonatas + 4: S + A man, a plan, a canal: Panama! + 0: A man, a plan, a canal: Panama! + 1: + 2: + 3: A man, a plan, a canal: Panama + 4: A + Able was I ere I saw Elba. + 0: Able was I ere I saw Elba. + 1: + 2: + 3: Able was I ere I saw Elba + 4: A + *** Failers +No match + The quick brown fox +No match + +/((?(R)a|b))\1(?1)?/I +Capturing subpattern count = 1 +Max back reference = 1 +No options +No first char +No need char + bb + 0: bb + 1: b + bbaa + 0: bba + 1: b + +/(.*)a/Is +Capturing subpattern count = 1 +Options: anchored dotall +No first char +Need char = 'a' + +/(.*)a\1/Is +Capturing subpattern count = 1 +Max back reference = 1 +Options: dotall +No first char +Need char = 'a' + +/(.*)a(b)\2/Is +Capturing subpattern count = 2 +Max back reference = 2 +Options: anchored dotall +No first char +Need char = 'b' + +/((.*)a|(.*)b)z/Is +Capturing subpattern count = 3 +Options: anchored dotall +No first char +Need char = 'z' + +/((.*)a|(.*)b)z\1/Is +Capturing subpattern count = 3 +Max back reference = 1 +Options: dotall +No first char +Need char = 'z' + +/((.*)a|(.*)b)z\2/Is +Capturing subpattern count = 3 +Max back reference = 2 +Options: dotall +No first char +Need char = 'z' + +/((.*)a|(.*)b)z\3/Is +Capturing subpattern count = 3 +Max back reference = 3 +Options: dotall +No first char +Need char = 'z' + +/((.*)a|^(.*)b)z\3/Is +Capturing subpattern count = 3 +Max back reference = 3 +Options: anchored dotall +No first char +Need char = 'z' + +/(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)a/Is +Capturing subpattern count = 31 +May match empty string +Options: anchored dotall +No first char +No need char + +/(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)a\31/Is +Capturing subpattern count = 31 +Max back reference = 31 +May match empty string +Options: dotall +No first char +No need char + +/(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)a\32/Is +Capturing subpattern count = 32 +Max back reference = 32 +May match empty string +Options: dotall +No first char +No need char + +/(a)(bc)/INDZ +------------------------------------------------------------------ + Bra + Bra + a + Ket + Bra + bc + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: no_auto_capture +First char = 'a' +Need char = 'c' + abc + 0: abc + +/(?Pa)(bc)/INDZ +------------------------------------------------------------------ + Bra + CBra 1 + a + Ket + Bra + bc + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Named capturing subpatterns: + one 1 +Options: no_auto_capture +First char = 'a' +Need char = 'c' + abc + 0: abc + 1: a + +/(a)(?Pbc)/INDZ +------------------------------------------------------------------ + Bra + Bra + a + Ket + CBra 1 + bc + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Named capturing subpatterns: + named 1 +Options: no_auto_capture +First char = 'a' +Need char = 'c' + +/(a+)*zz/I +Capturing subpattern count = 1 +No options +No first char +Need char = 'z' + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazzbbbbbb\M +Minimum match() limit = 8 +Minimum match() recursion limit = 6 + 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazz + 1: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaz\M +Minimum match() limit = 32768 +Minimum match() recursion limit = 29 +No match + +/(aaa(?C1)bbb|ab)/I +Capturing subpattern count = 1 +No options +First char = 'a' +Need char = 'b' + aaabbb +--->aaabbb + 1 ^ ^ b + 0: aaabbb + 1: aaabbb + aaabbb\C*0 +--->aaabbb + 1 ^ ^ b + 0: aaabbb + 1: aaabbb + aaabbb\C*1 +--->aaabbb + 1 ^ ^ b +Callout data = 1 + 0: ab + 1: ab + aaabbb\C*-1 +--->aaabbb + 1 ^ ^ b +Callout data = -1 +No match + +/ab(?Pcd)ef(?Pgh)/I +Capturing subpattern count = 2 +Named capturing subpatterns: + one 1 + two 2 +No options +First char = 'a' +Need char = 'h' + abcdefgh + 0: abcdefgh + 1: cd + 2: gh + abcdefgh\C1\Gtwo + 0: abcdefgh + 1: cd + 2: gh + 1C cd (2) + G gh (2) two + abcdefgh\Cone\Ctwo + 0: abcdefgh + 1: cd + 2: gh + C cd (2) one + C gh (2) two + abcdefgh\Cthree +no parentheses with name "three" + 0: abcdefgh + 1: cd + 2: gh +copy substring three failed -7 + +/(?P)(?P)/DZ +------------------------------------------------------------------ + Bra + CBra 1 + Ket + CBra 2 + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 2 +Named capturing subpatterns: + Tes 1 + Test 2 +May match empty string +No options +No first char +No need char + +/(?P)(?P)/DZ +------------------------------------------------------------------ + Bra + CBra 1 + Ket + CBra 2 + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 2 +Named capturing subpatterns: + Tes 2 + Test 1 +May match empty string +No options +No first char +No need char + +/(?Pzz)(?Paa)/I +Capturing subpattern count = 2 +Named capturing subpatterns: + A 2 + Z 1 +No options +First char = 'z' +Need char = 'a' + zzaa\CZ + 0: zzaa + 1: zz + 2: aa + C zz (2) Z + zzaa\CA + 0: zzaa + 1: zz + 2: aa + C aa (2) A + +/(?Peks)(?Peccs)/I +Failed: two named subpatterns have the same name at offset 15 + +/(?Pabc(?Pdef)(?Pxyz))/I +Failed: two named subpatterns have the same name at offset 30 + +"\[((?P\d+)(,(?P>elem))*)\]"I +Capturing subpattern count = 3 +Named capturing subpatterns: + elem 2 +No options +First char = '[' +Need char = ']' + [10,20,30,5,5,4,4,2,43,23,4234] + 0: [10,20,30,5,5,4,4,2,43,23,4234] + 1: 10,20,30,5,5,4,4,2,43,23,4234 + 2: 10 + 3: ,4234 + *** Failers +No match + [] +No match + +"\[((?P\d+)(,(?P>elem))*)?\]"I +Capturing subpattern count = 3 +Named capturing subpatterns: + elem 2 +No options +First char = '[' +Need char = ']' + [10,20,30,5,5,4,4,2,43,23,4234] + 0: [10,20,30,5,5,4,4,2,43,23,4234] + 1: 10,20,30,5,5,4,4,2,43,23,4234 + 2: 10 + 3: ,4234 + [] + 0: [] + +/(a(b(?2)c))?/DZ +------------------------------------------------------------------ + Bra + Brazero + CBra 1 + a + CBra 2 + b + Recurse + c + Ket + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 2 +May match empty string +No options +No first char +No need char + +/(a(b(?2)c))*/DZ +------------------------------------------------------------------ + Bra + Brazero + CBra 1 + a + CBra 2 + b + Recurse + c + Ket + KetRmax + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 2 +May match empty string +No options +No first char +No need char + +/(a(b(?2)c)){0,2}/DZ +------------------------------------------------------------------ + Bra + Brazero + Bra + CBra 1 + a + CBra 2 + b + Recurse + c + Ket + Ket + Brazero + CBra 1 + a + CBra 2 + b + Recurse + c + Ket + Ket + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 2 +May match empty string +No options +No first char +No need char + +/[ab]{1}+/DZ +------------------------------------------------------------------ + Bra + [ab]{1,1}+ + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +No need char + +/((w\/|-|with)*(free|immediate)*.*?shipping\s*[!.-]*)/Ii +Capturing subpattern count = 3 +Options: caseless +No first char +Need char = 'g' (caseless) + Baby Bjorn Active Carrier - With free SHIPPING!! + 0: Baby Bjorn Active Carrier - With free SHIPPING!! + 1: Baby Bjorn Active Carrier - With free SHIPPING!! + +/((w\/|-|with)*(free|immediate)*.*?shipping\s*[!.-]*)/IiS +Capturing subpattern count = 3 +Options: caseless +No first char +Need char = 'g' (caseless) +Subject length lower bound = 8 +No starting char list + Baby Bjorn Active Carrier - With free SHIPPING!! + 0: Baby Bjorn Active Carrier - With free SHIPPING!! + 1: Baby Bjorn Active Carrier - With free SHIPPING!! + +/a*.*b/ISDZ +------------------------------------------------------------------ + Bra + a* + Any* + b + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +Need char = 'b' +Subject length lower bound = 1 +No starting char list + +/(a|b)*.?c/ISDZ +------------------------------------------------------------------ + Bra + Brazero + CBra 1 + a + Alt + b + KetRmax + Any? + c + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +No options +No first char +Need char = 'c' +Subject length lower bound = 1 +No starting char list + +/abc(?C255)de(?C)f/DZ +------------------------------------------------------------------ + Bra + abc + Callout 255 10 1 + de + Callout 0 16 1 + f + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'f' + +/abcde/ICDZ +------------------------------------------------------------------ + Bra + Callout 255 0 1 + a + Callout 255 1 1 + b + Callout 255 2 1 + c + Callout 255 3 1 + d + Callout 255 4 1 + e + Callout 255 5 0 + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: +First char = 'a' +Need char = 'e' + abcde +--->abcde + +0 ^ a + +1 ^^ b + +2 ^ ^ c + +3 ^ ^ d + +4 ^ ^ e + +5 ^ ^ + 0: abcde + abcdfe +--->abcdfe + +0 ^ a + +1 ^^ b + +2 ^ ^ c + +3 ^ ^ d + +4 ^ ^ e +No match + +/a*b/ICDZS +------------------------------------------------------------------ + Bra + Callout 255 0 2 + a*+ + Callout 255 2 1 + b + Callout 255 3 0 + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: +No first char +Need char = 'b' +Subject length lower bound = 1 +Starting chars: a b + ab +--->ab + +0 ^ a* + +2 ^^ b + +3 ^ ^ + 0: ab + aaaab +--->aaaab + +0 ^ a* + +2 ^ ^ b + +3 ^ ^ + 0: aaaab + aaaacb +--->aaaacb + +0 ^ a* + +2 ^ ^ b + +0 ^ a* + +2 ^ ^ b + +0 ^ a* + +2 ^ ^ b + +0 ^ a* + +2 ^^ b + +0 ^ a* + +2 ^ b + +3 ^^ + 0: b + +/a*b/ICDZSS +------------------------------------------------------------------ + Bra + Callout 255 0 2 + a*+ + Callout 255 2 1 + b + Callout 255 3 0 + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: +No first char +Need char = 'b' + ab +--->ab + +0 ^ a* + +2 ^^ b + +3 ^ ^ + 0: ab + aaaab +--->aaaab + +0 ^ a* + +2 ^ ^ b + +3 ^ ^ + 0: aaaab + aaaacb +--->aaaacb + +0 ^ a* + +2 ^ ^ b + +0 ^ a* + +2 ^ ^ b + +0 ^ a* + +2 ^ ^ b + +0 ^ a* + +2 ^^ b + +0 ^ a* + +2 ^ b + +0 ^ a* + +2 ^ b + +3 ^^ + 0: b + +/a+b/ICDZ +------------------------------------------------------------------ + Bra + Callout 255 0 2 + a++ + Callout 255 2 1 + b + Callout 255 3 0 + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: +First char = 'a' +Need char = 'b' + ab +--->ab + +0 ^ a+ + +2 ^^ b + +3 ^ ^ + 0: ab + aaaab +--->aaaab + +0 ^ a+ + +2 ^ ^ b + +3 ^ ^ + 0: aaaab + aaaacb +--->aaaacb + +0 ^ a+ + +2 ^ ^ b + +0 ^ a+ + +2 ^ ^ b + +0 ^ a+ + +2 ^ ^ b + +0 ^ a+ + +2 ^^ b +No match + +/(abc|def)x/ICDZS +------------------------------------------------------------------ + Bra + Callout 255 0 9 + CBra 1 + Callout 255 1 1 + a + Callout 255 2 1 + b + Callout 255 3 1 + c + Callout 255 4 0 + Alt + Callout 255 5 1 + d + Callout 255 6 1 + e + Callout 255 7 1 + f + Callout 255 8 0 + Ket + Callout 255 9 1 + x + Callout 255 10 0 + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Options: +No first char +Need char = 'x' +Subject length lower bound = 4 +Starting chars: a d + abcx +--->abcx + +0 ^ (abc|def) + +1 ^ a + +2 ^^ b + +3 ^ ^ c + +4 ^ ^ | + +9 ^ ^ x ++10 ^ ^ + 0: abcx + 1: abc + defx +--->defx + +0 ^ (abc|def) + +1 ^ a + +5 ^ d + +6 ^^ e + +7 ^ ^ f + +8 ^ ^ ) + +9 ^ ^ x ++10 ^ ^ + 0: defx + 1: def + ** Failers +No match + abcdefzx +--->abcdefzx + +0 ^ (abc|def) + +1 ^ a + +2 ^^ b + +3 ^ ^ c + +4 ^ ^ | + +9 ^ ^ x + +5 ^ d + +0 ^ (abc|def) + +1 ^ a + +5 ^ d + +6 ^^ e + +7 ^ ^ f + +8 ^ ^ ) + +9 ^ ^ x +No match + +/(abc|def)x/ICDZSS +------------------------------------------------------------------ + Bra + Callout 255 0 9 + CBra 1 + Callout 255 1 1 + a + Callout 255 2 1 + b + Callout 255 3 1 + c + Callout 255 4 0 + Alt + Callout 255 5 1 + d + Callout 255 6 1 + e + Callout 255 7 1 + f + Callout 255 8 0 + Ket + Callout 255 9 1 + x + Callout 255 10 0 + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Options: +No first char +Need char = 'x' + abcx +--->abcx + +0 ^ (abc|def) + +1 ^ a + +2 ^^ b + +3 ^ ^ c + +4 ^ ^ | + +9 ^ ^ x ++10 ^ ^ + 0: abcx + 1: abc + defx +--->defx + +0 ^ (abc|def) + +1 ^ a + +5 ^ d + +6 ^^ e + +7 ^ ^ f + +8 ^ ^ ) + +9 ^ ^ x ++10 ^ ^ + 0: defx + 1: def + ** Failers +No match + abcdefzx +--->abcdefzx + +0 ^ (abc|def) + +1 ^ a + +2 ^^ b + +3 ^ ^ c + +4 ^ ^ | + +9 ^ ^ x + +5 ^ d + +0 ^ (abc|def) + +1 ^ a + +5 ^ d + +0 ^ (abc|def) + +1 ^ a + +5 ^ d + +0 ^ (abc|def) + +1 ^ a + +5 ^ d + +6 ^^ e + +7 ^ ^ f + +8 ^ ^ ) + +9 ^ ^ x + +0 ^ (abc|def) + +1 ^ a + +5 ^ d + +0 ^ (abc|def) + +1 ^ a + +5 ^ d + +0 ^ (abc|def) + +1 ^ a + +5 ^ d + +0 ^ (abc|def) + +1 ^ a + +5 ^ d +No match + +/(ab|cd){3,4}/IC +Capturing subpattern count = 1 +Options: +No first char +No need char + ababab +--->ababab + +0 ^ (ab|cd){3,4} + +1 ^ a + +2 ^^ b + +3 ^ ^ | + +1 ^ ^ a + +2 ^ ^ b + +3 ^ ^ | + +1 ^ ^ a + +2 ^ ^ b + +3 ^ ^ | + +1 ^ ^ a + +4 ^ ^ c ++12 ^ ^ + 0: ababab + 1: ab + abcdabcd +--->abcdabcd + +0 ^ (ab|cd){3,4} + +1 ^ a + +2 ^^ b + +3 ^ ^ | + +1 ^ ^ a + +4 ^ ^ c + +5 ^ ^ d + +6 ^ ^ ) + +1 ^ ^ a + +2 ^ ^ b + +3 ^ ^ | + +1 ^ ^ a + +4 ^ ^ c + +5 ^ ^ d + +6 ^ ^ ) ++12 ^ ^ + 0: abcdabcd + 1: cd + abcdcdcdcdcd +--->abcdcdcdcdcd + +0 ^ (ab|cd){3,4} + +1 ^ a + +2 ^^ b + +3 ^ ^ | + +1 ^ ^ a + +4 ^ ^ c + +5 ^ ^ d + +6 ^ ^ ) + +1 ^ ^ a + +4 ^ ^ c + +5 ^ ^ d + +6 ^ ^ ) + +1 ^ ^ a + +4 ^ ^ c + +5 ^ ^ d + +6 ^ ^ ) ++12 ^ ^ + 0: abcdcdcd + 1: cd + +/([ab]{,4}c|xy)/ICDZS +------------------------------------------------------------------ + Bra + Callout 255 0 14 + CBra 1 + Callout 255 1 4 + [ab] + Callout 255 5 1 + { + Callout 255 6 1 + , + Callout 255 7 1 + 4 + Callout 255 8 1 + } + Callout 255 9 1 + c + Callout 255 10 0 + Alt + Callout 255 11 1 + x + Callout 255 12 1 + y + Callout 255 13 0 + Ket + Callout 255 14 0 + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Options: +No first char +No need char +Subject length lower bound = 2 +Starting chars: a b x + Note: that { does NOT introduce a quantifier +--->Note: that { does NOT introduce a quantifier + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] + +5 ^^ { ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] + +5 ^^ { ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] + +5 ^^ { ++11 ^ x +No match + +/([ab]{,4}c|xy)/ICDZSS +------------------------------------------------------------------ + Bra + Callout 255 0 14 + CBra 1 + Callout 255 1 4 + [ab] + Callout 255 5 1 + { + Callout 255 6 1 + , + Callout 255 7 1 + 4 + Callout 255 8 1 + } + Callout 255 9 1 + c + Callout 255 10 0 + Alt + Callout 255 11 1 + x + Callout 255 12 1 + y + Callout 255 13 0 + Ket + Callout 255 14 0 + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Options: +No first char +No need char + Note: that { does NOT introduce a quantifier +--->Note: that { does NOT introduce a quantifier + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] + +5 ^^ { ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] + +5 ^^ { ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] + +5 ^^ { ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x + +0 ^ ([ab]{,4}c|xy) + +1 ^ [ab] ++11 ^ x +No match + +/([ab]{1,4}c|xy){4,5}?123/ICDZ +------------------------------------------------------------------ + Bra + Callout 255 0 21 + CBra 1 + Callout 255 1 9 + [ab]{1,4}+ + Callout 255 10 1 + c + Callout 255 11 0 + Alt + Callout 255 12 1 + x + Callout 255 13 1 + y + Callout 255 14 0 + Ket + CBra 1 + Callout 255 1 9 + [ab]{1,4}+ + Callout 255 10 1 + c + Callout 255 11 0 + Alt + Callout 255 12 1 + x + Callout 255 13 1 + y + Callout 255 14 0 + Ket + CBra 1 + Callout 255 1 9 + [ab]{1,4}+ + Callout 255 10 1 + c + Callout 255 11 0 + Alt + Callout 255 12 1 + x + Callout 255 13 1 + y + Callout 255 14 0 + Ket + CBra 1 + Callout 255 1 9 + [ab]{1,4}+ + Callout 255 10 1 + c + Callout 255 11 0 + Alt + Callout 255 12 1 + x + Callout 255 13 1 + y + Callout 255 14 0 + Ket + Braminzero + CBra 1 + Callout 255 1 9 + [ab]{1,4}+ + Callout 255 10 1 + c + Callout 255 11 0 + Alt + Callout 255 12 1 + x + Callout 255 13 1 + y + Callout 255 14 0 + Ket + Callout 255 21 1 + 1 + Callout 255 22 1 + 2 + Callout 255 23 1 + 3 + Callout 255 24 0 + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Options: +No first char +Need char = '3' + aacaacaacaacaac123 +--->aacaacaacaacaac123 + +0 ^ ([ab]{1,4}c|xy){4,5}? + +1 ^ [ab]{1,4} ++10 ^ ^ c ++11 ^ ^ | + +1 ^ ^ [ab]{1,4} ++10 ^ ^ c ++11 ^ ^ | + +1 ^ ^ [ab]{1,4} ++10 ^ ^ c ++11 ^ ^ | + +1 ^ ^ [ab]{1,4} ++10 ^ ^ c ++11 ^ ^ | ++21 ^ ^ 1 + +1 ^ ^ [ab]{1,4} ++10 ^ ^ c ++11 ^ ^ | ++21 ^ ^ 1 ++22 ^ ^ 2 ++23 ^ ^ 3 ++24 ^ ^ + 0: aacaacaacaacaac123 + 1: aac + +/\b.*/I +Capturing subpattern count = 0 +Max lookbehind = 1 +May match empty string +No options +No first char +No need char + ab cd\>1 + 0: cd + +/\b.*/Is +Capturing subpattern count = 0 +Max lookbehind = 1 +May match empty string +Options: dotall +No first char +No need char + ab cd\>1 + 0: cd + +/(?!.bcd).*/I +Capturing subpattern count = 0 +May match empty string +No options +No first char +No need char + Xbcd12345 + 0: bcd12345 + +/abcde/I +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'e' + ab\P +Partial match: ab + abc\P +Partial match: abc + abcd\P +Partial match: abcd + abcde\P + 0: abcde + the quick brown abc\P +Partial match: abc + ** Failers\P +No match + the quick brown abxyz fox\P +No match + +"^(0?[1-9]|[12][0-9]|3[01])/(0?[1-9]|1[012])/(20)?\d\d$"I +Capturing subpattern count = 3 +Options: anchored +No first char +Need char = '/' + 13/05/04\P + 0: 13/05/04 + 1: 13 + 2: 05 + 13/5/2004\P + 0: 13/5/2004 + 1: 13 + 2: 5 + 3: 20 + 02/05/09\P + 0: 02/05/09 + 1: 02 + 2: 05 + 1\P +Partial match: 1 + 1/2\P +Partial match: 1/2 + 1/2/0\P +Partial match: 1/2/0 + 1/2/04\P + 0: 1/2/04 + 1: 1 + 2: 2 + 0\P +Partial match: 0 + 02/\P +Partial match: 02/ + 02/0\P +Partial match: 02/0 + 02/1\P +Partial match: 02/1 + ** Failers\P +No match + \P +No match + 123\P +No match + 33/4/04\P +No match + 3/13/04\P +No match + 0/1/2003\P +No match + 0/\P +No match + 02/0/\P +No match + 02/13\P +No match + +/0{0,2}ABC/I +Capturing subpattern count = 0 +No options +No first char +Need char = 'C' + +/\d{3,}ABC/I +Capturing subpattern count = 0 +No options +No first char +Need char = 'C' + +/\d*ABC/I +Capturing subpattern count = 0 +No options +No first char +Need char = 'C' + +/[abc]+DE/I +Capturing subpattern count = 0 +No options +No first char +Need char = 'E' + +/[abc]?123/I +Capturing subpattern count = 0 +No options +No first char +Need char = '3' + 123\P + 0: 123 + a\P +Partial match: a + b\P +Partial match: b + c\P +Partial match: c + c12\P +Partial match: c12 + c123\P + 0: c123 + +/^(?:\d){3,5}X/I +Capturing subpattern count = 0 +Options: anchored +No first char +Need char = 'X' + 1\P +Partial match: 1 + 123\P +Partial match: 123 + 123X + 0: 123X + 1234\P +Partial match: 1234 + 1234X + 0: 1234X + 12345\P +Partial match: 12345 + 12345X + 0: 12345X + *** Failers +No match + 1X +No match + 123456\P +No match + +//S-KF>testsavedregex +Compiled pattern written to testsavedregex + +/abc/IS>testsavedregex +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'c' +Subject length lower bound = 3 +No starting char list +Compiled pattern written to testsavedregex +Study data written to testsavedregex +testsavedregex +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'c' +Compiled pattern written to testsavedregex +testsavedregex +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'c' +Subject length lower bound = 3 +No starting char list +Compiled pattern written to testsavedregex +Study data written to testsavedregex +testsavedregex +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'c' +Compiled pattern written to testsavedregex +testsavedregex +Capturing subpattern count = 1 +No options +No first char +No need char +Subject length lower bound = 1 +Starting chars: a b +Compiled pattern written to testsavedregex +Study data written to testsavedregex +testsavedregex +Capturing subpattern count = 1 +No options +No first char +No need char +Compiled pattern written to testsavedregex +testsavedregex +Capturing subpattern count = 1 +No options +No first char +No need char +Subject length lower bound = 1 +Starting chars: a b +Compiled pattern written to testsavedregex +Study data written to testsavedregex +testsavedregex +Capturing subpattern count = 1 +No options +No first char +No need char +Compiled pattern written to testsavedregex +(.)*~smgI +Capturing subpattern count = 3 +Max back reference = 1 +Options: multiline dotall +First char = '<' +Need char = '>' + \J1024\n\n\nPartner der LCO\nde\nPartner der LINEAS Consulting\nGmbH\nLINEAS Consulting GmbH Hamburg\nPartnerfirmen\n30 days\nindex,follow\n\nja\n3\nPartner\n\n\nLCO\nLINEAS Consulting\n15.10.2003\n\n\n\n\nDie Partnerfirmen der LINEAS Consulting\nGmbH\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n + 0: \x0a\x0aPartner der LCO\x0ade\x0aPartner der LINEAS Consulting\x0aGmbH\x0aLINEAS Consulting GmbH Hamburg\x0aPartnerfirmen\x0a30 days\x0aindex,follow\x0a\x0aja\x0a3\x0aPartner\x0a\x0a\x0aLCO\x0aLINEAS Consulting\x0a15.10.2003\x0a\x0a\x0a\x0a\x0aDie Partnerfirmen der LINEAS Consulting\x0aGmbH\x0a\x0a\x0a \x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a + 1: seite + 2: \x0a + 3: seite + +/^a/IF +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/line\nbreak/I +Capturing subpattern count = 0 +Contains explicit CR or LF match +No options +First char = 'l' +Need char = 'k' + this is a line\nbreak + 0: line\x0abreak + line one\nthis is a line\nbreak in the second line + 0: line\x0abreak + +/line\nbreak/If +Capturing subpattern count = 0 +Contains explicit CR or LF match +Options: firstline +First char = 'l' +Need char = 'k' + this is a line\nbreak + 0: line\x0abreak + ** Failers +No match + line one\nthis is a line\nbreak in the second line +No match + +/line\nbreak/Imf +Capturing subpattern count = 0 +Contains explicit CR or LF match +Options: multiline firstline +First char = 'l' +Need char = 'k' + this is a line\nbreak + 0: line\x0abreak + ** Failers +No match + line one\nthis is a line\nbreak in the second line +No match + +/(?i)(?-i)AbCd/I +Capturing subpattern count = 0 +No options +First char = 'A' +Need char = 'd' + AbCd + 0: AbCd + ** Failers +No match + abcd +No match + +/a{11111111111111111111}/I +Failed: number too big in {} quantifier at offset 8 + +/(){64294967295}/I +Failed: number too big in {} quantifier at offset 9 + +/(){2,4294967295}/I +Failed: number too big in {} quantifier at offset 11 + +"(?i:a)(?i:b)(?i:c)(?i:d)(?i:e)(?i:f)(?i:g)(?i:h)(?i:i)(?i:j)(k)(?i:l)A\1B"I +Capturing subpattern count = 1 +Max back reference = 1 +No options +First char = 'a' (caseless) +Need char = 'B' + abcdefghijklAkB + 0: abcdefghijklAkB + 1: k + +"(?Pa)(?Pb)(?Pc)(?Pd)(?Pe)(?Pf)(?Pg)(?Ph)(?Pi)(?Pj)(?Pk)(?Pl)A\11B"I +Capturing subpattern count = 12 +Max back reference = 11 +Named capturing subpatterns: + n0 1 + n1 2 + n10 11 + n11 12 + n2 3 + n3 4 + n4 5 + n5 6 + n6 7 + n7 8 + n8 9 + n9 10 +No options +First char = 'a' +Need char = 'B' + abcdefghijklAkB + 0: abcdefghijklAkB + 1: a + 2: b + 3: c + 4: d + 5: e + 6: f + 7: g + 8: h + 9: i +10: j +11: k +12: l + +"(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)A\11B"I +Capturing subpattern count = 12 +Max back reference = 11 +No options +First char = 'a' +Need char = 'B' + abcdefghijklAkB + 0: abcdefghijklAkB + 1: a + 2: b + 3: c + 4: d + 5: e + 6: f + 7: g + 8: h + 9: i +10: j +11: k +12: l + +"(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)(?Pa)"I +Capturing subpattern count = 101 +Named capturing subpatterns: + name0 1 + name1 2 + name10 11 + name100 101 + name11 12 + name12 13 + name13 14 + name14 15 + name15 16 + name16 17 + name17 18 + name18 19 + name19 20 + name2 3 + name20 21 + name21 22 + name22 23 + name23 24 + name24 25 + name25 26 + name26 27 + name27 28 + name28 29 + name29 30 + name3 4 + name30 31 + name31 32 + name32 33 + name33 34 + name34 35 + name35 36 + name36 37 + name37 38 + name38 39 + name39 40 + name4 5 + name40 41 + name41 42 + name42 43 + name43 44 + name44 45 + name45 46 + name46 47 + name47 48 + name48 49 + name49 50 + name5 6 + name50 51 + name51 52 + name52 53 + name53 54 + name54 55 + name55 56 + name56 57 + name57 58 + name58 59 + name59 60 + name6 7 + name60 61 + name61 62 + name62 63 + name63 64 + name64 65 + name65 66 + name66 67 + name67 68 + name68 69 + name69 70 + name7 8 + name70 71 + name71 72 + name72 73 + name73 74 + name74 75 + name75 76 + name76 77 + name77 78 + name78 79 + name79 80 + name8 9 + name80 81 + name81 82 + name82 83 + name83 84 + name84 85 + name85 86 + name86 87 + name87 88 + name88 89 + name89 90 + name9 10 + name90 91 + name91 92 + name92 93 + name93 94 + name94 95 + name95 96 + name96 97 + name97 98 + name98 99 + name99 100 +No options +First char = 'a' +Need char = 'a' + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +Matched, but too many substrings + 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + 1: a + 2: a + 3: a + 4: a + 5: a + 6: a + 7: a + 8: a + 9: a +10: a +11: a +12: a +13: a +14: a + +"(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)"I +Capturing subpattern count = 101 +No options +First char = 'a' +Need char = 'a' + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +Matched, but too many substrings + 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + 1: a + 2: a + 3: a + 4: a + 5: a + 6: a + 7: a + 8: a + 9: a +10: a +11: a +12: a +13: a +14: a + +/[^()]*(?:\((?R)\)[^()]*)*/I +Capturing subpattern count = 0 +May match empty string +No options +No first char +No need char + (this(and)that + 0: + (this(and)that) + 0: (this(and)that) + (this(and)that)stuff + 0: (this(and)that)stuff + +/[^()]*(?:\((?>(?R))\)[^()]*)*/I +Capturing subpattern count = 0 +May match empty string +No options +No first char +No need char + (this(and)that + 0: + (this(and)that) + 0: (this(and)that) + +/[^()]*(?:\((?R)\))*[^()]*/I +Capturing subpattern count = 0 +May match empty string +No options +No first char +No need char + (this(and)that + 0: + (this(and)that) + 0: (this(and)that) + +/(?:\((?R)\))*[^()]*/I +Capturing subpattern count = 0 +May match empty string +No options +No first char +No need char + (this(and)that + 0: + (this(and)that) + 0: + ((this)) + 0: ((this)) + +/(?:\((?R)\))|[^()]*/I +Capturing subpattern count = 0 +May match empty string +No options +No first char +No need char + (this(and)that + 0: + (this(and)that) + 0: + (this) + 0: (this) + ((this)) + 0: ((this)) + +/\x{0000ff}/I +Capturing subpattern count = 0 +No options +First char = \xff +No need char + +/^((?Pa1)|(?Pa2)b)/I +Failed: two named subpatterns have the same name at offset 17 + +/^((?Pa1)|(?Pa2)b)/IJ +Capturing subpattern count = 3 +Named capturing subpatterns: + A 2 + A 3 +Options: anchored dupnames +No first char +No need char + a1b\CA + 0: a1 + 1: a1 + 2: a1 + C a1 (2) A + a2b\CA + 0: a2b + 1: a2b + 2: + 3: a2 + C a2 (2) A + ** Failers +No match + a1b\CZ\CA +no parentheses with name "Z" + 0: a1 + 1: a1 + 2: a1 +copy substring Z failed -7 + C a1 (2) A + +/(?|(?)(?)(?)|(?)(?)(?))/IJ +Capturing subpattern count = 3 +Named capturing subpatterns: + a 1 + a 3 + b 2 +May match empty string +Options: dupnames +No first char +No need char + +/^(?Pa)(?Pb)/IJ +Capturing subpattern count = 2 +Named capturing subpatterns: + A 1 + A 2 +Options: anchored dupnames +No first char +No need char + ab\CA + 0: ab + 1: a + 2: b + C a (1) A + +/^(?Pa)(?Pb)|cd/IJ +Capturing subpattern count = 2 +Named capturing subpatterns: + A 1 + A 2 +Options: dupnames +No first char +No need char + ab\CA + 0: ab + 1: a + 2: b + C a (1) A + cd\CA + 0: cd +copy substring A failed -7 + +/^(?Pa)(?Pb)|cd(?Pef)(?Pgh)/IJ +Capturing subpattern count = 4 +Named capturing subpatterns: + A 1 + A 2 + A 3 + A 4 +Options: dupnames +No first char +No need char + cdefgh\CA + 0: cdefgh + 1: + 2: + 3: ef + 4: gh + C ef (2) A + +/^((?Pa1)|(?Pa2)b)/IJ +Capturing subpattern count = 3 +Named capturing subpatterns: + A 2 + A 3 +Options: anchored dupnames +No first char +No need char + a1b\GA + 0: a1 + 1: a1 + 2: a1 + G a1 (2) A + a2b\GA + 0: a2b + 1: a2b + 2: + 3: a2 + G a2 (2) A + ** Failers +No match + a1b\GZ\GA +no parentheses with name "Z" + 0: a1 + 1: a1 + 2: a1 +get substring Z failed -7 + G a1 (2) A + +/^(?Pa)(?Pb)/IJ +Capturing subpattern count = 2 +Named capturing subpatterns: + A 1 + A 2 +Options: anchored dupnames +No first char +No need char + ab\GA + 0: ab + 1: a + 2: b + G a (1) A + +/^(?Pa)(?Pb)|cd/IJ +Capturing subpattern count = 2 +Named capturing subpatterns: + A 1 + A 2 +Options: dupnames +No first char +No need char + ab\GA + 0: ab + 1: a + 2: b + G a (1) A + cd\GA + 0: cd +get substring A failed -7 + +/^(?Pa)(?Pb)|cd(?Pef)(?Pgh)/IJ +Capturing subpattern count = 4 +Named capturing subpatterns: + A 1 + A 2 + A 3 + A 4 +Options: dupnames +No first char +No need char + cdefgh\GA + 0: cdefgh + 1: + 2: + 3: ef + 4: gh + G ef (2) A + +/(?J)^((?Pa1)|(?Pa2)b)/I +Capturing subpattern count = 3 +Named capturing subpatterns: + A 2 + A 3 +Options: anchored +Duplicate name status changes +No first char +No need char + a1b\CA + 0: a1 + 1: a1 + 2: a1 + C a1 (2) A + a2b\CA + 0: a2b + 1: a2b + 2: + 3: a2 + C a2 (2) A + +/^(?Pa) (?J:(?Pb)(?Pc)) (?Pd)/I +Failed: two named subpatterns have the same name at offset 37 + +/ In this next test, J is not set at the outer level; consequently it isn't +set in the pattern's options; consequently pcre_get_named_substring() produces +a random value. /Ix +Capturing subpattern count = 1 +Options: extended +First char = 'I' +Need char = 'e' + +/^(?Pa) (?J:(?Pb)(?Pc)) (?Pd)/I +Capturing subpattern count = 4 +Named capturing subpatterns: + A 1 + B 2 + B 3 + C 4 +Options: anchored +Duplicate name status changes +No first char +No need char + a bc d\CA\CB\CC + 0: a bc d + 1: a + 2: b + 3: c + 4: d + C a (1) A + C b (1) B + C d (1) C + +/^(?Pa)?(?(A)a|b)/I +Capturing subpattern count = 1 +Max back reference = 1 +Named capturing subpatterns: + A 1 +Options: anchored +No first char +No need char + aabc + 0: aa + 1: a + bc + 0: b + ** Failers +No match + abc +No match + +/(?:(?(ZZ)a|b)(?PX))+/I +Capturing subpattern count = 1 +Max back reference = 1 +Named capturing subpatterns: + ZZ 1 +No options +No first char +Need char = 'X' + bXaX + 0: bXaX + 1: X + +/(?:(?(2y)a|b)(X))+/I +Failed: malformed number or name after (?( at offset 7 + +/(?:(?(ZA)a|b)(?PX))+/I +Failed: reference to non-existent subpattern at offset 9 + +/(?:(?(ZZ)a|b)(?(ZZ)a|b)(?PX))+/I +Capturing subpattern count = 1 +Max back reference = 1 +Named capturing subpatterns: + ZZ 1 +No options +No first char +Need char = 'X' + bbXaaX + 0: bbXaaX + 1: X + +/(?:(?(ZZ)a|\(b\))\\(?PX))+/I +Capturing subpattern count = 1 +Max back reference = 1 +Named capturing subpatterns: + ZZ 1 +No options +No first char +Need char = 'X' + (b)\\Xa\\X + 0: (b)\Xa\X + 1: X + +/(?PX|Y))+/I +Capturing subpattern count = 1 +Max back reference = 1 +Named capturing subpatterns: + A 1 +No options +No first char +No need char + bXXaYYaY + 0: bXXaYYaY + 1: Y + bXYaXXaX + 0: bX + 1: X + +/()()()()()()()()()(?:(?(A)(?P=A)a|b)(?PX|Y))+/I +Capturing subpattern count = 10 +Max back reference = 10 +Named capturing subpatterns: + A 10 +No options +No first char +No need char + bXXaYYaY + 0: bXXaYYaY + 1: + 2: + 3: + 4: + 5: + 6: + 7: + 8: + 9: +10: Y + +/\s*,\s*/IS +Capturing subpattern count = 0 +No options +No first char +Need char = ',' +Subject length lower bound = 1 +Starting chars: \x09 \x0a \x0b \x0c \x0d \x20 , + \x0b,\x0b + 0: \x0b,\x0b + \x0c,\x0d + 0: \x0c,\x0d + +/^abc/Im +Capturing subpattern count = 0 +Options: multiline +First char at start or follows newline +Need char = 'c' + xyz\nabc + 0: abc + xyz\nabc\ + 0: abc + xyz\r\nabc\ + 0: abc + xyz\rabc\ + 0: abc + xyz\r\nabc\ + 0: abc + ** Failers +No match + xyz\nabc\ +No match + xyz\r\nabc\ +No match + xyz\nabc\ +No match + xyz\rabc\ +No match + xyz\rabc\ +No match + +/abc$/Im +Capturing subpattern count = 0 +Options: multiline +Forced newline sequence: LF +First char = 'a' +Need char = 'c' + xyzabc + 0: abc + xyzabc\n + 0: abc + xyzabc\npqr + 0: abc + xyzabc\r\ + 0: abc + xyzabc\rpqr\ + 0: abc + xyzabc\r\n\ + 0: abc + xyzabc\r\npqr\ + 0: abc + ** Failers +No match + xyzabc\r +No match + xyzabc\rpqr +No match + xyzabc\r\n +No match + xyzabc\r\npqr +No match + +/^abc/Im +Capturing subpattern count = 0 +Options: multiline +Forced newline sequence: CR +First char at start or follows newline +Need char = 'c' + xyz\rabcdef + 0: abc + xyz\nabcdef\ + 0: abc + ** Failers +No match + xyz\nabcdef +No match + +/^abc/Im +Capturing subpattern count = 0 +Options: multiline +Forced newline sequence: LF +First char at start or follows newline +Need char = 'c' + xyz\nabcdef + 0: abc + xyz\rabcdef\ + 0: abc + ** Failers +No match + xyz\rabcdef +No match + +/^abc/Im +Capturing subpattern count = 0 +Options: multiline +Forced newline sequence: CRLF +First char at start or follows newline +Need char = 'c' + xyz\r\nabcdef + 0: abc + xyz\rabcdef\ + 0: abc + ** Failers +No match + xyz\rabcdef +No match + +/^abc/Im +Unknown modifier at: + + +/abc/I +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'c' + xyz\rabc\ +Unknown escape sequence at: + abc + 0: abc + +/.*/I +Capturing subpattern count = 0 +May match empty string +Options: +Forced newline sequence: LF +First char at start or follows newline +No need char + abc\ndef + 0: abc + abc\rdef + 0: abc\x0ddef + abc\r\ndef + 0: abc\x0d + \abc\ndef + 0: abc\x0adef + \abc\rdef + 0: abc + \abc\r\ndef + 0: abc + \abc\ndef + 0: abc\x0adef + \abc\rdef + 0: abc\x0ddef + \abc\r\ndef + 0: abc + +/\w+(.)(.)?def/Is +Capturing subpattern count = 2 +Options: dotall +No first char +Need char = 'f' + abc\ndef + 0: abc\x0adef + 1: \x0a + abc\rdef + 0: abc\x0ddef + 1: \x0d + abc\r\ndef + 0: abc\x0d\x0adef + 1: \x0d + 2: \x0a + ++((?:\s|//.*\\n|/[*](?:\\n|.)*?[*]/)*)+I +Capturing subpattern count = 1 +May match empty string +No options +No first char +No need char + /* this is a C style comment */\M +Minimum match() limit = 120 +Minimum match() recursion limit = 6 + 0: /* this is a C style comment */ + 1: /* this is a C style comment */ + +/(?P25[0-5]|2[0-4]\d|[01]?\d?\d)(?:\.(?P>B)){3}/I +Capturing subpattern count = 1 +Named capturing subpatterns: + B 1 +No options +No first char +Need char = '.' + +/()()()()()()()()()()()()()()()()()()()() + ()()()()()()()()()()()()()()()()()()()() + ()()()()()()()()()()()()()()()()()()()() + ()()()()()()()()()()()()()()()()()()()() + ()()()()()()()()()()()()()()()()()()()() + (.(.))/Ix +Capturing subpattern count = 102 +Options: extended +No first char +No need char + XY\O400 + 0: XY + 1: + 2: + 3: + 4: + 5: + 6: + 7: + 8: + 9: +10: +11: +12: +13: +14: +15: +16: +17: +18: +19: +20: +21: +22: +23: +24: +25: +26: +27: +28: +29: +30: +31: +32: +33: +34: +35: +36: +37: +38: +39: +40: +41: +42: +43: +44: +45: +46: +47: +48: +49: +50: +51: +52: +53: +54: +55: +56: +57: +58: +59: +60: +61: +62: +63: +64: +65: +66: +67: +68: +69: +70: +71: +72: +73: +74: +75: +76: +77: +78: +79: +80: +81: +82: +83: +84: +85: +86: +87: +88: +89: +90: +91: +92: +93: +94: +95: +96: +97: +98: +99: +100: +101: XY +102: Y + +/(a*b|(?i:c*(?-i)d))/IS +Capturing subpattern count = 1 +No options +No first char +No need char +Subject length lower bound = 1 +Starting chars: C a b c d + +/()[ab]xyz/IS +Capturing subpattern count = 1 +No options +No first char +Need char = 'z' +Subject length lower bound = 4 +Starting chars: a b + +/(|)[ab]xyz/IS +Capturing subpattern count = 1 +No options +No first char +Need char = 'z' +Subject length lower bound = 4 +Starting chars: a b + +/(|c)[ab]xyz/IS +Capturing subpattern count = 1 +No options +No first char +Need char = 'z' +Subject length lower bound = 4 +Starting chars: a b c + +/(|c?)[ab]xyz/IS +Capturing subpattern count = 1 +No options +No first char +Need char = 'z' +Subject length lower bound = 4 +Starting chars: a b c + +/(d?|c?)[ab]xyz/IS +Capturing subpattern count = 1 +No options +No first char +Need char = 'z' +Subject length lower bound = 4 +Starting chars: a b c d + +/(d?|c)[ab]xyz/IS +Capturing subpattern count = 1 +No options +No first char +Need char = 'z' +Subject length lower bound = 4 +Starting chars: a b c d + +/^a*b\d/DZ +------------------------------------------------------------------ + Bra + ^ + a*+ + b + \d + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +Need char = 'b' + +/^a*+b\d/DZ +------------------------------------------------------------------ + Bra + ^ + a*+ + b + \d + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +Need char = 'b' + +/^a*?b\d/DZ +------------------------------------------------------------------ + Bra + ^ + a*+ + b + \d + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +Need char = 'b' + +/^a+A\d/DZ +------------------------------------------------------------------ + Bra + ^ + a++ + A + \d + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +Need char = 'A' + aaaA5 + 0: aaaA5 + ** Failers +No match + aaaa5 +No match + +/^a*A\d/IiDZ +------------------------------------------------------------------ + Bra + ^ + /i a* + /i A + \d + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored caseless +No first char +Need char = 'A' (caseless) + aaaA5 + 0: aaaA5 + aaaa5 + 0: aaaa5 + +/(a*|b*)[cd]/IS +Capturing subpattern count = 1 +No options +No first char +No need char +Subject length lower bound = 1 +Starting chars: a b c d + +/(a+|b*)[cd]/IS +Capturing subpattern count = 1 +No options +No first char +No need char +Subject length lower bound = 1 +Starting chars: a b c d + +/(a*|b+)[cd]/IS +Capturing subpattern count = 1 +No options +No first char +No need char +Subject length lower bound = 1 +Starting chars: a b c d + +/(a+|b+)[cd]/IS +Capturing subpattern count = 1 +No options +No first char +No need char +Subject length lower bound = 2 +Starting chars: a b + +/(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( + (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( + ((( + a + )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) + )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) + ))) +/Ix +Capturing subpattern count = 203 +Options: extended +First char = 'a' +No need char + large nest +Matched, but too many substrings + 0: a + 1: a + 2: a + 3: a + 4: a + 5: a + 6: a + 7: a + 8: a + 9: a +10: a +11: a +12: a +13: a +14: a + +/a*\d/BZ +------------------------------------------------------------------ + Bra + a*+ + \d + Ket + End +------------------------------------------------------------------ + +/a*\D/BZ +------------------------------------------------------------------ + Bra + a* + \D + Ket + End +------------------------------------------------------------------ + +/0*\d/BZ +------------------------------------------------------------------ + Bra + 0* + \d + Ket + End +------------------------------------------------------------------ + +/0*\D/BZ +------------------------------------------------------------------ + Bra + 0*+ + \D + Ket + End +------------------------------------------------------------------ + +/a*\s/BZ +------------------------------------------------------------------ + Bra + a*+ + \s + Ket + End +------------------------------------------------------------------ + +/a*\S/BZ +------------------------------------------------------------------ + Bra + a* + \S + Ket + End +------------------------------------------------------------------ + +/ *\s/BZ +------------------------------------------------------------------ + Bra + * + \s + Ket + End +------------------------------------------------------------------ + +/ *\S/BZ +------------------------------------------------------------------ + Bra + *+ + \S + Ket + End +------------------------------------------------------------------ + +/a*\w/BZ +------------------------------------------------------------------ + Bra + a* + \w + Ket + End +------------------------------------------------------------------ + +/a*\W/BZ +------------------------------------------------------------------ + Bra + a*+ + \W + Ket + End +------------------------------------------------------------------ + +/=*\w/BZ +------------------------------------------------------------------ + Bra + =*+ + \w + Ket + End +------------------------------------------------------------------ + +/=*\W/BZ +------------------------------------------------------------------ + Bra + =* + \W + Ket + End +------------------------------------------------------------------ + +/\d*a/BZ +------------------------------------------------------------------ + Bra + \d*+ + a + Ket + End +------------------------------------------------------------------ + +/\d*2/BZ +------------------------------------------------------------------ + Bra + \d* + 2 + Ket + End +------------------------------------------------------------------ + +/\d*\d/BZ +------------------------------------------------------------------ + Bra + \d* + \d + Ket + End +------------------------------------------------------------------ + +/\d*\D/BZ +------------------------------------------------------------------ + Bra + \d*+ + \D + Ket + End +------------------------------------------------------------------ + +/\d*\s/BZ +------------------------------------------------------------------ + Bra + \d*+ + \s + Ket + End +------------------------------------------------------------------ + +/\d*\S/BZ +------------------------------------------------------------------ + Bra + \d* + \S + Ket + End +------------------------------------------------------------------ + +/\d*\w/BZ +------------------------------------------------------------------ + Bra + \d* + \w + Ket + End +------------------------------------------------------------------ + +/\d*\W/BZ +------------------------------------------------------------------ + Bra + \d*+ + \W + Ket + End +------------------------------------------------------------------ + +/\D*a/BZ +------------------------------------------------------------------ + Bra + \D* + a + Ket + End +------------------------------------------------------------------ + +/\D*2/BZ +------------------------------------------------------------------ + Bra + \D*+ + 2 + Ket + End +------------------------------------------------------------------ + +/\D*\d/BZ +------------------------------------------------------------------ + Bra + \D*+ + \d + Ket + End +------------------------------------------------------------------ + +/\D*\D/BZ +------------------------------------------------------------------ + Bra + \D* + \D + Ket + End +------------------------------------------------------------------ + +/\D*\s/BZ +------------------------------------------------------------------ + Bra + \D* + \s + Ket + End +------------------------------------------------------------------ + +/\D*\S/BZ +------------------------------------------------------------------ + Bra + \D* + \S + Ket + End +------------------------------------------------------------------ + +/\D*\w/BZ +------------------------------------------------------------------ + Bra + \D* + \w + Ket + End +------------------------------------------------------------------ + +/\D*\W/BZ +------------------------------------------------------------------ + Bra + \D* + \W + Ket + End +------------------------------------------------------------------ + +/\s*a/BZ +------------------------------------------------------------------ + Bra + \s*+ + a + Ket + End +------------------------------------------------------------------ + +/\s*2/BZ +------------------------------------------------------------------ + Bra + \s*+ + 2 + Ket + End +------------------------------------------------------------------ + +/\s*\d/BZ +------------------------------------------------------------------ + Bra + \s*+ + \d + Ket + End +------------------------------------------------------------------ + +/\s*\D/BZ +------------------------------------------------------------------ + Bra + \s* + \D + Ket + End +------------------------------------------------------------------ + +/\s*\s/BZ +------------------------------------------------------------------ + Bra + \s* + \s + Ket + End +------------------------------------------------------------------ + +/\s*\S/BZ +------------------------------------------------------------------ + Bra + \s*+ + \S + Ket + End +------------------------------------------------------------------ + +/\s*\w/BZ +------------------------------------------------------------------ + Bra + \s*+ + \w + Ket + End +------------------------------------------------------------------ + +/\s*\W/BZ +------------------------------------------------------------------ + Bra + \s* + \W + Ket + End +------------------------------------------------------------------ + +/\S*a/BZ +------------------------------------------------------------------ + Bra + \S* + a + Ket + End +------------------------------------------------------------------ + +/\S*2/BZ +------------------------------------------------------------------ + Bra + \S* + 2 + Ket + End +------------------------------------------------------------------ + +/\S*\d/BZ +------------------------------------------------------------------ + Bra + \S* + \d + Ket + End +------------------------------------------------------------------ + +/\S*\D/BZ +------------------------------------------------------------------ + Bra + \S* + \D + Ket + End +------------------------------------------------------------------ + +/\S*\s/BZ +------------------------------------------------------------------ + Bra + \S*+ + \s + Ket + End +------------------------------------------------------------------ + +/\S*\S/BZ +------------------------------------------------------------------ + Bra + \S* + \S + Ket + End +------------------------------------------------------------------ + +/\S*\w/BZ +------------------------------------------------------------------ + Bra + \S* + \w + Ket + End +------------------------------------------------------------------ + +/\S*\W/BZ +------------------------------------------------------------------ + Bra + \S* + \W + Ket + End +------------------------------------------------------------------ + +/\w*a/BZ +------------------------------------------------------------------ + Bra + \w* + a + Ket + End +------------------------------------------------------------------ + +/\w*2/BZ +------------------------------------------------------------------ + Bra + \w* + 2 + Ket + End +------------------------------------------------------------------ + +/\w*\d/BZ +------------------------------------------------------------------ + Bra + \w* + \d + Ket + End +------------------------------------------------------------------ + +/\w*\D/BZ +------------------------------------------------------------------ + Bra + \w* + \D + Ket + End +------------------------------------------------------------------ + +/\w*\s/BZ +------------------------------------------------------------------ + Bra + \w*+ + \s + Ket + End +------------------------------------------------------------------ + +/\w*\S/BZ +------------------------------------------------------------------ + Bra + \w* + \S + Ket + End +------------------------------------------------------------------ + +/\w*\w/BZ +------------------------------------------------------------------ + Bra + \w* + \w + Ket + End +------------------------------------------------------------------ + +/\w*\W/BZ +------------------------------------------------------------------ + Bra + \w*+ + \W + Ket + End +------------------------------------------------------------------ + +/\W*a/BZ +------------------------------------------------------------------ + Bra + \W*+ + a + Ket + End +------------------------------------------------------------------ + +/\W*2/BZ +------------------------------------------------------------------ + Bra + \W*+ + 2 + Ket + End +------------------------------------------------------------------ + +/\W*\d/BZ +------------------------------------------------------------------ + Bra + \W*+ + \d + Ket + End +------------------------------------------------------------------ + +/\W*\D/BZ +------------------------------------------------------------------ + Bra + \W* + \D + Ket + End +------------------------------------------------------------------ + +/\W*\s/BZ +------------------------------------------------------------------ + Bra + \W* + \s + Ket + End +------------------------------------------------------------------ + +/\W*\S/BZ +------------------------------------------------------------------ + Bra + \W* + \S + Ket + End +------------------------------------------------------------------ + +/\W*\w/BZ +------------------------------------------------------------------ + Bra + \W*+ + \w + Ket + End +------------------------------------------------------------------ + +/\W*\W/BZ +------------------------------------------------------------------ + Bra + \W* + \W + Ket + End +------------------------------------------------------------------ + +/[^a]+a/BZ +------------------------------------------------------------------ + Bra + [^a]++ + a + Ket + End +------------------------------------------------------------------ + +/[^a]+a/BZi +------------------------------------------------------------------ + Bra + /i [^a]++ + /i a + Ket + End +------------------------------------------------------------------ + +/[^a]+A/BZi +------------------------------------------------------------------ + Bra + /i [^a]++ + /i A + Ket + End +------------------------------------------------------------------ + +/[^a]+b/BZ +------------------------------------------------------------------ + Bra + [^a]+ + b + Ket + End +------------------------------------------------------------------ + +/[^a]+\d/BZ +------------------------------------------------------------------ + Bra + [^a]+ + \d + Ket + End +------------------------------------------------------------------ + +/a*[^a]/BZ +------------------------------------------------------------------ + Bra + a*+ + [^a] + Ket + End +------------------------------------------------------------------ + +/(?Px)(?Py)/I +Capturing subpattern count = 2 +Named capturing subpatterns: + abc 1 + xyz 2 +No options +First char = 'x' +Need char = 'y' + xy\Cabc\Cxyz + 0: xy + 1: x + 2: y + C x (1) abc + C y (1) xyz + +/(?x)(?'xyz'y)/I +Capturing subpattern count = 2 +Named capturing subpatterns: + abc 1 + xyz 2 +No options +First char = 'x' +Need char = 'y' + xy\Cabc\Cxyz + 0: xy + 1: x + 2: y + C x (1) abc + C y (1) xyz + +/(?x)(?'xyz>y)/I +Failed: syntax error in subpattern name (missing terminator) at offset 15 + +/(?P'abc'x)(?Py)/I +Failed: unrecognized character after (?P at offset 3 + +/^(?:(?(ZZ)a|b)(?X))+/ + bXaX + 0: bXaX + 1: X + bXbX + 0: bX + 1: X + ** Failers +No match + aXaX +No match + aXbX +No match + +/^(?P>abc)(?xxx)/ +Failed: reference to non-existent subpattern at offset 8 + +/^(?P>abc)(?x|y)/ + xx + 0: xx + 1: x + xy + 0: xy + 1: y + yy + 0: yy + 1: y + yx + 0: yx + 1: x + +/^(?P>abc)(?Px|y)/ + xx + 0: xx + 1: x + xy + 0: xy + 1: y + yy + 0: yy + 1: y + yx + 0: yx + 1: x + +/^((?(abc)a|b)(?x|y))+/ + bxay + 0: bxay + 1: ay + 2: y + bxby + 0: bx + 1: bx + 2: x + ** Failers +No match + axby +No match + +/^(((?P=abc)|X)(?x|y))+/ + XxXxxx + 0: XxXxxx + 1: xx + 2: x + 3: x + XxXyyx + 0: XxXyyx + 1: yx + 2: y + 3: x + XxXyxx + 0: XxXy + 1: Xy + 2: X + 3: y + ** Failers +No match + x +No match + +/^(?1)(abc)/ + abcabc + 0: abcabc + 1: abc + +/^(?:(?:\1|X)(a|b))+/ + Xaaa + 0: Xaaa + 1: a + Xaba + 0: Xa + 1: a + +/^[\E\Qa\E-\Qz\E]+/BZ +------------------------------------------------------------------ + Bra + ^ + [a-z]++ + Ket + End +------------------------------------------------------------------ + +/^[a\Q]bc\E]/BZ +------------------------------------------------------------------ + Bra + ^ + [\]a-c] + Ket + End +------------------------------------------------------------------ + +/^[a-\Q\E]/BZ +------------------------------------------------------------------ + Bra + ^ + [\-a] + Ket + End +------------------------------------------------------------------ + +/^(?P>abc)[()](?)/BZ +------------------------------------------------------------------ + Bra + ^ + Recurse + [()] + CBra 1 + Ket + Ket + End +------------------------------------------------------------------ + +/^((?(abc)y)[()](?Px))+/BZ +------------------------------------------------------------------ + Bra + ^ + CBra 1 + Cond + 2 Cond ref + y + Ket + [()] + CBra 2 + x + Ket + KetRmax + Ket + End +------------------------------------------------------------------ + (xy)x + 0: (xy)x + 1: y)x + 2: x + +/^(?P>abc)\Q()\E(?)/BZ +------------------------------------------------------------------ + Bra + ^ + Recurse + () + CBra 1 + Ket + Ket + End +------------------------------------------------------------------ + +/^(?P>abc)[a\Q(]\E(](?)/BZ +------------------------------------------------------------------ + Bra + ^ + Recurse + [(\]a] + CBra 1 + Ket + Ket + End +------------------------------------------------------------------ + +/^(?P>abc) # this is (a comment) + (?)/BZx +------------------------------------------------------------------ + Bra + ^ + Recurse + CBra 1 + Ket + Ket + End +------------------------------------------------------------------ + +/^\W*(?:(?(?.)\W*(?&one)\W*\k|)|(?(?.)\W*(?&three)\W*\k'four'|\W*.\W*))\W*$/Ii +Capturing subpattern count = 4 +Max back reference = 4 +Named capturing subpatterns: + four 4 + one 1 + three 3 + two 2 +May match empty string +Options: anchored caseless +No first char +No need char + 1221 + 0: 1221 + 1: 1221 + 2: 1 + Satan, oscillate my metallic sonatas! + 0: Satan, oscillate my metallic sonatas! + 1: + 2: + 3: Satan, oscillate my metallic sonatas + 4: S + A man, a plan, a canal: Panama! + 0: A man, a plan, a canal: Panama! + 1: + 2: + 3: A man, a plan, a canal: Panama + 4: A + Able was I ere I saw Elba. + 0: Able was I ere I saw Elba. + 1: + 2: + 3: Able was I ere I saw Elba + 4: A + *** Failers +No match + The quick brown fox +No match + +/(?=(\w+))\1:/I +Capturing subpattern count = 1 +Max back reference = 1 +No options +No first char +Need char = ':' + abcd: + 0: abcd: + 1: abcd + +/(?=(?'abc'\w+))\k:/I +Capturing subpattern count = 1 +Max back reference = 1 +Named capturing subpatterns: + abc 1 +No options +No first char +Need char = ':' + abcd: + 0: abcd: + 1: abcd + +/(?'abc'a|b)(?d|e)\k{2}/J + adaa + 0: adaa + 1: a + 2: d + ** Failers +No match + addd +No match + adbb +No match + +/(?'abc'a|b)(?d|e)(?&abc){2}/J + bdaa + 0: bdaa + 1: b + 2: d + bdab + 0: bdab + 1: b + 2: d + ** Failers +No match + bddd +No match + +/(?( (?'B' abc (?(R) (?(R&A)1) (?(R&B)2) X | (?1) (?2) (?R) ))) /x + abcabc1Xabc2XabcXabcabc + 0: abcabc1Xabc2XabcX + 1: abcabc1Xabc2XabcX + 2: abcabc1Xabc2XabcX + +/(? (?'B' abc (?(R) (?(R&C)1) (?(R&B)2) X | (?1) (?2) (?R) ))) /x +Failed: reference to non-existent subpattern at offset 29 + +/^(?(DEFINE) abc | xyz ) /x +Failed: DEFINE group contains more than one branch at offset 22 + +/(?(DEFINE) abc) xyz/xI +Capturing subpattern count = 0 +Options: extended +First char = 'x' +Need char = 'z' + +/(a|)*\d/ + \O0aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +No match + \O0aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4 +Matched, but too many substrings + +/^a.b/ + a\rb + 0: a\x0db + a\nb\ + 0: a\x0ab + a\x85b\ + 0: a\x85b + ** Failers +No match + a\nb +No match + a\nb\ +No match + a\rb\ +No match + a\rb\ +No match + a\x85b\ +No match + a\rb\ +No match + +/^abc./mgx + abc1 \x0aabc2 \x0babc3xx \x0cabc4 \x0dabc5xx \x0d\x0aabc6 \x85abc7 JUNK + 0: abc1 + 0: abc2 + 0: abc3 + 0: abc4 + 0: abc5 + 0: abc6 + 0: abc7 + +/abc.$/mgx + abc1\x0a abc2\x0b abc3\x0c abc4\x0d abc5\x0d\x0a abc6\x85 abc7 abc9 + 0: abc1 + 0: abc2 + 0: abc3 + 0: abc4 + 0: abc5 + 0: abc6 + 0: abc9 + +/a/ + +/a/ +Failed: inconsistent NEWLINE options at offset 0 + +/^a\Rb/ + a\nb + 0: a\x0ab + a\rb + 0: a\x0db + a\r\nb + 0: a\x0d\x0ab + a\x0bb + 0: a\x0bb + a\x0cb + 0: a\x0cb + a\x85b + 0: a\x85b + ** Failers +No match + a\n\rb +No match + +/^a\R*b/ + ab + 0: ab + a\nb + 0: a\x0ab + a\rb + 0: a\x0db + a\r\nb + 0: a\x0d\x0ab + a\x0bb + 0: a\x0bb + a\x0cb + 0: a\x0cb + a\x85b + 0: a\x85b + a\n\rb + 0: a\x0a\x0db + a\n\r\x85\x0cb + 0: a\x0a\x0d\x85\x0cb + +/^a\R+b/ + a\nb + 0: a\x0ab + a\rb + 0: a\x0db + a\r\nb + 0: a\x0d\x0ab + a\x0bb + 0: a\x0bb + a\x0cb + 0: a\x0cb + a\x85b + 0: a\x85b + a\n\rb + 0: a\x0a\x0db + a\n\r\x85\x0cb + 0: a\x0a\x0d\x85\x0cb + ** Failers +No match + ab +No match + +/^a\R{1,3}b/ + a\nb + 0: a\x0ab + a\n\rb + 0: a\x0a\x0db + a\n\r\x85b + 0: a\x0a\x0d\x85b + a\r\n\r\nb + 0: a\x0d\x0a\x0d\x0ab + a\r\n\r\n\r\nb + 0: a\x0d\x0a\x0d\x0a\x0d\x0ab + a\n\r\n\rb + 0: a\x0a\x0d\x0a\x0db + a\n\n\r\nb + 0: a\x0a\x0a\x0d\x0ab + ** Failers +No match + a\n\n\n\rb +No match + a\r +No match + +/^a[\R]b/ + aRb + 0: aRb + ** Failers +No match + a\nb +No match + +/(?&abc)X(?P)/I +Capturing subpattern count = 1 +Named capturing subpatterns: + abc 1 +No options +No first char +Need char = 'P' + abcPXP123 + 0: PXP + 1: P + +/(?1)X(?P)/I +Capturing subpattern count = 1 +Named capturing subpatterns: + abc 1 +No options +No first char +Need char = 'P' + abcPXP123 + 0: PXP + 1: P + +/(?:a(?&abc)b)*(?x)/ + 123axbaxbaxbx456 + 0: axbaxbaxbx + 1: x + 123axbaxbaxb456 + 0: x + 1: x + +/(?:a(?&abc)b){1,5}(?x)/ + 123axbaxbaxbx456 + 0: axbaxbaxbx + 1: x + +/(?:a(?&abc)b){2,5}(?x)/ + 123axbaxbaxbx456 + 0: axbaxbaxbx + 1: x + +/(?:a(?&abc)b){2,}(?x)/ + 123axbaxbaxbx456 + 0: axbaxbaxbx + 1: x + +/(abc)(?i:(?1))/ + defabcabcxyz + 0: abcabc + 1: abc + DEFabcABCXYZ +No match + +/(abc)(?:(?i)(?1))/ + defabcabcxyz + 0: abcabc + 1: abc + DEFabcABCXYZ +No match + +/^(a)\g-2/ +Failed: reference to non-existent subpattern at offset 7 + +/^(a)\g/ +Failed: a numbered reference must not be zero at offset 5 + +/^(a)\g{0}/ +Failed: a numbered reference must not be zero at offset 8 + +/^(a)\g{3/ +Failed: \g is not followed by a braced, angle-bracketed, or quoted name/number or by a plain number at offset 8 + +/^(a)\g{aa}/ +Failed: reference to non-existent subpattern at offset 9 + +/^a.b/ + a\rb + 0: a\x0db + *** Failers +No match + a\nb +No match + +/.+foo/ + afoo + 0: afoo + ** Failers +No match + \r\nfoo +No match + \nfoo +No match + +/.+foo/ + afoo + 0: afoo + \nfoo + 0: \x0afoo + ** Failers +No match + \r\nfoo +No match + +/.+foo/ + afoo + 0: afoo + ** Failers +No match + \nfoo +No match + \r\nfoo +No match + +/.+foo/s + afoo + 0: afoo + \r\nfoo + 0: \x0d\x0afoo + \nfoo + 0: \x0afoo + +/^$/mg + abc\r\rxyz + 0: + abc\n\rxyz + 0: + ** Failers +No match + abc\r\nxyz +No match + +/(?m)^$/g+ + abc\r\n\r\n + 0: + 0+ \x0d\x0a + +/(?m)^$|^\r\n/g+ + abc\r\n\r\n + 0: + 0+ \x0d\x0a + 0: \x0d\x0a + 0+ + +/(?m)$/g+ + abc\r\n\r\n + 0: + 0+ \x0d\x0a\x0d\x0a + 0: + 0+ \x0d\x0a + 0: + 0+ + +/abc.$/mgx + abc1\x0a abc2\x0b abc3\x0c abc4\x0d abc5\x0d\x0a abc6\x85 abc9 + 0: abc1 + 0: abc4 + 0: abc5 + 0: abc9 + +/^X/m + XABC + 0: X + ** Failers +No match + XABC\B +No match + +/(ab|c)(?-1)/BZ +------------------------------------------------------------------ + Bra + CBra 1 + ab + Alt + c + Ket + Recurse + Ket + End +------------------------------------------------------------------ + abc + 0: abc + 1: ab + +/xy(?+1)(abc)/BZ +------------------------------------------------------------------ + Bra + xy + Recurse + CBra 1 + abc + Ket + Ket + End +------------------------------------------------------------------ + xyabcabc + 0: xyabcabc + 1: abc + ** Failers +No match + xyabc +No match + +/x(?-0)y/ +Failed: a numbered reference must not be zero at offset 5 + +/x(?-1)y/ +Failed: reference to non-existent subpattern at offset 5 + +/x(?+0)y/ +Failed: a numbered reference must not be zero at offset 5 + +/x(?+1)y/ +Failed: reference to non-existent subpattern at offset 5 + +/^(abc)?(?(-1)X|Y)/BZ +------------------------------------------------------------------ + Bra + ^ + Brazero + CBra 1 + abc + Ket + Cond + 1 Cond ref + X + Alt + Y + Ket + Ket + End +------------------------------------------------------------------ + abcX + 0: abcX + 1: abc + Y + 0: Y + ** Failers +No match + abcY +No match + +/^((?(+1)X|Y)(abc))+/BZ +------------------------------------------------------------------ + Bra + ^ + CBra 1 + Cond + 2 Cond ref + X + Alt + Y + Ket + CBra 2 + abc + Ket + KetRmax + Ket + End +------------------------------------------------------------------ + YabcXabc + 0: YabcXabc + 1: Xabc + 2: abc + YabcXabcXabc + 0: YabcXabcXabc + 1: Xabc + 2: abc + ** Failers +No match + XabcXabc +No match + +/(?(-1)a)/BZ +Failed: reference to non-existent subpattern at offset 6 + +/((?(-1)a))/BZ +------------------------------------------------------------------ + Bra + CBra 1 + Cond + 1 Cond ref + a + Ket + Ket + Ket + End +------------------------------------------------------------------ + +/((?(-2)a))/BZ +Failed: reference to non-existent subpattern at offset 7 + +/^(?(+1)X|Y)(.)/BZ +------------------------------------------------------------------ + Bra + ^ + Cond + 1 Cond ref + X + Alt + Y + Ket + CBra 1 + Any + Ket + Ket + End +------------------------------------------------------------------ + Y! + 0: Y! + 1: ! + +/(?tom|bon)-\k{A}/ + tom-tom + 0: tom-tom + 1: tom + bon-bon + 0: bon-bon + 1: bon + ** Failers +No match + tom-bon +No match + +/\g{A/ +Failed: syntax error in subpattern name (missing terminator) at offset 4 + +/(?|(abc)|(xyz))/BZ +------------------------------------------------------------------ + Bra + Bra + CBra 1 + abc + Ket + Alt + CBra 1 + xyz + Ket + Ket + Ket + End +------------------------------------------------------------------ + >abc< + 0: abc + 1: abc + >xyz< + 0: xyz + 1: xyz + +/(x)(?|(abc)|(xyz))(x)/BZ +------------------------------------------------------------------ + Bra + CBra 1 + x + Ket + Bra + CBra 2 + abc + Ket + Alt + CBra 2 + xyz + Ket + Ket + CBra 3 + x + Ket + Ket + End +------------------------------------------------------------------ + xabcx + 0: xabcx + 1: x + 2: abc + 3: x + xxyzx + 0: xxyzx + 1: x + 2: xyz + 3: x + +/(x)(?|(abc)(pqr)|(xyz))(x)/BZ +------------------------------------------------------------------ + Bra + CBra 1 + x + Ket + Bra + CBra 2 + abc + Ket + CBra 3 + pqr + Ket + Alt + CBra 2 + xyz + Ket + Ket + CBra 4 + x + Ket + Ket + End +------------------------------------------------------------------ + xabcpqrx + 0: xabcpqrx + 1: x + 2: abc + 3: pqr + 4: x + xxyzx + 0: xxyzx + 1: x + 2: xyz + 3: + 4: x + +/\H++X/BZ +------------------------------------------------------------------ + Bra + \H++ + X + Ket + End +------------------------------------------------------------------ + ** Failers +No match + XXXX +No match + +/\H+\hY/BZ +------------------------------------------------------------------ + Bra + \H++ + \h + Y + Ket + End +------------------------------------------------------------------ + XXXX Y + 0: XXXX Y + +/\H+ Y/BZ +------------------------------------------------------------------ + Bra + \H++ + Y + Ket + End +------------------------------------------------------------------ + +/\h+A/BZ +------------------------------------------------------------------ + Bra + \h++ + A + Ket + End +------------------------------------------------------------------ + +/\v*B/BZ +------------------------------------------------------------------ + Bra + \v*+ + B + Ket + End +------------------------------------------------------------------ + +/\V+\x0a/BZ +------------------------------------------------------------------ + Bra + \V++ + \x0a + Ket + End +------------------------------------------------------------------ + +/A+\h/BZ +------------------------------------------------------------------ + Bra + A++ + \h + Ket + End +------------------------------------------------------------------ + +/ *\H/BZ +------------------------------------------------------------------ + Bra + *+ + \H + Ket + End +------------------------------------------------------------------ + +/A*\v/BZ +------------------------------------------------------------------ + Bra + A*+ + \v + Ket + End +------------------------------------------------------------------ + +/\x0b*\V/BZ +------------------------------------------------------------------ + Bra + \x0b*+ + \V + Ket + End +------------------------------------------------------------------ + +/\d+\h/BZ +------------------------------------------------------------------ + Bra + \d++ + \h + Ket + End +------------------------------------------------------------------ + +/\d*\v/BZ +------------------------------------------------------------------ + Bra + \d*+ + \v + Ket + End +------------------------------------------------------------------ + +/S+\h\S+\v/BZ +------------------------------------------------------------------ + Bra + S++ + \h + \S++ + \v + Ket + End +------------------------------------------------------------------ + +/\w{3,}\h\w+\v/BZ +------------------------------------------------------------------ + Bra + \w{3} + \w*+ + \h + \w++ + \v + Ket + End +------------------------------------------------------------------ + +/\h+\d\h+\w\h+\S\h+\H/BZ +------------------------------------------------------------------ + Bra + \h++ + \d + \h++ + \w + \h++ + \S + \h++ + \H + Ket + End +------------------------------------------------------------------ + +/\v+\d\v+\w\v+\S\v+\V/BZ +------------------------------------------------------------------ + Bra + \v++ + \d + \v++ + \w + \v++ + \S + \v++ + \V + Ket + End +------------------------------------------------------------------ + +/\H+\h\H+\d/BZ +------------------------------------------------------------------ + Bra + \H++ + \h + \H+ + \d + Ket + End +------------------------------------------------------------------ + +/\V+\v\V+\w/BZ +------------------------------------------------------------------ + Bra + \V++ + \v + \V+ + \w + Ket + End +------------------------------------------------------------------ + +/\( (?: [^()]* | (?R) )* \)/x +\J1024(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(00)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0) + 0: (0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(00)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0) + +/[\E]AAA/ +Failed: missing terminating ] for character class at offset 7 + +/[\Q\E]AAA/ +Failed: missing terminating ] for character class at offset 9 + +/[^\E]AAA/ +Failed: missing terminating ] for character class at offset 8 + +/[^\Q\E]AAA/ +Failed: missing terminating ] for character class at offset 10 + +/[\E^]AAA/ +Failed: missing terminating ] for character class at offset 8 + +/[\Q\E^]AAA/ +Failed: missing terminating ] for character class at offset 10 + +/A(*PRUNE)B(*SKIP)C(*THEN)D(*COMMIT)E(*F)F(*FAIL)G(?!)H(*ACCEPT)I/BZ +------------------------------------------------------------------ + Bra + A + *PRUNE + B + *SKIP + C + *THEN + D + *COMMIT + E + *FAIL + F + *FAIL + G + *FAIL + H + *ACCEPT + I + Ket + End +------------------------------------------------------------------ + +/^a+(*FAIL)/C + aaaaaa +--->aaaaaa + +0 ^ ^ + +1 ^ a+ + +3 ^ ^ (*FAIL) + +3 ^ ^ (*FAIL) + +3 ^ ^ (*FAIL) + +3 ^ ^ (*FAIL) + +3 ^ ^ (*FAIL) + +3 ^^ (*FAIL) +No match + +/a+b?c+(*FAIL)/C + aaabccc +--->aaabccc + +0 ^ a+ + +2 ^ ^ b? + +4 ^ ^ c+ + +6 ^ ^ (*FAIL) + +6 ^ ^ (*FAIL) + +6 ^ ^ (*FAIL) + +0 ^ a+ + +2 ^ ^ b? + +4 ^ ^ c+ + +6 ^ ^ (*FAIL) + +6 ^ ^ (*FAIL) + +6 ^ ^ (*FAIL) + +0 ^ a+ + +2 ^^ b? + +4 ^ ^ c+ + +6 ^ ^ (*FAIL) + +6 ^ ^ (*FAIL) + +6 ^ ^ (*FAIL) +No match + +/a+b?(*PRUNE)c+(*FAIL)/C + aaabccc +--->aaabccc + +0 ^ a+ + +2 ^ ^ b? + +4 ^ ^ (*PRUNE) ++12 ^ ^ c+ ++14 ^ ^ (*FAIL) ++14 ^ ^ (*FAIL) ++14 ^ ^ (*FAIL) + +0 ^ a+ + +2 ^ ^ b? + +4 ^ ^ (*PRUNE) ++12 ^ ^ c+ ++14 ^ ^ (*FAIL) ++14 ^ ^ (*FAIL) ++14 ^ ^ (*FAIL) + +0 ^ a+ + +2 ^^ b? + +4 ^ ^ (*PRUNE) ++12 ^ ^ c+ ++14 ^ ^ (*FAIL) ++14 ^ ^ (*FAIL) ++14 ^ ^ (*FAIL) +No match + +/a+b?(*COMMIT)c+(*FAIL)/C + aaabccc +--->aaabccc + +0 ^ a+ + +2 ^ ^ b? + +4 ^ ^ (*COMMIT) ++13 ^ ^ c+ ++15 ^ ^ (*FAIL) ++15 ^ ^ (*FAIL) ++15 ^ ^ (*FAIL) +No match + +/a+b?(*SKIP)c+(*FAIL)/C + aaabcccaaabccc +--->aaabcccaaabccc + +0 ^ a+ + +2 ^ ^ b? + +4 ^ ^ (*SKIP) ++11 ^ ^ c+ ++13 ^ ^ (*FAIL) ++13 ^ ^ (*FAIL) ++13 ^ ^ (*FAIL) + +0 ^ a+ + +2 ^ ^ b? + +4 ^ ^ (*SKIP) ++11 ^ ^ c+ ++13 ^ ^ (*FAIL) ++13 ^ ^ (*FAIL) ++13 ^ ^ (*FAIL) +No match + +/a+b?(*THEN)c+(*FAIL)/C + aaabccc +--->aaabccc + +0 ^ a+ + +2 ^ ^ b? + +4 ^ ^ (*THEN) ++11 ^ ^ c+ ++13 ^ ^ (*FAIL) ++13 ^ ^ (*FAIL) ++13 ^ ^ (*FAIL) + +0 ^ a+ + +2 ^ ^ b? + +4 ^ ^ (*THEN) ++11 ^ ^ c+ ++13 ^ ^ (*FAIL) ++13 ^ ^ (*FAIL) ++13 ^ ^ (*FAIL) + +0 ^ a+ + +2 ^^ b? + +4 ^ ^ (*THEN) ++11 ^ ^ c+ ++13 ^ ^ (*FAIL) ++13 ^ ^ (*FAIL) ++13 ^ ^ (*FAIL) +No match + +/a(*MARK)b/ +Failed: (*MARK) must have an argument at offset 7 + +/(?i:A{1,}\6666666666)/ +Failed: number is too big at offset 19 + +/\g6666666666/ +Failed: number is too big at offset 11 + +/[\g6666666666]/BZ +------------------------------------------------------------------ + Bra + [6g] + Ket + End +------------------------------------------------------------------ + +/(?1)\c[/ +Failed: reference to non-existent subpattern at offset 3 + +/.+A/ + \r\nA +No match + +/\nA/ + \r\nA + 0: \x0aA + +/[\r\n]A/ + \r\nA + 0: \x0aA + +/(\r|\n)A/ + \r\nA + 0: \x0aA + 1: \x0a + +/a(*CR)b/ +Failed: (*VERB) not recognized or malformed at offset 5 + +/(*CR)a.b/ + a\nb + 0: a\x0ab + ** Failers +No match + a\rb +No match + +/(*CR)a.b/ + a\nb + 0: a\x0ab + ** Failers +No match + a\rb +No match + +/(*LF)a.b/ + a\rb + 0: a\x0db + ** Failers +No match + a\nb +No match + +/(*CRLF)a.b/ + a\rb + 0: a\x0db + a\nb + 0: a\x0ab + ** Failers +No match + a\r\nb +No match + +/(*ANYCRLF)a.b/ + ** Failers +No match + a\rb +No match + a\nb +No match + a\r\nb +No match + +/(*ANY)a.b/ + ** Failers +No match + a\rb +No match + a\nb +No match + a\r\nb +No match + a\x85b +No match + +/(*ANY).*/g + abc\r\ndef + 0: abc + 0: + 0: def + 0: + +/(*ANYCRLF).*/g + abc\r\ndef + 0: abc + 0: + 0: def + 0: + +/(*CRLF).*/g + abc\r\ndef + 0: abc + 0: + 0: def + 0: + +/a\Rb/I +Capturing subpattern count = 0 +Options: bsr_anycrlf +First char = 'a' +Need char = 'b' + a\rb + 0: a\x0db + a\nb + 0: a\x0ab + a\r\nb + 0: a\x0d\x0ab + ** Failers +No match + a\x85b +No match + a\x0bb +No match + +/a\Rb/I +Capturing subpattern count = 0 +Options: bsr_unicode +First char = 'a' +Need char = 'b' + a\rb + 0: a\x0db + a\nb + 0: a\x0ab + a\r\nb + 0: a\x0d\x0ab + a\x85b + 0: a\x85b + a\x0bb + 0: a\x0bb + ** Failers +No match + a\x85b\ +No match + a\x0bb\ +No match + +/a\R?b/I +Capturing subpattern count = 0 +Options: bsr_anycrlf +First char = 'a' +Need char = 'b' + a\rb + 0: a\x0db + a\nb + 0: a\x0ab + a\r\nb + 0: a\x0d\x0ab + ** Failers +No match + a\x85b +No match + a\x0bb +No match + +/a\R?b/I +Capturing subpattern count = 0 +Options: bsr_unicode +First char = 'a' +Need char = 'b' + a\rb + 0: a\x0db + a\nb + 0: a\x0ab + a\r\nb + 0: a\x0d\x0ab + a\x85b + 0: a\x85b + a\x0bb + 0: a\x0bb + ** Failers +No match + a\x85b\ +No match + a\x0bb\ +No match + +/a\R{2,4}b/I +Capturing subpattern count = 0 +Options: bsr_anycrlf +First char = 'a' +Need char = 'b' + a\r\n\nb + 0: a\x0d\x0a\x0ab + a\n\r\rb + 0: a\x0a\x0d\x0db + a\r\n\r\n\r\n\r\nb + 0: a\x0d\x0a\x0d\x0a\x0d\x0a\x0d\x0ab + ** Failers +No match + a\x85\85b +No match + a\x0b\0bb +No match + +/a\R{2,4}b/I +Capturing subpattern count = 0 +Options: bsr_unicode +First char = 'a' +Need char = 'b' + a\r\rb + 0: a\x0d\x0db + a\n\n\nb + 0: a\x0a\x0a\x0ab + a\r\n\n\r\rb + 0: a\x0d\x0a\x0a\x0d\x0db + a\x85\85b +No match + a\x0b\0bb +No match + ** Failers +No match + a\r\r\r\r\rb +No match + a\x85\85b\ +No match + a\x0b\0bb\ +No match + +/(*BSR_ANYCRLF)a\Rb/I +Capturing subpattern count = 0 +Options: bsr_anycrlf +First char = 'a' +Need char = 'b' + a\nb + 0: a\x0ab + a\rb + 0: a\x0db + +/(*BSR_UNICODE)a\Rb/I +Capturing subpattern count = 0 +Options: bsr_unicode +First char = 'a' +Need char = 'b' + a\x85b + 0: a\x85b + +/(*BSR_ANYCRLF)(*CRLF)a\Rb/I +Capturing subpattern count = 0 +Options: bsr_anycrlf +Forced newline sequence: CRLF +First char = 'a' +Need char = 'b' + a\nb + 0: a\x0ab + a\rb + 0: a\x0db + +/(*CRLF)(*BSR_UNICODE)a\Rb/I +Capturing subpattern count = 0 +Options: bsr_unicode +Forced newline sequence: CRLF +First char = 'a' +Need char = 'b' + a\x85b + 0: a\x85b + +/(*CRLF)(*BSR_ANYCRLF)(*CR)ab/I +Capturing subpattern count = 0 +Options: bsr_anycrlf +Forced newline sequence: CR +First char = 'a' +Need char = 'b' + +/(?)(?&)/ +Failed: subpattern name expected at offset 9 + +/(?)(?&a)/ +Failed: reference to non-existent subpattern at offset 12 + +/(?)(?&aaaaaaaaaaaaaaaaaaaaaaa)/ +Failed: reference to non-existent subpattern at offset 32 + +/(?+-a)/ +Failed: digit expected after (?+ at offset 3 + +/(?-+a)/ +Failed: unrecognized character after (? or (?- at offset 3 + +/(?(-1))/ +Failed: reference to non-existent subpattern at offset 6 + +/(?(+10))/ +Failed: reference to non-existent subpattern at offset 7 + +/(?(10))/ +Failed: reference to non-existent subpattern at offset 6 + +/(?(+2))()()/ + +/(?(2))()()/ + +/\k''/ +Failed: subpattern name expected at offset 3 + +/\k<>/ +Failed: subpattern name expected at offset 3 + +/\k{}/ +Failed: subpattern name expected at offset 3 + +/\k/ +Failed: \k is not followed by a braced, angle-bracketed, or quoted name at offset 1 + +/\kabc/ +Failed: \k is not followed by a braced, angle-bracketed, or quoted name at offset 1 + +/(?P=)/ +Failed: subpattern name expected at offset 4 + +/(?P>)/ +Failed: subpattern name expected at offset 4 + +/(?!\w)(?R)/ +Failed: recursive call could loop indefinitely at offset 9 + +/(?=\w)(?R)/ +Failed: recursive call could loop indefinitely at offset 9 + +/(?x|y){0}z/ + xzxx + 0: xz + yzyy + 0: yz + ** Failers +No match + xxz +No match + +/(\3)(\1)(a)/ + cat +No match + +/(\3)(\1)(a)/ + cat + 0: a + 1: + 2: + 3: a + +/TA]/ + The ACTA] comes + 0: TA] + +/TA]/ +Failed: ] is an invalid data character in JavaScript compatibility mode at offset 2 + +/(?2)[]a()b](abc)/ +Failed: reference to non-existent subpattern at offset 3 + +/(?2)[^]a()b](abc)/ +Failed: reference to non-existent subpattern at offset 3 + +/(?1)[]a()b](abc)/ + abcbabc + 0: abcbabc + 1: abc + ** Failers +No match + abcXabc +No match + +/(?1)[^]a()b](abc)/ + abcXabc + 0: abcXabc + 1: abc + ** Failers +No match + abcbabc +No match + +/(?2)[]a()b](abc)(xyz)/ + xyzbabcxyz + 0: xyzbabcxyz + 1: abc + 2: xyz + +/(?&N)[]a(?)](?abc)/ +Failed: reference to non-existent subpattern at offset 4 + +/(?&N)[]a(?)](abc)/ +Failed: reference to non-existent subpattern at offset 4 + +/a[]b/ +Failed: missing terminating ] for character class at offset 4 + +/a[^]b/ +Failed: missing terminating ] for character class at offset 5 + +/a[]b/ + ** Failers +No match + ab +No match + +/a[]+b/ + ** Failers +No match + ab +No match + +/a[]*+b/ + ** Failers +No match + ab +No match + +/a[^]b/ + aXb + 0: aXb + a\nb + 0: a\x0ab + ** Failers +No match + ab +No match + +/a[^]+b/ + aXb + 0: aXb + a\nX\nXb + 0: a\x0aX\x0aXb + ** Failers +No match + ab +No match + +/a(?!)b/BZ +------------------------------------------------------------------ + Bra + a + *FAIL + b + Ket + End +------------------------------------------------------------------ + +/(?!)?a/BZ +------------------------------------------------------------------ + Bra + Brazero + Assert not + Ket + a + Ket + End +------------------------------------------------------------------ + ab + 0: a + +/a(*FAIL)+b/ +Failed: nothing to repeat at offset 8 + +/(abc|pqr|123){0}[xyz]/SI +Capturing subpattern count = 1 +No options +No first char +No need char +Subject length lower bound = 1 +Starting chars: x y z + +/(?(?=.*b)b|^)/CI +Capturing subpattern count = 0 +May match empty string +Options: +No first char +No need char + adc +--->adc + +0 ^ (?(?=.*b)b|^) + +2 ^ (?=.*b) + +5 ^ .* + +7 ^ ^ b + +7 ^ ^ b + +7 ^^ b + +7 ^ b ++11 ^ ^ ++12 ^ ) ++13 ^ + 0: + abc +--->abc + +0 ^ (?(?=.*b)b|^) + +2 ^ (?=.*b) + +5 ^ .* + +7 ^ ^ b + +7 ^ ^ b + +7 ^^ b + +8 ^ ^ ) + +9 ^ b + +0 ^ (?(?=.*b)b|^) + +2 ^ (?=.*b) + +5 ^ .* + +7 ^ ^ b + +7 ^^ b + +7 ^ b + +8 ^^ ) + +9 ^ b ++10 ^^ | ++13 ^^ + 0: b + +/(?(?=b).*b|^d)/I +Capturing subpattern count = 0 +No options +No first char +No need char + +/(?(?=.*b).*b|^d)/I +Capturing subpattern count = 0 +No options +No first char +No need char + +/xyz/C + xyz +--->xyz + +0 ^ x + +1 ^^ y + +2 ^ ^ z + +3 ^ ^ + 0: xyz + abcxyz +--->abcxyz + +0 ^ x + +1 ^^ y + +2 ^ ^ z + +3 ^ ^ + 0: xyz + abcxyz\Y +--->abcxyz + +0 ^ x + +0 ^ x + +0 ^ x + +0 ^ x + +1 ^^ y + +2 ^ ^ z + +3 ^ ^ + 0: xyz + ** Failers +No match + abc +No match + abc\Y +--->abc + +0 ^ x + +0 ^ x + +0 ^ x + +0 ^ x +No match + abcxypqr +No match + abcxypqr\Y +--->abcxypqr + +0 ^ x + +0 ^ x + +0 ^ x + +0 ^ x + +1 ^^ y + +2 ^ ^ z + +0 ^ x + +0 ^ x + +0 ^ x + +0 ^ x + +0 ^ x +No match + +/(*NO_START_OPT)xyz/C + abcxyz +--->abcxyz ++15 ^ x ++15 ^ x ++15 ^ x ++15 ^ x ++16 ^^ y ++17 ^ ^ z ++18 ^ ^ + 0: xyz + +/(*NO_AUTO_POSSESS)a+b/BZ +------------------------------------------------------------------ + Bra + a+ + b + Ket + End +------------------------------------------------------------------ + +/xyz/CY + abcxyz +--->abcxyz + +0 ^ x + +0 ^ x + +0 ^ x + +0 ^ x + +1 ^^ y + +2 ^ ^ z + +3 ^ ^ + 0: xyz + +/^"((?(?=[a])[^"])|b)*"$/C + "ab" +--->"ab" + +0 ^ ^ + +1 ^ " + +2 ^^ ((?(?=[a])[^"])|b)* + +3 ^^ (?(?=[a])[^"]) + +5 ^^ (?=[a]) + +8 ^^ [a] ++11 ^ ^ ) ++12 ^^ [^"] ++16 ^ ^ ) ++17 ^ ^ | + +3 ^ ^ (?(?=[a])[^"]) + +5 ^ ^ (?=[a]) + +8 ^ ^ [a] ++17 ^ ^ | ++21 ^ ^ " ++18 ^ ^ b ++19 ^ ^ ) + +3 ^ ^ (?(?=[a])[^"]) + +5 ^ ^ (?=[a]) + +8 ^ ^ [a] ++17 ^ ^ | ++21 ^ ^ " ++22 ^ ^ $ ++23 ^ ^ + 0: "ab" + 1: + +/^"((?(?=[a])[^"])|b)*"$/ + "ab" + 0: "ab" + 1: + +/^X(?5)(a)(?|(b)|(q))(c)(d)Y/ +Failed: reference to non-existent subpattern at offset 5 + +/^X(?&N)(a)(?|(b)|(q))(c)(d)(?Y)/ + XYabcdY + 0: XYabcdY + 1: a + 2: b + 3: c + 4: d + 5: Y + +/Xa{2,4}b/ + X\P +Partial match: X + Xa\P +Partial match: Xa + Xaa\P +Partial match: Xaa + Xaaa\P +Partial match: Xaaa + Xaaaa\P +Partial match: Xaaaa + +/Xa{2,4}?b/ + X\P +Partial match: X + Xa\P +Partial match: Xa + Xaa\P +Partial match: Xaa + Xaaa\P +Partial match: Xaaa + Xaaaa\P +Partial match: Xaaaa + +/Xa{2,4}+b/ + X\P +Partial match: X + Xa\P +Partial match: Xa + Xaa\P +Partial match: Xaa + Xaaa\P +Partial match: Xaaa + Xaaaa\P +Partial match: Xaaaa + +/X\d{2,4}b/ + X\P +Partial match: X + X3\P +Partial match: X3 + X33\P +Partial match: X33 + X333\P +Partial match: X333 + X3333\P +Partial match: X3333 + +/X\d{2,4}?b/ + X\P +Partial match: X + X3\P +Partial match: X3 + X33\P +Partial match: X33 + X333\P +Partial match: X333 + X3333\P +Partial match: X3333 + +/X\d{2,4}+b/ + X\P +Partial match: X + X3\P +Partial match: X3 + X33\P +Partial match: X33 + X333\P +Partial match: X333 + X3333\P +Partial match: X3333 + +/X\D{2,4}b/ + X\P +Partial match: X + Xa\P +Partial match: Xa + Xaa\P +Partial match: Xaa + Xaaa\P +Partial match: Xaaa + Xaaaa\P +Partial match: Xaaaa + +/X\D{2,4}?b/ + X\P +Partial match: X + Xa\P +Partial match: Xa + Xaa\P +Partial match: Xaa + Xaaa\P +Partial match: Xaaa + Xaaaa\P +Partial match: Xaaaa + +/X\D{2,4}+b/ + X\P +Partial match: X + Xa\P +Partial match: Xa + Xaa\P +Partial match: Xaa + Xaaa\P +Partial match: Xaaa + Xaaaa\P +Partial match: Xaaaa + +/X[abc]{2,4}b/ + X\P +Partial match: X + Xa\P +Partial match: Xa + Xaa\P +Partial match: Xaa + Xaaa\P +Partial match: Xaaa + Xaaaa\P +Partial match: Xaaaa + +/X[abc]{2,4}?b/ + X\P +Partial match: X + Xa\P +Partial match: Xa + Xaa\P +Partial match: Xaa + Xaaa\P +Partial match: Xaaa + Xaaaa\P +Partial match: Xaaaa + +/X[abc]{2,4}+b/ + X\P +Partial match: X + Xa\P +Partial match: Xa + Xaa\P +Partial match: Xaa + Xaaa\P +Partial match: Xaaa + Xaaaa\P +Partial match: Xaaaa + +/X[^a]{2,4}b/ + X\P +Partial match: X + Xz\P +Partial match: Xz + Xzz\P +Partial match: Xzz + Xzzz\P +Partial match: Xzzz + Xzzzz\P +Partial match: Xzzzz + +/X[^a]{2,4}?b/ + X\P +Partial match: X + Xz\P +Partial match: Xz + Xzz\P +Partial match: Xzz + Xzzz\P +Partial match: Xzzz + Xzzzz\P +Partial match: Xzzzz + +/X[^a]{2,4}+b/ + X\P +Partial match: X + Xz\P +Partial match: Xz + Xzz\P +Partial match: Xzz + Xzzz\P +Partial match: Xzzz + Xzzzz\P +Partial match: Xzzzz + +/(Y)X\1{2,4}b/ + YX\P +Partial match: YX + YXY\P +Partial match: YXY + YXYY\P +Partial match: YXYY + YXYYY\P +Partial match: YXYYY + YXYYYY\P +Partial match: YXYYYY + +/(Y)X\1{2,4}?b/ + YX\P +Partial match: YX + YXY\P +Partial match: YXY + YXYY\P +Partial match: YXYY + YXYYY\P +Partial match: YXYYY + YXYYYY\P +Partial match: YXYYYY + +/(Y)X\1{2,4}+b/ + YX\P +Partial match: YX + YXY\P +Partial match: YXY + YXYY\P +Partial match: YXYY + YXYYY\P +Partial match: YXYYY + YXYYYY\P +Partial match: YXYYYY + +/\++\KZ|\d+X|9+Y/ + ++++123999\P +Partial match: 123999 + ++++123999Y\P + 0: 999Y + ++++Z1234\P + 0: Z + +/Z(*F)/ + Z\P +No match + ZA\P +No match + +/Z(?!)/ + Z\P +No match + ZA\P +No match + +/dog(sbody)?/ + dogs\P + 0: dog + dogs\P\P +Partial match: dogs + +/dog(sbody)??/ + dogs\P + 0: dog + dogs\P\P + 0: dog + +/dog|dogsbody/ + dogs\P + 0: dog + dogs\P\P + 0: dog + +/dogsbody|dog/ + dogs\P + 0: dog + dogs\P\P +Partial match: dogs + +/\bthe cat\b/ + the cat\P + 0: the cat + the cat\P\P +Partial match: the cat + +/abc/ + abc\P + 0: abc + abc\P\P + 0: abc + +/abc\K123/ + xyzabc123pqr + 0: 123 + xyzabc12\P +Partial match: abc12 + xyzabc12\P\P +Partial match: abc12 + +/(?<=abc)123/ + xyzabc123pqr + 0: 123 + xyzabc12\P +Partial match at offset 6: abc12 + xyzabc12\P\P +Partial match at offset 6: abc12 + +/\babc\b/ + +++abc+++ + 0: abc + +++ab\P +Partial match at offset 3: +ab + +++ab\P\P +Partial match at offset 3: +ab + +/(?&word)(?&element)(?(DEFINE)(?<[^m][^>]>[^<])(?\w*+))/BZ +------------------------------------------------------------------ + Bra + Recurse + Recurse + Cond + Cond def + CBra 1 + < + [^m] + [^>] + > + [^<] + Ket + CBra 2 + \w*+ + Ket + Ket + Ket + End +------------------------------------------------------------------ + +/(?&word)(?&element)(?(DEFINE)(?<[^\d][^>]>[^<])(?\w*+))/BZ +------------------------------------------------------------------ + Bra + Recurse + Recurse + Cond + Cond def + CBra 1 + < + [\x00-/:-\xff] (neg) + [^>] + > + [^<] + Ket + CBra 2 + \w*+ + Ket + Ket + Ket + End +------------------------------------------------------------------ + +/(ab)(x(y)z(cd(*ACCEPT)))pq/BZ +------------------------------------------------------------------ + Bra + CBra 1 + ab + Ket + CBra 2 + x + CBra 3 + y + Ket + z + CBra 4 + cd + Close 4 + Close 2 + *ACCEPT + Ket + Ket + pq + Ket + End +------------------------------------------------------------------ + +/abc\K/+ + abcdef + 0: + 0+ def + abcdef\N\N + 0: + 0+ def + xyzabcdef\N\N + 0: + 0+ def + ** Failers +No match + abcdef\N +No match + xyzabcdef\N +No match + +/^(?:(?=abc)|abc\K)/+ + abcdef + 0: + 0+ abcdef + abcdef\N\N + 0: + 0+ def + ** Failers +No match + abcdef\N +No match + +/a?b?/+ + xyz + 0: + 0+ xyz + xyzabc + 0: + 0+ xyzabc + xyzabc\N + 0: ab + 0+ c + xyzabc\N\N + 0: + 0+ yzabc + xyz\N\N + 0: + 0+ yz + ** Failers + 0: + 0+ ** Failers + xyz\N +No match + +/^a?b?/+ + xyz + 0: + 0+ xyz + xyzabc + 0: + 0+ xyzabc + ** Failers + 0: + 0+ ** Failers + xyzabc\N +No match + xyzabc\N\N +No match + xyz\N\N +No match + xyz\N +No match + +/^(?a|b\gc)/ + aaaa + 0: a + 1: a + bacxxx + 0: bac + 1: bac + bbaccxxx + 0: bbacc + 1: bbacc + bbbacccxx + 0: bbbaccc + 1: bbbaccc + +/^(?a|b\g'name'c)/ + aaaa + 0: a + 1: a + bacxxx + 0: bac + 1: bac + bbaccxxx + 0: bbacc + 1: bbacc + bbbacccxx + 0: bbbaccc + 1: bbbaccc + +/^(a|b\g<1>c)/ + aaaa + 0: a + 1: a + bacxxx + 0: bac + 1: bac + bbaccxxx + 0: bbacc + 1: bbacc + bbbacccxx + 0: bbbaccc + 1: bbbaccc + +/^(a|b\g'1'c)/ + aaaa + 0: a + 1: a + bacxxx + 0: bac + 1: bac + bbaccxxx + 0: bbacc + 1: bbacc + bbbacccxx + 0: bbbaccc + 1: bbbaccc + +/^(a|b\g'-1'c)/ + aaaa + 0: a + 1: a + bacxxx + 0: bac + 1: bac + bbaccxxx + 0: bbacc + 1: bbacc + bbbacccxx + 0: bbbaccc + 1: bbbaccc + +/(^(a|b\g<-1>c))/ + aaaa + 0: a + 1: a + 2: a + bacxxx + 0: bac + 1: bac + 2: bac + bbaccxxx + 0: bbacc + 1: bbacc + 2: bbacc + bbbacccxx + 0: bbbaccc + 1: bbbaccc + 2: bbbaccc + +/(?-i:\g)(?i:(?a))/ + XaaX + 0: aa + 1: a + XAAX + 0: AA + 1: A + +/(?i:\g)(?-i:(?a))/ + XaaX + 0: aa + 1: a + ** Failers +No match + XAAX +No match + +/(?-i:\g<+1>)(?i:(a))/ + XaaX + 0: aa + 1: a + XAAX + 0: AA + 1: A + +/(?=(?(?#simplesyntax)\$(?[a-zA-Z_\x{7f}-\x{ff}][a-zA-Z0-9_\x{7f}-\x{ff}]*)(?:\[(?[a-zA-Z0-9_\x{7f}-\x{ff}]+|\$\g)\]|->\g(\(.*?\))?)?|(?#simple syntax withbraces)\$\{(?:\g(?\[(?:\g|'(?:\\.|[^'\\])*'|"(?:\g|\\.|[^"\\])*")\])?|\g|\$\{\g\})\}|(?#complexsyntax)\{(?\$(?\g(\g*|\(.*?\))?)(?:->\g)*|\$\g|\$\{\g\})\}))\{/ + +/(?a|b|c)\g*/ + abc + 0: abc + 1: a + accccbbb + 0: accccbbb + 1: a + +/^X(?7)(a)(?|(b)|(q)(r)(s))(c)(d)(Y)/ + XYabcdY + 0: XYabcdY + 1: a + 2: b + 3: + 4: + 5: c + 6: d + 7: Y + +/(?<=b(?1)|zzz)(a)/ + xbaax + 0: a + 1: a + xzzzax + 0: a + 1: a + +/(a)(?<=b\1)/ +Failed: lookbehind assertion is not fixed length at offset 10 + +/(a)(?<=b+(?1))/ +Failed: lookbehind assertion is not fixed length at offset 13 + +/(a+)(?<=b(?1))/ +Failed: lookbehind assertion is not fixed length at offset 14 + +/(a(?<=b(?1)))/ +Failed: lookbehind assertion is not fixed length at offset 13 + +/(?<=b(?1))xyz/ +Failed: reference to non-existent subpattern at offset 8 + +/(?<=b(?1))xyz(b+)pqrstuvew/ +Failed: lookbehind assertion is not fixed length at offset 26 + +/(a|bc)\1/SI +Capturing subpattern count = 1 +Max back reference = 1 +No options +No first char +No need char +Subject length lower bound = 2 +Starting chars: a b + +/(a|bc)\1{2,3}/SI +Capturing subpattern count = 1 +Max back reference = 1 +No options +No first char +No need char +Subject length lower bound = 3 +Starting chars: a b + +/(a|bc)(?1)/SI +Capturing subpattern count = 1 +No options +No first char +No need char +Subject length lower bound = 2 +Starting chars: a b + +/(a|b\1)(a|b\1)/SI +Capturing subpattern count = 2 +Max back reference = 1 +No options +No first char +No need char +Subject length lower bound = 2 +Starting chars: a b + +/(a|b\1){2}/SI +Capturing subpattern count = 1 +Max back reference = 1 +No options +No first char +No need char +Subject length lower bound = 2 +Starting chars: a b + +/(a|bbbb\1)(a|bbbb\1)/SI +Capturing subpattern count = 2 +Max back reference = 1 +No options +No first char +No need char +Subject length lower bound = 2 +Starting chars: a b + +/(a|bbbb\1){2}/SI +Capturing subpattern count = 1 +Max back reference = 1 +No options +No first char +No need char +Subject length lower bound = 2 +Starting chars: a b + +/^From +([^ ]+) +[a-zA-Z][a-zA-Z][a-zA-Z] +[a-zA-Z][a-zA-Z][a-zA-Z] +[0-9]?[0-9] +[0-9][0-9]:[0-9][0-9]/SI +Capturing subpattern count = 1 +Options: anchored +No first char +Need char = ':' +Subject length lower bound = 22 +No starting char list + +/]{0,})>]{0,})>([\d]{0,}\.)(.*)((
([\w\W\s\d][^<>]{0,})|[\s]{0,}))<\/a><\/TD>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD><\/TR>/isIS +Capturing subpattern count = 11 +Options: caseless dotall +First char = '<' +Need char = '>' +Subject length lower bound = 47 +No starting char list + +"(?>.*/)foo"SI +Capturing subpattern count = 0 +No options +No first char +Need char = 'o' +Subject length lower bound = 4 +No starting char list + +/(?(?=[^a-z]+[a-z]) \d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} ) /xSI +Capturing subpattern count = 0 +Options: extended +No first char +Need char = '-' +Subject length lower bound = 8 +No starting char list + +/(?:(?:(?:(?:(?:(?:(?:(?:(?:(a|b|c))))))))))/iSI +Capturing subpattern count = 1 +Options: caseless +No first char +No need char +Subject length lower bound = 1 +Starting chars: A B C a b c + +/(?:c|d)(?:)(?:aaaaaaaa(?:)(?:bbbbbbbb)(?:bbbbbbbb(?:))(?:bbbbbbbb(?:)(?:bbbbbbbb)))/SI +Capturing subpattern count = 0 +No options +No first char +Need char = 'b' +Subject length lower bound = 41 +Starting chars: c d + +/A)|(?
B))/I +Capturing subpattern count = 1 +Named capturing subpatterns: + a 1 +No options +No first char +No need char + AB\Ca + 0: A + 1: A + C A (1) a + BA\Ca + 0: B + 1: B + C B (1) a + +/(?|(?A)|(?B))/ +Failed: different names for subpatterns of the same number are not allowed at offset 15 + +/(?:a(? (?')|(?")) | + b(? (?')|(?")) ) + (?('quote')[a-z]+|[0-9]+)/JIx +Capturing subpattern count = 6 +Max back reference = 1 +Named capturing subpatterns: + apostrophe 2 + apostrophe 5 + quote 1 + quote 4 + realquote 3 + realquote 6 +Options: extended dupnames +No first char +No need char + a"aaaaa + 0: a"aaaaa + 1: " + 2: + 3: " + b"aaaaa + 0: b"aaaaa + 1: + 2: + 3: + 4: " + 5: + 6: " + ** Failers +No match + b"11111 +No match + a"11111 +No match + +/^(?|(a)(b)(c)(?d)|(?e)) (?('D')X|Y)/JDZx +------------------------------------------------------------------ + Bra + ^ + Bra + CBra 1 + a + Ket + CBra 2 + b + Ket + CBra 3 + c + Ket + CBra 4 + d + Ket + Alt + CBra 1 + e + Ket + Ket + Cond + Cond ref 2 + X + Alt + Y + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 4 +Max back reference = 4 +Named capturing subpatterns: + D 4 + D 1 +Options: anchored extended dupnames +No first char +No need char + abcdX + 0: abcdX + 1: a + 2: b + 3: c + 4: d + eX + 0: eX + 1: e + ** Failers +No match + abcdY +No match + ey +No match + +/(?a) (b)(c) (?d (?(R&A)$ | (?4)) )/JDZx +------------------------------------------------------------------ + Bra + CBra 1 + a + Ket + CBra 2 + b + Ket + CBra 3 + c + Ket + CBra 4 + d + Cond + Cond recurse 2 + $ + Alt + Recurse + Ket + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 4 +Max back reference = 1 +Named capturing subpatterns: + A 1 + A 4 +Options: extended dupnames +First char = 'a' +Need char = 'd' + abcdd + 0: abcdd + 1: a + 2: b + 3: c + 4: dd + ** Failers +No match + abcdde +No match + +/abcd*/ + xxxxabcd\P + 0: abcd + xxxxabcd\P\P +Partial match: abcd + +/abcd*/i + xxxxabcd\P + 0: abcd + xxxxabcd\P\P +Partial match: abcd + XXXXABCD\P + 0: ABCD + XXXXABCD\P\P +Partial match: ABCD + +/abc\d*/ + xxxxabc1\P + 0: abc1 + xxxxabc1\P\P +Partial match: abc1 + +/(a)bc\1*/ + xxxxabca\P + 0: abca + 1: a + xxxxabca\P\P +Partial match: abca + +/abc[de]*/ + xxxxabcde\P + 0: abcde + xxxxabcde\P\P +Partial match: abcde + +/-- This is not in the Perl-compatible test because Perl seems currently to be + broken and not behaving as specified in that it *does* bumpalong after + hitting (*COMMIT). --/ + +/(?1)(A(*COMMIT)|B)D/ + ABD + 0: ABD + 1: B + XABD + 0: ABD + 1: B + BAD + 0: BAD + 1: A + ABXABD + 0: ABD + 1: B + ** Failers +No match + ABX +No match + BAXBAD +No match + +/(\3)(\1)(a)/ + cat + 0: a + 1: + 2: + 3: a + +/(\3)(\1)(a)/SI +Capturing subpattern count = 3 +Max back reference = 3 +Options: +No first char +Need char = 'a' +Subject length lower bound = 1 +No starting char list + cat + 0: a + 1: + 2: + 3: a + +/(\3)(\1)(a)/SI +Capturing subpattern count = 3 +Max back reference = 3 +No options +No first char +Need char = 'a' +Subject length lower bound = 3 +No starting char list + cat +No match + +/i(?(DEFINE)(?a))/SI +Capturing subpattern count = 1 +Named capturing subpatterns: + s 1 +No options +First char = 'i' +No need char +Subject length lower bound = 1 +No starting char list + i + 0: i + +/()i(?(1)a)/SI +Capturing subpattern count = 1 +Max back reference = 1 +No options +No first char +Need char = 'i' +Subject length lower bound = 1 +Starting chars: i + ia + 0: ia + 1: + +/(?i)a(?-i)b|c/BZ +------------------------------------------------------------------ + Bra + /i a + b + Alt + c + Ket + End +------------------------------------------------------------------ + XabX + 0: ab + XAbX + 0: Ab + CcC + 0: c + ** Failers +No match + XABX +No match + +/(?i)a(?s)b|c/BZ +------------------------------------------------------------------ + Bra + /i ab + Alt + /i c + Ket + End +------------------------------------------------------------------ + +/(?i)a(?s-i)b|c/BZ +------------------------------------------------------------------ + Bra + /i a + b + Alt + c + Ket + End +------------------------------------------------------------------ + +/^(ab(c\1)d|x){2}$/BZ +------------------------------------------------------------------ + Bra + ^ + Once + CBra 1 + ab + CBra 2 + c + \1 + Ket + d + Alt + x + Ket + Ket + Once + CBra 1 + ab + CBra 2 + c + \1 + Ket + d + Alt + x + Ket + Ket + $ + Ket + End +------------------------------------------------------------------ + xabcxd + 0: xabcxd + 1: abcxd + 2: cx + +/^(?&t)*+(?(DEFINE)(?.))$/BZ +------------------------------------------------------------------ + Bra + ^ + Braposzero + SBraPos + Recurse + KetRpos + Cond + Cond def + CBra 1 + Any + Ket + Ket + $ + Ket + End +------------------------------------------------------------------ + +/^(?&t)*(?(DEFINE)(?.))$/BZ +------------------------------------------------------------------ + Bra + ^ + Brazero + Once + Recurse + KetRmax + Cond + Cond def + CBra 1 + Any + Ket + Ket + $ + Ket + End +------------------------------------------------------------------ + +/ -- This one is here because Perl gives the match as "b" rather than "ab". I + believe this to be a Perl bug. --/ + +/(?>a\Kb)z|(ab)/ + ab + 0: ab + 1: ab + +/(?P(?P0|)|(?P>L2)(?P>L1))/ +Failed: recursive call could loop indefinitely at offset 31 + +/abc(*MARK:)pqr/ +Failed: (*MARK) must have an argument at offset 10 + +/abc(*:)pqr/ +Failed: (*MARK) must have an argument at offset 6 + +/abc(*FAIL:123)xyz/ +Failed: an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT) at offset 13 + +/--- This should, and does, fail. In Perl, it does not, which I think is a + bug because replacing the B in the pattern by (B|D) does make it fail. ---/ + +/A(*COMMIT)B/+K + ACABX +No match + +/--- These should be different, but in Perl they are not, which I think + is a bug in Perl. ---/ + +/A(*THEN)B|A(*THEN)C/K + AC + 0: AC + +/A(*PRUNE)B|A(*PRUNE)C/K + AC +No match + +/--- Mark names can be duplicated. Perl doesn't give a mark for this one, +though PCRE does. ---/ + +/^A(*:A)B|^X(*:A)Y/K + ** Failers +No match + XAQQ +No match, mark = A + +/--- COMMIT at the start of a pattern should be the same as an anchor. Perl +optimizations defeat this. So does the PCRE optimization unless we disable it +with \Y. ---/ + +/(*COMMIT)ABC/ + ABCDEFG + 0: ABC + ** Failers +No match + DEFGABC\Y +No match + +/^(ab (c+(*THEN)cd) | xyz)/x + abcccd +No match + +/^(ab (c+(*PRUNE)cd) | xyz)/x + abcccd +No match + +/^(ab (c+(*FAIL)cd) | xyz)/x + abcccd +No match + +/--- Perl gets some of these wrong ---/ + +/(?>.(*ACCEPT))*?5/ + abcde + 0: a + +/(.(*ACCEPT))*?5/ + abcde + 0: a + 1: a + +/(.(*ACCEPT))5/ + abcde + 0: a + 1: a + +/(.(*ACCEPT))*5/ + abcde + 0: a + 1: a + +/A\NB./BZ +------------------------------------------------------------------ + Bra + A + Any + B + Any + Ket + End +------------------------------------------------------------------ + ACBD + 0: ACBD + *** Failers +No match + A\nB +No match + ACB\n +No match + +/A\NB./sBZ +------------------------------------------------------------------ + Bra + A + Any + B + AllAny + Ket + End +------------------------------------------------------------------ + ACBD + 0: ACBD + ACB\n + 0: ACB\x0a + *** Failers +No match + A\nB +No match + +/A\NB/ + A\nB + 0: A\x0aB + A\rB + 0: A\x0dB + ** Failers +No match + A\r\nB +No match + +/\R+b/BZ +------------------------------------------------------------------ + Bra + \R++ + b + Ket + End +------------------------------------------------------------------ + +/\R+\n/BZ +------------------------------------------------------------------ + Bra + \R+ + \x0a + Ket + End +------------------------------------------------------------------ + +/\R+\d/BZ +------------------------------------------------------------------ + Bra + \R++ + \d + Ket + End +------------------------------------------------------------------ + +/\d*\R/BZ +------------------------------------------------------------------ + Bra + \d*+ + \R + Ket + End +------------------------------------------------------------------ + +/\s*\R/BZ +------------------------------------------------------------------ + Bra + \s* + \R + Ket + End +------------------------------------------------------------------ + \x20\x0a + 0: \x0a + \x20\x0d + 0: \x0d + \x20\x0d\x0a + 0: \x0d\x0a + +/\S*\R/BZ +------------------------------------------------------------------ + Bra + \S*+ + \R + Ket + End +------------------------------------------------------------------ + a\x0a + 0: a\x0a + +/X\h*\R/BZ +------------------------------------------------------------------ + Bra + X + \h*+ + \R + Ket + End +------------------------------------------------------------------ + X\x20\x0a + 0: X \x0a + +/X\H*\R/BZ +------------------------------------------------------------------ + Bra + X + \H* + \R + Ket + End +------------------------------------------------------------------ + X\x0d\x0a + 0: X\x0d\x0a + +/X\H+\R/BZ +------------------------------------------------------------------ + Bra + X + \H+ + \R + Ket + End +------------------------------------------------------------------ + X\x0d\x0a + 0: X\x0d\x0a + +/X\H++\R/BZ +------------------------------------------------------------------ + Bra + X + \H++ + \R + Ket + End +------------------------------------------------------------------ + X\x0d\x0a +No match + +/(?<=abc)def/ + abc\P\P +Partial match at offset 3: abc + +/abc$/ + abc + 0: abc + abc\P + 0: abc + abc\P\P +Partial match: abc + +/abc$/m + abc + 0: abc + abc\n + 0: abc + abc\P\P +Partial match: abc + abc\n\P\P + 0: abc + abc\P + 0: abc + abc\n\P + 0: abc + +/abc\z/ + abc + 0: abc + abc\P + 0: abc + abc\P\P +Partial match: abc + +/abc\Z/ + abc + 0: abc + abc\P + 0: abc + abc\P\P +Partial match: abc + +/abc\b/ + abc + 0: abc + abc\P + 0: abc + abc\P\P +Partial match: abc + +/abc\B/ + abc +No match + abc\P +Partial match: abc + abc\P\P +Partial match: abc + +/.+/ + abc\>0 + 0: abc + abc\>1 + 0: bc + abc\>2 + 0: c + abc\>3 +No match + abc\>4 +Error -24 (bad offset value) + abc\>-4 +Error -24 (bad offset value) + +/^\cÄ£/ +Failed: \c must be followed by an ASCII character at offset 3 + +/(?P(?P=abn)xxx)/BZ +------------------------------------------------------------------ + Bra + Once + CBra 1 + \1 + xxx + Ket + Ket + Ket + End +------------------------------------------------------------------ + +/(a\1z)/BZ +------------------------------------------------------------------ + Bra + Once + CBra 1 + a + \1 + z + Ket + Ket + Ket + End +------------------------------------------------------------------ + +/(?P(?P=abn)(?(?P=axn)xxx)/BZ +Failed: reference to non-existent subpattern at offset 15 + +/(?P(?P=axn)xxx)(?yy)/BZ +------------------------------------------------------------------ + Bra + CBra 1 + \2 + xxx + Ket + CBra 2 + yy + Ket + Ket + End +------------------------------------------------------------------ + +/-- These tests are here because Perl gets the first one wrong. --/ + +/(\R*)(.)/s + \r\n + 0: \x0d + 1: + 2: \x0d + \r\r\n\n\r + 0: \x0d\x0d\x0a\x0a\x0d + 1: \x0d\x0d\x0a\x0a + 2: \x0d + \r\r\n\n\r\n + 0: \x0d\x0d\x0a\x0a\x0d + 1: \x0d\x0d\x0a\x0a + 2: \x0d + +/(\R)*(.)/s + \r\n + 0: \x0d + 1: + 2: \x0d + \r\r\n\n\r + 0: \x0d\x0d\x0a\x0a\x0d + 1: \x0a + 2: \x0d + \r\r\n\n\r\n + 0: \x0d\x0d\x0a\x0a\x0d + 1: \x0a + 2: \x0d + +/((?>\r\n|\n|\x0b|\f|\r|\x85)*)(.)/s + \r\n + 0: \x0d + 1: + 2: \x0d + \r\r\n\n\r + 0: \x0d\x0d\x0a\x0a\x0d + 1: \x0d\x0d\x0a\x0a + 2: \x0d + \r\r\n\n\r\n + 0: \x0d\x0d\x0a\x0a\x0d + 1: \x0d\x0d\x0a\x0a + 2: \x0d + +/-- --/ + +/^abc$/BZ +------------------------------------------------------------------ + Bra + ^ + abc + $ + Ket + End +------------------------------------------------------------------ + +/^abc$/BZm +------------------------------------------------------------------ + Bra + /m ^ + abc + /m $ + Ket + End +------------------------------------------------------------------ + +/^(a)*+(\w)/S + aaaaX + 0: aaaaX + 1: a + 2: X + ** Failers +No match + aaaa +No match + +/^(?:a)*+(\w)/S + aaaaX + 0: aaaaX + 1: X + ** Failers +No match + aaaa +No match + +/(a)++1234/SDZ +------------------------------------------------------------------ + Bra + CBraPos 1 + a + KetRpos + 1234 + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +No options +First char = 'a' +Need char = '4' +Subject length lower bound = 5 +No starting char list + +/([abc])++1234/SI +Capturing subpattern count = 1 +No options +No first char +Need char = '4' +Subject length lower bound = 5 +Starting chars: a b c + +/(?<=(abc)+)X/ +Failed: lookbehind assertion is not fixed length at offset 10 + +/(^ab)/I +Capturing subpattern count = 1 +Options: anchored +No first char +No need char + +/(^ab)++/I +Capturing subpattern count = 1 +Options: anchored +No first char +No need char + +/(^ab|^)+/I +Capturing subpattern count = 1 +May match empty string +Options: anchored +No first char +No need char + +/(^ab|^)++/I +Capturing subpattern count = 1 +May match empty string +Options: anchored +No first char +No need char + +/(?:^ab)/I +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/(?:^ab)++/I +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/(?:^ab|^)+/I +Capturing subpattern count = 0 +May match empty string +Options: anchored +No first char +No need char + +/(?:^ab|^)++/I +Capturing subpattern count = 0 +May match empty string +Options: anchored +No first char +No need char + +/(.*ab)/I +Capturing subpattern count = 1 +No options +First char at start or follows newline +Need char = 'b' + +/(.*ab)++/I +Capturing subpattern count = 1 +No options +First char at start or follows newline +Need char = 'b' + +/(.*ab|.*)+/I +Capturing subpattern count = 1 +May match empty string +No options +First char at start or follows newline +No need char + +/(.*ab|.*)++/I +Capturing subpattern count = 1 +May match empty string +No options +First char at start or follows newline +No need char + +/(?:.*ab)/I +Capturing subpattern count = 0 +No options +First char at start or follows newline +Need char = 'b' + +/(?:.*ab)++/I +Capturing subpattern count = 0 +No options +First char at start or follows newline +Need char = 'b' + +/(?:.*ab|.*)+/I +Capturing subpattern count = 0 +May match empty string +No options +First char at start or follows newline +No need char + +/(?:.*ab|.*)++/I +Capturing subpattern count = 0 +May match empty string +No options +First char at start or follows newline +No need char + +/(?=a)[bcd]/I +Capturing subpattern count = 0 +No options +First char = 'a' +No need char + +/((?=a))[bcd]/I +Capturing subpattern count = 1 +No options +First char = 'a' +No need char + +/((?=a))+[bcd]/I +Capturing subpattern count = 1 +No options +First char = 'a' +No need char + +/((?=a))++[bcd]/I +Capturing subpattern count = 1 +No options +First char = 'a' +No need char + +/(?=a+)[bcd]/iI +Capturing subpattern count = 0 +Options: caseless +First char = 'a' (caseless) +No need char + +/(?=a+?)[bcd]/iI +Capturing subpattern count = 0 +Options: caseless +First char = 'a' (caseless) +No need char + +/(?=a++)[bcd]/iI +Capturing subpattern count = 0 +Options: caseless +First char = 'a' (caseless) +No need char + +/(?=a{3})[bcd]/iI +Capturing subpattern count = 0 +Options: caseless +First char = 'a' (caseless) +Need char = 'a' (caseless) + +/(abc)\1+/S + +/-- Perl doesn't get these right IMO (the 3rd is PCRE-specific) --/ + +/(?1)(?:(b(*ACCEPT))){0}/ + b + 0: b + +/(?1)(?:(b(*ACCEPT))){0}c/ + bc + 0: bc + ** Failers +No match + b +No match + +/(?1)(?:((*ACCEPT))){0}c/ + c + 0: c + c\N + 0: c + +/^.*?(?(?=a)a|b(*THEN)c)/ + ba +No match + +/^.*?(?(?=a)a|bc)/ + ba + 0: ba + +/^.*?(?(?=a)a(*THEN)b|c)/ + ac +No match + +/^.*?(?(?=a)a(*THEN)b)c/ + ac +No match + +/^.*?(a(*THEN)b)c/ + aabc +No match + +/^.*? (?1) c (?(DEFINE)(a(*THEN)b))/x + aabc + 0: aabc + +/^.*?(a(*THEN)b|z)c/ + aabc + 0: aabc + 1: ab + +/^.*?(z|a(*THEN)b)c/ + aabc + 0: aabc + 1: ab + +/-- --/ + +/-- These studied versions are here because they are not Perl-compatible; the + studying means the mark is not seen. --/ + +/(*MARK:A)(*SKIP:B)(C|X)/KS + C + 0: C + 1: C +MK: A + D +No match, mark = A + +/(*:A)A+(*SKIP:A)(B|Z)/KS + AAAC +No match, mark = A + +/-- --/ + +"(?=a*(*ACCEPT)b)c" + c + 0: c + c\N + 0: c + +/(?1)c(?(DEFINE)((*ACCEPT)b))/ + c + 0: c + c\N + 0: c + +/(?>(*ACCEPT)b)c/ + c + 0: + c\N +No match + +/(?:(?>(a)))+a%/++ + %aa% + 0: aa% + 0+ + 1: a + 1+ a% + +/(a)b|ac/++SS + ac\O3 + 0: ac + 0+ + +/(a)(b)x|abc/++ + abc\O6 + 0: abc + 0+ + +/(a)bc|(a)(b)\2/ + \O3abc +Matched, but too many substrings + 0: abc + \O4abc +Matched, but too many substrings + 0: abc + +/(?(DEFINE)(a(?2)|b)(b(?1)|a))(?:(?1)|(?2))/SI +Capturing subpattern count = 2 +No options +No first char +No need char +Subject length lower bound = 1 +No starting char list + +/(a(?2)|b)(b(?1)|a)(?:(?1)|(?2))/SI +Capturing subpattern count = 2 +No options +No first char +No need char +Subject length lower bound = 3 +Starting chars: a b + +/(a(?2)|b)(b(?1)|a)(?1)(?2)/SI +Capturing subpattern count = 2 +No options +No first char +No need char +Subject length lower bound = 4 +Starting chars: a b + +/(abc)(?1)/SI +Capturing subpattern count = 1 +No options +First char = 'a' +Need char = 'c' +Subject length lower bound = 6 +No starting char list + +/^(?>a)++/ + aa\M +Minimum match() limit = 5 +Minimum match() recursion limit = 2 + 0: aa + aaaaaaaaa\M +Minimum match() limit = 12 +Minimum match() recursion limit = 2 + 0: aaaaaaaaa + +/(a)(?1)++/ + aa\M +Minimum match() limit = 7 +Minimum match() recursion limit = 4 + 0: aa + 1: a + aaaaaaaaa\M +Minimum match() limit = 21 +Minimum match() recursion limit = 4 + 0: aaaaaaaaa + 1: a + +/(?:(foo)|(bar)|(baz))X/SS= + bazfooX + 0: fooX + 1: foo + 2: + 3: + foobazbarX + 0: barX + 1: + 2: bar + 3: + barfooX + 0: fooX + 1: foo + 2: + 3: + bazX + 0: bazX + 1: + 2: + 3: baz + foobarbazX + 0: bazX + 1: + 2: + 3: baz + bazfooX\O0 +Matched, but too many substrings + bazfooX\O2 +Matched, but too many substrings + 0: fooX + bazfooX\O4 +Matched, but too many substrings + 0: fooX + 1: + bazfooX\O6 +Matched, but too many substrings + 0: fooX + 1: foo + 2: + bazfooX\O8 +Matched, but too many substrings + 0: fooX + 1: foo + 2: + 3: + bazfooX\O10 + 0: fooX + 1: foo + 2: + 3: + +/(?=abc){3}abc/BZ +------------------------------------------------------------------ + Bra + Assert + abc + Ket + abc + Ket + End +------------------------------------------------------------------ + +/(?=abc)+abc/BZ +------------------------------------------------------------------ + Bra + Assert + abc + Ket + abc + Ket + End +------------------------------------------------------------------ + +/(?=abc)++abc/BZ +------------------------------------------------------------------ + Bra + Assert + abc + Ket + abc + Ket + End +------------------------------------------------------------------ + +/(?=abc){0}xyz/BZ +------------------------------------------------------------------ + Bra + Skip zero + Assert + abc + Ket + xyz + Ket + End +------------------------------------------------------------------ + +/(?=(a))?./BZ +------------------------------------------------------------------ + Bra + Brazero + Assert + CBra 1 + a + Ket + Ket + Any + Ket + End +------------------------------------------------------------------ + +/(?=(a))??./BZ +------------------------------------------------------------------ + Bra + Braminzero + Assert + CBra 1 + a + Ket + Ket + Any + Ket + End +------------------------------------------------------------------ + +/^(?=(a)){0}b(?1)/BZ +------------------------------------------------------------------ + Bra + ^ + Skip zero + Assert + CBra 1 + a + Ket + Ket + b + Recurse + Ket + End +------------------------------------------------------------------ + +/(?(DEFINE)(a))?b(?1)/BZ +------------------------------------------------------------------ + Bra + Cond + Cond def + CBra 1 + a + Ket + Ket + b + Recurse + Ket + End +------------------------------------------------------------------ + +/^(?=(?1))?[az]([abc])d/BZ +------------------------------------------------------------------ + Bra + ^ + Brazero + Assert + Recurse + Ket + [az] + CBra 1 + [a-c] + Ket + d + Ket + End +------------------------------------------------------------------ + +/^(?!a){0}\w+/BZ +------------------------------------------------------------------ + Bra + ^ + Skip zero + Assert not + a + Ket + \w++ + Ket + End +------------------------------------------------------------------ + +/(?<=(abc))?xyz/BZ +------------------------------------------------------------------ + Bra + Brazero + AssertB + Reverse + CBra 1 + abc + Ket + Ket + xyz + Ket + End +------------------------------------------------------------------ + +/[:a[:abc]b:]/BZ +------------------------------------------------------------------ + Bra + [:[a-c] + b:] + Ket + End +------------------------------------------------------------------ + +/((?2))((?1))/SS + abc +Error -26 (nested recursion at the same subject position) + +/((?(R2)a+|(?1)b))/SS + aaaabcde +Error -26 (nested recursion at the same subject position) + +/(?(R)a*(?1)|((?R))b)/SS + aaaabcde +Error -26 (nested recursion at the same subject position) + +/(a+|(?R)b)/ +Failed: recursive call could loop indefinitely at offset 7 + +/^(a(*:A)(d|e(*:B))z|aeq)/C + adz +--->adz + +0 ^ ^ + +1 ^ (a(*:A)(d|e(*:B))z|aeq) + +2 ^ a + +3 ^^ (*:A) + +8 ^^ (d|e(*:B)) +Latest Mark: A + +9 ^^ d ++10 ^ ^ | ++18 ^ ^ z ++19 ^ ^ | ++24 ^ ^ + 0: adz + 1: adz + 2: d + aez +--->aez + +0 ^ ^ + +1 ^ (a(*:A)(d|e(*:B))z|aeq) + +2 ^ a + +3 ^^ (*:A) + +8 ^^ (d|e(*:B)) +Latest Mark: A + +9 ^^ d ++11 ^^ e ++12 ^ ^ (*:B) ++17 ^ ^ ) +Latest Mark: B ++18 ^ ^ z ++19 ^ ^ | ++24 ^ ^ + 0: aez + 1: aez + 2: e + aeqwerty +--->aeqwerty + +0 ^ ^ + +1 ^ (a(*:A)(d|e(*:B))z|aeq) + +2 ^ a + +3 ^^ (*:A) + +8 ^^ (d|e(*:B)) +Latest Mark: A + +9 ^^ d ++11 ^^ e ++12 ^ ^ (*:B) ++17 ^ ^ ) +Latest Mark: B ++18 ^ ^ z ++20 ^ a ++21 ^^ e ++22 ^ ^ q ++23 ^ ^ ) ++24 ^ ^ + 0: aeq + 1: aeq + +/.(*F)/ + \P\Pabc +No match + +/\btype\b\W*?\btext\b\W*?\bjavascript\b/IS +Capturing subpattern count = 0 +Max lookbehind = 1 +No options +First char = 't' +Need char = 't' +Subject length lower bound = 18 +No starting char list + +/\btype\b\W*?\btext\b\W*?\bjavascript\b|\burl\b\W*?\bshell:|a+)(?>(z+))\w/BZ +------------------------------------------------------------------ + Bra + ^ + Once_NC + a++ + Ket + Once + CBra 1 + z++ + Ket + Ket + \w + Ket + End +------------------------------------------------------------------ + aaaazzzzb + 0: aaaazzzzb + 1: zzzz + ** Failers +No match + aazz +No match + +/(.)(\1|a(?2))/ + bab + 0: bab + 1: b + 2: ab + +/\1|(.)(?R)\1/ + cbbbc + 0: cbbbc + 1: c + +/(.)((?(1)c|a)|a(?2))/ + baa +No match + +/(?P(?P=abn)xxx)/BZ +------------------------------------------------------------------ + Bra + Once + CBra 1 + \1 + xxx + Ket + Ket + Ket + End +------------------------------------------------------------------ + +/(a\1z)/BZ +------------------------------------------------------------------ + Bra + Once + CBra 1 + a + \1 + z + Ket + Ket + Ket + End +------------------------------------------------------------------ + +/^(?>a+)(?>b+)(?>c+)(?>d+)(?>e+)/ + \Maabbccddee +Minimum match() limit = 7 +Minimum match() recursion limit = 2 + 0: aabbccddee + +/^(?>(a+))(?>(b+))(?>(c+))(?>(d+))(?>(e+))/ + \Maabbccddee +Minimum match() limit = 17 +Minimum match() recursion limit = 16 + 0: aabbccddee + 1: aa + 2: bb + 3: cc + 4: dd + 5: ee + +/^(?>(a+))(?>b+)(?>(c+))(?>d+)(?>(e+))/ + \Maabbccddee +Minimum match() limit = 13 +Minimum match() recursion limit = 10 + 0: aabbccddee + 1: aa + 2: cc + 3: ee + +/^a\x41z/ + aAz + 0: aAz + *** Failers +No match + ax41z +No match + +/^a[m\x41]z/ + aAz + 0: aAz + +/^a\x1z/ + ax1z + 0: ax1z + +/^a\u0041z/ + aAz + 0: aAz + *** Failers +No match + au0041z +No match + +/^a[m\u0041]z/ + aAz + 0: aAz + +/^a\u041z/ + au041z + 0: au041z + *** Failers +No match + aAz +No match + +/^a\U0041z/ + aU0041z + 0: aU0041z + *** Failers +No match + aAz +No match + +/(?(?=c)c|d)++Y/BZ +------------------------------------------------------------------ + Bra + BraPos + Cond + Assert + c + Ket + c + Alt + d + Ket + KetRpos + Y + Ket + End +------------------------------------------------------------------ + +/(?(?=c)c|d)*+Y/BZ +------------------------------------------------------------------ + Bra + Braposzero + BraPos + Cond + Assert + c + Ket + c + Alt + d + Ket + KetRpos + Y + Ket + End +------------------------------------------------------------------ + +/a[\NB]c/ +Failed: \N is not supported in a class at offset 3 + +/a[B-\Nc]/ +Failed: invalid range in character class at offset 5 + +/a[B\Nc]/ +Failed: \N is not supported in a class at offset 4 + +/(a)(?2){0,1999}?(b)/ + +/(a)(?(DEFINE)(b))(?2){0,1999}?(?2)/ + +/--- This test, with something more complicated than individual letters, causes +different behaviour in Perl. Perhaps it disables some optimization; no tag is +passed back for the failures, whereas in PCRE there is a tag. ---/ + +/(A|P)(*:A)(B|P) | (X|P)(X|P)(*:B)(Y|P)/xK + AABC + 0: AB + 1: A + 2: B +MK: A + XXYZ + 0: XXY + 1: + 2: + 3: X + 4: X + 5: Y +MK: B + ** Failers +No match + XAQQ +No match, mark = A + XAQQXZZ +No match, mark = A + AXQQQ +No match, mark = A + AXXQQQ +No match, mark = B + +/-- Perl doesn't give marks for these, though it does if the alternatives are +replaced by single letters. --/ + +/(b|q)(*:m)f|a(*:n)w/K + aw + 0: aw +MK: n + ** Failers +No match, mark = n + abc +No match, mark = m + +/(q|b)(*:m)f|a(*:n)w/K + aw + 0: aw +MK: n + ** Failers +No match, mark = n + abc +No match, mark = m + +/-- After a partial match, the behaviour is as for a failure. --/ + +/^a(*:X)bcde/K + abc\P +Partial match, mark=X: abc + +/-- These are here because Perl doesn't return a mark, except for the first --/ + +/(?=(*:x))(q|)/K+ + abc + 0: + 0+ abc + 1: +MK: x + +/(?=(*:x))((*:y)q|)/K+ + abc + 0: + 0+ abc + 1: +MK: x + +/(?=(*:x))(?:(*:y)q|)/K+ + abc + 0: + 0+ abc +MK: x + +/(?=(*:x))(?>(*:y)q|)/K+ + abc + 0: + 0+ abc +MK: x + +/(?=a(*:x))(?!a(*:y)c)/K+ + ab + 0: + 0+ ab +MK: x + +/(?=a(*:x))(?=a(*:y)c|)/K+ + ab + 0: + 0+ ab +MK: x + +/(..)\1/ + ab\P +Partial match: ab + aba\P +Partial match: aba + abab\P + 0: abab + 1: ab + +/(..)\1/i + ab\P +Partial match: ab + abA\P +Partial match: abA + aBAb\P + 0: aBAb + 1: aB + +/(..)\1{2,}/ + ab\P +Partial match: ab + aba\P +Partial match: aba + abab\P +Partial match: abab + ababa\P +Partial match: ababa + ababab\P + 0: ababab + 1: ab + ababab\P\P +Partial match: ababab + abababa\P + 0: ababab + 1: ab + abababa\P\P +Partial match: abababa + +/(..)\1{2,}/i + ab\P +Partial match: ab + aBa\P +Partial match: aBa + aBAb\P +Partial match: aBAb + AbaBA\P +Partial match: AbaBA + abABAb\P + 0: abABAb + 1: ab + aBAbaB\P\P +Partial match: aBAbaB + abABabA\P + 0: abABab + 1: ab + abaBABa\P\P +Partial match: abaBABa + +/(..)\1{2,}?x/i + ab\P +Partial match: ab + abA\P +Partial match: abA + aBAb\P +Partial match: aBAb + abaBA\P +Partial match: abaBA + abAbaB\P +Partial match: abAbaB + abaBabA\P +Partial match: abaBabA + abAbABaBx\P + 0: abAbABaBx + 1: ab + +/^(..)\1/ + aba\P +Partial match: aba + +/^(..)\1{2,3}x/ + aba\P +Partial match: aba + ababa\P +Partial match: ababa + ababa\P\P +Partial match: ababa + abababx + 0: abababx + 1: ab + ababababx + 0: ababababx + 1: ab + +/^(..)\1{2,3}?x/ + aba\P +Partial match: aba + ababa\P +Partial match: ababa + ababa\P\P +Partial match: ababa + abababx + 0: abababx + 1: ab + ababababx + 0: ababababx + 1: ab + +/^(..)(\1{2,3})ab/ + abababab + 0: abababab + 1: ab + 2: abab + +/^\R/ + \r\P + 0: \x0d + \r\P\P +Partial match: \x0d + +/^\R{2,3}x/ + \r\P +Partial match: \x0d + \r\P\P +Partial match: \x0d + \r\r\P +Partial match: \x0d\x0d + \r\r\P\P +Partial match: \x0d\x0d + \r\r\r\P +Partial match: \x0d\x0d\x0d + \r\r\r\P\P +Partial match: \x0d\x0d\x0d + \r\rx + 0: \x0d\x0dx + \r\r\rx + 0: \x0d\x0d\x0dx + +/^\R{2,3}?x/ + \r\P +Partial match: \x0d + \r\P\P +Partial match: \x0d + \r\r\P +Partial match: \x0d\x0d + \r\r\P\P +Partial match: \x0d\x0d + \r\r\r\P +Partial match: \x0d\x0d\x0d + \r\r\r\P\P +Partial match: \x0d\x0d\x0d + \r\rx + 0: \x0d\x0dx + \r\r\rx + 0: \x0d\x0d\x0dx + +/^\R?x/ + \r\P +Partial match: \x0d + \r\P\P +Partial match: \x0d + x + 0: x + \rx + 0: \x0dx + +/^\R+x/ + \r\P +Partial match: \x0d + \r\P\P +Partial match: \x0d + \r\n\P +Partial match: \x0d\x0a + \r\n\P\P +Partial match: \x0d\x0a + \rx + 0: \x0dx + +/^a$/ + a\r\P +Partial match: a\x0d + a\r\P\P +Partial match: a\x0d + +/^a$/m + a\r\P +Partial match: a\x0d + a\r\P\P +Partial match: a\x0d + +/^(a$|a\r)/ + a\r\P + 0: a\x0d + 1: a\x0d + a\r\P\P +Partial match: a\x0d + +/^(a$|a\r)/m + a\r\P + 0: a\x0d + 1: a\x0d + a\r\P\P +Partial match: a\x0d + +/./ + \r\P + 0: \x0d + \r\P\P +Partial match: \x0d + +/.{2,3}/ + \r\P +Partial match: \x0d + \r\P\P +Partial match: \x0d + \r\r\P + 0: \x0d\x0d + \r\r\P\P +Partial match: \x0d\x0d + \r\r\r\P + 0: \x0d\x0d\x0d + \r\r\r\P\P +Partial match: \x0d\x0d\x0d + +/.{2,3}?/ + \r\P +Partial match: \x0d + \r\P\P +Partial match: \x0d + \r\r\P + 0: \x0d\x0d + \r\r\P\P +Partial match: \x0d\x0d + \r\r\r\P + 0: \x0d\x0d + \r\r\r\P\P + 0: \x0d\x0d + +"AB(C(D))(E(F))?(?(?=\2)(?=\4))" + ABCDGHI\O03 +Matched, but too many substrings + 0: ABCD + +/-- These are all run as real matches in test 1; here we are just checking the +settings of the anchored and startline bits. --/ + +/(?>.*?a)(?<=ba)/I +Capturing subpattern count = 0 +Max lookbehind = 2 +No options +No first char +Need char = 'a' + +/(?:.*?a)(?<=ba)/I +Capturing subpattern count = 0 +Max lookbehind = 2 +No options +First char at start or follows newline +Need char = 'a' + +/.*?a(*PRUNE)b/I +Capturing subpattern count = 0 +No options +No first char +Need char = 'b' + +/.*?a(*PRUNE)b/sI +Capturing subpattern count = 0 +Options: dotall +No first char +Need char = 'b' + +/^a(*PRUNE)b/sI +Capturing subpattern count = 0 +Options: anchored dotall +No first char +No need char + +/.*?a(*SKIP)b/I +Capturing subpattern count = 0 +No options +No first char +Need char = 'b' + +/(?>.*?a)b/sI +Capturing subpattern count = 0 +Options: dotall +No first char +Need char = 'b' + +/(?>.*?a)b/I +Capturing subpattern count = 0 +No options +No first char +Need char = 'b' + +/(?>^a)b/sI +Capturing subpattern count = 0 +Options: anchored dotall +No first char +No need char + +/(?>.*?)(?<=(abcd)|(wxyz))/I +Capturing subpattern count = 2 +Max lookbehind = 4 +May match empty string +No options +No first char +No need char + +/(?>.*)(?<=(abcd)|(wxyz))/I +Capturing subpattern count = 2 +Max lookbehind = 4 +May match empty string +No options +No first char +No need char + +"(?>.*)foo"I +Capturing subpattern count = 0 +No options +No first char +Need char = 'o' + +"(?>.*?)foo"I +Capturing subpattern count = 0 +No options +No first char +Need char = 'o' + +/(?>^abc)/mI +Capturing subpattern count = 0 +Options: multiline +First char at start or follows newline +Need char = 'c' + +/(?>.*abc)/mI +Capturing subpattern count = 0 +Options: multiline +No first char +Need char = 'c' + +/(?:.*abc)/mI +Capturing subpattern count = 0 +Options: multiline +First char at start or follows newline +Need char = 'c' + +/-- Check PCRE_STUDY_EXTRA_NEEDED --/ + +/.?/S-I +Capturing subpattern count = 0 +May match empty string +No options +No first char +No need char +Study returned NULL + +/.?/S!I +Capturing subpattern count = 0 +May match empty string +No options +No first char +No need char +Subject length lower bound = -1 +No starting char list + +/(?:(a)+(?C1)bb|aa(?C2)b)/ + aab\C+ +Callout 1: last capture = 1 + 0: + 1: a +--->aab + ^ ^ b +Callout 1: last capture = 1 + 0: + 1: a +--->aab + ^^ b +Callout 2: last capture = -1 + 0: +--->aab + ^ ^ b + 0: aab + +/(?:(a)++(?C1)bb|aa(?C2)b)/ + aab\C+ +Callout 1: last capture = 1 + 0: + 1: a +--->aab + ^ ^ b +Callout 2: last capture = -1 + 0: +--->aab + ^ ^ b + 0: aab + +/(?:(?>(a))(?C1)bb|aa(?C2)b)/ + aab\C+ +Callout 1: last capture = 1 + 0: + 1: a +--->aab + ^^ b +Callout 2: last capture = -1 + 0: +--->aab + ^ ^ b + 0: aab + +/(?:(?1)(?C1)x|ab(?C2))((a)){0}/ + aab\C+ +Callout 1: last capture = -1 + 0: +--->aab + ^^ x +Callout 1: last capture = -1 + 0: +--->aab + ^^ x +Callout 2: last capture = -1 + 0: +--->aab + ^ ^ ) + 0: ab + +/(?1)(?C1)((a)(?C2)){0}/ + aab\C+ +Callout 2: last capture = 2 + 0: + 1: + 2: a +--->aab + ^^ ) +Callout 1: last capture = -1 + 0: +--->aab + ^^ ((a)(?C2)){0} + 0: a + +/(?:(a)+(?C1)bb|aa(?C2)b)++/ + aab\C+ +Callout 1: last capture = 1 + 0: + 1: a +--->aab + ^ ^ b +Callout 1: last capture = 1 + 0: + 1: a +--->aab + ^^ b +Callout 2: last capture = -1 + 0: +--->aab + ^ ^ b + 0: aab + aab\C+\O2 +Callout 1: last capture = 1 + 0: +--->aab + ^ ^ b +Callout 1: last capture = 1 + 0: +--->aab + ^^ b +Callout 2: last capture = -1 + 0: +--->aab + ^ ^ b + 0: aab + +/(ab)x|ab/ + ab\O3 + 0: ab + ab\O2 + 0: ab + +/(ab)/ + ab\O3 +Matched, but too many substrings + 0: ab + ab\O2 +Matched, but too many substrings + 0: ab + +/(?<=123)(*MARK:xx)abc/K + xxxx123a\P\P +Partial match at offset 7, mark=xx: 123a + xxxx123a\P +Partial match at offset 7, mark=xx: 123a + +/123\Kabc/ + xxxx123a\P\P +Partial match: 123a + xxxx123a\P +Partial match: 123a + +/^(?(?=a)aa|bb)/C + bb +--->bb + +0 ^ ^ + +1 ^ (?(?=a)aa|bb) + +3 ^ (?=a) + +6 ^ a ++11 ^ b ++12 ^^ b ++13 ^ ^ ) ++14 ^ ^ + 0: bb + +/(?C1)^(?C2)(?(?C99)(?=(?C3)a(?C4))(?C5)a(?C6)a(?C7)|(?C8)b(?C9)b(?C10))(?C11)/ + bb +--->bb + 1 ^ ^ + 2 ^ (?(?C99)(?=(?C3)a(?C4))(?C5)a(?C6)a(?C7)|(?C8)b(?C9)b(?C10)) + 99 ^ (?=(?C3)a(?C4)) + 3 ^ a + 8 ^ b + 9 ^^ b + 10 ^ ^ ) + 11 ^ ^ + 0: bb + +/-- Perl seems to have a bug with this one --/ + +/aaaaa(*COMMIT)(*PRUNE)b|a+c/ + aaaaaac + 0: aaaac + +/-- Here are some that Perl treats differently because of the way it handles +backtracking verbs. --/ + + /(?!a(*COMMIT)b)ac|ad/ + ac + 0: ac + ad + 0: ad + +/^(?!a(*THEN)b|ac)../ + ac +No match + ad + 0: ad + +/^(?=a(*THEN)b|ac)/ + ac + 0: + +/\A.*?(?:a|b(*THEN)c)/ + ba + 0: ba + +/\A.*?(?:a|b(*THEN)c)++/ + ba + 0: ba + +/\A.*?(?:a|b(*THEN)c|d)/ + ba + 0: ba + +/(?:(a(*MARK:X)a+(*SKIP:X)b)){0}(?:(?1)|aac)/ + aac + 0: aac + +/\A.*?(a|b(*THEN)c)/ + ba + 0: ba + 1: a + +/^(A(*THEN)B|A(*THEN)D)/ + AD + 0: AD + 1: AD + +/(?!b(*THEN)a)bn|bnn/ + bnn + 0: bn + +/(?(?=b(*SKIP)a)bn|bnn)/ + bnn +No match + +/(?=b(*THEN)a|)bn|bnn/ + bnn + 0: bn + +/-------------------------/ + +/(*LIMIT_MATCH=12bc)abc/ +Failed: (*VERB) not recognized or malformed at offset 7 + +/(*LIMIT_MATCH=4294967290)abc/ +Failed: (*VERB) not recognized or malformed at offset 7 + +/(*LIMIT_RECURSION=4294967280)abc/I +Capturing subpattern count = 0 +Recursion limit = 4294967280 +No options +First char = 'a' +Need char = 'c' + +/(a+)*zz/ + aaaaaaaaaaaaaz +No match + aaaaaaaaaaaaaz\q3000 +Error -8 (match limit exceeded) + +/(a+)*zz/S- + aaaaaaaaaaaaaz\Q10 +Error -21 (recursion limit exceeded) + +/(*LIMIT_MATCH=3000)(a+)*zz/I +Capturing subpattern count = 1 +Match limit = 3000 +No options +No first char +Need char = 'z' + aaaaaaaaaaaaaz +Error -8 (match limit exceeded) + aaaaaaaaaaaaaz\q60000 +Error -8 (match limit exceeded) + +/(*LIMIT_MATCH=60000)(*LIMIT_MATCH=3000)(a+)*zz/I +Capturing subpattern count = 1 +Match limit = 3000 +No options +No first char +Need char = 'z' + aaaaaaaaaaaaaz +Error -8 (match limit exceeded) + +/(*LIMIT_MATCH=60000)(a+)*zz/I +Capturing subpattern count = 1 +Match limit = 60000 +No options +No first char +Need char = 'z' + aaaaaaaaaaaaaz +No match + aaaaaaaaaaaaaz\q3000 +Error -8 (match limit exceeded) + +/(*LIMIT_RECURSION=10)(a+)*zz/IS- +Capturing subpattern count = 1 +Recursion limit = 10 +No options +No first char +Need char = 'z' +Subject length lower bound = 2 +Starting chars: a z + aaaaaaaaaaaaaz +Error -21 (recursion limit exceeded) + aaaaaaaaaaaaaz\Q1000 +Error -21 (recursion limit exceeded) + +/(*LIMIT_RECURSION=10)(*LIMIT_RECURSION=1000)(a+)*zz/IS- +Capturing subpattern count = 1 +Recursion limit = 10 +No options +No first char +Need char = 'z' +Subject length lower bound = 2 +Starting chars: a z + aaaaaaaaaaaaaz +Error -21 (recursion limit exceeded) + +/(*LIMIT_RECURSION=1000)(a+)*zz/IS- +Capturing subpattern count = 1 +Recursion limit = 1000 +No options +No first char +Need char = 'z' +Subject length lower bound = 2 +Starting chars: a z + aaaaaaaaaaaaaz +No match + aaaaaaaaaaaaaz\Q10 +Error -21 (recursion limit exceeded) + +/-- This test causes a segfault with Perl 5.18.0 --/ + +/^(?=(a)){0}b(?1)/ + backgammon + 0: ba + +/(?|(?f)|(?b))/JI +Capturing subpattern count = 1 +Named capturing subpatterns: + n 1 +Options: dupnames +No first char +No need char + +/(?abc)(?z)\k()/JDZS +------------------------------------------------------------------ + Bra + CBra 1 + abc + Ket + CBra 2 + z + Ket + \k2 + CBra 3 + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 3 +Max back reference = 2 +Named capturing subpatterns: + a 1 + a 2 +Options: dupnames +First char = 'a' +Need char = 'z' +Subject length lower bound = 5 +No starting char list + +/a*[bcd]/BZ +------------------------------------------------------------------ + Bra + a*+ + [b-d] + Ket + End +------------------------------------------------------------------ + +/[bcd]*a/BZ +------------------------------------------------------------------ + Bra + [b-d]*+ + a + Ket + End +------------------------------------------------------------------ + +/-- A complete set of tests for auto-possessification of character types --/ + +/\D+\D \D+\d \D+\S \D+\s \D+\W \D+\w \D+. \D+\C \D+\R \D+\H \D+\h \D+\V \D+\v \D+\Z \D+\z \D+$/BZx +------------------------------------------------------------------ + Bra + \D+ + \D + \D++ + \d + \D+ + \S + \D+ + \s + \D+ + \W + \D+ + \w + \D+ + Any + \D+ + AllAny + \D+ + \R + \D+ + \H + \D+ + \h + \D+ + \V + \D+ + \v + \D+ + \Z + \D++ + \z + \D+ + $ + Ket + End +------------------------------------------------------------------ + +/\d+\D \d+\d \d+\S \d+\s \d+\W \d+\w \d+. \d+\C \d+\R \d+\H \d+\h \d+\V \d+\v \d+\Z \d+\z \d+$/BZx +------------------------------------------------------------------ + Bra + \d++ + \D + \d+ + \d + \d+ + \S + \d++ + \s + \d++ + \W + \d+ + \w + \d+ + Any + \d+ + AllAny + \d++ + \R + \d+ + \H + \d++ + \h + \d+ + \V + \d++ + \v + \d++ + \Z + \d++ + \z + \d++ + $ + Ket + End +------------------------------------------------------------------ + +/\S+\D \S+\d \S+\S \S+\s \S+\W \S+\w \S+. \S+\C \S+\R \S+\H \S+\h \S+\V \S+\v \S+\Z \S+\z \S+$/BZx +------------------------------------------------------------------ + Bra + \S+ + \D + \S+ + \d + \S+ + \S + \S++ + \s + \S+ + \W + \S+ + \w + \S+ + Any + \S+ + AllAny + \S++ + \R + \S+ + \H + \S++ + \h + \S+ + \V + \S++ + \v + \S++ + \Z + \S++ + \z + \S++ + $ + Ket + End +------------------------------------------------------------------ + +/\s+\D \s+\d \s+\S \s+\s \s+\W \s+\w \s+. \s+\C \s+\R \s+\H \s+\h \s+\V \s+\v \s+\Z \s+\z \s+$/BZx +------------------------------------------------------------------ + Bra + \s+ + \D + \s++ + \d + \s++ + \S + \s+ + \s + \s+ + \W + \s++ + \w + \s+ + Any + \s+ + AllAny + \s+ + \R + \s+ + \H + \s+ + \h + \s+ + \V + \s+ + \v + \s+ + \Z + \s++ + \z + \s+ + $ + Ket + End +------------------------------------------------------------------ + +/\W+\D \W+\d \W+\S \W+\s \W+\W \W+\w \W+. \W+\C \W+\R \W+\H \W+\h \W+\V \W+\v \W+\Z \W+\z \W+$/BZx +------------------------------------------------------------------ + Bra + \W+ + \D + \W++ + \d + \W+ + \S + \W+ + \s + \W+ + \W + \W++ + \w + \W+ + Any + \W+ + AllAny + \W+ + \R + \W+ + \H + \W+ + \h + \W+ + \V + \W+ + \v + \W+ + \Z + \W++ + \z + \W+ + $ + Ket + End +------------------------------------------------------------------ + +/\w+\D \w+\d \w+\S \w+\s \w+\W \w+\w \w+. \w+\C \w+\R \w+\H \w+\h \w+\V \w+\v \w+\Z \w+\z \w+$/BZx +------------------------------------------------------------------ + Bra + \w+ + \D + \w+ + \d + \w+ + \S + \w++ + \s + \w++ + \W + \w+ + \w + \w+ + Any + \w+ + AllAny + \w++ + \R + \w+ + \H + \w++ + \h + \w+ + \V + \w++ + \v + \w++ + \Z + \w++ + \z + \w++ + $ + Ket + End +------------------------------------------------------------------ + +/\C+\D \C+\d \C+\S \C+\s \C+\W \C+\w \C+. \C+\C \C+\R \C+\H \C+\h \C+\V \C+\v \C+\Z \C+\z \C+$/BZx +------------------------------------------------------------------ + Bra + AllAny+ + \D + AllAny+ + \d + AllAny+ + \S + AllAny+ + \s + AllAny+ + \W + AllAny+ + \w + AllAny+ + Any + AllAny+ + AllAny + AllAny+ + \R + AllAny+ + \H + AllAny+ + \h + AllAny+ + \V + AllAny+ + \v + AllAny+ + \Z + AllAny++ + \z + AllAny+ + $ + Ket + End +------------------------------------------------------------------ + +/\R+\D \R+\d \R+\S \R+\s \R+\W \R+\w \R+. \R+\C \R+\R \R+\H \R+\h \R+\V \R+\v \R+\Z \R+\z \R+$/BZx +------------------------------------------------------------------ + Bra + \R+ + \D + \R++ + \d + \R+ + \S + \R++ + \s + \R+ + \W + \R++ + \w + \R++ + Any + \R+ + AllAny + \R+ + \R + \R+ + \H + \R++ + \h + \R+ + \V + \R+ + \v + \R+ + \Z + \R++ + \z + \R+ + $ + Ket + End +------------------------------------------------------------------ + +/\H+\D \H+\d \H+\S \H+\s \H+\W \H+\w \H+. \H+\C \H+\R \H+\H \H+\h \H+\V \H+\v \H+\Z \H+\z \H+$/BZx +------------------------------------------------------------------ + Bra + \H+ + \D + \H+ + \d + \H+ + \S + \H+ + \s + \H+ + \W + \H+ + \w + \H+ + Any + \H+ + AllAny + \H+ + \R + \H+ + \H + \H++ + \h + \H+ + \V + \H+ + \v + \H+ + \Z + \H++ + \z + \H+ + $ + Ket + End +------------------------------------------------------------------ + +/\h+\D \h+\d \h+\S \h+\s \h+\W \h+\w \h+. \h+\C \h+\R \h+\H \h+\h \h+\V \h+\v \h+\Z \h+\z \h+$/BZx +------------------------------------------------------------------ + Bra + \h+ + \D + \h++ + \d + \h++ + \S + \h+ + \s + \h+ + \W + \h++ + \w + \h+ + Any + \h+ + AllAny + \h++ + \R + \h++ + \H + \h+ + \h + \h+ + \V + \h++ + \v + \h+ + \Z + \h++ + \z + \h+ + $ + Ket + End +------------------------------------------------------------------ + +/\V+\D \V+\d \V+\S \V+\s \V+\W \V+\w \V+. \V+\C \V+\R \V+\H \V+\h \V+\V \V+\v \V+\Z \V+\z \V+$/BZx +------------------------------------------------------------------ + Bra + \V+ + \D + \V+ + \d + \V+ + \S + \V+ + \s + \V+ + \W + \V+ + \w + \V+ + Any + \V+ + AllAny + \V++ + \R + \V+ + \H + \V+ + \h + \V+ + \V + \V++ + \v + \V+ + \Z + \V++ + \z + \V+ + $ + Ket + End +------------------------------------------------------------------ + +/\v+\D \v+\d \v+\S \v+\s \v+\W \v+\w \v+. \v+\C \v+\R \v+\H \v+\h \v+\V \v+\v \v+\Z \v+\z \v+$/BZx +------------------------------------------------------------------ + Bra + \v+ + \D + \v++ + \d + \v++ + \S + \v+ + \s + \v+ + \W + \v++ + \w + \v+ + Any + \v+ + AllAny + \v+ + \R + \v+ + \H + \v++ + \h + \v++ + \V + \v+ + \v + \v+ + \Z + \v++ + \z + \v+ + $ + Ket + End +------------------------------------------------------------------ + +/ a+\D a+\d a+\S a+\s a+\W a+\w a+. a+\C a+\R a+\H a+\h a+\V a+\v a+\Z a+\z a+$/BZx +------------------------------------------------------------------ + Bra + a+ + \D + a++ + \d + a+ + \S + a++ + \s + a++ + \W + a+ + \w + a+ + Any + a+ + AllAny + a++ + \R + a+ + \H + a++ + \h + a+ + \V + a++ + \v + a++ + \Z + a++ + \z + a++ + $ + Ket + End +------------------------------------------------------------------ + +/\n+\D \n+\d \n+\S \n+\s \n+\W \n+\w \n+. \n+\C \n+\R \n+\H \n+\h \n+\V \n+\v \n+\Z \n+\z \n+$/BZx +------------------------------------------------------------------ + Bra + \x0a+ + \D + \x0a++ + \d + \x0a++ + \S + \x0a+ + \s + \x0a+ + \W + \x0a++ + \w + \x0a+ + Any + \x0a+ + AllAny + \x0a+ + \R + \x0a+ + \H + \x0a++ + \h + \x0a++ + \V + \x0a+ + \v + \x0a+ + \Z + \x0a++ + \z + \x0a+ + $ + Ket + End +------------------------------------------------------------------ + +/ .+\D .+\d .+\S .+\s .+\W .+\w .+. .+\C .+\R .+\H .+\h .+\V .+\v .+\Z .+\z .+$/BZx +------------------------------------------------------------------ + Bra + Any+ + \D + Any+ + \d + Any+ + \S + Any+ + \s + Any+ + \W + Any+ + \w + Any+ + Any + Any+ + AllAny + Any++ + \R + Any+ + \H + Any+ + \h + Any+ + \V + Any+ + \v + Any+ + \Z + Any++ + \z + Any+ + $ + Ket + End +------------------------------------------------------------------ + +/ .+\D .+\d .+\S .+\s .+\W .+\w .+. .+\C .+\R .+\H .+\h .+\V .+\v .+\Z .+\z .+$/BZxs +------------------------------------------------------------------ + Bra + AllAny+ + \D + AllAny+ + \d + AllAny+ + \S + AllAny+ + \s + AllAny+ + \W + AllAny+ + \w + AllAny+ + AllAny + AllAny+ + AllAny + AllAny+ + \R + AllAny+ + \H + AllAny+ + \h + AllAny+ + \V + AllAny+ + \v + AllAny+ + \Z + AllAny++ + \z + AllAny+ + $ + Ket + End +------------------------------------------------------------------ + +/\D+$ \d+$ \S+$ \s+$ \W+$ \w+$ \C+$ \R+$ \H+$ \h+$ \V+$ \v+$ a+$ \n+$ .+$ .+$/BZxm +------------------------------------------------------------------ + Bra + \D+ + /m $ + \d++ + /m $ + \S++ + /m $ + \s+ + /m $ + \W+ + /m $ + \w++ + /m $ + AllAny+ + /m $ + \R+ + /m $ + \H+ + /m $ + \h+ + /m $ + \V+ + /m $ + \v+ + /m $ + a+ + /m $ + \x0a+ + /m $ + Any+ + /m $ + Any+ + /m $ + Ket + End +------------------------------------------------------------------ + +/(?=a+)a(a+)++a/BZ +------------------------------------------------------------------ + Bra + Assert + a++ + Ket + a + CBraPos 1 + a++ + KetRpos + a + Ket + End +------------------------------------------------------------------ + +/a+(bb|cc)a+(?:bb|cc)a+(?>bb|cc)a+(?:bb|cc)+a+(aa)a+(?:bb|aa)/BZ +------------------------------------------------------------------ + Bra + a++ + CBra 1 + bb + Alt + cc + Ket + a++ + Bra + bb + Alt + cc + Ket + a++ + Once_NC + bb + Alt + cc + Ket + a++ + Bra + bb + Alt + cc + KetRmax + a+ + CBra 2 + aa + Ket + a+ + Bra + bb + Alt + aa + Ket + Ket + End +------------------------------------------------------------------ + +/a+(bb|cc)?#a+(?:bb|cc)??#a+(?:bb|cc)?+#a+(?:bb|cc)*#a+(bb|cc)?a#a+(?:aa)?/BZ +------------------------------------------------------------------ + Bra + a++ + Brazero + CBra 1 + bb + Alt + cc + Ket + # + a++ + Braminzero + Bra + bb + Alt + cc + Ket + # + a++ + Once + Brazero + Bra + bb + Alt + cc + Ket + Ket + # + a++ + Brazero + Bra + bb + Alt + cc + KetRmax + # + a+ + Brazero + CBra 2 + bb + Alt + cc + Ket + a# + a+ + Brazero + Bra + aa + Ket + Ket + End +------------------------------------------------------------------ + +/a+(?:bb)?a#a+(?:|||)#a+(?:|b)a#a+(?:|||)?a/BZ +------------------------------------------------------------------ + Bra + a+ + Brazero + Bra + bb + Ket + a# + a++ + Bra + Alt + Alt + Alt + Ket + # + a+ + Bra + Alt + b + Ket + a# + a+ + Brazero + Bra + Alt + Alt + Alt + Ket + a + Ket + End +------------------------------------------------------------------ + +/[ab]*/BZ +------------------------------------------------------------------ + Bra + [ab]*+ + Ket + End +------------------------------------------------------------------ + aaaa + 0: aaaa + +/[ab]*?/BZ +------------------------------------------------------------------ + Bra + [ab]*? + Ket + End +------------------------------------------------------------------ + aaaa + 0: + +/[ab]?/BZ +------------------------------------------------------------------ + Bra + [ab]?+ + Ket + End +------------------------------------------------------------------ + aaaa + 0: a + +/[ab]??/BZ +------------------------------------------------------------------ + Bra + [ab]?? + Ket + End +------------------------------------------------------------------ + aaaa + 0: + +/[ab]+/BZ +------------------------------------------------------------------ + Bra + [ab]++ + Ket + End +------------------------------------------------------------------ + aaaa + 0: aaaa + +/[ab]+?/BZ +------------------------------------------------------------------ + Bra + [ab]+? + Ket + End +------------------------------------------------------------------ + aaaa + 0: a + +/[ab]{2,3}/BZ +------------------------------------------------------------------ + Bra + [ab]{2,3}+ + Ket + End +------------------------------------------------------------------ + aaaa + 0: aaa + +/[ab]{2,3}?/BZ +------------------------------------------------------------------ + Bra + [ab]{2,3}? + Ket + End +------------------------------------------------------------------ + aaaa + 0: aa + +/[ab]{2,}/BZ +------------------------------------------------------------------ + Bra + [ab]{2,}+ + Ket + End +------------------------------------------------------------------ + aaaa + 0: aaaa + +/[ab]{2,}?/BZ +------------------------------------------------------------------ + Bra + [ab]{2,}? + Ket + End +------------------------------------------------------------------ + aaaa + 0: aa + +/\d+\s{0,5}=\s*\S?=\w{0,4}\W*/BZ +------------------------------------------------------------------ + Bra + \d++ + \s{0,5}+ + = + \s*+ + \S? + = + \w{0,4}+ + \W*+ + Ket + End +------------------------------------------------------------------ + +/[a-d]{5,12}[e-z0-9]*#[^a-z]+[b-y]*a[2-7]?[^0-9a-z]+/BZ +------------------------------------------------------------------ + Bra + [a-d]{5,12}+ + [0-9e-z]*+ + # + [\x00-`{-\xff] (neg)++ + [b-y]*+ + a + [2-7]?+ + [\x00-/:-`{-\xff] (neg)++ + Ket + End +------------------------------------------------------------------ + +/[a-z]*\s#[ \t]?\S#[a-c]*\S#[C-G]+?\d#[4-8]*\D#[4-9,]*\D#[!$]{0,5}\w#[M-Xf-l]+\W#[a-c,]?\W/BZ +------------------------------------------------------------------ + Bra + [a-z]*+ + \s + # + [\x09 ]?+ + \S + # + [a-c]* + \S + # + [C-G]++ + \d + # + [4-8]*+ + \D + # + [,4-9]* + \D + # + [!$]{0,5}+ + \w + # + [M-Xf-l]++ + \W + # + [,a-c]? + \W + Ket + End +------------------------------------------------------------------ + +/a+(aa|bb)*c#a*(bb|cc)*a#a?(bb|cc)*d#[a-f]*(g|hh)*f/BZ +------------------------------------------------------------------ + Bra + a+ + Brazero + CBra 1 + aa + Alt + bb + KetRmax + c# + a* + Brazero + CBra 2 + bb + Alt + cc + KetRmax + a# + a?+ + Brazero + CBra 3 + bb + Alt + cc + KetRmax + d# + [a-f]* + Brazero + CBra 4 + g + Alt + hh + KetRmax + f + Ket + End +------------------------------------------------------------------ + +/[a-f]*(g|hh|i)*i#[a-x]{4,}(y{0,6})*y#[a-k]+(ll|mm)+n/BZ +------------------------------------------------------------------ + Bra + [a-f]*+ + Brazero + CBra 1 + g + Alt + hh + Alt + i + KetRmax + i# + [a-x]{4,} + Brazero + SCBra 2 + y{0,6} + KetRmax + y# + [a-k]++ + CBra 3 + ll + Alt + mm + KetRmax + n + Ket + End +------------------------------------------------------------------ + +/[a-f]*(?>gg|hh)+#[a-f]*(?>gg|hh)?#[a-f]*(?>gg|hh)*a#[a-f]*(?>gg|hh)*h/BZ +------------------------------------------------------------------ + Bra + [a-f]*+ + Once_NC + gg + Alt + hh + KetRmax + # + [a-f]*+ + Brazero + Once_NC + gg + Alt + hh + Ket + # + [a-f]* + Brazero + Once_NC + gg + Alt + hh + KetRmax + a# + [a-f]*+ + Brazero + Once_NC + gg + Alt + hh + KetRmax + h + Ket + End +------------------------------------------------------------------ + +/[a-c]*d/DZS +------------------------------------------------------------------ + Bra + [a-c]*+ + d + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +Need char = 'd' +Subject length lower bound = 1 +Starting chars: a b c d + +/[a-c]+d/DZS +------------------------------------------------------------------ + Bra + [a-c]++ + d + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +Need char = 'd' +Subject length lower bound = 2 +Starting chars: a b c + +/[a-c]?d/DZS +------------------------------------------------------------------ + Bra + [a-c]?+ + d + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +Need char = 'd' +Subject length lower bound = 1 +Starting chars: a b c d + +/[a-c]{4,6}d/DZS +------------------------------------------------------------------ + Bra + [a-c]{4,6}+ + d + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +Need char = 'd' +Subject length lower bound = 5 +Starting chars: a b c + +/[a-c]{0,6}d/DZS +------------------------------------------------------------------ + Bra + [a-c]{0,6}+ + d + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +Need char = 'd' +Subject length lower bound = 1 +Starting chars: a b c d + +/-- End of special auto-possessive tests --/ + +/^A\o{1239}B/ +Failed: non-octal character in \o{} (closing brace missing?) at offset 8 + +/^A\oB/ +Failed: missing opening brace after \o at offset 3 + +/^A\x{zz}B/ +Failed: non-hex character in \x{} (closing brace missing?) at offset 5 + +/^A\x{12Z/ +Failed: non-hex character in \x{} (closing brace missing?) at offset 7 + +/^A\x{/ +Failed: non-hex character in \x{} (closing brace missing?) at offset 5 + +/[ab]++/BZO +------------------------------------------------------------------ + Bra + [ab]++ + Ket + End +------------------------------------------------------------------ + +/[^ab]*+/BZO +------------------------------------------------------------------ + Bra + [\x00-`c-\xff] (neg)*+ + Ket + End +------------------------------------------------------------------ + +/a{4}+/BZO +------------------------------------------------------------------ + Bra + a{4} + Ket + End +------------------------------------------------------------------ + +/a{4}+/BZOi +------------------------------------------------------------------ + Bra + /i a{4} + Ket + End +------------------------------------------------------------------ + +/[a-[:digit:]]+/ +Failed: invalid range in character class at offset 3 + +/[A-[:digit:]]+/ +Failed: invalid range in character class at offset 3 + +/[a-[.xxx.]]+/ +Failed: invalid range in character class at offset 3 + +/[a-[=xxx=]]+/ +Failed: invalid range in character class at offset 3 + +/[a-[!xxx!]]+/ +Failed: range out of order in character class at offset 3 + +/[A-[!xxx!]]+/ + A]]] + 0: A]]] + +/[a-\d]+/ +Failed: invalid range in character class at offset 4 + +/(?<0abc>xx)/ +Failed: group name must start with a non-digit at offset 3 + +/(?&1abc)xx(?<1abc>y)/ +Failed: group name must start with a non-digit at offset 3 + +/(?xx)/ +Failed: syntax error in subpattern name (missing terminator) at offset 5 + +/(?'0abc'xx)/ +Failed: group name must start with a non-digit at offset 3 + +/(?P<0abc>xx)/ +Failed: group name must start with a non-digit at offset 4 + +/\k<5ghj>/ +Failed: group name must start with a non-digit at offset 3 + +/\k'5ghj'/ +Failed: group name must start with a non-digit at offset 3 + +/\k{2fgh}/ +Failed: group name must start with a non-digit at offset 3 + +/(?P=8yuki)/ +Failed: group name must start with a non-digit at offset 4 + +/\g{4df}/ +Failed: group name must start with a non-digit at offset 3 + +/(?&1abc)xx(?<1abc>y)/ +Failed: group name must start with a non-digit at offset 3 + +/(?P>1abc)xx(?<1abc>y)/ +Failed: group name must start with a non-digit at offset 4 + +/\g'3gh'/ +Failed: \g is not followed by a braced, angle-bracketed, or quoted name/number or by a plain number at offset 2 + +/\g<5fg>/ +Failed: \g is not followed by a braced, angle-bracketed, or quoted name/number or by a plain number at offset 2 + +/(?(<4gh>)abc)/ +Failed: group name must start with a non-digit at offset 4 + +/(?('4gh')abc)/ +Failed: group name must start with a non-digit at offset 4 + +/(?(4gh)abc)/ +Failed: malformed number or name after (?( at offset 4 + +/(?(R&6yh)abc)/ +Failed: group name must start with a non-digit at offset 5 + +/(((a\2)|(a*)\g<-1>))*a?/BZ +------------------------------------------------------------------ + Bra + Brazero + SCBra 1 + Once + CBra 2 + CBra 3 + a + \2 + Ket + Alt + CBra 4 + a* + Ket + Recurse + Ket + Ket + KetRmax + a?+ + Ket + End +------------------------------------------------------------------ + +/-- Test the ugly "start or end of word" compatibility syntax --/ + +/[[:<:]]red[[:>:]]/BZ +------------------------------------------------------------------ + Bra + \b + Assert + \w + Ket + red + \b + AssertB + Reverse + \w + Ket + Ket + End +------------------------------------------------------------------ + little red riding hood + 0: red + a /red/ thing + 0: red + red is a colour + 0: red + put it all on red + 0: red + ** Failers +No match + no reduction +No match + Alfred Winifred +No match + +/[a[:<:]] should give error/ +Failed: unknown POSIX class name at offset 4 + +/(?=ab\K)/+ + abcd +Start of matched string is beyond its end - displaying from end to start. + 0: ab + 0+ abcd + +/abcd/f + xx\nxabcd +No match + +/ -- Test stack check external calls --/ + +/(((((a)))))/Q0 + +/(((((a)))))/Q1 +Failed: parentheses are too deeply nested (stack check) at offset 0 + +/(((((a)))))/Q +** Missing 0 or 1 after /Q + +/^\w+(?>\s*)(?<=\w)/BZ +------------------------------------------------------------------ + Bra + ^ + \w+ + Once_NC + \s*+ + Ket + AssertB + Reverse + \w + Ket + Ket + End +------------------------------------------------------------------ + +/\othing/ +Failed: missing opening brace after \o at offset 1 + +/\o{}/ +Failed: digits missing in \x{} or \o{} at offset 1 + +/\o{whatever}/ +Failed: non-octal character in \o{} (closing brace missing?) at offset 3 + +/\xthing/ + +/\x{}/ +Failed: digits missing in \x{} or \o{} at offset 3 + +/\x{whatever}/ +Failed: non-hex character in \x{} (closing brace missing?) at offset 3 + +"((?=(?(?=(?(?=(?(?=()))))))))" + a + 0: + 1: + 2: + +"(?(?=)==)(((((((((?=)))))))))" + a +No match + +/^(?:(a)|b)(?(1)A|B)/I +Capturing subpattern count = 1 +Max back reference = 1 +Options: anchored +No first char +No need char + aA123\O3 +Matched, but too many substrings + 0: aA + aA123\O6 + 0: aA + 1: a + +'^(?:(?a)|b)(?()A|B)' + aA123\O3 +Matched, but too many substrings + 0: aA + aA123\O6 + 0: aA + 1: a + +'^(?)(?:(?a)|b)(?()A|B)'J + aA123\O3 +Matched, but too many substrings + 0: aA + aA123\O6 +Matched, but too many substrings + 0: aA + 1: + +'^(?:(?X)|)(?:(?a)|b)\k{AA}'J + aa123\O3 +Matched, but too many substrings + 0: aa + aa123\O6 +Matched, but too many substrings + 0: aa + 1: + +/(?(?J)(?1(111111)11|)1|1|)(?()1)/ + +/(?(?=0)?)+/ +Failed: nothing to repeat at offset 7 + +/(?(?=0)(?=00)?00765)/ + 00765 + 0: 00765 + +/(?(?=0)(?=00)?00765|(?!3).56)/ + 00765 + 0: 00765 + 456 + 0: 456 + ** Failers +No match + 356 +No match + +'^(a)*+(\w)' + g + 0: g + 1: + 2: g + g\O3 +Matched, but too many substrings + 0: g + +'^(?:a)*+(\w)' + g + 0: g + 1: g + g\O3 +Matched, but too many substrings + 0: g + +//C + \O\C+ +Callout 255: last capture = -1 +---> + +0 ^ +Matched, but too many substrings + +"((?2){0,1999}())?" + +/((?+1)(\1))/BZ +------------------------------------------------------------------ + Bra + Once + CBra 1 + Recurse + CBra 2 + \1 + Ket + Ket + Ket + Ket + End +------------------------------------------------------------------ + +/(?(?!)a|b)/ + bbb + 0: b + aaa +No match + +"((?2)+)((?1))" + +"(?(?.*!.*)?)" +Failed: assertion expected after (?( or (?(?C) at offset 3 + +"X((?2)()*+){2}+"BZ +------------------------------------------------------------------ + Bra + X + Once + CBra 1 + Recurse + Braposzero + SCBraPos 2 + KetRpos + Ket + CBra 1 + Recurse + Braposzero + SCBraPos 2 + KetRpos + Ket + Ket + Ket + End +------------------------------------------------------------------ + +"X((?2)()*+){2}"BZ +------------------------------------------------------------------ + Bra + X + CBra 1 + Recurse + Braposzero + SCBraPos 2 + KetRpos + Ket + CBra 1 + Recurse + Braposzero + SCBraPos 2 + KetRpos + Ket + Ket + End +------------------------------------------------------------------ + +"(?<=((?2))((?1)))" +Failed: lookbehind assertion is not fixed length at offset 17 + +/(?<=\Ka)/g+ + aaaaa + 0: a + 0+ aaaa + 0: a + 0+ aaaa + 0: a + 0+ aaa + 0: a + 0+ aa + 0: a + 0+ a + 0: a + 0+ + +/(?<=\Ka)/G+ + aaaaa + 0: a + 0+ aaaa + 0: a + 0+ aaa + 0: a + 0+ aa + 0: a + 0+ a + 0: a + 0+ + +/((?2){73}(?2))((?1))/ + +/.((?2)(?R)\1)()/BZ +------------------------------------------------------------------ + Bra + Any + Once + CBra 1 + Recurse + Recurse + \1 + Ket + Ket + CBra 2 + Ket + Ket + End +------------------------------------------------------------------ + +/(?1)()((((((\1++))\x85)+)|))/ + +/(\9*+(?2);\3++()2|)++{/ +Failed: reference to non-existent subpattern at offset 22 + +/\V\x85\9*+((?2)\3++()2)*:2/ +Failed: reference to non-existent subpattern at offset 26 + +/(((?(R)){0,2}) (?''((?'R')((?'R')))))/J + +/(((?(X)){0,2}) (?''((?'X')((?'X')))))/J + +/(((?(R)){0,2}) (?''((?'X')((?'R')))))/ + +"(?J)(?'d'(?'d'\g{d}))" + +".*?\h.+.\.+\R*?\xd(?i)(?=!(?=b`b`b`\`b\xa9b!)`\a`bbbbbbbbbbbbb`bbbbbbbbbbbb*R\x85bbbbbbb\C?{((?2)(?))(( +\H){8(?<=(?1){29}\xa8bbbb\x16\xd\xc6^($(?1)/ + +/a[[:punct:]b]/BZ +------------------------------------------------------------------ + Bra + a + [!-/:-@[-`b{-~] + Ket + End +------------------------------------------------------------------ + +/L(?#(|++)(?J:(?)(?))(?)/ + \O\CC +Matched, but too many substrings +copy substring C failed -7 + +/(?=a\K)/ + ring bpattingbobnd $ 1,oern cou \rb\L +Start of matched string is beyond its end - displaying from end to start. + 0: a + 0L + +/(?<=((?C)0))/ + 9010 +--->9010 + 0 ^ 0 + 0 ^ 0 + 0: + 1: 0 + abcd +--->abcd + 0 ^ 0 + 0 ^ 0 + 0 ^ 0 + 0 ^ 0 +No match + +/((?J)(?'R'(?'R'(?'R'(?'R'(?'R'(?|(\k'R'))))))))/ + +/\N(?(?C)0?!.)*/ +Failed: assertion expected after (?( or (?(?C) at offset 4 + +/(?abc)(?(R)xyz)/BZ +------------------------------------------------------------------ + Bra + CBra 1 + abc + Ket + Cond + Cond recurse any + xyz + Ket + Ket + End +------------------------------------------------------------------ + +/(?abc)(?(R)xyz)/BZ +------------------------------------------------------------------ + Bra + CBra 1 + abc + Ket + Cond + 1 Cond ref + xyz + Ket + Ket + End +------------------------------------------------------------------ + +/(?=.*[A-Z])/I +Capturing subpattern count = 0 +May match empty string +No options +No first char +No need char + +"(?<=(a))\1?b" + ab + 0: b + 1: a + aaab + 0: ab + 1: a + +"(?=(a))\1?b" + ab + 0: ab + 1: a + aaab + 0: ab + 1: a + +/(?(?=^))b/ + abc + 0: b + +/-- End of testinput2 --/ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput20 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput20 new file mode 100755 index 000000000..c1b20ee80 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput20 @@ -0,0 +1,24 @@ +/-- These DFA tests are for the handling of characters greater than 255 in + 16- or 32-bit, non-UTF mode. --/ + +/^\x{ffff}+/i + \x{ffff} + 0: \x{ffff} + +/^\x{ffff}?/i + \x{ffff} + 0: \x{ffff} + +/^\x{ffff}*/i + \x{ffff} + 0: \x{ffff} + +/^\x{ffff}{3}/i + \x{ffff}\x{ffff}\x{ffff} + 0: \x{ffff}\x{ffff}\x{ffff} + +/^\x{ffff}{0,3}/i + \x{ffff} + 0: \x{ffff} + +/-- End of testinput20 --/ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput21-16 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput21-16 new file mode 100755 index 000000000..da194d90e --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput21-16 @@ -0,0 +1,100 @@ +/-- Tests for reloading pre-compiled patterns. The first one gives an error +right away, and can be any old pattern compiled in 8-bit mode ("abc" is +typical). The others require the link size to be 2. */x + +(?:[AaLl]+)[^xX-]*?)(?P[\x{150}-\x{250}\x{300}]| + [^\x{800}aAs-uS-U\x{d800}-\x{dfff}])++[^#\b\x{500}\x{1000}]{3,5}$ + /x + + In 16-bit mode with options: S>testdata/saved16LE-1 + FS>testdata/saved16BE-1 + In 32-bit mode with options: S>testdata/saved32LE-1 + FS>testdata/saved32BE-1 +--%x + +(?:[AaLl]+)[^xX-]*?)(?P[\x{150}-\x{250}\x{300}]| + [^\x{800}aAs-uS-U\x{d800}-\x{dfff}])++[^#\b\x{500}\x{1000}]{3,5}$ + /x + + In 16-bit mode with options: S>testdata/saved16LE-1 + FS>testdata/saved16BE-1 + In 32-bit mode with options: S>testdata/saved32LE-1 + FS>testdata/saved32BE-1 +--%x + +[aZ\x{400}-\x{10ffff}]{4,} + [\x{f123}\x{10039}\x{20000}-\x{21234}]?| + [A-Cx-z\x{100000}-\x{1000a7}\x{101234}]) + (?[^az])/x + + In 16-bit mode with options: S8>testdata/saved16LE-2 + FS8>testdata/saved16BE-2 + In 32-bit mode with options: S8>testdata/saved32LE-2 + FS8>testdata/saved32BE-2 +--%8x + +[aZ\x{400}-\x{10ffff}]{4,} + [\x{f123}\x{10039}\x{20000}-\x{21234}]?| + [A-Cx-z\x{100000}-\x{1000a7}\x{101234}]) + (?[^az])/x + + In 16-bit mode with options: S8>testdata/saved16LE-2 + FS8>testdata/saved16BE-2 + In 32-bit mode with options: S8>testdata/saved32LE-2 + FS8>testdata/saved32BE-2 +--%8x + + ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ + _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ \x7f \x80 + \x81 \x82 \x83 \x84 \x85 \x86 \x87 \x88 \x89 \x8a \x8b \x8c \x8d \x8e \x8f + \x90 \x91 \x92 \x93 \x94 \x95 \x96 \x97 \x98 \x99 \x9a \x9b \x9c \x9d \x9e + \x9f \xa1 \xa2 \xa3 \xa4 \xa5 \xa6 \xa7 \xa8 \xa9 \xaa \xab \xac \xad \xae + \xaf \xb0 \xb1 \xb2 \xb3 \xb4 \xb5 \xb6 \xb7 \xb8 \xb9 \xba \xbb \xbc \xbd + \xbe \xbf \xc0 \xc1 \xc2 \xc3 \xc4 \xc5 \xc6 \xc7 \xc8 \xc9 \xca \xcb \xcc + \xcd \xce \xcf \xd0 \xd1 \xd2 \xd3 \xd4 \xd5 \xd6 \xd7 \xd8 \xd9 \xda \xdb + \xdc \xdd \xde \xdf \xe0 \xe1 \xe2 \xe3 \xe4 \xe5 \xe6 \xe7 \xe8 \xe9 \xea + \xeb \xec \xed \xee \xef \xf0 \xf1 \xf2 \xf3 \xf4 \xf5 \xf6 \xf7 \xf8 \xf9 + \xfa \xfb \xfc \xfd \xfe \xff + +/[\V]/BZSI +------------------------------------------------------------------ + Bra + [\x00-\x09\x0e-\x84\x86-\xff\x{100}-\x{2027}\x{202a}-\x{ffff}] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +No need char +Subject length lower bound = 1 +Starting chars: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \x0e + \x0f \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1a \x1b \x1c \x1d + \x1e \x1f \x20 ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > + ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c + d e f g h i j k l m n o p q r s t u v w x y z { | } ~ \x7f \x80 \x81 \x82 + \x83 \x84 \x86 \x87 \x88 \x89 \x8a \x8b \x8c \x8d \x8e \x8f \x90 \x91 \x92 + \x93 \x94 \x95 \x96 \x97 \x98 \x99 \x9a \x9b \x9c \x9d \x9e \x9f \xa0 \xa1 + \xa2 \xa3 \xa4 \xa5 \xa6 \xa7 \xa8 \xa9 \xaa \xab \xac \xad \xae \xaf \xb0 + \xb1 \xb2 \xb3 \xb4 \xb5 \xb6 \xb7 \xb8 \xb9 \xba \xbb \xbc \xbd \xbe \xbf + \xc0 \xc1 \xc2 \xc3 \xc4 \xc5 \xc6 \xc7 \xc8 \xc9 \xca \xcb \xcc \xcd \xce + \xcf \xd0 \xd1 \xd2 \xd3 \xd4 \xd5 \xd6 \xd7 \xd8 \xd9 \xda \xdb \xdc \xdd + \xde \xdf \xe0 \xe1 \xe2 \xe3 \xe4 \xe5 \xe6 \xe7 \xe8 \xe9 \xea \xeb \xec + \xed \xee \xef \xf0 \xf1 \xf2 \xf3 \xf4 \xf5 \xf6 \xf7 \xf8 \xf9 \xfa \xfb + \xfc \xfd \xfe \xff + +/-- End of testinput23 --/ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput24 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput24 new file mode 100755 index 000000000..0714a0fe1 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput24 @@ -0,0 +1,13 @@ +/-- Tests for the 16-bit library with UTF-16 support only */ + +< forbid W + +/bad/8 + \x{d800} +Error -10 (bad UTF-16 string) offset=0 reason=1 + +/short/8 + \P\P\x{d800} +Error -25 (short UTF-16 string) offset=0 reason=1 + +/-- End of testinput24 --/ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput25 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput25 new file mode 100755 index 000000000..4c62c8d80 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput25 @@ -0,0 +1,119 @@ +/-- Tests for the 32-bit library only */ + +< forbid 8W + +/-- Check maximum character size --/ + +/\x{110000}/ + +/\x{7fffffff}/ + +/\x{80000000}/ + +/\x{ffffffff}/ + +/\x{100000000}/ +Failed: character value in \x{} or \o{} is too large at offset 12 + +/\o{17777777777}/ + +/\o{20000000000}/ + +/\o{37777777777}/ + +/\o{40000000000}/ +Failed: character value in \x{} or \o{} is too large at offset 14 + +/\x{7fffffff}\x{7fffffff}/I +Capturing subpattern count = 0 +No options +First char = \x{7fffffff} +Need char = \x{7fffffff} + +/\x{80000000}\x{80000000}/I +Capturing subpattern count = 0 +No options +First char = \x{80000000} +Need char = \x{80000000} + +/\x{ffffffff}\x{ffffffff}/I +Capturing subpattern count = 0 +No options +First char = \x{ffffffff} +Need char = \x{ffffffff} + +/-- Non-UTF characters --/ + +/\C{2,3}/ + \x{400000}\x{400001}\x{400002}\x{400003} + 0: \x{400000}\x{400001}\x{400002} + +/\x{400000}\x{800000}/iDZ +------------------------------------------------------------------ + Bra + /i \x{400000}\x{800000} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: caseless +First char = \x{400000} +Need char = \x{800000} + +/-- Check character ranges --/ + +/[\H]/BZSI +------------------------------------------------------------------ + Bra + [\x00-\x08\x0a-\x1f!-\x9f\xa1-\xff\x{100}-\x{167f}\x{1681}-\x{180d}\x{180f}-\x{1fff}\x{200b}-\x{202e}\x{2030}-\x{205e}\x{2060}-\x{2fff}\x{3001}-\x{ffffffff}] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +No need char +Subject length lower bound = 1 +Starting chars: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x0a \x0b + \x0c \x0d \x0e \x0f \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1a + \x1b \x1c \x1d \x1e \x1f ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 + : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ + _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ \x7f \x80 + \x81 \x82 \x83 \x84 \x85 \x86 \x87 \x88 \x89 \x8a \x8b \x8c \x8d \x8e \x8f + \x90 \x91 \x92 \x93 \x94 \x95 \x96 \x97 \x98 \x99 \x9a \x9b \x9c \x9d \x9e + \x9f \xa1 \xa2 \xa3 \xa4 \xa5 \xa6 \xa7 \xa8 \xa9 \xaa \xab \xac \xad \xae + \xaf \xb0 \xb1 \xb2 \xb3 \xb4 \xb5 \xb6 \xb7 \xb8 \xb9 \xba \xbb \xbc \xbd + \xbe \xbf \xc0 \xc1 \xc2 \xc3 \xc4 \xc5 \xc6 \xc7 \xc8 \xc9 \xca \xcb \xcc + \xcd \xce \xcf \xd0 \xd1 \xd2 \xd3 \xd4 \xd5 \xd6 \xd7 \xd8 \xd9 \xda \xdb + \xdc \xdd \xde \xdf \xe0 \xe1 \xe2 \xe3 \xe4 \xe5 \xe6 \xe7 \xe8 \xe9 \xea + \xeb \xec \xed \xee \xef \xf0 \xf1 \xf2 \xf3 \xf4 \xf5 \xf6 \xf7 \xf8 \xf9 + \xfa \xfb \xfc \xfd \xfe \xff + +/[\V]/BZSI +------------------------------------------------------------------ + Bra + [\x00-\x09\x0e-\x84\x86-\xff\x{100}-\x{2027}\x{202a}-\x{ffffffff}] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +No need char +Subject length lower bound = 1 +Starting chars: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \x0e + \x0f \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1a \x1b \x1c \x1d + \x1e \x1f \x20 ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > + ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c + d e f g h i j k l m n o p q r s t u v w x y z { | } ~ \x7f \x80 \x81 \x82 + \x83 \x84 \x86 \x87 \x88 \x89 \x8a \x8b \x8c \x8d \x8e \x8f \x90 \x91 \x92 + \x93 \x94 \x95 \x96 \x97 \x98 \x99 \x9a \x9b \x9c \x9d \x9e \x9f \xa0 \xa1 + \xa2 \xa3 \xa4 \xa5 \xa6 \xa7 \xa8 \xa9 \xaa \xab \xac \xad \xae \xaf \xb0 + \xb1 \xb2 \xb3 \xb4 \xb5 \xb6 \xb7 \xb8 \xb9 \xba \xbb \xbc \xbd \xbe \xbf + \xc0 \xc1 \xc2 \xc3 \xc4 \xc5 \xc6 \xc7 \xc8 \xc9 \xca \xcb \xcc \xcd \xce + \xcf \xd0 \xd1 \xd2 \xd3 \xd4 \xd5 \xd6 \xd7 \xd8 \xd9 \xda \xdb \xdc \xdd + \xde \xdf \xe0 \xe1 \xe2 \xe3 \xe4 \xe5 \xe6 \xe7 \xe8 \xe9 \xea \xeb \xec + \xed \xee \xef \xf0 \xf1 \xf2 \xf3 \xf4 \xf5 \xf6 \xf7 \xf8 \xf9 \xfa \xfb + \xfc \xfd \xfe \xff + +/-- End of testinput25 --/ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput26 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput26 new file mode 100755 index 000000000..28f8d42a5 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput26 @@ -0,0 +1,17 @@ +/-- Tests for the 32-bit library with UTF-32 support only */ + +< forbid W + +/-- Non-UTF characters --/ + +/\x{110000}/8 +Failed: character value in \x{} or \o{} is too large at offset 9 + +/\o{4200000}/8 +Failed: character value in \x{} or \o{} is too large at offset 10 + +/\C/8 + \x{110000} +Error -10 (bad UTF-32 string) offset=0 reason=3 + +/-- End of testinput26 --/ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput3 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput3 new file mode 100755 index 000000000..73119ab4b --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput3 @@ -0,0 +1,174 @@ +/-- This set of tests checks local-specific features, using the "fr_FR" locale. + It is not Perl-compatible. When run via RunTest, the locale is edited to + be whichever of "fr_FR", "french", or "fr" is found to exist. There is + different version of this file called wintestinput3 for use on Windows, + where the locale is called "french" and the tests are run using + RunTest.bat. --/ + +< forbid 8W + +/^[\w]+/ + *** Failers +No match + École +No match + +/^[\w]+/Lfr_FR + École + 0: École + +/^[\w]+/ + *** Failers +No match + École +No match + +/^[\W]+/ + École + 0: \xc9 + +/^[\W]+/Lfr_FR + *** Failers + 0: *** + École +No match + +/[\b]/ + \b + 0: \x08 + *** Failers +No match + a +No match + +/[\b]/Lfr_FR + \b + 0: \x08 + *** Failers +No match + a +No match + +/^\w+/ + *** Failers +No match + École +No match + +/^\w+/Lfr_FR + École + 0: École + +/(.+)\b(.+)/ + École + 0: \xc9cole + 1: \xc9 + 2: cole + +/(.+)\b(.+)/Lfr_FR + *** Failers + 0: *** Failers + 1: *** + 2: Failers + École +No match + +/École/i + École + 0: \xc9cole + *** Failers +No match + école +No match + +/École/iLfr_FR + École + 0: École + école + 0: école + +/\w/IS +Capturing subpattern count = 0 +No options +No first char +No need char +Subject length lower bound = 1 +Starting chars: 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P + Q R S T U V W X Y Z _ a b c d e f g h i j k l m n o p q r s t u v w x y z + +/\w/ISLfr_FR +Capturing subpattern count = 0 +No options +No first char +No need char +Subject length lower bound = 1 +Starting chars: 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P + Q R S T U V W X Y Z _ a b c d e f g h i j k l m n o p q r s t u v w x y z + ª µ º À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö Ø Ù Ú Û Ü Ý Þ ß à á â + ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ø ù ú û ü ý þ ÿ + +/^[\xc8-\xc9]/iLfr_FR + École + 0: É + école + 0: é + +/^[\xc8-\xc9]/Lfr_FR + École + 0: É + *** Failers +No match + école +No match + +/\W+/Lfr_FR + >>>\xaa<<< + 0: >>> + >>>\xba<<< + 0: >>> + +/[\W]+/Lfr_FR + >>>\xaa<<< + 0: >>> + >>>\xba<<< + 0: >>> + +/[^[:alpha:]]+/Lfr_FR + >>>\xaa<<< + 0: >>> + >>>\xba<<< + 0: >>> + +/\w+/Lfr_FR + >>>\xaa<<< + 0: ª + >>>\xba<<< + 0: º + +/[\w]+/Lfr_FR + >>>\xaa<<< + 0: ª + >>>\xba<<< + 0: º + +/[[:alpha:]]+/Lfr_FR + >>>\xaa<<< + 0: ª + >>>\xba<<< + 0: º + +/[[:alpha:]][[:lower:]][[:upper:]]/DZLfr_FR +------------------------------------------------------------------ + Bra + [A-Za-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\xff] + [a-z\xb5\xdf-\xf6\xf8-\xff] + [A-Z\xc0-\xd6\xd8-\xde] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +No need char + +/-- End of testinput3 --/ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput3A b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput3A new file mode 100755 index 000000000..0bde024e4 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput3A @@ -0,0 +1,174 @@ +/-- This set of tests checks local-specific features, using the "fr_FR" locale. + It is not Perl-compatible. When run via RunTest, the locale is edited to + be whichever of "fr_FR", "french", or "fr" is found to exist. There is + different version of this file called wintestinput3 for use on Windows, + where the locale is called "french" and the tests are run using + RunTest.bat. --/ + +< forbid 8W + +/^[\w]+/ + *** Failers +No match + École +No match + +/^[\w]+/Lfr_FR + École + 0: École + +/^[\w]+/ + *** Failers +No match + École +No match + +/^[\W]+/ + École + 0: \xc9 + +/^[\W]+/Lfr_FR + *** Failers + 0: *** + École +No match + +/[\b]/ + \b + 0: \x08 + *** Failers +No match + a +No match + +/[\b]/Lfr_FR + \b + 0: \x08 + *** Failers +No match + a +No match + +/^\w+/ + *** Failers +No match + École +No match + +/^\w+/Lfr_FR + École + 0: École + +/(.+)\b(.+)/ + École + 0: \xc9cole + 1: \xc9 + 2: cole + +/(.+)\b(.+)/Lfr_FR + *** Failers + 0: *** Failers + 1: *** + 2: Failers + École +No match + +/École/i + École + 0: \xc9cole + *** Failers +No match + école +No match + +/École/iLfr_FR + École + 0: École + école + 0: école + +/\w/IS +Capturing subpattern count = 0 +No options +No first char +No need char +Subject length lower bound = 1 +Starting chars: 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P + Q R S T U V W X Y Z _ a b c d e f g h i j k l m n o p q r s t u v w x y z + +/\w/ISLfr_FR +Capturing subpattern count = 0 +No options +No first char +No need char +Subject length lower bound = 1 +Starting chars: 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P + Q R S T U V W X Y Z _ a b c d e f g h i j k l m n o p q r s t u v w x y z + ª µ º À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö Ø Ù Ú Û Ü Ý Þ ß à á â + ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ø ù ú û ü ý þ ÿ + +/^[\xc8-\xc9]/iLfr_FR + École + 0: É + école + 0: é + +/^[\xc8-\xc9]/Lfr_FR + École + 0: É + *** Failers +No match + école +No match + +/\W+/Lfr_FR + >>>\xaa<<< + 0: >>> + >>>\xba<<< + 0: >>> + +/[\W]+/Lfr_FR + >>>\xaa<<< + 0: >>> + >>>\xba<<< + 0: >>> + +/[^[:alpha:]]+/Lfr_FR + >>>\xaa<<< + 0: >>> + >>>\xba<<< + 0: >>> + +/\w+/Lfr_FR + >>>\xaa<<< + 0: ª + >>>\xba<<< + 0: º + +/[\w]+/Lfr_FR + >>>\xaa<<< + 0: ª + >>>\xba<<< + 0: º + +/[[:alpha:]]+/Lfr_FR + >>>\xaa<<< + 0: ª + >>>\xba<<< + 0: º + +/[[:alpha:]][[:lower:]][[:upper:]]/DZLfr_FR +------------------------------------------------------------------ + Bra + [A-Za-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\xff] + [a-z\xaa\xb5\xba\xdf-\xf6\xf8-\xff] + [A-Z\xc0-\xd6\xd8-\xde] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +No need char + +/-- End of testinput3 --/ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput3B b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput3B new file mode 100755 index 000000000..8d9fe7df7 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput3B @@ -0,0 +1,174 @@ +/-- This set of tests checks local-specific features, using the "fr_FR" locale. + It is not Perl-compatible. When run via RunTest, the locale is edited to + be whichever of "fr_FR", "french", or "fr" is found to exist. There is + different version of this file called wintestinput3 for use on Windows, + where the locale is called "french" and the tests are run using + RunTest.bat. --/ + +< forbid 8W + +/^[\w]+/ + *** Failers +No match + École +No match + +/^[\w]+/Lfr_FR + École + 0: École + +/^[\w]+/ + *** Failers +No match + École +No match + +/^[\W]+/ + École + 0: \xc9 + +/^[\W]+/Lfr_FR + *** Failers + 0: *** + École +No match + +/[\b]/ + \b + 0: \x08 + *** Failers +No match + a +No match + +/[\b]/Lfr_FR + \b + 0: \x08 + *** Failers +No match + a +No match + +/^\w+/ + *** Failers +No match + École +No match + +/^\w+/Lfr_FR + École + 0: École + +/(.+)\b(.+)/ + École + 0: \xc9cole + 1: \xc9 + 2: cole + +/(.+)\b(.+)/Lfr_FR + *** Failers + 0: *** Failers + 1: *** + 2: Failers + École +No match + +/École/i + École + 0: \xc9cole + *** Failers +No match + école +No match + +/École/iLfr_FR + École + 0: École + école + 0: école + +/\w/IS +Capturing subpattern count = 0 +No options +No first char +No need char +Subject length lower bound = 1 +Starting chars: 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P + Q R S T U V W X Y Z _ a b c d e f g h i j k l m n o p q r s t u v w x y z + +/\w/ISLfr_FR +Capturing subpattern count = 0 +No options +No first char +No need char +Subject length lower bound = 1 +Starting chars: 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P + Q R S T U V W X Y Z _ a b c d e f g h i j k l m n o p q r s t u v w x y z + ª µ º À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö Ø Ù Ú Û Ü Ý Þ ß à á â + ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ø ù ú û ü ý þ ÿ + +/^[\xc8-\xc9]/iLfr_FR + École + 0: É + école + 0: é + +/^[\xc8-\xc9]/Lfr_FR + École + 0: É + *** Failers +No match + école +No match + +/\W+/Lfr_FR + >>>\xaa<<< + 0: >>> + >>>\xba<<< + 0: >>> + +/[\W]+/Lfr_FR + >>>\xaa<<< + 0: >>> + >>>\xba<<< + 0: >>> + +/[^[:alpha:]]+/Lfr_FR + >>>\xaa<<< + 0: >>> + >>>\xba<<< + 0: >>> + +/\w+/Lfr_FR + >>>\xaa<<< + 0: ª + >>>\xba<<< + 0: º + +/[\w]+/Lfr_FR + >>>\xaa<<< + 0: ª + >>>\xba<<< + 0: º + +/[[:alpha:]]+/Lfr_FR + >>>\xaa<<< + 0: ª + >>>\xba<<< + 0: º + +/[[:alpha:]][[:lower:]][[:upper:]]/DZLfr_FR +------------------------------------------------------------------ + Bra + [A-Za-z\x83\x8a\x8c\x8e\x9a\x9c\x9e\x9f\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\xff] + [a-z\x83\x9a\x9c\x9e\xaa\xb5\xba\xdf-\xf6\xf8-\xff] + [A-Z\x8a\x8c\x8e\x9f\xc0-\xd6\xd8-\xde] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +No need char + +/-- End of testinput3 --/ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput4 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput4 new file mode 100755 index 000000000..69e812cd3 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput4 @@ -0,0 +1,1284 @@ +/-- This set of tests is for UTF support, excluding Unicode properties. It is + compatible with all versions of Perl >= 5.10 and both the 8-bit and 16-bit + PCRE libraries. --/ + +< forbid 9?=ABCDEFfGILMNPTUWXZ< + +/a.b/8 + acb + 0: acb + a\x7fb + 0: a\x{7f}b + a\x{100}b + 0: a\x{100}b + *** Failers +No match + a\nb +No match + +/a(.{3})b/8 + a\x{4000}xyb + 0: a\x{4000}xyb + 1: \x{4000}xy + a\x{4000}\x7fyb + 0: a\x{4000}\x{7f}yb + 1: \x{4000}\x{7f}y + a\x{4000}\x{100}yb + 0: a\x{4000}\x{100}yb + 1: \x{4000}\x{100}y + *** Failers +No match + a\x{4000}b +No match + ac\ncb +No match + +/a(.*?)(.)/ + a\xc0\x88b + 0: a\xc0 + 1: + 2: \xc0 + +/a(.*?)(.)/8 + a\x{100}b + 0: a\x{100} + 1: + 2: \x{100} + +/a(.*)(.)/ + a\xc0\x88b + 0: a\xc0\x88b + 1: \xc0\x88 + 2: b + +/a(.*)(.)/8 + a\x{100}b + 0: a\x{100}b + 1: \x{100} + 2: b + +/a(.)(.)/ + a\xc0\x92bcd + 0: a\xc0\x92 + 1: \xc0 + 2: \x92 + +/a(.)(.)/8 + a\x{240}bcd + 0: a\x{240}b + 1: \x{240} + 2: b + +/a(.?)(.)/ + a\xc0\x92bcd + 0: a\xc0\x92 + 1: \xc0 + 2: \x92 + +/a(.?)(.)/8 + a\x{240}bcd + 0: a\x{240}b + 1: \x{240} + 2: b + +/a(.??)(.)/ + a\xc0\x92bcd + 0: a\xc0 + 1: + 2: \xc0 + +/a(.??)(.)/8 + a\x{240}bcd + 0: a\x{240} + 1: + 2: \x{240} + +/a(.{3})b/8 + a\x{1234}xyb + 0: a\x{1234}xyb + 1: \x{1234}xy + a\x{1234}\x{4321}yb + 0: a\x{1234}\x{4321}yb + 1: \x{1234}\x{4321}y + a\x{1234}\x{4321}\x{3412}b + 0: a\x{1234}\x{4321}\x{3412}b + 1: \x{1234}\x{4321}\x{3412} + *** Failers +No match + a\x{1234}b +No match + ac\ncb +No match + +/a(.{3,})b/8 + a\x{1234}xyb + 0: a\x{1234}xyb + 1: \x{1234}xy + a\x{1234}\x{4321}yb + 0: a\x{1234}\x{4321}yb + 1: \x{1234}\x{4321}y + a\x{1234}\x{4321}\x{3412}b + 0: a\x{1234}\x{4321}\x{3412}b + 1: \x{1234}\x{4321}\x{3412} + axxxxbcdefghijb + 0: axxxxbcdefghijb + 1: xxxxbcdefghij + a\x{1234}\x{4321}\x{3412}\x{3421}b + 0: a\x{1234}\x{4321}\x{3412}\x{3421}b + 1: \x{1234}\x{4321}\x{3412}\x{3421} + *** Failers +No match + a\x{1234}b +No match + +/a(.{3,}?)b/8 + a\x{1234}xyb + 0: a\x{1234}xyb + 1: \x{1234}xy + a\x{1234}\x{4321}yb + 0: a\x{1234}\x{4321}yb + 1: \x{1234}\x{4321}y + a\x{1234}\x{4321}\x{3412}b + 0: a\x{1234}\x{4321}\x{3412}b + 1: \x{1234}\x{4321}\x{3412} + axxxxbcdefghijb + 0: axxxxb + 1: xxxx + a\x{1234}\x{4321}\x{3412}\x{3421}b + 0: a\x{1234}\x{4321}\x{3412}\x{3421}b + 1: \x{1234}\x{4321}\x{3412}\x{3421} + *** Failers +No match + a\x{1234}b +No match + +/a(.{3,5})b/8 + a\x{1234}xyb + 0: a\x{1234}xyb + 1: \x{1234}xy + a\x{1234}\x{4321}yb + 0: a\x{1234}\x{4321}yb + 1: \x{1234}\x{4321}y + a\x{1234}\x{4321}\x{3412}b + 0: a\x{1234}\x{4321}\x{3412}b + 1: \x{1234}\x{4321}\x{3412} + axxxxbcdefghijb + 0: axxxxb + 1: xxxx + a\x{1234}\x{4321}\x{3412}\x{3421}b + 0: a\x{1234}\x{4321}\x{3412}\x{3421}b + 1: \x{1234}\x{4321}\x{3412}\x{3421} + axbxxbcdefghijb + 0: axbxxb + 1: xbxx + axxxxxbcdefghijb + 0: axxxxxb + 1: xxxxx + *** Failers +No match + a\x{1234}b +No match + axxxxxxbcdefghijb +No match + +/a(.{3,5}?)b/8 + a\x{1234}xyb + 0: a\x{1234}xyb + 1: \x{1234}xy + a\x{1234}\x{4321}yb + 0: a\x{1234}\x{4321}yb + 1: \x{1234}\x{4321}y + a\x{1234}\x{4321}\x{3412}b + 0: a\x{1234}\x{4321}\x{3412}b + 1: \x{1234}\x{4321}\x{3412} + axxxxbcdefghijb + 0: axxxxb + 1: xxxx + a\x{1234}\x{4321}\x{3412}\x{3421}b + 0: a\x{1234}\x{4321}\x{3412}\x{3421}b + 1: \x{1234}\x{4321}\x{3412}\x{3421} + axbxxbcdefghijb + 0: axbxxb + 1: xbxx + axxxxxbcdefghijb + 0: axxxxxb + 1: xxxxx + *** Failers +No match + a\x{1234}b +No match + axxxxxxbcdefghijb +No match + +/^[a\x{c0}]/8 + *** Failers +No match + \x{100} +No match + +/(?<=aXb)cd/8 + aXbcd + 0: cd + +/(?<=a\x{100}b)cd/8 + a\x{100}bcd + 0: cd + +/(?<=a\x{100000}b)cd/8 + a\x{100000}bcd + 0: cd + +/(?:\x{100}){3}b/8 + \x{100}\x{100}\x{100}b + 0: \x{100}\x{100}\x{100}b + *** Failers +No match + \x{100}\x{100}b +No match + +/\x{ab}/8 + \x{ab} + 0: \x{ab} + \xc2\xab + 0: \x{ab} + *** Failers +No match + \x00{ab} +No match + +/(?<=(.))X/8 + WXYZ + 0: X + 1: W + \x{256}XYZ + 0: X + 1: \x{256} + *** Failers +No match + XYZ +No match + +/[^a]+/8g + bcd + 0: bcd + \x{100}aY\x{256}Z + 0: \x{100} + 0: Y\x{256}Z + +/^[^a]{2}/8 + \x{100}bc + 0: \x{100}b + +/^[^a]{2,}/8 + \x{100}bcAa + 0: \x{100}bcA + +/^[^a]{2,}?/8 + \x{100}bca + 0: \x{100}b + +/[^a]+/8ig + bcd + 0: bcd + \x{100}aY\x{256}Z + 0: \x{100} + 0: Y\x{256}Z + +/^[^a]{2}/8i + \x{100}bc + 0: \x{100}b + +/^[^a]{2,}/8i + \x{100}bcAa + 0: \x{100}bc + +/^[^a]{2,}?/8i + \x{100}bca + 0: \x{100}b + +/\x{100}{0,0}/8 + abcd + 0: + +/\x{100}?/8 + abcd + 0: + \x{100}\x{100} + 0: \x{100} + +/\x{100}{0,3}/8 + \x{100}\x{100} + 0: \x{100}\x{100} + \x{100}\x{100}\x{100}\x{100} + 0: \x{100}\x{100}\x{100} + +/\x{100}*/8 + abce + 0: + \x{100}\x{100}\x{100}\x{100} + 0: \x{100}\x{100}\x{100}\x{100} + +/\x{100}{1,1}/8 + abcd\x{100}\x{100}\x{100}\x{100} + 0: \x{100} + +/\x{100}{1,3}/8 + abcd\x{100}\x{100}\x{100}\x{100} + 0: \x{100}\x{100}\x{100} + +/\x{100}+/8 + abcd\x{100}\x{100}\x{100}\x{100} + 0: \x{100}\x{100}\x{100}\x{100} + +/\x{100}{3}/8 + abcd\x{100}\x{100}\x{100}XX + 0: \x{100}\x{100}\x{100} + +/\x{100}{3,5}/8 + abcd\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}XX + 0: \x{100}\x{100}\x{100}\x{100}\x{100} + +/\x{100}{3,}/8 + abcd\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}XX + 0: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} + +/(?<=a\x{100}{2}b)X/8+ + Xyyya\x{100}\x{100}bXzzz + 0: X + 0+ zzz + +/\D*/8 + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + +/\D*/8 + \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} + 0: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} + +/\D/8 + 1X2 + 0: X + 1\x{100}2 + 0: \x{100} + +/>\S/8 + > >X Y + 0: >X + > >\x{100} Y + 0: >\x{100} + +/\d/8 + \x{100}3 + 0: 3 + +/\s/8 + \x{100} X + 0: + +/\D+/8 + 12abcd34 + 0: abcd + *** Failers + 0: *** Failers + 1234 +No match + +/\D{2,3}/8 + 12abcd34 + 0: abc + 12ab34 + 0: ab + *** Failers + 0: *** + 1234 +No match + 12a34 +No match + +/\D{2,3}?/8 + 12abcd34 + 0: ab + 12ab34 + 0: ab + *** Failers + 0: ** + 1234 +No match + 12a34 +No match + +/\d+/8 + 12abcd34 + 0: 12 + *** Failers +No match + +/\d{2,3}/8 + 12abcd34 + 0: 12 + 1234abcd + 0: 123 + *** Failers +No match + 1.4 +No match + +/\d{2,3}?/8 + 12abcd34 + 0: 12 + 1234abcd + 0: 12 + *** Failers +No match + 1.4 +No match + +/\S+/8 + 12abcd34 + 0: 12abcd34 + *** Failers + 0: *** + \ \ +No match + +/\S{2,3}/8 + 12abcd34 + 0: 12a + 1234abcd + 0: 123 + *** Failers + 0: *** + \ \ +No match + +/\S{2,3}?/8 + 12abcd34 + 0: 12 + 1234abcd + 0: 12 + *** Failers + 0: ** + \ \ +No match + +/>\s+ <34 + 0: > < + 0+ 34 + *** Failers +No match + +/>\s{2,3} < + 0+ cd + ab> < + 0+ ce + *** Failers +No match + ab> \s{2,3}? < + 0+ cd + ab> < + 0+ ce + *** Failers +No match + ab> \xff< + 0: \xff + +/[\xff]/8 + >\x{ff}< + 0: \x{ff} + +/[^\xFF]/ + XYZ + 0: X + +/[^\xff]/8 + XYZ + 0: X + \x{123} + 0: \x{123} + +/^[ac]*b/8 + xb +No match + +/^[ac\x{100}]*b/8 + xb +No match + +/^[^x]*b/8i + xb +No match + +/^[^x]*b/8 + xb +No match + +/^\d*b/8 + xb +No match + +/(|a)/g8 + catac + 0: + 1: + 0: + 1: + 0: a + 1: a + 0: + 1: + 0: + 1: + 0: a + 1: a + 0: + 1: + 0: + 1: + a\x{256}a + 0: + 1: + 0: a + 1: a + 0: + 1: + 0: + 1: + 0: a + 1: a + 0: + 1: + +/^\x{85}$/8i + \x{85} + 0: \x{85} + +/^ሴ/8 + ሴ + 0: \x{1234} + +/^\ሴ/8 + ሴ + 0: \x{1234} + +"(?s)(.{1,5})"8 + abcdefg + 0: abcde + 1: abcde + ab + 0: ab + 1: ab + +/a*\x{100}*\w/8 + a + 0: a + +/\S\S/8g + A\x{a3}BC + 0: A\x{a3} + 0: BC + +/\S{2}/8g + A\x{a3}BC + 0: A\x{a3} + 0: BC + +/\W\W/8g + +\x{a3}== + 0: +\x{a3} + 0: == + +/\W{2}/8g + +\x{a3}== + 0: +\x{a3} + 0: == + +/\S/8g + \x{442}\x{435}\x{441}\x{442} + 0: \x{442} + 0: \x{435} + 0: \x{441} + 0: \x{442} + +/[\S]/8g + \x{442}\x{435}\x{441}\x{442} + 0: \x{442} + 0: \x{435} + 0: \x{441} + 0: \x{442} + +/\D/8g + \x{442}\x{435}\x{441}\x{442} + 0: \x{442} + 0: \x{435} + 0: \x{441} + 0: \x{442} + +/[\D]/8g + \x{442}\x{435}\x{441}\x{442} + 0: \x{442} + 0: \x{435} + 0: \x{441} + 0: \x{442} + +/\W/8g + \x{2442}\x{2435}\x{2441}\x{2442} + 0: \x{2442} + 0: \x{2435} + 0: \x{2441} + 0: \x{2442} + +/[\W]/8g + \x{2442}\x{2435}\x{2441}\x{2442} + 0: \x{2442} + 0: \x{2435} + 0: \x{2441} + 0: \x{2442} + +/[\S\s]*/8 + abc\n\r\x{442}\x{435}\x{441}\x{442}xyz + 0: abc\x{0a}\x{0d}\x{442}\x{435}\x{441}\x{442}xyz + +/[\x{41f}\S]/8g + \x{442}\x{435}\x{441}\x{442} + 0: \x{442} + 0: \x{435} + 0: \x{441} + 0: \x{442} + +/.[^\S]./8g + abc def\x{442}\x{443}xyz\npqr + 0: c d + 0: z\x{0a}p + +/.[^\S\n]./8g + abc def\x{442}\x{443}xyz\npqr + 0: c d + +/[[:^alnum:]]/8g + +\x{2442} + 0: + + 0: \x{2442} + +/[[:^alpha:]]/8g + +\x{2442} + 0: + + 0: \x{2442} + +/[[:^ascii:]]/8g + A\x{442} + 0: \x{442} + +/[[:^blank:]]/8g + A\x{442} + 0: A + 0: \x{442} + +/[[:^cntrl:]]/8g + A\x{442} + 0: A + 0: \x{442} + +/[[:^digit:]]/8g + A\x{442} + 0: A + 0: \x{442} + +/[[:^graph:]]/8g + \x19\x{e01ff} + 0: \x{19} + 0: \x{e01ff} + +/[[:^lower:]]/8g + A\x{422} + 0: A + 0: \x{422} + +/[[:^print:]]/8g + \x{19}\x{e01ff} + 0: \x{19} + 0: \x{e01ff} + +/[[:^punct:]]/8g + A\x{442} + 0: A + 0: \x{442} + +/[[:^space:]]/8g + A\x{442} + 0: A + 0: \x{442} + +/[[:^upper:]]/8g + a\x{442} + 0: a + 0: \x{442} + +/[[:^word:]]/8g + +\x{2442} + 0: + + 0: \x{2442} + +/[[:^xdigit:]]/8g + M\x{442} + 0: M + 0: \x{442} + +/[^ABCDEFGHIJKLMNOPQRSTUVWXYZÀÃÂÃÄÅÆÇÈÉÊËÌÃÃŽÃÃÑÒÓÔÕÖØÙÚÛÜÃÞĀĂĄĆĈĊČĎÄĒĔĖĘĚĜĞĠĢĤĦĨĪĬĮİIJĴĶĹĻĽĿÅŃŅŇŊŌŎÅŒŔŖŘŚŜŞŠŢŤŦŨŪŬŮŰŲŴŶŸŹŻŽÆƂƄƆƇƉƊƋƎÆÆƑƓƔƖƗƘƜÆƟƠƢƤƦƧƩƬƮƯƱƲƳƵƷƸƼDŽLJNJÇÇǑǓǕǗǙǛǞǠǢǤǦǨǪǬǮDZǴǶǷǸǺǼǾȀȂȄȆȈȊȌȎÈȒȔȖȘȚȜȞȠȢȤȦȨȪȬȮȰȲȺȻȽȾÉΆΈΉΊΌΎÎΑΒΓΔΕΖΗΘΙΚΛΜÎΞΟΠΡΣΤΥΦΧΨΩΪΫϒϓϔϘϚϜϞϠϢϤϦϨϪϬϮϴϷϹϺϽϾϿЀÐЂЃЄЅІЇЈЉЊЋЌÐÐŽÐÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬЭЮЯѠѢѤѦѨѪѬѮѰѲѴѶѸѺѼѾҀҊҌҎÒҒҔҖҘҚҜҞҠҢҤҦҨҪҬҮҰҲҴҶҸҺҼҾӀÓÓƒÓ…Ó‡Ó‰Ó‹ÓÓӒӔӖӘӚӜӞӠӢӤӦӨӪӬӮӰӲӴӶӸԀԂԄԆԈԊԌԎԱԲԳԴԵԶԷԸԹԺԻԼԽԾԿՀÕÕ‚ÕƒÕ„Õ…Õ†Õ‡ÕˆÕ‰ÕŠÕ‹ÕŒÕÕŽÕÕՑՒՓՔՕՖႠႡႢႣႤႥႦႧႨႩႪႫႬႭႮႯႰႱႲႳႴႵႶႷႸႹႺႻႼႽႾႿჀáƒáƒ‚ჃჄჅḀḂḄḆḈḊḌḎá¸á¸’ḔḖḘḚḜḞḠḢḤḦḨḪḬḮḰḲḴḶḸḺḼḾṀṂṄṆṈṊṌṎá¹á¹’ṔṖṘṚṜṞṠṢṤṦṨṪṬṮṰṲṴṶṸṺṼṾẀẂẄẆẈẊẌẎáºáº’ẔẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼẾỀỂỄỆỈỊỌỎá»á»’ỔỖỘỚỜỞỠỢỤỦỨỪỬỮỰỲỴỶỸἈἉἊἋἌá¼á¼Žá¼á¼˜á¼™á¼šá¼›á¼œá¼á¼¨á¼©á¼ªá¼«á¼¬á¼­á¼®á¼¯á¼¸á¼¹á¼ºá¼»á¼¼á¼½á¼¾á¼¿á½ˆá½‰á½Šá½‹á½Œá½á½™á½›á½á½Ÿá½¨á½©á½ªá½«á½¬á½­á½®á½¯á¾¸á¾¹á¾ºá¾»á¿ˆá¿‰á¿Šá¿‹á¿˜á¿™á¿šá¿›á¿¨á¿©á¿ªá¿«á¿¬á¿¸á¿¹á¿ºá¿»abcdefghijklmnopqrstuvwxyzªµºßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿÄăąćĉċÄÄđēĕėęěÄğġģĥħĩīĭįıijĵķĸĺļľŀłńņňʼnŋÅÅőœŕŗřśÅşšţťŧũūŭůűųŵŷźżžſƀƃƅƈƌƃƕƙƚƛƞơƣƥƨƪƫƭưƴƶƹƺƽƾƿdžljnjǎÇǒǔǖǘǚǜÇǟǡǣǥǧǩǫǭǯǰdzǵǹǻǽǿÈȃȅȇȉȋÈÈȑȓȕȗșțÈȟȡȣȥȧȩȫȭȯȱȳȴȵȶȷȸȹȼȿɀÉɑɒɓɔɕɖɗɘəɚɛɜÉɞɟɠɡɢɣɤɥɦɧɨɩɪɫɬɭɮɯɰɱɲɳɴɵɶɷɸɹɺɻɼɽɾɿʀÊʂʃʄʅʆʇʈʉʊʋʌÊÊŽÊÊʑʒʓʔʕʖʗʘʙʚʛʜÊʞʟʠʡʢʣʤʥʦʧʨʩʪʫʬʭʮʯÎάέήίΰαβγδεζηθικλμνξοπÏςστυφχψωϊϋόÏÏŽÏϑϕϖϗϙϛÏϟϡϣϥϧϩϫϭϯϰϱϲϳϵϸϻϼабвгдежзийклмнопрÑтуфхцчшщъыьÑÑŽÑÑёђѓєѕіїјљњћќÑўџѡѣѥѧѩѫѭѯѱѳѵѷѹѻѽѿÒÒ‹ÒÒÒ‘Ò“Ò•Ò—Ò™Ò›ÒҟҡңҥҧҩҫҭүұҳҵҷҹһҽҿӂӄӆӈӊӌӎӑӓӕӗәӛÓÓŸÓ¡Ó£Ó¥Ó§Ó©Ó«Ó­Ó¯Ó±Ó³ÓµÓ·Ó¹ÔÔƒÔ…Ô‡Ô‰Ô‹ÔÔÕ¡Õ¢Õ£Õ¤Õ¥Õ¦Õ§Õ¨Õ©ÕªÕ«Õ¬Õ­Õ®Õ¯Õ°Õ±Õ²Õ³Õ´ÕµÕ¶Õ·Õ¸Õ¹ÕºÕ»Õ¼Õ½Õ¾Õ¿Ö€Öւփքօֆևᴀá´á´‚ᴃᴄᴅᴆᴇᴈᴉᴊᴋᴌá´á´Žá´á´á´‘ᴒᴓᴔᴕᴖᴗᴘᴙᴚᴛᴜá´á´žá´Ÿá´ á´¡á´¢á´£á´¤á´¥á´¦á´§á´¨á´©á´ªá´«áµ¢áµ£áµ¤áµ¥áµ¦áµ§áµ¨áµ©áµªáµ«áµ¬áµ­áµ®áµ¯áµ°áµ±áµ²áµ³áµ´áµµáµ¶áµ·áµ¹áµºáµ»áµ¼áµ½áµ¾áµ¿á¶€á¶á¶‚ᶃᶄᶅᶆᶇᶈᶉᶊᶋᶌá¶á¶Žá¶á¶á¶‘ᶒᶓᶔᶕᶖᶗᶘᶙᶚá¸á¸ƒá¸…ḇḉḋá¸á¸á¸‘ḓḕḗḙḛá¸á¸Ÿá¸¡á¸£á¸¥á¸§á¸©á¸«á¸­á¸¯á¸±á¸³á¸µá¸·á¸¹á¸»á¸½á¸¿á¹á¹ƒá¹…ṇṉṋá¹á¹á¹‘ṓṕṗṙṛá¹á¹Ÿá¹¡á¹£á¹¥á¹§á¹©á¹«á¹­á¹¯á¹±á¹³á¹µá¹·á¹¹á¹»á¹½á¹¿áºáºƒáº…ẇẉẋáºáºáº‘ẓẕẖẗẘẙẚẛạảấầẩẫậắằẳẵặẹẻẽếá»á»ƒá»…ệỉịá»á»á»‘ồổỗộớá»á»Ÿá»¡á»£á»¥á»§á»©á»«á»­á»¯á»±á»³á»µá»·á»¹á¼€á¼á¼‚ἃἄἅἆἇá¼á¼‘ἒἓἔἕἠἡἢἣἤἥἦἧἰἱἲἳἴἵἶἷὀá½á½‚ὃὄὅá½á½‘ὒὓὔὕὖὗὠὡὢὣὤὥὦὧὰάὲέὴήὶίὸόὺύὼώᾀá¾á¾‚ᾃᾄᾅᾆᾇá¾á¾‘ᾒᾓᾔᾕᾖᾗᾠᾡᾢᾣᾤᾥᾦᾧᾰᾱᾲᾳᾴᾶᾷιῂῃῄῆῇá¿á¿‘ῒΐῖῗῠῡῢΰῤῥῦῧῲῳῴῶῷâ²â²ƒâ²…ⲇⲉⲋâ²â²â²‘ⲓⲕⲗⲙⲛâ²â²Ÿâ²¡â²£â²¥â²§â²©â²«â²­â²¯â²±â²³â²µâ²·â²¹â²»â²½â²¿â³â³ƒâ³…ⳇⳉⳋâ³â³â³‘ⳓⳕⳗⳙⳛâ³â³Ÿâ³¡â³£â³¤â´€â´â´‚ⴃⴄⴅⴆⴇⴈⴉⴊⴋⴌâ´â´Žâ´â´â´‘ⴒⴓⴔⴕⴖⴗⴘⴙⴚⴛⴜâ´â´žâ´Ÿâ´ â´¡â´¢â´£â´¤â´¥ï¬€ï¬ï¬‚ffifflſtstﬓﬔﬕﬖﬗ\d-_^]/8 + +/^[^d]*?$/ + abc + 0: abc + +/^[^d]*?$/8 + abc + 0: abc + +/^[^d]*?$/i + abc + 0: abc + +/^[^d]*?$/8i + abc + 0: abc + +/(?i)[\xc3\xa9\xc3\xbd]|[\xc3\xa9\xc3\xbdA]/8 + +/^[a\x{c0}]b/8 + \x{c0}b + 0: \x{c0}b + +/^([a\x{c0}]*?)aa/8 + a\x{c0}aaaa/ + 0: a\x{c0}aa + 1: a\x{c0} + +/^([a\x{c0}]*?)aa/8 + a\x{c0}aaaa/ + 0: a\x{c0}aa + 1: a\x{c0} + a\x{c0}a\x{c0}aaa/ + 0: a\x{c0}a\x{c0}aa + 1: a\x{c0}a\x{c0} + +/^([a\x{c0}]*)aa/8 + a\x{c0}aaaa/ + 0: a\x{c0}aaaa + 1: a\x{c0}aa + a\x{c0}a\x{c0}aaa/ + 0: a\x{c0}a\x{c0}aaa + 1: a\x{c0}a\x{c0}a + +/^([a\x{c0}]*)a\x{c0}/8 + a\x{c0}aaaa/ + 0: a\x{c0} + 1: + a\x{c0}a\x{c0}aaa/ + 0: a\x{c0}a\x{c0} + 1: a\x{c0} + +/A*/g8 + AAB\x{123}BAA + 0: AA + 0: + 0: + 0: + 0: AA + 0: + +/(abc)\1/8i + abc +No match + +/(abc)\1/8 + abc +No match + +/a(*:a\x{1234}b)/8K + abc + 0: a +MK: a\x{1234}b + +/a(*:a£b)/8K + abc + 0: a +MK: a\x{a3}b + +/-- Noncharacters --/ + +/./8 + \x{fffe} + 0: \x{fffe} + \x{ffff} + 0: \x{ffff} + \x{1fffe} + 0: \x{1fffe} + \x{1ffff} + 0: \x{1ffff} + \x{2fffe} + 0: \x{2fffe} + \x{2ffff} + 0: \x{2ffff} + \x{3fffe} + 0: \x{3fffe} + \x{3ffff} + 0: \x{3ffff} + \x{4fffe} + 0: \x{4fffe} + \x{4ffff} + 0: \x{4ffff} + \x{5fffe} + 0: \x{5fffe} + \x{5ffff} + 0: \x{5ffff} + \x{6fffe} + 0: \x{6fffe} + \x{6ffff} + 0: \x{6ffff} + \x{7fffe} + 0: \x{7fffe} + \x{7ffff} + 0: \x{7ffff} + \x{8fffe} + 0: \x{8fffe} + \x{8ffff} + 0: \x{8ffff} + \x{9fffe} + 0: \x{9fffe} + \x{9ffff} + 0: \x{9ffff} + \x{afffe} + 0: \x{afffe} + \x{affff} + 0: \x{affff} + \x{bfffe} + 0: \x{bfffe} + \x{bffff} + 0: \x{bffff} + \x{cfffe} + 0: \x{cfffe} + \x{cffff} + 0: \x{cffff} + \x{dfffe} + 0: \x{dfffe} + \x{dffff} + 0: \x{dffff} + \x{efffe} + 0: \x{efffe} + \x{effff} + 0: \x{effff} + \x{ffffe} + 0: \x{ffffe} + \x{fffff} + 0: \x{fffff} + \x{10fffe} + 0: \x{10fffe} + \x{10ffff} + 0: \x{10ffff} + \x{fdd0} + 0: \x{fdd0} + \x{fdd1} + 0: \x{fdd1} + \x{fdd2} + 0: \x{fdd2} + \x{fdd3} + 0: \x{fdd3} + \x{fdd4} + 0: \x{fdd4} + \x{fdd5} + 0: \x{fdd5} + \x{fdd6} + 0: \x{fdd6} + \x{fdd7} + 0: \x{fdd7} + \x{fdd8} + 0: \x{fdd8} + \x{fdd9} + 0: \x{fdd9} + \x{fdda} + 0: \x{fdda} + \x{fddb} + 0: \x{fddb} + \x{fddc} + 0: \x{fddc} + \x{fddd} + 0: \x{fddd} + \x{fdde} + 0: \x{fdde} + \x{fddf} + 0: \x{fddf} + \x{fde0} + 0: \x{fde0} + \x{fde1} + 0: \x{fde1} + \x{fde2} + 0: \x{fde2} + \x{fde3} + 0: \x{fde3} + \x{fde4} + 0: \x{fde4} + \x{fde5} + 0: \x{fde5} + \x{fde6} + 0: \x{fde6} + \x{fde7} + 0: \x{fde7} + \x{fde8} + 0: \x{fde8} + \x{fde9} + 0: \x{fde9} + \x{fdea} + 0: \x{fdea} + \x{fdeb} + 0: \x{fdeb} + \x{fdec} + 0: \x{fdec} + \x{fded} + 0: \x{fded} + \x{fdee} + 0: \x{fdee} + \x{fdef} + 0: \x{fdef} + +/^\d*\w{4}/8 + 1234 + 0: 1234 + 123 +No match + +/^[^b]*\w{4}/8 + aaaa + 0: aaaa + aaa +No match + +/^[^b]*\w{4}/8i + aaaa + 0: aaaa + aaa +No match + +/^\x{100}*.{4}/8 + \x{100}\x{100}\x{100}\x{100} + 0: \x{100}\x{100}\x{100}\x{100} + \x{100}\x{100}\x{100} +No match + +/^\x{100}*.{4}/8i + \x{100}\x{100}\x{100}\x{100} + 0: \x{100}\x{100}\x{100}\x{100} + \x{100}\x{100}\x{100} +No match + +/^a+[a\x{200}]/8 + aa + 0: aa + +/^.\B.\B./8 + \x{10123}\x{10124}\x{10125} + 0: \x{10123}\x{10124}\x{10125} + +/^#[^\x{ffff}]#[^\x{ffff}]#[^\x{ffff}]#/8 + #\x{10000}#\x{100}#\x{10ffff}# + 0: #\x{10000}#\x{100}#\x{10ffff}# + +"[\S\V\H]"8 + +/\C(\W?Å¿)'?{{/8 + \\C(\\W?Å¿)'?{{ +No match + +/[^\x{100}-\x{ffff}]*[\x80-\xff]/8 + \x{99}\x{99}\x{99} + 0: \x{99}\x{99}\x{99} + +/-- End of testinput4 --/ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput5 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput5 new file mode 100755 index 000000000..090e1e1c8 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput5 @@ -0,0 +1,1953 @@ +/-- This set of tests checks the API, internals, and non-Perl stuff for UTF + support, excluding Unicode properties. However, tests that give different + results in 8-bit and 16-bit modes are excluded (see tests 16 and 17). --/ + +< forbid W + +/\x{110000}/8DZ +Failed: character value in \x{} or \o{} is too large at offset 9 + +/\o{4200000}/8DZ +Failed: character value in \x{} or \o{} is too large at offset 10 + +/\x{ffffffff}/8 +Failed: character value in \x{} or \o{} is too large at offset 11 + +/\o{37777777777}/8 +Failed: character value in \x{} or \o{} is too large at offset 14 + +/\x{100000000}/8 +Failed: character value in \x{} or \o{} is too large at offset 12 + +/\o{77777777777}/8 +Failed: character value in \x{} or \o{} is too large at offset 14 + +/\x{d800}/8 +Failed: disallowed Unicode code point (>= 0xd800 && <= 0xdfff) at offset 7 + +/\o{154000}/8 +Failed: disallowed Unicode code point (>= 0xd800 && <= 0xdfff) at offset 9 + +/\x{dfff}/8 +Failed: disallowed Unicode code point (>= 0xd800 && <= 0xdfff) at offset 7 + +/\o{157777}/8 +Failed: disallowed Unicode code point (>= 0xd800 && <= 0xdfff) at offset 9 + +/\x{d7ff}/8 + +/\o{153777}/8 + +/\x{e000}/8 + +/\o{170000}/8 + +/^\x{100}a\x{1234}/8 + \x{100}a\x{1234}bcd + 0: \x{100}a\x{1234} + +/\x{0041}\x{2262}\x{0391}\x{002e}/DZ8 +------------------------------------------------------------------ + Bra + A\x{2262}\x{391}. + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = 'A' +Need char = '.' + \x{0041}\x{2262}\x{0391}\x{002e} + 0: A\x{2262}\x{391}. + +/.{3,5}X/DZ8 +------------------------------------------------------------------ + Bra + Any{3} + Any{0,2} + X + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +No first char +Need char = 'X' + \x{212ab}\x{212ab}\x{212ab}\x{861}X + 0: \x{212ab}\x{212ab}\x{212ab}\x{861}X + +/.{3,5}?/DZ8 +------------------------------------------------------------------ + Bra + Any{3} + Any{0,2}? + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +No first char +No need char + \x{212ab}\x{212ab}\x{212ab}\x{861} + 0: \x{212ab}\x{212ab}\x{212ab} + +/(?<=\C)X/8 +Failed: \C not allowed in lookbehind assertion at offset 6 + +/^[ab]/8DZ +------------------------------------------------------------------ + Bra + ^ + [ab] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored utf +No first char +No need char + bar + 0: b + *** Failers +No match + c +No match + \x{ff} +No match + \x{100} +No match + +/^[^ab]/8DZ +------------------------------------------------------------------ + Bra + ^ + [\x00-`c-\xff] (neg) + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored utf +No first char +No need char + c + 0: c + \x{ff} + 0: \x{ff} + \x{100} + 0: \x{100} + *** Failers + 0: * + aaa +No match + +/\x{100}*(\d+|"(?1)")/8 + 1234 + 0: 1234 + 1: 1234 + "1234" + 0: "1234" + 1: "1234" + \x{100}1234 + 0: \x{100}1234 + 1: 1234 + "\x{100}1234" + 0: \x{100}1234 + 1: 1234 + \x{100}\x{100}12ab + 0: \x{100}\x{100}12 + 1: 12 + \x{100}\x{100}"12" + 0: \x{100}\x{100}"12" + 1: "12" + *** Failers +No match + \x{100}\x{100}abcd +No match + +/\x{100}*/8DZ +------------------------------------------------------------------ + Bra + \x{100}*+ + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +May match empty string +Options: utf +No first char +No need char + +/a\x{100}*/8DZ +------------------------------------------------------------------ + Bra + a + \x{100}*+ + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = 'a' +No need char + +/ab\x{100}*/8DZ +------------------------------------------------------------------ + Bra + ab + \x{100}*+ + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +First char = 'a' +Need char = 'b' + +/\x{100}*A/8DZ +------------------------------------------------------------------ + Bra + \x{100}*+ + A + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +No first char +Need char = 'A' + A + 0: A + +/\x{100}*\d(?R)/8DZ +------------------------------------------------------------------ + Bra + \x{100}*+ + \d + Recurse + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +No first char +No need char + +/[Z\x{100}]/8DZ +------------------------------------------------------------------ + Bra + [Z\x{100}] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +No first char +No need char + Z\x{100} + 0: Z + \x{100} + 0: \x{100} + \x{100}Z + 0: \x{100} + *** Failers +No match + +/[\x{200}-\x{100}]/8 +Failed: range out of order in character class at offset 15 + +/[Ä€-Ä„]/8 + \x{100} + 0: \x{100} + \x{104} + 0: \x{104} + *** Failers +No match + \x{105} +No match + \x{ff} +No match + +/[z-\x{100}]/8DZ +------------------------------------------------------------------ + Bra + [z-\xff\x{100}] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +No first char +No need char + +/[z\Qa-d]Ä€\E]/8DZ +------------------------------------------------------------------ + Bra + [\-\]adz\x{100}] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +No first char +No need char + \x{100} + 0: \x{100} + Ä€ + 0: \x{100} + +/[\xFF]/DZ +------------------------------------------------------------------ + Bra + \x{ff} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +First char = \xff +No need char + >\xff< + 0: \xff + +/[^\xFF]/DZ +------------------------------------------------------------------ + Bra + [^\x{ff}] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +No need char + +/[Ä-Ãœ]/8 + Ö # Matches without Study + 0: \x{d6} + \x{d6} + 0: \x{d6} + +/[Ä-Ãœ]/8S + Ö <-- Same with Study + 0: \x{d6} + \x{d6} + 0: \x{d6} + +/[\x{c4}-\x{dc}]/8 + Ö # Matches without Study + 0: \x{d6} + \x{d6} + 0: \x{d6} + +/[\x{c4}-\x{dc}]/8S + Ö <-- Same with Study + 0: \x{d6} + \x{d6} + 0: \x{d6} + +/[^\x{100}]abc(xyz(?1))/8DZ +------------------------------------------------------------------ + Bra + [^\x{100}] + abc + CBra 1 + xyz + Recurse + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Options: utf +No first char +Need char = 'z' + +/[ab\x{100}]abc(xyz(?1))/8DZ +------------------------------------------------------------------ + Bra + [ab\x{100}] + abc + CBra 1 + xyz + Recurse + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Options: utf +No first char +Need char = 'z' + +/(\x{100}(b(?2)c))?/DZ8 +------------------------------------------------------------------ + Bra + Brazero + CBra 1 + \x{100} + CBra 2 + b + Recurse + c + Ket + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 2 +May match empty string +Options: utf +No first char +No need char + +/(\x{100}(b(?2)c)){0,2}/DZ8 +------------------------------------------------------------------ + Bra + Brazero + Bra + CBra 1 + \x{100} + CBra 2 + b + Recurse + c + Ket + Ket + Brazero + CBra 1 + \x{100} + CBra 2 + b + Recurse + c + Ket + Ket + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 2 +May match empty string +Options: utf +No first char +No need char + +/(\x{100}(b(?1)c))?/DZ8 +------------------------------------------------------------------ + Bra + Brazero + CBra 1 + \x{100} + CBra 2 + b + Recurse + c + Ket + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 2 +May match empty string +Options: utf +No first char +No need char + +/(\x{100}(b(?1)c)){0,2}/DZ8 +------------------------------------------------------------------ + Bra + Brazero + Bra + CBra 1 + \x{100} + CBra 2 + b + Recurse + c + Ket + Ket + Brazero + CBra 1 + \x{100} + CBra 2 + b + Recurse + c + Ket + Ket + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 2 +May match empty string +Options: utf +No first char +No need char + +/\W/8 + A.B + 0: . + A\x{100}B + 0: \x{100} + +/\w/8 + \x{100}X + 0: X + +/^\ሴ/8DZ +------------------------------------------------------------------ + Bra + ^ + \x{1234} + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored utf +No first char +No need char + +/\x{100}*\d/8DZ +------------------------------------------------------------------ + Bra + \x{100}*+ + \d + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +No first char +No need char + +/\x{100}*\s/8DZ +------------------------------------------------------------------ + Bra + \x{100}*+ + \s + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +No first char +No need char + +/\x{100}*\w/8DZ +------------------------------------------------------------------ + Bra + \x{100}*+ + \w + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +No first char +No need char + +/\x{100}*\D/8DZ +------------------------------------------------------------------ + Bra + \x{100}* + \D + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +No first char +No need char + +/\x{100}*\S/8DZ +------------------------------------------------------------------ + Bra + \x{100}* + \S + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +No first char +No need char + +/\x{100}*\W/8DZ +------------------------------------------------------------------ + Bra + \x{100}* + \W + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +No first char +No need char + +/()()()()()()()()()() + ()()()()()()()()()() + ()()()()()()()()()() + ()()()()()()()()()() + A (x) (?41) B/8x + AxxB +Matched, but too many substrings + 0: AxxB + 1: + 2: + 3: + 4: + 5: + 6: + 7: + 8: + 9: +10: +11: +12: +13: +14: + +/^[\x{100}\E-\Q\E\x{150}]/BZ8 +------------------------------------------------------------------ + Bra + ^ + [\x{100}-\x{150}] + Ket + End +------------------------------------------------------------------ + +/^[\QÄ€\E-\QÅ\E]/BZ8 +------------------------------------------------------------------ + Bra + ^ + [\x{100}-\x{150}] + Ket + End +------------------------------------------------------------------ + +/^abc./mgx8 + abc1 \x0aabc2 \x0babc3xx \x0cabc4 \x0dabc5xx \x0d\x0aabc6 \x{0085}abc7 \x{2028}abc8 \x{2029}abc9 JUNK + 0: abc1 + 0: abc2 + 0: abc3 + 0: abc4 + 0: abc5 + 0: abc6 + 0: abc7 + 0: abc8 + 0: abc9 + +/abc.$/mgx8 + abc1\x0a abc2\x0b abc3\x0c abc4\x0d abc5\x0d\x0a abc6\x{0085} abc7\x{2028} abc8\x{2029} abc9 + 0: abc1 + 0: abc2 + 0: abc3 + 0: abc4 + 0: abc5 + 0: abc6 + 0: abc7 + 0: abc8 + 0: abc9 + +/^a\Rb/8 + a\nb + 0: a\x{0a}b + a\rb + 0: a\x{0d}b + a\r\nb + 0: a\x{0d}\x{0a}b + a\x0bb + 0: a\x{0b}b + a\x0cb + 0: a\x{0c}b + a\x{85}b + 0: a\x{85}b + a\x{2028}b + 0: a\x{2028}b + a\x{2029}b + 0: a\x{2029}b + ** Failers +No match + a\n\rb +No match + +/^a\R*b/8 + ab + 0: ab + a\nb + 0: a\x{0a}b + a\rb + 0: a\x{0d}b + a\r\nb + 0: a\x{0d}\x{0a}b + a\x0bb + 0: a\x{0b}b + a\x0c\x{2028}\x{2029}b + 0: a\x{0c}\x{2028}\x{2029}b + a\x{85}b + 0: a\x{85}b + a\n\rb + 0: a\x{0a}\x{0d}b + a\n\r\x{85}\x0cb + 0: a\x{0a}\x{0d}\x{85}\x{0c}b + +/^a\R+b/8 + a\nb + 0: a\x{0a}b + a\rb + 0: a\x{0d}b + a\r\nb + 0: a\x{0d}\x{0a}b + a\x0bb + 0: a\x{0b}b + a\x0c\x{2028}\x{2029}b + 0: a\x{0c}\x{2028}\x{2029}b + a\x{85}b + 0: a\x{85}b + a\n\rb + 0: a\x{0a}\x{0d}b + a\n\r\x{85}\x0cb + 0: a\x{0a}\x{0d}\x{85}\x{0c}b + ** Failers +No match + ab +No match + +/^a\R{1,3}b/8 + a\nb + 0: a\x{0a}b + a\n\rb + 0: a\x{0a}\x{0d}b + a\n\r\x{85}b + 0: a\x{0a}\x{0d}\x{85}b + a\r\n\r\nb + 0: a\x{0d}\x{0a}\x{0d}\x{0a}b + a\r\n\r\n\r\nb + 0: a\x{0d}\x{0a}\x{0d}\x{0a}\x{0d}\x{0a}b + a\n\r\n\rb + 0: a\x{0a}\x{0d}\x{0a}\x{0d}b + a\n\n\r\nb + 0: a\x{0a}\x{0a}\x{0d}\x{0a}b + ** Failers +No match + a\n\n\n\rb +No match + a\r +No match + +/\H\h\V\v/8 + X X\x0a + 0: X X\x{0a} + X\x09X\x0b + 0: X\x{09}X\x{0b} + ** Failers +No match + \x{a0} X\x0a +No match + +/\H*\h+\V?\v{3,4}/8 + \x09\x20\x{a0}X\x0a\x0b\x0c\x0d\x0a + 0: \x{09} \x{a0}X\x{0a}\x{0b}\x{0c}\x{0d} + \x09\x20\x{a0}\x0a\x0b\x0c\x0d\x0a + 0: \x{09} \x{a0}\x{0a}\x{0b}\x{0c}\x{0d} + \x09\x20\x{a0}\x0a\x0b\x0c + 0: \x{09} \x{a0}\x{0a}\x{0b}\x{0c} + ** Failers +No match + \x09\x20\x{a0}\x0a\x0b +No match + +/\H\h\V\v/8 + \x{3001}\x{3000}\x{2030}\x{2028} + 0: \x{3001}\x{3000}\x{2030}\x{2028} + X\x{180e}X\x{85} + 0: X\x{180e}X\x{85} + ** Failers +No match + \x{2009} X\x0a +No match + +/\H*\h+\V?\v{3,4}/8 + \x{1680}\x{180e}\x{2007}X\x{2028}\x{2029}\x0c\x0d\x0a + 0: \x{1680}\x{180e}\x{2007}X\x{2028}\x{2029}\x{0c}\x{0d} + \x09\x{205f}\x{a0}\x0a\x{2029}\x0c\x{2028}\x0a + 0: \x{09}\x{205f}\x{a0}\x{0a}\x{2029}\x{0c}\x{2028} + \x09\x20\x{202f}\x0a\x0b\x0c + 0: \x{09} \x{202f}\x{0a}\x{0b}\x{0c} + ** Failers +No match + \x09\x{200a}\x{a0}\x{2028}\x0b +No match + +/[\h]/8BZ +------------------------------------------------------------------ + Bra + [\x09 \xa0\x{1680}\x{180e}\x{2000}-\x{200a}\x{202f}\x{205f}\x{3000}] + Ket + End +------------------------------------------------------------------ + >\x{1680} + 0: \x{1680} + +/[\h]{3,}/8BZ +------------------------------------------------------------------ + Bra + [\x09 \xa0\x{1680}\x{180e}\x{2000}-\x{200a}\x{202f}\x{205f}\x{3000}]{3,}+ + Ket + End +------------------------------------------------------------------ + >\x{1680}\x{180e}\x{2000}\x{2003}\x{200a}\x{202f}\x{205f}\x{3000}< + 0: \x{1680}\x{180e}\x{2000}\x{2003}\x{200a}\x{202f}\x{205f}\x{3000} + +/[\v]/8BZ +------------------------------------------------------------------ + Bra + [\x0a-\x0d\x85\x{2028}-\x{2029}] + Ket + End +------------------------------------------------------------------ + +/[\H]/8BZ +------------------------------------------------------------------ + Bra + [\x00-\x08\x0a-\x1f!-\x9f\xa1-\xff\x{100}-\x{167f}\x{1681}-\x{180d}\x{180f}-\x{1fff}\x{200b}-\x{202e}\x{2030}-\x{205e}\x{2060}-\x{2fff}\x{3001}-\x{10ffff}] + Ket + End +------------------------------------------------------------------ + +/[\V]/8BZ +------------------------------------------------------------------ + Bra + [\x00-\x09\x0e-\x84\x86-\xff\x{100}-\x{2027}\x{202a}-\x{10ffff}] + Ket + End +------------------------------------------------------------------ + +/.*$/8 + \x{1ec5} + 0: \x{1ec5} + +/a\Rb/I8 +Capturing subpattern count = 0 +Options: bsr_anycrlf utf +First char = 'a' +Need char = 'b' + a\rb + 0: a\x{0d}b + a\nb + 0: a\x{0a}b + a\r\nb + 0: a\x{0d}\x{0a}b + ** Failers +No match + a\x{85}b +No match + a\x0bb +No match + +/a\Rb/I8 +Capturing subpattern count = 0 +Options: bsr_unicode utf +First char = 'a' +Need char = 'b' + a\rb + 0: a\x{0d}b + a\nb + 0: a\x{0a}b + a\r\nb + 0: a\x{0d}\x{0a}b + a\x{85}b + 0: a\x{85}b + a\x0bb + 0: a\x{0b}b + ** Failers +No match + a\x{85}b\ +No match + a\x0bb\ +No match + +/a\R?b/I8 +Capturing subpattern count = 0 +Options: bsr_anycrlf utf +First char = 'a' +Need char = 'b' + a\rb + 0: a\x{0d}b + a\nb + 0: a\x{0a}b + a\r\nb + 0: a\x{0d}\x{0a}b + ** Failers +No match + a\x{85}b +No match + a\x0bb +No match + +/a\R?b/I8 +Capturing subpattern count = 0 +Options: bsr_unicode utf +First char = 'a' +Need char = 'b' + a\rb + 0: a\x{0d}b + a\nb + 0: a\x{0a}b + a\r\nb + 0: a\x{0d}\x{0a}b + a\x{85}b + 0: a\x{85}b + a\x0bb + 0: a\x{0b}b + ** Failers +No match + a\x{85}b\ +No match + a\x0bb\ +No match + +/.*a.*=.b.*/8 + QQQ\x{2029}ABCaXYZ=!bPQR + 0: ABCaXYZ=!bPQR + ** Failers +No match + a\x{2029}b +No match + \x61\xe2\x80\xa9\x62 +No match + +/[[:a\x{100}b:]]/8 +Failed: unknown POSIX class name at offset 3 + +/a[^]b/8 + a\x{1234}b + 0: a\x{1234}b + a\nb + 0: a\x{0a}b + ** Failers +No match + ab +No match + +/a[^]+b/8 + aXb + 0: aXb + a\nX\nX\x{1234}b + 0: a\x{0a}X\x{0a}X\x{1234}b + ** Failers +No match + ab +No match + +/(\x{de})\1/ + \x{de}\x{de} + 0: \xde\xde + 1: \xde + +/X/8f + A\x{1ec5}ABCXYZ + 0: X + +/Xa{2,4}b/8 + X\P +Partial match: X + Xa\P +Partial match: Xa + Xaa\P +Partial match: Xaa + Xaaa\P +Partial match: Xaaa + Xaaaa\P +Partial match: Xaaaa + +/Xa{2,4}?b/8 + X\P +Partial match: X + Xa\P +Partial match: Xa + Xaa\P +Partial match: Xaa + Xaaa\P +Partial match: Xaaa + Xaaaa\P +Partial match: Xaaaa + +/Xa{2,4}+b/8 + X\P +Partial match: X + Xa\P +Partial match: Xa + Xaa\P +Partial match: Xaa + Xaaa\P +Partial match: Xaaa + Xaaaa\P +Partial match: Xaaaa + +/X\x{123}{2,4}b/8 + X\P +Partial match: X + X\x{123}\P +Partial match: X\x{123} + X\x{123}\x{123}\P +Partial match: X\x{123}\x{123} + X\x{123}\x{123}\x{123}\P +Partial match: X\x{123}\x{123}\x{123} + X\x{123}\x{123}\x{123}\x{123}\P +Partial match: X\x{123}\x{123}\x{123}\x{123} + +/X\x{123}{2,4}?b/8 + X\P +Partial match: X + X\x{123}\P +Partial match: X\x{123} + X\x{123}\x{123}\P +Partial match: X\x{123}\x{123} + X\x{123}\x{123}\x{123}\P +Partial match: X\x{123}\x{123}\x{123} + X\x{123}\x{123}\x{123}\x{123}\P +Partial match: X\x{123}\x{123}\x{123}\x{123} + +/X\x{123}{2,4}+b/8 + X\P +Partial match: X + X\x{123}\P +Partial match: X\x{123} + X\x{123}\x{123}\P +Partial match: X\x{123}\x{123} + X\x{123}\x{123}\x{123}\P +Partial match: X\x{123}\x{123}\x{123} + X\x{123}\x{123}\x{123}\x{123}\P +Partial match: X\x{123}\x{123}\x{123}\x{123} + +/X\x{123}{2,4}b/8 + Xx\P +No match + X\x{123}x\P +No match + X\x{123}\x{123}x\P +No match + X\x{123}\x{123}\x{123}x\P +No match + X\x{123}\x{123}\x{123}\x{123}x\P +No match + +/X\x{123}{2,4}?b/8 + Xx\P +No match + X\x{123}x\P +No match + X\x{123}\x{123}x\P +No match + X\x{123}\x{123}\x{123}x\P +No match + X\x{123}\x{123}\x{123}\x{123}x\P +No match + +/X\x{123}{2,4}+b/8 + Xx\P +No match + X\x{123}x\P +No match + X\x{123}\x{123}x\P +No match + X\x{123}\x{123}\x{123}x\P +No match + X\x{123}\x{123}\x{123}\x{123}x\P +No match + +/X\d{2,4}b/8 + X\P +Partial match: X + X3\P +Partial match: X3 + X33\P +Partial match: X33 + X333\P +Partial match: X333 + X3333\P +Partial match: X3333 + +/X\d{2,4}?b/8 + X\P +Partial match: X + X3\P +Partial match: X3 + X33\P +Partial match: X33 + X333\P +Partial match: X333 + X3333\P +Partial match: X3333 + +/X\d{2,4}+b/8 + X\P +Partial match: X + X3\P +Partial match: X3 + X33\P +Partial match: X33 + X333\P +Partial match: X333 + X3333\P +Partial match: X3333 + +/X\D{2,4}b/8 + X\P +Partial match: X + Xa\P +Partial match: Xa + Xaa\P +Partial match: Xaa + Xaaa\P +Partial match: Xaaa + Xaaaa\P +Partial match: Xaaaa + +/X\D{2,4}?b/8 + X\P +Partial match: X + Xa\P +Partial match: Xa + Xaa\P +Partial match: Xaa + Xaaa\P +Partial match: Xaaa + Xaaaa\P +Partial match: Xaaaa + +/X\D{2,4}+b/8 + X\P +Partial match: X + Xa\P +Partial match: Xa + Xaa\P +Partial match: Xaa + Xaaa\P +Partial match: Xaaa + Xaaaa\P +Partial match: Xaaaa + +/X\D{2,4}b/8 + X\P +Partial match: X + X\x{123}\P +Partial match: X\x{123} + X\x{123}\x{123}\P +Partial match: X\x{123}\x{123} + X\x{123}\x{123}\x{123}\P +Partial match: X\x{123}\x{123}\x{123} + X\x{123}\x{123}\x{123}\x{123}\P +Partial match: X\x{123}\x{123}\x{123}\x{123} + +/X\D{2,4}?b/8 + X\P +Partial match: X + X\x{123}\P +Partial match: X\x{123} + X\x{123}\x{123}\P +Partial match: X\x{123}\x{123} + X\x{123}\x{123}\x{123}\P +Partial match: X\x{123}\x{123}\x{123} + X\x{123}\x{123}\x{123}\x{123}\P +Partial match: X\x{123}\x{123}\x{123}\x{123} + +/X\D{2,4}+b/8 + X\P +Partial match: X + X\x{123}\P +Partial match: X\x{123} + X\x{123}\x{123}\P +Partial match: X\x{123}\x{123} + X\x{123}\x{123}\x{123}\P +Partial match: X\x{123}\x{123}\x{123} + X\x{123}\x{123}\x{123}\x{123}\P +Partial match: X\x{123}\x{123}\x{123}\x{123} + +/X[abc]{2,4}b/8 + X\P +Partial match: X + Xa\P +Partial match: Xa + Xaa\P +Partial match: Xaa + Xaaa\P +Partial match: Xaaa + Xaaaa\P +Partial match: Xaaaa + +/X[abc]{2,4}?b/8 + X\P +Partial match: X + Xa\P +Partial match: Xa + Xaa\P +Partial match: Xaa + Xaaa\P +Partial match: Xaaa + Xaaaa\P +Partial match: Xaaaa + +/X[abc]{2,4}+b/8 + X\P +Partial match: X + Xa\P +Partial match: Xa + Xaa\P +Partial match: Xaa + Xaaa\P +Partial match: Xaaa + Xaaaa\P +Partial match: Xaaaa + +/X[abc\x{123}]{2,4}b/8 + X\P +Partial match: X + X\x{123}\P +Partial match: X\x{123} + X\x{123}\x{123}\P +Partial match: X\x{123}\x{123} + X\x{123}\x{123}\x{123}\P +Partial match: X\x{123}\x{123}\x{123} + X\x{123}\x{123}\x{123}\x{123}\P +Partial match: X\x{123}\x{123}\x{123}\x{123} + +/X[abc\x{123}]{2,4}?b/8 + X\P +Partial match: X + X\x{123}\P +Partial match: X\x{123} + X\x{123}\x{123}\P +Partial match: X\x{123}\x{123} + X\x{123}\x{123}\x{123}\P +Partial match: X\x{123}\x{123}\x{123} + X\x{123}\x{123}\x{123}\x{123}\P +Partial match: X\x{123}\x{123}\x{123}\x{123} + +/X[abc\x{123}]{2,4}+b/8 + X\P +Partial match: X + X\x{123}\P +Partial match: X\x{123} + X\x{123}\x{123}\P +Partial match: X\x{123}\x{123} + X\x{123}\x{123}\x{123}\P +Partial match: X\x{123}\x{123}\x{123} + X\x{123}\x{123}\x{123}\x{123}\P +Partial match: X\x{123}\x{123}\x{123}\x{123} + +/X[^a]{2,4}b/8 + X\P +Partial match: X + Xz\P +Partial match: Xz + Xzz\P +Partial match: Xzz + Xzzz\P +Partial match: Xzzz + Xzzzz\P +Partial match: Xzzzz + +/X[^a]{2,4}?b/8 + X\P +Partial match: X + Xz\P +Partial match: Xz + Xzz\P +Partial match: Xzz + Xzzz\P +Partial match: Xzzz + Xzzzz\P +Partial match: Xzzzz + +/X[^a]{2,4}+b/8 + X\P +Partial match: X + Xz\P +Partial match: Xz + Xzz\P +Partial match: Xzz + Xzzz\P +Partial match: Xzzz + Xzzzz\P +Partial match: Xzzzz + +/X[^a]{2,4}b/8 + X\P +Partial match: X + X\x{123}\P +Partial match: X\x{123} + X\x{123}\x{123}\P +Partial match: X\x{123}\x{123} + X\x{123}\x{123}\x{123}\P +Partial match: X\x{123}\x{123}\x{123} + X\x{123}\x{123}\x{123}\x{123}\P +Partial match: X\x{123}\x{123}\x{123}\x{123} + +/X[^a]{2,4}?b/8 + X\P +Partial match: X + X\x{123}\P +Partial match: X\x{123} + X\x{123}\x{123}\P +Partial match: X\x{123}\x{123} + X\x{123}\x{123}\x{123}\P +Partial match: X\x{123}\x{123}\x{123} + X\x{123}\x{123}\x{123}\x{123}\P +Partial match: X\x{123}\x{123}\x{123}\x{123} + +/X[^a]{2,4}+b/8 + X\P +Partial match: X + X\x{123}\P +Partial match: X\x{123} + X\x{123}\x{123}\P +Partial match: X\x{123}\x{123} + X\x{123}\x{123}\x{123}\P +Partial match: X\x{123}\x{123}\x{123} + X\x{123}\x{123}\x{123}\x{123}\P +Partial match: X\x{123}\x{123}\x{123}\x{123} + +/(Y)X\1{2,4}b/8 + YX\P +Partial match: YX + YXY\P +Partial match: YXY + YXYY\P +Partial match: YXYY + YXYYY\P +Partial match: YXYYY + YXYYYY\P +Partial match: YXYYYY + +/(Y)X\1{2,4}?b/8 + YX\P +Partial match: YX + YXY\P +Partial match: YXY + YXYY\P +Partial match: YXYY + YXYYY\P +Partial match: YXYYY + YXYYYY\P +Partial match: YXYYYY + +/(Y)X\1{2,4}+b/8 + YX\P +Partial match: YX + YXY\P +Partial match: YXY + YXYY\P +Partial match: YXYY + YXYYY\P +Partial match: YXYYY + YXYYYY\P +Partial match: YXYYYY + +/(\x{123})X\1{2,4}b/8 + \x{123}X\P +Partial match: \x{123}X + \x{123}X\x{123}\P +Partial match: \x{123}X\x{123} + \x{123}X\x{123}\x{123}\P +Partial match: \x{123}X\x{123}\x{123} + \x{123}X\x{123}\x{123}\x{123}\P +Partial match: \x{123}X\x{123}\x{123}\x{123} + \x{123}X\x{123}\x{123}\x{123}\x{123}\P +Partial match: \x{123}X\x{123}\x{123}\x{123}\x{123} + +/(\x{123})X\1{2,4}?b/8 + \x{123}X\P +Partial match: \x{123}X + \x{123}X\x{123}\P +Partial match: \x{123}X\x{123} + \x{123}X\x{123}\x{123}\P +Partial match: \x{123}X\x{123}\x{123} + \x{123}X\x{123}\x{123}\x{123}\P +Partial match: \x{123}X\x{123}\x{123}\x{123} + \x{123}X\x{123}\x{123}\x{123}\x{123}\P +Partial match: \x{123}X\x{123}\x{123}\x{123}\x{123} + +/(\x{123})X\1{2,4}+b/8 + \x{123}X\P +Partial match: \x{123}X + \x{123}X\x{123}\P +Partial match: \x{123}X\x{123} + \x{123}X\x{123}\x{123}\P +Partial match: \x{123}X\x{123}\x{123} + \x{123}X\x{123}\x{123}\x{123}\P +Partial match: \x{123}X\x{123}\x{123}\x{123} + \x{123}X\x{123}\x{123}\x{123}\x{123}\P +Partial match: \x{123}X\x{123}\x{123}\x{123}\x{123} + +/\bthe cat\b/8 + the cat\P + 0: the cat + the cat\P\P +Partial match: the cat + +/abcd*/8 + xxxxabcd\P + 0: abcd + xxxxabcd\P\P +Partial match: abcd + +/abcd*/i8 + xxxxabcd\P + 0: abcd + xxxxabcd\P\P +Partial match: abcd + XXXXABCD\P + 0: ABCD + XXXXABCD\P\P +Partial match: ABCD + +/abc\d*/8 + xxxxabc1\P + 0: abc1 + xxxxabc1\P\P +Partial match: abc1 + +/(a)bc\1*/8 + xxxxabca\P + 0: abca + 1: a + xxxxabca\P\P +Partial match: abca + +/abc[de]*/8 + xxxxabcde\P + 0: abcde + xxxxabcde\P\P +Partial match: abcde + +/X\W{3}X/8 + \PX +Partial match: X + +/\sxxx\s/8T1 + AB\x{85}xxx\x{a0}XYZ + 0: \x{85}xxx\x{a0} + AB\x{a0}xxx\x{85}XYZ + 0: \x{a0}xxx\x{85} + +/\S \S/8T1 + \x{a2} \x{84} + 0: \x{a2} \x{84} + +'A#хц'8xBZ +------------------------------------------------------------------ + Bra + A + Ket + End +------------------------------------------------------------------ + +'A#хц + PQ'8xBZ +------------------------------------------------------------------ + Bra + APQ + Ket + End +------------------------------------------------------------------ + +/a+#Ñ…aa + z#XX?/8xBZ +------------------------------------------------------------------ + Bra + a++ + z + Ket + End +------------------------------------------------------------------ + +/a+#Ñ…aa + z#Ñ…?/8xBZ +------------------------------------------------------------------ + Bra + a++ + z + Ket + End +------------------------------------------------------------------ + +/\g{A}xxx#bXX(?'A'123) (?'A'456)/8xBZ +------------------------------------------------------------------ + Bra + \1 + xxx + CBra 1 + 456 + Ket + Ket + End +------------------------------------------------------------------ + +/\g{A}xxx#bÑ…(?'A'123) (?'A'456)/8xBZ +------------------------------------------------------------------ + Bra + \1 + xxx + CBra 1 + 456 + Ket + Ket + End +------------------------------------------------------------------ + +/^\cÄ£/8 +Failed: \c must be followed by an ASCII character at offset 3 + +/(\R*)(.)/s8 + \r\n + 0: \x{0d} + 1: + 2: \x{0d} + \r\r\n\n\r + 0: \x{0d}\x{0d}\x{0a}\x{0a}\x{0d} + 1: \x{0d}\x{0d}\x{0a}\x{0a} + 2: \x{0d} + \r\r\n\n\r\n + 0: \x{0d}\x{0d}\x{0a}\x{0a}\x{0d} + 1: \x{0d}\x{0d}\x{0a}\x{0a} + 2: \x{0d} + +/(\R)*(.)/s8 + \r\n + 0: \x{0d} + 1: + 2: \x{0d} + \r\r\n\n\r + 0: \x{0d}\x{0d}\x{0a}\x{0a}\x{0d} + 1: \x{0a} + 2: \x{0d} + \r\r\n\n\r\n + 0: \x{0d}\x{0d}\x{0a}\x{0a}\x{0d} + 1: \x{0a} + 2: \x{0d} + +/[^\x{1234}]+/iS8I +Capturing subpattern count = 0 +Options: caseless utf +No first char +No need char +Subject length lower bound = 1 +No starting char list + +/[^\x{1234}]+?/iS8I +Capturing subpattern count = 0 +Options: caseless utf +No first char +No need char +Subject length lower bound = 1 +No starting char list + +/[^\x{1234}]++/iS8I +Capturing subpattern count = 0 +Options: caseless utf +No first char +No need char +Subject length lower bound = 1 +No starting char list + +/[^\x{1234}]{2}/iS8I +Capturing subpattern count = 0 +Options: caseless utf +No first char +No need char +Subject length lower bound = 2 +No starting char list + +// +Failed: inconsistent NEWLINE options at offset 0 + +/f.*/ + \P\Pfor +Partial match: for + +/f.*/s + \P\Pfor +Partial match: for + +/f.*/8 + \P\Pfor +Partial match: for + +/f.*/8s + \P\Pfor +Partial match: for + +/\x{d7ff}\x{e000}/8 + +/\x{d800}/8 +Failed: disallowed Unicode code point (>= 0xd800 && <= 0xdfff) at offset 7 + +/\x{dfff}/8 +Failed: disallowed Unicode code point (>= 0xd800 && <= 0xdfff) at offset 7 + +/\h+/8 + \x{1681}\x{200b}\x{1680}\x{2000}\x{202f}\x{3000} + 0: \x{1680}\x{2000}\x{202f}\x{3000} + \x{3001}\x{2fff}\x{200a}\x{a0}\x{2000} + 0: \x{200a}\x{a0}\x{2000} + +/[\h\x{e000}]+/8BZ +------------------------------------------------------------------ + Bra + [\x09 \xa0\x{1680}\x{180e}\x{2000}-\x{200a}\x{202f}\x{205f}\x{3000}\x{e000}]++ + Ket + End +------------------------------------------------------------------ + \x{1681}\x{200b}\x{1680}\x{2000}\x{202f}\x{3000} + 0: \x{1680}\x{2000}\x{202f}\x{3000} + \x{3001}\x{2fff}\x{200a}\x{a0}\x{2000} + 0: \x{200a}\x{a0}\x{2000} + +/\H+/8 + \x{1680}\x{180e}\x{167f}\x{1681}\x{180d}\x{180f} + 0: \x{167f}\x{1681}\x{180d}\x{180f} + \x{2000}\x{200a}\x{1fff}\x{200b} + 0: \x{1fff}\x{200b} + \x{202f}\x{205f}\x{202e}\x{2030}\x{205e}\x{2060} + 0: \x{202e}\x{2030}\x{205e}\x{2060} + \x{a0}\x{3000}\x{9f}\x{a1}\x{2fff}\x{3001} + 0: \x{9f}\x{a1}\x{2fff}\x{3001} + +/[\H\x{d7ff}]+/8BZ +------------------------------------------------------------------ + Bra + [\x00-\x08\x0a-\x1f!-\x9f\xa1-\xff\x{100}-\x{167f}\x{1681}-\x{180d}\x{180f}-\x{1fff}\x{200b}-\x{202e}\x{2030}-\x{205e}\x{2060}-\x{2fff}\x{3001}-\x{10ffff}\x{d7ff}]++ + Ket + End +------------------------------------------------------------------ + \x{1680}\x{180e}\x{167f}\x{1681}\x{180d}\x{180f} + 0: \x{167f}\x{1681}\x{180d}\x{180f} + \x{2000}\x{200a}\x{1fff}\x{200b} + 0: \x{1fff}\x{200b} + \x{202f}\x{205f}\x{202e}\x{2030}\x{205e}\x{2060} + 0: \x{202e}\x{2030}\x{205e}\x{2060} + \x{a0}\x{3000}\x{9f}\x{a1}\x{2fff}\x{3001} + 0: \x{9f}\x{a1}\x{2fff}\x{3001} + +/\v+/8 + \x{2027}\x{2030}\x{2028}\x{2029} + 0: \x{2028}\x{2029} + \x09\x0e\x{84}\x{86}\x{85}\x0a\x0b\x0c\x0d + 0: \x{85}\x{0a}\x{0b}\x{0c}\x{0d} + +/[\v\x{e000}]+/8BZ +------------------------------------------------------------------ + Bra + [\x0a-\x0d\x85\x{2028}-\x{2029}\x{e000}]++ + Ket + End +------------------------------------------------------------------ + \x{2027}\x{2030}\x{2028}\x{2029} + 0: \x{2028}\x{2029} + \x09\x0e\x{84}\x{86}\x{85}\x0a\x0b\x0c\x0d + 0: \x{85}\x{0a}\x{0b}\x{0c}\x{0d} + +/\V+/8 + \x{2028}\x{2029}\x{2027}\x{2030} + 0: \x{2027}\x{2030} + \x{85}\x0a\x0b\x0c\x0d\x09\x0e\x{84}\x{86} + 0: \x{09}\x{0e}\x{84}\x{86} + +/[\V\x{d7ff}]+/8BZ +------------------------------------------------------------------ + Bra + [\x00-\x09\x0e-\x84\x86-\xff\x{100}-\x{2027}\x{202a}-\x{10ffff}\x{d7ff}]++ + Ket + End +------------------------------------------------------------------ + \x{2028}\x{2029}\x{2027}\x{2030} + 0: \x{2027}\x{2030} + \x{85}\x0a\x0b\x0c\x0d\x09\x0e\x{84}\x{86} + 0: \x{09}\x{0e}\x{84}\x{86} + +/\R+/8 + \x{2027}\x{2030}\x{2028}\x{2029} + 0: \x{2028}\x{2029} + \x09\x0e\x{84}\x{86}\x{85}\x0a\x0b\x0c\x0d + 0: \x{85}\x{0a}\x{0b}\x{0c}\x{0d} + +/(..)\1/8 + ab\P +Partial match: ab + aba\P +Partial match: aba + abab\P + 0: abab + 1: ab + +/(..)\1/8i + ab\P +Partial match: ab + abA\P +Partial match: abA + aBAb\P + 0: aBAb + 1: aB + +/(..)\1{2,}/8 + ab\P +Partial match: ab + aba\P +Partial match: aba + abab\P +Partial match: abab + ababa\P +Partial match: ababa + ababab\P + 0: ababab + 1: ab + ababab\P\P +Partial match: ababab + abababa\P + 0: ababab + 1: ab + abababa\P\P +Partial match: abababa + +/(..)\1{2,}/8i + ab\P +Partial match: ab + aBa\P +Partial match: aBa + aBAb\P +Partial match: aBAb + AbaBA\P +Partial match: AbaBA + abABAb\P + 0: abABAb + 1: ab + aBAbaB\P\P +Partial match: aBAbaB + abABabA\P + 0: abABab + 1: ab + abaBABa\P\P +Partial match: abaBABa + +/(..)\1{2,}?x/8i + ab\P +Partial match: ab + abA\P +Partial match: abA + aBAb\P +Partial match: aBAb + abaBA\P +Partial match: abaBA + abAbaB\P +Partial match: abAbaB + abaBabA\P +Partial match: abaBabA + abAbABaBx\P + 0: abAbABaBx + 1: ab + +/./8 + \r\P + 0: \x{0d} + \r\P\P +Partial match: \x{0d} + +/.{2,3}/8 + \r\P +Partial match: \x{0d} + \r\P\P +Partial match: \x{0d} + \r\r\P + 0: \x{0d}\x{0d} + \r\r\P\P +Partial match: \x{0d}\x{0d} + \r\r\r\P + 0: \x{0d}\x{0d}\x{0d} + \r\r\r\P\P +Partial match: \x{0d}\x{0d}\x{0d} + +/.{2,3}?/8 + \r\P +Partial match: \x{0d} + \r\P\P +Partial match: \x{0d} + \r\r\P + 0: \x{0d}\x{0d} + \r\r\P\P +Partial match: \x{0d}\x{0d} + \r\r\r\P + 0: \x{0d}\x{0d} + \r\r\r\P\P + 0: \x{0d}\x{0d} + +/[^\x{100}][^\x{1234}][^\x{ffff}][^\x{10000}][^\x{10ffff}]/8BZ +------------------------------------------------------------------ + Bra + [^\x{100}] + [^\x{1234}] + [^\x{ffff}] + [^\x{10000}] + [^\x{10ffff}] + Ket + End +------------------------------------------------------------------ + +/[^\x{100}][^\x{1234}][^\x{ffff}][^\x{10000}][^\x{10ffff}]/8BZi +------------------------------------------------------------------ + Bra + /i [^\x{100}] + /i [^\x{1234}] + /i [^\x{ffff}] + /i [^\x{10000}] + /i [^\x{10ffff}] + Ket + End +------------------------------------------------------------------ + +/[^\x{100}]*[^\x{10000}]+[^\x{10ffff}]??[^\x{8000}]{4,}[^\x{7fff}]{2,9}?[^\x{fffff}]{5,6}+/8BZ +------------------------------------------------------------------ + Bra + [^\x{100}]* + [^\x{10000}]+ + [^\x{10ffff}]?? + [^\x{8000}]{4} + [^\x{8000}]* + [^\x{7fff}]{2} + [^\x{7fff}]{0,7}? + [^\x{fffff}]{5} + [^\x{fffff}]?+ + Ket + End +------------------------------------------------------------------ + +/[^\x{100}]*[^\x{10000}]+[^\x{10ffff}]??[^\x{8000}]{4,}[^\x{7fff}]{2,9}?[^\x{fffff}]{5,6}+/8BZi +------------------------------------------------------------------ + Bra + /i [^\x{100}]* + /i [^\x{10000}]+ + /i [^\x{10ffff}]?? + /i [^\x{8000}]{4} + /i [^\x{8000}]* + /i [^\x{7fff}]{2} + /i [^\x{7fff}]{0,7}? + /i [^\x{fffff}]{5} + /i [^\x{fffff}]?+ + Ket + End +------------------------------------------------------------------ + +/(?<=\x{1234}\x{1234})\bxy/I8 +Capturing subpattern count = 0 +Max lookbehind = 2 +Options: utf +First char = 'x' +Need char = 'y' + +/(?8BZ +------------------------------------------------------------------ + Bra + \x{100} + Ket + End +------------------------------------------------------------------ + +/[\u0100-\u0200]/8BZ +------------------------------------------------------------------ + Bra + [\x{100}-\x{200}] + Ket + End +------------------------------------------------------------------ + +/\ud800/8 +Failed: disallowed Unicode code point (>= 0xd800 && <= 0xdfff) at offset 5 + +/^a+[a\x{200}]/8BZ +------------------------------------------------------------------ + Bra + ^ + a+ + [a\x{200}] + Ket + End +------------------------------------------------------------------ + aa + 0: aa + +/[b-d\x{200}-\x{250}]*[ae-h]?#[\x{200}-\x{250}]{0,8}[\x00-\xff]*#[\x{200}-\x{250}]+[a-z]/8BZ +------------------------------------------------------------------ + Bra + [b-d\x{200}-\x{250}]*+ + [ae-h]?+ + # + [\x{200}-\x{250}]{0,8}+ + [\x00-\xff]* + # + [\x{200}-\x{250}]++ + [a-z] + Ket + End +------------------------------------------------------------------ + +/[^\xff]*PRUNE:\x{100}abc(xyz(?1))/8DZ +------------------------------------------------------------------ + Bra + [^\x{ff}]* + PRUNE:\x{100}abc + CBra 1 + xyz + Recurse + Ket + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Options: utf +No first char +Need char = 'z' + +/(?<=\K\x{17f})/8g+ + \x{17f}\x{17f}\x{17f}\x{17f}\x{17f} + 0: \x{17f} + 0+ \x{17f}\x{17f}\x{17f}\x{17f} + 0: \x{17f} + 0+ \x{17f}\x{17f}\x{17f}\x{17f} + 0: \x{17f} + 0+ \x{17f}\x{17f}\x{17f} + 0: \x{17f} + 0+ \x{17f}\x{17f} + 0: \x{17f} + 0+ \x{17f} + 0: \x{17f} + 0+ + +/(?<=\K\x{17f})/8G+ + \x{17f}\x{17f}\x{17f}\x{17f}\x{17f} + 0: \x{17f} + 0+ \x{17f}\x{17f}\x{17f}\x{17f} + 0: \x{17f} + 0+ \x{17f}\x{17f}\x{17f} + 0: \x{17f} + 0+ \x{17f}\x{17f} + 0: \x{17f} + 0+ \x{17f} + 0: \x{17f} + 0+ + +/\C[^\v]+\x80/8 + [Aá¿»BÅ€C] +No match + +/\C[^\d]+\x80/8 + [Aá¿»BÅ€C] +No match + +/-- End of testinput5 --/ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput6 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput6 new file mode 100755 index 000000000..422d38335 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput6 @@ -0,0 +1,2584 @@ +/-- This set of tests is for Unicode property support. It is compatible with + Perl >= 5.15. --/ + +< forbid 9?=ABCDEFfGILMNPTUXZ< + +/^\pC\pL\pM\pN\pP\pS\pZ\s+/8W + >\x{20}\x{a0}\x{1680}\x{2028}\x{2029}\x{202f}\x{9}\x{b} + 0: > \x{a0}\x{1680}\x{2028}\x{2029}\x{202f}\x{09}\x{0b} + +/^>\pZ+/8W + >\x{20}\x{a0}\x{1680}\x{2028}\x{2029}\x{202f}\x{9}\x{b} + 0: > \x{a0}\x{1680}\x{2028}\x{2029}\x{202f} + +/^>[[:space:]]*/8W + >\x{20}\x{a0}\x{1680}\x{2028}\x{2029}\x{202f}\x{9}\x{b} + 0: > \x{a0}\x{1680}\x{2028}\x{2029}\x{202f}\x{09}\x{0b} + +/^>[[:blank:]]*/8W + >\x{20}\x{a0}\x{1680}\x{180e}\x{2000}\x{202f}\x{9}\x{b}\x{2028} + 0: > \x{a0}\x{1680}\x{180e}\x{2000}\x{202f}\x{09} + +/^[[:alpha:]]*/8W + Az\x{aa}\x{c0}\x{1c5}\x{2b0}\x{3b6}\x{1d7c9}\x{2fa1d} + 0: Az\x{aa}\x{c0}\x{1c5}\x{2b0}\x{3b6}\x{1d7c9}\x{2fa1d} + +/^[[:alnum:]]*/8W + Az\x{aa}\x{c0}\x{1c5}\x{2b0}\x{3b6}\x{1d7c9}\x{2fa1d}1\x{660}\x{bef}\x{16ee} + 0: Az\x{aa}\x{c0}\x{1c5}\x{2b0}\x{3b6}\x{1d7c9}\x{2fa1d}1\x{660}\x{bef}\x{16ee} + +/^[[:cntrl:]]*/8W + \x{0}\x{09}\x{1f}\x{7f}\x{9f} + 0: \x{00}\x{09}\x{1f}\x{7f} + +/^[[:graph:]]*/8W + A\x{a1}\x{a0} + 0: A\x{a1} + +/^[[:print:]]*/8W + A z\x{a0}\x{a1} + 0: A z\x{a0}\x{a1} + +/^[[:punct:]]*/8W + .+\x{a1}\x{a0} + 0: .+\x{a1} + +/\p{Zs}*?\R/ + ** Failers +No match + a\xFCb +No match + +/\p{Zs}*\R/ + ** Failers +No match + a\xFCb +No match + +/â±¥/8i + â±¥ + 0: \x{2c65} + Ⱥx + 0: \x{23a} + Ⱥ + 0: \x{23a} + +/[â±¥]/8i + â±¥ + 0: \x{2c65} + Ⱥx + 0: \x{23a} + Ⱥ + 0: \x{23a} + +/Ⱥ/8i + Ⱥ + 0: \x{23a} + â±¥ + 0: \x{2c65} + +/-- These are tests for extended grapheme clusters --/ + +/^\X/8+ + G\x{34e}\x{34e}X + 0: G\x{34e}\x{34e} + 0+ X + \x{34e}\x{34e}X + 0: \x{34e}\x{34e} + 0+ X + \x04X + 0: \x{04} + 0+ X + \x{1100}X + 0: \x{1100} + 0+ X + \x{1100}\x{34e}X + 0: \x{1100}\x{34e} + 0+ X + \x{1b04}\x{1b04}X + 0: \x{1b04}\x{1b04} + 0+ X + *These match up to the roman letters + 0: * + 0+ These match up to the roman letters + \x{1111}\x{1111}L,L + 0: \x{1111}\x{1111} + 0+ L,L + \x{1111}\x{1111}\x{1169}L,L,V + 0: \x{1111}\x{1111}\x{1169} + 0+ L,L,V + \x{1111}\x{ae4c}L, LV + 0: \x{1111}\x{ae4c} + 0+ L, LV + \x{1111}\x{ad89}L, LVT + 0: \x{1111}\x{ad89} + 0+ L, LVT + \x{1111}\x{ae4c}\x{1169}L, LV, V + 0: \x{1111}\x{ae4c}\x{1169} + 0+ L, LV, V + \x{1111}\x{ae4c}\x{1169}\x{1169}L, LV, V, V + 0: \x{1111}\x{ae4c}\x{1169}\x{1169} + 0+ L, LV, V, V + \x{1111}\x{ae4c}\x{1169}\x{11fe}L, LV, V, T + 0: \x{1111}\x{ae4c}\x{1169}\x{11fe} + 0+ L, LV, V, T + \x{1111}\x{ad89}\x{11fe}L, LVT, T + 0: \x{1111}\x{ad89}\x{11fe} + 0+ L, LVT, T + \x{1111}\x{ad89}\x{11fe}\x{11fe}L, LVT, T, T + 0: \x{1111}\x{ad89}\x{11fe}\x{11fe} + 0+ L, LVT, T, T + \x{ad89}\x{11fe}\x{11fe}LVT, T, T + 0: \x{ad89}\x{11fe}\x{11fe} + 0+ LVT, T, T + *These match just the first codepoint (invalid sequence) + 0: * + 0+ These match just the first codepoint (invalid sequence) + \x{1111}\x{11fe}L, T + 0: \x{1111} + 0+ \x{11fe}L, T + \x{ae4c}\x{1111}LV, L + 0: \x{ae4c} + 0+ \x{1111}LV, L + \x{ae4c}\x{ae4c}LV, LV + 0: \x{ae4c} + 0+ \x{ae4c}LV, LV + \x{ae4c}\x{ad89}LV, LVT + 0: \x{ae4c} + 0+ \x{ad89}LV, LVT + \x{1169}\x{1111}V, L + 0: \x{1169} + 0+ \x{1111}V, L + \x{1169}\x{ae4c}V, LV + 0: \x{1169} + 0+ \x{ae4c}V, LV + \x{1169}\x{ad89}V, LVT + 0: \x{1169} + 0+ \x{ad89}V, LVT + \x{ad89}\x{1111}LVT, L + 0: \x{ad89} + 0+ \x{1111}LVT, L + \x{ad89}\x{1169}LVT, V + 0: \x{ad89} + 0+ \x{1169}LVT, V + \x{ad89}\x{ae4c}LVT, LV + 0: \x{ad89} + 0+ \x{ae4c}LVT, LV + \x{ad89}\x{ad89}LVT, LVT + 0: \x{ad89} + 0+ \x{ad89}LVT, LVT + \x{11fe}\x{1111}T, L + 0: \x{11fe} + 0+ \x{1111}T, L + \x{11fe}\x{1169}T, V + 0: \x{11fe} + 0+ \x{1169}T, V + \x{11fe}\x{ae4c}T, LV + 0: \x{11fe} + 0+ \x{ae4c}T, LV + \x{11fe}\x{ad89}T, LVT + 0: \x{11fe} + 0+ \x{ad89}T, LVT + *Test extend and spacing mark + 0: * + 0+ Test extend and spacing mark + \x{1111}\x{ae4c}\x{0711}L, LV, extend + 0: \x{1111}\x{ae4c}\x{711} + 0+ L, LV, extend + \x{1111}\x{ae4c}\x{1b04}L, LV, spacing mark + 0: \x{1111}\x{ae4c}\x{1b04} + 0+ L, LV, spacing mark + \x{1111}\x{ae4c}\x{1b04}\x{0711}\x{1b04}L, LV, spacing mark, extend, spacing mark + 0: \x{1111}\x{ae4c}\x{1b04}\x{711}\x{1b04} + 0+ L, LV, spacing mark, extend, spacing mark + *Test CR, LF, and control + 0: * + 0+ Test CR, LF, and control + \x0d\x{0711}CR, extend + 0: \x{0d} + 0+ \x{711}CR, extend + \x0d\x{1b04}CR, spacingmark + 0: \x{0d} + 0+ \x{1b04}CR, spacingmark + \x0a\x{0711}LF, extend + 0: \x{0a} + 0+ \x{711}LF, extend + \x0a\x{1b04}LF, spacingmark + 0: \x{0a} + 0+ \x{1b04}LF, spacingmark + \x0b\x{0711}Control, extend + 0: \x{0b} + 0+ \x{711}Control, extend + \x09\x{1b04}Control, spacingmark + 0: \x{09} + 0+ \x{1b04}Control, spacingmark + *There are no Prepend characters, so we can't test Prepend, CR + 0: * + 0+ There are no Prepend characters, so we can't test Prepend, CR + +/^(?>\X{2})X/8+ + \x{1111}\x{ae4c}\x{1111}\x{ae4c}X + 0: \x{1111}\x{ae4c}\x{1111}\x{ae4c}X + 0+ + +/^\X{2,4}X/8+ + \x{1111}\x{ae4c}\x{1111}\x{ae4c}X + 0: \x{1111}\x{ae4c}\x{1111}\x{ae4c}X + 0+ + \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X + 0: \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X + 0+ + \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X + 0: \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X + 0+ + +/^\X{2,4}?X/8+ + \x{1111}\x{ae4c}\x{1111}\x{ae4c}X + 0: \x{1111}\x{ae4c}\x{1111}\x{ae4c}X + 0+ + \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X + 0: \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X + 0+ + \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X + 0: \x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}\x{1111}\x{ae4c}X + 0+ + +/\X*Z/8Y + A\x{300} +No match + +/\X*(.)/8Y + A\x{1111}\x{ae4c}\x{1169} + 0: A\x{1111} + 1: \x{1111} + +/\X?abc/8Y +\xff\x7f\x00\x00\x03\x00\x41\xcc\x80\x41\x{300}\x61\x62\x63\x00\>06\? + 0: A\x{300}abc + +/-- --/ + +/\x{1e9e}+/8i + \x{1e9e}\x{00df} + 0: \x{1e9e}\x{df} + +/[z\x{1e9e}]+/8i + \x{1e9e}\x{00df} + 0: \x{1e9e}\x{df} + +/\x{00df}+/8i + \x{1e9e}\x{00df} + 0: \x{1e9e}\x{df} + +/[z\x{00df}]+/8i + \x{1e9e}\x{00df} + 0: \x{1e9e}\x{df} + +/\x{1f88}+/8i + \x{1f88}\x{1f80} + 0: \x{1f88}\x{1f80} + +/[z\x{1f88}]+/8i + \x{1f88}\x{1f80} + 0: \x{1f88}\x{1f80} + +/-- Characters with more than one other case; test in classes --/ + +/[z\x{00b5}]+/8i + \x{00b5}\x{039c}\x{03bc} + 0: \x{b5}\x{39c}\x{3bc} + +/[z\x{039c}]+/8i + \x{00b5}\x{039c}\x{03bc} + 0: \x{b5}\x{39c}\x{3bc} + +/[z\x{03bc}]+/8i + \x{00b5}\x{039c}\x{03bc} + 0: \x{b5}\x{39c}\x{3bc} + +/[z\x{00c5}]+/8i + \x{00c5}\x{00e5}\x{212b} + 0: \x{c5}\x{e5}\x{212b} + +/[z\x{00e5}]+/8i + \x{00c5}\x{00e5}\x{212b} + 0: \x{c5}\x{e5}\x{212b} + +/[z\x{212b}]+/8i + \x{00c5}\x{00e5}\x{212b} + 0: \x{c5}\x{e5}\x{212b} + +/[z\x{01c4}]+/8i + \x{01c4}\x{01c5}\x{01c6} + 0: \x{1c4}\x{1c5}\x{1c6} + +/[z\x{01c5}]+/8i + \x{01c4}\x{01c5}\x{01c6} + 0: \x{1c4}\x{1c5}\x{1c6} + +/[z\x{01c6}]+/8i + \x{01c4}\x{01c5}\x{01c6} + 0: \x{1c4}\x{1c5}\x{1c6} + +/[z\x{01c7}]+/8i + \x{01c7}\x{01c8}\x{01c9} + 0: \x{1c7}\x{1c8}\x{1c9} + +/[z\x{01c8}]+/8i + \x{01c7}\x{01c8}\x{01c9} + 0: \x{1c7}\x{1c8}\x{1c9} + +/[z\x{01c9}]+/8i + \x{01c7}\x{01c8}\x{01c9} + 0: \x{1c7}\x{1c8}\x{1c9} + +/[z\x{01ca}]+/8i + \x{01ca}\x{01cb}\x{01cc} + 0: \x{1ca}\x{1cb}\x{1cc} + +/[z\x{01cb}]+/8i + \x{01ca}\x{01cb}\x{01cc} + 0: \x{1ca}\x{1cb}\x{1cc} + +/[z\x{01cc}]+/8i + \x{01ca}\x{01cb}\x{01cc} + 0: \x{1ca}\x{1cb}\x{1cc} + +/[z\x{01f1}]+/8i + \x{01f1}\x{01f2}\x{01f3} + 0: \x{1f1}\x{1f2}\x{1f3} + +/[z\x{01f2}]+/8i + \x{01f1}\x{01f2}\x{01f3} + 0: \x{1f1}\x{1f2}\x{1f3} + +/[z\x{01f3}]+/8i + \x{01f1}\x{01f2}\x{01f3} + 0: \x{1f1}\x{1f2}\x{1f3} + +/[z\x{0345}]+/8i + \x{0345}\x{0399}\x{03b9}\x{1fbe} + 0: \x{345}\x{399}\x{3b9}\x{1fbe} + +/[z\x{0399}]+/8i + \x{0345}\x{0399}\x{03b9}\x{1fbe} + 0: \x{345}\x{399}\x{3b9}\x{1fbe} + +/[z\x{03b9}]+/8i + \x{0345}\x{0399}\x{03b9}\x{1fbe} + 0: \x{345}\x{399}\x{3b9}\x{1fbe} + +/[z\x{1fbe}]+/8i + \x{0345}\x{0399}\x{03b9}\x{1fbe} + 0: \x{345}\x{399}\x{3b9}\x{1fbe} + +/[z\x{0392}]+/8i + \x{0392}\x{03b2}\x{03d0} + 0: \x{392}\x{3b2}\x{3d0} + +/[z\x{03b2}]+/8i + \x{0392}\x{03b2}\x{03d0} + 0: \x{392}\x{3b2}\x{3d0} + +/[z\x{03d0}]+/8i + \x{0392}\x{03b2}\x{03d0} + 0: \x{392}\x{3b2}\x{3d0} + +/[z\x{0395}]+/8i + \x{0395}\x{03b5}\x{03f5} + 0: \x{395}\x{3b5}\x{3f5} + +/[z\x{03b5}]+/8i + \x{0395}\x{03b5}\x{03f5} + 0: \x{395}\x{3b5}\x{3f5} + +/[z\x{03f5}]+/8i + \x{0395}\x{03b5}\x{03f5} + 0: \x{395}\x{3b5}\x{3f5} + +/[z\x{0398}]+/8i + \x{0398}\x{03b8}\x{03d1}\x{03f4} + 0: \x{398}\x{3b8}\x{3d1}\x{3f4} + +/[z\x{03b8}]+/8i + \x{0398}\x{03b8}\x{03d1}\x{03f4} + 0: \x{398}\x{3b8}\x{3d1}\x{3f4} + +/[z\x{03d1}]+/8i + \x{0398}\x{03b8}\x{03d1}\x{03f4} + 0: \x{398}\x{3b8}\x{3d1}\x{3f4} + +/[z\x{03f4}]+/8i + \x{0398}\x{03b8}\x{03d1}\x{03f4} + 0: \x{398}\x{3b8}\x{3d1}\x{3f4} + +/[z\x{039a}]+/8i + \x{039a}\x{03ba}\x{03f0} + 0: \x{39a}\x{3ba}\x{3f0} + +/[z\x{03ba}]+/8i + \x{039a}\x{03ba}\x{03f0} + 0: \x{39a}\x{3ba}\x{3f0} + +/[z\x{03f0}]+/8i + \x{039a}\x{03ba}\x{03f0} + 0: \x{39a}\x{3ba}\x{3f0} + +/[z\x{03a0}]+/8i + \x{03a0}\x{03c0}\x{03d6} + 0: \x{3a0}\x{3c0}\x{3d6} + +/[z\x{03c0}]+/8i + \x{03a0}\x{03c0}\x{03d6} + 0: \x{3a0}\x{3c0}\x{3d6} + +/[z\x{03d6}]+/8i + \x{03a0}\x{03c0}\x{03d6} + 0: \x{3a0}\x{3c0}\x{3d6} + +/[z\x{03a1}]+/8i + \x{03a1}\x{03c1}\x{03f1} + 0: \x{3a1}\x{3c1}\x{3f1} + +/[z\x{03c1}]+/8i + \x{03a1}\x{03c1}\x{03f1} + 0: \x{3a1}\x{3c1}\x{3f1} + +/[z\x{03f1}]+/8i + \x{03a1}\x{03c1}\x{03f1} + 0: \x{3a1}\x{3c1}\x{3f1} + +/[z\x{03a3}]+/8i + \x{03A3}\x{03C2}\x{03C3} + 0: \x{3a3}\x{3c2}\x{3c3} + +/[z\x{03c2}]+/8i + \x{03A3}\x{03C2}\x{03C3} + 0: \x{3a3}\x{3c2}\x{3c3} + +/[z\x{03c3}]+/8i + \x{03A3}\x{03C2}\x{03C3} + 0: \x{3a3}\x{3c2}\x{3c3} + +/[z\x{03a6}]+/8i + \x{03a6}\x{03c6}\x{03d5} + 0: \x{3a6}\x{3c6}\x{3d5} + +/[z\x{03c6}]+/8i + \x{03a6}\x{03c6}\x{03d5} + 0: \x{3a6}\x{3c6}\x{3d5} + +/[z\x{03d5}]+/8i + \x{03a6}\x{03c6}\x{03d5} + 0: \x{3a6}\x{3c6}\x{3d5} + +/[z\x{03c9}]+/8i + \x{03c9}\x{03a9}\x{2126} + 0: \x{3c9}\x{3a9}\x{2126} + +/[z\x{03a9}]+/8i + \x{03c9}\x{03a9}\x{2126} + 0: \x{3c9}\x{3a9}\x{2126} + +/[z\x{2126}]+/8i + \x{03c9}\x{03a9}\x{2126} + 0: \x{3c9}\x{3a9}\x{2126} + +/[z\x{1e60}]+/8i + \x{1e60}\x{1e61}\x{1e9b} + 0: \x{1e60}\x{1e61}\x{1e9b} + +/[z\x{1e61}]+/8i + \x{1e60}\x{1e61}\x{1e9b} + 0: \x{1e60}\x{1e61}\x{1e9b} + +/[z\x{1e9b}]+/8i + \x{1e60}\x{1e61}\x{1e9b} + 0: \x{1e60}\x{1e61}\x{1e9b} + +/-- Perl 5.12.4 gets these wrong, but 5.15.3 is OK --/ + +/[z\x{004b}]+/8i + \x{004b}\x{006b}\x{212a} + 0: Kk\x{212a} + +/[z\x{006b}]+/8i + \x{004b}\x{006b}\x{212a} + 0: Kk\x{212a} + +/[z\x{212a}]+/8i + \x{004b}\x{006b}\x{212a} + 0: Kk\x{212a} + +/[z\x{0053}]+/8i + \x{0053}\x{0073}\x{017f} + 0: Ss\x{17f} + +/[z\x{0073}]+/8i + \x{0053}\x{0073}\x{017f} + 0: Ss\x{17f} + +/[z\x{017f}]+/8i + \x{0053}\x{0073}\x{017f} + 0: Ss\x{17f} + +/-- --/ + +/(ΣΆΜΟΣ) \1/8i + ΣΆΜΟΣ ΣΆΜΟΣ + 0: \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3} \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3} + 1: \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3} + ΣΆΜΟΣ σάμος + 0: \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3} \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2} + 1: \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3} + σάμος σάμος + 0: \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2} \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2} + 1: \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2} + σάμος σάμοσ + 0: \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2} \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c3} + 1: \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2} + σάμος ΣΆΜΟΣ + 0: \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2} \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3} + 1: \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2} + +/(σάμος) \1/8i + ΣΆΜΟΣ ΣΆΜΟΣ + 0: \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3} \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3} + 1: \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3} + ΣΆΜΟΣ σάμος + 0: \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3} \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2} + 1: \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3} + σάμος σάμος + 0: \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2} \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2} + 1: \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2} + σάμος σάμοσ + 0: \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2} \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c3} + 1: \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2} + σάμος ΣΆΜΟΣ + 0: \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2} \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3} + 1: \x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2} + +/(ΣΆΜΟΣ) \1*/8i + ΣΆΜΟΣ\x20 + 0: \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3} + 1: \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3} + ΣΆΜΟΣ ΣΆΜΟΣσάμοςσάμος + 0: \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3} \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3}\x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2}\x{3c3}\x{3ac}\x{3bc}\x{3bf}\x{3c2} + 1: \x{3a3}\x{386}\x{39c}\x{39f}\x{3a3} + +/-- Perl matches these --/ + +/\x{00b5}+/8i + \x{00b5}\x{039c}\x{03bc} + 0: \x{b5}\x{39c}\x{3bc} + +/\x{039c}+/8i + \x{00b5}\x{039c}\x{03bc} + 0: \x{b5}\x{39c}\x{3bc} + +/\x{03bc}+/8i + \x{00b5}\x{039c}\x{03bc} + 0: \x{b5}\x{39c}\x{3bc} + + +/\x{00c5}+/8i + \x{00c5}\x{00e5}\x{212b} + 0: \x{c5}\x{e5}\x{212b} + +/\x{00e5}+/8i + \x{00c5}\x{00e5}\x{212b} + 0: \x{c5}\x{e5}\x{212b} + +/\x{212b}+/8i + \x{00c5}\x{00e5}\x{212b} + 0: \x{c5}\x{e5}\x{212b} + + +/\x{01c4}+/8i + \x{01c4}\x{01c5}\x{01c6} + 0: \x{1c4}\x{1c5}\x{1c6} + +/\x{01c5}+/8i + \x{01c4}\x{01c5}\x{01c6} + 0: \x{1c4}\x{1c5}\x{1c6} + +/\x{01c6}+/8i + \x{01c4}\x{01c5}\x{01c6} + 0: \x{1c4}\x{1c5}\x{1c6} + + +/\x{01c7}+/8i + \x{01c7}\x{01c8}\x{01c9} + 0: \x{1c7}\x{1c8}\x{1c9} + +/\x{01c8}+/8i + \x{01c7}\x{01c8}\x{01c9} + 0: \x{1c7}\x{1c8}\x{1c9} + +/\x{01c9}+/8i + \x{01c7}\x{01c8}\x{01c9} + 0: \x{1c7}\x{1c8}\x{1c9} + + +/\x{01ca}+/8i + \x{01ca}\x{01cb}\x{01cc} + 0: \x{1ca}\x{1cb}\x{1cc} + +/\x{01cb}+/8i + \x{01ca}\x{01cb}\x{01cc} + 0: \x{1ca}\x{1cb}\x{1cc} + +/\x{01cc}+/8i + \x{01ca}\x{01cb}\x{01cc} + 0: \x{1ca}\x{1cb}\x{1cc} + + +/\x{01f1}+/8i + \x{01f1}\x{01f2}\x{01f3} + 0: \x{1f1}\x{1f2}\x{1f3} + +/\x{01f2}+/8i + \x{01f1}\x{01f2}\x{01f3} + 0: \x{1f1}\x{1f2}\x{1f3} + +/\x{01f3}+/8i + \x{01f1}\x{01f2}\x{01f3} + 0: \x{1f1}\x{1f2}\x{1f3} + + +/\x{0345}+/8i + \x{0345}\x{0399}\x{03b9}\x{1fbe} + 0: \x{345}\x{399}\x{3b9}\x{1fbe} + +/\x{0399}+/8i + \x{0345}\x{0399}\x{03b9}\x{1fbe} + 0: \x{345}\x{399}\x{3b9}\x{1fbe} + +/\x{03b9}+/8i + \x{0345}\x{0399}\x{03b9}\x{1fbe} + 0: \x{345}\x{399}\x{3b9}\x{1fbe} + +/\x{1fbe}+/8i + \x{0345}\x{0399}\x{03b9}\x{1fbe} + 0: \x{345}\x{399}\x{3b9}\x{1fbe} + + +/\x{0392}+/8i + \x{0392}\x{03b2}\x{03d0} + 0: \x{392}\x{3b2}\x{3d0} + +/\x{03b2}+/8i + \x{0392}\x{03b2}\x{03d0} + 0: \x{392}\x{3b2}\x{3d0} + +/\x{03d0}+/8i + \x{0392}\x{03b2}\x{03d0} + 0: \x{392}\x{3b2}\x{3d0} + + +/\x{0395}+/8i + \x{0395}\x{03b5}\x{03f5} + 0: \x{395}\x{3b5}\x{3f5} + +/\x{03b5}+/8i + \x{0395}\x{03b5}\x{03f5} + 0: \x{395}\x{3b5}\x{3f5} + +/\x{03f5}+/8i + \x{0395}\x{03b5}\x{03f5} + 0: \x{395}\x{3b5}\x{3f5} + + +/\x{0398}+/8i + \x{0398}\x{03b8}\x{03d1}\x{03f4} + 0: \x{398}\x{3b8}\x{3d1}\x{3f4} + +/\x{03b8}+/8i + \x{0398}\x{03b8}\x{03d1}\x{03f4} + 0: \x{398}\x{3b8}\x{3d1}\x{3f4} + +/\x{03d1}+/8i + \x{0398}\x{03b8}\x{03d1}\x{03f4} + 0: \x{398}\x{3b8}\x{3d1}\x{3f4} + +/\x{03f4}+/8i + \x{0398}\x{03b8}\x{03d1}\x{03f4} + 0: \x{398}\x{3b8}\x{3d1}\x{3f4} + + +/\x{039a}+/8i + \x{039a}\x{03ba}\x{03f0} + 0: \x{39a}\x{3ba}\x{3f0} + +/\x{03ba}+/8i + \x{039a}\x{03ba}\x{03f0} + 0: \x{39a}\x{3ba}\x{3f0} + +/\x{03f0}+/8i + \x{039a}\x{03ba}\x{03f0} + 0: \x{39a}\x{3ba}\x{3f0} + + +/\x{03a0}+/8i + \x{03a0}\x{03c0}\x{03d6} + 0: \x{3a0}\x{3c0}\x{3d6} + +/\x{03c0}+/8i + \x{03a0}\x{03c0}\x{03d6} + 0: \x{3a0}\x{3c0}\x{3d6} + +/\x{03d6}+/8i + \x{03a0}\x{03c0}\x{03d6} + 0: \x{3a0}\x{3c0}\x{3d6} + + +/\x{03a1}+/8i + \x{03a1}\x{03c1}\x{03f1} + 0: \x{3a1}\x{3c1}\x{3f1} + +/\x{03c1}+/8i + \x{03a1}\x{03c1}\x{03f1} + 0: \x{3a1}\x{3c1}\x{3f1} + +/\x{03f1}+/8i + \x{03a1}\x{03c1}\x{03f1} + 0: \x{3a1}\x{3c1}\x{3f1} + + +/\x{03a3}+/8i + \x{03A3}\x{03C2}\x{03C3} + 0: \x{3a3}\x{3c2}\x{3c3} + +/\x{03c2}+/8i + \x{03A3}\x{03C2}\x{03C3} + 0: \x{3a3}\x{3c2}\x{3c3} + +/\x{03c3}+/8i + \x{03A3}\x{03C2}\x{03C3} + 0: \x{3a3}\x{3c2}\x{3c3} + + +/\x{03a6}+/8i + \x{03a6}\x{03c6}\x{03d5} + 0: \x{3a6}\x{3c6}\x{3d5} + +/\x{03c6}+/8i + \x{03a6}\x{03c6}\x{03d5} + 0: \x{3a6}\x{3c6}\x{3d5} + +/\x{03d5}+/8i + \x{03a6}\x{03c6}\x{03d5} + 0: \x{3a6}\x{3c6}\x{3d5} + + +/\x{03c9}+/8i + \x{03c9}\x{03a9}\x{2126} + 0: \x{3c9}\x{3a9}\x{2126} + +/\x{03a9}+/8i + \x{03c9}\x{03a9}\x{2126} + 0: \x{3c9}\x{3a9}\x{2126} + +/\x{2126}+/8i + \x{03c9}\x{03a9}\x{2126} + 0: \x{3c9}\x{3a9}\x{2126} + + +/\x{1e60}+/8i + \x{1e60}\x{1e61}\x{1e9b} + 0: \x{1e60}\x{1e61}\x{1e9b} + +/\x{1e61}+/8i + \x{1e60}\x{1e61}\x{1e9b} + 0: \x{1e60}\x{1e61}\x{1e9b} + +/\x{1e9b}+/8i + \x{1e60}\x{1e61}\x{1e9b} + 0: \x{1e60}\x{1e61}\x{1e9b} + + +/\x{1e9e}+/8i + \x{1e9e}\x{00df} + 0: \x{1e9e}\x{df} + +/\x{00df}+/8i + \x{1e9e}\x{00df} + 0: \x{1e9e}\x{df} + + +/\x{1f88}+/8i + \x{1f88}\x{1f80} + 0: \x{1f88}\x{1f80} + +/\x{1f80}+/8i + \x{1f88}\x{1f80} + 0: \x{1f88}\x{1f80} + + +/-- Perl 5.12.4 gets these wrong, but 5.15.3 is OK --/ + +/\x{004b}+/8i + \x{004b}\x{006b}\x{212a} + 0: Kk\x{212a} + +/\x{006b}+/8i + \x{004b}\x{006b}\x{212a} + 0: Kk\x{212a} + +/\x{212a}+/8i + \x{004b}\x{006b}\x{212a} + 0: Kk\x{212a} + + +/\x{0053}+/8i + \x{0053}\x{0073}\x{017f} + 0: Ss\x{17f} + +/\x{0073}+/8i + \x{0053}\x{0073}\x{017f} + 0: Ss\x{17f} + +/\x{017f}+/8i + \x{0053}\x{0073}\x{017f} + 0: Ss\x{17f} + +/^\p{Any}*\d{4}/8 + 1234 + 0: 1234 + 123 +No match + +/^\X*\w{4}/8 + 1234 + 0: 1234 + 123 +No match + +/^A\s+Z/8W + A\x{2005}Z + 0: A\x{2005}Z + A\x{85}\x{180e}\x{2005}Z + 0: A\x{85}\x{180e}\x{2005}Z + +/^A[\s]+Z/8W + A\x{2005}Z + 0: A\x{2005}Z + A\x{85}\x{180e}\x{2005}Z + 0: A\x{85}\x{180e}\x{2005}Z + +/^[[:graph:]]+$/8W + Letter:ABC + 0: Letter:ABC + Mark:\x{300}\x{1d172}\x{1d17b} + 0: Mark:\x{300}\x{1d172}\x{1d17b} + Number:9\x{660} + 0: Number:9\x{660} + Punctuation:\x{66a},; + 0: Punctuation:\x{66a},; + Symbol:\x{6de}<>\x{fffc} + 0: Symbol:\x{6de}<>\x{fffc} + Cf-property:\x{ad}\x{600}\x{601}\x{602}\x{603}\x{604}\x{6dd}\x{70f} + 0: Cf-property:\x{ad}\x{600}\x{601}\x{602}\x{603}\x{604}\x{6dd}\x{70f} + \x{200b}\x{200c}\x{200d}\x{200e}\x{200f} + 0: \x{200b}\x{200c}\x{200d}\x{200e}\x{200f} + \x{202a}\x{202b}\x{202c}\x{202d}\x{202e} + 0: \x{202a}\x{202b}\x{202c}\x{202d}\x{202e} + \x{2060}\x{2061}\x{2062}\x{2063}\x{2064} + 0: \x{2060}\x{2061}\x{2062}\x{2063}\x{2064} + \x{206a}\x{206b}\x{206c}\x{206d}\x{206e}\x{206f} + 0: \x{206a}\x{206b}\x{206c}\x{206d}\x{206e}\x{206f} + \x{feff} + 0: \x{feff} + \x{fff9}\x{fffa}\x{fffb} + 0: \x{fff9}\x{fffa}\x{fffb} + \x{110bd} + 0: \x{110bd} + \x{1d173}\x{1d174}\x{1d175}\x{1d176}\x{1d177}\x{1d178}\x{1d179}\x{1d17a} + 0: \x{1d173}\x{1d174}\x{1d175}\x{1d176}\x{1d177}\x{1d178}\x{1d179}\x{1d17a} + \x{e0001} + 0: \x{e0001} + \x{e0020}\x{e0030}\x{e0040}\x{e0050}\x{e0060}\x{e0070}\x{e007f} + 0: \x{e0020}\x{e0030}\x{e0040}\x{e0050}\x{e0060}\x{e0070}\x{e007f} + ** Failers +No match + \x{09} +No match + \x{0a} +No match + \x{1D} +No match + \x{20} +No match + \x{85} +No match + \x{a0} +No match + \x{61c} +No match + \x{1680} +No match + \x{180e} +No match + \x{2028} +No match + \x{2029} +No match + \x{202f} +No match + \x{2065} +No match + \x{2066} +No match + \x{2067} +No match + \x{2068} +No match + \x{2069} +No match + \x{3000} +No match + \x{e0002} +No match + \x{e001f} +No match + \x{e0080} +No match + +/^[[:print:]]+$/8W + Space: \x{a0} + 0: Space: \x{a0} + \x{1680}\x{2000}\x{2001}\x{2002}\x{2003}\x{2004}\x{2005} + 0: \x{1680}\x{2000}\x{2001}\x{2002}\x{2003}\x{2004}\x{2005} + \x{2006}\x{2007}\x{2008}\x{2009}\x{200a} + 0: \x{2006}\x{2007}\x{2008}\x{2009}\x{200a} + \x{202f}\x{205f} + 0: \x{202f}\x{205f} + \x{3000} + 0: \x{3000} + Letter:ABC + 0: Letter:ABC + Mark:\x{300}\x{1d172}\x{1d17b} + 0: Mark:\x{300}\x{1d172}\x{1d17b} + Number:9\x{660} + 0: Number:9\x{660} + Punctuation:\x{66a},; + 0: Punctuation:\x{66a},; + Symbol:\x{6de}<>\x{fffc} + 0: Symbol:\x{6de}<>\x{fffc} + Cf-property:\x{ad}\x{600}\x{601}\x{602}\x{603}\x{604}\x{6dd}\x{70f} + 0: Cf-property:\x{ad}\x{600}\x{601}\x{602}\x{603}\x{604}\x{6dd}\x{70f} + \x{180e} + 0: \x{180e} + \x{200b}\x{200c}\x{200d}\x{200e}\x{200f} + 0: \x{200b}\x{200c}\x{200d}\x{200e}\x{200f} + \x{202a}\x{202b}\x{202c}\x{202d}\x{202e} + 0: \x{202a}\x{202b}\x{202c}\x{202d}\x{202e} + \x{202f} + 0: \x{202f} + \x{2060}\x{2061}\x{2062}\x{2063}\x{2064} + 0: \x{2060}\x{2061}\x{2062}\x{2063}\x{2064} + \x{206a}\x{206b}\x{206c}\x{206d}\x{206e}\x{206f} + 0: \x{206a}\x{206b}\x{206c}\x{206d}\x{206e}\x{206f} + \x{feff} + 0: \x{feff} + \x{fff9}\x{fffa}\x{fffb} + 0: \x{fff9}\x{fffa}\x{fffb} + \x{110bd} + 0: \x{110bd} + \x{1d173}\x{1d174}\x{1d175}\x{1d176}\x{1d177}\x{1d178}\x{1d179}\x{1d17a} + 0: \x{1d173}\x{1d174}\x{1d175}\x{1d176}\x{1d177}\x{1d178}\x{1d179}\x{1d17a} + \x{e0001} + 0: \x{e0001} + \x{e0020}\x{e0030}\x{e0040}\x{e0050}\x{e0060}\x{e0070}\x{e007f} + 0: \x{e0020}\x{e0030}\x{e0040}\x{e0050}\x{e0060}\x{e0070}\x{e007f} + ** Failers + 0: ** Failers + \x{09} +No match + \x{1D} +No match + \x{85} +No match + \x{61c} +No match + \x{2028} +No match + \x{2029} +No match + \x{2065} +No match + \x{2066} +No match + \x{2067} +No match + \x{2068} +No match + \x{2069} +No match + \x{e0002} +No match + \x{e001f} +No match + \x{e0080} +No match + +/^[[:punct:]]+$/8W + \$+<=>^`|~ + 0: $+<=>^`|~ + !\"#%&'()*,-./:;?@[\\]_{} + 0: !"#%&'()*,-./:;?@[\]_{} + \x{a1}\x{a7} + 0: \x{a1}\x{a7} + \x{37e} + 0: \x{37e} + ** Failers +No match + abcde +No match + +/^[[:^graph:]]+$/8W + \x{09}\x{0a}\x{1D}\x{20}\x{85}\x{a0}\x{61c}\x{1680}\x{180e} + 0: \x{09}\x{0a}\x{1d} \x{85}\x{a0}\x{61c}\x{1680}\x{180e} + \x{2028}\x{2029}\x{202f}\x{2065}\x{2066}\x{2067}\x{2068}\x{2069} + 0: \x{2028}\x{2029}\x{202f}\x{2065}\x{2066}\x{2067}\x{2068}\x{2069} + \x{3000}\x{e0002}\x{e001f}\x{e0080} + 0: \x{3000}\x{e0002}\x{e001f}\x{e0080} + ** Failers +No match + Letter:ABC +No match + Mark:\x{300}\x{1d172}\x{1d17b} +No match + Number:9\x{660} +No match + Punctuation:\x{66a},; +No match + Symbol:\x{6de}<>\x{fffc} +No match + Cf-property:\x{ad}\x{600}\x{601}\x{602}\x{603}\x{604}\x{6dd}\x{70f} +No match + \x{200b}\x{200c}\x{200d}\x{200e}\x{200f} +No match + \x{202a}\x{202b}\x{202c}\x{202d}\x{202e} +No match + \x{2060}\x{2061}\x{2062}\x{2063}\x{2064} +No match + \x{206a}\x{206b}\x{206c}\x{206d}\x{206e}\x{206f} +No match + \x{feff} +No match + \x{fff9}\x{fffa}\x{fffb} +No match + \x{110bd} +No match + \x{1d173}\x{1d174}\x{1d175}\x{1d176}\x{1d177}\x{1d178}\x{1d179}\x{1d17a} +No match + \x{e0001} +No match + \x{e0020}\x{e0030}\x{e0040}\x{e0050}\x{e0060}\x{e0070}\x{e007f} +No match + +/^[[:^print:]]+$/8W + \x{09}\x{1D}\x{85}\x{61c}\x{2028}\x{2029}\x{2065}\x{2066}\x{2067} + 0: \x{09}\x{1d}\x{85}\x{61c}\x{2028}\x{2029}\x{2065}\x{2066}\x{2067} + \x{2068}\x{2069}\x{e0002}\x{e001f}\x{e0080} + 0: \x{2068}\x{2069}\x{e0002}\x{e001f}\x{e0080} + ** Failers +No match + Space: \x{a0} +No match + \x{1680}\x{2000}\x{2001}\x{2002}\x{2003}\x{2004}\x{2005} +No match + \x{2006}\x{2007}\x{2008}\x{2009}\x{200a} +No match + \x{202f}\x{205f} +No match + \x{3000} +No match + Letter:ABC +No match + Mark:\x{300}\x{1d172}\x{1d17b} +No match + Number:9\x{660} +No match + Punctuation:\x{66a},; +No match + Symbol:\x{6de}<>\x{fffc} +No match + Cf-property:\x{ad}\x{600}\x{601}\x{602}\x{603}\x{604}\x{6dd}\x{70f} +No match + \x{180e} +No match + \x{200b}\x{200c}\x{200d}\x{200e}\x{200f} +No match + \x{202a}\x{202b}\x{202c}\x{202d}\x{202e} +No match + \x{202f} +No match + \x{2060}\x{2061}\x{2062}\x{2063}\x{2064} +No match + \x{206a}\x{206b}\x{206c}\x{206d}\x{206e}\x{206f} +No match + \x{feff} +No match + \x{fff9}\x{fffa}\x{fffb} +No match + \x{110bd} +No match + \x{1d173}\x{1d174}\x{1d175}\x{1d176}\x{1d177}\x{1d178}\x{1d179}\x{1d17a} +No match + \x{e0001} +No match + \x{e0020}\x{e0030}\x{e0040}\x{e0050}\x{e0060}\x{e0070}\x{e007f} +No match + +/^[[:^punct:]]+$/8W + abcde + 0: abcde + ** Failers +No match + \$+<=>^`|~ +No match + !\"#%&'()*,-./:;?@[\\]_{} +No match + \x{a1}\x{a7} +No match + \x{37e} +No match + +/[RST]+/8iW + Ss\x{17f} + 0: Ss\x{17f} + +/[R-T]+/8iW + Ss\x{17f} + 0: Ss\x{17f} + +/[q-u]+/8iW + Ss\x{17f} + 0: Ss\x{17f} + +/^s?c/mi8 + scat + 0: sc + +/[A-`]/i8 + abcdefghijklmno + 0: a + +/\C\X*QT/8 + Ó…\x0aT +No match + +/[\pS#moq]/ + = + 0: = + +/[[:punct:]]/8W + \xc2\xb4 +No match + \x{b4} +No match + +/[[:^ascii:]]/8W + \x{100} + 0: \x{100} + \x{200} + 0: \x{200} + \x{300} + 0: \x{300} + \x{37e} + 0: \x{37e} + a +No match + 9 +No match + g +No match + +/[[:^ascii:]\w]/8W + a + 0: a + 9 + 0: 9 + g + 0: g + \x{100} + 0: \x{100} + \x{200} + 0: \x{200} + \x{300} + 0: \x{300} + \x{37e} + 0: \x{37e} + +/[\w[:^ascii:]]/8W + a + 0: a + 9 + 0: 9 + g + 0: g + \x{100} + 0: \x{100} + \x{200} + 0: \x{200} + \x{300} + 0: \x{300} + \x{37e} + 0: \x{37e} + +/[^[:ascii:]\W]/8W + a +No match + 9 +No match + g +No match + \x{100} + 0: \x{100} + \x{200} + 0: \x{200} + \x{300} +No match + \x{37e} +No match + +/[[:^ascii:]a]/8W + a + 0: a + 9 +No match + g +No match + \x{100} + 0: \x{100} + \x{200} + 0: \x{200} + \x{37e} + 0: \x{37e} + +/[^[:^ascii:]\d]/8W + a + 0: a + ~ + 0: ~ + 0 +No match + \a + 0: \x{07} + \x{7f} + 0: \x{7f} + \x{389} +No match + \x{20ac} +No match + +/(?=.*b)\pL/ + 11bb + 0: b + +/(?(?=.*b)(?=.*b)\pL|.*c)/ + 11bb + 0: b + +/-- End of testinput6 --/ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput7 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput7 new file mode 100755 index 000000000..2b167b28d --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput7 @@ -0,0 +1,2345 @@ +/-- These tests for Unicode property support test PCRE's API and show some of + the compiled code. They are not Perl-compatible. --/ + +/[\p{L}]/DZ +------------------------------------------------------------------ + Bra + [\p{L}] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +No need char + +/[\p{^L}]/DZ +------------------------------------------------------------------ + Bra + [\P{L}] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +No need char + +/[\P{L}]/DZ +------------------------------------------------------------------ + Bra + [\P{L}] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +No need char + +/[\P{^L}]/DZ +------------------------------------------------------------------ + Bra + [\p{L}] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +No need char + +/[abc\p{L}\x{0660}]/8DZ +------------------------------------------------------------------ + Bra + [a-c\p{L}\x{660}] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +No first char +No need char + +/[\p{Nd}]/8DZ +------------------------------------------------------------------ + Bra + [\p{Nd}] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +No first char +No need char + 1234 + 0: 1 + +/[\p{Nd}+-]+/8DZ +------------------------------------------------------------------ + Bra + [+\-\p{Nd}]++ + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf +No first char +No need char + 1234 + 0: 1234 + 12-34 + 0: 12-34 + 12+\x{661}-34 + 0: 12+\x{661}-34 + ** Failers +No match + abcd +No match + +/[\x{105}-\x{109}]/8iDZ +------------------------------------------------------------------ + Bra + [\x{104}-\x{109}] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: caseless utf +No first char +No need char + \x{104} + 0: \x{104} + \x{105} + 0: \x{105} + \x{109} + 0: \x{109} + ** Failers +No match + \x{100} +No match + \x{10a} +No match + +/[z-\x{100}]/8iDZ +------------------------------------------------------------------ + Bra + [Zz-\xff\x{39c}\x{3bc}\x{212b}\x{1e9e}\x{212b}\x{178}\x{100}-\x{101}] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: caseless utf +No first char +No need char + Z + 0: Z + z + 0: z + \x{39c} + 0: \x{39c} + \x{178} + 0: \x{178} + | + 0: | + \x{80} + 0: \x{80} + \x{ff} + 0: \x{ff} + \x{100} + 0: \x{100} + \x{101} + 0: \x{101} + ** Failers +No match + \x{102} +No match + Y +No match + y +No match + +/[z-\x{100}]/8DZi +------------------------------------------------------------------ + Bra + [Zz-\xff\x{39c}\x{3bc}\x{212b}\x{1e9e}\x{212b}\x{178}\x{100}-\x{101}] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: caseless utf +No first char +No need char + +/(?:[\PPa*]*){8,}/ + +/[\P{Any}]/BZ +------------------------------------------------------------------ + Bra + [\P{Any}] + Ket + End +------------------------------------------------------------------ + +/[\P{Any}\E]/BZ +------------------------------------------------------------------ + Bra + [\P{Any}] + Ket + End +------------------------------------------------------------------ + +/(\P{Yi}+\277)/ + +/(\P{Yi}+\277)?/ + +/(?<=\P{Yi}{3}A)X/ + +/\p{Yi}+(\P{Yi}+)(?1)/ + +/(\P{Yi}{2}\277)?/ + +/[\P{Yi}A]/ + +/[\P{Yi}\P{Yi}\P{Yi}A]/ + +/[^\P{Yi}A]/ + +/[^\P{Yi}\P{Yi}\P{Yi}A]/ + +/(\P{Yi}*\277)*/ + +/(\P{Yi}*?\277)*/ + +/(\p{Yi}*+\277)*/ + +/(\P{Yi}?\277)*/ + +/(\P{Yi}??\277)*/ + +/(\p{Yi}?+\277)*/ + +/(\P{Yi}{0,3}\277)*/ + +/(\P{Yi}{0,3}?\277)*/ + +/(\p{Yi}{0,3}+\277)*/ + +/\p{Zl}{2,3}+/8BZ +------------------------------------------------------------------ + Bra + prop Zl {2} + prop Zl ?+ + Ket + End +------------------------------------------------------------------ + 

 + 0: \x{2028}\x{2028} + \x{2028}\x{2028}\x{2028} + 0: \x{2028}\x{2028}\x{2028} + +/\p{Zl}/8BZ +------------------------------------------------------------------ + Bra + prop Zl + Ket + End +------------------------------------------------------------------ + +/\p{Lu}{3}+/8BZ +------------------------------------------------------------------ + Bra + prop Lu {3} + Ket + End +------------------------------------------------------------------ + +/\pL{2}+/8BZ +------------------------------------------------------------------ + Bra + prop L {2} + Ket + End +------------------------------------------------------------------ + +/\p{Cc}{2}+/8BZ +------------------------------------------------------------------ + Bra + prop Cc {2} + Ket + End +------------------------------------------------------------------ + +/^\p{Cf}/8 + \x{180e} + 0: \x{180e} + \x{061c} + 0: \x{61c} + \x{2066} + 0: \x{2066} + \x{2067} + 0: \x{2067} + \x{2068} + 0: \x{2068} + \x{2069} + 0: \x{2069} + +/^\p{Cs}/8 + \?\x{dfff} + 0: \x{dfff} + ** Failers +No match + \x{09f} +No match + +/^\p{Mn}/8 + \x{1a1b} + 0: \x{1a1b} + +/^\p{Pe}/8 + \x{2309} + 0: \x{2309} + \x{230b} + 0: \x{230b} + +/^\p{Ps}/8 + \x{2308} + 0: \x{2308} + \x{230a} + 0: \x{230a} + +/^\p{Sc}+/8 + $\x{a2}\x{a3}\x{a4}\x{a5}\x{a6} + 0: $\x{a2}\x{a3}\x{a4}\x{a5} + \x{9f2} + 0: \x{9f2} + ** Failers +No match + X +No match + \x{2c2} +No match + +/^\p{Zs}/8 + \ \ + 0: + \x{a0} + 0: \x{a0} + \x{1680} + 0: \x{1680} + \x{2000} + 0: \x{2000} + \x{2001} + 0: \x{2001} + ** Failers +No match + \x{2028} +No match + \x{200d} +No match + +/-- These are here rather than in test 6 because Perl has problems with + the negative versions of the properties and behaves has changed how + it behaves for caseless matching. --/ + +/\p{^Lu}/8i + 1234 + 0: 1 + ** Failers + 0: * + ABC +No match + +/\P{Lu}/8i + 1234 + 0: 1 + ** Failers + 0: * + ABC +No match + +/\p{Ll}/8i + a + 0: a + Az + 0: z + ** Failers + 0: a + ABC +No match + +/\p{Lu}/8i + A + 0: A + a\x{10a0}B + 0: \x{10a0} + ** Failers + 0: F + a +No match + \x{1d00} +No match + +/\p{Lu}/8i + A + 0: A + aZ + 0: Z + ** Failers + 0: F + abc +No match + +/[\x{c0}\x{391}]/8i + \x{c0} + 0: \x{c0} + \x{e0} + 0: \x{e0} + +/-- The next two are special cases where the lengths of the different cases of +the same character differ. The first went wrong with heap frame storage; the +second was broken in all cases. --/ + +/^\x{023a}+?(\x{0130}+)/8i + \x{023a}\x{2c65}\x{0130} + 0: \x{23a}\x{2c65}\x{130} + 1: \x{130} + +/^\x{023a}+([^X])/8i + \x{023a}\x{2c65}X + 0: \x{23a}\x{2c65} + 1: \x{2c65} + +/\x{c0}+\x{116}+/8i + \x{c0}\x{e0}\x{116}\x{117} + 0: \x{c0}\x{e0}\x{116}\x{117} + +/[\x{c0}\x{116}]+/8i + \x{c0}\x{e0}\x{116}\x{117} + 0: \x{c0}\x{e0}\x{116}\x{117} + +/(\x{de})\1/8i + \x{de}\x{de} + 0: \x{de}\x{de} + 1: \x{de} + \x{de}\x{fe} + 0: \x{de}\x{fe} + 1: \x{de} + \x{fe}\x{fe} + 0: \x{fe}\x{fe} + 1: \x{fe} + \x{fe}\x{de} + 0: \x{fe}\x{de} + 1: \x{fe} + +/^\x{c0}$/8i + \x{c0} + 0: \x{c0} + \x{e0} + 0: \x{e0} + +/^\x{e0}$/8i + \x{c0} + 0: \x{c0} + \x{e0} + 0: \x{e0} + +/-- The next two should be Perl-compatible, but it fails to match \x{e0}. PCRE +will match it only with UCP support, because without that it has no notion +of case for anything other than the ASCII letters. --/ + +/((?i)[\x{c0}])/8 + \x{c0} + 0: \x{c0} + 1: \x{c0} + \x{e0} + 0: \x{e0} + 1: \x{e0} + +/(?i:[\x{c0}])/8 + \x{c0} + 0: \x{c0} + \x{e0} + 0: \x{e0} + +/-- These are PCRE's extra properties to help with Unicodizing \d etc. --/ + +/^\p{Xan}/8 + ABCD + 0: A + 1234 + 0: 1 + \x{6ca} + 0: \x{6ca} + \x{a6c} + 0: \x{a6c} + \x{10a7} + 0: \x{10a7} + ** Failers +No match + _ABC +No match + +/^\p{Xan}+/8 + ABCD1234\x{6ca}\x{a6c}\x{10a7}_ + 0: ABCD1234\x{6ca}\x{a6c}\x{10a7} + ** Failers +No match + _ABC +No match + +/^\p{Xan}+?/8 + \x{6ca}\x{a6c}\x{10a7}_ + 0: \x{6ca} + +/^\p{Xan}*/8 + ABCD1234\x{6ca}\x{a6c}\x{10a7}_ + 0: ABCD1234\x{6ca}\x{a6c}\x{10a7} + +/^\p{Xan}{2,9}/8 + ABCD1234\x{6ca}\x{a6c}\x{10a7}_ + 0: ABCD1234\x{6ca} + +/^\p{Xan}{2,9}?/8 + \x{6ca}\x{a6c}\x{10a7}_ + 0: \x{6ca}\x{a6c} + +/^[\p{Xan}]/8 + ABCD1234_ + 0: A + 1234abcd_ + 0: 1 + \x{6ca} + 0: \x{6ca} + \x{a6c} + 0: \x{a6c} + \x{10a7} + 0: \x{10a7} + ** Failers +No match + _ABC +No match + +/^[\p{Xan}]+/8 + ABCD1234\x{6ca}\x{a6c}\x{10a7}_ + 0: ABCD1234\x{6ca}\x{a6c}\x{10a7} + ** Failers +No match + _ABC +No match + +/^>\p{Xsp}/8 + >\x{1680}\x{2028}\x{0b} + 0: >\x{1680} + >\x{a0} + 0: >\x{a0} + ** Failers +No match + \x{0b} +No match + +/^>\p{Xsp}+/8 + > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + +/^>\p{Xsp}+?/8 + >\x{1680}\x{2028}\x{0b} + 0: >\x{1680} + +/^>\p{Xsp}*/8 + > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + +/^>\p{Xsp}{2,9}/8 + > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + +/^>\p{Xsp}{2,9}?/8 + > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + 0: > \x{09} + +/^>[\p{Xsp}]/8 + >\x{2028}\x{0b} + 0: >\x{2028} + +/^>[\p{Xsp}]+/8 + > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + +/^>\p{Xps}/8 + >\x{1680}\x{2028}\x{0b} + 0: >\x{1680} + >\x{a0} + 0: >\x{a0} + ** Failers +No match + \x{0b} +No match + +/^>\p{Xps}+/8 + > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + +/^>\p{Xps}+?/8 + >\x{1680}\x{2028}\x{0b} + 0: >\x{1680} + +/^>\p{Xps}*/8 + > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + +/^>\p{Xps}{2,9}/8 + > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + +/^>\p{Xps}{2,9}?/8 + > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + 0: > \x{09} + +/^>[\p{Xps}]/8 + >\x{2028}\x{0b} + 0: >\x{2028} + +/^>[\p{Xps}]+/8 + > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + 0: > \x{09}\x{0a}\x{0c}\x{0d}\x{a0}\x{1680}\x{2028}\x{0b} + +/^\p{Xwd}/8 + ABCD + 0: A + 1234 + 0: 1 + \x{6ca} + 0: \x{6ca} + \x{a6c} + 0: \x{a6c} + \x{10a7} + 0: \x{10a7} + _ABC + 0: _ + ** Failers +No match + [] +No match + +/^\p{Xwd}+/8 + ABCD1234\x{6ca}\x{a6c}\x{10a7}_ + 0: ABCD1234\x{6ca}\x{a6c}\x{10a7}_ + +/^\p{Xwd}+?/8 + \x{6ca}\x{a6c}\x{10a7}_ + 0: \x{6ca} + +/^\p{Xwd}*/8 + ABCD1234\x{6ca}\x{a6c}\x{10a7}_ + 0: ABCD1234\x{6ca}\x{a6c}\x{10a7}_ + +/^\p{Xwd}{2,9}/8 + A_B12\x{6ca}\x{a6c}\x{10a7} + 0: A_B12\x{6ca}\x{a6c}\x{10a7} + +/^\p{Xwd}{2,9}?/8 + \x{6ca}\x{a6c}\x{10a7}_ + 0: \x{6ca}\x{a6c} + +/^[\p{Xwd}]/8 + ABCD1234_ + 0: A + 1234abcd_ + 0: 1 + \x{6ca} + 0: \x{6ca} + \x{a6c} + 0: \x{a6c} + \x{10a7} + 0: \x{10a7} + _ABC + 0: _ + ** Failers +No match + [] +No match + +/^[\p{Xwd}]+/8 + ABCD1234\x{6ca}\x{a6c}\x{10a7}_ + 0: ABCD1234\x{6ca}\x{a6c}\x{10a7}_ + +/-- A check not in UTF-8 mode --/ + +/^[\p{Xwd}]+/ + ABCD1234_ + 0: ABCD1234_ + +/-- Some negative checks --/ + +/^[\P{Xwd}]+/8 + !.+\x{019}\x{35a}AB + 0: !.+\x{19}\x{35a} + +/^[\p{^Xwd}]+/8 + !.+\x{019}\x{35a}AB + 0: !.+\x{19}\x{35a} + +/[\D]/WBZ8 +------------------------------------------------------------------ + Bra + [\P{Nd}] + Ket + End +------------------------------------------------------------------ + 1\x{3c8}2 + 0: \x{3c8} + +/[\d]/WBZ8 +------------------------------------------------------------------ + Bra + [\p{Nd}] + Ket + End +------------------------------------------------------------------ + >\x{6f4}< + 0: \x{6f4} + +/[\S]/WBZ8 +------------------------------------------------------------------ + Bra + [\P{Xsp}] + Ket + End +------------------------------------------------------------------ + \x{1680}\x{6f4}\x{1680} + 0: \x{6f4} + +/[\s]/WBZ8 +------------------------------------------------------------------ + Bra + [\p{Xsp}] + Ket + End +------------------------------------------------------------------ + >\x{1680}< + 0: \x{1680} + +/[\W]/WBZ8 +------------------------------------------------------------------ + Bra + [\P{Xwd}] + Ket + End +------------------------------------------------------------------ + A\x{1712}B + 0: \x{1712} + +/[\w]/WBZ8 +------------------------------------------------------------------ + Bra + [\p{Xwd}] + Ket + End +------------------------------------------------------------------ + >\x{1723}< + 0: \x{1723} + +/\D/WBZ8 +------------------------------------------------------------------ + Bra + notprop Nd + Ket + End +------------------------------------------------------------------ + 1\x{3c8}2 + 0: \x{3c8} + +/\d/WBZ8 +------------------------------------------------------------------ + Bra + prop Nd + Ket + End +------------------------------------------------------------------ + >\x{6f4}< + 0: \x{6f4} + +/\S/WBZ8 +------------------------------------------------------------------ + Bra + notprop Xsp + Ket + End +------------------------------------------------------------------ + \x{1680}\x{6f4}\x{1680} + 0: \x{6f4} + +/\s/WBZ8 +------------------------------------------------------------------ + Bra + prop Xsp + Ket + End +------------------------------------------------------------------ + >\x{1680}> + 0: \x{1680} + +/\W/WBZ8 +------------------------------------------------------------------ + Bra + notprop Xwd + Ket + End +------------------------------------------------------------------ + A\x{1712}B + 0: \x{1712} + +/\w/WBZ8 +------------------------------------------------------------------ + Bra + prop Xwd + Ket + End +------------------------------------------------------------------ + >\x{1723}< + 0: \x{1723} + +/[[:alpha:]]/WBZ +------------------------------------------------------------------ + Bra + [\p{L}] + Ket + End +------------------------------------------------------------------ + +/[[:lower:]]/WBZ +------------------------------------------------------------------ + Bra + [\p{Ll}] + Ket + End +------------------------------------------------------------------ + +/[[:upper:]]/WBZ +------------------------------------------------------------------ + Bra + [\p{Lu}] + Ket + End +------------------------------------------------------------------ + +/[[:alnum:]]/WBZ +------------------------------------------------------------------ + Bra + [\p{Xan}] + Ket + End +------------------------------------------------------------------ + +/[[:ascii:]]/WBZ +------------------------------------------------------------------ + Bra + [\x00-\x7f] + Ket + End +------------------------------------------------------------------ + +/[[:cntrl:]]/WBZ +------------------------------------------------------------------ + Bra + [\x00-\x1f\x7f] + Ket + End +------------------------------------------------------------------ + +/[[:digit:]]/WBZ +------------------------------------------------------------------ + Bra + [\p{Nd}] + Ket + End +------------------------------------------------------------------ + +/[[:graph:]]/WBZ +------------------------------------------------------------------ + Bra + [[:graph:]] + Ket + End +------------------------------------------------------------------ + +/[[:print:]]/WBZ +------------------------------------------------------------------ + Bra + [[:print:]] + Ket + End +------------------------------------------------------------------ + +/[[:punct:]]/WBZ +------------------------------------------------------------------ + Bra + [[:punct:]] + Ket + End +------------------------------------------------------------------ + +/[[:space:]]/WBZ +------------------------------------------------------------------ + Bra + [\p{Xps}] + Ket + End +------------------------------------------------------------------ + +/[[:word:]]/WBZ +------------------------------------------------------------------ + Bra + [\p{Xwd}] + Ket + End +------------------------------------------------------------------ + +/[[:xdigit:]]/WBZ +------------------------------------------------------------------ + Bra + [0-9A-Fa-f] + Ket + End +------------------------------------------------------------------ + +/-- Unicode properties for \b abd \B --/ + +/\b...\B/8W + abc_ + 0: abc + \x{37e}abc\x{376} + 0: abc + \x{37e}\x{376}\x{371}\x{393}\x{394} + 0: \x{376}\x{371}\x{393} + !\x{c0}++\x{c1}\x{c2} + 0: ++\x{c1} + !\x{c0}+++++ + 0: \x{c0}++ + +/-- Without PCRE_UCP, non-ASCII always fail, even if < 256 --/ + +/\b...\B/8 + abc_ + 0: abc + ** Failers + 0: Fai + \x{37e}abc\x{376} +No match + \x{37e}\x{376}\x{371}\x{393}\x{394} +No match + !\x{c0}++\x{c1}\x{c2} +No match + !\x{c0}+++++ +No match + +/-- With PCRE_UCP, non-UTF8 chars that are < 256 still check properties --/ + +/\b...\B/W + abc_ + 0: abc + !\x{c0}++\x{c1}\x{c2} + 0: ++\xc1 + !\x{c0}+++++ + 0: \xc0++ + +/-- Some of these are silly, but they check various combinations --/ + +/[[:^alpha:][:^cntrl:]]+/8WBZ +------------------------------------------------------------------ + Bra + [ -~\x80-\xff\P{L}\x{100}-\x{10ffff}]++ + Ket + End +------------------------------------------------------------------ + 123 + 0: 123 + abc + 0: abc + +/[[:^cntrl:][:^alpha:]]+/8WBZ +------------------------------------------------------------------ + Bra + [ -~\x80-\xff\x{100}-\x{10ffff}\P{L}]++ + Ket + End +------------------------------------------------------------------ + 123 + 0: 123 + abc + 0: abc + +/[[:alpha:]]+/8WBZ +------------------------------------------------------------------ + Bra + [\p{L}]++ + Ket + End +------------------------------------------------------------------ + abc + 0: abc + +/[[:^alpha:]\S]+/8WBZ +------------------------------------------------------------------ + Bra + [\P{L}\P{Xsp}]++ + Ket + End +------------------------------------------------------------------ + 123 + 0: 123 + abc + 0: abc + +/[^\d]+/8WBZ +------------------------------------------------------------------ + Bra + [^\p{Nd}]++ + Ket + End +------------------------------------------------------------------ + abc123 + 0: abc + abc\x{123} + 0: abc\x{123} + \x{660}abc + 0: abc + +/\p{Lu}+9\p{Lu}+B\p{Lu}+b/BZ +------------------------------------------------------------------ + Bra + prop Lu ++ + 9 + prop Lu + + B + prop Lu ++ + b + Ket + End +------------------------------------------------------------------ + +/\p{^Lu}+9\p{^Lu}+B\p{^Lu}+b/BZ +------------------------------------------------------------------ + Bra + notprop Lu + + 9 + notprop Lu ++ + B + notprop Lu + + b + Ket + End +------------------------------------------------------------------ + +/\P{Lu}+9\P{Lu}+B\P{Lu}+b/BZ +------------------------------------------------------------------ + Bra + notprop Lu + + 9 + notprop Lu ++ + B + notprop Lu + + b + Ket + End +------------------------------------------------------------------ + +/\p{Han}+X\p{Greek}+\x{370}/BZ8 +------------------------------------------------------------------ + Bra + prop Han ++ + X + prop Greek + + \x{370} + Ket + End +------------------------------------------------------------------ + +/\p{Xan}+!\p{Xan}+A/BZ +------------------------------------------------------------------ + Bra + prop Xan ++ + ! + prop Xan + + A + Ket + End +------------------------------------------------------------------ + +/\p{Xsp}+!\p{Xsp}\t/BZ +------------------------------------------------------------------ + Bra + prop Xsp ++ + ! + prop Xsp + \x09 + Ket + End +------------------------------------------------------------------ + +/\p{Xps}+!\p{Xps}\t/BZ +------------------------------------------------------------------ + Bra + prop Xps ++ + ! + prop Xps + \x09 + Ket + End +------------------------------------------------------------------ + +/\p{Xwd}+!\p{Xwd}_/BZ +------------------------------------------------------------------ + Bra + prop Xwd ++ + ! + prop Xwd + _ + Ket + End +------------------------------------------------------------------ + +/A+\p{N}A+\dB+\p{N}*B+\d*/WBZ +------------------------------------------------------------------ + Bra + A++ + prop N + A++ + prop Nd + B+ + prop N *+ + B++ + prop Nd *+ + Ket + End +------------------------------------------------------------------ + +/-- These behaved oddly in Perl, so they are kept in this test --/ + +/(\x{23a}\x{23a}\x{23a})?\1/8i + \x{23a}\x{23a}\x{23a}\x{2c65}\x{2c65} +No match + +/(ȺȺȺ)?\1/8i + ȺȺȺⱥⱥ +No match + +/(\x{23a}\x{23a}\x{23a})?\1/8i + \x{23a}\x{23a}\x{23a}\x{2c65}\x{2c65}\x{2c65} + 0: \x{23a}\x{23a}\x{23a}\x{2c65}\x{2c65}\x{2c65} + 1: \x{23a}\x{23a}\x{23a} + +/(ȺȺȺ)?\1/8i + ȺȺȺⱥⱥⱥ + 0: \x{23a}\x{23a}\x{23a}\x{2c65}\x{2c65}\x{2c65} + 1: \x{23a}\x{23a}\x{23a} + +/(\x{23a}\x{23a}\x{23a})\1/8i + \x{23a}\x{23a}\x{23a}\x{2c65}\x{2c65} +No match + +/(ȺȺȺ)\1/8i + ȺȺȺⱥⱥ +No match + +/(\x{23a}\x{23a}\x{23a})\1/8i + \x{23a}\x{23a}\x{23a}\x{2c65}\x{2c65}\x{2c65} + 0: \x{23a}\x{23a}\x{23a}\x{2c65}\x{2c65}\x{2c65} + 1: \x{23a}\x{23a}\x{23a} + +/(ȺȺȺ)\1/8i + ȺȺȺⱥⱥⱥ + 0: \x{23a}\x{23a}\x{23a}\x{2c65}\x{2c65}\x{2c65} + 1: \x{23a}\x{23a}\x{23a} + +/(\x{2c65}\x{2c65})\1/8i + \x{2c65}\x{2c65}\x{23a}\x{23a} + 0: \x{2c65}\x{2c65}\x{23a}\x{23a} + 1: \x{2c65}\x{2c65} + +/(ⱥⱥ)\1/8i + ⱥⱥȺȺ + 0: \x{2c65}\x{2c65}\x{23a}\x{23a} + 1: \x{2c65}\x{2c65} + +/(\x{23a}\x{23a}\x{23a})\1Y/8i + X\x{23a}\x{23a}\x{23a}\x{2c65}\x{2c65}\x{2c65}YZ + 0: \x{23a}\x{23a}\x{23a}\x{2c65}\x{2c65}\x{2c65}Y + 1: \x{23a}\x{23a}\x{23a} + +/(\x{2c65}\x{2c65})\1Y/8i + X\x{2c65}\x{2c65}\x{23a}\x{23a}YZ + 0: \x{2c65}\x{2c65}\x{23a}\x{23a}Y + 1: \x{2c65}\x{2c65} + +/-- --/ + +/-- These scripts weren't yet in Perl when I added Unicode 6.0.0 to PCRE --/ + +/^[\p{Batak}]/8 + \x{1bc0} + 0: \x{1bc0} + \x{1bff} + 0: \x{1bff} + ** Failers +No match + \x{1bf4} +No match + +/^[\p{Brahmi}]/8 + \x{11000} + 0: \x{11000} + \x{1106f} + 0: \x{1106f} + ** Failers +No match + \x{1104e} +No match + +/^[\p{Mandaic}]/8 + \x{840} + 0: \x{840} + \x{85e} + 0: \x{85e} + ** Failers +No match + \x{85c} +No match + \x{85d} +No match + +/-- --/ + +/(\X*)(.)/s8 + A\x{300} + 0: A + 1: + 2: A + +/^S(\X*)e(\X*)$/8 + SteÌreÌo + 0: Ste\x{301}re\x{301}o + 1: te\x{301}r + 2: \x{301}o + +/^\X/8 + ÌreÌo + 0: \x{301} + +/^a\X41z/ + aX41z + 0: aX41z + *** Failers +No match + aAz +No match + +/(?<=ab\Cde)X/8 +Failed: \C not allowed in lookbehind assertion at offset 10 + +/\X/ + a\P + 0: a + a\P\P +Partial match: a + +/\Xa/ + aa\P + 0: aa + aa\P\P + 0: aa + +/\X{2}/ + aa\P + 0: aa + aa\P\P +Partial match: aa + +/\X+a/ + a\P +Partial match: a + aa\P + 0: aa + aa\P\P +Partial match: aa + +/\X+?a/ + a\P +Partial match: a + ab\P +Partial match: ab + aa\P + 0: aa + aa\P\P + 0: aa + aba\P + 0: aba + +/-- These Unicode 6.1.0 scripts are not known to Perl. --/ + +/\p{Chakma}\d/8W + \x{11100}\x{1113c} + 0: \x{11100}\x{1113c} + +/\p{Takri}\d/8W + \x{11680}\x{116c0} + 0: \x{11680}\x{116c0} + +/^\X/8 + A\P + 0: A + A\P\P +Partial match: A + A\x{300}\x{301}\P + 0: A\x{300}\x{301} + A\x{300}\x{301}\P\P +Partial match: A\x{300}\x{301} + A\x{301}\P + 0: A\x{301} + A\x{301}\P\P +Partial match: A\x{301} + +/^\X{2,3}/8 + A\P +Partial match: A + A\P\P +Partial match: A + AA\P + 0: AA + AA\P\P +Partial match: AA + A\x{300}\x{301}\P +Partial match: A\x{300}\x{301} + A\x{300}\x{301}\P\P +Partial match: A\x{300}\x{301} + A\x{300}\x{301}A\x{300}\x{301}\P + 0: A\x{300}\x{301}A\x{300}\x{301} + A\x{300}\x{301}A\x{300}\x{301}\P\P +Partial match: A\x{300}\x{301}A\x{300}\x{301} + +/^\X{2}/8 + AA\P + 0: AA + AA\P\P +Partial match: AA + A\x{300}\x{301}A\x{300}\x{301}\P + 0: A\x{300}\x{301}A\x{300}\x{301} + A\x{300}\x{301}A\x{300}\x{301}\P\P +Partial match: A\x{300}\x{301}A\x{300}\x{301} + +/^\X+/8 + AA\P + 0: AA + AA\P\P +Partial match: AA + +/^\X+?Z/8 + AA\P +Partial match: AA + AA\P\P +Partial match: AA + +/A\x{3a3}B/8iDZ +------------------------------------------------------------------ + Bra + /i A + clist 03a3 03c2 03c3 + /i B + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: caseless utf +First char = 'A' (caseless) +Need char = 'B' (caseless) + +/\x{3a3}B/8iDZ +------------------------------------------------------------------ + Bra + clist 03a3 03c2 03c3 + /i B + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: caseless utf +No first char +Need char = 'B' (caseless) + +/[\x{3a3}]/8iBZ +------------------------------------------------------------------ + Bra + clist 03a3 03c2 03c3 + Ket + End +------------------------------------------------------------------ + +/[^\x{3a3}]/8iBZ +------------------------------------------------------------------ + Bra + not clist 03a3 03c2 03c3 + Ket + End +------------------------------------------------------------------ + +/[\x{3a3}]+/8iBZ +------------------------------------------------------------------ + Bra + clist 03a3 03c2 03c3 ++ + Ket + End +------------------------------------------------------------------ + +/[^\x{3a3}]+/8iBZ +------------------------------------------------------------------ + Bra + not clist 03a3 03c2 03c3 ++ + Ket + End +------------------------------------------------------------------ + +/a*\x{3a3}/8iBZ +------------------------------------------------------------------ + Bra + /i a*+ + clist 03a3 03c2 03c3 + Ket + End +------------------------------------------------------------------ + +/\x{3a3}+a/8iBZ +------------------------------------------------------------------ + Bra + clist 03a3 03c2 03c3 ++ + /i a + Ket + End +------------------------------------------------------------------ + +/\x{3a3}*\x{3c2}/8iBZ +------------------------------------------------------------------ + Bra + clist 03a3 03c2 03c3 * + clist 03a3 03c2 03c3 + Ket + End +------------------------------------------------------------------ + +/\x{3a3}{3}/8i+ + \x{3a3}\x{3c3}\x{3c2}\x{3a3}\x{3c3}\x{3c2} + 0: \x{3a3}\x{3c3}\x{3c2} + 0+ \x{3a3}\x{3c3}\x{3c2} + +/\x{3a3}{2,4}/8i+ + \x{3a3}\x{3c3}\x{3c2}\x{3a3}\x{3c3}\x{3c2} + 0: \x{3a3}\x{3c3}\x{3c2}\x{3a3} + 0+ \x{3c3}\x{3c2} + +/\x{3a3}{2,4}?/8i+ + \x{3a3}\x{3c3}\x{3c2}\x{3a3}\x{3c3}\x{3c2} + 0: \x{3a3}\x{3c3} + 0+ \x{3c2}\x{3a3}\x{3c3}\x{3c2} + +/\x{3a3}+./8i+ + \x{3a3}\x{3c3}\x{3c2}\x{3a3}\x{3c3}\x{3c2} + 0: \x{3a3}\x{3c3}\x{3c2}\x{3a3}\x{3c3}\x{3c2} + 0+ + +/\x{3a3}++./8i+ + ** Failers +No match + \x{3a3}\x{3c3}\x{3c2}\x{3a3}\x{3c3}\x{3c2} +No match + +/\x{3a3}*\x{3c2}/8iBZ +------------------------------------------------------------------ + Bra + clist 03a3 03c2 03c3 * + clist 03a3 03c2 03c3 + Ket + End +------------------------------------------------------------------ + +/[^\x{3a3}]*\x{3c2}/8iBZ +------------------------------------------------------------------ + Bra + not clist 03a3 03c2 03c3 *+ + clist 03a3 03c2 03c3 + Ket + End +------------------------------------------------------------------ + +/[^a]*\x{3c2}/8iBZ +------------------------------------------------------------------ + Bra + /i [^a]* + clist 03a3 03c2 03c3 + Ket + End +------------------------------------------------------------------ + +/ist/8iBZ +------------------------------------------------------------------ + Bra + /i i + clist 0053 0073 017f + /i t + Ket + End +------------------------------------------------------------------ + ikt +No match + +/is+t/8i + iSs\x{17f}t + 0: iSs\x{17f}t + ikt +No match + +/is+?t/8i + ikt +No match + +/is?t/8i + ikt +No match + +/is{2}t/8i + iskt +No match + +/-- This property is a PCRE special --/ + +/^\p{Xuc}/8 + $abc + 0: $ + @abc + 0: @ + `abc + 0: ` + \x{1234}abc + 0: \x{1234} + ** Failers +No match + abc +No match + +/^\p{Xuc}+/8 + $@`\x{a0}\x{1234}\x{e000}** + 0: $@`\x{a0}\x{1234}\x{e000} + ** Failers +No match + \x{9f} +No match + +/^\p{Xuc}+?/8 + $@`\x{a0}\x{1234}\x{e000}** + 0: $ + ** Failers +No match + \x{9f} +No match + +/^\p{Xuc}+?\*/8 + $@`\x{a0}\x{1234}\x{e000}** + 0: $@`\x{a0}\x{1234}\x{e000}* + ** Failers +No match + \x{9f} +No match + +/^\p{Xuc}++/8 + $@`\x{a0}\x{1234}\x{e000}** + 0: $@`\x{a0}\x{1234}\x{e000} + ** Failers +No match + \x{9f} +No match + +/^\p{Xuc}{3,5}/8 + $@`\x{a0}\x{1234}\x{e000}** + 0: $@`\x{a0}\x{1234} + ** Failers +No match + \x{9f} +No match + +/^\p{Xuc}{3,5}?/8 + $@`\x{a0}\x{1234}\x{e000}** + 0: $@` + ** Failers +No match + \x{9f} +No match + +/^[\p{Xuc}]/8 + $@`\x{a0}\x{1234}\x{e000}** + 0: $ + ** Failers +No match + \x{9f} +No match + +/^[\p{Xuc}]+/8 + $@`\x{a0}\x{1234}\x{e000}** + 0: $@`\x{a0}\x{1234}\x{e000} + ** Failers +No match + \x{9f} +No match + +/^\P{Xuc}/8 + abc + 0: a + ** Failers + 0: * + $abc +No match + @abc +No match + `abc +No match + \x{1234}abc +No match + +/^[\P{Xuc}]/8 + abc + 0: a + ** Failers + 0: * + $abc +No match + @abc +No match + `abc +No match + \x{1234}abc +No match + +/-- Some auto-possessification tests --/ + +/\pN+\z/BZ +------------------------------------------------------------------ + Bra + prop N ++ + \z + Ket + End +------------------------------------------------------------------ + +/\PN+\z/BZ +------------------------------------------------------------------ + Bra + notprop N ++ + \z + Ket + End +------------------------------------------------------------------ + +/\pN+/BZ +------------------------------------------------------------------ + Bra + prop N ++ + Ket + End +------------------------------------------------------------------ + +/\PN+/BZ +------------------------------------------------------------------ + Bra + notprop N ++ + Ket + End +------------------------------------------------------------------ + +/\p{Any}+\p{Any} \p{Any}+\P{Any} \p{Any}+\p{L&} \p{Any}+\p{L} \p{Any}+\p{Lu} \p{Any}+\p{Han} \p{Any}+\p{Xan} \p{Any}+\p{Xsp} \p{Any}+\p{Xps} \p{Xwd}+\p{Any} \p{Any}+\p{Xuc}/BWZx +------------------------------------------------------------------ + Bra + prop Any + + prop Any + prop Any + + notprop Any + prop Any + + prop L& + prop Any + + prop L + prop Any + + prop Lu + prop Any + + prop Han + prop Any + + prop Xan + prop Any + + prop Xsp + prop Any + + prop Xps + prop Xwd + + prop Any + prop Any + + prop Xuc + Ket + End +------------------------------------------------------------------ + +/\p{L&}+\p{Any} \p{L&}+\p{L&} \P{L&}+\p{L&} \p{L&}+\p{L} \p{L&}+\p{Lu} \p{L&}+\p{Han} \p{L&}+\p{Xan} \p{L&}+\P{Xan} \p{L&}+\p{Xsp} \p{L&}+\p{Xps} \p{Xwd}+\p{L&} \p{L&}+\p{Xuc}/BWZx +------------------------------------------------------------------ + Bra + prop L& + + prop Any + prop L& + + prop L& + notprop L& ++ + prop L& + prop L& + + prop L + prop L& + + prop Lu + prop L& + + prop Han + prop L& + + prop Xan + prop L& ++ + notprop Xan + prop L& ++ + prop Xsp + prop L& ++ + prop Xps + prop Xwd + + prop L& + prop L& + + prop Xuc + Ket + End +------------------------------------------------------------------ + +/\p{N}+\p{Any} \p{N}+\p{L&} \p{N}+\p{L} \p{N}+\P{L} \p{N}+\P{N} \p{N}+\p{Lu} \p{N}+\p{Han} \p{N}+\p{Xan} \p{N}+\p{Xsp} \p{N}+\p{Xps} \p{Xwd}+\p{N} \p{N}+\p{Xuc}/BWZx +------------------------------------------------------------------ + Bra + prop N + + prop Any + prop N + + prop L& + prop N ++ + prop L + prop N + + notprop L + prop N ++ + notprop N + prop N ++ + prop Lu + prop N + + prop Han + prop N + + prop Xan + prop N ++ + prop Xsp + prop N ++ + prop Xps + prop Xwd + + prop N + prop N + + prop Xuc + Ket + End +------------------------------------------------------------------ + +/\p{Lu}+\p{Any} \p{Lu}+\p{L&} \p{Lu}+\p{L} \p{Lu}+\p{Lu} \P{Lu}+\p{Lu} \p{Lu}+\p{Nd} \p{Lu}+\P{Nd} \p{Lu}+\p{Han} \p{Lu}+\p{Xan} \p{Lu}+\p{Xsp} \p{Lu}+\p{Xps} \p{Xwd}+\p{Lu} \p{Lu}+\p{Xuc}/BWZx +------------------------------------------------------------------ + Bra + prop Lu + + prop Any + prop Lu + + prop L& + prop Lu + + prop L + prop Lu + + prop Lu + notprop Lu ++ + prop Lu + prop Lu ++ + prop Nd + prop Lu + + notprop Nd + prop Lu + + prop Han + prop Lu + + prop Xan + prop Lu ++ + prop Xsp + prop Lu ++ + prop Xps + prop Xwd + + prop Lu + prop Lu + + prop Xuc + Ket + End +------------------------------------------------------------------ + +/\p{Han}+\p{Lu} \p{Han}+\p{L&} \p{Han}+\p{L} \p{Han}+\p{Lu} \p{Han}+\p{Arabic} \p{Arabic}+\p{Arabic} \p{Han}+\p{Xan} \p{Han}+\p{Xsp} \p{Han}+\p{Xps} \p{Xwd}+\p{Han} \p{Han}+\p{Xuc}/BWZx +------------------------------------------------------------------ + Bra + prop Han + + prop Lu + prop Han + + prop L& + prop Han + + prop L + prop Han + + prop Lu + prop Han ++ + prop Arabic + prop Arabic + + prop Arabic + prop Han + + prop Xan + prop Han + + prop Xsp + prop Han + + prop Xps + prop Xwd + + prop Han + prop Han + + prop Xuc + Ket + End +------------------------------------------------------------------ + +/\p{Xan}+\p{Any} \p{Xan}+\p{L&} \P{Xan}+\p{L&} \p{Xan}+\p{L} \p{Xan}+\p{Lu} \p{Xan}+\p{Han} \p{Xan}+\p{Xan} \p{Xan}+\P{Xan} \p{Xan}+\p{Xsp} \p{Xan}+\p{Xps} \p{Xwd}+\p{Xan} \p{Xan}+\p{Xuc}/BWZx +------------------------------------------------------------------ + Bra + prop Xan + + prop Any + prop Xan + + prop L& + notprop Xan ++ + prop L& + prop Xan + + prop L + prop Xan + + prop Lu + prop Xan + + prop Han + prop Xan + + prop Xan + prop Xan ++ + notprop Xan + prop Xan ++ + prop Xsp + prop Xan ++ + prop Xps + prop Xwd + + prop Xan + prop Xan + + prop Xuc + Ket + End +------------------------------------------------------------------ + +/\p{Xsp}+\p{Any} \p{Xsp}+\p{L&} \p{Xsp}+\p{L} \p{Xsp}+\p{Lu} \p{Xsp}+\p{Han} \p{Xsp}+\p{Xan} \p{Xsp}+\p{Xsp} \P{Xsp}+\p{Xsp} \p{Xsp}+\p{Xps} \p{Xwd}+\p{Xsp} \p{Xsp}+\p{Xuc}/BWZx +------------------------------------------------------------------ + Bra + prop Xsp + + prop Any + prop Xsp ++ + prop L& + prop Xsp ++ + prop L + prop Xsp ++ + prop Lu + prop Xsp + + prop Han + prop Xsp ++ + prop Xan + prop Xsp + + prop Xsp + notprop Xsp ++ + prop Xsp + prop Xsp + + prop Xps + prop Xwd ++ + prop Xsp + prop Xsp + + prop Xuc + Ket + End +------------------------------------------------------------------ + +/\p{Xwd}+\p{Any} \p{Xwd}+\p{L&} \p{Xwd}+\p{L} \p{Xwd}+\p{Lu} \p{Xwd}+\p{Han} \p{Xwd}+\p{Xan} \p{Xwd}+\p{Xsp} \p{Xwd}+\p{Xps} \p{Xwd}+\p{Xwd} \p{Xwd}+\P{Xwd} \p{Xwd}+\p{Xuc}/BWZx +------------------------------------------------------------------ + Bra + prop Xwd + + prop Any + prop Xwd + + prop L& + prop Xwd + + prop L + prop Xwd + + prop Lu + prop Xwd + + prop Han + prop Xwd + + prop Xan + prop Xwd ++ + prop Xsp + prop Xwd ++ + prop Xps + prop Xwd + + prop Xwd + prop Xwd ++ + notprop Xwd + prop Xwd + + prop Xuc + Ket + End +------------------------------------------------------------------ + +/\p{Xuc}+\p{Any} \p{Xuc}+\p{L&} \p{Xuc}+\p{L} \p{Xuc}+\p{Lu} \p{Xuc}+\p{Han} \p{Xuc}+\p{Xan} \p{Xuc}+\p{Xsp} \p{Xuc}+\p{Xps} \p{Xwd}+\p{Xuc} \p{Xuc}+\p{Xuc} \p{Xuc}+\P{Xuc}/BWZx +------------------------------------------------------------------ + Bra + prop Xuc + + prop Any + prop Xuc + + prop L& + prop Xuc + + prop L + prop Xuc + + prop Lu + prop Xuc + + prop Han + prop Xuc + + prop Xan + prop Xuc + + prop Xsp + prop Xuc + + prop Xps + prop Xwd + + prop Xuc + prop Xuc + + prop Xuc + prop Xuc ++ + notprop Xuc + Ket + End +------------------------------------------------------------------ + +/\p{N}+\p{Ll} \p{N}+\p{Nd} \p{N}+\P{Nd}/BWZx +------------------------------------------------------------------ + Bra + prop N ++ + prop Ll + prop N + + prop Nd + prop N + + notprop Nd + Ket + End +------------------------------------------------------------------ + +/\p{Xan}+\p{L} \p{Xan}+\p{N} \p{Xan}+\p{C} \p{Xan}+\P{L} \P{Xan}+\p{N} \p{Xan}+\P{C}/BWZx +------------------------------------------------------------------ + Bra + prop Xan + + prop L + prop Xan + + prop N + prop Xan ++ + prop C + prop Xan + + notprop L + notprop Xan ++ + prop N + prop Xan + + notprop C + Ket + End +------------------------------------------------------------------ + +/\p{L}+\p{Xan} \p{N}+\p{Xan} \p{C}+\p{Xan} \P{L}+\p{Xan} \p{N}+\p{Xan} \P{C}+\p{Xan} \p{L}+\P{Xan}/BWZx +------------------------------------------------------------------ + Bra + prop L + + prop Xan + prop N + + prop Xan + prop C ++ + prop Xan + notprop L + + prop Xan + prop N + + prop Xan + notprop C + + prop Xan + prop L ++ + notprop Xan + Ket + End +------------------------------------------------------------------ + +/\p{Xan}+\p{Lu} \p{Xan}+\p{Nd} \p{Xan}+\p{Cc} \p{Xan}+\P{Ll} \P{Xan}+\p{No} \p{Xan}+\P{Cf}/BWZx +------------------------------------------------------------------ + Bra + prop Xan + + prop Lu + prop Xan + + prop Nd + prop Xan ++ + prop Cc + prop Xan + + notprop Ll + notprop Xan ++ + prop No + prop Xan + + notprop Cf + Ket + End +------------------------------------------------------------------ + +/\p{Lu}+\p{Xan} \p{Nd}+\p{Xan} \p{Cs}+\p{Xan} \P{Lt}+\p{Xan} \p{Nl}+\p{Xan} \P{Cc}+\p{Xan} \p{Lt}+\P{Xan}/BWZx +------------------------------------------------------------------ + Bra + prop Lu + + prop Xan + prop Nd + + prop Xan + prop Cs ++ + prop Xan + notprop Lt + + prop Xan + prop Nl + + prop Xan + notprop Cc + + prop Xan + prop Lt ++ + notprop Xan + Ket + End +------------------------------------------------------------------ + +/\w+\p{P} \w+\p{Po} \w+\s \p{Xan}+\s \s+\p{Xan} \s+\w/BWZx +------------------------------------------------------------------ + Bra + prop Xwd + + prop P + prop Xwd + + prop Po + prop Xwd ++ + prop Xsp + prop Xan ++ + prop Xsp + prop Xsp ++ + prop Xan + prop Xsp ++ + prop Xwd + Ket + End +------------------------------------------------------------------ + +/\w+\P{P} \W+\p{Po} \w+\S \P{Xan}+\s \s+\P{Xan} \s+\W/BWZx +------------------------------------------------------------------ + Bra + prop Xwd + + notprop P + notprop Xwd + + prop Po + prop Xwd + + notprop Xsp + notprop Xan + + prop Xsp + prop Xsp + + notprop Xan + prop Xsp + + notprop Xwd + Ket + End +------------------------------------------------------------------ + +/\w+\p{Po} \w+\p{Pc} \W+\p{Po} \W+\p{Pc} \w+\P{Po} \w+\P{Pc}/BWZx +------------------------------------------------------------------ + Bra + prop Xwd + + prop Po + prop Xwd ++ + prop Pc + notprop Xwd + + prop Po + notprop Xwd + + prop Pc + prop Xwd + + notprop Po + prop Xwd + + notprop Pc + Ket + End +------------------------------------------------------------------ + +/\p{Nl}+\p{Xan} \P{Nl}+\p{Xan} \p{Nl}+\P{Xan} \P{Nl}+\P{Xan}/BWZx +------------------------------------------------------------------ + Bra + prop Nl + + prop Xan + notprop Nl + + prop Xan + prop Nl ++ + notprop Xan + notprop Nl + + notprop Xan + Ket + End +------------------------------------------------------------------ + +/\p{Xan}+\p{Nl} \P{Xan}+\p{Nl} \p{Xan}+\P{Nl} \P{Xan}+\P{Nl}/BWZx +------------------------------------------------------------------ + Bra + prop Xan + + prop Nl + notprop Xan ++ + prop Nl + prop Xan + + notprop Nl + notprop Xan + + notprop Nl + Ket + End +------------------------------------------------------------------ + +/\p{Xan}+\p{Nd} \P{Xan}+\p{Nd} \p{Xan}+\P{Nd} \P{Xan}+\P{Nd}/BWZx +------------------------------------------------------------------ + Bra + prop Xan + + prop Nd + notprop Xan ++ + prop Nd + prop Xan + + notprop Nd + notprop Xan + + notprop Nd + Ket + End +------------------------------------------------------------------ + +/-- End auto-possessification tests --/ + +/\w+/8CWBZ +------------------------------------------------------------------ + Bra + Callout 255 0 3 + prop Xwd ++ + Callout 255 3 0 + Ket + End +------------------------------------------------------------------ + abcd +--->abcd + +0 ^ \w+ + +3 ^ ^ + 0: abcd + +/[\p{N}]?+/BZO +------------------------------------------------------------------ + Bra + [\p{N}]?+ + Ket + End +------------------------------------------------------------------ + +/[\p{L}ab]{2,3}+/BZO +------------------------------------------------------------------ + Bra + [ab\p{L}]{2,3}+ + Ket + End +------------------------------------------------------------------ + +/\D+\X \d+\X \S+\X \s+\X \W+\X \w+\X \C+\X \R+\X \H+\X \h+\X \V+\X \v+\X a+\X \n+\X .+\X/BZx +------------------------------------------------------------------ + Bra + \D+ + extuni + \d+ + extuni + \S+ + extuni + \s+ + extuni + \W+ + extuni + \w+ + extuni + AllAny+ + extuni + \R+ + extuni + \H+ + extuni + \h+ + extuni + \V+ + extuni + \v+ + extuni + a+ + extuni + \x0a+ + extuni + Any+ + extuni + Ket + End +------------------------------------------------------------------ + +/.+\X/BZxs +------------------------------------------------------------------ + Bra + AllAny+ + extuni + Ket + End +------------------------------------------------------------------ + +/\X+$/BZxm +------------------------------------------------------------------ + Bra + extuni+ + /m $ + Ket + End +------------------------------------------------------------------ + +/\X+\D \X+\d \X+\S \X+\s \X+\W \X+\w \X+. \X+\C \X+\R \X+\H \X+\h \X+\V \X+\v \X+\X \X+\Z \X+\z \X+$/BZx +------------------------------------------------------------------ + Bra + extuni+ + \D + extuni+ + \d + extuni+ + \S + extuni+ + \s + extuni+ + \W + extuni+ + \w + extuni+ + Any + extuni+ + AllAny + extuni+ + \R + extuni+ + \H + extuni+ + \h + extuni+ + \V + extuni+ + \v + extuni+ + extuni + extuni+ + \Z + extuni++ + \z + extuni+ + $ + Ket + End +------------------------------------------------------------------ + +/\d+\s{0,5}=\s*\S?=\w{0,4}\W*/8WBZ +------------------------------------------------------------------ + Bra + prop Nd ++ + prop Xsp {0,5}+ + = + prop Xsp *+ + notprop Xsp ? + = + prop Xwd {0,4}+ + notprop Xwd *+ + Ket + End +------------------------------------------------------------------ + +/[RST]+/8iWBZ +------------------------------------------------------------------ + Bra + [R-Tr-t\x{17f}]++ + Ket + End +------------------------------------------------------------------ + +/[R-T]+/8iWBZ +------------------------------------------------------------------ + Bra + [R-Tr-t\x{17f}]++ + Ket + End +------------------------------------------------------------------ + +/[Q-U]+/8iWBZ +------------------------------------------------------------------ + Bra + [Q-Uq-u\x{17f}]++ + Ket + End +------------------------------------------------------------------ + +/^s?c/mi8I +Capturing subpattern count = 0 +Options: caseless multiline utf +First char at start or follows newline +Need char = 'c' (caseless) + scat + 0: sc + +/a[[:punct:]b]/WBZ +------------------------------------------------------------------ + Bra + a + [b[:punct:]] + Ket + End +------------------------------------------------------------------ + +/a[[:punct:]b]/8WBZ +------------------------------------------------------------------ + Bra + a + [b[:punct:]] + Ket + End +------------------------------------------------------------------ + +/a[b[:punct:]]/8WBZ +------------------------------------------------------------------ + Bra + a + [b[:punct:]] + Ket + End +------------------------------------------------------------------ + +/L(?#(|++3 + 0: abc + *** Failers +No match + xyzabc +No match + xyzabc\>2 +No match + +/x\dy\Dz/ + x9yzz + 0: x9yzz + x0y+z + 0: x0y+z + *** Failers +No match + xyz +No match + xxy0z +No match + +/x\sy\Sz/ + x yzz + 0: x yzz + x y+z + 0: x y+z + *** Failers +No match + xyz +No match + xxyyz +No match + +/x\wy\Wz/ + xxy+z + 0: xxy+z + *** Failers +No match + xxy0z +No match + x+y+z +No match + +/x.y/ + x+y + 0: x+y + x-y + 0: x-y + *** Failers +No match + x\ny +No match + +/x.y/s + x+y + 0: x+y + x-y + 0: x-y + x\ny + 0: x\x0ay + +/(a.b(?s)c.d|x.y)p.q/ + a+bc+dp+q + 0: a+bc+dp+q + a+bc\ndp+q + 0: a+bc\x0adp+q + x\nyp+q + 0: x\x0ayp+q + *** Failers +No match + a\nbc\ndp+q +No match + a+bc\ndp\nq +No match + x\nyp\nq +No match + +/a\d\z/ + ba0 + 0: a0 + *** Failers +No match + ba0\n +No match + ba0\ncd +No match + +/a\d\z/m + ba0 + 0: a0 + *** Failers +No match + ba0\n +No match + ba0\ncd +No match + +/a\d\Z/ + ba0 + 0: a0 + ba0\n + 0: a0 + *** Failers +No match + ba0\ncd +No match + +/a\d\Z/m + ba0 + 0: a0 + ba0\n + 0: a0 + *** Failers +No match + ba0\ncd +No match + +/a\d$/ + ba0 + 0: a0 + ba0\n + 0: a0 + *** Failers +No match + ba0\ncd +No match + +/a\d$/m + ba0 + 0: a0 + ba0\n + 0: a0 + ba0\ncd + 0: a0 + *** Failers +No match + +/abc/i + abc + 0: abc + aBc + 0: aBc + ABC + 0: ABC + +/[^a]/ + abcd + 0: b + +/ab?\w/ + abz + 0: abz + 1: ab + abbz + 0: abb + 1: ab + azz + 0: az + +/x{0,3}yz/ + ayzq + 0: yz + axyzq + 0: xyz + axxyz + 0: xxyz + axxxyzq + 0: xxxyz + axxxxyzq + 0: xxxyz + *** Failers +No match + ax +No match + axx +No match + +/x{3}yz/ + axxxyzq + 0: xxxyz + axxxxyzq + 0: xxxyz + *** Failers +No match + ax +No match + axx +No match + ayzq +No match + axyzq +No match + axxyz +No match + +/x{2,3}yz/ + axxyz + 0: xxyz + axxxyzq + 0: xxxyz + axxxxyzq + 0: xxxyz + *** Failers +No match + ax +No match + axx +No match + ayzq +No match + axyzq +No match + +/[^a]+/O + bac + 0: b + bcdefax + 0: bcdef + 1: bcde + 2: bcd + 3: bc + 4: b + *** Failers + 0: *** F + 1: *** + 2: *** + 3: ** + 4: * + aaaaa +No match + +/[^a]*/O + bac + 0: b + 1: + bcdefax + 0: bcdef + 1: bcde + 2: bcd + 3: bc + 4: b + 5: + *** Failers + 0: *** F + 1: *** + 2: *** + 3: ** + 4: * + 5: + aaaaa + 0: + +/[^a]{3,5}/O + xyz + 0: xyz + awxyza + 0: wxyz + 1: wxy + abcdefa + 0: bcdef + 1: bcde + 2: bcd + abcdefghijk + 0: bcdef + 1: bcde + 2: bcd + *** Failers + 0: *** F + 1: *** + 2: *** + axya +No match + axa +No match + aaaaa +No match + +/\d*/ + 1234b567 + 0: 1234 + xyz + 0: + +/\D*/ + a1234b567 + 0: a + xyz + 0: xyz + +/\d+/ + ab1234c56 + 0: 1234 + *** Failers +No match + xyz +No match + +/\D+/ + ab123c56 + 0: ab + *** Failers + 0: *** Failers + 789 +No match + +/\d?A/ + 045ABC + 0: 5A + ABC + 0: A + *** Failers +No match + XYZ +No match + +/\D?A/ + ABC + 0: A + BAC + 0: BA + 9ABC + 0: A + *** Failers +No match + +/a+/ + aaaa + 0: aaaa + +/^.*xyz/ + xyz + 0: xyz + ggggggggxyz + 0: ggggggggxyz + +/^.+xyz/ + abcdxyz + 0: abcdxyz + axyz + 0: axyz + *** Failers +No match + xyz +No match + +/^.?xyz/ + xyz + 0: xyz + cxyz + 0: cxyz + +/^\d{2,3}X/ + 12X + 0: 12X + 123X + 0: 123X + *** Failers +No match + X +No match + 1X +No match + 1234X +No match + +/^[abcd]\d/ + a45 + 0: a4 + b93 + 0: b9 + c99z + 0: c9 + d04 + 0: d0 + *** Failers +No match + e45 +No match + abcd +No match + abcd1234 +No match + 1234 +No match + +/^[abcd]*\d/ + a45 + 0: a4 + b93 + 0: b9 + c99z + 0: c9 + d04 + 0: d0 + abcd1234 + 0: abcd1 + 1234 + 0: 1 + *** Failers +No match + e45 +No match + abcd +No match + +/^[abcd]+\d/ + a45 + 0: a4 + b93 + 0: b9 + c99z + 0: c9 + d04 + 0: d0 + abcd1234 + 0: abcd1 + *** Failers +No match + 1234 +No match + e45 +No match + abcd +No match + +/^a+X/ + aX + 0: aX + aaX + 0: aaX + +/^[abcd]?\d/ + a45 + 0: a4 + b93 + 0: b9 + c99z + 0: c9 + d04 + 0: d0 + 1234 + 0: 1 + *** Failers +No match + abcd1234 +No match + e45 +No match + +/^[abcd]{2,3}\d/ + ab45 + 0: ab4 + bcd93 + 0: bcd9 + *** Failers +No match + 1234 +No match + a36 +No match + abcd1234 +No match + ee45 +No match + +/^(abc)*\d/ + abc45 + 0: abc4 + abcabcabc45 + 0: abcabcabc4 + 42xyz + 0: 4 + *** Failers +No match + +/^(abc)+\d/ + abc45 + 0: abc4 + abcabcabc45 + 0: abcabcabc4 + *** Failers +No match + 42xyz +No match + +/^(abc)?\d/ + abc45 + 0: abc4 + 42xyz + 0: 4 + *** Failers +No match + abcabcabc45 +No match + +/^(abc){2,3}\d/ + abcabc45 + 0: abcabc4 + abcabcabc45 + 0: abcabcabc4 + *** Failers +No match + abcabcabcabc45 +No match + abc45 +No match + 42xyz +No match + +/1(abc|xyz)2(?1)3/ + 1abc2abc3456 + 0: 1abc2abc3 + 1abc2xyz3456 + 0: 1abc2xyz3 + +/^(a*\w|ab)=(a*\w|ab)/ + ab=ab + 0: ab=ab + 1: ab=a + +/^(a*\w|ab)=(?1)/ + ab=ab + 0: ab=ab + 1: ab=a + +/^([^()]|\((?1)*\))*$/ + abc + 0: abc + a(b)c + 0: a(b)c + a(b(c))d + 0: a(b(c))d + *** Failers) +No match + a(b(c)d +No match + +/^>abc>([^()]|\((?1)*\))*abc>123abc>123abc>1(2)3abc>1(2)3abc>(1(2)3)abc>(1(2)3)a*)\d/ + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9876 + 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9 + *** Failers +No match + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +No match + +/< (?: (?(R) \d++ | [^<>]*+) | (?R)) * >/x + <> + 0: <> + + 0: + hij> + 0: hij> + hij> + 0: + def> + 0: def> + + 0: <> + *** Failers +No match + abcxyz + 1 ^ ^ x + 0: abcxyz + 123abcxyz999 +--->123abcxyz999 + 1 ^ ^ x + 0: abcxyz + +/(ab|cd){3,4}/C + ababab +--->ababab + +0 ^ (ab|cd){3,4} + +1 ^ a + +4 ^ c + +2 ^^ b + +3 ^ ^ | + +1 ^ ^ a + +4 ^ ^ c + +2 ^ ^ b + +3 ^ ^ | + +1 ^ ^ a + +4 ^ ^ c + +2 ^ ^ b + +3 ^ ^ | ++12 ^ ^ + +1 ^ ^ a + +4 ^ ^ c + 0: ababab + abcdabcd +--->abcdabcd + +0 ^ (ab|cd){3,4} + +1 ^ a + +4 ^ c + +2 ^^ b + +3 ^ ^ | + +1 ^ ^ a + +4 ^ ^ c + +5 ^ ^ d + +6 ^ ^ ) + +1 ^ ^ a + +4 ^ ^ c + +2 ^ ^ b + +3 ^ ^ | ++12 ^ ^ + +1 ^ ^ a + +4 ^ ^ c + +5 ^ ^ d + +6 ^ ^ ) ++12 ^ ^ + 0: abcdabcd + 1: abcdab + abcdcdcdcdcd +--->abcdcdcdcdcd + +0 ^ (ab|cd){3,4} + +1 ^ a + +4 ^ c + +2 ^^ b + +3 ^ ^ | + +1 ^ ^ a + +4 ^ ^ c + +5 ^ ^ d + +6 ^ ^ ) + +1 ^ ^ a + +4 ^ ^ c + +5 ^ ^ d + +6 ^ ^ ) ++12 ^ ^ + +1 ^ ^ a + +4 ^ ^ c + +5 ^ ^ d + +6 ^ ^ ) ++12 ^ ^ + 0: abcdcdcd + 1: abcdcd + +/^abc/ + abcdef + 0: abc + *** Failers +No match + abcdef\B +No match + +/^(a*|xyz)/ + bcd + 0: + aaabcd + 0: aaa + xyz + 0: xyz + 1: + xyz\N + 0: xyz + *** Failers + 0: + bcd\N +No match + +/xyz$/ + xyz + 0: xyz + xyz\n + 0: xyz + *** Failers +No match + xyz\Z +No match + xyz\n\Z +No match + +/xyz$/m + xyz + 0: xyz + xyz\n + 0: xyz + abcxyz\npqr + 0: xyz + abcxyz\npqr\Z + 0: xyz + xyz\n\Z + 0: xyz + *** Failers +No match + xyz\Z +No match + +/\Gabc/ + abcdef + 0: abc + defabcxyz\>3 + 0: abc + *** Failers +No match + defabcxyz +No match + +/^abcdef/ + ab\P +Partial match: ab + abcde\P +Partial match: abcde + abcdef\P + 0: abcdef + *** Failers +No match + abx\P +No match + +/^a{2,4}\d+z/ + a\P +Partial match: a + aa\P +Partial match: aa + aa2\P +Partial match: aa2 + aaa\P +Partial match: aaa + aaa23\P +Partial match: aaa23 + aaaa12345\P +Partial match: aaaa12345 + aa0z\P + 0: aa0z + aaaa4444444444444z\P + 0: aaaa4444444444444z + *** Failers +No match + az\P +No match + aaaaa\P +No match + a56\P +No match + +/^abcdef/ + abc\P +Partial match: abc + def\R + 0: def + +/(?<=foo)bar/ + xyzfo\P +No match + foob\P\>2 +Partial match at offset 3: foob + foobar...\R\P\>4 + 0: ar + xyzfo\P +No match + foobar\>2 + 0: bar + *** Failers +No match + xyzfo\P +No match + obar\R +No match + +/(ab*(cd|ef))+X/ + adfadadaklhlkalkajhlkjahdfasdfasdfladsfjkj\P\Z +No match + lkjhlkjhlkjhlkjhabbbbbbcdaefabbbbbbbefa\P\B\Z +Partial match: abbbbbbcdaefabbbbbbbefa + cdabbbbbbbb\P\R\B\Z +Partial match: cdabbbbbbbb + efabbbbbbbbbbbbbbbb\P\R\B\Z +Partial match: efabbbbbbbbbbbbbbbb + bbbbbbbbbbbbcdXyasdfadf\P\R\B\Z + 0: bbbbbbbbbbbbcdX + +/(a|b)/SF>testsavedregex +Compiled pattern written to testsavedregex +Study data written to testsavedregex +>>aaabxyzpqrrrabbxyyyypqAzz + 0: aaabxyzpqrrrabbxyyyypqAzz + >aaaabxyzpqrrrabbxyyyypqAzz + 0: aaaabxyzpqrrrabbxyyyypqAzz + >>>>abcxyzpqrrrabbxyyyypqAzz + 0: abcxyzpqrrrabbxyyyypqAzz + *** Failers +No match + abxyzpqrrabbxyyyypqAzz +No match + abxyzpqrrrrabbxyyyypqAzz +No match + abxyzpqrrrabxyyyypqAzz +No match + aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz +No match + aaaabcxyzzzzpqrrrabbbxyyypqAzz +No match + aaabcxyzpqrrrabbxyyyypqqqqqqqAzz +No match + +/^(abc){1,2}zz/ + abczz + 0: abczz + abcabczz + 0: abcabczz + *** Failers +No match + zz +No match + abcabcabczz +No match + >>abczz +No match + +/^(b+?|a){1,2}?c/ + bc + 0: bc + bbc + 0: bbc + bbbc + 0: bbbc + bac + 0: bac + bbac + 0: bbac + aac + 0: aac + abbbbbbbbbbbc + 0: abbbbbbbbbbbc + bbbbbbbbbbbac + 0: bbbbbbbbbbbac + *** Failers +No match + aaac +No match + abbbbbbbbbbbac +No match + +/^(b+|a){1,2}c/ + bc + 0: bc + bbc + 0: bbc + bbbc + 0: bbbc + bac + 0: bac + bbac + 0: bbac + aac + 0: aac + abbbbbbbbbbbc + 0: abbbbbbbbbbbc + bbbbbbbbbbbac + 0: bbbbbbbbbbbac + *** Failers +No match + aaac +No match + abbbbbbbbbbbac +No match + +/^(b+|a){1,2}?bc/ + bbc + 0: bbc + +/^(b*|ba){1,2}?bc/ + babc + 0: babc + bbabc + 0: bbabc + bababc + 0: bababc + *** Failers +No match + bababbc +No match + babababc +No match + +/^(ba|b*){1,2}?bc/ + babc + 0: babc + bbabc + 0: bbabc + bababc + 0: bababc + *** Failers +No match + bababbc +No match + babababc +No match + +/^\ca\cA\c[\c{\c:/ + \x01\x01\e;z + 0: \x01\x01\x1b;z + +/^[ab\]cde]/ + athing + 0: a + bthing + 0: b + ]thing + 0: ] + cthing + 0: c + dthing + 0: d + ething + 0: e + *** Failers +No match + fthing +No match + [thing +No match + \\thing +No match + +/^[]cde]/ + ]thing + 0: ] + cthing + 0: c + dthing + 0: d + ething + 0: e + *** Failers +No match + athing +No match + fthing +No match + +/^[^ab\]cde]/ + fthing + 0: f + [thing + 0: [ + \\thing + 0: \ + *** Failers + 0: * + athing +No match + bthing +No match + ]thing +No match + cthing +No match + dthing +No match + ething +No match + +/^[^]cde]/ + athing + 0: a + fthing + 0: f + *** Failers + 0: * + ]thing +No match + cthing +No match + dthing +No match + ething +No match + +/^\/ + + 0: \x81 + +/^ÿ/ + ÿ + 0: \xff + +/^[0-9]+$/ + 0 + 0: 0 + 1 + 0: 1 + 2 + 0: 2 + 3 + 0: 3 + 4 + 0: 4 + 5 + 0: 5 + 6 + 0: 6 + 7 + 0: 7 + 8 + 0: 8 + 9 + 0: 9 + 10 + 0: 10 + 100 + 0: 100 + *** Failers +No match + abc +No match + +/^.*nter/ + enter + 0: enter + inter + 0: inter + uponter + 0: uponter + +/^xxx[0-9]+$/ + xxx0 + 0: xxx0 + xxx1234 + 0: xxx1234 + *** Failers +No match + xxx +No match + +/^.+[0-9][0-9][0-9]$/ + x123 + 0: x123 + xx123 + 0: xx123 + 123456 + 0: 123456 + *** Failers +No match + 123 +No match + x1234 + 0: x1234 + +/^.+?[0-9][0-9][0-9]$/ + x123 + 0: x123 + xx123 + 0: xx123 + 123456 + 0: 123456 + *** Failers +No match + 123 +No match + x1234 + 0: x1234 + +/^([^!]+)!(.+)=apquxz\.ixr\.zzz\.ac\.uk$/ + abc!pqr=apquxz.ixr.zzz.ac.uk + 0: abc!pqr=apquxz.ixr.zzz.ac.uk + *** Failers +No match + !pqr=apquxz.ixr.zzz.ac.uk +No match + abc!=apquxz.ixr.zzz.ac.uk +No match + abc!pqr=apquxz:ixr.zzz.ac.uk +No match + abc!pqr=apquxz.ixr.zzz.ac.ukk +No match + +/:/ + Well, we need a colon: somewhere + 0: : + *** Fail if we don't +No match + +/([\da-f:]+)$/i + 0abc + 0: 0abc + abc + 0: abc + fed + 0: fed + E + 0: E + :: + 0: :: + 5f03:12C0::932e + 0: 5f03:12C0::932e + fed def + 0: def + Any old stuff + 0: ff + *** Failers +No match + 0zzz +No match + gzzz +No match + fed\x20 +No match + Any old rubbish +No match + +/^.*\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/ + .1.2.3 + 0: .1.2.3 + A.12.123.0 + 0: A.12.123.0 + *** Failers +No match + .1.2.3333 +No match + 1.2.3 +No match + 1234.2.3 +No match + +/^(\d+)\s+IN\s+SOA\s+(\S+)\s+(\S+)\s*\(\s*$/ + 1 IN SOA non-sp1 non-sp2( + 0: 1 IN SOA non-sp1 non-sp2( + 1 IN SOA non-sp1 non-sp2 ( + 0: 1 IN SOA non-sp1 non-sp2 ( + *** Failers +No match + 1IN SOA non-sp1 non-sp2( +No match + +/^[a-zA-Z\d][a-zA-Z\d\-]*(\.[a-zA-Z\d][a-zA-z\d\-]*)*\.$/ + a. + 0: a. + Z. + 0: Z. + 2. + 0: 2. + ab-c.pq-r. + 0: ab-c.pq-r. + sxk.zzz.ac.uk. + 0: sxk.zzz.ac.uk. + x-.y-. + 0: x-.y-. + *** Failers +No match + -abc.peq. +No match + +/^\*\.[a-z]([a-z\-\d]*[a-z\d]+)?(\.[a-z]([a-z\-\d]*[a-z\d]+)?)*$/ + *.a + 0: *.a + *.b0-a + 0: *.b0-a + *.c3-b.c + 0: *.c3-b.c + *.c-a.b-c + 0: *.c-a.b-c + *** Failers +No match + *.0 +No match + *.a- +No match + *.a-b.c- +No match + *.c-a.0-c +No match + +/^(?=ab(de))(abd)(e)/ + abde + 0: abde + +/^(?!(ab)de|x)(abd)(f)/ + abdf + 0: abdf + +/^(?=(ab(cd)))(ab)/ + abcd + 0: ab + +/^[\da-f](\.[\da-f])*$/i + a.b.c.d + 0: a.b.c.d + A.B.C.D + 0: A.B.C.D + a.b.c.1.2.3.C + 0: a.b.c.1.2.3.C + +/^\".*\"\s*(;.*)?$/ + \"1234\" + 0: "1234" + \"abcd\" ; + 0: "abcd" ; + \"\" ; rhubarb + 0: "" ; rhubarb + *** Failers +No match + \"1234\" : things +No match + +/^$/ + \ + 0: + *** Failers +No match + +/ ^ a (?# begins with a) b\sc (?# then b c) $ (?# then end)/x + ab c + 0: ab c + *** Failers +No match + abc +No match + ab cde +No match + +/(?x) ^ a (?# begins with a) b\sc (?# then b c) $ (?# then end)/ + ab c + 0: ab c + *** Failers +No match + abc +No match + ab cde +No match + +/^ a\ b[c ]d $/x + a bcd + 0: a bcd + a b d + 0: a b d + *** Failers +No match + abcd +No match + ab d +No match + +/^(a(b(c)))(d(e(f)))(h(i(j)))(k(l(m)))$/ + abcdefhijklm + 0: abcdefhijklm + +/^(?:a(b(c)))(?:d(e(f)))(?:h(i(j)))(?:k(l(m)))$/ + abcdefhijklm + 0: abcdefhijklm + +/^[\w][\W][\s][\S][\d][\D][\b][\n][\c]][\022]/ + a+ Z0+\x08\n\x1d\x12 + 0: a+ Z0+\x08\x0a\x1d\x12 + +/^[.^$|()*+?{,}]+/ + .^\$(*+)|{?,?} + 0: .^$(*+)|{?,?} + +/^a*\w/ + z + 0: z + az + 0: az + 1: a + aaaz + 0: aaaz + 1: aaa + 2: aa + 3: a + a + 0: a + aa + 0: aa + 1: a + aaaa + 0: aaaa + 1: aaa + 2: aa + 3: a + a+ + 0: a + aa+ + 0: aa + 1: a + +/^a*?\w/ + z + 0: z + az + 0: az + 1: a + aaaz + 0: aaaz + 1: aaa + 2: aa + 3: a + a + 0: a + aa + 0: aa + 1: a + aaaa + 0: aaaa + 1: aaa + 2: aa + 3: a + a+ + 0: a + aa+ + 0: aa + 1: a + +/^a+\w/ + az + 0: az + aaaz + 0: aaaz + 1: aaa + 2: aa + aa + 0: aa + aaaa + 0: aaaa + 1: aaa + 2: aa + aa+ + 0: aa + +/^a+?\w/ + az + 0: az + aaaz + 0: aaaz + 1: aaa + 2: aa + aa + 0: aa + aaaa + 0: aaaa + 1: aaa + 2: aa + aa+ + 0: aa + +/^\d{8}\w{2,}/ + 1234567890 + 0: 1234567890 + 12345678ab + 0: 12345678ab + 12345678__ + 0: 12345678__ + *** Failers +No match + 1234567 +No match + +/^[aeiou\d]{4,5}$/ + uoie + 0: uoie + 1234 + 0: 1234 + 12345 + 0: 12345 + aaaaa + 0: aaaaa + *** Failers +No match + 123456 +No match + +/^[aeiou\d]{4,5}?/ + uoie + 0: uoie + 1234 + 0: 1234 + 12345 + 0: 12345 + 1: 1234 + aaaaa + 0: aaaaa + 1: aaaa + 123456 + 0: 12345 + 1: 1234 + +/^From +([^ ]+) +[a-zA-Z][a-zA-Z][a-zA-Z] +[a-zA-Z][a-zA-Z][a-zA-Z] +[0-9]?[0-9] +[0-9][0-9]:[0-9][0-9]/ + From abcd Mon Sep 01 12:33:02 1997 + 0: From abcd Mon Sep 01 12:33 + +/^From\s+\S+\s+([a-zA-Z]{3}\s+){2}\d{1,2}\s+\d\d:\d\d/ + From abcd Mon Sep 01 12:33:02 1997 + 0: From abcd Mon Sep 01 12:33 + From abcd Mon Sep 1 12:33:02 1997 + 0: From abcd Mon Sep 1 12:33 + *** Failers +No match + From abcd Sep 01 12:33:02 1997 +No match + +/^12.34/s + 12\n34 + 0: 12\x0a34 + 12\r34 + 0: 12\x0d34 + +/\w+(?=\t)/ + the quick brown\t fox + 0: brown + +/foo(?!bar)(.*)/ + foobar is foolish see? + 0: foolish see? + +/(?:(?!foo)...|^.{0,2})bar(.*)/ + foobar crowbar etc + 0: rowbar etc + barrel + 0: barrel + 2barrel + 0: 2barrel + A barrel + 0: A barrel + +/^(\D*)(?=\d)(?!123)/ + abc456 + 0: abc + *** Failers +No match + abc123 +No match + +/^1234(?# test newlines + inside)/ + 1234 + 0: 1234 + +/^1234 #comment in extended re + /x + 1234 + 0: 1234 + +/#rhubarb + abcd/x + abcd + 0: abcd + +/^abcd#rhubarb/x + abcd + 0: abcd + +/(?!^)abc/ + the abc + 0: abc + *** Failers +No match + abc +No match + +/(?=^)abc/ + abc + 0: abc + *** Failers +No match + the abc +No match + +/^[ab]{1,3}(ab*|b)/O + aabbbbb + 0: aabbbbb + 1: aabbbb + 2: aabbb + 3: aabb + 4: aab + 5: aa + +/^[ab]{1,3}?(ab*|b)/O + aabbbbb + 0: aabbbbb + 1: aabbbb + 2: aabbb + 3: aabb + 4: aab + 5: aa + +/^[ab]{1,3}?(ab*?|b)/O + aabbbbb + 0: aabbbbb + 1: aabbbb + 2: aabbb + 3: aabb + 4: aab + 5: aa + +/^[ab]{1,3}(ab*?|b)/O + aabbbbb + 0: aabbbbb + 1: aabbbb + 2: aabbb + 3: aabb + 4: aab + 5: aa + +/ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # optional leading comment +(?: (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # initial word +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) )* # further okay, if led by a period +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] | # atom and space parts, or... +\( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) | # comments, or... + +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +# quoted strings +)* +< (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # leading < +(?: @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* + +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* , (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* )? # optional route +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # initial word +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) )* # further okay, if led by a period +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +# address spec +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* > # trailing > +# name and address +) (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # optional trailing comment +/x + Alan Other + 0: Alan Other + + 0: user@dom.ain + 1: user@dom + user\@dom.ain + 0: user@dom.ain + 1: user@dom + \"A. Other\" (a comment) + 0: "A. Other" (a comment) + 1: "A. Other" + 2: "A. Other" + A. Other (a comment) + 0: Other (a comment) + 1: Other + 2: Other + \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay + 0: "/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/"@x400-re.lay + 1: "/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/"@x400-re + A missing angle @,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +# Quoted string +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +# Quoted string +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +# Quoted string +) +# leading word +[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] * # "normal" atoms and or spaces +(?: +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +| +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +) # "special" comment or quoted string +[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] * # more "normal" +)* +< +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +@ +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +# Quoted string +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +# Quoted string +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +) +/x + Alan Other + 0: Alan Other + + 0: user@dom.ain + 1: user@dom + user\@dom.ain + 0: user@dom.ain + 1: user@dom + \"A. Other\" (a comment) + 0: "A. Other" + A. Other (a comment) + 0: Other + \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay + 0: "/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/"@x400-re.lay + 1: "/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/"@x400-re + A missing angle + a\rb + 0: a\x0db + *** Failers +No match + a\nb +No match + +/abc$/ + abc + 0: abc + abc\n + 0: abc + *** Failers +No match + abc\ndef +No match + +/(abc)\123/ + abc\x53 + 0: abcS + +/(abc)\223/ + abc\x93 + 0: abc\x93 + +/(abc)\323/ + abc\xd3 + 0: abc\xd3 + +/(abc)\100/ + abc\x40 + 0: abc@ + abc\100 + 0: abc@ + +/(abc)\1000/ + abc\x400 + 0: abc@0 + abc\x40\x30 + 0: abc@0 + abc\1000 + 0: abc@0 + abc\100\x30 + 0: abc@0 + abc\100\060 + 0: abc@0 + abc\100\60 + 0: abc@0 + +/^A\8B\9C$/ + A8B9C + 0: A8B9C + *** Failers +No match + A\08B\09C +No match + +/^[A\8B\9C]+$/ + A8B9C + 0: A8B9C + *** Failers +No match + A8B9C\x00 +No match + +/(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\12\123/ + abcdefghijk\12S + 0: abcdefghijk\x0aS + +/ab\idef/ + abidef + 0: abidef + +/a{0}bc/ + bc + 0: bc + +/(a|(bc)){0,0}?xyz/ + xyz + 0: xyz + +/abc[\10]de/ + abc\010de + 0: abc\x08de + +/abc[\1]de/ + abc\1de + 0: abc\x01de + +/(abc)[\1]de/ + abc\1de + 0: abc\x01de + +/(?s)a.b/ + a\nb + 0: a\x0ab + +/^([^a])([^\b])([^c]*)([^d]{3,4})/ + baNOTccccd + 0: baNOTcccc + 1: baNOTccc + 2: baNOTcc + 3: baNOTc + baNOTcccd + 0: baNOTccc + 1: baNOTcc + 2: baNOTc + baNOTccd + 0: baNOTcc + 1: baNOTc + bacccd + 0: baccc + *** Failers + 0: *** Failers + 1: *** Failer + 2: *** Faile + 3: *** Fail + 4: *** Fai + 5: *** Fa + anything +No match + b\bc +No match + baccd +No match + +/[^a]/ + Abc + 0: A + +/[^a]/i + Abc + 0: b + +/[^a]+/ + AAAaAbc + 0: AAA + +/[^a]+/i + AAAaAbc + 0: bc + +/[^a]+/ + bbb\nccc + 0: bbb\x0accc + +/[^k]$/ + abc + 0: c + *** Failers + 0: s + abk +No match + +/[^k]{2,3}$/ + abc + 0: abc + kbc + 0: bc + kabc + 0: abc + *** Failers + 0: ers + abk +No match + akb +No match + akk +No match + +/^\d{8,}\@.+[^k]$/ + 12345678\@a.b.c.d + 0: 12345678@a.b.c.d + 123456789\@x.y.z + 0: 123456789@x.y.z + *** Failers +No match + 12345678\@x.y.uk +No match + 1234567\@a.b.c.d +No match + +/[^a]/ + aaaabcd + 0: b + aaAabcd + 0: A + +/[^a]/i + aaaabcd + 0: b + aaAabcd + 0: b + +/[^az]/ + aaaabcd + 0: b + aaAabcd + 0: A + +/[^az]/i + aaaabcd + 0: b + aaAabcd + 0: b + +/\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037\040\041\042\043\044\045\046\047\050\051\052\053\054\055\056\057\060\061\062\063\064\065\066\067\070\071\072\073\074\075\076\077\100\101\102\103\104\105\106\107\110\111\112\113\114\115\116\117\120\121\122\123\124\125\126\127\130\131\132\133\134\135\136\137\140\141\142\143\144\145\146\147\150\151\152\153\154\155\156\157\160\161\162\163\164\165\166\167\170\171\172\173\174\175\176\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377/ + \000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037\040\041\042\043\044\045\046\047\050\051\052\053\054\055\056\057\060\061\062\063\064\065\066\067\070\071\072\073\074\075\076\077\100\101\102\103\104\105\106\107\110\111\112\113\114\115\116\117\120\121\122\123\124\125\126\127\130\131\132\133\134\135\136\137\140\141\142\143\144\145\146\147\150\151\152\153\154\155\156\157\160\161\162\163\164\165\166\167\170\171\172\173\174\175\176\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377 + 0: \x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff + +/P[^*]TAIRE[^*]{1,6}?LL/ + xxxxxxxxxxxPSTAIREISLLxxxxxxxxx + 0: PSTAIREISLL + +/P[^*]TAIRE[^*]{1,}?LL/ + xxxxxxxxxxxPSTAIREISLLxxxxxxxxx + 0: PSTAIREISLL + +/(\.\d\d[1-9]?)\d+/ + 1.230003938 + 0: .230003938 + 1.875000282 + 0: .875000282 + 1.235 + 0: .235 + +/(\.\d\d((?=0)|\d(?=\d)))/ + 1.230003938 + 0: .230 + 1: .23 + 1.875000282 + 0: .875 + *** Failers +No match + 1.235 +No match + +/a(?)b/ + ab + 0: ab + +/\b(foo)\s+(\w+)/i + Food is on the foo table + 0: foo table + +/foo(.*)bar/ + The food is under the bar in the barn. + 0: food is under the bar in the bar + 1: food is under the bar + +/foo(.*?)bar/ + The food is under the bar in the barn. + 0: food is under the bar in the bar + 1: food is under the bar + +/(.*)(\d*)/O + I have 2 numbers: 53147 +Matched, but offsets vector is too small to show all matches + 0: I have 2 numbers: 53147 + 1: I have 2 numbers: 5314 + 2: I have 2 numbers: 531 + 3: I have 2 numbers: 53 + 4: I have 2 numbers: 5 + 5: I have 2 numbers: + 6: I have 2 numbers: + 7: I have 2 numbers + 8: I have 2 number + 9: I have 2 numbe +10: I have 2 numb +11: I have 2 num +12: I have 2 nu +13: I have 2 n +14: I have 2 +15: I have 2 +16: I have +17: I have +18: I hav +19: I ha +20: I h +21: I + +/(.*)(\d+)/ + I have 2 numbers: 53147 + 0: I have 2 numbers: 53147 + 1: I have 2 + +/(.*?)(\d*)/O + I have 2 numbers: 53147 +Matched, but offsets vector is too small to show all matches + 0: I have 2 numbers: 53147 + 1: I have 2 numbers: 5314 + 2: I have 2 numbers: 531 + 3: I have 2 numbers: 53 + 4: I have 2 numbers: 5 + 5: I have 2 numbers: + 6: I have 2 numbers: + 7: I have 2 numbers + 8: I have 2 number + 9: I have 2 numbe +10: I have 2 numb +11: I have 2 num +12: I have 2 nu +13: I have 2 n +14: I have 2 +15: I have 2 +16: I have +17: I have +18: I hav +19: I ha +20: I h +21: I + +/(.*?)(\d+)/ + I have 2 numbers: 53147 + 0: I have 2 numbers: 53147 + 1: I have 2 + +/(.*)(\d+)$/ + I have 2 numbers: 53147 + 0: I have 2 numbers: 53147 + +/(.*?)(\d+)$/ + I have 2 numbers: 53147 + 0: I have 2 numbers: 53147 + +/(.*)\b(\d+)$/ + I have 2 numbers: 53147 + 0: I have 2 numbers: 53147 + +/(.*\D)(\d+)$/ + I have 2 numbers: 53147 + 0: I have 2 numbers: 53147 + +/^\D*(?!123)/ + ABC123 + 0: AB + 1: A + 2: + +/^(\D*)(?=\d)(?!123)/ + ABC445 + 0: ABC + *** Failers +No match + ABC123 +No match + +/^[W-]46]/ + W46]789 + 0: W46] + -46]789 + 0: -46] + *** Failers +No match + Wall +No match + Zebra +No match + 42 +No match + [abcd] +No match + ]abcd[ +No match + +/^[W-\]46]/ + W46]789 + 0: W + Wall + 0: W + Zebra + 0: Z + Xylophone + 0: X + 42 + 0: 4 + [abcd] + 0: [ + ]abcd[ + 0: ] + \\backslash + 0: \ + *** Failers +No match + -46]789 +No match + well +No match + +/\d\d\/\d\d\/\d\d\d\d/ + 01/01/2000 + 0: 01/01/2000 + +/word (?:[a-zA-Z0-9]+ ){0,10}otherword/ + word cat dog elephant mussel cow horse canary baboon snake shark otherword + 0: word cat dog elephant mussel cow horse canary baboon snake shark otherword + word cat dog elephant mussel cow horse canary baboon snake shark +No match + +/word (?:[a-zA-Z0-9]+ ){0,300}otherword/ + word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope +No match + +/^(a){0,0}/ + bcd + 0: + abc + 0: + aab + 0: + +/^(a){0,1}/ + bcd + 0: + abc + 0: a + 1: + aab + 0: a + 1: + +/^(a){0,2}/ + bcd + 0: + abc + 0: a + 1: + aab + 0: aa + 1: a + 2: + +/^(a){0,3}/ + bcd + 0: + abc + 0: a + 1: + aab + 0: aa + 1: a + 2: + aaa + 0: aaa + 1: aa + 2: a + 3: + +/^(a){0,}/ + bcd + 0: + abc + 0: a + 1: + aab + 0: aa + 1: a + 2: + aaa + 0: aaa + 1: aa + 2: a + 3: + aaaaaaaa + 0: aaaaaaaa + 1: aaaaaaa + 2: aaaaaa + 3: aaaaa + 4: aaaa + 5: aaa + 6: aa + 7: a + 8: + +/^(a){1,1}/ + bcd +No match + abc + 0: a + aab + 0: a + +/^(a){1,2}/ + bcd +No match + abc + 0: a + aab + 0: aa + 1: a + +/^(a){1,3}/ + bcd +No match + abc + 0: a + aab + 0: aa + 1: a + aaa + 0: aaa + 1: aa + 2: a + +/^(a){1,}/ + bcd +No match + abc + 0: a + aab + 0: aa + 1: a + aaa + 0: aaa + 1: aa + 2: a + aaaaaaaa + 0: aaaaaaaa + 1: aaaaaaa + 2: aaaaaa + 3: aaaaa + 4: aaaa + 5: aaa + 6: aa + 7: a + +/.*\.gif/ + borfle\nbib.gif\nno + 0: bib.gif + +/.{0,}\.gif/ + borfle\nbib.gif\nno + 0: bib.gif + +/.*\.gif/m + borfle\nbib.gif\nno + 0: bib.gif + +/.*\.gif/s + borfle\nbib.gif\nno + 0: borfle\x0abib.gif + +/.*\.gif/ms + borfle\nbib.gif\nno + 0: borfle\x0abib.gif + +/.*$/ + borfle\nbib.gif\nno + 0: no + +/.*$/m + borfle\nbib.gif\nno + 0: borfle + +/.*$/s + borfle\nbib.gif\nno + 0: borfle\x0abib.gif\x0ano + +/.*$/ms + borfle\nbib.gif\nno + 0: borfle\x0abib.gif\x0ano + 1: borfle\x0abib.gif + 2: borfle + +/.*$/ + borfle\nbib.gif\nno\n + 0: no + +/.*$/m + borfle\nbib.gif\nno\n + 0: borfle + +/.*$/s + borfle\nbib.gif\nno\n + 0: borfle\x0abib.gif\x0ano\x0a + 1: borfle\x0abib.gif\x0ano + +/.*$/ms + borfle\nbib.gif\nno\n + 0: borfle\x0abib.gif\x0ano\x0a + 1: borfle\x0abib.gif\x0ano + 2: borfle\x0abib.gif + 3: borfle + +/(.*X|^B)/ + abcde\n1234Xyz + 0: 1234X + BarFoo + 0: B + *** Failers +No match + abcde\nBar +No match + +/(.*X|^B)/m + abcde\n1234Xyz + 0: 1234X + BarFoo + 0: B + abcde\nBar + 0: B + +/(.*X|^B)/s + abcde\n1234Xyz + 0: abcde\x0a1234X + BarFoo + 0: B + *** Failers +No match + abcde\nBar +No match + +/(.*X|^B)/ms + abcde\n1234Xyz + 0: abcde\x0a1234X + BarFoo + 0: B + abcde\nBar + 0: B + +/(?s)(.*X|^B)/ + abcde\n1234Xyz + 0: abcde\x0a1234X + BarFoo + 0: B + *** Failers +No match + abcde\nBar +No match + +/(?s:.*X|^B)/ + abcde\n1234Xyz + 0: abcde\x0a1234X + BarFoo + 0: B + *** Failers +No match + abcde\nBar +No match + +/^.*B/ + **** Failers +No match + abc\nB +No match + +/(?s)^.*B/ + abc\nB + 0: abc\x0aB + +/(?m)^.*B/ + abc\nB + 0: B + +/(?ms)^.*B/ + abc\nB + 0: abc\x0aB + +/(?ms)^B/ + abc\nB + 0: B + +/(?s)B$/ + B\n + 0: B + +/^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/ + 123456654321 + 0: 123456654321 + +/^\d\d\d\d\d\d\d\d\d\d\d\d/ + 123456654321 + 0: 123456654321 + +/^[\d][\d][\d][\d][\d][\d][\d][\d][\d][\d][\d][\d]/ + 123456654321 + 0: 123456654321 + +/^[abc]{12}/ + abcabcabcabc + 0: abcabcabcabc + +/^[a-c]{12}/ + abcabcabcabc + 0: abcabcabcabc + +/^(a|b|c){12}/ + abcabcabcabc + 0: abcabcabcabc + +/^[abcdefghijklmnopqrstuvwxy0123456789]/ + n + 0: n + *** Failers +No match + z +No match + +/abcde{0,0}/ + abcd + 0: abcd + *** Failers +No match + abce +No match + +/ab[cd]{0,0}e/ + abe + 0: abe + *** Failers +No match + abcde +No match + +/ab(c){0,0}d/ + abd + 0: abd + *** Failers +No match + abcd +No match + +/a(b*)/ + a + 0: a + ab + 0: ab + abbbb + 0: abbbb + *** Failers + 0: a + bbbbb +No match + +/ab\d{0}e/ + abe + 0: abe + *** Failers +No match + ab1e +No match + +/"([^\\"]+|\\.)*"/ + the \"quick\" brown fox + 0: "quick" + \"the \\\"quick\\\" brown fox\" + 0: "the \"quick\" brown fox" + +/.*?/g+ + abc + 0: abc + 0+ + 1: ab + 2: a + 3: + 0: + 0+ + +/\b/g+ + abc + 0: + 0+ abc + 0: + 0+ + +/\b/+g + abc + 0: + 0+ abc + 0: + 0+ + +//g + abc + 0: + 0: + 0: + 0: + +/]{0,})>]{0,})>([\d]{0,}\.)(.*)((
([\w\W\s\d][^<>]{0,})|[\s]{0,}))<\/a><\/TD>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD><\/TR>/is + 43.
Word Processor
(N-1286)
Lega lstaff.comCA - Statewide + 0: 43.Word Processor
(N-1286)
Lega lstaff.comCA - Statewide + +/a[^a]b/ + acb + 0: acb + a\nb + 0: a\x0ab + +/a.b/ + acb + 0: acb + *** Failers +No match + a\nb +No match + +/a[^a]b/s + acb + 0: acb + a\nb + 0: a\x0ab + +/a.b/s + acb + 0: acb + a\nb + 0: a\x0ab + +/^(b+?|a){1,2}?c/ + bac + 0: bac + bbac + 0: bbac + bbbac + 0: bbbac + bbbbac + 0: bbbbac + bbbbbac + 0: bbbbbac + +/^(b+|a){1,2}?c/ + bac + 0: bac + bbac + 0: bbac + bbbac + 0: bbbac + bbbbac + 0: bbbbac + bbbbbac + 0: bbbbbac + +/(?!\A)x/m + x\nb\n +No match + a\bx\n + 0: x + +/\x0{ab}/ + \0{ab} + 0: \x00{ab} + +/(A|B)*?CD/ + CD + 0: CD + +/(A|B)*CD/ + CD + 0: CD + +/(?.*/)foo" + /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/it/you/see/ +No match + +"(?>.*/)foo" + /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo + 0: /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo + +/(?>(\.\d\d[1-9]?))\d+/ + 1.230003938 + 0: .230003938 + 1.875000282 + 0: .875000282 + *** Failers +No match + 1.235 +No match + +/^((?>\w+)|(?>\s+))*$/ + now is the time for all good men to come to the aid of the party + 0: now is the time for all good men to come to the aid of the party + *** Failers +No match + this is not a line with only words and spaces! +No match + +/(\d+)(\w)/ + 12345a + 0: 12345a + 1: 12345 + 2: 1234 + 3: 123 + 4: 12 + 12345+ + 0: 12345 + 1: 1234 + 2: 123 + 3: 12 + +/((?>\d+))(\w)/ + 12345a + 0: 12345a + *** Failers +No match + 12345+ +No match + +/(?>a+)b/ + aaab + 0: aaab + +/((?>a+)b)/ + aaab + 0: aaab + +/(?>(a+))b/ + aaab + 0: aaab + +/(?>b)+/ + aaabbbccc + 0: bbb + 1: bb + 2: b + +/(?>a+|b+|c+)*c/ + aaabbbbccccd + 0: aaabbbbcccc + 1: aaabbbbc + +/(a+|b+|c+)*c/ + aaabbbbccccd + 0: aaabbbbcccc + 1: aaabbbbccc + 2: aaabbbbcc + 3: aaabbbbc + +/((?>[^()]+)|\([^()]*\))+/ + ((abc(ade)ufh()()x + 0: abc(ade)ufh()()x + 1: abc(ade)ufh()() + 2: abc(ade)ufh() + 3: abc(ade)ufh + 4: abc(ade) + 5: abc + +/\(((?>[^()]+)|\([^()]+\))+\)/ + (abc) + 0: (abc) + (abc(def)xyz) + 0: (abc(def)xyz) + *** Failers +No match + ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +No match + +/a(?-i)b/i + ab + 0: ab + Ab + 0: Ab + *** Failers +No match + aB +No match + AB +No match + +/(a (?x)b c)d e/ + a bcd e + 0: a bcd e + *** Failers +No match + a b cd e +No match + abcd e +No match + a bcde +No match + +/(a b(?x)c d (?-x)e f)/ + a bcde f + 0: a bcde f + *** Failers +No match + abcdef +No match + +/(a(?i)b)c/ + abc + 0: abc + aBc + 0: aBc + *** Failers +No match + abC +No match + aBC +No match + Abc +No match + ABc +No match + ABC +No match + AbC +No match + +/a(?i:b)c/ + abc + 0: abc + aBc + 0: aBc + *** Failers +No match + ABC +No match + abC +No match + aBC +No match + +/a(?i:b)*c/ + aBc + 0: aBc + aBBc + 0: aBBc + *** Failers +No match + aBC +No match + aBBC +No match + +/a(?=b(?i)c)\w\wd/ + abcd + 0: abcd + abCd + 0: abCd + *** Failers +No match + aBCd +No match + abcD +No match + +/(?s-i:more.*than).*million/i + more than million + 0: more than million + more than MILLION + 0: more than MILLION + more \n than Million + 0: more \x0a than Million + *** Failers +No match + MORE THAN MILLION +No match + more \n than \n million +No match + +/(?:(?s-i)more.*than).*million/i + more than million + 0: more than million + more than MILLION + 0: more than MILLION + more \n than Million + 0: more \x0a than Million + *** Failers +No match + MORE THAN MILLION +No match + more \n than \n million +No match + +/(?>a(?i)b+)+c/ + abc + 0: abc + aBbc + 0: aBbc + aBBc + 0: aBBc + *** Failers +No match + Abc +No match + abAb +No match + abbC +No match + +/(?=a(?i)b)\w\wc/ + abc + 0: abc + aBc + 0: aBc + *** Failers +No match + Ab +No match + abC +No match + aBC +No match + +/(?<=a(?i)b)(\w\w)c/ + abxxc + 0: xxc + aBxxc + 0: xxc + *** Failers +No match + Abxxc +No match + ABxxc +No match + abxxC +No match + +/^(?(?=abc)\w{3}:|\d\d)$/ + abc: + 0: abc: + 12 + 0: 12 + *** Failers +No match + 123 +No match + xyz +No match + +/^(?(?!abc)\d\d|\w{3}:)$/ + abc: + 0: abc: + 12 + 0: 12 + *** Failers +No match + 123 +No match + xyz +No match + +/(?(?<=foo)bar|cat)/ + foobar + 0: bar + cat + 0: cat + fcat + 0: cat + focat + 0: cat + *** Failers +No match + foocat +No match + +/(?(?a*)*/ + a + 0: a + 1: + aa + 0: aa + 1: + aaaa + 0: aaaa + 1: + +/(abc|)+/ + abc + 0: abc + 1: + abcabc + 0: abcabc + 1: abc + 2: + abcabcabc + 0: abcabcabc + 1: abcabc + 2: abc + 3: + xyz + 0: + +/([a]*)*/ + a + 0: a + 1: + aaaaa + 0: aaaaa + 1: aaaa + 2: aaa + 3: aa + 4: a + 5: + +/([ab]*)*/ + a + 0: a + 1: + b + 0: b + 1: + ababab + 0: ababab + 1: ababa + 2: abab + 3: aba + 4: ab + 5: a + 6: + aaaabcde + 0: aaaab + 1: aaaa + 2: aaa + 3: aa + 4: a + 5: + bbbb + 0: bbbb + 1: bbb + 2: bb + 3: b + 4: + +/([^a]*)*/ + b + 0: b + 1: + bbbb + 0: bbbb + 1: bbb + 2: bb + 3: b + 4: + aaa + 0: + +/([^ab]*)*/ + cccc + 0: cccc + 1: ccc + 2: cc + 3: c + 4: + abab + 0: + +/([a]*?)*/ + a + 0: a + 1: + aaaa + 0: aaaa + 1: aaa + 2: aa + 3: a + 4: + +/([ab]*?)*/ + a + 0: a + 1: + b + 0: b + 1: + abab + 0: abab + 1: aba + 2: ab + 3: a + 4: + baba + 0: baba + 1: bab + 2: ba + 3: b + 4: + +/([^a]*?)*/ + b + 0: b + 1: + bbbb + 0: bbbb + 1: bbb + 2: bb + 3: b + 4: + aaa + 0: + +/([^ab]*?)*/ + c + 0: c + 1: + cccc + 0: cccc + 1: ccc + 2: cc + 3: c + 4: + baba + 0: + +/(?>a*)*/ + a + 0: a + 1: + aaabcde + 0: aaa + 1: + +/((?>a*))*/ + aaaaa + 0: aaaaa + 1: + aabbaa + 0: aa + 1: + +/((?>a*?))*/ + aaaaa + 0: aaaaa + 1: + aabbaa + 0: aa + 1: + +/(?(?=[^a-z]+[a-z]) \d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} ) /x + 12-sep-98 + 0: 12-sep-98 + 12-09-98 + 0: 12-09-98 + *** Failers +No match + sep-12-98 +No match + +/(?i:saturday|sunday)/ + saturday + 0: saturday + sunday + 0: sunday + Saturday + 0: Saturday + Sunday + 0: Sunday + SATURDAY + 0: SATURDAY + SUNDAY + 0: SUNDAY + SunDay + 0: SunDay + +/(a(?i)bc|BB)x/ + abcx + 0: abcx + aBCx + 0: aBCx + bbx + 0: bbx + BBx + 0: BBx + *** Failers +No match + abcX +No match + aBCX +No match + bbX +No match + BBX +No match + +/^([ab](?i)[cd]|[ef])/ + ac + 0: ac + aC + 0: aC + bD + 0: bD + elephant + 0: e + Europe + 0: E + frog + 0: f + France + 0: F + *** Failers +No match + Africa +No match + +/^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/ + ab + 0: ab + aBd + 0: aBd + xy + 0: xy + xY + 0: xY + zebra + 0: z + Zambesi + 0: Z + *** Failers +No match + aCD +No match + XY +No match + +/(?<=foo\n)^bar/m + foo\nbar + 0: bar + *** Failers +No match + bar +No match + baz\nbar +No match + +/(?<=(?]&/ + <&OUT + 0: <& + +/(?:(f)(o)(o)|(b)(a)(r))*/ + foobar + 0: foobar + 1: foo + 2: + +/(?<=a)b/ + ab + 0: b + *** Failers +No match + cb +No match + b +No match + +/(?a+)ab/ + +/(?>a+)b/ + aaab + 0: aaab + +/([[:]+)/ + a:[b]: + 0: :[ + +/([[=]+)/ + a=[b]= + 0: =[ + +/([[.]+)/ + a.[b]. + 0: .[ + +/((?>a+)b)/ + aaab + 0: aaab + +/(?>(a+))b/ + aaab + 0: aaab + +/((?>[^()]+)|\([^()]*\))+/ + ((abc(ade)ufh()()x + 0: abc(ade)ufh()()x + 1: abc(ade)ufh()() + 2: abc(ade)ufh() + 3: abc(ade)ufh + 4: abc(ade) + 5: abc + +/a\Z/ + *** Failers +No match + aaab +No match + a\nb\n +No match + +/b\Z/ + a\nb\n + 0: b + +/b\z/ + +/b\Z/ + a\nb + 0: b + +/b\z/ + a\nb + 0: b + *** Failers +No match + +/(?>.*)(?<=(abcd|wxyz))/ + alphabetabcd + 0: alphabetabcd + endingwxyz + 0: endingwxyz + *** Failers +No match + a rather long string that doesn't end with one of them +No match + +/word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword/ + word cat dog elephant mussel cow horse canary baboon snake shark otherword + 0: word cat dog elephant mussel cow horse canary baboon snake shark otherword + word cat dog elephant mussel cow horse canary baboon snake shark +No match + +/word (?>[a-zA-Z0-9]+ ){0,30}otherword/ + word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope +No match + +/(?<=\d{3}(?!999))foo/ + 999foo + 0: foo + 123999foo + 0: foo + *** Failers +No match + 123abcfoo +No match + +/(?<=(?!...999)\d{3})foo/ + 999foo + 0: foo + 123999foo + 0: foo + *** Failers +No match + 123abcfoo +No match + +/(?<=\d{3}(?!999)...)foo/ + 123abcfoo + 0: foo + 123456foo + 0: foo + *** Failers +No match + 123999foo +No match + +/(?<=\d{3}...)(?Z)+|A)*/ + ZABCDEFG + 0: ZA + 1: Z + 2: + +/((?>)+|A)*/ + ZABCDEFG + 0: + +/a*/g + abbab + 0: a + 0: + 0: + 0: a + 0: + 0: + +/^[\d-a]/ + abcde + 0: a + -things + 0: - + 0digit + 0: 0 + *** Failers +No match + bcdef +No match + +/[[:space:]]+/ + > \x09\x0a\x0c\x0d\x0b< + 0: \x09\x0a\x0c\x0d\x0b + +/[[:blank:]]+/ + > \x09\x0a\x0c\x0d\x0b< + 0: \x09 + +/[\s]+/ + > \x09\x0a\x0c\x0d\x0b< + 0: \x09\x0a\x0c\x0d\x0b + +/\s+/ + > \x09\x0a\x0c\x0d\x0b< + 0: \x09\x0a\x0c\x0d\x0b + +/a b/x + ab + 0: ab + +/(?!\A)x/m + a\nxb\n + 0: x + +/(?!^)x/m + a\nxb\n +No match + +/abc\Qabc\Eabc/ + abcabcabc + 0: abcabcabc + +/abc\Q(*+|\Eabc/ + abc(*+|abc + 0: abc(*+|abc + +/ abc\Q abc\Eabc/x + abc abcabc + 0: abc abcabc + *** Failers +No match + abcabcabc +No match + +/abc#comment + \Q#not comment + literal\E/x + abc#not comment\n literal + 0: abc#not comment\x0a literal + +/abc#comment + \Q#not comment + literal/x + abc#not comment\n literal + 0: abc#not comment\x0a literal + +/abc#comment + \Q#not comment + literal\E #more comment + /x + abc#not comment\n literal + 0: abc#not comment\x0a literal + +/abc#comment + \Q#not comment + literal\E #more comment/x + abc#not comment\n literal + 0: abc#not comment\x0a literal + +/\Qabc\$xyz\E/ + abc\\\$xyz + 0: abc\$xyz + +/\Qabc\E\$\Qxyz\E/ + abc\$xyz + 0: abc$xyz + +/\Gabc/ + abc + 0: abc + *** Failers +No match + xyzabc +No match + +/\Gabc./g + abc1abc2xyzabc3 + 0: abc1 + 0: abc2 + +/abc./g + abc1abc2xyzabc3 + 0: abc1 + 0: abc2 + 0: abc3 + +/a(?x: b c )d/ + XabcdY + 0: abcd + *** Failers +No match + Xa b c d Y +No match + +/((?x)x y z | a b c)/ + XabcY + 0: abc + AxyzB + 0: xyz + +/(?i)AB(?-i)C/ + XabCY + 0: abC + *** Failers +No match + XabcY +No match + +/((?i)AB(?-i)C|D)E/ + abCE + 0: abCE + DE + 0: DE + *** Failers +No match + abcE +No match + abCe +No match + dE +No match + De +No match + +/[z\Qa-d]\E]/ + z + 0: z + a + 0: a + - + 0: - + d + 0: d + ] + 0: ] + *** Failers + 0: a + b +No match + +/[\z\C]/ + z + 0: z + C + 0: C + +/\M/ + M + 0: M + +/(a+)*b/ + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +No match + +/(?i)reg(?:ul(?:[aä]|ae)r|ex)/ + REGular + 0: REGular + regulaer + 0: regulaer + Regex + 0: Regex + regulär + 0: regul\xe4r + +/Åæåä[à-ÿÀ-ß]+/ + Åæåäà + 0: \xc5\xe6\xe5\xe4\xe0 + Åæåäÿ + 0: \xc5\xe6\xe5\xe4\xff + ÅæåäÀ + 0: \xc5\xe6\xe5\xe4\xc0 + Åæåäß + 0: \xc5\xe6\xe5\xe4\xdf + +/(?<=Z)X./ + \x84XAZXB + 0: XB + +/^(?(2)a|(1)(2))+$/ + 123a +Error -17 (backreference condition or recursion test not supported for DFA matching) + +/(?<=a|bbbb)c/ + ac + 0: c + bbbbc + 0: c + +/abc/SS>testsavedregex +Compiled pattern written to testsavedregex +testsavedregex +Compiled pattern written to testsavedregex +testsavedregex +Compiled pattern written to testsavedregex +Study data written to testsavedregex +testsavedregex +Compiled pattern written to testsavedregex +Study data written to testsavedregex + + 0: abc + xyz\r\nabc\ + 0: abc + xyz\rabc\ + 0: abc + xyz\r\nabc\ + 0: abc + ** Failers +No match + xyz\nabc\ +No match + xyz\r\nabc\ +No match + xyz\nabc\ +No match + xyz\rabc\ +No match + xyz\rabc\ +No match + +/abc$/m + xyzabc + 0: abc + xyzabc\n + 0: abc + xyzabc\npqr + 0: abc + xyzabc\r\ + 0: abc + xyzabc\rpqr\ + 0: abc + xyzabc\r\n\ + 0: abc + xyzabc\r\npqr\ + 0: abc + ** Failers +No match + xyzabc\r +No match + xyzabc\rpqr +No match + xyzabc\r\n +No match + xyzabc\r\npqr +No match + +/^abc/m + xyz\rabcdef + 0: abc + xyz\nabcdef\ + 0: abc + ** Failers +No match + xyz\nabcdef +No match + +/^abc/m + xyz\nabcdef + 0: abc + xyz\rabcdef\ + 0: abc + ** Failers +No match + xyz\rabcdef +No match + +/^abc/m + xyz\r\nabcdef + 0: abc + xyz\rabcdef\ + 0: abc + ** Failers +No match + xyz\rabcdef +No match + +/.*/ + abc\ndef + 0: abc + abc\rdef + 0: abc\x0ddef + abc\r\ndef + 0: abc\x0d + \abc\ndef + 0: abc\x0adef + \abc\rdef + 0: abc + \abc\r\ndef + 0: abc + \abc\ndef + 0: abc\x0adef + \abc\rdef + 0: abc\x0ddef + \abc\r\ndef + 0: abc + +/\w+(.)(.)?def/s + abc\ndef + 0: abc\x0adef + abc\rdef + 0: abc\x0ddef + abc\r\ndef + 0: abc\x0d\x0adef + +/^\w+=.*(\\\n.*)*/ + abc=xyz\\\npqr + 0: abc=xyz\\x0apqr + 1: abc=xyz\\x0apq + 2: abc=xyz\\x0ap + 3: abc=xyz\\x0a + 4: abc=xyz\ + 5: abc=xyz + 6: abc=xy + 7: abc=x + 8: abc= + +/^(a()*)*/ + aaaa + 0: aaaa + 1: aaa + 2: aa + 3: a + 4: + +/^(?:a(?:(?:))*)*/ + aaaa + 0: aaaa + 1: aaa + 2: aa + 3: a + 4: + +/^(a()+)+/ + aaaa + 0: aaaa + 1: aaa + 2: aa + 3: a + +/^(?:a(?:(?:))+)+/ + aaaa + 0: aaaa + 1: aaa + 2: aa + 3: a + +/(a|)*\d/ + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +No match + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4 + 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4 + +/(?>a|)*\d/ + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +No match + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4 + 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4 + +/(?:a|)*\d/ + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +No match + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4 + 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4 + +/^a.b/ + a\rb + 0: a\x0db + a\nb\ + 0: a\x0ab + ** Failers +No match + a\nb +No match + a\nb\ +No match + a\rb\ +No match + a\rb\ +No match + +/^abc./mgx + abc1 \x0aabc2 \x0babc3xx \x0cabc4 \x0dabc5xx \x0d\x0aabc6 \x85abc7 JUNK + 0: abc1 + 0: abc2 + 0: abc3 + 0: abc4 + 0: abc5 + 0: abc6 + 0: abc7 + +/abc.$/mgx + abc1\x0a abc2\x0b abc3\x0c abc4\x0d abc5\x0d\x0a abc6\x85 abc9 + 0: abc1 + 0: abc2 + 0: abc3 + 0: abc4 + 0: abc5 + 0: abc6 + 0: abc9 + +/^a\Rb/ + a\nb + 0: a\x0ab + a\rb + 0: a\x0db + a\r\nb + 0: a\x0d\x0ab + a\x0bb + 0: a\x0bb + a\x0cb + 0: a\x0cb + a\x85b + 0: a\x85b + ** Failers +No match + a\n\rb +No match + +/^a\R*b/ + ab + 0: ab + a\nb + 0: a\x0ab + a\rb + 0: a\x0db + a\r\nb + 0: a\x0d\x0ab + a\x0bb + 0: a\x0bb + a\x0cb + 0: a\x0cb + a\x85b + 0: a\x85b + a\n\rb + 0: a\x0a\x0db + a\n\r\x85\x0cb + 0: a\x0a\x0d\x85\x0cb + +/^a\R+b/ + a\nb + 0: a\x0ab + a\rb + 0: a\x0db + a\r\nb + 0: a\x0d\x0ab + a\x0bb + 0: a\x0bb + a\x0cb + 0: a\x0cb + a\x85b + 0: a\x85b + a\n\rb + 0: a\x0a\x0db + a\n\r\x85\x0cb + 0: a\x0a\x0d\x85\x0cb + ** Failers +No match + ab +No match + +/^a\R{1,3}b/ + a\nb + 0: a\x0ab + a\n\rb + 0: a\x0a\x0db + a\n\r\x85b + 0: a\x0a\x0d\x85b + a\r\n\r\nb + 0: a\x0d\x0a\x0d\x0ab + a\r\n\r\n\r\nb + 0: a\x0d\x0a\x0d\x0a\x0d\x0ab + a\n\r\n\rb + 0: a\x0a\x0d\x0a\x0db + a\n\n\r\nb + 0: a\x0a\x0a\x0d\x0ab + ** Failers +No match + a\n\n\n\rb +No match + a\r +No match + +/^a[\R]b/ + aRb + 0: aRb + ** Failers +No match + a\nb +No match + +/.+foo/ + afoo + 0: afoo + ** Failers +No match + \r\nfoo +No match + \nfoo +No match + +/.+foo/ + afoo + 0: afoo + \nfoo + 0: \x0afoo + ** Failers +No match + \r\nfoo +No match + +/.+foo/ + afoo + 0: afoo + ** Failers +No match + \nfoo +No match + \r\nfoo +No match + +/.+foo/s + afoo + 0: afoo + \r\nfoo + 0: \x0d\x0afoo + \nfoo + 0: \x0afoo + +/^$/mg + abc\r\rxyz + 0: + abc\n\rxyz + 0: + ** Failers +No match + abc\r\nxyz +No match + +/^X/m + XABC + 0: X + ** Failers +No match + XABC\B +No match + +/(?m)^$/g+ + abc\r\n\r\n + 0: + 0+ \x0d\x0a + +/(?m)^$|^\r\n/g+ + abc\r\n\r\n + 0: \x0d\x0a + 0+ + 1: + +/(?m)$/g+ + abc\r\n\r\n + 0: + 0+ \x0d\x0a\x0d\x0a + 0: + 0+ \x0d\x0a + 0: + 0+ + +/(?|(abc)|(xyz))/ + >abc< + 0: abc + >xyz< + 0: xyz + +/(x)(?|(abc)|(xyz))(x)/ + xabcx + 0: xabcx + xxyzx + 0: xxyzx + +/(x)(?|(abc)(pqr)|(xyz))(x)/ + xabcpqrx + 0: xabcpqrx + xxyzx + 0: xxyzx + +/(?|(abc)|(xyz))(?1)/ + abcabc + 0: abcabc + xyzabc + 0: xyzabc + ** Failers +No match + xyzxyz +No match + +/\H\h\V\v/ + X X\x0a + 0: X X\x0a + X\x09X\x0b + 0: X\x09X\x0b + ** Failers +No match + \xa0 X\x0a +No match + +/\H*\h+\V?\v{3,4}/ + \x09\x20\xa0X\x0a\x0b\x0c\x0d\x0a + 0: \x09 \xa0X\x0a\x0b\x0c\x0d + \x09\x20\xa0\x0a\x0b\x0c\x0d\x0a + 0: \x09 \xa0\x0a\x0b\x0c\x0d + \x09\x20\xa0\x0a\x0b\x0c + 0: \x09 \xa0\x0a\x0b\x0c + ** Failers +No match + \x09\x20\xa0\x0a\x0b +No match + +/\H{3,4}/ + XY ABCDE + 0: ABCD + XY PQR ST + 0: PQR + +/.\h{3,4}./ + XY AB PQRS + 0: B P + 1: B + +/\h*X\h?\H+Y\H?Z/ + >XNNNYZ + 0: XNNNYZ + > X NYQZ + 0: X NYQZ + ** Failers +No match + >XYZ +No match + > X NY Z +No match + +/\v*X\v?Y\v+Z\V*\x0a\V+\x0b\V{2,3}\x0c/ + >XY\x0aZ\x0aA\x0bNN\x0c + 0: XY\x0aZ\x0aA\x0bNN\x0c + >\x0a\x0dX\x0aY\x0a\x0bZZZ\x0aAAA\x0bNNN\x0c + 0: \x0a\x0dX\x0aY\x0a\x0bZZZ\x0aAAA\x0bNNN\x0c + +/.+A/ + \r\nA +No match + +/\nA/ + \r\nA + 0: \x0aA + +/[\r\n]A/ + \r\nA + 0: \x0aA + +/(\r|\n)A/ + \r\nA + 0: \x0aA + +/a\Rb/I +Capturing subpattern count = 0 +Options: bsr_anycrlf +First char = 'a' +Need char = 'b' + a\rb + 0: a\x0db + a\nb + 0: a\x0ab + a\r\nb + 0: a\x0d\x0ab + ** Failers +No match + a\x85b +No match + a\x0bb +No match + +/a\Rb/I +Capturing subpattern count = 0 +Options: bsr_unicode +First char = 'a' +Need char = 'b' + a\rb + 0: a\x0db + a\nb + 0: a\x0ab + a\r\nb + 0: a\x0d\x0ab + a\x85b + 0: a\x85b + a\x0bb + 0: a\x0bb + ** Failers +No match + a\x85b\ +No match + a\x0bb\ +No match + +/a\R?b/I +Capturing subpattern count = 0 +Options: bsr_anycrlf +First char = 'a' +Need char = 'b' + a\rb + 0: a\x0db + a\nb + 0: a\x0ab + a\r\nb + 0: a\x0d\x0ab + ** Failers +No match + a\x85b +No match + a\x0bb +No match + +/a\R?b/I +Capturing subpattern count = 0 +Options: bsr_unicode +First char = 'a' +Need char = 'b' + a\rb + 0: a\x0db + a\nb + 0: a\x0ab + a\r\nb + 0: a\x0d\x0ab + a\x85b + 0: a\x85b + a\x0bb + 0: a\x0bb + ** Failers +No match + a\x85b\ +No match + a\x0bb\ +No match + +/a\R{2,4}b/I +Capturing subpattern count = 0 +Options: bsr_anycrlf +First char = 'a' +Need char = 'b' + a\r\n\nb + 0: a\x0d\x0a\x0ab + a\n\r\rb + 0: a\x0a\x0d\x0db + a\r\n\r\n\r\n\r\nb + 0: a\x0d\x0a\x0d\x0a\x0d\x0a\x0d\x0ab + ** Failers +No match + a\x85\85b +No match + a\x0b\0bb +No match + +/a\R{2,4}b/I +Capturing subpattern count = 0 +Options: bsr_unicode +First char = 'a' +Need char = 'b' + a\r\rb + 0: a\x0d\x0db + a\n\n\nb + 0: a\x0a\x0a\x0ab + a\r\n\n\r\rb + 0: a\x0d\x0a\x0a\x0d\x0db + a\x85\85b +No match + a\x0b\0bb +No match + ** Failers +No match + a\r\r\r\r\rb +No match + a\x85\85b\ +No match + a\x0b\0bb\ +No match + +/a(?!)|\wbc/ + abc + 0: abc + +/a[]b/ + ** Failers +No match + ab +No match + +/a[]+b/ + ** Failers +No match + ab +No match + +/a[]*+b/ + ** Failers +No match + ab +No match + +/a[^]b/ + aXb + 0: aXb + a\nb + 0: a\x0ab + ** Failers +No match + ab +No match + +/a[^]+b/ + aXb + 0: aXb + a\nX\nXb + 0: a\x0aX\x0aXb + ** Failers +No match + ab +No match + +/X$/E + X + 0: X + ** Failers +No match + X\n +No match + +/X$/ + X + 0: X + X\n + 0: X + +/xyz/C + xyz +--->xyz + +0 ^ x + +1 ^^ y + +2 ^ ^ z + +3 ^ ^ + 0: xyz + abcxyz +--->abcxyz + +0 ^ x + +1 ^^ y + +2 ^ ^ z + +3 ^ ^ + 0: xyz + abcxyz\Y +--->abcxyz + +0 ^ x + +0 ^ x + +0 ^ x + +0 ^ x + +1 ^^ y + +2 ^ ^ z + +3 ^ ^ + 0: xyz + ** Failers +No match + abc +No match + abc\Y +--->abc + +0 ^ x + +0 ^ x + +0 ^ x + +0 ^ x +No match + abcxypqr +No match + abcxypqr\Y +--->abcxypqr + +0 ^ x + +0 ^ x + +0 ^ x + +0 ^ x + +1 ^^ y + +2 ^ ^ z + +0 ^ x + +0 ^ x + +0 ^ x + +0 ^ x + +0 ^ x +No match + +/(*NO_START_OPT)xyz/C + abcxyz +--->abcxyz ++15 ^ x ++15 ^ x ++15 ^ x ++15 ^ x ++16 ^^ y ++17 ^ ^ z ++18 ^ ^ + 0: xyz + +/(?C)ab/ + ab +--->ab + 0 ^ a + 0: ab + \C-ab + 0: ab + +/ab/C + ab +--->ab + +0 ^ a + +1 ^^ b + +2 ^ ^ + 0: ab + \C-ab + 0: ab + +/^"((?(?=[a])[^"])|b)*"$/C + "ab" +--->"ab" + +0 ^ ^ + +1 ^ " + +2 ^^ ((?(?=[a])[^"])|b)* ++21 ^^ " + +3 ^^ (?(?=[a])[^"]) ++18 ^^ b + +5 ^^ (?=[a]) + +8 ^ [a] ++11 ^^ ) ++12 ^^ [^"] ++16 ^ ^ ) ++17 ^ ^ | ++21 ^ ^ " + +3 ^ ^ (?(?=[a])[^"]) ++18 ^ ^ b + +5 ^ ^ (?=[a]) + +8 ^ [a] ++19 ^ ^ ) ++21 ^ ^ " + +3 ^ ^ (?(?=[a])[^"]) ++18 ^ ^ b + +5 ^ ^ (?=[a]) + +8 ^ [a] ++17 ^ ^ | ++22 ^ ^ $ ++23 ^ ^ + 0: "ab" + \C-"ab" + 0: "ab" + +/\d+X|9+Y/ + ++++123999\P +Partial match: 123999 + ++++123999Y\P + 0: 999Y + +/Z(*F)/ + Z\P +No match + ZA\P +No match + +/Z(?!)/ + Z\P +No match + ZA\P +No match + +/dog(sbody)?/ + dogs\P + 0: dog + dogs\P\P +Partial match: dogs + +/dog(sbody)??/ + dogs\P + 0: dog + dogs\P\P +Partial match: dogs + +/dog|dogsbody/ + dogs\P + 0: dog + dogs\P\P +Partial match: dogs + +/dogsbody|dog/ + dogs\P + 0: dog + dogs\P\P +Partial match: dogs + +/Z(*F)Q|ZXY/ + Z\P +Partial match: Z + ZA\P +No match + X\P +No match + +/\bthe cat\b/ + the cat\P + 0: the cat + the cat\P\P +Partial match: the cat + +/dog(sbody)?/ + dogs\D\P + 0: dog + body\D\R + 0: body + +/dog(sbody)?/ + dogs\D\P\P +Partial match: dogs + body\D\R + 0: body + +/abc/ + abc\P + 0: abc + abc\P\P + 0: abc + +/abc\K123/ + xyzabc123pqr +Error -16 (item unsupported for DFA matching) + +/(?<=abc)123/ + xyzabc123pqr + 0: 123 + xyzabc12\P +Partial match at offset 6: abc12 + xyzabc12\P\P +Partial match at offset 6: abc12 + +/\babc\b/ + +++abc+++ + 0: abc + +++ab\P +Partial match at offset 3: +ab + +++ab\P\P +Partial match at offset 3: +ab + +/(?=C)/g+ + ABCDECBA + 0: + 0+ CDECBA + 0: + 0+ CBA + +/(abc|def|xyz)/I +Capturing subpattern count = 1 +No options +No first char +No need char + terhjk;abcdaadsfe + 0: abc + the quick xyz brown fox + 0: xyz + \Yterhjk;abcdaadsfe + 0: abc + \Ythe quick xyz brown fox + 0: xyz + ** Failers +No match + thejk;adlfj aenjl;fda asdfasd ehj;kjxyasiupd +No match + \Ythejk;adlfj aenjl;fda asdfasd ehj;kjxyasiupd +No match + +/(abc|def|xyz)/SI +Capturing subpattern count = 1 +No options +No first char +No need char +Subject length lower bound = 3 +Starting chars: a d x + terhjk;abcdaadsfe + 0: abc + the quick xyz brown fox + 0: xyz + \Yterhjk;abcdaadsfe + 0: abc + \Ythe quick xyz brown fox + 0: xyz + ** Failers +No match + thejk;adlfj aenjl;fda asdfasd ehj;kjxyasiupd +No match + \Ythejk;adlfj aenjl;fda asdfasd ehj;kjxyasiupd +No match + +/abcd*/+ + xxxxabcd\P + 0: abcd + 0+ + xxxxabcd\P\P +Partial match: abcd + dddxxx\R + 0: ddd + 0+ xxx + xxxxabcd\P\P +Partial match: abcd + xxx\R + 0: + 0+ xxx + +/abcd*/i + xxxxabcd\P + 0: abcd + xxxxabcd\P\P +Partial match: abcd + XXXXABCD\P + 0: ABCD + XXXXABCD\P\P +Partial match: ABCD + +/abc\d*/ + xxxxabc1\P + 0: abc1 + xxxxabc1\P\P +Partial match: abc1 + +/abc[de]*/ + xxxxabcde\P + 0: abcde + xxxxabcde\P\P +Partial match: abcde + +/(?:(?1)|B)(A(*F)|C)/ + ABCD + 0: BC + CCD + 0: CC + ** Failers +No match + CAD +No match + +/^(?:(?1)|B)(A(*F)|C)/ + CCD + 0: CC + BCD + 0: BC + ** Failers +No match + ABCD +No match + CAD +No match + BAD +No match + +/^(?!a(*SKIP)b)/ + ac +Error -16 (item unsupported for DFA matching) + +/^(?=a(*SKIP)b|ac)/ + ** Failers +No match + ac +Error -16 (item unsupported for DFA matching) + +/^(?=a(*THEN)b|ac)/ + ac +Error -16 (item unsupported for DFA matching) + +/^(?=a(*PRUNE)b)/ + ab +Error -16 (item unsupported for DFA matching) + ** Failers +No match + ac +Error -16 (item unsupported for DFA matching) + +/^(?(?!a(*SKIP)b))/ + ac +Error -16 (item unsupported for DFA matching) + +/(?<=abc)def/ + abc\P\P +Partial match at offset 3: abc + +/abc$/ + abc + 0: abc + abc\P + 0: abc + abc\P\P +Partial match: abc + +/abc$/m + abc + 0: abc + abc\n + 0: abc + abc\P\P +Partial match: abc + abc\n\P\P + 0: abc + abc\P + 0: abc + abc\n\P + 0: abc + +/abc\z/ + abc + 0: abc + abc\P + 0: abc + abc\P\P +Partial match: abc + +/abc\Z/ + abc + 0: abc + abc\P + 0: abc + abc\P\P +Partial match: abc + +/abc\b/ + abc + 0: abc + abc\P + 0: abc + abc\P\P +Partial match: abc + +/abc\B/ + abc +No match + abc\P +Partial match: abc + abc\P\P +Partial match: abc + +/.+/ + abc\>0 + 0: abc + abc\>1 + 0: bc + abc\>2 + 0: c + abc\>3 +No match + abc\>4 +Error -24 (bad offset value) + abc\>-4 +Error -24 (bad offset value) + +/^(?:a)++\w/ + aaaab + 0: aaaab + ** Failers +No match + aaaa +No match + bbb +No match + +/^(?:aa|(?:a)++\w)/ + aaaab + 0: aaaab + 1: aa + aaaa + 0: aa + ** Failers +No match + bbb +No match + +/^(?:a)*+\w/ + aaaab + 0: aaaab + bbb + 0: b + ** Failers +No match + aaaa +No match + +/^(a)++\w/ + aaaab + 0: aaaab + ** Failers +No match + aaaa +No match + bbb +No match + +/^(a|)++\w/ + aaaab + 0: aaaab + ** Failers +No match + aaaa +No match + bbb +No match + +/(?=abc){3}abc/+ + abcabcabc + 0: abc + 0+ abcabc + ** Failers +No match + xyz +No match + +/(?=abc)+abc/+ + abcabcabc + 0: abc + 0+ abcabc + ** Failers +No match + xyz +No match + +/(?=abc)++abc/+ + abcabcabc + 0: abc + 0+ abcabc + ** Failers +No match + xyz +No match + +/(?=abc){0}xyz/ + xyz + 0: xyz + +/(?=abc){1}xyz/ + ** Failers +No match + xyz +No match + +/(?=(a))?./ + ab + 0: a + bc + 0: b + +/(?=(a))??./ + ab + 0: a + bc + 0: b + +/^(?=(a)){0}b(?1)/ + backgammon + 0: ba + +/^(?=(?1))?[az]([abc])d/ + abd + 0: abd + zcdxx + 0: zcd + +/^(?!a){0}\w+/ + aaaaa + 0: aaaaa + +/(?<=(abc))?xyz/ + abcxyz + 0: xyz + pqrxyz + 0: xyz + +/((?2))((?1))/ + abc +Error -26 (nested recursion at the same subject position) + +/(?(R)a+|(?R)b)/ + aaaabcde + 0: aaaab + +/(?(R)a+|((?R))b)/ + aaaabcde + 0: aaaab + +/((?(R)a+|(?1)b))/ + aaaabcde + 0: aaaab + +/((?(R2)a+|(?1)b))/ + aaaabcde +Error -17 (backreference condition or recursion test not supported for DFA matching) + +/(?(R)a*(?1)|((?R))b)/ + aaaabcde +Error -26 (nested recursion at the same subject position) + +/(a+)/O + \O6aaaa +Matched, but offsets vector is too small to show all matches + 0: aaaa + 1: aaa + 2: aa + \O8aaaa + 0: aaaa + 1: aaa + 2: aa + 3: a + +/ab\Cde/ + abXde + 0: abXde + +/(?<=ab\Cde)X/ + abZdeX + 0: X + +/^\R/ + \r\P + 0: \x0d + \r\P\P +Partial match: \x0d + +/^\R{2,3}x/ + \r\P +Partial match: \x0d + \r\P\P +Partial match: \x0d + \r\r\P +Partial match: \x0d\x0d + \r\r\P\P +Partial match: \x0d\x0d + \r\r\r\P +Partial match: \x0d\x0d\x0d + \r\r\r\P\P +Partial match: \x0d\x0d\x0d + \r\rx + 0: \x0d\x0dx + \r\r\rx + 0: \x0d\x0d\x0dx + +/^\R{2,3}?x/ + \r\P +Partial match: \x0d + \r\P\P +Partial match: \x0d + \r\r\P +Partial match: \x0d\x0d + \r\r\P\P +Partial match: \x0d\x0d + \r\r\r\P +Partial match: \x0d\x0d\x0d + \r\r\r\P\P +Partial match: \x0d\x0d\x0d + \r\rx + 0: \x0d\x0dx + \r\r\rx + 0: \x0d\x0d\x0dx + +/^\R?x/ + \r\P +Partial match: \x0d + \r\P\P +Partial match: \x0d + x + 0: x + \rx + 0: \x0dx + +/^\R+x/ + \r\P +Partial match: \x0d + \r\P\P +Partial match: \x0d + \r\n\P +Partial match: \x0d\x0a + \r\n\P\P +Partial match: \x0d\x0a + \rx + 0: \x0dx + +/^a$/ + a\r\P +Partial match: a\x0d + a\r\P\P +Partial match: a\x0d + +/^a$/m + a\r\P +Partial match: a\x0d + a\r\P\P +Partial match: a\x0d + +/^(a$|a\r)/ + a\r\P + 0: a\x0d + a\r\P\P +Partial match: a\x0d + +/^(a$|a\r)/m + a\r\P + 0: a\x0d + a\r\P\P +Partial match: a\x0d + +/./ + \r\P + 0: \x0d + \r\P\P +Partial match: \x0d + +/.{2,3}/ + \r\P +Partial match: \x0d + \r\P\P +Partial match: \x0d + \r\r\P + 0: \x0d\x0d + \r\r\P\P +Partial match: \x0d\x0d + \r\r\r\P + 0: \x0d\x0d\x0d + \r\r\r\P\P +Partial match: \x0d\x0d\x0d + +/.{2,3}?/ + \r\P +Partial match: \x0d + \r\P\P +Partial match: \x0d + \r\r\P + 0: \x0d\x0d + \r\r\P\P +Partial match: \x0d\x0d + \r\r\r\P + 0: \x0d\x0d\x0d + 1: \x0d\x0d + \r\r\r\P\P +Partial match: \x0d\x0d\x0d + +/-- Test simple validity check for restarts --/ + +/abcdef/ + abc\R +Error -30 (invalid data in workspace for DFA restart) + +/)(.)|(?R))++)*F>/ + text text xxxxx text F> text2 more text. + 0: text xxxxx text F> + +/^(?>.{4})abc|^\w\w.xabcd/ + xxxxabcd + 0: xxxxabcd + 1: xxxxabc + xx\xa0xabcd + 0: xx\xa0xabcd + 1: xx\xa0xabc + +/^(.{4}){2}+abc|^\w\w.x\w\w\w\wabcd/ + xxxxxxxxabcd + 0: xxxxxxxxabcd + 1: xxxxxxxxabc + xx\xa0xxxxxabcd + 0: xx\xa0xxxxxabcd + 1: xx\xa0xxxxxabc + +/abcd/ + abcd\O0 +Matched, but offsets vector is too small to show all matches + +/-- These tests show up auto-possessification --/ + +/[ab]*/ + aaaa + 0: aaaa + +/[ab]*?/ + aaaa + 0: aaaa + 1: aaa + 2: aa + 3: a + 4: + +/[ab]?/ + aaaa + 0: a + +/[ab]??/ + aaaa + 0: a + 1: + +/[ab]+/ + aaaa + 0: aaaa + +/[ab]+?/ + aaaa + 0: aaaa + 1: aaa + 2: aa + 3: a + +/[ab]{2,3}/ + aaaa + 0: aaa + +/[ab]{2,3}?/ + aaaa + 0: aaa + 1: aa + +/[ab]{2,}/ + aaaa + 0: aaaa + +/[ab]{2,}?/ + aaaa + 0: aaaa + 1: aaa + 2: aa + +'\A(?:[^\"]++|\"(?:[^\"]*+|\"\")*+\")++' + NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED + 0: NON QUOTED "QUOT""ED" AFTER + +'\A(?:[^\"]++|\"(?:[^\"]++|\"\")*+\")++' + NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED + 0: NON QUOTED "QUOT""ED" AFTER + +/(?(?!)a|b)/ + bbb + 0: b + aaa +No match + +/()()a+/O= + aaa\D +** Show all captures ignored after DFA matching + 0: aaa + 1: aa + 2: a + a\D +** Show all captures ignored after DFA matching + 0: a + +/(02-)?[0-9]{3}-[0-9]{3}/ + 02-123-123 + 0: 02-123-123 + +/-- End of testinput8 --/ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput9 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput9 new file mode 100755 index 000000000..efbbf1801 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutput9 @@ -0,0 +1,1287 @@ +/-- This set of tests checks UTF-8 support with the DFA matching functionality + of pcre_dfa_exec(), excluding Unicode property support. The -dfa flag must + be used with pcretest when running it. --/ + +< forbid W + +/\x{100}ab/8 + \x{100}ab + 0: \x{100}ab + +/a\x{100}*b/8 + ab + 0: ab + a\x{100}b + 0: a\x{100}b + a\x{100}\x{100}b + 0: a\x{100}\x{100}b + +/a\x{100}+b/8 + a\x{100}b + 0: a\x{100}b + a\x{100}\x{100}b + 0: a\x{100}\x{100}b + *** Failers +No match + ab +No match + +/\bX/8 + Xoanon + 0: X + +Xoanon + 0: X + \x{300}Xoanon + 0: X + *** Failers +No match + YXoanon +No match + +/\BX/8 + YXoanon + 0: X + *** Failers +No match + Xoanon +No match + +Xoanon +No match + \x{300}Xoanon +No match + +/X\b/8 + X+oanon + 0: X + ZX\x{300}oanon + 0: X + FAX + 0: X + *** Failers +No match + Xoanon +No match + +/X\B/8 + Xoanon + 0: X + *** Failers +No match + X+oanon +No match + ZX\x{300}oanon +No match + FAX +No match + +/[^a]/8 + abcd + 0: b + a\x{100} + 0: \x{100} + +/^[abc\x{123}\x{400}-\x{402}]{2,3}\d/8 + ab99 + 0: ab9 + \x{123}\x{123}45 + 0: \x{123}\x{123}4 + \x{400}\x{401}\x{402}6 + 0: \x{400}\x{401}\x{402}6 + *** Failers +No match + d99 +No match + \x{123}\x{122}4 +No match + \x{400}\x{403}6 +No match + \x{400}\x{401}\x{402}\x{402}6 +No match + +/a.b/8 + acb + 0: acb + a\x7fb + 0: a\x{7f}b + a\x{100}b + 0: a\x{100}b + *** Failers +No match + a\nb +No match + +/a(.{3})b/8 + a\x{4000}xyb + 0: a\x{4000}xyb + a\x{4000}\x7fyb + 0: a\x{4000}\x{7f}yb + a\x{4000}\x{100}yb + 0: a\x{4000}\x{100}yb + *** Failers +No match + a\x{4000}b +No match + ac\ncb +No match + +/a(.*?)(.)/ + a\xc0\x88b + 0: a\xc0\x88b + 1: a\xc0\x88 + 2: a\xc0 + +/a(.*?)(.)/8 + a\x{100}b + 0: a\x{100}b + 1: a\x{100} + +/a(.*)(.)/ + a\xc0\x88b + 0: a\xc0\x88b + 1: a\xc0\x88 + 2: a\xc0 + +/a(.*)(.)/8 + a\x{100}b + 0: a\x{100}b + 1: a\x{100} + +/a(.)(.)/ + a\xc0\x92bcd + 0: a\xc0\x92 + +/a(.)(.)/8 + a\x{240}bcd + 0: a\x{240}b + +/a(.?)(.)/ + a\xc0\x92bcd + 0: a\xc0\x92 + 1: a\xc0 + +/a(.?)(.)/8 + a\x{240}bcd + 0: a\x{240}b + 1: a\x{240} + +/a(.??)(.)/ + a\xc0\x92bcd + 0: a\xc0\x92 + 1: a\xc0 + +/a(.??)(.)/8 + a\x{240}bcd + 0: a\x{240}b + 1: a\x{240} + +/a(.{3})b/8 + a\x{1234}xyb + 0: a\x{1234}xyb + a\x{1234}\x{4321}yb + 0: a\x{1234}\x{4321}yb + a\x{1234}\x{4321}\x{3412}b + 0: a\x{1234}\x{4321}\x{3412}b + *** Failers +No match + a\x{1234}b +No match + ac\ncb +No match + +/a(.{3,})b/8 + a\x{1234}xyb + 0: a\x{1234}xyb + a\x{1234}\x{4321}yb + 0: a\x{1234}\x{4321}yb + a\x{1234}\x{4321}\x{3412}b + 0: a\x{1234}\x{4321}\x{3412}b + axxxxbcdefghijb + 0: axxxxbcdefghijb + 1: axxxxb + a\x{1234}\x{4321}\x{3412}\x{3421}b + 0: a\x{1234}\x{4321}\x{3412}\x{3421}b + *** Failers +No match + a\x{1234}b +No match + +/a(.{3,}?)b/8 + a\x{1234}xyb + 0: a\x{1234}xyb + a\x{1234}\x{4321}yb + 0: a\x{1234}\x{4321}yb + a\x{1234}\x{4321}\x{3412}b + 0: a\x{1234}\x{4321}\x{3412}b + axxxxbcdefghijb + 0: axxxxbcdefghijb + 1: axxxxb + a\x{1234}\x{4321}\x{3412}\x{3421}b + 0: a\x{1234}\x{4321}\x{3412}\x{3421}b + *** Failers +No match + a\x{1234}b +No match + +/a(.{3,5})b/8 + a\x{1234}xyb + 0: a\x{1234}xyb + a\x{1234}\x{4321}yb + 0: a\x{1234}\x{4321}yb + a\x{1234}\x{4321}\x{3412}b + 0: a\x{1234}\x{4321}\x{3412}b + axxxxbcdefghijb + 0: axxxxb + a\x{1234}\x{4321}\x{3412}\x{3421}b + 0: a\x{1234}\x{4321}\x{3412}\x{3421}b + axbxxbcdefghijb + 0: axbxxb + axxxxxbcdefghijb + 0: axxxxxb + *** Failers +No match + a\x{1234}b +No match + axxxxxxbcdefghijb +No match + +/a(.{3,5}?)b/8 + a\x{1234}xyb + 0: a\x{1234}xyb + a\x{1234}\x{4321}yb + 0: a\x{1234}\x{4321}yb + a\x{1234}\x{4321}\x{3412}b + 0: a\x{1234}\x{4321}\x{3412}b + axxxxbcdefghijb + 0: axxxxb + a\x{1234}\x{4321}\x{3412}\x{3421}b + 0: a\x{1234}\x{4321}\x{3412}\x{3421}b + axbxxbcdefghijb + 0: axbxxb + axxxxxbcdefghijb + 0: axxxxxb + *** Failers +No match + a\x{1234}b +No match + axxxxxxbcdefghijb +No match + +/^[a\x{c0}]/8 + *** Failers +No match + \x{100} +No match + +/(?<=aXb)cd/8 + aXbcd + 0: cd + +/(?<=a\x{100}b)cd/8 + a\x{100}bcd + 0: cd + +/(?<=a\x{100000}b)cd/8 + a\x{100000}bcd + 0: cd + +/(?:\x{100}){3}b/8 + \x{100}\x{100}\x{100}b + 0: \x{100}\x{100}\x{100}b + *** Failers +No match + \x{100}\x{100}b +No match + +/\x{ab}/8 + \x{ab} + 0: \x{ab} + \xc2\xab + 0: \x{ab} + *** Failers +No match + \x00{ab} +No match + +/(?<=(.))X/8 + WXYZ + 0: X + \x{256}XYZ + 0: X + *** Failers +No match + XYZ +No match + +/[^a]+/8g + bcd + 0: bcd + \x{100}aY\x{256}Z + 0: \x{100} + 0: Y\x{256}Z + +/^[^a]{2}/8 + \x{100}bc + 0: \x{100}b + +/^[^a]{2,}/8 + \x{100}bcAa + 0: \x{100}bcA + +/^[^a]{2,}?/8 + \x{100}bca + 0: \x{100}bc + 1: \x{100}b + +/[^a]+/8ig + bcd + 0: bcd + \x{100}aY\x{256}Z + 0: \x{100} + 0: Y\x{256}Z + +/^[^a]{2}/8i + \x{100}bc + 0: \x{100}b + +/^[^a]{2,}/8i + \x{100}bcAa + 0: \x{100}bc + +/^[^a]{2,}?/8i + \x{100}bca + 0: \x{100}bc + 1: \x{100}b + +/\x{100}{0,0}/8 + abcd + 0: + +/\x{100}?/8 + abcd + 0: + \x{100}\x{100} + 0: \x{100} + +/\x{100}{0,3}/8 + \x{100}\x{100} + 0: \x{100}\x{100} + \x{100}\x{100}\x{100}\x{100} + 0: \x{100}\x{100}\x{100} + +/\x{100}*/8 + abce + 0: + \x{100}\x{100}\x{100}\x{100} + 0: \x{100}\x{100}\x{100}\x{100} + +/\x{100}{1,1}/8 + abcd\x{100}\x{100}\x{100}\x{100} + 0: \x{100} + +/\x{100}{1,3}/8 + abcd\x{100}\x{100}\x{100}\x{100} + 0: \x{100}\x{100}\x{100} + +/\x{100}+/8 + abcd\x{100}\x{100}\x{100}\x{100} + 0: \x{100}\x{100}\x{100}\x{100} + +/\x{100}{3}/8 + abcd\x{100}\x{100}\x{100}XX + 0: \x{100}\x{100}\x{100} + +/\x{100}{3,5}/8 + abcd\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}XX + 0: \x{100}\x{100}\x{100}\x{100}\x{100} + +/\x{100}{3,}/8O + abcd\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}XX + 0: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} + 1: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100} + 2: \x{100}\x{100}\x{100}\x{100}\x{100} + 3: \x{100}\x{100}\x{100}\x{100} + 4: \x{100}\x{100}\x{100} + +/(?<=a\x{100}{2}b)X/8 + Xyyya\x{100}\x{100}bXzzz + 0: X + +/\D*/8O + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +Matched, but offsets vector is too small to show all matches + 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + 1: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + 2: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + 3: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + 4: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + 5: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + 6: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + 7: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + 8: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + 9: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +10: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +11: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +12: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +13: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +14: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +15: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +16: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +17: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +18: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +19: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +20: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +21: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + +/\D*/8O + \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} +Matched, but offsets vector is too small to show all matches + 0: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} + 1: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} + 2: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} + 3: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} + 4: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} + 5: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} + 6: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} + 7: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} + 8: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} + 9: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} +10: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} +11: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} +12: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} +13: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} +14: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} +15: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} +16: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} +17: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} +18: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} +19: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} +20: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} +21: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100} + +/\D/8 + 1X2 + 0: X + 1\x{100}2 + 0: \x{100} + +/>\S/8 + > >X Y + 0: >X + > >\x{100} Y + 0: >\x{100} + +/\d/8 + \x{100}3 + 0: 3 + +/\s/8 + \x{100} X + 0: + +/\D+/8 + 12abcd34 + 0: abcd + *** Failers + 0: *** Failers + 1234 +No match + +/\D{2,3}/8 + 12abcd34 + 0: abc + 12ab34 + 0: ab + *** Failers + 0: *** + 1234 +No match + 12a34 +No match + +/\D{2,3}?/8 + 12abcd34 + 0: abc + 1: ab + 12ab34 + 0: ab + *** Failers + 0: *** + 1: ** + 1234 +No match + 12a34 +No match + +/\d+/8 + 12abcd34 + 0: 12 + *** Failers +No match + +/\d{2,3}/8 + 12abcd34 + 0: 12 + 1234abcd + 0: 123 + *** Failers +No match + 1.4 +No match + +/\d{2,3}?/8 + 12abcd34 + 0: 12 + 1234abcd + 0: 123 + 1: 12 + *** Failers +No match + 1.4 +No match + +/\S+/8 + 12abcd34 + 0: 12abcd34 + *** Failers + 0: *** + \ \ +No match + +/\S{2,3}/8 + 12abcd34 + 0: 12a + 1234abcd + 0: 123 + *** Failers + 0: *** + \ \ +No match + +/\S{2,3}?/8 + 12abcd34 + 0: 12a + 1: 12 + 1234abcd + 0: 123 + 1: 12 + *** Failers + 0: *** + 1: ** + \ \ +No match + +/>\s+ <34 + 0: > < + *** Failers +No match + +/>\s{2,3} < + ab> < + *** Failers +No match + ab> \s{2,3}? < + ab> < + *** Failers +No match + ab> \xff< + 0: \xff + +/[\xff]/8 + >\x{ff}< + 0: \x{ff} + +/[^\xFF]/ + XYZ + 0: X + +/[^\xff]/8 + XYZ + 0: X + \x{123} + 0: \x{123} + +/^[ac]*b/8 + xb +No match + +/^[ac\x{100}]*b/8 + xb +No match + +/^[^x]*b/8i + xb +No match + +/^[^x]*b/8 + xb +No match + +/^\d*b/8 + xb +No match + +/(|a)/g8 + catac + 0: + 0: a + 1: + 0: + 0: a + 1: + 0: + 0: + a\x{256}a + 0: a + 1: + 0: + 0: a + 1: + 0: + +/^\x{85}$/8i + \x{85} + 0: \x{85} + +/^abc./mgx8 + abc1 \x0aabc2 \x0babc3xx \x0cabc4 \x0dabc5xx \x0d\x0aabc6 \x{0085}abc7 \x{2028}abc8 \x{2029}abc9 JUNK + 0: abc1 + 0: abc2 + 0: abc3 + 0: abc4 + 0: abc5 + 0: abc6 + 0: abc7 + 0: abc8 + 0: abc9 + +/abc.$/mgx8 + abc1\x0a abc2\x0b abc3\x0c abc4\x0d abc5\x0d\x0a abc6\x{0085} abc7\x{2028} abc8\x{2029} abc9 + 0: abc1 + 0: abc2 + 0: abc3 + 0: abc4 + 0: abc5 + 0: abc6 + 0: abc7 + 0: abc8 + 0: abc9 + +/^a\Rb/8 + a\nb + 0: a\x{0a}b + a\rb + 0: a\x{0d}b + a\r\nb + 0: a\x{0d}\x{0a}b + a\x0bb + 0: a\x{0b}b + a\x0cb + 0: a\x{0c}b + a\x{85}b + 0: a\x{85}b + a\x{2028}b + 0: a\x{2028}b + a\x{2029}b + 0: a\x{2029}b + ** Failers +No match + a\n\rb +No match + +/^a\R*b/8 + ab + 0: ab + a\nb + 0: a\x{0a}b + a\rb + 0: a\x{0d}b + a\r\nb + 0: a\x{0d}\x{0a}b + a\x0bb + 0: a\x{0b}b + a\x0c\x{2028}\x{2029}b + 0: a\x{0c}\x{2028}\x{2029}b + a\x{85}b + 0: a\x{85}b + a\n\rb + 0: a\x{0a}\x{0d}b + a\n\r\x{85}\x0cb + 0: a\x{0a}\x{0d}\x{85}\x{0c}b + +/^a\R+b/8 + a\nb + 0: a\x{0a}b + a\rb + 0: a\x{0d}b + a\r\nb + 0: a\x{0d}\x{0a}b + a\x0bb + 0: a\x{0b}b + a\x0c\x{2028}\x{2029}b + 0: a\x{0c}\x{2028}\x{2029}b + a\x{85}b + 0: a\x{85}b + a\n\rb + 0: a\x{0a}\x{0d}b + a\n\r\x{85}\x0cb + 0: a\x{0a}\x{0d}\x{85}\x{0c}b + ** Failers +No match + ab +No match + +/^a\R{1,3}b/8 + a\nb + 0: a\x{0a}b + a\n\rb + 0: a\x{0a}\x{0d}b + a\n\r\x{85}b + 0: a\x{0a}\x{0d}\x{85}b + a\r\n\r\nb + 0: a\x{0d}\x{0a}\x{0d}\x{0a}b + a\r\n\r\n\r\nb + 0: a\x{0d}\x{0a}\x{0d}\x{0a}\x{0d}\x{0a}b + a\n\r\n\rb + 0: a\x{0a}\x{0d}\x{0a}\x{0d}b + a\n\n\r\nb + 0: a\x{0a}\x{0a}\x{0d}\x{0a}b + ** Failers +No match + a\n\n\n\rb +No match + a\r +No match + +/\h+\V?\v{3,4}/8O + \x09\x20\x{a0}X\x0a\x0b\x0c\x0d\x0a + 0: \x{09} \x{a0}X\x{0a}\x{0b}\x{0c}\x{0d} + 1: \x{09} \x{a0}X\x{0a}\x{0b}\x{0c} + +/\V?\v{3,4}/8O + \x20\x{a0}X\x0a\x0b\x0c\x0d\x0a + 0: X\x{0a}\x{0b}\x{0c}\x{0d} + 1: X\x{0a}\x{0b}\x{0c} + +/\h+\V?\v{3,4}/8O + >\x09\x20\x{a0}X\x0a\x0a\x0a< + 0: \x{09} \x{a0}X\x{0a}\x{0a}\x{0a} + +/\V?\v{3,4}/8O + >\x09\x20\x{a0}X\x0a\x0a\x0a< + 0: X\x{0a}\x{0a}\x{0a} + +/\H\h\V\v/8 + X X\x0a + 0: X X\x{0a} + X\x09X\x0b + 0: X\x{09}X\x{0b} + ** Failers +No match + \x{a0} X\x0a +No match + +/\H*\h+\V?\v{3,4}/8O + \x09\x20\x{a0}X\x0a\x0b\x0c\x0d\x0a + 0: \x{09} \x{a0}X\x{0a}\x{0b}\x{0c}\x{0d} + 1: \x{09} \x{a0}X\x{0a}\x{0b}\x{0c} + \x09\x20\x{a0}\x0a\x0b\x0c\x0d\x0a + 0: \x{09} \x{a0}\x{0a}\x{0b}\x{0c}\x{0d} + 1: \x{09} \x{a0}\x{0a}\x{0b}\x{0c} + \x09\x20\x{a0}\x0a\x0b\x0c + 0: \x{09} \x{a0}\x{0a}\x{0b}\x{0c} + ** Failers +No match + \x09\x20\x{a0}\x0a\x0b +No match + +/\H\h\V\v/8 + \x{3001}\x{3000}\x{2030}\x{2028} + 0: \x{3001}\x{3000}\x{2030}\x{2028} + X\x{180e}X\x{85} + 0: X\x{180e}X\x{85} + ** Failers +No match + \x{2009} X\x0a +No match + +/\H*\h+\V?\v{3,4}/8O + \x{1680}\x{180e}\x{2007}X\x{2028}\x{2029}\x0c\x0d\x0a + 0: \x{1680}\x{180e}\x{2007}X\x{2028}\x{2029}\x{0c}\x{0d} + 1: \x{1680}\x{180e}\x{2007}X\x{2028}\x{2029}\x{0c} + \x09\x{205f}\x{a0}\x0a\x{2029}\x0c\x{2028}\x0a + 0: \x{09}\x{205f}\x{a0}\x{0a}\x{2029}\x{0c}\x{2028} + 1: \x{09}\x{205f}\x{a0}\x{0a}\x{2029}\x{0c} + \x09\x20\x{202f}\x0a\x0b\x0c + 0: \x{09} \x{202f}\x{0a}\x{0b}\x{0c} + ** Failers +No match + \x09\x{200a}\x{a0}\x{2028}\x0b +No match + +/a\Rb/I8 +Capturing subpattern count = 0 +Options: bsr_anycrlf utf +First char = 'a' +Need char = 'b' + a\rb + 0: a\x{0d}b + a\nb + 0: a\x{0a}b + a\r\nb + 0: a\x{0d}\x{0a}b + ** Failers +No match + a\x{85}b +No match + a\x0bb +No match + +/a\Rb/I8 +Capturing subpattern count = 0 +Options: bsr_unicode utf +First char = 'a' +Need char = 'b' + a\rb + 0: a\x{0d}b + a\nb + 0: a\x{0a}b + a\r\nb + 0: a\x{0d}\x{0a}b + a\x{85}b + 0: a\x{85}b + a\x0bb + 0: a\x{0b}b + ** Failers +No match + a\x{85}b\ +No match + a\x0bb\ +No match + +/a\R?b/I8 +Capturing subpattern count = 0 +Options: bsr_anycrlf utf +First char = 'a' +Need char = 'b' + a\rb + 0: a\x{0d}b + a\nb + 0: a\x{0a}b + a\r\nb + 0: a\x{0d}\x{0a}b + ** Failers +No match + a\x{85}b +No match + a\x0bb +No match + +/a\R?b/I8 +Capturing subpattern count = 0 +Options: bsr_unicode utf +First char = 'a' +Need char = 'b' + a\rb + 0: a\x{0d}b + a\nb + 0: a\x{0a}b + a\r\nb + 0: a\x{0d}\x{0a}b + a\x{85}b + 0: a\x{85}b + a\x0bb + 0: a\x{0b}b + ** Failers +No match + a\x{85}b\ +No match + a\x0bb\ +No match + +/X/8f + A\x{1ec5}ABCXYZ + 0: X + +/abcd*/8 + xxxxabcd\P + 0: abcd + xxxxabcd\P\P +Partial match: abcd + +/abcd*/i8 + xxxxabcd\P + 0: abcd + xxxxabcd\P\P +Partial match: abcd + XXXXABCD\P + 0: ABCD + XXXXABCD\P\P +Partial match: ABCD + +/abc\d*/8 + xxxxabc1\P + 0: abc1 + xxxxabc1\P\P +Partial match: abc1 + +/abc[de]*/8 + xxxxabcde\P + 0: abcde + xxxxabcde\P\P +Partial match: abcde + +/\bthe cat\b/8 + the cat\P + 0: the cat + the cat\P\P +Partial match: the cat + +/ab\Cde/8 + abXde +Error -16 (item unsupported for DFA matching) + +/(?<=ab\Cde)X/8 +Failed: \C not allowed in lookbehind assertion at offset 10 + +/./8 + \r\P + 0: \x{0d} + \r\P\P +Partial match: \x{0d} + +/.{2,3}/8 + \r\P +Partial match: \x{0d} + \r\P\P +Partial match: \x{0d} + \r\r\P + 0: \x{0d}\x{0d} + \r\r\P\P +Partial match: \x{0d}\x{0d} + \r\r\r\P + 0: \x{0d}\x{0d}\x{0d} + \r\r\r\P\P +Partial match: \x{0d}\x{0d}\x{0d} + +/.{2,3}?/8 + \r\P +Partial match: \x{0d} + \r\P\P +Partial match: \x{0d} + \r\r\P + 0: \x{0d}\x{0d} + \r\r\P\P +Partial match: \x{0d}\x{0d} + \r\r\r\P + 0: \x{0d}\x{0d}\x{0d} + 1: \x{0d}\x{0d} + \r\r\r\P\P +Partial match: \x{0d}\x{0d}\x{0d} + +/[^\x{100}]/8 + \x{100}\x{101}X + 0: \x{101} + +/[^\x{100}]+/8 + \x{100}\x{101}X + 0: \x{101}X + +/-- End of testinput9 --/ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutputEBC b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutputEBC new file mode 100755 index 000000000..72b6fa3ed --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/testoutputEBC @@ -0,0 +1,188 @@ +/-- This is a specialized test for checking, when PCRE is compiled with the +EBCDIC option but in an ASCII environment, that newline and white space +functionality is working. It catches cases where explicit values such as 0x0a +have been used instead of names like CHAR_LF. Needless to say, it is not a +genuine EBCDIC test! In patterns, alphabetic characters that follow a backslash +must be in EBCDIC code. In data, newlines and other spacing characters must be +in EBCDIC, but can be specified as escapes. --/ + +/-- Test default newline and variations --/ + +/^A/m + ABC + 0: A + 12\x15ABC + 0: A + +/^A/m + 12\x15ABC + 0: A + 12\x0dABC + 0: A + 12\x0d\x15ABC + 0: A + 12\x25ABC + 0: A + +/^A/m + 12\x15ABC + 0: A + 12\x0dABC + 0: A + 12\x0d\x15ABC + 0: A + ** Fail +No match + 12\x25ABC +No match + +/-- Test \h --/ + +/^A\ˆ/ + A B + 0: A\x20 + A\x41B + 0: AA + +/-- Test \H --/ + +/^A\È/ + AB + 0: AB + A\x42B + 0: AB + ** Fail +No match + A B +No match + A\x41B +No match + +/-- Test \R --/ + +/^A\Ù/ + A\x15B + 0: A\x15 + A\x0dB + 0: A\x0d + A\x25B + 0: A\x25 + A\x0bB + 0: A\x0b + A\x0cB + 0: A\x0c + ** Fail +No match + A B +No match + +/-- Test \v --/ + +/^A\¥/ + A\x15B + 0: A\x15 + A\x0dB + 0: A\x0d + A\x25B + 0: A\x25 + A\x0bB + 0: A\x0b + A\x0cB + 0: A\x0c + ** Fail +No match + A B +No match + +/-- Test \V --/ + +/^A\å/ + A B + 0: A\x20 + ** Fail +No match + A\x15B +No match + A\x0dB +No match + A\x25B +No match + A\x0bB +No match + A\x0cB +No match + +/-- For repeated items, use an atomic group so that the output is the same +for DFA matching (otherwise it may show multiple matches). --/ + +/-- Test \h+ --/ + +/^A(?>\ˆ+)/ + A B + 0: A\x20 + +/-- Test \H+ --/ + +/^A(?>\È+)/ + AB + 0: AB + ** Fail +No match + A B +No match + +/-- Test \R+ --/ + +/^A(?>\Ù+)/ + A\x15B + 0: A\x15 + A\x0dB + 0: A\x0d + A\x25B + 0: A\x25 + A\x0bB + 0: A\x0b + A\x0cB + 0: A\x0c + ** Fail +No match + A B +No match + +/-- Test \v+ --/ + +/^A(?>\¥+)/ + A\x15B + 0: A\x15 + A\x0dB + 0: A\x0d + A\x25B + 0: A\x25 + A\x0bB + 0: A\x0b + A\x0cB + 0: A\x0c + ** Fail +No match + A B +No match + +/-- Test \V+ --/ + +/^A(?>\å+)/ + A B + 0: A\x20B + ** Fail +No match + A\x15B +No match + A\x0dB +No match + A\x25B +No match + A\x0bB +No match + A\x0cB +No match + +/-- End --/ diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/valgrind-jit.supp b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/valgrind-jit.supp new file mode 100755 index 000000000..f1d267183 --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/valgrind-jit.supp @@ -0,0 +1,15 @@ +{ + name + Memcheck:Addr16 + obj:??? + obj:??? + obj:??? +} + +{ + name + Memcheck:Cond + obj:??? + obj:??? + obj:??? +} diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/wintestinput3 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/wintestinput3 new file mode 100755 index 000000000..04e76a6dc --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/wintestinput3 @@ -0,0 +1,91 @@ +/^[\w]+/ + *** Failers + École + +/^[\w]+/Lfrench + École + +/^[\w]+/ + *** Failers + École + +/^[\W]+/ + École + +/^[\W]+/Lfrench + *** Failers + École + +/[\b]/ + \b + *** Failers + a + +/[\b]/Lfrench + \b + *** Failers + a + +/^\w+/ + *** Failers + École + +/^\w+/Lfrench + École + +/(.+)\b(.+)/ + École + +/(.+)\b(.+)/Lfrench + *** Failers + École + +/École/i + École + *** Failers + école + +/École/iLfrench + École + école + +/\w/IS + +/\w/ISLfrench + +/^[\xc8-\xc9]/iLfrench + École + école + +/^[\xc8-\xc9]/Lfrench + École + *** Failers + école + +/\W+/Lfrench + >>>\xaa<<< + >>>\xba<<< + +/[\W]+/Lfrench + >>>\xaa<<< + >>>\xba<<< + +/[^[:alpha:]]+/Lfrench + >>>\xaa<<< + >>>\xba<<< + +/\w+/Lfrench + >>>\xaa<<< + >>>\xba<<< + +/[\w]+/Lfrench + >>>\xaa<<< + >>>\xba<<< + +/[[:alpha:]]+/Lfrench + >>>\xaa<<< + >>>\xba<<< + +/[[:alpha:]][[:lower:]][[:upper:]]/DZLfrench + +/ End of testinput3 / diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/wintestoutput3 b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/wintestoutput3 new file mode 100755 index 000000000..456ad196b --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/testdata/wintestoutput3 @@ -0,0 +1,166 @@ +/^[\w]+/ + *** Failers +No match + École +No match + +/^[\w]+/Lfrench + École + 0: École + +/^[\w]+/ + *** Failers +No match + École +No match + +/^[\W]+/ + École + 0: \xc9 + +/^[\W]+/Lfrench + *** Failers + 0: *** + École +No match + +/[\b]/ + \b + 0: \x08 + *** Failers +No match + a +No match + +/[\b]/Lfrench + \b + 0: \x08 + *** Failers +No match + a +No match + +/^\w+/ + *** Failers +No match + École +No match + +/^\w+/Lfrench + École + 0: École + +/(.+)\b(.+)/ + École + 0: \xc9cole + 1: \xc9 + 2: cole + +/(.+)\b(.+)/Lfrench + *** Failers + 0: *** Failers + 1: *** + 2: Failers + École +No match + +/École/i + École + 0: \xc9cole + *** Failers +No match + école +No match + +/École/iLfrench + École + 0: École + école + 0: école + +/\w/IS +Capturing subpattern count = 0 +No options +No first char +No need char +Subject length lower bound = 1 +Starting chars: 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P + Q R S T U V W X Y Z _ a b c d e f g h i j k l m n o p q r s t u v w x y z + +/\w/ISLfrench +Capturing subpattern count = 0 +No options +No first char +No need char +Subject length lower bound = 1 +Starting chars: 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P + Q R S T U V W X Y Z _ a b c d e f g h i j k l m n o p q r s t u v w x y z + ƒ Š Œ Ž š œ ž Ÿ ª ² ³ µ ¹ º À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö + Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ø ù ú û ü ý + þ ÿ + +/^[\xc8-\xc9]/iLfrench + École + 0: É + école + 0: é + +/^[\xc8-\xc9]/Lfrench + École + 0: É + *** Failers +No match + école +No match + +/\W+/Lfrench + >>>\xaa<<< + 0: >>> + >>>\xba<<< + 0: >>> + +/[\W]+/Lfrench + >>>\xaa<<< + 0: >>> + >>>\xba<<< + 0: >>> + +/[^[:alpha:]]+/Lfrench + >>>\xaa<<< + 0: >>> + >>>\xba<<< + 0: >>> + +/\w+/Lfrench + >>>\xaa<<< + 0: ª + >>>\xba<<< + 0: º + +/[\w]+/Lfrench + >>>\xaa<<< + 0: ª + >>>\xba<<< + 0: º + +/[[:alpha:]]+/Lfrench + >>>\xaa<<< + 0: ª + >>>\xba<<< + 0: º + +/[[:alpha:]][[:lower:]][[:upper:]]/DZLfrench +------------------------------------------------------------------ + Bra + [A-Za-z\x83\x8a\x8c\x8e\x9a\x9c\x9e\x9f\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\xff] + [a-z\x83\x9a\x9c\x9e\xaa\xb5\xba\xdf-\xf6\xf8-\xff] + [A-Z\x8a\x8c\x8e\x9f\xc0-\xd6\xd8-\xde] + Ket + End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +No need char + +/ End of testinput3 / diff --git a/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/ucp.h b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/ucp.h new file mode 100755 index 000000000..2fa00296e --- /dev/null +++ b/dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44/ucp.h @@ -0,0 +1,224 @@ +/************************************************* +* Unicode Property Table handler * +*************************************************/ + +#ifndef _UCP_H +#define _UCP_H + +/* This file contains definitions of the property values that are returned by +the UCD access macros. New values that are added for new releases of Unicode +should always be at the end of each enum, for backwards compatibility. + +IMPORTANT: Note also that the specific numeric values of the enums have to be +the same as the values that are generated by the maint/MultiStage2.py script, +where the equivalent property descriptive names are listed in vectors. + +ALSO: The specific values of the first two enums are assumed for the table +called catposstab in pcre_compile.c. */ + +/* These are the general character categories. */ + +enum { + ucp_C, /* Other */ + ucp_L, /* Letter */ + ucp_M, /* Mark */ + ucp_N, /* Number */ + ucp_P, /* Punctuation */ + ucp_S, /* Symbol */ + ucp_Z /* Separator */ +}; + +/* These are the particular character categories. */ + +enum { + ucp_Cc, /* Control */ + ucp_Cf, /* Format */ + ucp_Cn, /* Unassigned */ + ucp_Co, /* Private use */ + ucp_Cs, /* Surrogate */ + ucp_Ll, /* Lower case letter */ + ucp_Lm, /* Modifier letter */ + ucp_Lo, /* Other letter */ + ucp_Lt, /* Title case letter */ + ucp_Lu, /* Upper case letter */ + ucp_Mc, /* Spacing mark */ + ucp_Me, /* Enclosing mark */ + ucp_Mn, /* Non-spacing mark */ + ucp_Nd, /* Decimal number */ + ucp_Nl, /* Letter number */ + ucp_No, /* Other number */ + ucp_Pc, /* Connector punctuation */ + ucp_Pd, /* Dash punctuation */ + ucp_Pe, /* Close punctuation */ + ucp_Pf, /* Final punctuation */ + ucp_Pi, /* Initial punctuation */ + ucp_Po, /* Other punctuation */ + ucp_Ps, /* Open punctuation */ + ucp_Sc, /* Currency symbol */ + ucp_Sk, /* Modifier symbol */ + ucp_Sm, /* Mathematical symbol */ + ucp_So, /* Other symbol */ + ucp_Zl, /* Line separator */ + ucp_Zp, /* Paragraph separator */ + ucp_Zs /* Space separator */ +}; + +/* These are grapheme break properties. Note that the code for processing them +assumes that the values are less than 16. If more values are added that take +the number to 16 or more, the code will have to be rewritten. */ + +enum { + ucp_gbCR, /* 0 */ + ucp_gbLF, /* 1 */ + ucp_gbControl, /* 2 */ + ucp_gbExtend, /* 3 */ + ucp_gbPrepend, /* 4 */ + ucp_gbSpacingMark, /* 5 */ + ucp_gbL, /* 6 Hangul syllable type L */ + ucp_gbV, /* 7 Hangul syllable type V */ + ucp_gbT, /* 8 Hangul syllable type T */ + ucp_gbLV, /* 9 Hangul syllable type LV */ + ucp_gbLVT, /* 10 Hangul syllable type LVT */ + ucp_gbRegionalIndicator, /* 11 */ + ucp_gbOther /* 12 */ +}; + +/* These are the script identifications. */ + +enum { + ucp_Arabic, + ucp_Armenian, + ucp_Bengali, + ucp_Bopomofo, + ucp_Braille, + ucp_Buginese, + ucp_Buhid, + ucp_Canadian_Aboriginal, + ucp_Cherokee, + ucp_Common, + ucp_Coptic, + ucp_Cypriot, + ucp_Cyrillic, + ucp_Deseret, + ucp_Devanagari, + ucp_Ethiopic, + ucp_Georgian, + ucp_Glagolitic, + ucp_Gothic, + ucp_Greek, + ucp_Gujarati, + ucp_Gurmukhi, + ucp_Han, + ucp_Hangul, + ucp_Hanunoo, + ucp_Hebrew, + ucp_Hiragana, + ucp_Inherited, + ucp_Kannada, + ucp_Katakana, + ucp_Kharoshthi, + ucp_Khmer, + ucp_Lao, + ucp_Latin, + ucp_Limbu, + ucp_Linear_B, + ucp_Malayalam, + ucp_Mongolian, + ucp_Myanmar, + ucp_New_Tai_Lue, + ucp_Ogham, + ucp_Old_Italic, + ucp_Old_Persian, + ucp_Oriya, + ucp_Osmanya, + ucp_Runic, + ucp_Shavian, + ucp_Sinhala, + ucp_Syloti_Nagri, + ucp_Syriac, + ucp_Tagalog, + ucp_Tagbanwa, + ucp_Tai_Le, + ucp_Tamil, + ucp_Telugu, + ucp_Thaana, + ucp_Thai, + ucp_Tibetan, + ucp_Tifinagh, + ucp_Ugaritic, + ucp_Yi, + /* New for Unicode 5.0: */ + ucp_Balinese, + ucp_Cuneiform, + ucp_Nko, + ucp_Phags_Pa, + ucp_Phoenician, + /* New for Unicode 5.1: */ + ucp_Carian, + ucp_Cham, + ucp_Kayah_Li, + ucp_Lepcha, + ucp_Lycian, + ucp_Lydian, + ucp_Ol_Chiki, + ucp_Rejang, + ucp_Saurashtra, + ucp_Sundanese, + ucp_Vai, + /* New for Unicode 5.2: */ + ucp_Avestan, + ucp_Bamum, + ucp_Egyptian_Hieroglyphs, + ucp_Imperial_Aramaic, + ucp_Inscriptional_Pahlavi, + ucp_Inscriptional_Parthian, + ucp_Javanese, + ucp_Kaithi, + ucp_Lisu, + ucp_Meetei_Mayek, + ucp_Old_South_Arabian, + ucp_Old_Turkic, + ucp_Samaritan, + ucp_Tai_Tham, + ucp_Tai_Viet, + /* New for Unicode 6.0.0: */ + ucp_Batak, + ucp_Brahmi, + ucp_Mandaic, + /* New for Unicode 6.1.0: */ + ucp_Chakma, + ucp_Meroitic_Cursive, + ucp_Meroitic_Hieroglyphs, + ucp_Miao, + ucp_Sharada, + ucp_Sora_Sompeng, + ucp_Takri, + /* New for Unicode 7.0.0: */ + ucp_Bassa_Vah, + ucp_Caucasian_Albanian, + ucp_Duployan, + ucp_Elbasan, + ucp_Grantha, + ucp_Khojki, + ucp_Khudawadi, + ucp_Linear_A, + ucp_Mahajani, + ucp_Manichaean, + ucp_Mende_Kikakui, + ucp_Modi, + ucp_Mro, + ucp_Nabataean, + ucp_Old_North_Arabian, + ucp_Old_Permic, + ucp_Pahawh_Hmong, + ucp_Palmyrene, + ucp_Psalter_Pahlavi, + ucp_Pau_Cin_Hau, + ucp_Siddham, + ucp_Tirhuta, + ucp_Warang_Citi +}; + +#endif + +/* End of ucp.h */ diff --git a/dependencies/rpm-specs/openresty-zlib/openresty-zlib.spec b/dependencies/rpm-specs/openresty-zlib/openresty-zlib.spec new file mode 100644 index 000000000..58e5ddcc5 --- /dev/null +++ b/dependencies/rpm-specs/openresty-zlib/openresty-zlib.spec @@ -0,0 +1,140 @@ +%global meadalpha %{nil} +%global meadrel %{nil} +%global version_major 1 +%global version_minor 2 +%global version_micro 11 + +Name: openresty-zlib +Version: %{version_major}.%{version_minor}.%{version_micro} +Release: 122%{?dist} +Summary: The zlib compression library for OpenResty + +Group: System Environment/Libraries +# /contrib/dotzlib/ have Boost license +License: zlib and Boost +URL: http://www.zlib.net/ +Source0: zlib-%{version} + +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) + +BuildRequires: libtool + +AutoReqProv: no + +%define zlib_prefix /usr/local/openresty/zlib + + +%description +The zlib compression library for use by Openresty ONLY + + +%package devel + +Summary: Development files for OpenResty's zlib library +Group: Development/Libraries +Requires: %{name} = %{version}-%{release} + + +%description devel +Provides C header and static library for OpenResty's zlib library. + + +%prep +cp -R ../SOURCES/zlib-%{version} zlib-%{version} +%setup -q -T -D -n zlib-%{version} + +%build +./configure --prefix=%{zlib_prefix} +make %{?_smp_mflags} CFLAGS='-O3 -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN -g %{optflags}' \ + SFLAGS='-O3 -fPIC -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN -g' \ + > /dev/stderr + + +%install +make install DESTDIR=%{buildroot} +rm -rf %{buildroot}/%{zlib_prefix}/share +rm -f %{buildroot}/%{zlib_prefix}/lib/*.la +rm -rf %{buildroot}/%{zlib_prefix}/lib/pkgconfig + + +%clean +rm -rf %{buildroot} + + +%files +%defattr(-,root,root,-) + +%attr(0755,root,root) %{zlib_prefix}/lib/libz.so* + + +%files devel +%defattr(-,root,root,-) + +%{zlib_prefix}/lib/*.a +%{zlib_prefix}/include/zlib.h +%{zlib_prefix}/include/zconf.h + + +%changelog +* Fri May 06 2022 CPaaS User - 1.2.11-21 +- Bump release + +* Mon Feb 28 2022 CPaaS User - 1.2.11-20 +- Bump release + +* Mon Feb 28 2022 CPaaS User - 1.2.11-19 +- Bump release + +* Thu Feb 24 2022 CPaaS User - 1.2.11-18 +- Bump release + +* Wed Jan 12 2022 CPaaS User - 1.2.11-12.9 +- Bump release + +* Wed Jan 12 2022 CPaaS User - 1.2.11-12.8 +- Bump release + +* Mon Jul 05 2021 CPaaS User - 1.2.11-12.7 +- Bump release + +* Mon Jul 05 2021 CPaaS User - 1.2.11-12.6 +- Bump release + +* Thu Jul 01 2021 CPaaS User - 1.2.11-12.5 +- Bump release + +* Thu Jul 01 2021 CPaaS User - 1.2.11-12.4 +- Bump release + +* Thu May 06 2021 CPaaS User - 1.2.11-11.3 +- Bump release + +* Thu May 06 2021 CPaaS User - 1.2.11-11.2 +- Bump release + +* Thu May 06 2021 CPaaS User - 1.2.11-11.1 +- Bump release + +* Mon Jan 20 2020 cpaas-ops - 1.2.11-7 +Built by CPaaS + +* Mon Jan 20 2020 cpaas-ops - 1.2.11-6 +Built by CPaaS + +* Wed Jan 15 2020 cpaas-ops - 1.2.11-5 +Built by CPaaS + +* Wed Jan 15 2020 cpaas-ops - 1.2.11-4 +Built by CPaaS + +* Wed Jan 15 2020 cpaas-ops - 1.2.11-3 +Built by CPaaS + +* Fri Jul 14 2017 Yichun Zhang 1.2.11-3 +- bugfix: we did not enable debuginfo in the shared library files. +* Sat May 20 2017 Yichun Zhang 1.2.11-2 +- added debuginfo. +* Sun Mar 19 2017 Yichun Zhang (agentzh) +- upgraded zlib to 1.2.11. +* Tue Aug 23 2016 zxcvbn4038 +- initial build for zlib 1.2.8. diff --git a/dependencies/rpm-specs/openresty/openresty.spec b/dependencies/rpm-specs/openresty/openresty.spec new file mode 100644 index 000000000..5e774dba9 --- /dev/null +++ b/dependencies/rpm-specs/openresty/openresty.spec @@ -0,0 +1,590 @@ +%global version_release 1 +%global commitid 189070e331150d40d360b77699ccd8e38bc1ae05 +%global apicastModule apicast-nginx-module-v0.4 +%global meadalpha %{nil} +%global meadrel %{nil} +%global version_major 1 +%global version_minor 19 +%global version_micro 3 + +%global grpc_version v1.49.2 +%global opentelemetry_proto_version v0.19.0 +%global opentelemetry_cpp_contrib_version 1ec94c82095bab61f06c7393b6f3272469d285af +%global opentelemetry_cpp_version v1.8.1 +%global orprefix %{_usr}/local/%{name} +%global zlib_prefix %{orprefix}/zlib +%global pcre_prefix %{orprefix}/pcre +%global otel_install %{_builddir}/otel +%global grpc_builddir %{_builddir}/grpc-%{grpc_version} +%global otel_cpp_builddir %{_builddir}/opentelemetry-cpp-%{opentelemetry_cpp_version} +%global openresty_builddir %{_builddir}/openresty-%{commitid} +%global lib_path /opt/app-root/lib +%global gcc12_path /opt/rh/gcc-toolset-12/root/bin + +%if 0%{?fedora} >= 27 +%undefine _debugsource_packages +%undefine _debuginfo_subpackages +%endif + +Name: openresty +Version: %{version_major}.%{version_minor}.%{version_micro} +Release: 123%{?dist} +Summary: OpenResty, scalable web platform by extending NGINX with Lua +Group: System Environment/Daemons + +# BSD License (two clause) +# http://www.freebsd.org/copyright/freebsd-license.html +License: BSD +URL: https://openresty.org/ + +Source0: openresty-%{commitid}.tar.gz +Source1: array-var-nginx-module-v0.05.tar.gz +Source2: drizzle-nginx-module-v0.1.11.tar.gz +Source3: echo-nginx-module-v0.62.tar.gz +Source4: encrypted-session-nginx-module-v0.08.tar.gz +Source5: form-input-nginx-module-v0.12.tar.gz +Source6: headers-more-nginx-module-v0.33.tar.gz +Source7: iconv-nginx-module-v0.14.tar.gz +Source8: lua-cjson-2.1.0.8.tar.gz +Source9: luajit2-v2.1-20201027-product-zfixes.tar.gz +Source10: lua-nginx-module-v0.10.19.tar.gz +Source11: lua-rds-parser-v0.06.tar.gz +Source12: lua-redis-parser-v0.13.tar.gz +Source13: lua-resty-core-v0.1.21.tar.gz +Source14: lua-resty-dns-v0.21.tar.gz +Source15: lua-resty-limit-traffic-v0.07.tar.gz +Source16: lua-resty-lock-v0.08.tar.gz +Source17: lua-resty-lrucache-v0.10.tar.gz +Source18: lua-resty-memcached-v0.15.tar.gz +Source19: lua-resty-mysql-v0.23.tar.gz +Source20: lua-resty-redis-v0.29.tar.gz +Source21: lua-resty-shell-v0.03.tar.gz +Source22: lua-resty-signal-v0.02.tar.gz +Source23: lua-resty-string-v0.12.tar.gz +Source24: lua-resty-upload-v0.10.tar.gz +Source25: lua-resty-upstream-healthcheck-v0.06.tar.gz +Source26: lua-resty-websocket-v0.08.tar.gz +Source27: lua-tablepool-v0.01.tar.gz +Source28: lua-upstream-nginx-module-v0.07.tar.gz +Source29: memc-nginx-module-v0.19.tar.gz +Source30: nginx-release-1.19.3-product-4.tar.gz +Source31: ngx_coolkit-0.2.tar.gz +Source32: ngx_devel_kit-v0.3.1.tar.gz +Source33: ngx_http_redis-0.3.7.tar.gz +Source34: ngx_postgres-1.0.tar.gz +Source35: opm-v0.0.5.tar.gz +Source36: rds-csv-nginx-module-v0.09.tar.gz +Source37: rds-json-nginx-module-v0.15.tar.gz +Source38: redis2-nginx-module-v0.15.tar.gz +Source39: resty-cli-v0.27.tar.gz +Source40: set-misc-nginx-module-v0.32.tar.gz +Source41: srcache-nginx-module-v0.32.tar.gz +Source42: stream-lua-nginx-module-v0.0.9.tar.gz +Source43: xss-nginx-module-v0.06.tar.gz +Source44: nginx-opentracing-v0.3.0.tar.gz +Source45: %{apicastModule}.tar.gz +Source46: grpc-%{grpc_version}.tar.gz +Source47: opentelemetry-cpp-%{opentelemetry_cpp_version}.tar.gz +Source48: opentelemetry-cpp-contrib-%{opentelemetry_cpp_contrib_version}.tar.gz +Source49: opentelemetry-proto-%{opentelemetry_proto_version}.tar.gz + +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) + +BuildRequires: make, cmake, perl, systemtap-sdt-devel, git, annobin-annocheck +BuildRequires: perl-File-Temp, dos2unix, pcre-devel, openssl-devel +BuildRequires: gcc, gcc-c++ +BuildRequires: gcc-toolset-12-gcc, gcc-toolset-12-gcc-c++ +BuildRequires: openresty-zlib-devel >= 1.2.11-3 +BuildRequires: openresty-pcre-devel >= 8.42-1 +BuildRequires: opentracing-cpp-devel = 1.3.0 +Requires: openresty-zlib >= 1.2.11-3 +Requires: openresty-pcre >= 8.42-1 + + +AutoReqProv: no + + +%description +This package contains the core server for OpenResty. Built for production +uses. + +OpenResty is a full-fledged web platform by integrating the standard Nginx +core, LuaJIT, many carefully written Lua libraries, lots of high quality +3rd-party Nginx modules, and most of their external dependencies. It is +designed to help developers easily build scalable web applications, web +services, and dynamic web gateways. + +By taking advantage of various well-designed Nginx modules (most of which +are developed by the OpenResty team themselves), OpenResty effectively +turns the nginx server into a powerful web app server, in which the web +developers can use the Lua programming language to script various existing +nginx C modules and Lua modules and construct extremely high-performance +web applications that are capable to handle 10K ~ 1000K+ connections in +a single box. + + +%package resty + +Summary: OpenResty command-line utility, resty +Group: Development/Tools +Requires: perl, openresty >= %{version}-%{release} +Requires: perl(File::Spec), perl(FindBin), perl(List::Util), perl(Getopt::Long), perl(File::Temp), perl(POSIX), perl(Time::HiRes) + +%if 0%{?fedora} >= 10 || 0%{?rhel} >= 6 || 0%{?centos} >= 6 +BuildArch: noarch +%endif + + +%description resty +This package contains the "resty" command-line utility for OpenResty, which +runs OpenResty Lua scripts on the terminal using a headless NGINX behind the +scene. + +OpenResty is a full-fledged web platform by integrating the standard Nginx +core, LuaJIT, many carefully written Lua libraries, lots of high quality +3rd-party Nginx modules, and most of their external dependencies. It is +designed to help developers easily build scalable web applications, web +services, and dynamic web gateways. + + + +%package opm + +Summary: OpenResty Package Manager +Group: Development/Tools +Requires: perl, openresty >= %{version}-%{release}, perl(Digest::MD5) +Requires: openresty-resty >= %{version}-%{release} +Requires: curl, tar, gzip +Requires: perl(Encode), perl(FindBin), perl(File::Find), perl(File::Path), perl(File::Spec), perl(Cwd), perl(Digest::MD5), perl(File::Copy), perl(File::Temp), perl(Getopt::Long) + +%if 0%{?fedora} >= 10 || 0%{?rhel} >= 6 || 0%{?centos} >= 6 +BuildArch: noarch +%endif + + +%description opm +This package provides the client side tool, opm, for OpenResty Pakcage Manager (OPM). + +%package opentracing + +Summary: Opentracing module + + +%description opentracing +This package provides the opentracing module in Openresty. + +%package opentelemetry + +Summary: Opentelemetry module + +%description opentelemetry +This package provides the opentelemetry module in Openresty. + +%prep +ls -la %{_sourcedir} +%setup -q -n "openresty-%{commitid}" +%setup -q -D -T -b 46 -n "openresty-%{commitid}" +%setup -q -D -T -b 47 -n "openresty-%{commitid}" +%setup -q -D -T -a 48 -n "openresty-%{commitid}" +%setup -q -D -T -b 49 -n "openresty-%{commitid}" +cp %{SOURCE0} . +cp %{SOURCE1} . +cp %{SOURCE2} . +cp %{SOURCE3} . +cp %{SOURCE4} . +cp %{SOURCE5} . +cp %{SOURCE6} . +cp %{SOURCE7} . +cp %{SOURCE8} . +cp %{SOURCE9} . +cp %{SOURCE10} . +cp %{SOURCE11} . +cp %{SOURCE12} . +cp %{SOURCE13} . +cp %{SOURCE14} . +cp %{SOURCE15} . +cp %{SOURCE16} . +cp %{SOURCE17} . +cp %{SOURCE18} . +cp %{SOURCE19} . +cp %{SOURCE20} . +cp %{SOURCE21} . +cp %{SOURCE22} . +cp %{SOURCE23} . +cp %{SOURCE24} . +cp %{SOURCE25} . +cp %{SOURCE26} . +cp %{SOURCE27} . +cp %{SOURCE28} . +cp %{SOURCE29} . +cp %{SOURCE30} . +cp %{SOURCE31} . +cp %{SOURCE32} . +cp %{SOURCE33} . +cp %{SOURCE34} . +cp %{SOURCE35} . +cp %{SOURCE36} . +cp %{SOURCE37} . +cp %{SOURCE38} . +cp %{SOURCE39} . +cp %{SOURCE40} . +cp %{SOURCE41} . +cp %{SOURCE42} . +cp %{SOURCE43} . +tar xzf %{SOURCE44} +tar xzfv %{SOURCE45} + +%build +ls -al %{_builddir} +mkdir -p %{grpc_builddir}/cmake/build +cd %{grpc_builddir}/cmake/build + +cmake -DgRPC_INSTALL=ON \ + -DgRPC_BUILD_TESTS=OFF \ + -DCMAKE_C_COMPILER=%{gcc12_path}/gcc \ + -DCMAKE_CXX_COMPILER=%{gcc12_path}/g++ \ + -DCMAKE_INSTALL_PREFIX=%{otel_install} \ + -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_SHARED_LIBS=ON \ + -DgRPC_BUILD_GRPC_NODE_PLUGIN=OFF \ + -DgRPC_BUILD_GRPC_OBJECTIVE_C_PLUGIN=OFF \ + -DgRPC_BUILD_GRPC_PHP_PLUGIN=OFF \ + -DgRPC_BUILD_GRPC_PHP_PLUGIN=OFF \ + -DgRPC_BUILD_GRPC_PYTHON_PLUGIN=OFF \ + -DgRPC_BUILD_GRPC_RUBY_PLUGIN=OFF \ + -DgRPC_SSL_PROVIDER=package \ + -DgRPC_ZLIB_PROVIDER=package \ + ../.. +make %{?_smp_mflags} VERBOSE=1 +make install + +export LD_LIBRARY_PATH=%{otel_install}/lib:%{otel_install}/lib64:$LD_LIBRARY_PATH + +# +rm -r %{otel_cpp_builddir}/third_party/opentelemetry-proto || exit 0 +mkdir -p %{otel_cpp_builddir}/build +cd %{otel_cpp_builddir}/build +cmake -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_SHARED_LIBS=ON \ + -DCMAKE_C_COMPILER=%{gcc12_path}/gcc \ + -DCMAKE_CXX_COMPILER=%{gcc12_path}/g++ \ + -DCMAKE_INSTALL_PREFIX=%{otel_install} \ + -DCMAKE_PREFIX_PATH=%{otel_install} \ + -DOTELCPP_PROTO_PATH=%{_builddir}/opentelemetry-proto-%{opentelemetry_proto_version} \ + -DWITH_OTLP=ON \ + -DWITH_OTLP_GRPC=ON \ + -DWITH_OTLP_HTTP=OFF \ + -DBUILD_TESTING=OFF \ + -DWITH_EXAMPLES=OFF \ + -DWITH_ZIPKIN=OFF \ + -DWITH_JAEGER=OFF \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + .. +make %{?_smp_mflags} VERBOSE=1 +make install + +export LDFLAGS="%{?__global_ldflags}" +export CFLAGS="%{optflags}" +export FORCE_CACHE=true + +cd %{openresty_builddir} +make %{?_smp_mflags} +ls -lah +cd $(ls -1 | grep openresty | grep -v "tar.gz") +ls -lah bundle/ +./configure --help +./configure \ + --prefix="%{orprefix}" \ + --with-cc-opt="%{optflags} -DNGX_LUA_ABORT_AT_PANIC -I%{otel_install}/include -I%{zlib_prefix}/include -I%{pcre_prefix}/include -I$(pwd)/../%{apicastModule}/ " \ + --with-ld-opt="%{?__global_ldflags} -L%{zlib_prefix}/lib -L%{pcre_prefix}/lib -L%{otel_install}/lib -L%{otel_install}/lib64 -Wl,-rpath,%{zlib_prefix}/lib:%{pcre_prefix}/lib -L$(pwd)/../%{apicastModule}/ " \ + --with-pcre-jit \ + --without-http_rds_json_module \ + --without-http_rds_csv_module \ + --without-lua_rds_parser \ + --with-stream \ + --with-stream_ssl_module \ + --with-stream_ssl_preread_module \ + --with-http_v2_module \ + --without-mail_pop3_module \ + --without-mail_imap_module \ + --without-mail_smtp_module \ + --with-http_stub_status_module \ + --with-http_realip_module \ + --with-http_addition_module \ + --with-http_auth_request_module \ + --with-http_secure_link_module \ + --with-http_random_index_module \ + --with-http_gzip_static_module \ + --with-http_sub_module \ + --with-http_dav_module \ + --with-http_flv_module \ + --with-http_mp4_module \ + --with-http_gunzip_module \ + --with-threads \ + --add-module="../%{apicastModule}/" \ + --add-dynamic-module="../nginx-opentracing-v0.3.0/opentracing" \ + --add-dynamic-module="../opentelemetry-cpp-contrib-%{opentelemetry_cpp_contrib_version}/instrumentation/nginx" \ + --with-luajit-target-strip="Q='' CFLAGS='' TARGET_XCFLAGS='-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE' TARGET_FLAGS='%{optflags}' HOST_CC='%{__cc}' STATIC_CC='%{__cc}' DYNAMIC_CC='%{__cc} -fPIC' HOST_CFLAGS='%{optflags}' HOST_LDFLAGS='%{?__global_ldflags}'" + +make %{?_smp_mflags} + +%install +cd $(ls -1 | grep openresty | grep -v "tar.gz") +make install DESTDIR=%{buildroot} + +rm -rf %{buildroot}%{orprefix}/luajit/share/man +rm -rf %{buildroot}%{orprefix}/luajit/lib/libluajit-5.1.a + +mkdir -p %{buildroot}%{_bindir} +ln -sf %{orprefix}/bin/resty %{buildroot}%{_bindir}/ +ln -sf %{orprefix}/bin/opm %{buildroot}%{_bindir}/ +ln -sf %{orprefix}/nginx/sbin/nginx %{buildroot}%{_bindir}/%{name} +ln -sf %{orprefix}/luajit/bin/luajit %{buildroot}%{_bindir}/lua +ln -sf %{orprefix}/luajit/bin/luajit %{buildroot}%{_bindir}/luajit + +# to silence the check-rpath error +export QA_RPATHS=$[ 0x0002 ] + +mkdir -p %{buildroot}%{lib_path} +cp -va %{otel_install}/lib64/. %{buildroot}%{lib_path} +cp -va %{otel_install}/lib/. %{buildroot}%{lib_path} + +%check +ls %{buildroot}%{orprefix}/nginx/sbin/nginx +ls %{buildroot}%{orprefix}/luajit/lib/libluajit-5.1.so.2.1.0 +ls %{buildroot}%{orprefix}/luajit/bin/luajit-2.1.0-beta3 + +annocheck -v %{buildroot}%{orprefix}/nginx/sbin/nginx || echo "FAILED" +annocheck -v %{buildroot}%{orprefix}/luajit/lib/libluajit-5.1.so.2.1.0 || echo "FAILED" +annocheck -v %{buildroot}%{orprefix}/luajit/bin/luajit-2.1.0-beta3 || echo "FAILED" + +find %{orprefix} + +%clean +rm -rf %{buildroot} + +%files +%defattr(-,root,root,-) + +%{_bindir}/%{name} +%{_bindir}/lua +%{_bindir}/luajit +%{orprefix}/bin/* +%{orprefix}/site/lualib/ +%{orprefix}/luajit/* +%{orprefix}/lualib/* +%{orprefix}/nginx/html/* +%{orprefix}/nginx/logs/ +%{orprefix}/nginx/sbin/* +%config(noreplace) %{orprefix}/nginx/conf/* +%{orprefix}/COPYRIGHT + + +%files resty +%defattr(-,root,root,-) + +%{_bindir}/resty +%{orprefix}/bin/resty + + +%files opm +%defattr(-,root,root,-) + +%{_bindir}/opm +%{orprefix}/bin/opm +%{orprefix}/site/manifest/ +%{orprefix}/site/pod/ + +%files opentracing +%defattr(-,root,root,-) + +%{orprefix}/nginx/modules/ngx_http_opentracing_module.so + +%files opentelemetry +%defattr(-,root,root,-) + +%{orprefix}/nginx/modules/otel_ngx_module.so +%{lib_path} + +%changelog +* Tue Oct 24 2023 Eguzki Astiz Lezaun - 1.19.3-123 +- CVE-2023-44487 + +* Mon Jan 30 2023 Eguzki Astiz Lezaun - 1.19.3-21 +- Opentelemetry RPM + +* Mon Oct 03 2022 CPaaS User - 1.19.3-18 +- Bump release + +* Wed Feb 23 2022 CPaaS User - 1.19.3-17 +- Bump release + +* Wed Feb 23 2022 CPaaS User - 1.19.3-16 +- Bump release + +* Wed Feb 23 2022 CPaaS User - 1.19.3-15 +- Bump release + +* Wed Feb 09 2022 CPaaS User - 1.19.3-14 +- Bump release + +* Wed Feb 09 2022 CPaaS User - 1.19.3-13 +- Bump release + +* Wed Feb 09 2022 CPaaS User - 1.19.3-12 +- Bump release + +* Wed Feb 09 2022 CPaaS User - 1.19.3-11 +- Bump release + +* Wed Jan 26 2022 CPaaS User - 1.19.3-10 +- Bump release + +* Tue Jan 25 2022 CPaaS User - 1.19.3-9 +- Bump release + +* Mon Jan 24 2022 CPaaS User - 1.19.3-6.27 +- Bump release + +* Fri Jan 21 2022 CPaaS User - 1.19.3-6.26 +- Bump release + +* Thu Jan 13 2022 CPaaS User - 1.19.3-6.25 +- Bump release + +* Thu Jan 13 2022 CPaaS User - 1.19.3-6.22 +- Bump release + +* Thu Jan 13 2022 CPaaS User - 1.19.3-6.21 +- Bump release + +* Mon Aug 02 2021 Eloy Coto - 1.19.3-5.20 +- Bump APIcast module + +* Mon Jul 05 2021 CPaaS User - 1.19.3-4.20 +- Bump release + +* Mon Jul 05 2021 CPaaS User - 1.19.3-4.19 +- Bump release + +* Mon Jul 05 2021 CPaaS User - 1.19.3-4.18 +- Bump release + +* Fri Jul 02 2021 CPaaS User - 1.19.3-4.17 +- Bump release + +* Fri Jul 02 2021 CPaaS User - 1.19.3-4.16 +- Bump release + +* Thu Jul 01 2021 CPaaS User - 1.19.3-4.15 +- Bump release + +* Thu Jul 01 2021 CPaaS User - 1.19.3-4.14 +- Bump release + +* Thu Jul 01 2021 CPaaS User - 1.19.3-4.13 +- Bump release + +* Thu Jul 01 2021 CPaaS User - 1.19.3-4.12 +- Bump release + +* Wed Jun 30 2021 CPaaS User - 1.19.3-3.11 +- Bump release + +* Wed Jun 30 2021 CPaaS User - 1.19.3-3.10 +- Bump release + +* Wed Jun 30 2021 CPaaS User - 1.19.3-3.9 +- Bump release + +* Wed Jun 30 2021 CPaaS User - 1.19.3-3.8 +- Bump release + +* Wed Jun 30 2021 CPaaS User - 1.19.3-3.7 +- Bump release + +* Wed Jun 30 2021 CPaaS User - 1.19.3-3.6 +- Bump release + +* Wed Jun 30 2021 CPaaS User - 1.19.3-3.5 +- Bump release + +* Tue Jun 29 2021 CPaaS User - 1.19.3-3.4 +- Bump release + +* Thu May 06 2021 CPaaS User - 1.17.6-1.3 +- Bump release + +* Thu May 06 2021 CPaaS User - 1.17.6-1.2 +- Bump release + +* Thu May 06 2021 CPaaS User - 1.17.6-1.1 +- Bump release + +* Thu Apr 15 2021 Eloy Coto 1.17.6.1 +- Updated Luajit version + +* Mon Jan 20 2020 cpaas-ops - 1.17.4-6 +Built by CPaaS + +* Mon Jan 20 2020 cpaas-ops - 1.17.4-5 +Built by CPaaS + +* Mon Jan 20 2020 cpaas-ops - 1.17.4-4 +Built by CPaaS + +* Wed Jan 15 2020 cpaas-ops - 1.17.4-3 +Built by CPaaS + +* Wed Jan 15 2020 cpaas-ops - 1.17.4-2 +Built by CPaaS + +* Thu Jan 9 2020 Eloy Coto 1.17.4.1 +- custom Openresty build. +* Thu May 16 2019 Yichun Zhang (agentzh) 1.15.8.1-1 +- upgraded openresty to 1.15.8.1. +* Mon May 14 2018 Yichun Zhang (agentzh) 1.13.6.2-1 +- upgraded openresty to 1.13.6.2. +* Sun Nov 12 2017 Yichun Zhang (agentzh) 1.13.6.1-1 +- upgraded openresty to 1.13.6.1. +* Thu Sep 21 2017 Yichun Zhang (agentzh) 1.11.2.5-2 +- enabled -DNGX_LUA_ABORT_AT_PANIC by default. +* Thu Aug 17 2017 Yichun Zhang (agentzh) 1.11.2.5-1 +- upgraded OpenResty to 1.11.2.5. +* Tue Jul 11 2017 Yichun Zhang (agentzh) 1.11.2.4-1 +- upgraded OpenResty to 1.11.2.4. +* Sat May 27 2017 Yichun Zhang (agentzh) 1.11.2.3-14 +- bugfix: the openresty-opm subpackage did not depend on openresty-doc and openresty-resty. +* Sat May 27 2017 Yichun Zhang (agentzh) 1.11.2.3-14 +- centos 6 and opensuse do not have the groff-base package. +* Sat May 27 2017 Yichun Zhang (agentzh) 1.11.2.3-13 +- openresty-doc now depends on groff-base. +* Thu May 25 2017 Yichun Zhang (agentzh) 1.11.2.3-12 +- added missing groff/pod2txt/pod2man dependencies for openresty-doc. +* Thu May 25 2017 Yichun Zhang (agentzh) 1.11.2.3-11 +- added missing perl dependencies for openresty-opm, openresty-resty, and openresty-doc. +* Sun May 21 2017 Yichun Zhang (agentzh) 1.11.2.3-10 +- removed the geoip nginx module since GeoIP is not available everywhere. +* Fri Apr 21 2017 Yichun Zhang (agentzh) +- upgrade to the OpenResty 1.11.2.3 release: http://openresty.org/en/changelog-1011002.html +* Sat Dec 24 2016 Yichun Zhang +- init script: explicity specify the runlevels 345. +* Wed Dec 14 2016 Yichun Zhang +- opm missing runtime dependencies curl, tar, and gzip. +- enabled http_geoip_module by default. +* Fri Nov 25 2016 Yichun Zhang +- opm missing runtime dependency perl(Digest::MD5) +* Thu Nov 17 2016 Yichun Zhang +- upgraded OpenResty to 1.11.2.2. +* Fri Aug 26 2016 Yichun Zhang +- use dual number mode in our luajit builds which should usually +be faster for web application use cases. +* Wed Aug 24 2016 Yichun Zhang +- bump OpenResty version to 1.11.2.1. +* Tue Aug 23 2016 zxcvbn4038 +- use external packages openresty-zlib and openresty-pcre through dynamic linking. +* Thu Jul 14 2016 Yichun Zhang +- enabled more nginx standard modules as well as threads and file aio. +* Sun Jul 10 2016 makerpm +- initial build for OpenResty 1.9.15.1. + diff --git a/dependencies/rpm-specs/opentracing-cpp/opentracing-cpp.spec b/dependencies/rpm-specs/opentracing-cpp/opentracing-cpp.spec new file mode 100644 index 000000000..2c28a7c35 --- /dev/null +++ b/dependencies/rpm-specs/opentracing-cpp/opentracing-cpp.spec @@ -0,0 +1,190 @@ +%global commitid f3c1f42601d13504c68e2bc81c60604f0de055dd +%global meadalpha %{nil} +%global meadrel %{nil} +%global version_major 1 +%global version_minor 3 +%global version_micro 0 + +# +# spec file for package opentracing-cpp +# +# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany. +# +# All modifications and additions to the file contributed by third parties +# remain the property of their copyright owners, unless otherwise agreed +# upon. The license for this file, and modifications and additions to the +# file, is the same license as for the pristine package itself (unless the +# license for the pristine package is not an Open Source License, in which +# case the license is the MIT License). An "Open Source License" is a +# license that conforms to the Open Source Definition (Version 1.9) +# published by the Open Source Initiative. + +# Please submit bugfixes or comments via http://bugs.opensuse.org/ +# + + +Name: opentracing-cpp +Version: %{version_major}.%{version_minor}.%{version_micro} +Release: 132%{?dist} +Summary: OpenTracing C++ API +License: MIT +Group: Development/Languages/C and C++ +Url: http://opentracing.io/ +Source: opentracing-cpp-%{version} +# Patch for cmake to handle lib/lib64 properly +BuildRequires: gcc-c++ cmake3 +%description +C++ implementation of the OpenTracing API. + +%package -n libopentracing-cpp1 +Summary: OpenTracing C++ API +Group: System/Libraries + +%description -n libopentracing-cpp1 +C++ implementation of the OpenTracing API. + +%package devel +Summary: Development files for the OpenTracing C++ API +Group: Development/Languages/C and C++ +Requires: libopentracing-cpp1 = %{version}-%{release} + +%description devel +Development files for the C++ implementation of the OpenTracing API. + +%package devel-static +Summary: Static libraties for the OpenTracing C++ API +Group: Development/Languages/C and C++ +Requires: %{name}-devel = %{version} + +%description devel-static +Static libraries for the C++ implementation of the OpenTracing API. + +%global _libdir /usr/lib/ + +%prep +cp -R ../SOURCES/%{name}-%{version} %{name}-%{version} +%setup -q -T -D -n %{name}-%{version} + +%build +%cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_CXX_FLAGS=-fPIC -DBUILD_DYNAMIC_LIBS=ON -DBUILD_STATIC_LIBS=ON -DBUILD_TESTING=OFF -DLIB_INSTALL_DIR=/usr/%{_lib} +#%%make_jobs +# (the above macro only exists on Suse) +make %{?_smp_mflags} + +%install +#%%cmake_install +# We dont have the above macro +%make_install +# FIXME: cmake_install.cmake does not seem to know about lib64 +# See Patch0 +#mv %{?buildroot}/usr/lib %{?buildroot}/usr/%{_lib} + +%post -n libopentracing-cpp1 -p /sbin/ldconfig + +%postun -n libopentracing-cpp1 -p /sbin/ldconfig + +%files -n libopentracing-cpp1 +%license LICENSE +%dir %{_libdir}/cmake/OpenTracing +%{_libdir}/cmake/OpenTracing/OpenTracingConfig.cmake +%{_libdir}/cmake/OpenTracing/OpenTracingConfigVersion.cmake +%{_libdir}/cmake/OpenTracing/OpenTracingTargets-relwithdebinfo.cmake +%{_libdir}/cmake/OpenTracing/OpenTracingTargets.cmake +%{_libdir}/libopentracing.so.1 +%{_libdir}/libopentracing.so.%{version_major}.%{version_minor}.%{version_micro} +%{_libdir}/libopentracing_mocktracer.so.%{version_major} +%{_libdir}/libopentracing_mocktracer.so.%{version_major}.%{version_minor}.%{version_micro} + +%files devel +%dir %{_includedir}/opentracing +%{_includedir}/opentracing/config.h +%{_includedir}/opentracing/dynamic_load.h +%{_includedir}/opentracing/noop.h +%{_includedir}/opentracing/propagation.h +%{_includedir}/opentracing/span.h +%{_includedir}/opentracing/string_view.h +%{_includedir}/opentracing/tracer.h +%{_includedir}/opentracing/tracer_factory.h +%{_includedir}/opentracing/util.h +%{_includedir}/opentracing/value.h +%{_includedir}/opentracing/version.h + +%dir %{_includedir}/opentracing/expected +%{_includedir}/opentracing/expected/expected.hpp + +# These are only available on 1.4.0 onwards +#%%dir %{_includedir}/opentracing/ext +#%%{_includedir}/opentracing/ext/tags.h + +%dir %{_includedir}/opentracing/mocktracer +%{_includedir}/opentracing/mocktracer/in_memory_recorder.h +%{_includedir}/opentracing/mocktracer/json.h +%{_includedir}/opentracing/mocktracer/json_recorder.h +%{_includedir}/opentracing/mocktracer/recorder.h +%{_includedir}/opentracing/mocktracer/tracer.h +%{_includedir}/opentracing/mocktracer/tracer_factory.h + +%dir %{_includedir}/opentracing/variant +%{_includedir}/opentracing/variant/recursive_wrapper.hpp +%{_includedir}/opentracing/variant/variant.hpp + +%{_libdir}/libopentracing.so +%{_libdir}/libopentracing_mocktracer.so + +%files devel-static +%{_libdir}/libopentracing.a +%{_libdir}/libopentracing_mocktracer.a + +%doc README.md COPYING + +%changelog +* Fri May 06 2022 CPaaS User - 1.3.0-31 +- Bump release + +* Mon Feb 28 2022 CPaaS User - 1.3.0-30 +- Bump release + +* Mon Feb 28 2022 CPaaS User - 1.3.0-29 +- Bump release + +* Thu Feb 24 2022 CPaaS User - 1.3.0-28 +- Bump release + +* Wed Jan 12 2022 CPaaS User - 1.3.0-22.8 +- Bump release + +* Wed Jan 12 2022 CPaaS User - 1.3.0-22.7 +- Bump release + +* Mon Jul 05 2021 CPaaS User - 1.3.0-22.6 +- Bump release + +* Mon Jul 05 2021 CPaaS User - 1.3.0-22.5 +- Bump release + +* Mon Jan 20 2020 cpaas-ops - 1.3.0-17 +Built by CPaaS + +* Mon Jan 20 2020 cpaas-ops - 1.3.0-16 +Built by CPaaS + +* Wed Jan 15 2020 cpaas-ops - 1.3.0-15 +Built by CPaaS + +* Wed Jan 15 2020 cpaas-ops - 1.3.0-14 +Built by CPaaS + +* Wed Jan 15 2020 cpaas-ops - 1.3.0-13 +Built by CPaaS + +* Wed Oct 17 2018 Fernando Nasser - 1.3.0 +- Build 1.3.0 + +* Sat Jul 28 2018 jengelh@inai.de +- Fix RPM groups, edit description for better grammar. +* Mon Jun 25 2018 mrostecki@suse.com +- Make use of %%license macro +* Tue Jun 19 2018 mrostecki@suse.com +- Fix ldconfig calls +* Wed May 2 2018 mrostecki@suse.com +- Initial commit From a6dd109b03facee1a1bef4f3427d24469a74a978 Mon Sep 17 00:00:00 2001 From: Yorgos Saslis Date: Thu, 28 Nov 2024 17:40:33 +0200 Subject: [PATCH 2/9] adds dependencies from cachito sources as git submodules Signed-off-by: Yorgos Saslis --- .gitmodules | 159 ++++++++++++++++++ dependencies/git/apicast-nginx-module | 1 + dependencies/git/array-var-nginx-module | 1 + dependencies/git/drizzle-nginx-module | 1 + dependencies/git/echo-nginx-module | 1 + .../git/encrypted-session-nginx-module | 1 + dependencies/git/form-input-nginx-module | 1 + dependencies/git/grpc | 1 + dependencies/git/headers-more-nginx-module | 1 + dependencies/git/iconv-nginx-module | 1 + dependencies/git/lua-cjson | 1 + dependencies/git/lua-nginx-module | 1 + dependencies/git/lua-rds-parser | 1 + dependencies/git/lua-redis-parser | 1 + dependencies/git/lua-resty-core | 1 + dependencies/git/lua-resty-dns | 1 + dependencies/git/lua-resty-limit-traffic | 1 + dependencies/git/lua-resty-lock | 1 + dependencies/git/lua-resty-lrucache | 1 + dependencies/git/lua-resty-memcached | 1 + dependencies/git/lua-resty-mysql | 1 + dependencies/git/lua-resty-redis | 1 + dependencies/git/lua-resty-shell | 1 + dependencies/git/lua-resty-signal | 1 + dependencies/git/lua-resty-string | 1 + dependencies/git/lua-resty-upload | 1 + .../git/lua-resty-upstream-healthcheck | 1 + dependencies/git/lua-resty-websocket | 1 + dependencies/git/lua-tablepool | 1 + dependencies/git/lua-upstream-nginx-module | 1 + dependencies/git/luajit2 | 1 + dependencies/git/luarocks | 1 + dependencies/git/memc-nginx-module | 1 + dependencies/git/nginx | 1 + dependencies/git/nginx-opentracing | 1 + dependencies/git/ngx_coolkit | 1 + dependencies/git/ngx_devel_kit | 1 + dependencies/git/ngx_http_redis | 1 + dependencies/git/ngx_postgres | 1 + dependencies/git/openresty | 1 + dependencies/git/opentelemetry-cpp | 1 + dependencies/git/opentelemetry-cpp-contrib | 1 + dependencies/git/opentelemetry-proto | 1 + dependencies/git/opentracing-cpp | 1 + dependencies/git/opm | 1 + dependencies/git/rds-csv-nginx-module | 1 + dependencies/git/rds-json-nginx-module | 1 + dependencies/git/redis2-nginx-module | 1 + dependencies/git/resty-cli | 1 + dependencies/git/set-misc-nginx-module | 1 + dependencies/git/srcache-nginx-module | 1 + dependencies/git/stream-lua-nginx-module | 1 + dependencies/git/xss-nginx-module | 1 + dependencies/git/zlib | 1 + 54 files changed, 212 insertions(+) create mode 100644 .gitmodules create mode 160000 dependencies/git/apicast-nginx-module create mode 160000 dependencies/git/array-var-nginx-module create mode 160000 dependencies/git/drizzle-nginx-module create mode 160000 dependencies/git/echo-nginx-module create mode 160000 dependencies/git/encrypted-session-nginx-module create mode 160000 dependencies/git/form-input-nginx-module create mode 160000 dependencies/git/grpc create mode 160000 dependencies/git/headers-more-nginx-module create mode 160000 dependencies/git/iconv-nginx-module create mode 160000 dependencies/git/lua-cjson create mode 160000 dependencies/git/lua-nginx-module create mode 160000 dependencies/git/lua-rds-parser create mode 160000 dependencies/git/lua-redis-parser create mode 160000 dependencies/git/lua-resty-core create mode 160000 dependencies/git/lua-resty-dns create mode 160000 dependencies/git/lua-resty-limit-traffic create mode 160000 dependencies/git/lua-resty-lock create mode 160000 dependencies/git/lua-resty-lrucache create mode 160000 dependencies/git/lua-resty-memcached create mode 160000 dependencies/git/lua-resty-mysql create mode 160000 dependencies/git/lua-resty-redis create mode 160000 dependencies/git/lua-resty-shell create mode 160000 dependencies/git/lua-resty-signal create mode 160000 dependencies/git/lua-resty-string create mode 160000 dependencies/git/lua-resty-upload create mode 160000 dependencies/git/lua-resty-upstream-healthcheck create mode 160000 dependencies/git/lua-resty-websocket create mode 160000 dependencies/git/lua-tablepool create mode 160000 dependencies/git/lua-upstream-nginx-module create mode 160000 dependencies/git/luajit2 create mode 160000 dependencies/git/luarocks create mode 160000 dependencies/git/memc-nginx-module create mode 160000 dependencies/git/nginx create mode 160000 dependencies/git/nginx-opentracing create mode 160000 dependencies/git/ngx_coolkit create mode 160000 dependencies/git/ngx_devel_kit create mode 160000 dependencies/git/ngx_http_redis create mode 160000 dependencies/git/ngx_postgres create mode 160000 dependencies/git/openresty create mode 160000 dependencies/git/opentelemetry-cpp create mode 160000 dependencies/git/opentelemetry-cpp-contrib create mode 160000 dependencies/git/opentelemetry-proto create mode 160000 dependencies/git/opentracing-cpp create mode 160000 dependencies/git/opm create mode 160000 dependencies/git/rds-csv-nginx-module create mode 160000 dependencies/git/rds-json-nginx-module create mode 160000 dependencies/git/redis2-nginx-module create mode 160000 dependencies/git/resty-cli create mode 160000 dependencies/git/set-misc-nginx-module create mode 160000 dependencies/git/srcache-nginx-module create mode 160000 dependencies/git/stream-lua-nginx-module create mode 160000 dependencies/git/xss-nginx-module create mode 160000 dependencies/git/zlib diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 000000000..2267c6ce9 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,159 @@ +[submodule "dependencies/git/opentracing-cpp"] + path = dependencies/git/opentracing-cpp + url = https://github.com/opentracing/opentracing-cpp +[submodule "dependencies/git/zlib"] + path = dependencies/git/zlib + url = https://github.com/madler/zlib +[submodule "dependencies/git/form-input-nginx-module"] + path = dependencies/git/form-input-nginx-module + url = https://github.com/calio/form-input-nginx-module +[submodule "dependencies/git/iconv-nginx-module"] + path = dependencies/git/iconv-nginx-module + url = https://github.com/calio/iconv-nginx-module +[submodule "dependencies/git/ngx_coolkit"] + path = dependencies/git/ngx_coolkit + url = https://github.com/FRiCKLE/ngx_coolkit +[submodule "dependencies/git/array-var-nginx-module"] + path = dependencies/git/array-var-nginx-module + url = https://github.com/openresty/array-var-nginx-module +[submodule "dependencies/git/drizzle-nginx-module"] + path = dependencies/git/drizzle-nginx-module + url = https://github.com/openresty/drizzle-nginx-module +[submodule "dependencies/git/echo-nginx-module"] + path = dependencies/git/echo-nginx-module + url = https://github.com/openresty/echo-nginx-module +[submodule "dependencies/git/encrypted-session-nginx-module"] + path = dependencies/git/encrypted-session-nginx-module + url = https://github.com/openresty/encrypted-session-nginx-module +[submodule "dependencies/git/headers-more-nginx-module"] + path = dependencies/git/headers-more-nginx-module + url = https://github.com/openresty/headers-more-nginx-module +[submodule "dependencies/git/lua-cjson"] + path = dependencies/git/lua-cjson + url = https://github.com/openresty/lua-cjson +[submodule "dependencies/git/lua-nginx-module"] + path = dependencies/git/lua-nginx-module + url = https://github.com/openresty/lua-nginx-module +[submodule "dependencies/git/lua-rds-parser"] + path = dependencies/git/lua-rds-parser + url = https://github.com/openresty/lua-rds-parser +[submodule "dependencies/git/lua-redis-parser"] + path = dependencies/git/lua-redis-parser + url = https://github.com/openresty/lua-redis-parser +[submodule "dependencies/git/lua-resty-core"] + path = dependencies/git/lua-resty-core + url = https://github.com/openresty/lua-resty-core +[submodule "dependencies/git/lua-resty-dns"] + path = dependencies/git/lua-resty-dns + url = https://github.com/openresty/lua-resty-dns +[submodule "dependencies/git/lua-resty-limit-traffic"] + path = dependencies/git/lua-resty-limit-traffic + url = https://github.com/openresty/lua-resty-limit-traffic +[submodule "dependencies/git/lua-resty-lock"] + path = dependencies/git/lua-resty-lock + url = https://github.com/openresty/lua-resty-lock +[submodule "dependencies/git/lua-resty-lrucache"] + path = dependencies/git/lua-resty-lrucache + url = https://github.com/openresty/lua-resty-lrucache +[submodule "dependencies/git/lua-resty-memcached"] + path = dependencies/git/lua-resty-memcached + url = https://github.com/openresty/lua-resty-memcached +[submodule "dependencies/git/lua-resty-mysql"] + path = dependencies/git/lua-resty-mysql + url = https://github.com/openresty/lua-resty-mysql +[submodule "dependencies/git/lua-resty-redis"] + path = dependencies/git/lua-resty-redis + url = https://github.com/openresty/lua-resty-redis +[submodule "dependencies/git/lua-resty-shell"] + path = dependencies/git/lua-resty-shell + url = https://github.com/openresty/lua-resty-shell +[submodule "dependencies/git/lua-resty-signal"] + path = dependencies/git/lua-resty-signal + url = https://github.com/openresty/lua-resty-signal +[submodule "dependencies/git/lua-resty-string"] + path = dependencies/git/lua-resty-string + url = https://github.com/openresty/lua-resty-string +[submodule "dependencies/git/lua-resty-upload"] + path = dependencies/git/lua-resty-upload + url = https://github.com/openresty/lua-resty-upload +[submodule "dependencies/git/lua-resty-upstream-healthcheck"] + path = dependencies/git/lua-resty-upstream-healthcheck + url = https://github.com/openresty/lua-resty-upstream-healthcheck +[submodule "dependencies/git/lua-resty-websocket"] + path = dependencies/git/lua-resty-websocket + url = https://github.com/openresty/lua-resty-websocket +[submodule "dependencies/git/lua-tablepool"] + path = dependencies/git/lua-tablepool + url = https://github.com/openresty/lua-tablepool +[submodule "dependencies/git/lua-upstream-nginx-module"] + path = dependencies/git/lua-upstream-nginx-module + url = https://github.com/openresty/lua-upstream-nginx-module +[submodule "dependencies/git/memc-nginx-module"] + path = dependencies/git/memc-nginx-module + url = https://github.com/openresty/memc-nginx-module +[submodule "dependencies/git/ngx_postgres"] + path = dependencies/git/ngx_postgres + url = https://github.com/openresty/ngx_postgres +[submodule "dependencies/git/opm"] + path = dependencies/git/opm + url = https://github.com/openresty/opm +[submodule "dependencies/git/rds-csv-nginx-module"] + path = dependencies/git/rds-csv-nginx-module + url = https://github.com/openresty/rds-csv-nginx-module +[submodule "dependencies/git/rds-json-nginx-module"] + path = dependencies/git/rds-json-nginx-module + url = https://github.com/openresty/rds-json-nginx-module +[submodule "dependencies/git/redis2-nginx-module"] + path = dependencies/git/redis2-nginx-module + url = https://github.com/openresty/redis2-nginx-module +[submodule "dependencies/git/resty-cli"] + path = dependencies/git/resty-cli + url = https://github.com/openresty/resty-cli +[submodule "dependencies/git/set-misc-nginx-module"] + path = dependencies/git/set-misc-nginx-module + url = https://github.com/openresty/set-misc-nginx-module +[submodule "dependencies/git/srcache-nginx-module"] + path = dependencies/git/srcache-nginx-module + url = https://github.com/openresty/srcache-nginx-module +[submodule "dependencies/git/stream-lua-nginx-module"] + path = dependencies/git/stream-lua-nginx-module + url = https://github.com/openresty/stream-lua-nginx-module +[submodule "dependencies/git/xss-nginx-module"] + path = dependencies/git/xss-nginx-module + url = https://github.com/openresty/xss-nginx-module +[submodule "dependencies/git/luarocks"] + path = dependencies/git/luarocks + url = https://github.com/luarocks/luarocks +[submodule "dependencies/git/luajit2"] + path = dependencies/git/luajit2 + url = https://github.com/rh-api-management/luajit2 +[submodule "dependencies/git/openresty"] + path = dependencies/git/openresty + url = https://github.com/rh-api-management/openresty.git +[submodule "dependencies/git/nginx"] + path = dependencies/git/nginx + url = https://github.com/rh-api-management/nginx +[submodule "dependencies/git/ngx_devel_kit"] + path = dependencies/git/ngx_devel_kit + url = https://github.com/vision5/ngx_devel_kit +[submodule "dependencies/git/ngx_http_redis"] + path = dependencies/git/ngx_http_redis + url = https://github.com/osokin/ngx_http_redis +[submodule "dependencies/git/nginx-opentracing"] + path = dependencies/git/nginx-opentracing + url = https://github.com/opentracing-contrib/nginx-opentracing +[submodule "dependencies/git/apicast-nginx-module"] + path = dependencies/git/apicast-nginx-module + url = https://github.com/3scale/apicast-nginx-module +[submodule "dependencies/git/grpc"] + path = dependencies/git/grpc + url = https://github.com/grpc/grpc +[submodule "dependencies/git/opentelemetry-proto"] + path = dependencies/git/opentelemetry-proto + url = https://github.com/open-telemetry/opentelemetry-proto +[submodule "dependencies/git/opentelemetry-cpp"] + path = dependencies/git/opentelemetry-cpp + url = https://github.com/open-telemetry/opentelemetry-cpp +[submodule "dependencies/git/opentelemetry-cpp-contrib"] + path = dependencies/git/opentelemetry-cpp-contrib + url = https://github.com/open-telemetry/opentelemetry-cpp-contrib diff --git a/dependencies/git/apicast-nginx-module b/dependencies/git/apicast-nginx-module new file mode 160000 index 000000000..3b1abf737 --- /dev/null +++ b/dependencies/git/apicast-nginx-module @@ -0,0 +1 @@ +Subproject commit 3b1abf737ab1f852866aa05acff967a6aaf57bad diff --git a/dependencies/git/array-var-nginx-module b/dependencies/git/array-var-nginx-module new file mode 160000 index 000000000..51cf2ab1c --- /dev/null +++ b/dependencies/git/array-var-nginx-module @@ -0,0 +1 @@ +Subproject commit 51cf2ab1c2817d4ffc7404f1801b62785f649d4b diff --git a/dependencies/git/drizzle-nginx-module b/dependencies/git/drizzle-nginx-module new file mode 160000 index 000000000..b4f94ec25 --- /dev/null +++ b/dependencies/git/drizzle-nginx-module @@ -0,0 +1 @@ +Subproject commit b4f94ec258baaffd283106d589678a7c1bbc93ce diff --git a/dependencies/git/echo-nginx-module b/dependencies/git/echo-nginx-module new file mode 160000 index 000000000..a47a98176 --- /dev/null +++ b/dependencies/git/echo-nginx-module @@ -0,0 +1 @@ +Subproject commit a47a9817660db383a996f4683f2375a8735140a5 diff --git a/dependencies/git/encrypted-session-nginx-module b/dependencies/git/encrypted-session-nginx-module new file mode 160000 index 000000000..58161ba15 --- /dev/null +++ b/dependencies/git/encrypted-session-nginx-module @@ -0,0 +1 @@ +Subproject commit 58161ba15b1e4c77d1c5ffad37b95074b1084560 diff --git a/dependencies/git/form-input-nginx-module b/dependencies/git/form-input-nginx-module new file mode 160000 index 000000000..43ee690c3 --- /dev/null +++ b/dependencies/git/form-input-nginx-module @@ -0,0 +1 @@ +Subproject commit 43ee690c359c06af7d178379cfc37ebc858d9de2 diff --git a/dependencies/git/grpc b/dependencies/git/grpc new file mode 160000 index 000000000..0e34ec339 --- /dev/null +++ b/dependencies/git/grpc @@ -0,0 +1 @@ +Subproject commit 0e34ec3396726ba44a7aaf752eccac0e998beaa8 diff --git a/dependencies/git/headers-more-nginx-module b/dependencies/git/headers-more-nginx-module new file mode 160000 index 000000000..55fbdaba9 --- /dev/null +++ b/dependencies/git/headers-more-nginx-module @@ -0,0 +1 @@ +Subproject commit 55fbdaba96be3d4e534201232f6b555f3415fbb9 diff --git a/dependencies/git/iconv-nginx-module b/dependencies/git/iconv-nginx-module new file mode 160000 index 000000000..67d55c7ed --- /dev/null +++ b/dependencies/git/iconv-nginx-module @@ -0,0 +1 @@ +Subproject commit 67d55c7edd3ab0535afa1e55ec8b2cdeb5167a82 diff --git a/dependencies/git/lua-cjson b/dependencies/git/lua-cjson new file mode 160000 index 000000000..0df488874 --- /dev/null +++ b/dependencies/git/lua-cjson @@ -0,0 +1 @@ +Subproject commit 0df488874f52a881d14b5876babaa780bb6200ee diff --git a/dependencies/git/lua-nginx-module b/dependencies/git/lua-nginx-module new file mode 160000 index 000000000..7105adaa5 --- /dev/null +++ b/dependencies/git/lua-nginx-module @@ -0,0 +1 @@ +Subproject commit 7105adaa523adedec80f0aaa13388b88d08988f8 diff --git a/dependencies/git/lua-rds-parser b/dependencies/git/lua-rds-parser new file mode 160000 index 000000000..621e6b978 --- /dev/null +++ b/dependencies/git/lua-rds-parser @@ -0,0 +1 @@ +Subproject commit 621e6b978983b4779435a56480ea636eae93d65d diff --git a/dependencies/git/lua-redis-parser b/dependencies/git/lua-redis-parser new file mode 160000 index 000000000..2c5a4e960 --- /dev/null +++ b/dependencies/git/lua-redis-parser @@ -0,0 +1 @@ +Subproject commit 2c5a4e960da7870ab29dd6001ba6a2828ce77760 diff --git a/dependencies/git/lua-resty-core b/dependencies/git/lua-resty-core new file mode 160000 index 000000000..d5f6127e0 --- /dev/null +++ b/dependencies/git/lua-resty-core @@ -0,0 +1 @@ +Subproject commit d5f6127e0c0c8b7c076c9843f2fdc422a63a3188 diff --git a/dependencies/git/lua-resty-dns b/dependencies/git/lua-resty-dns new file mode 160000 index 000000000..24c9a6980 --- /dev/null +++ b/dependencies/git/lua-resty-dns @@ -0,0 +1 @@ +Subproject commit 24c9a69808aedfaf029ae57707cdef75d83e2d19 diff --git a/dependencies/git/lua-resty-limit-traffic b/dependencies/git/lua-resty-limit-traffic new file mode 160000 index 000000000..bd1cc13b0 --- /dev/null +++ b/dependencies/git/lua-resty-limit-traffic @@ -0,0 +1 @@ +Subproject commit bd1cc13b0a635fd057bc639dc56d26bd0cd3ee74 diff --git a/dependencies/git/lua-resty-lock b/dependencies/git/lua-resty-lock new file mode 160000 index 000000000..200513336 --- /dev/null +++ b/dependencies/git/lua-resty-lock @@ -0,0 +1 @@ +Subproject commit 200513336d92f3ed9a7390c81da9b57b333e09a4 diff --git a/dependencies/git/lua-resty-lrucache b/dependencies/git/lua-resty-lrucache new file mode 160000 index 000000000..b2035269a --- /dev/null +++ b/dependencies/git/lua-resty-lrucache @@ -0,0 +1 @@ +Subproject commit b2035269ac353444ac65af3969692bcae4fc1605 diff --git a/dependencies/git/lua-resty-memcached b/dependencies/git/lua-resty-memcached new file mode 160000 index 000000000..d4b0186d5 --- /dev/null +++ b/dependencies/git/lua-resty-memcached @@ -0,0 +1 @@ +Subproject commit d4b0186d5e2f65e38c3c63408d462d98c8dc5977 diff --git a/dependencies/git/lua-resty-mysql b/dependencies/git/lua-resty-mysql new file mode 160000 index 000000000..7284ec351 --- /dev/null +++ b/dependencies/git/lua-resty-mysql @@ -0,0 +1 @@ +Subproject commit 7284ec351bdefd310e108ef4e6c42bd6881b32da diff --git a/dependencies/git/lua-resty-redis b/dependencies/git/lua-resty-redis new file mode 160000 index 000000000..053f989c7 --- /dev/null +++ b/dependencies/git/lua-resty-redis @@ -0,0 +1 @@ +Subproject commit 053f989c7f43d8edc79d5151e73b79249c6b5d94 diff --git a/dependencies/git/lua-resty-shell b/dependencies/git/lua-resty-shell new file mode 160000 index 000000000..ea23b3d6d --- /dev/null +++ b/dependencies/git/lua-resty-shell @@ -0,0 +1 @@ +Subproject commit ea23b3d6d4a4b3c475a3e0b530469343694e775c diff --git a/dependencies/git/lua-resty-signal b/dependencies/git/lua-resty-signal new file mode 160000 index 000000000..dc62ea67a --- /dev/null +++ b/dependencies/git/lua-resty-signal @@ -0,0 +1 @@ +Subproject commit dc62ea67a4f9c3aec0f8b6c7aafbae007b5ad087 diff --git a/dependencies/git/lua-resty-string b/dependencies/git/lua-resty-string new file mode 160000 index 000000000..9a543f853 --- /dev/null +++ b/dependencies/git/lua-resty-string @@ -0,0 +1 @@ +Subproject commit 9a543f8531241745f8814e8e02475351042774ec diff --git a/dependencies/git/lua-resty-upload b/dependencies/git/lua-resty-upload new file mode 160000 index 000000000..cae01f590 --- /dev/null +++ b/dependencies/git/lua-resty-upload @@ -0,0 +1 @@ +Subproject commit cae01f590456561bc8d95da3d2d9f937bef57bec diff --git a/dependencies/git/lua-resty-upstream-healthcheck b/dependencies/git/lua-resty-upstream-healthcheck new file mode 160000 index 000000000..0b760c5ed --- /dev/null +++ b/dependencies/git/lua-resty-upstream-healthcheck @@ -0,0 +1 @@ +Subproject commit 0b760c5ed1a8682e04cdca346baf99b2d267f73d diff --git a/dependencies/git/lua-resty-websocket b/dependencies/git/lua-resty-websocket new file mode 160000 index 000000000..d56579452 --- /dev/null +++ b/dependencies/git/lua-resty-websocket @@ -0,0 +1 @@ +Subproject commit d565794524cf9c42a41ed3f1a9848825d24b181f diff --git a/dependencies/git/lua-tablepool b/dependencies/git/lua-tablepool new file mode 160000 index 000000000..28b132d2b --- /dev/null +++ b/dependencies/git/lua-tablepool @@ -0,0 +1 @@ +Subproject commit 28b132d2b1c99b44772e41556aeb58a92b5164e5 diff --git a/dependencies/git/lua-upstream-nginx-module b/dependencies/git/lua-upstream-nginx-module new file mode 160000 index 000000000..a84fbbb3d --- /dev/null +++ b/dependencies/git/lua-upstream-nginx-module @@ -0,0 +1 @@ +Subproject commit a84fbbb3d3b07684c232f642eccbc5334bafcbfe diff --git a/dependencies/git/luajit2 b/dependencies/git/luajit2 new file mode 160000 index 000000000..7b23a1023 --- /dev/null +++ b/dependencies/git/luajit2 @@ -0,0 +1 @@ +Subproject commit 7b23a1023320534ba472ed4222d43f3037780c2b diff --git a/dependencies/git/luarocks b/dependencies/git/luarocks new file mode 160000 index 000000000..f29297f6f --- /dev/null +++ b/dependencies/git/luarocks @@ -0,0 +1 @@ +Subproject commit f29297f6f3185158fc81d6137e21ea7e14e43b74 diff --git a/dependencies/git/memc-nginx-module b/dependencies/git/memc-nginx-module new file mode 160000 index 000000000..858fcdcf1 --- /dev/null +++ b/dependencies/git/memc-nginx-module @@ -0,0 +1 @@ +Subproject commit 858fcdcf145ce2cad51cf5c8aa3d5e41a0facac3 diff --git a/dependencies/git/nginx b/dependencies/git/nginx new file mode 160000 index 000000000..29de57360 --- /dev/null +++ b/dependencies/git/nginx @@ -0,0 +1 @@ +Subproject commit 29de57360d611286cb6cc1b6d2394508d594d320 diff --git a/dependencies/git/nginx-opentracing b/dependencies/git/nginx-opentracing new file mode 160000 index 000000000..3036b8963 --- /dev/null +++ b/dependencies/git/nginx-opentracing @@ -0,0 +1 @@ +Subproject commit 3036b8963f64bd5cf4fb21c893fca9c4214ffa8d diff --git a/dependencies/git/ngx_coolkit b/dependencies/git/ngx_coolkit new file mode 160000 index 000000000..462b863ba --- /dev/null +++ b/dependencies/git/ngx_coolkit @@ -0,0 +1 @@ +Subproject commit 462b863babe121b900465b4ec8dfba612d723e9a diff --git a/dependencies/git/ngx_devel_kit b/dependencies/git/ngx_devel_kit new file mode 160000 index 000000000..a22dade76 --- /dev/null +++ b/dependencies/git/ngx_devel_kit @@ -0,0 +1 @@ +Subproject commit a22dade76c838e5f377d58d007f65d35b5ce1df3 diff --git a/dependencies/git/ngx_http_redis b/dependencies/git/ngx_http_redis new file mode 160000 index 000000000..04f405ec4 --- /dev/null +++ b/dependencies/git/ngx_http_redis @@ -0,0 +1 @@ +Subproject commit 04f405ec4224096ff3d3fdeccc34af6f67d6ff80 diff --git a/dependencies/git/ngx_postgres b/dependencies/git/ngx_postgres new file mode 160000 index 000000000..681980598 --- /dev/null +++ b/dependencies/git/ngx_postgres @@ -0,0 +1 @@ +Subproject commit 681980598529f67fcec5c7448452046764a68429 diff --git a/dependencies/git/openresty b/dependencies/git/openresty new file mode 160000 index 000000000..189070e33 --- /dev/null +++ b/dependencies/git/openresty @@ -0,0 +1 @@ +Subproject commit 189070e331150d40d360b77699ccd8e38bc1ae05 diff --git a/dependencies/git/opentelemetry-cpp b/dependencies/git/opentelemetry-cpp new file mode 160000 index 000000000..57bf8c2b0 --- /dev/null +++ b/dependencies/git/opentelemetry-cpp @@ -0,0 +1 @@ +Subproject commit 57bf8c2b0e85215a61602f559522d08caa4d2fb8 diff --git a/dependencies/git/opentelemetry-cpp-contrib b/dependencies/git/opentelemetry-cpp-contrib new file mode 160000 index 000000000..1ec94c820 --- /dev/null +++ b/dependencies/git/opentelemetry-cpp-contrib @@ -0,0 +1 @@ +Subproject commit 1ec94c82095bab61f06c7393b6f3272469d285af diff --git a/dependencies/git/opentelemetry-proto b/dependencies/git/opentelemetry-proto new file mode 160000 index 000000000..6459e1aae --- /dev/null +++ b/dependencies/git/opentelemetry-proto @@ -0,0 +1 @@ +Subproject commit 6459e1aae1c22e273ac92be86016f0ae55a2430a diff --git a/dependencies/git/opentracing-cpp b/dependencies/git/opentracing-cpp new file mode 160000 index 000000000..f3c1f4260 --- /dev/null +++ b/dependencies/git/opentracing-cpp @@ -0,0 +1 @@ +Subproject commit f3c1f42601d13504c68e2bc81c60604f0de055dd diff --git a/dependencies/git/opm b/dependencies/git/opm new file mode 160000 index 000000000..66c0ad871 --- /dev/null +++ b/dependencies/git/opm @@ -0,0 +1 @@ +Subproject commit 66c0ad871afd4676f85a996d1a2ac48002aa0148 diff --git a/dependencies/git/rds-csv-nginx-module b/dependencies/git/rds-csv-nginx-module new file mode 160000 index 000000000..b4095fcb8 --- /dev/null +++ b/dependencies/git/rds-csv-nginx-module @@ -0,0 +1 @@ +Subproject commit b4095fcb8a866835ddec7ea0c414b8a4af35741a diff --git a/dependencies/git/rds-json-nginx-module b/dependencies/git/rds-json-nginx-module new file mode 160000 index 000000000..0cde4c784 --- /dev/null +++ b/dependencies/git/rds-json-nginx-module @@ -0,0 +1 @@ +Subproject commit 0cde4c784c68e61acc0bc4941c30a42b932a7a9d diff --git a/dependencies/git/redis2-nginx-module b/dependencies/git/redis2-nginx-module new file mode 160000 index 000000000..c989c829a --- /dev/null +++ b/dependencies/git/redis2-nginx-module @@ -0,0 +1 @@ +Subproject commit c989c829a2877132cb100f901e320921250e068d diff --git a/dependencies/git/resty-cli b/dependencies/git/resty-cli new file mode 160000 index 000000000..601774459 --- /dev/null +++ b/dependencies/git/resty-cli @@ -0,0 +1 @@ +Subproject commit 601774459210b4493abc8960f0b37c8a62537e4f diff --git a/dependencies/git/set-misc-nginx-module b/dependencies/git/set-misc-nginx-module new file mode 160000 index 000000000..f6639dc06 --- /dev/null +++ b/dependencies/git/set-misc-nginx-module @@ -0,0 +1 @@ +Subproject commit f6639dc06c92ff301a845558f7b8a1ccef069997 diff --git a/dependencies/git/srcache-nginx-module b/dependencies/git/srcache-nginx-module new file mode 160000 index 000000000..824f69181 --- /dev/null +++ b/dependencies/git/srcache-nginx-module @@ -0,0 +1 @@ +Subproject commit 824f691819a587910b72c19c6374c79d61630594 diff --git a/dependencies/git/stream-lua-nginx-module b/dependencies/git/stream-lua-nginx-module new file mode 160000 index 000000000..1a1e49bd4 --- /dev/null +++ b/dependencies/git/stream-lua-nginx-module @@ -0,0 +1 @@ +Subproject commit 1a1e49bd4be0f858818c4f133a06e2ac9a2ab306 diff --git a/dependencies/git/xss-nginx-module b/dependencies/git/xss-nginx-module new file mode 160000 index 000000000..6c41076ac --- /dev/null +++ b/dependencies/git/xss-nginx-module @@ -0,0 +1 @@ +Subproject commit 6c41076ac066c30c96d70e86da5400ffd49a6186 diff --git a/dependencies/git/zlib b/dependencies/git/zlib new file mode 160000 index 000000000..cacf7f1d4 --- /dev/null +++ b/dependencies/git/zlib @@ -0,0 +1 @@ +Subproject commit cacf7f1d4e3d44d871b605da3b647f07d718623f From 88955a7915c0b3a8b0f403a8b7d61bf5f8e89a45 Mon Sep 17 00:00:00 2001 From: Yorgos Saslis Date: Thu, 28 Nov 2024 17:42:21 +0200 Subject: [PATCH 3/9] adds missing file Signed-off-by: Yorgos Saslis --- dependencies/container-entrypoint | 2 ++ 1 file changed, 2 insertions(+) create mode 100755 dependencies/container-entrypoint diff --git a/dependencies/container-entrypoint b/dependencies/container-entrypoint new file mode 100755 index 000000000..9d8ad4d3c --- /dev/null +++ b/dependencies/container-entrypoint @@ -0,0 +1,2 @@ +#!/bin/bash +exec "$@" From aa7f5e52aebec2ae117e41db5d5f91dc4bc7dce9 Mon Sep 17 00:00:00 2001 From: Yorgos Saslis Date: Thu, 28 Nov 2024 17:45:28 +0200 Subject: [PATCH 4/9] fixes package dependency Signed-off-by: Yorgos Saslis --- dependencies/rpm-specs/openresty/openresty.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies/rpm-specs/openresty/openresty.spec b/dependencies/rpm-specs/openresty/openresty.spec index 5e774dba9..0f62fdff4 100644 --- a/dependencies/rpm-specs/openresty/openresty.spec +++ b/dependencies/rpm-specs/openresty/openresty.spec @@ -90,7 +90,7 @@ Source49: opentelemetry-proto-%{opentelemetry_proto_version}.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) -BuildRequires: make, cmake, perl, systemtap-sdt-devel, git, annobin-annocheck +BuildRequires: make, cmake, perl, systemtap-sdt-devel, git, gcc-toolset-12-annobin-annocheck BuildRequires: perl-File-Temp, dos2unix, pcre-devel, openssl-devel BuildRequires: gcc, gcc-c++ BuildRequires: gcc-toolset-12-gcc, gcc-toolset-12-gcc-c++ From 71d0d5bbc3f783be68d72778ac6930f9cb387105 Mon Sep 17 00:00:00 2001 From: Yorgos Saslis Date: Thu, 28 Nov 2024 18:16:53 +0200 Subject: [PATCH 5/9] Removes a - seemingly - unnecessary build dependency the RPM builds fine without this package. Finding the `rpmdevtools` package is a problem anyway because it's part of the entitled content - and not available in UBI repos. Signed-off-by: Yorgos Saslis --- .../gateway-rockspecs-native/gateway-rockspecs-native.spec | 2 +- dependencies/rpm-specs/gateway-rockspecs/gateway-rockspecs.spec | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dependencies/rpm-specs/gateway-rockspecs-native/gateway-rockspecs-native.spec b/dependencies/rpm-specs/gateway-rockspecs-native/gateway-rockspecs-native.spec index 14cb7a7d3..fd92ce9f6 100644 --- a/dependencies/rpm-specs/gateway-rockspecs-native/gateway-rockspecs-native.spec +++ b/dependencies/rpm-specs/gateway-rockspecs-native/gateway-rockspecs-native.spec @@ -21,7 +21,7 @@ Source2: luafilesystem-1.8.0-1.src.rock BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root -BuildRequires: luarocks rpm-build redhat-rpm-config rpmdevtools libyaml-devel gcc +BuildRequires: luarocks rpm-build redhat-rpm-config libyaml-devel gcc # Using requires so we can regenerate the manifest on installation. Requires: luarocks libyaml glibc-devel diff --git a/dependencies/rpm-specs/gateway-rockspecs/gateway-rockspecs.spec b/dependencies/rpm-specs/gateway-rockspecs/gateway-rockspecs.spec index 4c898b649..51cf44070 100644 --- a/dependencies/rpm-specs/gateway-rockspecs/gateway-rockspecs.spec +++ b/dependencies/rpm-specs/gateway-rockspecs/gateway-rockspecs.spec @@ -34,7 +34,7 @@ Source17: date-2.2-2.src.rock BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root -BuildRequires: luarocks rpm-build redhat-rpm-config rpmdevtools +BuildRequires: luarocks rpm-build redhat-rpm-config # Using requires so we can regenerate the manifest on installation. Requires: luarocks Requires: gateway-rockspecs-native From 57bf21de46482d2f7eeb7b1e21febef2feadd83c Mon Sep 17 00:00:00 2001 From: Yorgos Saslis Date: Thu, 28 Nov 2024 18:28:21 +0200 Subject: [PATCH 6/9] adds an adapted Containerfile from the product build - all RPM builds happen in a multi-stage build - this is just the first version of the Containerfile that I was able to get a passing build on, with `podman build -f Containerfile .` - there are still several improvements to be implemented in the multi-stage build, to reduce some duplication. The previous build system didn't allow reusing previous build stages in subsequent ones (i.e. it didn't allow `FROM rpm-builder AS openresty`, etc.), so that still needs some clearing up. - we should probably only keep one of `Containerfile` and `Dockerfile`. I just didn't overwrite the `Dockerfile` in one go to allow for a better chance of review. Open issue: the jaegertracing-cpp-client RPM is currently commented out. That hadn't previously been ported to its own build stage and I don't know if it's worth doing that now. Hopefully, support for opentracing can be dropped in the next release (considering we now have support for opentelemetry). Signed-off-by: Yorgos Saslis --- Containerfile | 363 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 363 insertions(+) create mode 100644 Containerfile diff --git a/Containerfile b/Containerfile new file mode 100644 index 000000000..a4243b27d --- /dev/null +++ b/Containerfile @@ -0,0 +1,363 @@ +FROM registry.redhat.io/ubi8/ubi:8.10-1132.1731461736 AS rpm-builder + +# Install rpm-build and dependencies, move sources and spec file to their respective directories, build the RPMs and install them +RUN yum install -y rpm-build cmake3 gcc-c++ yum-utils + +ENV RPMBUILD_ROOT="/root/rpmbuild" + +RUN mkdir -p ${RPMBUILD_ROOT}/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS} +RUN echo "%_topdir /root/rpmbuild" > "/root/.rpmmacros" + +ENV RPMBUILD_ROOT="/root/rpmbuild" + +WORKDIR ${RPMBUILD_ROOT} + +FROM rpm-builder as openresty-pcre + +COPY dependencies/rpm-specs/openresty-pcre/openresty-pcre.spec ${RPMBUILD_ROOT}/SPECS/openresty-pcre.spec +RUN yum-builddep --assumeyes SPECS/openresty-pcre.spec + +COPY dependencies/rpm-specs/openresty-pcre/sources/pcre-8.44 ${RPMBUILD_ROOT}/SOURCES/pcre-8.44 +RUN rpmbuild -ba SPECS/openresty-pcre.spec + + +FROM rpm-builder as openresty-zlib + +COPY dependencies/rpm-specs/openresty-zlib/openresty-zlib.spec ${RPMBUILD_ROOT}/SPECS/openresty-zlib.spec +RUN yum-builddep --assumeyes SPECS/openresty-zlib.spec + +COPY dependencies/git/zlib ${RPMBUILD_ROOT}/SOURCES/zlib-1.2.11 +RUN rpmbuild -ba SPECS/openresty-zlib.spec + + +FROM rpm-builder as opentracing-cpp + +COPY dependencies/rpm-specs/opentracing-cpp/opentracing-cpp.spec ${RPMBUILD_ROOT}/SPECS/opentracing-cpp.spec +RUN yum-builddep --assumeyes SPECS/opentracing-cpp.spec + +COPY dependencies/git/opentracing-cpp ${RPMBUILD_ROOT}/SOURCES/opentracing-cpp-1.3.0 +RUN rpmbuild -ba SPECS/opentracing-cpp.spec + + +FROM rpm-builder as openresty + +# Copy *.rpm files from earlier stages to /tmp/ so we can install RPMs +COPY --from=openresty-pcre /root/rpmbuild/RPMS /tmp/openresty-pcre/RPMS +COPY --from=openresty-zlib /root/rpmbuild/RPMS /tmp/openresty-zlib/RPMS +COPY --from=opentracing-cpp /root/rpmbuild/RPMS /tmp/opentracing-cpp/RPMS + +# TODO: fix this later - uncomment for local build +#COPY dependencies/rpm-specs/tmp/annobin-annocheck-10.67-3.el8.x86_64.rpm /tmp/annobin-annocheck-10.67-3.el8.x86_64.rpm +#RUN yum localinstall --assumeyes \ +# /tmp/annobin-annocheck-10.67-3.el8.x86_64.rpm +RUN yum install --assumeyes gcc-toolset-12-annobin-annocheck +RUN yum localinstall --assumeyes \ + /tmp/openresty-pcre/RPMS/`arch`/openresty-pcre-8.44-126.el8.`arch`.rpm \ + /tmp/openresty-pcre/RPMS/`arch`/openresty-pcre-devel-8.44-126.el8.`arch`.rpm \ + /tmp/openresty-zlib/RPMS/`arch`/openresty-zlib-1.2.11-122.el8.`arch`.rpm \ + /tmp/openresty-zlib/RPMS/`arch`/openresty-zlib-devel-1.2.11-122.el8.`arch`.rpm \ + /tmp/opentracing-cpp/RPMS/`arch`/libopentracing-cpp1-1.3.0-132.el8.`arch`.rpm \ + /tmp/opentracing-cpp/RPMS/`arch`/opentracing-cpp-devel-1.3.0-132.el8.`arch`.rpm + +COPY dependencies/rpm-specs/openresty/openresty.spec ${RPMBUILD_ROOT}/SPECS/openresty.spec +RUN yum-builddep --assumeyes SPECS/openresty.spec + +COPY dependencies/git/array-var-nginx-module ${RPMBUILD_ROOT}/SOURCES/array-var-nginx-module-v0.05 +COPY dependencies/git/drizzle-nginx-module ${RPMBUILD_ROOT}/SOURCES/drizzle-nginx-module-v0.1.11 +COPY dependencies/git/echo-nginx-module ${RPMBUILD_ROOT}/SOURCES/echo-nginx-module-v0.62 +COPY dependencies/git/encrypted-session-nginx-module ${RPMBUILD_ROOT}/SOURCES/encrypted-session-nginx-module-v0.08 +COPY dependencies/git/form-input-nginx-module ${RPMBUILD_ROOT}/SOURCES/form-input-nginx-module-v0.12 +COPY dependencies/git/headers-more-nginx-module ${RPMBUILD_ROOT}/SOURCES/headers-more-nginx-module-v0.33 +COPY dependencies/git/iconv-nginx-module ${RPMBUILD_ROOT}/SOURCES/iconv-nginx-module-v0.14 +COPY dependencies/git/lua-cjson ${RPMBUILD_ROOT}/SOURCES/lua-cjson-2.1.0.8 +COPY dependencies/git/luajit2 ${RPMBUILD_ROOT}/SOURCES/luajit2-v2.1-20201027-product-zfixes +COPY dependencies/git/lua-nginx-module ${RPMBUILD_ROOT}/SOURCES/lua-nginx-module-v0.10.19 +COPY dependencies/git/lua-rds-parser ${RPMBUILD_ROOT}/SOURCES/lua-rds-parser-v0.06 +COPY dependencies/git/lua-redis-parser ${RPMBUILD_ROOT}/SOURCES/lua-redis-parser-v0.13 +COPY dependencies/git/lua-resty-core ${RPMBUILD_ROOT}/SOURCES/lua-resty-core-v0.1.21 +COPY dependencies/git/lua-resty-dns ${RPMBUILD_ROOT}/SOURCES/lua-resty-dns-v0.21 +COPY dependencies/git/lua-resty-limit-traffic ${RPMBUILD_ROOT}/SOURCES/lua-resty-limit-traffic-v0.07 +COPY dependencies/git/lua-resty-lock ${RPMBUILD_ROOT}/SOURCES/lua-resty-lock-v0.08 +COPY dependencies/git/lua-resty-lrucache ${RPMBUILD_ROOT}/SOURCES/lua-resty-lrucache-v0.10 +COPY dependencies/git/lua-resty-memcached ${RPMBUILD_ROOT}/SOURCES/lua-resty-memcached-v0.15 +COPY dependencies/git/lua-resty-mysql ${RPMBUILD_ROOT}/SOURCES/lua-resty-mysql-v0.23 +COPY dependencies/git/lua-resty-redis ${RPMBUILD_ROOT}/SOURCES/lua-resty-redis-v0.29 +COPY dependencies/git/lua-resty-shell ${RPMBUILD_ROOT}/SOURCES/lua-resty-shell-v0.03 +COPY dependencies/git/lua-resty-signal ${RPMBUILD_ROOT}/SOURCES/lua-resty-signal-v0.02 +COPY dependencies/git/lua-resty-string ${RPMBUILD_ROOT}/SOURCES/lua-resty-string-v0.12 +COPY dependencies/git/lua-resty-upload ${RPMBUILD_ROOT}/SOURCES/lua-resty-upload-v0.10 +COPY dependencies/git/lua-resty-upstream-healthcheck ${RPMBUILD_ROOT}/SOURCES/lua-resty-upstream-healthcheck-v0.06 +COPY dependencies/git/lua-resty-websocket ${RPMBUILD_ROOT}/SOURCES/lua-resty-websocket-v0.08 +COPY dependencies/git/lua-tablepool ${RPMBUILD_ROOT}/SOURCES/lua-tablepool-v0.01 +COPY dependencies/git/lua-upstream-nginx-module ${RPMBUILD_ROOT}/SOURCES/lua-upstream-nginx-module-v0.07 +COPY dependencies/git/memc-nginx-module ${RPMBUILD_ROOT}/SOURCES/memc-nginx-module-v0.19 +COPY dependencies/git/nginx ${RPMBUILD_ROOT}/SOURCES/nginx-release-1.19.3-product-4 +COPY dependencies/git/ngx_coolkit ${RPMBUILD_ROOT}/SOURCES/ngx_coolkit-0.2 +COPY dependencies/git/ngx_devel_kit ${RPMBUILD_ROOT}/SOURCES/ngx_devel_kit-v0.3.1 +COPY dependencies/git/ngx_http_redis ${RPMBUILD_ROOT}/SOURCES/ngx_http_redis-0.3.7 +COPY dependencies/git/ngx_postgres ${RPMBUILD_ROOT}/SOURCES/ngx_postgres-1.0 +COPY dependencies/git/opm ${RPMBUILD_ROOT}/SOURCES/opm-v0.0.5 +COPY dependencies/git/rds-csv-nginx-module ${RPMBUILD_ROOT}/SOURCES/rds-csv-nginx-module-v0.09 +COPY dependencies/git/rds-json-nginx-module ${RPMBUILD_ROOT}/SOURCES/rds-json-nginx-module-v0.15 +COPY dependencies/git/redis2-nginx-module ${RPMBUILD_ROOT}/SOURCES/redis2-nginx-module-v0.15 +COPY dependencies/git/resty-cli ${RPMBUILD_ROOT}/SOURCES/resty-cli-v0.27 +COPY dependencies/git/set-misc-nginx-module ${RPMBUILD_ROOT}/SOURCES/set-misc-nginx-module-v0.32 +COPY dependencies/git/srcache-nginx-module ${RPMBUILD_ROOT}/SOURCES/srcache-nginx-module-v0.32 +COPY dependencies/git/stream-lua-nginx-module ${RPMBUILD_ROOT}/SOURCES/stream-lua-nginx-module-v0.0.9 +COPY dependencies/git/xss-nginx-module ${RPMBUILD_ROOT}/SOURCES/xss-nginx-module-v0.06 +COPY dependencies/git/nginx-opentracing ${RPMBUILD_ROOT}/SOURCES/nginx-opentracing-v0.3.0 +COPY dependencies/git/apicast-nginx-module ${RPMBUILD_ROOT}/SOURCES/apicast-nginx-module-v0.4 +COPY dependencies/git/grpc ${RPMBUILD_ROOT}/SOURCES/grpc-v1.49.2 +COPY dependencies/git/opentelemetry-proto ${RPMBUILD_ROOT}/SOURCES/opentelemetry-proto-v0.19.0 +COPY dependencies/git/opentelemetry-cpp ${RPMBUILD_ROOT}/SOURCES/opentelemetry-cpp-v1.8.1 +COPY dependencies/git/opentelemetry-cpp-contrib ${RPMBUILD_ROOT}/SOURCES/opentelemetry-cpp-contrib-1ec94c82095bab61f06c7393b6f3272469d285af +COPY dependencies/git/openresty ${RPMBUILD_ROOT}/SOURCES/openresty-189070e331150d40d360b77699ccd8e38bc1ae05 + +WORKDIR ${RPMBUILD_ROOT}/SOURCES + +RUN directories=($(find . -maxdepth 1 -type d -printf '%f\n')); \ + for dir in "${directories[@]}"; do \ + if [[ $dir != "." ]]; then \ + tar --create --gzip --file="${dir##*/}.tar.gz" "$dir" ; \ + fi \ + done + +RUN ls -alh + +WORKDIR ${RPMBUILD_ROOT} + +RUN rpmbuild -ba SPECS/openresty.spec + +FROM rpm-builder as luarocks + +COPY dependencies/rpm-specs/luarocks/luarocks.spec ${RPMBUILD_ROOT}/SPECS/luarocks.spec + +# install package dependencies +ARG OPENRESTY_RPM_VERSION="1.19.3-123.el8" +COPY --from=openresty-pcre /root/rpmbuild/RPMS /tmp/openresty-pcre/RPMS +COPY --from=openresty-zlib /root/rpmbuild/RPMS /tmp/openresty-zlib/RPMS +COPY --from=opentracing-cpp /root/rpmbuild/RPMS /tmp/opentracing-cpp/RPMS +COPY --from=openresty /root/rpmbuild/RPMS /tmp/openresty/RPMS +RUN yum localinstall --assumeyes \ + /tmp/openresty-pcre/RPMS/`arch`/openresty-pcre-8.44-126.el8.`arch`.rpm \ + /tmp/openresty-pcre/RPMS/`arch`/openresty-pcre-devel-8.44-126.el8.`arch`.rpm \ + /tmp/openresty-zlib/RPMS/`arch`/openresty-zlib-1.2.11-122.el8.`arch`.rpm \ + /tmp/openresty-zlib/RPMS/`arch`/openresty-zlib-devel-1.2.11-122.el8.`arch`.rpm \ + /tmp/opentracing-cpp/RPMS/`arch`/libopentracing-cpp1-1.3.0-132.el8.`arch`.rpm \ + /tmp/opentracing-cpp/RPMS/`arch`/opentracing-cpp-devel-1.3.0-132.el8.`arch`.rpm \ + /tmp/openresty/RPMS/noarch/openresty-resty-${OPENRESTY_RPM_VERSION}.noarch.rpm \ + /tmp/openresty/RPMS/noarch/openresty-opm-${OPENRESTY_RPM_VERSION}.noarch.rpm \ + /tmp/openresty/RPMS/`arch`/openresty-opentelemetry-${OPENRESTY_RPM_VERSION}.`arch`.rpm \ + /tmp/openresty/RPMS/`arch`/openresty-opentracing-${OPENRESTY_RPM_VERSION}.`arch`.rpm \ + /tmp/openresty/RPMS/`arch`/openresty-${OPENRESTY_RPM_VERSION}.`arch`.rpm + +RUN yum-builddep --assumeyes SPECS/luarocks.spec + +ARG LUAROCKS_VERSION="2.3.0-105.el8" + +COPY dependencies/git/luarocks ${RPMBUILD_ROOT}/SOURCES/luarocks-${LUAROCKS_VERSION} +WORKDIR ${RPMBUILD_ROOT}/SOURCES +RUN tar --create --gzip --file="luarocks-${LUAROCKS_VERSION}.tar.gz" luarocks-${LUAROCKS_VERSION} + +WORKDIR ${RPMBUILD_ROOT} + +RUN rpmbuild -ba SPECS/luarocks.spec + +FROM rpm-builder AS gateway-rockspecs-native + +COPY dependencies/rpm-specs/gateway-rockspecs-native/gateway-rockspecs-native.spec ${RPMBUILD_ROOT}/SPECS/gateway-rockspecs-native.spec +COPY dependencies/rpm-specs/gateway-rockspecs-native/licenses.xml ${RPMBUILD_ROOT}/SOURCES/licenses.xml +COPY dependencies/rpm-specs/gateway-rockspecs-native/source_rocks/* ${RPMBUILD_ROOT}/SOURCES/ +RUN yum install -y libyaml-devel + +# TODO: fix this later - uncomment for local build +# RUN yum localinstall -y https://rpmfind.net/linux/centos/8-stream/AppStream/x86_64/os/Packages/rpmdevtools-8.10-8.el8.noarch.rpm + +# install luarocks from previous build stage +ARG LUAROCKS_VERSION="2.3.0-105.el8" +ARG OPENRESTY_RPM_VERSION="1.19.3-123.el8" +COPY --from=openresty-pcre /root/rpmbuild/RPMS /tmp/openresty-pcre/RPMS +COPY --from=openresty-zlib /root/rpmbuild/RPMS /tmp/openresty-zlib/RPMS +COPY --from=opentracing-cpp /root/rpmbuild/RPMS /tmp/opentracing-cpp/RPMS +COPY --from=openresty /root/rpmbuild/RPMS /tmp/openresty/RPMS +COPY --from=luarocks /root/rpmbuild/RPMS /tmp/luarocks/RPMS + +RUN yum localinstall --assumeyes \ + /tmp/openresty-pcre/RPMS/`arch`/openresty-pcre-8.44-126.el8.`arch`.rpm \ + /tmp/openresty-pcre/RPMS/`arch`/openresty-pcre-devel-8.44-126.el8.`arch`.rpm \ + /tmp/openresty-zlib/RPMS/`arch`/openresty-zlib-1.2.11-122.el8.`arch`.rpm \ + /tmp/openresty-zlib/RPMS/`arch`/openresty-zlib-devel-1.2.11-122.el8.`arch`.rpm \ + /tmp/opentracing-cpp/RPMS/`arch`/libopentracing-cpp1-1.3.0-132.el8.`arch`.rpm \ + /tmp/opentracing-cpp/RPMS/`arch`/opentracing-cpp-devel-1.3.0-132.el8.`arch`.rpm \ + /tmp/openresty/RPMS/noarch/openresty-resty-${OPENRESTY_RPM_VERSION}.noarch.rpm \ + /tmp/openresty/RPMS/noarch/openresty-opm-${OPENRESTY_RPM_VERSION}.noarch.rpm \ + /tmp/openresty/RPMS/`arch`/openresty-opentelemetry-${OPENRESTY_RPM_VERSION}.`arch`.rpm \ + /tmp/openresty/RPMS/`arch`/openresty-opentracing-${OPENRESTY_RPM_VERSION}.`arch`.rpm \ + /tmp/openresty/RPMS/`arch`/openresty-${OPENRESTY_RPM_VERSION}.`arch`.rpm \ + /tmp/luarocks/RPMS/`arch`/luarocks-${LUAROCKS_VERSION}.`arch`.rpm + +RUN yum-builddep --assumeyes SPECS/gateway-rockspecs-native.spec + +WORKDIR ${RPMBUILD_ROOT} + +RUN rpmbuild -ba SPECS/gateway-rockspecs-native.spec + + +FROM rpm-builder AS gateway-rockspecs + +COPY dependencies/rpm-specs/gateway-rockspecs/gateway-rockspecs.spec ${RPMBUILD_ROOT}/SPECS/gateway-rockspecs.spec +COPY dependencies/rpm-specs/gateway-rockspecs/licenses.xml ${RPMBUILD_ROOT}/SOURCES/licenses.xml +COPY dependencies/rpm-specs/gateway-rockspecs/source_rocks/* ${RPMBUILD_ROOT}/SOURCES/ + +# TODO: fix this later - uncomment for local build +# RUN yum localinstall -y https://rpmfind.net/linux/centos/8-stream/AppStream/x86_64/os/Packages/rpmdevtools-8.10-8.el8.noarch.rpm + +# install RPMs from previous build stages +ARG LUAROCKS_VERSION="2.3.0-105.el8" +ARG OPENRESTY_RPM_VERSION="1.19.3-123.el8" +ARG GATEWAY_ROCKSPECS_NATIVE_VERSION="1.0.0-123.el8" + +COPY --from=openresty-pcre /root/rpmbuild/RPMS /tmp/openresty-pcre/RPMS +COPY --from=openresty-zlib /root/rpmbuild/RPMS /tmp/openresty-zlib/RPMS +COPY --from=opentracing-cpp /root/rpmbuild/RPMS /tmp/opentracing-cpp/RPMS +COPY --from=openresty /root/rpmbuild/RPMS /tmp/openresty/RPMS +COPY --from=luarocks /root/rpmbuild/RPMS /tmp/luarocks/RPMS +COPY --from=gateway-rockspecs-native /root/rpmbuild/RPMS /tmp/gateway-rockspecs-native/RPMS + +RUN yum localinstall --assumeyes \ + /tmp/openresty-pcre/RPMS/`arch`/openresty-pcre-8.44-126.el8.`arch`.rpm \ + /tmp/openresty-pcre/RPMS/`arch`/openresty-pcre-devel-8.44-126.el8.`arch`.rpm \ + /tmp/openresty-zlib/RPMS/`arch`/openresty-zlib-1.2.11-122.el8.`arch`.rpm \ + /tmp/openresty-zlib/RPMS/`arch`/openresty-zlib-devel-1.2.11-122.el8.`arch`.rpm \ + /tmp/opentracing-cpp/RPMS/`arch`/libopentracing-cpp1-1.3.0-132.el8.`arch`.rpm \ + /tmp/opentracing-cpp/RPMS/`arch`/opentracing-cpp-devel-1.3.0-132.el8.`arch`.rpm \ + /tmp/openresty/RPMS/noarch/openresty-resty-${OPENRESTY_RPM_VERSION}.noarch.rpm \ + /tmp/openresty/RPMS/noarch/openresty-opm-${OPENRESTY_RPM_VERSION}.noarch.rpm \ + /tmp/openresty/RPMS/`arch`/openresty-opentelemetry-${OPENRESTY_RPM_VERSION}.`arch`.rpm \ + /tmp/openresty/RPMS/`arch`/openresty-opentracing-${OPENRESTY_RPM_VERSION}.`arch`.rpm \ + /tmp/openresty/RPMS/`arch`/openresty-${OPENRESTY_RPM_VERSION}.`arch`.rpm \ + /tmp/luarocks/RPMS/`arch`/luarocks-${LUAROCKS_VERSION}.`arch`.rpm \ + /tmp/gateway-rockspecs-native/RPMS/`arch`/gateway-rockspecs-native-${GATEWAY_ROCKSPECS_NATIVE_VERSION}.`arch`.rpm + +RUN yum-builddep --assumeyes SPECS/gateway-rockspecs.spec + +RUN rpmbuild -ba SPECS/gateway-rockspecs.spec + +FROM registry.redhat.io/ubi8/ubi:8.10-1132.1731461736 AS apicast + +LABEL summary="3scale's API gateway (APIcast) is an OpenResty application which consists of two parts: Nginx configuration and Lua files." \ + description="APIcast is not a standalone API gateway therefore it needs connection to the 3scale API management platform. The container includes OpenResty and uses LuaRocks to install dependencies (rocks are installed in the application folder)." \ + io.k8s.description="APIcast is not a standalone API gateway therefore it needs connection to the 3scale API management platform. The container includes OpenResty and uses LuaRocks to install dependencies (rocks are installed in the application folder)." \ + io.k8s.display-name="3scale API gateway (APIcast)" \ + io.openshift.expose-services="8080:apicast" \ + io.openshift.tags="integration, nginx, lua, openresty, api, gateway, 3scale, rhamp" + +# Labels consumed by Red Hat build service +LABEL com.redhat.component="3scale-amp-apicast-gateway-container" \ + name="3scale-amp2/apicast-gateway-rhel8" \ + version="1.25.0"\ + upstream_repo="${CI_APICAST_UPSTREAM_URL}" \ + upstream_ref="${CI_APICAST_UPSTREAM_COMMIT}" \ + maintainer="3scale-engineering@redhat.com" + +ENV AUTO_UPDATE_INTERVAL=0 \ + # The $HOME is not set by default, but some applications needs this variable + HOME=/opt/app-root/src \ + PATH=/opt/app-root/src/bin:/opt/app-root/bin:$PATH + +EXPOSE 8080 + +WORKDIR /tmp + +ARG BUILD_TYPE=brew +ARG OPENRESTY_RPM_VERSION="1.19.3-123.el8" +ARG LUAROCKS_VERSION="2.3.0-105.el8" +ARG GATEWAY_ROCKSPECS_VERSION="2.10.0-102.el8" +ARG GATEWAY_ROCKSPECS_NATIVE_VERSION="1.0.0-123.el8" +ARG JAEGERTRACING_CPP_CLIENT_RPM_VERSION="0.3.1-16.el8" + +# Copy the upstream sources from cachito integration +COPY gateway /opt/app-root/src + +# Copy *.rpm files to /tmp/ so we can inject local rpms for local build +#ADD apicast-*.tar.gz /tmp/ + +# Copy *.rpm files from earlier stages to /tmp/ so we can install RPMs +WORKDIR ${RPMBUILD_ROOT} + +# TODO: fix this later - uncomment for local build +#COPY tmp/annobin-annocheck-10.67-3.el8.x86_64.rpm /tmp/annobin-annocheck-10.67-3.el8.x86_64.rpm +#RUN yum localinstall --assumeyes \ +# /tmp/annobin-annocheck-10.67-3.el8.x86_64.rpm +RUN yum install --assumeyes gcc-toolset-12-annobin-annocheck + +# Copy *.rpm files from earlier stages to /tmp/ so we can install RPMs +COPY --from=openresty-pcre /root/rpmbuild/RPMS /tmp/openresty-pcre/RPMS +COPY --from=openresty-zlib /root/rpmbuild/RPMS /tmp/openresty-zlib/RPMS +COPY --from=opentracing-cpp /root/rpmbuild/RPMS /tmp/opentracing-cpp/RPMS +COPY --from=openresty /root/rpmbuild/RPMS /tmp/openresty/RPMS +COPY --from=luarocks /root/rpmbuild/RPMS /tmp/luarocks/RPMS +COPY --from=gateway-rockspecs-native /root/rpmbuild/RPMS /tmp/gateway-rockspecs-native/RPMS +COPY --from=gateway-rockspecs /root/rpmbuild/RPMS /tmp/gateway-rockspecs/RPMS + +RUN yum localinstall --assumeyes \ + /tmp/openresty-pcre/RPMS/`arch`/openresty-pcre-8.44-126.el8.`arch`.rpm \ + /tmp/openresty-pcre/RPMS/`arch`/openresty-pcre-devel-8.44-126.el8.`arch`.rpm \ + /tmp/openresty-zlib/RPMS/`arch`/openresty-zlib-1.2.11-122.el8.`arch`.rpm \ + /tmp/openresty-zlib/RPMS/`arch`/openresty-zlib-devel-1.2.11-122.el8.`arch`.rpm \ + /tmp/opentracing-cpp/RPMS/`arch`/libopentracing-cpp1-1.3.0-132.el8.`arch`.rpm \ + /tmp/opentracing-cpp/RPMS/`arch`/opentracing-cpp-devel-1.3.0-132.el8.`arch`.rpm \ + /tmp/openresty/RPMS/noarch/openresty-resty-${OPENRESTY_RPM_VERSION}.noarch.rpm \ + /tmp/openresty/RPMS/noarch/openresty-opm-${OPENRESTY_RPM_VERSION}.noarch.rpm \ + /tmp/openresty/RPMS/`arch`/openresty-opentelemetry-${OPENRESTY_RPM_VERSION}.`arch`.rpm \ + /tmp/openresty/RPMS/`arch`/openresty-opentracing-${OPENRESTY_RPM_VERSION}.`arch`.rpm \ + /tmp/openresty/RPMS/`arch`/openresty-${OPENRESTY_RPM_VERSION}.`arch`.rpm \ + /tmp/luarocks/RPMS/`arch`/luarocks-${LUAROCKS_VERSION}.`arch`.rpm \ + /tmp/gateway-rockspecs-native/RPMS/`arch`/gateway-rockspecs-native-${GATEWAY_ROCKSPECS_NATIVE_VERSION}.`arch`.rpm \ + /tmp/gateway-rockspecs/RPMS/noarch/gateway-rockspecs-${GATEWAY_ROCKSPECS_VERSION}.noarch.rpm + +# FIXME/Yorgos: see if this is still required +#RUN PKGS="jaegertracing-cpp-client-${JAEGERTRACING_CPP_CLIENT_RPM_VERSION}" && \ +# mkdir -p "$HOME" && \ +# yum -y --setopt=tsflags=nodocs install $PKGS && \ +# rpm -V $PKGS && \ +# yum clean all -y + +RUN mkdir -p /opt/app-root/src/logs && \ + useradd -u 1001 -r -g 0 -d ${HOME} -s /sbin/nologin -c "Default Application User" default && \ + rm -r /usr/local/openresty/nginx/logs && \ + ln -s /opt/app-root/src/logs /usr/local/openresty/nginx/logs && \ + ln -s /dev/stdout /opt/app-root/src/logs/access.log && \ + ln -s /dev/stderr /opt/app-root/src/logs/error.log && \ + mkdir -p /usr/local/share/lua/ && \ + chmod g+w /usr/local/share/lua/ && \ + mkdir -p /usr/local/openresty/nginx/{client_body_temp,fastcgi_temp,proxy_temp,scgi_temp,uwsgi_temp} && \ + chown -R 1001:0 /opt/app-root /usr/local/share/lua/ /usr/local/openresty/nginx/{client_body_temp,fastcgi_temp,proxy_temp,scgi_temp,uwsgi_temp} + +RUN mkdir -p /root/licenses/3scale-amp-apicast-gateway && \ + cp /usr/share/licenses/gateway-rockspecs/licenses.xml /root/licenses/3scale-amp-apicast-gateway/licenses.xml + +COPY dependencies/container-entrypoint /usr/local/bin/container-entrypoint + +RUN ln --verbose --symbolic /opt/app-root/src /opt/app-root/app && \ + ln --verbose --symbolic /opt/app-root/bin /opt/app-root/scripts + +ENV LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/opt/app-root/lib" + +WORKDIR /opt/app-root/app + +RUN \ + ln --verbose --symbolic /opt/app-root/src/bin /opt/app-root/bin && \ + ln --verbose --symbolic /opt/app-root/src/http.d /opt/app-root/http.d && \ + ln --verbose --symbolic --force /etc/ssl/certs/ca-bundle.crt "/opt/app-root/src/conf" && \ + chmod --verbose g+w "${HOME}" "${HOME}"/* "${HOME}/http.d" && \ + chown -R 1001:0 /opt/app-root + +USER 1001 + +ENV LUA_CPATH "./?.so;/usr/lib64/lua/5.1/?.so;/usr/lib64/lua/5.1/loadall.so;/usr/local/lib64/lua/5.1/?.so" +ENV LUA_PATH "/usr/lib64/lua/5.1/?.lua;/usr/local/share/lua/5.1/?.lua;/usr/local/share/lua/5.1/*/?.lua;" + +WORKDIR /opt/app-root +ENTRYPOINT ["container-entrypoint"] +CMD ["scripts/run"] From 410148e11be24f3004b92f1e75d84c05e7b1282c Mon Sep 17 00:00:00 2001 From: Yorgos Saslis Date: Thu, 28 Nov 2024 20:04:05 +0200 Subject: [PATCH 7/9] adds missing source rocks Signed-off-by: Yorgos Saslis --- .gitignore | 3 +++ .../luafilesystem-1.8.0-1.src.rock | Bin 0 -> 39583 bytes .../source_rocks/lyaml-6.2.3-1.src.rock | Bin 0 -> 69320 bytes .../source_rocks/argparse-0.6.0-1.src.rock | Bin 0 -> 2502603 bytes .../source_rocks/date-2.2-2.src.rock | Bin 0 -> 34861 bytes .../source_rocks/inspect-3.1.1-0.src.rock | Bin 0 -> 11919 bytes .../source_rocks/jsonschema-0.8-0.src.rock | Bin 0 -> 30822 bytes .../source_rocks/liquid-0.2.0-2.src.rock | Bin 0 -> 28926 bytes .../lua-resty-env-0.4.0-1.src.rock | Bin 0 -> 8729 bytes .../lua-resty-execvp-0.1.1-1.src.rock | Bin 0 -> 8151 bytes .../lua-resty-http-0.17.1-0.src.rock | Bin 0 -> 67230 bytes .../lua-resty-iputils-0.3.0-1.src.rock | Bin 0 -> 10217 bytes .../lua-resty-jit-uuid-0.0.7-1.src.rock | Bin 0 -> 24718 bytes .../lua-resty-jwt-0.2.0-0.src.rock | Bin 0 -> 63375 bytes .../lua-resty-url-0.3.5-1.src.rock | Bin 0 -> 11267 bytes .../source_rocks/lua-rover-scm-1.src.rock | Bin 0 -> 25824 bytes .../source_rocks/net-url-0.9-1.src.rock | Bin 0 -> 14709 bytes ...nginx-lua-prometheus-0.20181120-2.src.rock | Bin 0 -> 13805 bytes .../source_rocks/penlight-1.13.1-1.src.rock | Bin 0 -> 596808 bytes .../source_rocks/router-2.1-0.src.rock | Bin 0 -> 6770 bytes 20 files changed, 3 insertions(+) create mode 100644 dependencies/rpm-specs/gateway-rockspecs-native/source_rocks/luafilesystem-1.8.0-1.src.rock create mode 100644 dependencies/rpm-specs/gateway-rockspecs-native/source_rocks/lyaml-6.2.3-1.src.rock create mode 100644 dependencies/rpm-specs/gateway-rockspecs/source_rocks/argparse-0.6.0-1.src.rock create mode 100644 dependencies/rpm-specs/gateway-rockspecs/source_rocks/date-2.2-2.src.rock create mode 100644 dependencies/rpm-specs/gateway-rockspecs/source_rocks/inspect-3.1.1-0.src.rock create mode 100644 dependencies/rpm-specs/gateway-rockspecs/source_rocks/jsonschema-0.8-0.src.rock create mode 100644 dependencies/rpm-specs/gateway-rockspecs/source_rocks/liquid-0.2.0-2.src.rock create mode 100644 dependencies/rpm-specs/gateway-rockspecs/source_rocks/lua-resty-env-0.4.0-1.src.rock create mode 100644 dependencies/rpm-specs/gateway-rockspecs/source_rocks/lua-resty-execvp-0.1.1-1.src.rock create mode 100644 dependencies/rpm-specs/gateway-rockspecs/source_rocks/lua-resty-http-0.17.1-0.src.rock create mode 100644 dependencies/rpm-specs/gateway-rockspecs/source_rocks/lua-resty-iputils-0.3.0-1.src.rock create mode 100644 dependencies/rpm-specs/gateway-rockspecs/source_rocks/lua-resty-jit-uuid-0.0.7-1.src.rock create mode 100644 dependencies/rpm-specs/gateway-rockspecs/source_rocks/lua-resty-jwt-0.2.0-0.src.rock create mode 100644 dependencies/rpm-specs/gateway-rockspecs/source_rocks/lua-resty-url-0.3.5-1.src.rock create mode 100644 dependencies/rpm-specs/gateway-rockspecs/source_rocks/lua-rover-scm-1.src.rock create mode 100644 dependencies/rpm-specs/gateway-rockspecs/source_rocks/net-url-0.9-1.src.rock create mode 100644 dependencies/rpm-specs/gateway-rockspecs/source_rocks/nginx-lua-prometheus-0.20181120-2.src.rock create mode 100644 dependencies/rpm-specs/gateway-rockspecs/source_rocks/penlight-1.13.1-1.src.rock create mode 100644 dependencies/rpm-specs/gateway-rockspecs/source_rocks/router-2.1-0.src.rock diff --git a/.gitignore b/.gitignore index b45ebbc18..aa56a199d 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,9 @@ node_modules .vagrant/ apicast/logs/ *.rock +# explicitly allow some source rocks as dependencies +!dependencies/rpm-specs/gateway-rockspecs-native/source_rocks/*.src.rock +!dependencies/rpm-specs/gateway-rockspecs/source_rocks/*.src.rock lua_modules/ tmp/benchmark/ .bash_history diff --git a/dependencies/rpm-specs/gateway-rockspecs-native/source_rocks/luafilesystem-1.8.0-1.src.rock b/dependencies/rpm-specs/gateway-rockspecs-native/source_rocks/luafilesystem-1.8.0-1.src.rock new file mode 100644 index 0000000000000000000000000000000000000000..8a1f6ac56fcbc5d105d28a282fdb3a23cdc2fc35 GIT binary patch literal 39583 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 literal 0 HcmV?d00001 diff --git a/dependencies/rpm-specs/gateway-rockspecs-native/source_rocks/lyaml-6.2.3-1.src.rock b/dependencies/rpm-specs/gateway-rockspecs-native/source_rocks/lyaml-6.2.3-1.src.rock new file mode 100644 index 0000000000000000000000000000000000000000..e709be218df9525de1dff4cddba192de4cbeb142 GIT binary patch literal 69320 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

&U_$Ef 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 z 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 VXS|;^1pxv9ss!8z4*x^5{|6!Yal`-s literal 0 HcmV?d00001 diff --git a/dependencies/rpm-specs/gateway-rockspecs/source_rocks/argparse-0.6.0-1.src.rock b/dependencies/rpm-specs/gateway-rockspecs/source_rocks/argparse-0.6.0-1.src.rock new file mode 100644 index 0000000000000000000000000000000000000000..14d681b9e50abe1e05ac899294ba6be652d08b4c GIT binary patch literal 2502603 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�!;wk)3lpTbZZ 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 Qm-m?f!XY*uh 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�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 z%0D&udrc@rd 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 n^_&a@?X{c1RMfU{r?0%5a_ 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 z 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Π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 z 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

4GOLV3Qb-n__EhK`cQ5I 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%0AUMpC!LBk2 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 (mZ)YC3dPP-T-lT_b-Kq�yCgTXC^N-zLn@h&oe-XNCbIC-~WYr}gLiKm9 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]De3uTnrGIA|Ad-z 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⪼{0>7^PI2pdYxKg+HdIc}+R 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�%i(8A+BWBpMeq^LXZZ{!;!=NJ=&!EpEp%MffsL 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

4FKzO`|Qu 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

Mq55Ah(PG)$$8o5hiDu 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 !Pa>3EgcJvVtq{mpS2A> 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⪚lZT4J- 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ਗ~EyRx{KddnuX5P7AkmDDgR7b`5`s#$H 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

~usQW)d&{!m7+=-s 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

l7=9o?u>}7pJ7Cco`vhT5R^ur8lxO;mHVLv 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 AZ+u$jFP#p#0!m|N8{rGVj^?4J%kbNY5 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 literal 0 HcmV?d00001 diff --git a/dependencies/rpm-specs/gateway-rockspecs/source_rocks/date-2.2-2.src.rock b/dependencies/rpm-specs/gateway-rockspecs/source_rocks/date-2.2-2.src.rock new file mode 100644 index 0000000000000000000000000000000000000000..26711b76c251a97e3a1c4be39c725999f20dfd9d GIT binary patch literal 34861 zcmb5UW2`7ayDYqH+uX~xZQHhO+uF;vZQHhO+g|J2@5w#+a(~>Ddz0zzXC|r2q^G8O zYSQvjz#u39000mG;%2T&HhTRI8-M@+ufPBR$N)G1#so*2|C*znk(HCZiIIvj zBmnSgNT$Jmnu|L$03gWoKg55L6f4QtAu}L!-_~Nh%LlA+7AqnOCLyOv68s&ju27BT z8P~kuNZ}(QO8T8y+bOc(*Jk(NdHgz=&eS+8qTdVIiiCwzm4|OW_goc84Wc&g<@Cpq zwnz!?#Z-E@A2giTJYJB2R(wQvV>dHPPb5L1WmrMJri7ppGvswE;&RR&AP;&eKc|H< z%ppa55g9hiAlL3!OzcfmS|_L)&!*Gp!~NBWKqbwGr3~cbUBKP*f>S5_^@X)Up#ZmG zlSeC!B|tToCQ&c%BKW*2v4hM{s^P2^KcoaDoV1Y@rK6r3Ghr0(a$S zw$hsJ-UL-$6q6e^0Mq_*o)g`9zE6znRz;wufz2Ycu%iY^BAQXzWcnEolCc;ZAwWC9 zMy4s6E(9ob`WmzVXyRx2Oxvn zOLIEAUzY1?4*f9R$ce4{>&u#GTP^*wAk>%6Gb0buVTYWC%Jzm4H&IeY9SNcfil8dzKfF0hPJwv0*8N@Eg z`OOS=q&lDNZ0v`-`>plFZi>0LwvfKRPdM~|@6vlmSYCO4Oe0t`pEIGX0V7DyKRAdm zAhBFBNpn|nE-9B=Lz+Bls@kplG7umJf%ic^c z#37pTwO8ArMJjc6)g@7U8A|TUH#&PwryO}4Z;3R!HS>UB^whd}LRv03*D^N;_b{t9gQ|eTQE2TxC+`5K7XalO3CJhS#xlm@G z;UYoryuo`-a!3h&s*=g2$Wan2T}VL<8FS4tl~3sC2iv>)> z%ifWscoWl?I)iD7W+I#v$oJ|_Bq!fV5204Dn`tEj9w-)081=}N5vk%YAuEW$4p5=V zQ@JO_Bky55)Q;d!hCNG5hm%88VRvZ* zX_W0G?zmfv#lXni#K_9=f3#4W zzrC_U^e`i@+#<;g+D_Qm$iSQqfdSy*3qvx6Cs~w!LlWU`qopNcA!A6NjefZ_uRgRb zo4uv6g`E}h&x7(#fRh@-8U2*m+O{->aG2^q(1l`kZqCbe8SV=z0L~^Im(lGA;7}6p zhHM45?VdhM@Xy}7@h>u97*QWq15Ofn*+mvHMOj=~WyvAvR|tol{AiH(Q3?M5{69Mi)PGOef0mp72V1ETW|T^V1^^Ib0suh& z-#GrWjOqP{?LQCUe{z^Ivk}3T0PIa4x;)jPLXA3ebjzXP$)_5 z^(l#>*dnAeIJewxrpd4r6bXeGuW)MYKW=!v>Dk%oI-bZ?S+H%g)cR2QZzi`P1*`d= zGtZT3HQ}oHtwUtch{HL*Aoq>_R9HQMHhVX01%>^dx3z|JcV1(Fd&7_}N#ffa2EoxH zjD2y)B1F+%2^FjFpT58!2+kwc`XfUPWFHW=Pmo60R%x=xlvvAa@{3_utJGSHVymDU zr3D{C&=(-~QbuO)9IZVezoCti-z_6DG0l6c`JsBNO1>0%yJ4ei_c~wVHN11nVe3Fy^88J^*ManCH+h(tP_?cwRz~Or zA7Hl3r5T%+!#tJywk*VME*;mZTP_`1gt@Edcr6Dti`!7|VVv8A|GB7ggfYYnu~KWY{&JdV^qac_VRiGWvWrz;i6?u4%zKKS+kP5TrNr@Dwbgc%IK-QK zp{?e8WxmA^B#jT*D6knsXd~du8DI)|%*drETMAHa2Yr7~jagL@Nu35TH#2M!cNn+t z@&3WT#~yTHZZSG2^r`2P$Ah7LLYhwE8epe(AK_}eG@ajY5f$s2T)ZP*KLiLC!U4db zK%5#wo%aABw2DZt3wbhXiyfJ&UZ=o)o5+s2^Ksijkwo~svehm4;(D9M;K6%UOTnCA zL)}3#I3>>qNVOkL2a3qKqCW^QngRIuSp372>uqdQg*Rnz_R%H9eE<6}j=mwD7xK&e zZ~Rwq?vM9Q?sSjg6tsujT^u4quGuRiYeSzT7zK)HV-i841Y)A1L<-cTgGU4J>L=Lj z{vvTh-=0e7B9@sp8@n>&-;GZFPA63cZ^Sh?5a0d*jc%VtoL;D`5lZ_-paJ*BrMmhf z=k(+#G_iOr%JEr)ANI^=Y zP)cA^%^HTv`KI;EVIFR7>66Ft!^6G%`}@KsdEOa=Q6iblJRaqudb7W^^?4gKZ@Du~|QUy86 zij-&-x!*b2Ehz2Wv0DHmbwsA7qXOJTz4zk#4)KCMU|gcs52xmSc(E{rtDR#1diZW4?D~NS$VP#X@b& z31Iir5cNCNS-9b%zbu0RV_pyWPKyCK_Vy^LEG_k`7RU*ZH$JGN^?=ooipf<0;M!>M zUAvw?ycQrU@qMah0e8Ft!ZhB(fB)?0iC`F`oF1gs%LywmNt_<+^8a9u9NS*{?U@Nt zV@w%V3G|}W#dpepFYzLXVga@BM!G%l)<3qr?oaZso+A}5cExh6-32c(dbgWT`&2$N9Bjvd3!1-oG-gRdzFG zzAN}0+Se6_br*sWj_Z?3uLww}N1kYIjGzp8NGU?;U=ba!k+4nadXsNOd+Z9wWoM(O zV2}h~u@}T9Uv8cOS*=i}cmyOxGGr%-j}TuVfc!WK26$A;Q2g7cUkb7`CXyZ;dEXTK ze6+KJm4j5Ytt03k<6`o|n;}IaZrWSHtaFT};Y17$-5!+OoQL-VGK{I2q?Fj-MSmpgIJB&T}bh1{|QpIqE7y*EyYD6^JXlJ>;-GHE8Yc zRcE*&g5$%ik93XGOON=S)F$o~)WjTF{0No>)#;FzD;ttU`jvoFr6Ny|Qmh75MVzuE zg~}^H*gFWARg% z$Km#>50DZ=^TzJ8j7hR z<+$&8<#I=n%F}=(h&F&AQHp1Vd9({*PIzNjyis@+hDFYe4umz)jbTf0#|9v)_5&R# zYrGS~p75L5BTaHe#Qj;}U?R9aABvSKwtIP&?zHqDQdd$SD?l>&SFtQHt9C%hf=Zw~ zMBO&JqblLgl-<38YC9B0$)ZWjz%#4u+$rAWk@zb6VwE8{C*e!w%@w7`Gl3n~_O;Dw z_cdM_LNUHI;lwTIfPU2W7>y6+9@u@#dF!A<@td2-J>PTZrtd0EBw4;sd7<2?Zxa{Z zA|llyl?X4o2ra6?aNNR|bLw1Xgi3K&9r^8d5m&A=etzd9NFk1}kc50rq!4?q#J_b)o{3 zY$<4M1#l+oX4#FIqgW>D@;)_(X7F~4AyeL1hAc;=hD^g@sZ#Lc2R(l}7*6lSoj_1E zX{t_#4}k$?TF{mSft}+7$!!9<%0mOBnvx+0?Nhytl|5?2b~2c&Ma?5DY(>MR$~*^C zN+Ih7Cw>UDoh#v-1{1!+p10wCK^^#^!w1qQh#;-*0KtGK`Ke~^Bflj-`8AB)T?abo z(?WjpV-!O^r7}sp>SL9npWN+)=0&r7c};-sOke5213Onfrz!_$2e+LdrAP=v(n+e5 zD+|P=J0i-Us2J(OMw`7g87=koL#2L97+Ff(yklrdqoZrhVU1{3OEn$-?XXjLXm~2i z+i%|Qnh~q8?*>S3*N33n_FuahmUbE>{BEcUuzcoPXYoO-3WVifR+Tfh2_q#bq0bUv zsX`-XtFKPU4{9pKB7rQ_V&RrZ+7tl+77hxjcV7+gdR=x2Ez8O&sS5tRmn~=Htct#f750P%R{_x_*Bs&Cd3USwU^aO=U2FHS^j1E>0`3 zGDb4gwr>fPiH`UFg8pCR1YN zZJb{xv_A+%Lc&$ss<-(<#vlJ}(7H7p>XgaGU(cTx$FIpwbn6^y@0Xiz_*y+3Mx)-% z@7;cr)=%%RtnbIs`(-QBbRO2&D}om!IvDHTO`rRbHKRMG6Nv`yYgaovyXnmUOwq=h zx6>Qkfkp)Xt}VHym6FW15p%oS=(-)6F9P0Lf1~WItnd^0ck3A&HxTk!H12v0eY&@H zhC{%(t3S~&C&2;(K}R^27{U*0PHNUzqF2r6MQ+=jhe9hI`wCMZLaruaGg;4G-HEPY z!&!|umHizYXhjyezd4?4rz6Gub$q%s9)CWK9h-6f`qfRr(LDR&%JZxw!=xMSz*wlbUNa)*c ztr(Dp9%o+&q4?{3wR(-0Fz!=72I*ovi$vsRIt(>lW{C(RR*X)9e9<#8o9(ImY>0>L z4EHvth5dh*oDS`H-nzXl>aachyyq@)@iC@oQ;zcx!BzG z_oi}9-G~jzxvOEr|m?|bhI*2kxxu^ zR{Pu_eStdy1kp>8L*|9Tqxm-iptalftPwlPXF-_+_vgBpW;^ima^YS1OXEy3rVJ{c z4}f?ozNmFK0zBED3)uVj=|%b0?={dTMWt&M0l>2(g|Am#kv!ZQ1me%4ud2Q3m5 z9Z@|RJq)91mq|Y1a(M@nIkv)naT)WHAiu7rAa#0V%li$|{e$0TX{+s z_|_Z-_||H^`KY|`LQ9ZoqZNjQjv{VN0V<--@;are*)|vLVEuo3hDV%kg{qo+UH$oQ zf#V?Vd`@;wnKt1C)up?p061FV;bdds;7~dzx%zMCXv5nl7y6D7m557*?An4C=wonX ziPq4Y4{w$$>lp%n8Qwtz(y`a`E==(t&sDBm47S5$dk#_y8^_J9<@CRUl}JPA?Qe_d zSpI8--m+n^JnIN)UK&PR_bA(y<>e1x;6wtZwZ(T^%iXMe zBeEaGOQZBh7yTZ+Ybgr94oBY`(Weg}e+mqAWH^hP^Wl6}B;Ci669@myk*o6rsR83^wU(l3*;N!; zma^lT!Q>Zh+R&t#h)ro`=jPcRQxCa%B4k`&WCH1vMk<}?R8+c*YK`erhb5w=C-hQU z;s@)3fCwTuaa>T5nZ*?-Q_2*_r`M2~!BIc+B4ezYel^XM^eLU#Ap%OlwW3J`{N6|L zGR*487}>ByQWh}d+M>u7K{Ww7t2iK}JLn61RQ8w_X&v=doIghlyUPTiW{EBVJroz@ z4WLbkgQdOzt%x*VGYMs4H{|*hJXzU<#4bw&{<^qe_j8^fav8P*xs%Kb?@7Tg0SQ`D zsD?vxX76`skYV(Y-VsV)01Rbs42F)XvS3O7t*%rK=9E;S8HKs|o zy68T213GV&Nt&GgZw02lA=Jyu>pCNlE9gnUP50OP@?(@FMbeLKum6dLCN^{v&v=@(;FQN%AM>qqx>qQ!FJ?V#SV2BT%30Wf%rFBW!DYxZKma3o zQBr@|2o|^3xPxrG<}CnUYmvat7D1V1PFT16%{A-WaSNHrcI+jpc_^n2jyb-5aH|@WmBt;$=mObh7%gYXUcWQ;j&T7FRtMUXL2g zB)vP6zrtLzbiZjVKjiX1$Mu#PC}K2xSs3w%w4jI2$`Ojw*5hw47j@+Kg8T*)8833@9JaCkSpyI zA>G6+45n%Y)ZPTmLrIqemrORnA1N^wDI zGG_NM$Qa70EP5&xGYF7goR5_4lc~K&{)h5l=RpUJQET2Yz}4 zD92)s3x#vpi@|aK%PN?NQ~;0+;D{^(kw6T4KLCfaVbUdtgJOSkAt(R|wV=Mt#U!do zZ$#(3TmId#(K#;*+G5ouW0?oK2~@ByQ3$~m^Z-!b%vI$Kp%_ttH;NLhg^P5NbWlOm zfLq^3`4&S!P!NkX6Zu^V$xM)IOfauz^880yrHr+_^g+OiNqda|RX<1k@0<4K#Q!umn>V zz0OPuOqFkLmM?Syg&3#A#pTAtFWVm|e@ZsO9FgNz95IK$N5%rtD0QbZJpol=(&|cHXMqUW~RZ1)C(oHX)ld zoJcO9%%xGAtEV%vJ~-gjaV3oI+hS*{dbsaG{%9nZP8}XC;LncOJ*9~43e=_+SDsV8 zw@~&KRuQWOO5M$N*|)51_!4vg&&FL+^@^B!8WDAfaFImqFu78f3MN1WG~ixHDe5GK z&Px&~W87;!Q9Ke=D2!aOkvL-`@E9kXE}k#VH<UJNtE5geh%2QJh19FWoBw9A(jCO^qZD z4?{M1#=7frNjO=!Tb!HwgS;EeHeH-+Nsv)QgaI&Jj2%wSLqP@O9{kbv&hLeUippiq z{#gjMRqQ#b(2uZ?bvqe8Y95w2On8OYl*o(@Y%QJwfD^+>ug2Z%Mk;=C+Nn_FGu$CV z(}Hd8ge$2eY0cy6);v+2Yu|culj0RUeKKE;6W2^84PQ$mhK^3uvoazQD~*RlDk`3y zIlM-XnXM9CuY=vxp-^@86oczAwpk2JriyBMoI(^Ly_zX&01f$D8ngeK%oaDmz)`?g zAc|;M--2G~1>0>kLf%{AYUaQx@Co`GewQz3_I>@)!J}n8h`|yqe-E>Mm>0n_#IJf6 zdIZNY7s-O+6dsU^Uj^Ogl2dJpm?wzKUEm>y$mNlCSI1ZPp^;YCMod(*D1o#dd-sc4 zz^8#WPE0~{LuNO4T_9#$6!#En#V?Rj!t0^Y3TS+@ENx8Fs8+|N6-SH=DAUYvPp=^| z`}0gGe%0Ba)x#?omn?*PJXq3(X&4u}2-;690;TCuw31WbL>vus@FoawJ#X-L?96z7r2PCi0<5Kgx-^hpXTlao2%!@0u+$8hURou1G9j!!0)R$moskqCC zFN%P2b&J)VDtbb80LendVQ-Q$w}z)8>qrbU{l|=h5jEJQQoUR-iEjn!LqmKgtQLR& zOp$YSP@i9uFa5R>9L=~xeQo|?tF6RQwYRT=6~3Skmj#DNuQYb>ux$({c@q*826l4$ zNqYH2Xi9FF_KYyw!@|oK>mHXAcoVWQy(_YG7&hMX3#02ra44L&#&T=d>>_%hSrZ240yw5Sxa8jVWDf&#An%co^tc zsF-qI;0#{*t6$_sH7czLa?!gq0W z7WB0Z9wu>aX_7s?@aS+tTD$iJ=$6S7C%8&#KQ~F9{z@Jui1zU?-tdQEWIyu-z3=HA zNw?CG0)l*gLjbwRAVKsgAzS8?;)4S*Al@CKK}{i(Gmg_`#yCnu*e2fA~r zXbrKZZD$XJ-a~$+s}G6ree$QkLG?F*LkzxfH#FjJx$nO(Ay(`Odz2}yh)XqVCFZ&T z0XSZ`0`)$qI0w{*pPtLgpM_1 z^nS^LSoF8p5^qSILIL26W9xA}k*n968_uRlB!ot{^?c&5SCkj*hInLJ_D0#8o0TdF zM6%IR*9)?D4w2fygTD=BPa5T!oW6l=ykdH-@tUSjIxs5hcWmZqUUWbg;l$o84bR6z$Sy>$gX)tTcg@8A>Xa+-#Fn|o3tAQP>HmYk^f2m3b=gNt7jVL<<@}P=+2XP>r z99{NMtxJYL>x{xENpgZ(1Z>}GOu7}FH9f$BOdljI(1m^H=_!M({pBS`@(9l2Z%BA` zfE6Z|?C}wbLExqfk%K?(n+uA$`eR;^&BwM;VTG1nrA;`MbFe3MZGm^o3A@=P*JxtzR4JQQ;lAeMj^2)%7a>8f>B6=RO? z<&{;UZsO%tXlBF&Rhq-`A(N3Nxq7mN9=yU>6`RntzB=n86oEW5^;#`JJ`7J;8G7)# zgfb;*o-WZ({V1@*GPS&Q~)M24Y!8!Nc{Q*^E+>EjofhGoBj&DYKtXwtt1QsV$bXPv9USmxun2 zZV1Lb_fg7fi?)@$kxgl9+%675=5H*KS(7SVxiG_f`}uE*rhc_C&YRKZiC|BJZvc4g zw*!{sv1mwT2WB_we(qCiHmS5+ku^y&a6D_ug^}fE^d%THkpxIy+DPfsxD?YE)v$m$}N-_@Wjip(P}NiUi}C zc$WuAR8|h!a)UQPZy=dA1ARSE2YA0en`r=rT!l`cxRW^H7~<_>^%=T2+w~7cJr41Z zyDx3}>NLTVhp_p|4MURAbT(z1{{XH#dMED9fAWa zXN?YoB!thl$QLP812z)e!W)i?HUjV|hP;RPU*O=4WrWCpn*hd97#ynqiKF%7rTmrH z4je#J!nB%WSOLTno02jlAc$=Hmq9>U*w#Z}e9PF{kT#)*H1Hr?($Hp6func}{qM=4 zh!eY)WDvcq(j-zAF-swA&GSb@)()651!4s5&kxEh&bpk$QK}k=4?2oP1Sjpie|Ts z3QjVDARe5cEOzO`KnxUNP9S-|z`sb~ai#I}>?DXA84DtAmw@3dhY?r~N4u$o(l;{H zvp-&6O~R<+b0UB(JI15F51hfvRuc-Te}JU&4Qepa{0;;^UphS^^{R;Eo;KqaMQW!r z)bTRqV6n(+ZH2PdY3{_)ZH{@4^z>`Ca{HM_a-dHLS^A|@`;|iS(Rf2OZM9C<0!QX? z9+ItjKgFF1F{Rn~xVvxgnaX{Zx?e@$!zqI2hGp+4l=>~za}Ey5{<8D=RpIYI@A09) zDPd{g^khia{f-EHKko`|{b=Hr4`9`e%{!v?wIQVZVKb{U ze5uX>e1ZK!jFWjm^K!Wy)^2dwR?S5v1f!Ld#(i2WBn)KD(L~eXZl3y)H}u%Ms*$_- zng6>iQ_gbrG!Zr%(jvacv&kD0P-*G4Ru9M74QumRRbtaiw`qGca0%kXD10#N{lPrE zTRVcQ9f|vLfK{W*9rmkpuuP(>v%ie0+Z|Mi)pnZ`CqX@OF&UNX+v7iRL3nF}#d5a6 zqcz~J+=^ps{oYk_Ji^gaHR#b+Z-P4$v!uJc&%LqM0Cy^Cx%;o&`A<3DVg-PL+w(^u z|FGutEe2B3Q!wIQK!@ojeyt^ap5=l~y=-laAfbaIn$tQ#vd|OjfQ|Jbcz^rX?slUW zyEW$d_J_)T=~7toPddCp?T}YoCMTK?P5_Jj%0yNaY9+-l5O_RiCu3RAiqCd zMA4r~U7_{q2SAwnuRB1DDS0@LP$yDWjHZZWF;?V>(hAdRF1$m_OI(C->E<2vp2G@M z2^SNU{%ES?eWW>E&IW^Km`)RCWgDsuWODQM@eI~#rb!O$Cl!)h-^Hek6s00dzuU)i zaRPSEB>Hj&F?+E5g|oE*A3OpJ5`2qqTa2bPD1ug5EE>mvP8m*EfI-x0^Lb62c!Y}i z_L$;9VE&E20=#cl)>dPGl2c_U)TUP3Bb{#gu4#*2m~7B_jQCXEMzB$92FE4|aC`DU zC|8cL*RAS6>I!;1VAp|DjhLOhuO}0A!_-la<}>2mE^F6@mcSLSZmO-rWnc#DECvdu zTB@##gK}n)*hTLb@(Iv5I7x47b`yP5Ck+3h9bxUug;O*l5EUHNXw|Q-M-jbWpkB!3 z*YeHjU0zhUcwo{H*=QjnQjFCQTAk zO#+jX*$s>+X|=@%w3tjbX|`ah^%cR6$d*eMXelf<$RuE5d{y+koJ!HlKs7#>_l|7_ zt0iRERmdlO@m~Hs+*{`OQWn0f?H|fKM5^JzaG~(xqC(;Zhsjz36xo@JCtyBtC~v){ zrdEqpaXQ3VIn?udwR^Bm_(m*u@u<4jK6e|mNH^nkt^q1trSy@n7v_6e?%`Fia*0(r z7n`=$ST^bz+I&77oNT6r4Yb;Ysi_TKUcNj(Klfygy{-wfrcFu~lU_XTpRf+7S?hCo z!tPv&{(#p?JQ9J>$HDyQi;pJ;VmCR?tgjb7CJ*Xotv6p}wvsnj+xTP9E2u?c z=RhjW=E zo-xho2DqhN)gmfkOQT*sMBfu3Jx55A%j(hFTGODoS;vz z_oNev3DZxG9Lppw`di8^gYh9mE;@L)&Nuuln({rG|7<5RLqr9q(1#4?xGjSG;D|*NcKOOu%__8GeNW-7!XubBQMB;U#_gHZ$H0(_7NQ4= zi0CGDQPco7+2NRFzKI*BPiAD0T%@_tyUd!D*)De9E0I&!FCe84TwFWjNV`SgV}6*^ zqG-teE4>(~e#>m{+L8Rc}5Hf!F!`}6Jiu8qOHXRSPTys~Y*=Hpx zJ3x1Dse3hQn*54ewd2(>8rqUNpCZWvFbVCxJ0;7u5wbn4N{&ODTL>T+8lr07$&F!$ z_Us&5%3XDPh9`3ZeFU;F5HR;f-!KrlZL50Y_CgSj>F7c%RQ$TnM~@fXcG#XFLwkOf z|9Y4L{+%h|)l%0pA1R1lB&E=^lky+fd+uT9cqy%=k-l;vmPU~`nT;e$Z={*rEdtnr z>NCZ3fS&zLcbk;viv^W@KmM7`6TRSLOYwJ42H5chEl9^qc0$JPm@zD9$-{K8pQD2$ zK+lzVkDH=fo5_H=tlMS6D|Br^;D=WN*=Z8D&36f5XNs^=1O^iKf=&tE9l25ay@anB zohph|K%tg07#9bLb~34M={-{^grBohb7jVC18_E!Yui*f0-W*P<5WSWSxT5>N=hKA zxNMgZMz$rYkL3=%{Vx&=v-e=9g}Cji#-!$=J2-p7T4HiH6I%hQr^$>6K<|_lbT-+3b*K ziV31<_VD7a^|04k^Up8XV*6LfogrPoj{z!FLL?Lxp)(LuDvA`yS--HG!aVLooW?Y5 zryy-B@b(q3_7^zEYgk7vuCZ->?Uuxok#vbQ0wBfHyCsux%1li&Aqr;+48DnPii{Dvn_NEa;Fe{~+#slOtl8)E;yPeGF%lfO4gwUEwi`iqZVo=vZn@GOT!TKC`1^RJ;#0Xo{)y7D?j$(-fu714p2Y z1BLD(yQ4_$pp>3_+c`HIr*oj5!%)90`L^oREI|fpOQXv^KZRy38uOiE-`TAN>8C~T zoIfjDySfebt=qL7srEUeX4Pt~Q!7R|b!|*T=8f~&?)6!a(Qhm+ZA-!6btA5Kql$x` zI1WdG__1CAfjS`|p&AOiH%&ypua!Uvrzc^Bj9HTmU|z`dU1^br(M8@uV8xlT?wo<9 zW$F@U=@=%NN)E@Ay^es#01* zE?f1dn;XEoABgN3&1d*5BUC@((9Kn}& zs3$o!6Kpz$AIV3ZT$f_M&IDw5qM&VimrQP|_YuRr$ z7FG`JOLJEtrBnmx8~f@|c4mGaFg!F#AM4^Wvi8*><(wg6VBGDc#Y2VXF;ec56pjfA z?a}iB{WZ%!Xii5xbd}u%_}(QgchhCh=wOEY0vZ_kb2=(SMK3>#!O=mL<%1PrgLoH3 zGhSp94^E>Ez|4%pny(Vc@a~ch@&HCtGa;M}#*5Q}G@jCm8eC^$suC*?M?n(Fp_II8 zQXuxNq?;NEmz^MDn&CNIDBAt+G-Af9w2czo<>o%^(fDx-L!tT&syV0Z!SWeb#dSR+ z^p5EMtHb`u|8L$;77b>X-HR)DM zV5v2*!G}uzLsh=V4pdr`zg5G3!zFj3U8KwJkAs_1{K} zOh1q6yHDe;0LSAj@kQVL?e=|?XvHB))biA;15XZq zgY6X0(d+T2mlj^jiRA5j`8wkkL)%_+zSD7&38JG|ISi1_#y_2hk6}U!T%#8hPjELx zo};qa7QU_EzN1tPF#X732rPq@Isb0=YB4)3&pmzgJk1AE=AL1xWy>qKH6DBm*0PNp(rshYd#XscmJkfYA=)2(~H2fi)eCz8&3wgI}-C? zUGm?6wo$3TV+yK_%p>!}Jnt1N3_tZm3gV>ZXddEuR4c@*3YKGO!f9%OIW9;U#-KEb z9Ya+~bCFSxj}{*(&Po1d&HBE&u}kR~v=|n%63eHR|K^P@kP8PnVo4(ypusQWuOw;^ ziJ))GD~hm}^QUhsYl;xEZk-7g2*wQ&aHQ4>s0$uwimKsihb68A(ta4`-rD4I)vGJ} z62Fev0;~$N&a`hf9?;K_+KwEo=%|N<+xQP$ke|hAJFc&SHk{0h&9TE&UGAQ}&&+;W zey`92n^ZGikXssr0o#U%p7~!{k%rlf_wG-?Erk4D0ZRH+R$Hud=5H#2Uv+G8`Cc&+ z$I)y#sLMXYrL5dI<{J9J94!OTYCkAtOnYSktGqA})XjPn`G8LLGIAih@8vC61Ayy` z+t9U_s!OjcGvDmA5Taq4G-Y8*1Ts0BA|3ZNKA6MEuY~J+1E3Jcp z)-I!UMP20Et;_sSvc^E+Q3;5e=%+yXZnxt6lPSs8%^|rUrXq#6T<7sY*L|;m^ec1j zC|9%*g!^3h=i4Q{Xb|Z%9kOP9N+3~PG*SM;FIrh{q6iCjdY<*Bk%UO~>C7#)6QsKK z%(|bL)B>%(Y z?B%>#Q09_6{l^0wW^e~Nh~7R!YQNGe3o0vh92)Ol*@*}%5Au_)#3dR=J9z?tP3mB0 zA)V|5Xfx{&hxm9>ap?Tws*{RQN4ms_t!PiHw~bTMtDSc9CH=*vYn*FLKs=E(tI*g` zhZK39zVykE^1MG2^iPp5VqXuO%;Xa>R3>~0=sBv4;_a%_w>oLe2b={(eo$;`#j`%P<<=JY9%-W zAmH!g`UUZYojs1?m(Y3y(TS2NB3pDg2R#=`oz0|00o6mH@o}o63dCe(?;G?QNjGd) z9R*MH1MUh1^(fe7I~(Cyy-B6Ic73&k#RnjR zndhYEJqilRI9qM6O~SEd2gEuNcemJaZ8ebEj^iJG$V;YGNesnmTQ?3+kjXtLS8N1M8K3hyJ zgx>xdWxMN#t-B`+cQ>hCdDrZ$ESXs;yx90>W&?CN z4Yfbo44%PqlL%Lv!SKc%eD$KorL$wwSM;Rf35n%VOmQ@JAM0EPyK;dkt5=*cBJrsj6+ zXRHFHn4kA!hUoa%0;sa$rSlS}54$DFJa>B1OX@VrkjH?`EbIguFP@pxBh~U#OYmBW z_@m1UCISn8NlMkn!{t0>O$Upn#|@vA2dBK;TbFV%G370KBlyGhfh{X++J#u(3}tPq zlpm^RqFEIhFQVms$zp3p$-Fa>$ldszE8a@L++jMhE7iM8AtCRaWqcqvFU5z9c2iyl z!#uXRqvDp2_Levz%CADb<7=)3K8Z>7K|>NGBf6wXQhE&8@$S%Z6s8vS zErMl_L2lW06_4OAn7sGxDB;(0KeiX;i4~L_H=In<{!+%Dp9%-Zz)3Ue5xrl}0deG_ z%K%lQOb}O~yb!MM{Ph5Gn!%Qs4T*S=fe)&yb%*71T*b)^ZCOjg2%1In z^^+KJ^J8JwVPCG{PrmK0lyhjcOPlde2dj&$e9-dG`jXj=rrR!iW*6u*BLu)gCbp7( zm-+Y1LAjhm0yE2I0F?s~il=noN|q%I&R|dQ8Z%Z7l^_ZpOW3EU zCHV$m0l+s*Rv$%FQ}fG8H8Lbkk|BzS4!Zbp zklJ1P))N)WZ3Cgac=J%15>epI2usvCI<#30Gd<)xT_pea^}y)zXm%|Y7HyeBaK}lXn-x6=93%F z9+0ML#-5)AS~vgXg6}*$lAcpa)mD+G>6F%l!UcoKQ^B-N2in{b4oE_ri$mZbG$2g>1HEDpG0Ng9Af+={r@U^ z2k1(+wQW1L(Xnl(W81cEqoa;(+qP{d9ouHdb|-)KdCxwl_xay%f9J~>E2}a_*0r8l zHRr6FRrhm03=_GAaFI41^v8V;E;Ld69U*LR{P>Z=A#^Qu3J{@cVxfXj0|cJVYAB4# z`EuV>?PA61Q*dGeRV#)Psik`R^g|3z)DeM0&9@!rXaeblA!&UJseFaIc&Xdeg7R~q z*R8WDcMyBreTLDdJfu@NdQmg=n%B;I3K@2q)~2~kblpa8k6`5a0P+n=|F}02B-OJODxOO<|mfnJY0Y2AW}_*ii&)lHV8EQDq$5A%L{66 z>3v1O#oKI5W(FMR=HJtN7S%9`63$jcu$L#o(2v$B@iWyV3@a&|DO zQ%EgT8#q+^?ZCITyqLD9eNzVk~H6RxoHFNdp=aSL=h+{xNIcXUzsWm&o) zCUiyt49S_dLkpqcft0Aq8=@A;Ya*#Y9i1ciM_`Hy16{ZrD+T19KD{f3>0{rN9@jbO zonQzmM4_4eLpt~f0x!)$1b0S4`YByo?ZZK{@Er}9U%=maZm)uqOAza zH8DsQD4jN+$2Z5`%2@!!m7>nCR1QQk1+gdJ-o!LxN7+j%q15bVJFrLXd zu04hJ@0$oUZCcp>fI{| zXGHQTPFmRGMThb#w^PvwzLV;7ML<0s>s9(OZy4-{w80KeK7bfNig&4%TLu>M>i!1J z^^u~}&7_v3sV5}1(zfcVIoFXJPm}%RaFdxq=E@-k4rZmsp3yuuG*q>PAgf|@!NdOX z+j?zmcl6K1LQz?4IA}|*p#>b81F^9kXPnm}iTNE`78Ra>jlSc?tIXk%2 zI?L3!F4oJ`n-ck3NxJ=9wDpf`7I=^cge-Gb5M! z;P5vcr{GTg z)=bOhzMo0AT%g)>%aJ~-VE=i)+1_za!C^il>o_38F?C}N`voR6D2gH?b@^~)L|3|F z!7WmuRF6Bmy*&7Km8Fa9Ig)XT4C`<*KE8wbQ z@bFP~iu5_QbM6`W?aw?TmBUGsV3`5D32D?h&7xx@>(qH4q`)aQ>MWnj05dFD<vqg}+6%{HyPVh^13gr2%Dnfn?f32j@dW3z42&3^# z(?mBFy-(ZI0HO+@cRZF*t&vdGBCo_6FErRA)zGHKNnLD5X6l&I^z&|n=F-Kqro_qUBJ1|)CRSk&{SjD*^uRY5_H+Z!x@7*9o*mj7 z_WoHd8j-FrTzj#>n1~4}h9*(APO|ee z!@EC?jccwyYV6{1Ryl$Td9axRyh7Ci&2oB8x6+^5s^aNMVQ@b?vhQyf{t6~OSEw}DT05kwkm z!w4pGR{J=KP16vC=?7mo7MV~pyii=$kc?WaYpvN8-C&w&epOi%qF?SZp=Ln{SE)>F z+2_R`p{U~uPODXtIo2UJ^R1R)@|zSB z(9B(^$RsZ`=NDK;?C{knqw?q-wFcfA>A>nf?TqRhA##V?&M*ro&B(sPXOso#gVuxh z1o8@<=>_OEcYf7)J!wB)RHP1lepR;SpaXR!ft^hm=!z4UI|JI{PSDS%5)`J(E~>M8 z{ha-{=-R>rxR<;8-_psfq$6DmhgNKAnvo1A99_o{rjkev(n8D$i$a$bi47uLojEdr z#>0gRl9?Nd^u#Kl@Fb-&#LvWmT&{paf$OW))cf1nK7Keh7OkkTG~JVvLEc}y&gDA2 zQ19fMQ?0KLDFOUZ1>MrnFNct*XhqrJ>b_u!= z>A_#wx>ae>Ldi!k#Ja3I$FGJFnqy;lEJG^Cx83AL9T6&1)ZBb8AK!uq6d9aHykfuG z#`=YlzOW>^n!IEn+t-gb`0<9N2D}N157>hWfI*c7)7M2P$I4X~(~pu5;g+wL;TT%7 z+7Zf%!e*Hd5}RLsST5(7K?)0oBeM!f#I6}OVt~N}R+O_(J}VR$RtyzDJi{{~=1y3Z zss|#6qKdc*B&o!Rvg8ikVi$Pz3yP9oyLAb1f-no^d5DDD>JDZiWlo&jR(Nh47-=Yr zu<~tQ4pIU&XaX)j`;@&>9*FB2e(2A8Grm>Cm^$YhT-2!d@cyoFk zaKQ860i5U4nC7q^Ma@By!T9jO{h+Qg#50Ccko#2wgzu7?t0Za^E@;ROOqp}g8k79T z)g6##L?zN^Y5V};V#3VG2E6Ig?~M=5VM>q9agd4+3-e%+YwFpRa$H&di@<|LzJBG- zWI>^HQo!EsEjfmK$5U^$oNGL4AwCWz2oFG?%M&;hZApeNA+9M14u~M9>?wq3zjR_d z?DbN>21rirq+<0i8b>X?uYFmu8DW7u}k?({X#)^4Kh4AhJCQjrMXVx{(NwoNS*nahIuz3)IDw$eo z=?gA7yvcYEiQ+^k>d3t+A20 zldXfHt&NGf>EC7CMn*Eg_0hu!KW5}HA;CydWBVfK{9r5w9_k z{;-r-)aINE%xK4R7iHvwLQpTcLdTXQWr3hZ=QsOBIzfMc_SsXO0-TNVx$?IhdGk!l zz{3Og3VAYi{k$-6#9->IYm?F&1i!1g*jP({|H1U!orooa!ZsVN_hg6n*Cr*RtOap> z`s5XY0RX`L*(3#Fej#aLT5F@fZI05K&6)^;*O96eQBECHdc(nh8AyS!C7CZYIH*A< zq;R8F)JR}*dw3_gLU&iaphOo4#G4THk%P%(Mk?ewi9HcvpNr09xWWD0$y9+8@T2?y z$~*f{11EiX<(cqGC{u;R*@p!M{ck;Gxjl?lYg?9d5obJighF@qszMWtvyB^hXf)r! zNmp{5$rCHNIIzl825A>$6_pyzR`L3I$8NoX(CmfzwE*G?q<|$Ci0+!iG4&0-NTD_p z+v~_lk)HyTYKLpc!*q250*({Sdm-_THRCe9!;9qQ)%&9e7K9?lFY^WM`g~9{NNM1L zUiUNZ5p6C%f^@4V>Ch>S#xhA%L$KM{u64`oshaa(q! zCz%^uiiy*F3IgexB^|bxdMM;AaJa2+kR(snESQ7CJWU1PA`?qRky}IazCD1T@>vDW z<`p3&`YsbxU{Ngz)!IyF12J^giBJhDi#&}Ba^{KR>aa&J!Y2mO1JN-I$f3Le?v%3c zk{dV!+M420LNcuVGz^UdC1v0)7j4+lE{uY`rG@ zU1pog0)>4lkImnwZ!Bu?Rz#!uvFv;oD@eL(husWTMM5Di7JVD*9&{3U8214Mn|$&qb9}+PUD`Ig1jEJsCW;gXbA=W;5P@uvJWi|`G%JAVH zy-Lczy)L|S5;EhKV z33j7Al9?#H&!ukg<98Pc`K>Ig8KTJpz#~8VI{lZmUnqdIuQ*kwQYWy~m$mGpaK*u=46CgG8d7?Z)q{#;{7&X3~rICte z<&vSu`WsHIuY;xoE^=1Q%LY92Den+%%M)j>S{Bo@OplN=3kdtp#l}rS5{rDqm z?!ir^ff;3`wIMR~l%!VLC<-H|)%K<4qp@eq>GfDee#ztNI{GM^o{*eOOnisPG;slX zL{3F|FAF*`n#LdL1Bdx6ed8aAFzW zbOcDIYYRtve4;Ga;L>{W+~(}yo3~B}ai;c9TH6gl6{*G;_ajPfM|@xmCPSmCK?yon4_goEWUY}Y7Uh)pG!q1l!lA_4B2k1 z-ig4S5IWP_Ork+kTfY}Wo0YCvk$Ty2JNDQO3UrQfAFE+z4?^2O_TT0D*1q7ER_yRD zhV~6|N3f;snyKYFoReCGc-g<(UD(IGQn;8aKdKVr-ZX#eArI$%eMP<)jx#g98<0$p z8MIhmmGUx~K-tvHFzG{a*a~WDWph_gqL_&|BW`%G5LXAHtxhi;4cGi-bYD2M2)v)u zZLde6?HT6qF(>_}bNL957fFxH(q6_ye*Ha9A#q}#nL`9qSdyy%3hlBkO_gg(FY<6WFI-3ec5R2 zEw}z1h^B_)XbIef%Q(O~@bqCx;DHXK8dJ^NXcP-V-Ac!1WR439 zpdgW&?_sw_uG{gl-L!Jkvpl7-e7BD2tw60})`YyqQThaE(Qbk>di5A~w&_roMHXlN zQDs@8%qH!dICR^_WrGC?QRnVrc7xJvTpVj24@r=OAk0#pl&;l1*J{SbT~qd(I9_WL z5HexI7tT~>zuL5X3XiT?HD@vHXm^*f!h<$wuYCj6l>#{yNnH~YvDbWFoPm%nuIHMR z0=ktBDg>Z#saAzM5!9J|xD5Gm*ALV`SM3-ixui^#W7ZF02hz`kIP{Dqjyt zv$+9!@tkeE}X^G*74q6raB9ogBZA%5IHkMi*tRnWNC zQkb08kmlxodpJ>HuYi6fU^55?PDL63t|viklyo=QPP^nqiIoT6o z`_eq0<3QJMvlG?ykydjEpXQJ^0K1NSP;V}mYD8ikrd@!Ijmw@(`3xz0B@RF_Ouu?b zLKHeJxCvvbQb4HNI5N8H`v%d}Bhp~kKhhQ`)W>nZKY?9tZLBXk)CMG zRYh*9G{%dCqSzUH`%e1{lV)b9Eld|LdBJZ+`go17hJgg{!_dSlJyf)OT4MFyjeI=D zG8=cKB^{S%)_w}gA+b@OiTK3fPdtZRIt6_{&(kr_IDs9d#_2mRIgT7D z+TrY-DI115Aa>iqh$x0&fAN<(19wg(&1A~!nOz)Cu2eUd=T80jtDzXXXp&6ZeQ zwwYl`kMhNZb!xNOqA)XoTQ$UN``2H&+a^KJL8(%WZ@txkxSnC4gT~T5Bc9QLES9WU zDu;%JjBovBX;v$({Oa@8cdL)hd(d_yGp-)s4V8PUn-n!p`Dh=z>?vpW4Qh#{ss9o6 zO(`eG+GoVTpQoUIJMTI<=)0IZ(z^Yf%5n4whZ%fG?+Nl~mPH zRjxYHpg74pw>(E!TaxDHqZO|vgBcwp-MY_5RA;@!>la z$9(VxH+$8{To@PKXmXTY1>RQzCDhjP;TBwOWo*_R?R1M)M_<`h2_eHGrj7?Y;AzM0 zZL^r&@v@E_sBE`Q!6@>o7L<_iM%%^>B4KWWeS<^PqRFjM47n+0t9I+Sk)sdJjg(7t zb|V@In#JtXYPS6?M5xu_70OgOG&gAZWnnlnaUtp()z*=xzwz3I{Bw44bohU<+QpRd zDib0C0LbzJ06_d5@y8_he>=Soa9Mk-vBquvqLQ=a5vp0td zL~IGq3RCS;HVP2hPPmd27-b`~llF1*l=jgCSMYjb6QBkK8u{{V;rgQkT&hP@zU|Hw zGR%oM5fz;nPO=^dSk!N?#Mk#OJzJ()Ci*)l`Q6qz{7XCanMXGWk(h9EF$nU;1>mpl z`OJ{!%8Oz>lg5iJyzC0%>)m}43AszC4fipxD!3KW_xG2x*ZifN^V?fh+jpIMn3^1i zBs!7!Z%_%LSA;i?*BjGdzMI|WF5K4@o9m*&h}lb~!##(`8=>Fa?%v<_Gbc*4q=9RvYR!eUS9Dw*rY!gy?nt$7yqgUG*~+?{60S5X`h1y=yv0KwX3Ch+ zA^0A73n#+0blO4U+u+$MU$6!XBZ&D(Bq$Jre=XoX$FV$1#4dA%2qdau0x1M3#xG78 zIdDlZ9~S^1y;4Hf(K@Y3r(nt<#!#{!5FBcy71wRkhcmuEz$i$f}h1jEn&_V45 zlHgR*BLnCxirCW%0WWyz)4<7`g)Nrp7H=WGXhBW1n6t}JcKHW}8Gk{47Y)_oa~2lD z#D}awmW^#;1D(0NP_z?5GF!Bewz8qoJ;l9N0=(i{e{Iz@hX0*^Ivb-?5R=|snC#PSeNRdh6(^_i#B>J3Qb!MXX^(8R2R6&&tL-*@)gThND}2F1xU&Q(}) zeu}*CLl)TDDEnq0`;!w3P;D&P-Gi;y^6+y_ji; zwAS0OERLwjnJkbi^1g2KAuagyb%g+xqm{yl2tjaiVN%wopl;H_`|EkQL!fnfCF$&W z_4gs4X@0>T`$aoearMHTl%(gCl<d5g@p->a!oQ8FN3Y$0u@fJadSS1cI)*N>=f-`-= z9*7Vb6hA0^K7SdMK3pPVu)eP$^obBYG7xh$%%ah!aV`Mf1R||d;oQ+-R*e0-bwoaJ z#@Oq=jt14nqFo2M3nPHlaCu*0jiBNCH**nVtA+Lfl!xzFxEzsl5bOajRUTR5}+Hk z2Fwv^zik+&0vINkj-o+=>c1QcSY6|uQaACpG*!hYfx(nHiyIM#y&VrgdSJT~&uJ1|XT%tzHr(a7RcK98K83EKXut8G^GwfK=l5 z#e{-Q=iJ~fxom^*6@VDw-0;dIpkyBSg<%mT3S!J_}FVXvk@&kx0Uv7&nl=Shi7zr;ath?l7MO00|3Gr6nI+eD@UafGHkK1>|Ch%60{5q zOv3jt2BeBz5tiBYjr(>GtI0G4VT-4S#k@mTu~n3za{eV3Q2ctl8qBl)*DmV(#}01M z?4&K%g2BU23@?S_x%!uaEDMHLr*`1-DS&MN7Eaitwz~*gJ&;D+c?Bi{aPS6py~pjG zf^=?WKtxt>HR2!iWKsQGK?Xi;hxV{DuzBET_A#%;r)9XoN1`6qj2 z)Nm*wC8Lh|oU zWV|vmNqOTBOxb35j2%zR-E?Zja@1`*GG>$`uWD+!SU9~Xnd2V^R8}UbW@2&8G!uhd z_#F%*dukb#NczfCD6wN&K>60WP3hzk{Xj|a@J!yt9rg1cjJusz!)Ra_EdJ)H=2_AT z%u+a;P)kwaSK@`OYKG)}|31DdKKgpafB*wP<;lmK$R=>P&`(jRG)q7G0}h?-l7@Y_ z4deJ1g8Mml6b)v-NQ4L22aHwgB9?rr994333TuaV-$+x27os$lo z9hTW=q#~;$QX=}kp$@)6>xV}D)vU+$b1zruyBf9p$F@~fDh!@MIa%?A#vLbEolzC=`dDeEOAS@VlecG*T%au!k%Y5|i~AULSj- z*Ut+xW4a62V}-+z1JU0mnH-zpL|>lfSZw0p0-m1l?(T5j*im?!Wq+-~EN+^=GRxFn zRsEuEEAFQUL6<)&B68vM-O!oJoWJG}XRP`P5{ zVKK=oy=pa=S5AQnI!9Oul6S^BiKZ1Oo#%Bx93|h_4IL2Fg_lTrKq2x&_F;4al)H)( z=guz`;%H+Y&sNc%|D5fjZKPs650hypoUbBpq*6E!Q}Oti-LxA2Ik2oN!{jb&0O<65qore=uavHFSTYGUsLxX{E;9{6&RCRUj@gltgaSw+O^p4iA^vg-vlrWGx6& zSp5nMI|XEz;umdR57JSly_+MBpjyNujXZ$8hHvk71+%^w!D~5IxiEL&O3lC>;IsO9}eBs=uyYmoY- zXFuD9>7O=Ay;}9x)##mmtkJ_zAcm_Z?e=;VSRrdj(!=-*T3^VL1* zl>EoVa*eDSKoTMw*NYn8Fn|*UpBzb{D!qbd7D&~ZsLB8zk8=l*-zCb;>rUyI%;PH? z7}5;Af%N?jzF0y33K5~#8kygx?=8VGgB6tBHo)uqtfJusQI6ZdOwCiN&u3{+Nsw|R zUf8ea3C?tg?y?vfUejZZT`dAnMY0(Km^T!X#$1XO^&FadsM0)#rCJGRey}W?8o!An zwQ0-~4zsCGba^HDEqJV>A8Zp9CYg1_l!iu9k`cd$c8Fv4Lhl~PRwIRFwNWs0550U* zxj&IAF&-&fJ!&D$qIGdr2W|w*e>idq&ze56=mtI^mZ2(s%=1F_;@Eg%ST^LD^DyA{ z*n|~OSr~qfixP?_76}@`Bdl6Ngvqm-Xj9~Q{}fh!hC$%_M$;KOe%+#6$P5`LT>akb5+EC^}+!we2FUs;czq$l!LOv?kBw4K@oqc?&;Lu6SeS=JeZs ze%1rafcP-!LWmg?&_#7o($9fvM_;Lq(O?JoUO{+7dSihJzHr|Z@+cO8ZohveNgGvY zb_ENSIM)5ML5!;0J=wrY4fj$k3nBW-^`aN4I}k{W1h)g=d*2QNHby5D7mT_kNVdW? zyt~GnLzb35W3O*hk7dJm*DREDIsY(CZUrR%q-_FpYzbVlZ^c-zU7K|fWI+P#aSK`iO5+Qv5;g)_VA@jKVmC>_WVq1@w4S+;`BCY!;9S}Lh{@XMiD!yjormN9VwVJ+~F?b8*|Twpa~ua%gY$PQ`gne z6~KU7^*rm-EE=A#*OBHbdJ8j91W0QC88U3Z=Gk^XKSJD(+b*LR4Jgk1fQzguDL2aE z655^X+VcuS#6;^9*6L5owEv;C{vw%*CSUX5n2fMa#w|+t6J}Q%Pmw6eX$Mx9TEdH+!-80YG?{xtgwe-9Ecvg^%vqA zHZ}oC;`=-IMzI>L=NQw*UH=s!DP(&bAp{tcIV{BuVSg~OS9v_)U$3A^{rpbxFc2;B6=6L=cs6T z%e`miaA;0~$jrI*y3R_ca>rA6W>1(vBeL5CNCV%Dl$T0RUToV>(JupD%08IY70T>; zG&E4gvLJ(~iHgE$8Y}x~jn3W=!75^#v>MMXQa0BknY|c3mUnq*;3ZggX-MyW##7{d z>AGLP@=x5iFa!=qsBefMGubDAA1nYnP|!t9y#<AZqEeX%$B)F@==ID5|w>;IF7^9rD z^ip<^W(dGrrfZgp^`+IhOM^IX#-OMu zbbL-*N;BO71C!rTdLWF%(OvsNhuTVAy4xF2b}POtJzNCPqk0INFBp(Qi_ zECPq0yG(Y-T*REyoK|vG$Im#&1~Yo5uF9r}(N`oQ%5+`T#8BSKu1L2ZVIJ=0U0^M) zGrM~z-slwcQ;U$_AxrciYHsxssTgg8rKA5 z46xg?_p-df)v5!hjCV=n91~mZCpSEv`2Ei#xL?@QQ`#@BqP&l)obUy5jyPg6FR%sA zZq2@2D>vNb_RXdC)ur}Z-^8OY-Np~-_VC_D8L&-Xe*~2~ca~r!)pz>bvuQ15{DehC zVwq;aEyvIYJ}SV}ozKk5_^^8r@W$4V#*=zOQhXK&XN7S_XWVof@qqW@r3(OT^hsHj zc7~h!HY8KMyO8gEi_G%60oP5z^3D&E7NEq1h50e!H;%jQEaA)`A>xHY!x&K?Zyr=V zOJ#{=>!*utVN@U^DOD~u+i$8Cr86I%%E9=%#78p1q0N7$I(7VRgcT8Y|yzj0;6}KhDoB{2_=D^;78?t5?4_|jfRF2$(cw$N>wYWKEyTRK(SEiP9 zkY60CLG1nWdbz!)ac+av4P$t&6*cMW9$1@MbkKfgus!2+zcIXhQO`uYo_UOr7c4=N zWLoEeZxzhYga!&EAK(B+088gj8YZeDn>i^0Lyro6xb$O0>-A84zWxYjcO%XRA;Uy| zadpcE4&gbw90ja^Od8l|QqMk&h_6b8>akb~0k0Q?z*d3^J-yJBAyp)Fvc_QQ(jl zU^IUx#i1&a#9>V_q0lt3A>1-hK1QvByS8izk%F{~4_K1sKm1y;-Y5+*yCMbGs4E6${tSdY~XqHRjWBE`NZib4Sn;%%xa$|c%%zgOlw{IQsQO{&t z4C0ROknpmzybUyku1Ol^OJp@%tA*C^Yg;R4+}VBygw_$gv!FDwXYzu8BfR*q3FexW z<0aEz264M029)NZ!{4+dp0+y11Byli%ov6R7sqsN*2$!+a*-B6I(Ly82!$=r)g-!F zoHi4=ie#yYE@_`!Nut={$3psX4z_Y4b6Iq_N!7vpMcyleJTF7wAL%Terw&@9YA7R& z18X(;Wq>!;0Vs`ZKwqCqcCDrdM84LpOqix22Ou3!cG)QPAU4L0&+Cb`2K)JKSC;gM zoS7j>AI&Hsxi~CR=u5ZwjI)Z9EFd&aam}8pceD5>YK8Z3yMa4TQH723W z{E%d3WUn;s6Tr9CgC0E@j>!AHxf-h!O9pCRS2MZG3?Y8B{t%YFHHCnkZ#vb1uNxI# zeiGR@`h;8*!9pKN9GZBb|6op?rk4^Rtan{79o@eLxXgv;Nb|2i0*AtJ9WuJYM5h}h zkifjL@A$rOky9&#asqtL!!u)+O_f{fPxdN@Pub)K%?z2@+r0(mJ%Ux9Ydwt}Aq>HK zMpfr}-~v?L%+Co?xJm z%&Y4!PgS%dkUATXB0J4At-mRSNrHs1mg`;7P`eU8l5@)UzmN}Ty=Hm2mx)icB?bQI z+J+{1$2Gf#8iZ?NdJ_=-=EJGw;y(iw&iR9ul-Gg-bYwota!gn9o4 z9pfAn5iXwvc08W*S@JFjiyMMruqWE~10!~dq!8Dq8EG2I1UQ86i;54tn@}$>TL_IP z`@r~NxQ7uNUZf~OB{fXl7o8>iVvJeNfv;!{GCb}{VvwHIYd^Y?AaO9N*>|5K=3<(p0DmZBF5SncGHcG8LJ!Kn49$Fl_Gr zLtuQlCXbVwgX0`KR2SbxqKepZCwT5^m$?I`&s^G`vAm(g2sONXOi_cwPJ|d5)DHGl z(s((IiJ_c@+P2+usGoTq=sh)MX<0R~MwzC)vjxR6l)XSW9mv8S`n{JnXU)P@(}1jJ zXSkByGSCwCLy_d0a(N4KXlyWgGH%UzNFYl?`j zJ@Y(`{N>xss1E{fh-2-zl9G$^D+z+`C(0z9=q92Q)=oj^V#lc?MR+Zw+=_sKD*r3W zZ{EFnxf04+@Hkk!g(!`}U_5}sd($zzDYXdnpii=m>k#%|2bb(tJS$3x^D2aI=u|X~6y4jI12%yuZ+BL@J3F(N z0uk>RI_0=$lA$_ts%5QO$9PeFB?ItEK(xs=kAT}j5T1Q!0IKn#<$Qg66)}#jk8)H) z1A9M00tLLnp_O7qF4d29>T;wZcuXJNFj|IPlpVwlh~ayW7s1=%i0!71kBLuL36RxA zYca#S&B=^jV64ifR<-#yP^K|iEjeAe-;;>dA3SNyUo>amNNEt;gP7$>t7m&k*B2p+ z&}OYnFu9YbLOsEiUerY z@}9|?;$-Bls*{iweb7=#U5hg~=gE3~?1;Me-h-uSF%+5Pc2^fs!?CFc)R`#0W`mQP zw0m{UM-r{be%-fafmqZ#03uKpsEOR6PQdd-iVLsI&*u#>sZCI3qVg1n)-`@!lm7WE zDbTlonj;EyDZ$JeO%!runD{n9zGd$Hoo6Zii5zTs&`9Q&NzCMFqxXCXIvWljNebJ} zGkYdTUOtv}S--X~_i4MY3g0aAXxaK)D@4T)3z0q}sER6_bdxC)gjnYxAXsu-X}Ckb zM{rFAGs+b+h`k_nU=*X4DF^Vi-U7-9B@Xuz>T#`m%j8jBtTVcO+jBlADb@}fmTH>d%a(oe2rm=A`=S6m{D#lM`3 ziMXa%73F(o@flHP+4QMXG0=PaeD(Z!G$Uj}F%)*@E1h+OIFz{q@ z?cn4MPl00ssl~@7b+L48Pkore|DY|8^y1w%_XaGQv`_F#{`2+VqV5mPn1t4bXqWF)EfBpjfC-@I- z)j2=er^f0J@Mq<{zeD{y#y(QptF+G#8G!sDb^AR=lRr^X;)235io*Xb@vnu}eW}{s+&`prf0kYUyEy;%CPV$D$!?$d0so->voiVL@&4WJzt$!HJ<86%@ctnGR;B#! z;Qvjqxk&#E_Mhbu|BmL{!Vw${3rci zqS*hA_*Vhz??foAKZ$?JS^qoYU&W=r6MOze{9S7LchvvAt3m#ys~u?ndD#A;&HOvu rzq{FAm6^W>Nv`u7?vF$DKRV6-6BhJyZu;X~f()Sdxz+rS^T_`PmVlkm literal 0 HcmV?d00001 diff --git a/dependencies/rpm-specs/gateway-rockspecs/source_rocks/inspect-3.1.1-0.src.rock b/dependencies/rpm-specs/gateway-rockspecs/source_rocks/inspect-3.1.1-0.src.rock new file mode 100644 index 0000000000000000000000000000000000000000..ccaae57f9cd81bb233941921458d7c269a9c8f6c GIT binary patch literal 11919 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 j=wwy61kwx#0+ML)uTTF21iF0W literal 0 HcmV?d00001 diff --git a/dependencies/rpm-specs/gateway-rockspecs/source_rocks/liquid-0.2.0-2.src.rock b/dependencies/rpm-specs/gateway-rockspecs/source_rocks/liquid-0.2.0-2.src.rock new file mode 100644 index 0000000000000000000000000000000000000000..3a06d065204a8441de46b7da62bbe93dbd4e0a07 GIT binary patch literal 28926 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 literal 0 HcmV?d00001 diff --git a/dependencies/rpm-specs/gateway-rockspecs/source_rocks/lua-resty-execvp-0.1.1-1.src.rock b/dependencies/rpm-specs/gateway-rockspecs/source_rocks/lua-resty-execvp-0.1.1-1.src.rock new file mode 100644 index 0000000000000000000000000000000000000000..9e0cc0465b74e017923416377cabc602de4daf80 GIT binary patch literal 8151 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

Z|tWgqp<}5+QPt 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 A9smFU literal 0 HcmV?d00001 diff --git a/dependencies/rpm-specs/gateway-rockspecs/source_rocks/lua-resty-iputils-0.3.0-1.src.rock b/dependencies/rpm-specs/gateway-rockspecs/source_rocks/lua-resty-iputils-0.3.0-1.src.rock new file mode 100644 index 0000000000000000000000000000000000000000..e07dfd60a48a980f23180158190fd16e09d654a9 GIT binary patch literal 10217 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 avHuW!7=V=QkLN%p+zX5wdM)EWzWpCwr9~?M literal 0 HcmV?d00001 diff --git a/dependencies/rpm-specs/gateway-rockspecs/source_rocks/lua-resty-jwt-0.2.0-0.src.rock b/dependencies/rpm-specs/gateway-rockspecs/source_rocks/lua-resty-jwt-0.2.0-0.src.rock new file mode 100644 index 0000000000000000000000000000000000000000..e4ac15ad03c5e3794b37ce0085c83d3631f84121 GIT binary patch literal 63375 zcmb5VW0a^(vL#%$ZQHhO+tw-Dw#`$vZJx4io2P8gdHcJw?)2@MxBL5%xt>2ytX#Px zBQkdERFDP+K>+{&fB^7x9F}1_tTeO+1OV6s0sz1RzyYv!F{E`gb#nHgwQ_T&WuRlC zWB4;W+8O_FvNttWRe=Nm9wEih{%g3nLjwSUJpTFlANFFDCgcVf5V}sNpHijqijmNZ zh#ZP42J=yIDxf%9Bw-?uKP0sCzqmVH-BBL%zt;O&~jT@GS7yBq>2uatet! zpgNP>a|K)(LS+CMX>ep9@d$Vm^a_vnI)9xF%QlgCW!(3<3Uu;Xgk9Yl8cq z7}Eb8X8&(H82@6&`Hxo^n>so>{acIw?Olc@DzO@W90VK~0D$CgESj6z>i@$wos-4i zt+zQ*S{{fI!TGc5W=B&_Bjs{xpL zhxipHCI~;Ph3e6HV#lSSgpBHa&X-YYoOZrSHf{HVw~eoMFcKnyxD;PVlK(N z_`=b#XsF^wK|-*X875>mc-s=yyR>OG#~;i*HjU*pB%Qp^Vk6@k{4c9<1fweBji>e< zZvE_#X30Cc%P-w4f%!agahV3fX0Ihp!*XCFh_{Q#;E+19g*Fx zwUz99Xujz@E8IxxkS|(|!Ah!=hPGew=CP&%uIvJ$Gg~!+jyw zEhj4MKGUM+{Q4qTQ!#U?&Z--jB?CvY?6~uZM-t&Cq~rKL#S-6m59(MY<-7SDl}CxE zOi$zG01p~bUSnWiGqgxTpn@WL^-;_#m268w*Mr0gC(E3_XxPGD`>YO`_|jlJT9rg( z8BA5BDm=*LLp7q5Y?#O)3{xBcS@>pIQ4YYsm`ly?re#Sz>~(g{helx0T>v~7enalS zn{`$deMbQF3_%{xn0F1l2TQQx}N_KKgmdW!`wR*vqF}(r4gitNLvdP3581cyp zxOp-m;l|0$ClX?PMI#wdp4HZL$N17~#@5KM1buf3f!r{QTd&w9i~n?ii9su z(W5mndNoChzGUx%Zq8DIUW)eGx?;}^HMhC&e1ygVE|A?wf!+pe=kW$!3Hmfe89=ux zU+cqY@~ZUQj%G{;x&z>~FR=x($=3-o)5V&{cO^a*&lX+8VMUEn6%O%g;5XER+3f`7 zBe}t-c&qWj`F6AKz8h5}JQ;m(4By@U-l4qGyOy%2JSN(h&EfAh?zwnTv-G@gM%?$5 zwPVP6ZxV9=Z{)F7M{(+&wIRRyoN2#D+nsk$irZe ze+OYL_^qFOZTV!R=1dKTU}a!j>a?Guf>vB{Z-Ny%=_6{s^CYw24f6=>rBWa&G8+xz zHx1cL$uuWq7oFm@iXHZ#s@X#3|1b$Smd}ZiWb-2w-ydLUT3)h)>OXAbD5({ich z%Lr3H*?v49`xXV;LreBrunQDY9x6qtJC-E4YL=EnlRP3`S;OVtDhk`eqvQ-Bg_d5> zbmbh!^3y+Pz_{Mi;2$)8+Ai?a&4YRZzXLu(_w4``7Lf75Kk(sl6QOA9jP5)j#njnd zlk9zd{WX2^X0e$=oKL=km6n)JEu^F-cjKJbSrA=UF)k#_re| z@%)Ti(aJsbjGNd1i(qH}&{X_nCw3L6tNlotAu~-+*9NQ^N-h{ zk1W(Nly5)VFW`R;wZO3F;BtRbx7wdU@HYuk*6@d^nWeSq--X!)=$o78s3s+e$uUKV zX-V111E7YgHjc-K1?BtwB;_cn$j3LX1J87!Qs4m2}s z&{<@sJ(9`eB44cVvT+J9J%_j@D=P}#a=K1gYOL;fOW12#0Z(QABkKEDhreJ;>Q?H)>-2HiZs@4 zfAE7eKoX`8sl^Io_E20Ac*NWQ_L3se^#6+J;S|gbdSI$UBEayW2zUAQB?^3{a{c{aSW`M~lw^bH^e2@_C7rrd7*^Y1-6Nc_{bSA=wslG^cBG z{r!LuBvJ8VqO8r=hQ0ccXPpL(?fR6* zt6SVIa3(!_8TJcMBC;Y8~yktdwc*o3v4L%K5B5Q?*qom&Vn!N~hCN z*}CS<(C-5#y5y$CcHA{tKwIVfwnl1*N0QZa6_+~s)YW=0}Dj}?-Kt^nv<*{DlXjJ{@7r+`Znnqz|lV40sf-@ z=U4>~_p{>1pQ2;n&mj7nm}>80^dDSaO%vJ^3mE`F|GK=6hrn6`=9}~pOcK^jCK&dm zJGIr;?qtZe7OH>t^JV+`kIT09-~e5}Jx(a}>$?@m=!SVh(xj_@mQvZydxio~Qvp1o z8X$grt!%!mL8Z$K!%8(G_wB=6Ui72Ta{xA`UrrE@efW zxI@H?(u@tvlA57Fom#cE+u-*CSsw2GNv5&CIN-RiFngS5z}< z#`2V6R&8kACC9m78UU30DWXV!)h_7&GmQFA3@w;{AUypu2>%8~B~d{USy4J0lfTQ2 zF7Z=xz>F}#*B(&PI%~SYo&wztyWuK=*Vb&eiL)P+Pp)Sh2LjY8gtiIH_fxCvb>c=0 z8f!D#7Gg?P*YP)2U~>3~WP>2r>2>3i{X%@*z}&%elOl#7)13ZtEwD=z!%IhznB z74$HC8Fd;C?<7?620o$#?Kz&su7J%XrIQr7ne>LV%2ViL}Y{;<#b86vh%kx=Fp?hq5pZ$TknErApfiKBm0{@w|BI3HFP%p4~~yb3j0iv z1wycs@6fSD2(C=suc(Y)Ud-`(yg}HTwY}F*^A}A^^9#jFOV>O60}=FVFGp>=X-A`g zH-q{W7@wUluxAZ4astNy3LXYg1`CKMTj$8Iu0Jr9VJsm$MvWRIIw8P1zjeEwH7M!S zV@{FU?)}aEO(0&(@iHvqr<;s zVGypM*Ajfy;d;udoy?v)rUR9GZ^?4o^X#dWw<4>)71?H=qJoA@dQUoJ!??}(+92Xx zd=@Q`=)UV3cRR3aRNG6;b*nZdpE0N<-YV%;-Asyz^}&r$yP3&AISHX4O4kua$(s{t zD9&(P9X~ zv$b?k)|6CJY9Glsr&x#Qa#AIvhZJLy2PSFxoeTlmH8C0eS1S^5hFEvX<_!nZ;zTd%`qT76St4gqa%Orhp?>B(j_x!q$?XA36kG8Utto(?GPNbC|2vyG0 z%{IaL&6`&usM>ud?m@4Nk$NOzT*2IDtF+_wG+WWLOwVR_>4g@?v#`Nrn((QGcN21& zDe5~gad(`+6$5Q<+I>z+8KL(Nw$p|2;@8orBuli8t3>*uM131c;>Zntu*hr&k|ajA zOOs{%t>gx`XYOKBq6`!jKXk{G0H&w7!r%Z+;y}v48aI9w5{2v9;N6f&=g-vYUbe#+ zY1S6gn0f4!WZIP{FE7rFf8y*!5epo5^zDjm4*$9kk9&r0SYRS%PCgKAnszD5=A;ZU z%Fa^BC&T!4+2Qet&o~TA5nQv$>h^T=@e;a#7o@FStOSxdLcba{`POqu>603|as)Bo zZi)PZ6`Z;xu(@fF1>)xNbna^GUmy^&iV2beomlf5Ky{Z~m_ z_V^4IOWfI0F=$HY0tokW;g4ijlzL|Y)oSkvyMdhGl0qnTtA2RC?Hza{l*vkjaapu^ zbhvH~1pl-8fn=F3#TVJw3ihb)a&LE%9lp>fpV;hlZs&x>c}5wd2(F{4f$%hI(8I0+ zm)j6xqETWf(Z<3FwP;gYJ*L_b-+g5!zDwt23hCmYqQozXn9#=PLkv+92~~uoCaN#S z8E%l(MXLHGiIj*wwMtS_`JNl+{5a5F1pys;8yqm!*$Nm|ny5ixTNt3xrueUuGklZ2 zN1>XVyfV;%tuaFM>(hi(ARPM{oYobo!Sgb_4+_WVoz@n(JlX=MA2)iswY1OE~Pw)Px`nxmur*_rhp*P)~+m8s8Zt;=bkuuG?-fOHcyv3Jtx|?1(@Kw*cWpQ(dgJ+v&E_b z%xMi(E4W~AVs4r_KCZ_sFE0oGp7uDPo1Z*-)R%rJuv@w^Dn%iKRXiAfpfN$1!U~ z3i&DcQnnxD$d9R{j-dycMuO0xV$6}c_v}w@R$*OZD$`}aZ%!i=` zw2#{Uw&YcYMSWZby$`q&V{)LTsJt|x)o>Z+)}f}u`fK~z&Rl8iI~8BjF~Z=cS$i9A zXrlqn(KF(F&qY{R5%_A{{oeLNPG?ue{=URD<_}xVm)*-EJ!}has&uR(h1|E3IY4cJ z^Ryc8+}(Ue`u?Av>Ec~trAl)rUfoXkdntbp#Ht&R0KuX z%ngb6q-M95B!%e$b)tv)wMv{B%xMtjGGeW8QOYT7+@{1V!xEG4M8 zSz#sQNx2;T{*}bPE7(sTaTU6YFP(Pr#xD}F^RVvG2Q^`*N<%U9_7$D&RlCqr_t#uf z$TmKddS*`6-z<4FB9fQPU&yqw-C|lXu6b{&uTMsiPV=u1Qk!&ep<(dQkbE?P$rqp5 z9q+pgcXAHbfZG)crSYRIj%xuoSVwN*VCuE_3i2`9KnhKpWZsp)(R@|Wj%l;bK3lpWiB z5@eO`Y;9qDs3cL({3^Q>`i@I4LdT9wqQ%b^Tb$y1v-TdiRas4m!dZN^y7itvdplY^ zI)bmc8L)aA#O)XZ;uT757fV!V!BJ^BZk5up(0+Bj=-zkY6JNF5jE|i+zHa?!8zdh0hj>8r(n z%((KEXJF>E^rb|G+EAQT@I(9Fw3R%Hq=)y1#_MnDDfWg0)}dS$K~YvCST?QOo&&|zLqe|s&(if(=q4x8cAzfYW*OPm$C6n<^cH|M zj&l2DaSDOZb41SLgI~nBd-jqOyfRn9ra!XetKSia0<6a-w-I;xbu+gDov?=2G5e<+0Q(AsW8YS3!Ra)}^Qt1}AOhIgCHi{n*rG=uw0td^jKT6Z!G z1iDi4^tZ=U36b9t^zLT+sG1v+)<0NFZid! zr|mt#YkCG=gfxlJ2T?p1De-^qt7>I>+bgk$J7PQNfAxgEI6-#6VcP&ktw!$DI>#4z!^bLE|z zxlxstrtJ^sNj;8=u-4&=eAnaO?$&q#M#+MmYd^}L_DUnde0|p*^hZGv57?CdH5fS!q6B1~7<>oQI%G zGLE-31VGTZah!Sx3bZ6G6Vo;>KbrlJhXuY#1yKjGYQi-HKmqmZ#6{AAD<*(C?SYYE zP=W^H{6PSrFVA#}v=36qdK_2FR)h|o`y+Nhm9khIP(uX*g$tNv^s4}sL$!bX_6^%{ zPS((XLQ@Lb%hm`Hu*NQ9vkkm zcqP?D+M_p4i7Nv9K<5sopj%etMxs>fkY^||QTV3vPaw?z>-_!OwH*y(`>DXEih}>C zt9s|ioNhdE5rzV8T?f}vm>Jdy2rv#{mU0m210Xf;TV(t;%(Ob@l@SwPo%&a0_j-Xi zx3r^+&2;1a9%V|U&rT}#`);QyoAo;99$J|tqjmqnQ>j{Z9^AAR)roDcxNLM$&MHw|A9?uI$GN@jVYU752}i=X$D8<>dVKIo(gmgiIb)(Y-C! zkNqGrPAx3GVNJAbOq#nY?jmsERQ$_rzcJFi=P*vOOvIk4VNht+Ou1_UyU(IhF+3dZ z01{>PG+9?ca6YjtRnIC=oNinN14DGj)&WDMEP5utS#3$VM=pLe^%-&3XTZNh%NG?76utX_5HGR$YE2rhfy z!*<2|z&;z*KixiaPTB0T4BRx^8Q++2mt1%t$(CeUIIvC}!>eY{Gw6mGF4QkLw35kr zb*8CQW2FBB+fiGcdBIfSk}s|i?yEZ(}S z(1zNbsG}nN>{-4J6Lk5Vpe_!$ZOAE{GtRUq?bqj>`Dali{O@m@|4G&t5KW3%{ui-C z{x{X}KQ3+mF}vg#^oL#Y>LKbL888J(MhZhH1pp?({bc~N7de9S^~Pa&Uysf$VDKqo4Wk@+OoXxXiuvweas5@avnbuD9V z*poRnI5}FDqhii16)++VXmdS~I#t@?NKA>lcO#p|*ukddG_71eXA6=79T{kw870bv zE;Eu}6;(XK@K|3wnBw=wma;#9ZS6|)lxLeyy-0|gMsm=egrma;Pou)HcHulDL}#dS zDppN@`b3&o)##<{9=zm0y^%*tXX~PDpH=7o6r8SAjJ_+~5;5ddk#YFwB!CmNhPu|s zR#8V>pBhT!Joq#LMp5eYGb4YAU+K2q;YyOtAUJhPJN~hr!cuhs7%;wEy(;Ji)K3vc z|9j;O{J*n<#~;l{o9L0ElojzDPJ;c$gvPdc!BdrAov1_EiIt%+qoCLf1V{hUI#YgUOlqXeyEo zWJ(l)5vsuj4+c#NYM&D5s#j}aprP#KA$>#DN|4(+w>!6n6bFm}t5)(-qjAL7g%Z>C zfK3kc5K~Q92(t$T^;VHjo3Ia!cz@o!i}wyi+BBHGwmZq;Y5A?(6hnLKA#CCqORHw@ zmG97Dv*aNSY4kjCq<-vL!LR3AqKk)ydu4ENhBc z@^ck8qtd25zLaGs*#fd)Y}tY&%f^FIr$ZqnfF^7W5yE*es_s30boWR!GmH8!K*&u| z>J4pjuhd-r!{4SK@q+U)uB57a=Wk$YT>E`1X98F>9X2*jU#+dVpZ}w?ly4`}W%dV( zvOiEz{mY^HXE~CIsq23zMzTqmu=*oL5`F%PT=O^($2u*E7fOQ-phH?0g%C|e(XOWL z^yGjf{ockL^C>bhzL{)icB%y%-qEBr1hl-+v@LQe{kYtnH%T6@&{Gy4Wy~#(xa{5w z_9X+@ZdzQgRNGE5O&~iFk(h|V(osP)@mXPXBC>yN2=K8JSQ$~@1d)N(@M!VgM6nDl zi;vx-3Ha?A^$n0ErfH#SY7v-#ueaw?Hh?IFpMO_@3dlpT(zo!xRY&IkpXx|KB@Wt9 zZ<6TwNBbE@91gDQTH`c@uCiNeq1}R;W4h3fpV%~D3J0(~RPH+|Ix3T#Y8!ViH}BI)I{uO&#Tq9+@YwhIZ|sML@A_J`FCdU9O;O^aiJt8IB}0Ov zJdM|Nw^2>WS1~H@+p}~99CvtuH#&p*Zy6HiSE-k%+^;_}q|`q$q%s_f;F;6s|ARdI z>rlZRXa`%s0|4;S005x=3z9OD!lH7@qW>Ui{~sr6OUuRyyA|;(M?b)^MA`CKhTL+V zZH#;<5xWKMDB-Z<6=Hi&VsQi*cr(I?`Ssez_12T*sBOV+$wVuOhX(Ea?ssEU=lYmu z;UKnd<#zeZ;Jx3s!m{N;6#YrA`o3KQelc%2J^%Mdr8&AysNwVFMB4kOFP%qLd;LXP z_Re_sM>HDW=H{n6eNF1h{?g^0=WSh^?sn8ltK0t8r!47}?e_MTUayy^zWT@FP`TPUbEBl=3kQa4`S&n!Q*ri>8eso;f0x!FUH-XpayMnlb!JOhZucQE#sk6 z71FA8&4p-IA6-zz2kXKugGZ~P>k#LHd|FjvHE@SoEBZs|(N;4ZyFvE;rkA|ipXDRf z=V8X((Y%UPY@I<%7gGe2J?d%#q%?~If};+r7?s~s@1UF~YB1QG5Y`O#wiAlfTI-JG)-px(y+2>C={>lC@7)K)1rK(?G_t(`*foy|M8b8-@x;nl zbvP6BPBV1Bk}%EpfqtCnySi$6;(jN{;<+#<(om1TKmaWwH!a1Y1Z-aJ4w~HO;q+1>c4n*EstIMlP#y2RyB=Roz%Y(p(|DLLvgs#KN8E@6SU}CGFiZ>}P zXYGlKwFP{nuSnbo)q3QXXnWnxsi(3(;7`^(FaqXk&&A(Tkw)ochY<>Ob@jK%A|UK( zYbe2rDavpO{mW^qlg>X;G)h)FM(9fU_=gU{l`ly?sU56)40t1tce&BOtZQqnFu!8F8~6xnDq!iF3MXWPr6q-2URT7W76j`a z;l0pbfQT&O(q0Kr5>``aMnJU(VJ|MHAjD>JQ&ADJu8iIUyYZ{?&8Q)*P{rt>GB8C1 z_OF|;+i!Y0>l}HE&>ooPC0t|PI$A2p&p|9S4!aL3Zpy6`V&W#cQD1@w@@1_l7U_(i zxy-D_DUjgT8_tLk1uR)ZdPyrDpL@Gz_KSaT;c}bp+9~DC`v=Eu6v_^PjaQ-ULnbRS zCJLW9=Kc(p`{W_=8$1-}fW>zlJ zj2MSfRYCzn0wJ8u(8Re1iWmNg1Y=hUra=~ppI7_iDYH$??hXC7M;P+L2)Y5Ut87dX z=cp}5mqm3yIjqsMg%!|Uk`>+?|2l)KwnhNXh9XWbfo|yiR$IT824XFRth>cP4AsTwBL7yf|?R^glpbFrRw{Oq_3~u)k5*!E-&N`vc40k4`fM>-` z)hk!r=B$#ig|+cuUBTv#B&?^W8MLq7%)h80drR&(2ptk}&1F%bI=U$2Is&v-%y-p6iN0p>&@u0#bQ%%b+6SA^Y#6wOY{a+Z-Mny99n6Md0*fBqi^AAPUjw*qRDLm+h zBb^iKSYMdH^c(1k6mwVIDPFATu2eWNGw+wRJw``eqlNkeaoeXr;`sXSR!K#$>(?OS z4>*X#g1*_yiR3rT^!sxK8>m`^tmARCw2Qmav={Qp?;d%LR$A+)^+u)r<`ENG$b2Mu zckKGAvBXJcsmkrn;m)oP^Aaxx9LR5R)8^VvDpnWZZJAO^_#)rj_!sL@ge>r#S*O_VNr%#11M%{!cQe_Jp4gH#gP(P_C~!R5`}?nTBdgmMy4jo0bmRw8Vn z{xT{IXIBNy*hRo~>37q7ohYq7oTeR_+gL z*u!H6&*u7}21F|9v@Ik9z$ymjhrlQFNa;#D__Os!v(vFoP^`45(6!>{d>ARGwqSJK zS*xNfrpsi@G+L%e%6l2yPKp5^WCK%eDKJI;Ml`bu(@Hx~&NzDuS93$OPHnnl$o6h@ z%6g%UAy5F^EH^Ze&3z!8heXerC0|%*MtDe~g%Cbl4>a)y7pv2r9T|L2ikvXt146q8 zX(*E_`5_wdvLREJys0o7?B|A3ud!kIg2x3nM*$D=vog!J1=bS#0o(kt z|fKe$8l;c~iOLdebHiUXG>c_?eCrX{xw3`a)M# z-*<6g%7qO#_A*s&SRMxO&FfLhMKoj{KwA(Zg%6RE58Laq=sGJ~5l;IG#V?}p`8<2c)zL<1eu5BGW$7j{`H=uW2+V%m z3{NE&z+0HEF#@&f;>TyHk#6xe=ojQX1|$UWI*pstVFpLI97l9^A(I#T{Npp}uHks? z%q&tdVP$$#e9IDiKA}>Cfv-J`CdC5`%68f2^Ap9e4PvTOIKKSEX*$t8cI}QFG8+Ta zn^-Jxm>LOLa9Jz)<3`4;f*m1N4rQRO;x8Wbm34;;k+ha-cla;JP8=m95><8Zoj%7C zSz5JFz$YShdJiZy)3A_DH_avJ`IJzw5n8KPmKb{S>F%O-Gy*?Y7kad3=G)Ju&wW0u z=g+v728!P)(uSqZOMjo&og`coD$g<+Pd=X|kmXVB> z(*!w5ot0Mv}wLQ?+>Q#@{#zrH@n{ewe);? z-5cFsB7{#L_YFOquJ!TTpqRGxwtg92Z|iJDv|e9rZ*T9sSY6mbb9ZR^e{ow^yefTytKTNp^PfuoM{^qhppRkoX%kOuye}C(b%`-Xk>po$9-FdirdM|XRtEN;#EZq}N_LP{dXkhovHxMktPnyAbDl(A`#$a7Byu?3`XllpXnO&!*k&p{IC%M%XG zG|!;R7MDpcxpDIb#zcTY*t3Z+_zv@8Mpt810cjEv-qm!kO1CJg)U|`)l3Q|dYq}?1 zyFmn9%|84>Ng>Zgo_5LO1ZwvK^#C$2mNnU@`h(Eb7Y1wgy3e7sg|}NP5!`6IN_SB= zT@}4VVNzQU={LgtqdF}I{E_r&t+UANqQQs3(<0=n8WU#pr6$Dm$pO38TTL6RQb{Mc*V+v_SqE$j=*GDt4n8&NxyF(wDGXrTaR>b%oGj6vc@B@Xg08RQZWR6BBe`O*qC) zzl)Rw_T8(A_bhaUj5Kd3VZT_fV7F-r8Ac^;pMeNE*m3Y2>ti$GKLm`<9|8v9U&?l4 z%fGAGLll1fdGiI+{Y*U>%H}!>v?2!qDW|g+89cwJJupuanH?MO;x-Q_+ehUdHtOM9 zf4}`8qc%JyrKpS&3l!hB;;dWCi!m&j3p@935YvrO#Y1W+2Ux2li zXP7fG@)J?8vZXg|X*FWvXcn%_kSz$oCyapT=ELhwLJB?iFXHk4{#5H1OR|8J^%pRe}T=J-pSJ3me$qO(bCL=&iU`8alf^_oC+lpzjty26()z=)oh?2 zgzl=Y1Je*BB!v7)Fl0I0gZzPR5dvekXM96``>yjYG_H8fxm`G(3aYB9sU6ocRVp13 zH6pG}-*t9|Tm;>3Wus&Tz~Y~Td|fQ5T9LQp@UM29>ALv^ph}hjlZ4?i9e(jA$Y=Qp zeue5h?`9zip{+gA!+Pixjmj_Z$d_So^h9kE`+dL9z)vQ6zPzqbgQV8Y;v;RrIIo1} zwugP-yosIk+8Tb=_6lV}UoN4By27l!CgqK{$GNy5~V=xce8WKR-W* zPf9QaZV`T{i81Yfj;fr)g{rf&vxkEhdobV+)ysRjhkZD^Ju41EPZ{4A`q!7A_`<}? z#ddWsvVbBTvW?^@1`X?IziGF8>GBY}dD4_s=Fx8b{qSX@NBT@#7Qc+m>wK+^9@DhVdorJ_ zLXV&G#(Kwcx7HU;``+>B+G{7McJm3>L%{#?1=d5bP}%`){_G?K#ika({yX3tMw|Q?3U6PW*ZH>_s`tpl znRpo1J9;6e!w)-ulOq~$&@p&QTPkzwP3$_uWP2YPqkak0SB1-&xL`H`;vag|C_V=m zU?GnXBllrZ6ugn80F~C_i5#;FsXXT~E2T`H8Yg1IfcsejJ6<54V{$&FLf!y~SK9n6 zH^v7yAn)S&-#9N47nXYL<#1IT9RYwfk1_84g`dkEFozpz7tj2JGB&(Xze-K~UDN(9KIuM6JI0na`X8?IMV151*bqX3*6R)gkyT?#0Ds zzzGvZXNY*&yF2L(Zp;O+y5NHqk=F5V4hMXQ!xNxc@C^~kr$(q7dVm|g`t^>B1-_>C zF8$EsJ+xNU*>Gycc~6HB_=O+lr}sy{z#Y@PkEdKZ_hjnaC&Eetu~;a(<)%Vp!d0 z2}Jio7@2$m_uRYGcb!H`qMj&f-}*6Pnry^2pgxn&wPYb3aNmJ&?54|LJW<7csz!LFZM9O z5AMld16;eHlLM2f5mn;0ak(TWdYQaAE9`i$o;~1?Bc(R7a`T;T$u@)IAfs7LaR5c| zwWJsUobvn z6mu_k9EgCKhyuCpl7Tw6Dj!|W>n~4IKl;9~zCQL~s{@+POmRsu<#jNqCypjBleDTN zXh)i;XOCs0A%@u$WWtOz+|0ci1WYFxMk*Y)(cK;zJCIMGBOIPD>lMO(g#mjnLbC)^y?OdK3O0&nMxlt-^{twR8jR4Bm%X+|F_ z;>2J>{izC0LNIgSIXZ=-T(Xxy1XZ_YA(Ny%sUY&M5Gf^$I5OK=2jv+PvJ#7>kV?B| zxzG-mYqnqL|oTX=X7Ck`M1 zhL%PbiA0OSKAZW?N7I*M@uXBbb}QuVx$%o10vPD$tOGI@LXNylEiF8C6@oXx2SS&z zPHl7$$;Cy))DB{CJqB`w;d~E>M4Vch&{fxF1DU_Ybh8FuiXzFC&W1io)#6eFxV47y z>YzB|iO4opmOG$R`@L&WysM0xtqqZp$I<1SJk_e)=8*U=DtWS>QX2h!PbC38cWOJr zqiBKk*Oa-nsb>MNtK9&^fdF^J_gR2{1*8Fs;iZ;Lr;*aC>U9^fxV2u|%w8H=VLsrI zP};$Dv?D!~ohd1c_p}tVPp@W2jtw9Gs)}ti8L4gDR)k?HDG4j--9|k%gPLXwnXlx< zAQ32H@J16!Z!0RfU^&q6#EOr&>1fR@Q{S#H~F62z34-`RQwq@V-}C$scQ3S2OBJ}&!lF>Dr&AZn_{h|CM` zYV(w(<6w1c4>Suw#Gyj2?W;o!QU%+!%<{I$8A)S|aP8!ml1-tYj+e;DSY=J~{BI1d zQKd705dW`WxJY)H4d)x-eDC0#b;;)whB%wwj3D_vqF<@97- z{yME9VPb>(!9W&r;Bg4H!f`O`X1+Yo!O;-HUJ)!tjM4+# z!zp^I5V_2>2Tdd}pt1hRR@%-*RUS3%z@|qJ?RsjG$J`JSBn-64;^IgMr`|)JCyr5d z7fHb0_^Sq{#mUbEPhCT%WZs?;l(%Cg!-h4Yn#?8KNqNn}4cU2Ujpu=2q;1e=SS#*H z0NsI#E^VD^Yl{5MJ_er!8Jz(I;{aFhFnDO++^nHb51U?P-mx*EBL)OC&D-*j^z)Sqxsxl`BGN~VO^|*#J!g1L=mdfJazJDw zXs9N8T5%r(FnOn~v2fUhGKdUZWK3JBpiGTi$lM|BOlC%HE*~a~UkjY_H}Y9%dvik-J0Gxhc#ngX2!up<~e<$@KEA79CvV@(>r1uzDfI$*C^ zF>`P`ymk&7q4J1(#oxgKQf6?L_0}EzXSmGT#qC7~SuRJ;-~@82dy{sTIS1E3;Eoy+ zg`gcrE~;u%uZ%hNiIlSF4&+uBgECUg)f;P;8eFnz0h>$V#Kx{dn)>U?RFO>Zclx;D;=E0X-z!5XZ__`Y&#vjDQ^sQKQof( zI)e|u)*vEjbz6{FE6CtKTZzm)58UjB@v-AJRE$L+lj?Oi5!S zifbL+oVec8fRe?*WmgMs-E=2Wi~Z6^E_M0xcX#R?spEia6Ju*_$UYxOw%ZZQfhfMaO#Q*K}*)!-tr?qyr?Hg$^M30EeHy0tn?YT~s2Ug)!9+2SV0 z`Jru5`A04RdfMZ$sI-+1ciJyF3+Qf;&5wlb?%NUYR%Nm5?f2*X_a2P~)L0~8h+=4Q zk)vnbU!>k7Y&Q!C-H!&;-+R;ww^qV`mAKCeagPP^E(63}2B?b^P&X0afB*T-O&X{v zgNx|nFhrs#orc?RP^oa+QwGMnb;^nnCn(nK0 za56Zvku0O?)~3>;e^ZH0;mgRaVDFQUwo(bF_IdP+?cvv<(jx?ioj7y%a(=witf zb6k;Nc6DHak%fe4GNL(w0q%+?V3sIz($|9kr=(KU6SB4>6LJ-E-5c~^w0xz%EP&Q= zdfFvAfODZigPSF~f@+{=M><7cAAkvQLUm{;S&fM0+aQ{q6p$Jt#l-BWDSHeeaz>>! z3N(sky;T`KO>~$ELY`eDqX5+cv;3jw5p_CsvkDLj=dkL>2Sssvd$Q;Fd;8vqHUq9r z-;h~U%0nF$sR0KGJ=vNd6YTYhYM_~8sHav$f=SYUp?anx_ex0r?KbT30{~F`H{FT< zt1)3@ZD3*JL~CtfYGUMJWNq^Q-Kn_V@R2(ZM+dn3eMd%Wi10*cp#uuM)RBje)P(;7 zktws7l8WiDg-5213@CfWhy%cE0rp}m+%L+?F)$-mlx2_-zbH9oYP`}gBLQ=XcjDY zqQ*+cs4-UA9i&!nY)t5tcs?O1ph)mxb-6D-=4jTBWc()zN|BTrD=J-m zslGfi#)?RZ2R5UHM+uq>(Kf=6fbK{{k=fP512Wi92*4Ruc>@TYXn~qhEFs1dK$hAb zn{4(TJA5(yO@caJ93c8hUfEP9xJVz?d*ayFm5Z8*i~EvUl^D$c$=kL6)n4unA5`1C zqu?s4=ymVxxX%d%hdWw_5rh@nb1W3!Hu2_DqJgQWt1A4MOfjcxB04YnQ))R0?XN|d|1Y}G5Nm8MQ^7x1V<9mx~f-;No2{(Bp zXRNloO4xB8h3&v6Rb}z=OL7c*EZW(AwEF6wCOi8Gi|y0(M~iWPq{UPv05ioXD%0I>fr=8ePnXt$vTaQLQ5^nle;dz`uV}PMWuk|*4x`_S$AEf{V(?R2PDuLJ=tSyi(EH5nH?>6&Hk1?kp*%9o1;Y=+1 z8kQo}lCdZRUA+~3uDBn-X_jNLpsN0om8KNrg^zC63&^IG&D1f>c6sSK1?x$l!b~19 z1&?9uUO0u1y3V-HCCv(@@?tiuMqJ&nyS?YdjIAM5wN@BSF}0W4#q&#eIY$Qs9;9VI zdb4J??*INN#_>zZ$#*ZqH|x?Csvw`IP|;u+KQrcAP32k{;p#@X-C1s(==PL>XtBfZ zWSMSSCTZX`8w55W0Nf}LWnF96`CC_@PZfLV#=KfIRdFGc@r+ecxwTR*dfp;lx%yy# zWp#?{DOV2%;O~6{8?j9h9KRKs+!qPod zS)`SLY_QE$<$z%X{Ds12-;fU4K&pF#EN%+d#j`ls!|fZDbfD+R5yo^$ahxIL1bkWV z()|v(yNIuXlH>QRvdl#hN#n-7jWcMlj2Zog)$%*E1<_!h%CvoN^P|wPAZhdV#>^YO zHPFn19&~i=ttM20d4#rr&bj9A7nIekx?$f_b8d2prX2h(lvb;%5-$OQIo5P>-}Gp| zeBOkNRW1^17yU;iss_bcBl%4U8HO?e^2|CE z2ss(bkN;d(9m>tM(ZAdM0d0OK?&WI9j^)|_t>qFWoyWqv{EM6sYt)V#62EGZL(w2CvMazl1IfRqlzbXa~aSe^PESg zdYOWaI$d<9H%%skp~Eifl822!3>ONSu_(FXwb5%}Ke)%6*f0Ty7+JN*+m%5Dy_uGIym5jUF?HS$H9EZ3Zvi@k9@OvDbVMD{U0sV{c zN3G8{19?nZ_1MLzpZ=b$t7k3YAKpAm{Xgq3Tk^<>ZUMIqNrZ13I~Lths~{4x_t2Iy zb?eW4KU*<a@wwOZeCTj_-_v+0`b4y zBB!&qGcf+Y+T{Nd@BXI;DAmjEKoq|3_q7yVgAA1N4j~L1?bKWZLShfd4Oyu2Ql)ZO z_X^bL^U9?!dSP~_US^`xCsss!; z!n6{=5@NwwY)@bUD&@MhK|7dd_GSIypx%f=LOi~!+*T>IV54D_S&#l0K$B6wua~^hjX$-ZOLYfOs0z$&)5^48VrQ6m?h^=69ltD;C9^>&_`jW^+q7T7a$P z#2)ej^lEVq()3*H?rCj$2Yt>2_EA7DGz0Jgu=L&P0{K~mR?o#(8nWs0*7cgN4B&Sc0jHoHEcg`fm@8V-m;RpGabLDP_dQ2#owFVx?u7R6fJ~=KF|M$&naF@3P>u6OcDuHKP{5B`FjF0dUUyBDhRoSM=-vHzS zXhr%51|0kEXOJ?zB6nj(I;x~j9?!&d#no2zu*6Bdc9s?;Adczvb~w(!Zl~V9WF+75 z5jdeJ3Whbku;$B-=>kcqNY&t8q0Q<@d6^?31;*frc0rC4c5QRqS2dF$`FGRYC$O^h zouojwbYg8?qfS*Am0Z@FkV+-wv{$;nqR$LuGPr>{kI}T&3EZll4X3^Y$pFLQMlMX+ zuXn_-Zc|kXNBNtixmoa#a|^8e!VUlJ*T!AkKV+}*;MRS7dm`JpJiPDp8TpnfYvqM~ zk-yEK$@}?V5a$1+VRn&mk=()n0O%h9{3}}jOByDfGo7n}wS}>Pvz?>U|4^yw*w}5d zBmUgz2|$2azhc`FbJgnX=3kp;ay=c}!`Rl7cK}_}M`&t1NIE06u63N22lra39&1~a3Y9|WDGqssT zT0~><5fr!${jmcNsmpR^Ai`0VWP3q>=x;<&4E!J;bN$jvF`zs@fN!wH^3lnXJ1mLXGxM@C3WF{f5_W|KS13jAQ|qPOw>j!1rO7q1U|0ziSSRGn;a zS!}U&sU_ip4!Kj@A*AhHc-GU^?Or0VumWM!)A8;Syx{ngS$V59?sB=e2e1w3{u~je z3$)BDHajy*B>c#{bEv9srwz`h@I+KaN1Qi=$dAo7UnjEFmdz=DDT3$h2+yO&=&0ll z{azrP51(x->S!(_{!MfblFt=b8!?D$4;`E2_w5Sm8aBNd@A$63#i=@{*R71J=fu4j zZ4;Zs;EJz7sPaH*lT~%0zZIt;fpLe`oMtCjmUJL^z5-|!b~8>{aik;_`0 z06)_}Jb)Re2585W2ZZDzaDlz_E>IL=EPE01;CfYo*Vo<6!R3AS)o!jbwU>MwL?qOM zC&b0X2~5N^>42}h-=Ze8h|6CXF8bc>ZG32*oAd7V+GyPB ze3Za4E|z@ofK@}xI6{|B5T%I^S1!p#>xZR=6Uix(K|JwRZA8)Ae_=L|Imai#l-Q+mR7ygsbz-I;mmf0&THZeM{sKAE|DFP#N)QchPOpSNX-U*5(4Ib=9OR);Ixfsv%c}rJ8L<<01z`ch@;Z@kfU zNk4AV#jI`(#2@bOGc6uzFB^9Z<>D3d*r7A~#6(qHP^ws&1v_&}36;j^_16HI`ty8J zn2tYSI@voJ8Q~yo{{19gYSU{_A?j@W=RwTHattB79^KPiq+(+4MqiM4-oIa8=}k`; z>K~*;x)t!NFE;tI-$`BWVRVvk!(J3}SmO^Hm{;kF2guO+N*N%`pn(9Bkm-Q2}^j53VNSu2b*>==kyDB$6c770? z@Fo0q93$A-JNus4;_cP|m}sVIW`F!=mJo>e-}0l?ks*DdMXedGMr3-L5Gs!otd0}l zS}-0X2q;kzX+ZuMSaR5k8QgwoUCV(+M>X%yG?XScl-j`}CJsdBlS)W^N=d!%`0&&q zp2QuF6bp&s`v2QHaV$<)qtM@m8Ibk#Q8Gw^4k2I0t`oj z@?W2N;&tWnKCw=ayQ#|5*`ZM+p^QR*6-H3T5>Nxu8$y75J}u*HjEa|*Z~Wap*%G+Dx4^oUDqc#qIc`T%IF|K#>R3}-{`ta$Dm;GjOVPoN8|NPz6RT7RO|0yis zS=mOutEaQ8CP!Z#W~%rNWD^YZl=W)f2-`p(Keo{U$8y_oYxe}moBqwPQ?FALCh14C zkFti+{A4#UjSz?GY;Y1vKhh?HBR&{=*C0q;(Du?9z5?PsZX0l6k=0V4sY+GwmEv z^o~_h*)r0ulT^9?oNk#XBgRga2TzF4EKptmu_cBuI7p5{iH7l zK3GT-GU~QF3r^YcVtm~O&pegzD_D1BVyF5E2`BKgxxM$;kBN(`2^k09^N(`^)TmW# zFytPwqqcjq18{8_Of`)`V~n_IfItoj2Tg^j&7JZ3>;AC@1fB0GL|ehl8PNU3-(i%( z6+Ijx%w}BALe=LxY~L#M=8-sRX%#vFMm~&s3Rs0}NuW3oc?Tf!n|P%D=#!~sRd|L5 zsE;GnUP9OU{P9f)ZjXN02YRFBGL}GL2g*N0cOoEM9e%xoupFk@F|x0AmaQ7_R7Y(E zEo1I*e1MpojE%C4V_LSIU8x)YcL`O3vBmVQ*=P0H!^uZt`J_>n|N6&J=E`cpU|D8q zvh6+!&*NVhZeg{ODH5(F4i%dr2%7(m5s`;D3m1H+y96(gqR5c!>`q6m9g~zLS!Edg z^wp+V5vmKUqY3qj4ZN!sNx9%mz;YmGrbw*7L8M$D4wP4&;#z#8ezQOlHmDk0^rgoL z>zF3tqQ;Rd)O0Eil-LvvaCa7cqBcQ$L4&r!!tTE)E^C=If-=G}V>Gv@MC(|7If6an zl>zCSIs=cxiSwit2`NNrp-HoFPiiKjsiNE94=(C1H$@we3W3FH#ckouu9 zSO0z(rSp=-QC@}DwpSR$WHY`bMHYRFK)K3l6{KG$OT3-lZ=7z=&j&>WOnY$X7A#Ln zF}$g(y=)p&2Km#KzRs80u5LhT7%wC_5X+;8HJD#U>u19;xvIK{`jSo5@=uK<355ea z0e#Jlag3x(^}L#(J30FqBLXeA9$LN6O0t@26W%~KcK zpr9Wjlpy(NP<&`xtZv`jBi5yZUjO#;2c9z0xI{ccVr&{7Ff+2z0l9vGq0u!X$i=;f=^;y^bFJJ-3e7X zh*1-BxxEcl9Jg2vlWmJ~h$x?6lMdx~eQ+Ue>bP7O_j&KNA{Xp*(k3w>!iSh1EoR!j zwkxrss=yzqeW2v>HD>PfT=$Azo7PN_CyzkFHj-^@;~+z%TXP#PTn}xVK;F`WaC5}o zELnO2Jp6}1*j2=>nY7fCNNhjK5E^r>4)eZv9NI&jezacZp%QJ*fKTuKt-^1gk^^3a zElOd(Gm&Sgl4+uX4oZ-2*jnAnrnT93SSh*YSzoLfR;xpuC5+2&p^cmY?=#^lSJ_=aXgP=#}s^v z!-je&5yE{$SDpR{|0+tFiUM_dv!cZHi^5u=epB9@+gVdHwRC{DyNPzN5%E{U7Z^$#wi_h`;#i>mB1b30rSDe#CO zktl~|QsHoD3~IiJ*L3jb3m58Av`pDv>=&P;6KYBVhS*}B_941uUS zvw>>v%1L9Lqr)oKlWUfHb+bfrj}FK04|rUvD@p z)XUU&V~uZ96b(yw`%AuAQ%m%w#OAr8I-I~apq9wxJl@Xrl~zig59RGp5ut|OL90E( z;LJc6+iQ&)eqZgL|J_JGMhZJA^GX0rWyr-kP-WWU6=~_w0jM$eQYok$UK;3(iBuNO zFQ|(OlRn#U)``1h#r8nayGs(*3|QQ!?pn)RLdPi2i7s+KHw?Tyh@)3$w>H+NGjsRI`SfH*@jc0109^ z2Zl%3ky@ifBw!>UCJoYJCs-oxQh7jku|e4&SPT+L{yA}HJ#kUOpoS&mG^YG+ zREc6%W zRn2KyKAt>E0*0CodE>CfF0bf{DLAbYVaa9&bR*VL$*4nisGUBOY1% zJG+F0UXhW$V2}!^s6a-|(2z8#=}386zuY8>aSl~DdQ(|im9}KNJTni?cG3a@q`m=l z$dTk>Bv6TdIz_Zwo$&Y$Q&q`{X;xDNzal5CDWfT4;CLJ#L4t|lx!ASUzYpCQ0HQF$ z$5GVrYVvJ=&ev4=PH0YO64=_G@{`{A=HLSr2py$$Q8Bvq?`KDs|0c2*YKKhn8)ir& zfJ^`3)Qctbzm*n@uQuw}-~^)qqrq%C7P#Pe7^r@K1uz^yO{yE-Bv2=f%rTt0Jr^wGSPgTai9a#inQ|99z-FdlQnOykKy55MyXSZWacN`pon!`b(+fI&WuXG*`*TI&aMwNjYCpd<}NJ2_=o#Z4T@)tr$44 zj^R85)pJhLPn)eDqmL*0gQu_^d=e_~ejk12@>bAE3_K1?(bWBJAF)slvlI@ylJ@$X zFr(dq603cDg1s=%vB=QNV?R2b?6aDyl-En@2T_gh4fXP?>}*v_@I+Bo-k4i<&7Vix zind+q+?m_!5NU^EW5kDd;vpQKNxuW6tUIV2JTULmz?Cr88+=r3G*)z4Q}2d5gZV1G zTUpBjg~u1sNtbWUn5?T7&C?Du*Gb>&FW1_elbvf1O|)f9uS_&iH4SkTFsKn};{8B| z&oQ*9fNn4r7(bX5CwUQ8FNY1?u;=HlH(>D5X$#A*|B|;j!VFdPpS;Bl-2Z+IWa?sT zCnCINV9UI6U52!oB%Jl-@2j^!p?Ug4y7-9}S0}vhj_$&GNWDpDjhH z86rLwN`iA&0GF_=wDlr;tG9(DnXbJ*^*|5PGIJ5mBoPkVCsPYNyTwzI5R0~bPvmiD zva79svIAi&6nS&SvK2dnlwnk2ImZf7g}APrU13NwAD?Z@gn-N~9`~UmHSE5 z09_yxbjI+t0rR=_)L!374Ca7qSmGrNCFPnroe@))qytU(>@fnZKwRPoph+I`{e?x- z(&0=7=niNNmqdfpCz)F8Oo$U|>CxSngM~cWuZuV2N?N@;jjuINKe@#(9}*V&fVUaj1?{|l z4S|3VSC47u<`QNKCLhDJrQ{rFDogm~IiCww=QaN|z+@ z&Rnc~%1$c2zhB0vxua4lF*kBd@iFCRgIJK4DYb4>{_5(Z4?U(J7=vVE$E`;|z9!%W zwI3t0k&vKyWGoedgIgsY|Cb=;%-=aZ>`bTSiwSv>>O}OXykr~{1(1pcSgklr@Pz@RygWE}I zuS58`^Te!=c^X9jqTT8aakV+{>>l7xqpnBJf}%aN7wO577qo-NT-(0Jl$Y|K|S{!hEW6>2@=|{!WDb&I{5~iB&6dYY=d| zx;!Be$x^NFT-Te;%VPOi?%J-ZSZ(-fiT>gw;MuARA;$~vc}U>}SlSk?H*;|NBmGJc z_iev2qw7{~nb`0>NNophdcT{|?)1G#ZNc*QW5xBt@F@9dc_1%^A}x9wx;&Z5O5=OM zriyD*lIeB7t~VSwJtG6$H%jD?Z)Bbex(_O^{4Xk=6OIS z_OZ)78lR4c(eVK*(UoiQmSHECt97f`T`zvv!K6krtIFG#R5zR2S_wqu3o`Zx?Ei_= z`j6uQ_Z%G_`Zr`(zykmv`F|gq{hyAsLYbmOro9Shay<97WtpJF)M3=y%rB?|Hxcc32d~ z@@551(9Mi!PeL6CvLOdAB!uBuX!LmtBk3>N-Yo%Pdc;71ySr7X2{Be#N(QXETZEM3x5y9B|D3BznP^0z?^&%S2s6PdHfORoOz5x_-MIH-27xE*e0BcdaWoRS>z(XJ- zaFDRUk8Uu3Anx}}OY9j_(2gt0#-j#ci$=Ill!W~E<=XquuOaS#R8kDYMD_MT9M zF+4A(VwauYd4jBJQ$3>|Nfz}*NN{A@m_kp3o;z!W9{F0lkZGT7dzYb<@^+D+I4JCi z%9Ss_|AfeUR6#+@XrDtm6Tw>KI395R%PPM=;nR7r01J`fW<;NkK31H*lHPC~2D04` zE^;$;H(au=59 zif+-7Jz-0+;_C*7m)hp(y3UR6v^wAtEA<=^lc4*deRucz@CXuSJU}gf!)tO;?Y2T@C@Aiy_%IGIv5!&Fw55wu_axmpgmj1Ki z3}=nv7$d`JQRxQS5@rK;_tYh$8K@2Z3L@w(Ti(t70eyu)$g1Ia_gK_uXnQnAR&NGg zYr;u%MdysL`!ZtXc@)FpvH5^_yhq}do5bx#Fn14zl0X;IXKDMbjs&L;pWC-2fAR2) zWK$|F1QF#T86uR&hS_sjaYh1-amI5XIC#!;;iYYuG3V@bp7Ra;S)qin6DCriD$J30e#rB4}T+IGk*ordjr34Z34XrZCavzzK6IJ5cOp z2jXcEchd_P1P#eT#6UR0f%>W4@7Y$^YogkL^9&J?kU(F|p8nGc1Ku5sU5zm@311Sr zZf9>52CLGvmd01+0Fo4|R-B#V6p!yPjrKiL<4Czr*+p)8vi{UrnaUcW@~0+K$jT4b zXY%R^yPh=fB`<>e$Ej-$n;X~!S?l^3EbYh7i_uFV&N9&=S1S)Ta9b0`C-2LXblM;P zT&ntkiA3~SNd%dPsQ0%DGo}7@`QI132!g_R}^-ex9*o?q0lgGvClnoLgaeuI_)#~5r%Mu9kIE$zvBR6n?M@?pe z^(k0?un#tVMW98_79oQ!WFNsSN3PwV*qQj`A*;YYzO4dkuKDeV&9g7O@;2Y%e?sj- zZk;=Ga>G}JdwvNWQ@yV65>Y{?#z(qgIt2ntks$QuVE!AdgM!N5+xHvhoaba&Z@81@eEo@FuLj1IT z(BGyDuN`-%pl6;>oiO^f0hv^={{-_DY()vRpuQE7?YWJ$;=Frvu&umNebuV%mg~N~ zFDu^`d%dwP)+D*Lphf!PY_8WEOSNA2{udbUJq-~$>mL82ePNE%zj9?(a%j-ORI23sKU|F)nU=j_91_n5MS5LmrZ4gU=e8W-Iq-_M^ z&Qt3dUSAHf&Pxu6jWGwO_Ke7B3EEY{3HbR*CAkmuh_x}n1S&#_dBXwP={o0ekW@-` z`#ZWRwA%qbc&PCSnuv z^6(!wmbLl%uOFwt6TdHU6Tx-yA>smAX%%N}tV~PlvW*vM24>cIViUZyMI5 zWLT*%g0MX;?QSQ;&OkP<%s)z6Ey*Wd6OPLbluy~Y4Y#ui%G&wR083!0*CC$Z0wS7(Z{(V`Rg(CDr5olu8H)f5?rSYjJFcKf z;r{OBzVDzr3}~#@@r*L|vdzw&JcjIULCSt8-c4p;_Qnb*syR- zv0LA>W}(nz>94Q#YrxKHNY=39Ke`;7^Py4T2N7lztZh0o!mUYC7#3_W|A+ zDjOzVv0jEF&4dG$0f%^^=vE9Y;U;ekmco8Tv7nEC*XTNjr+>vah1> z*;QR6r^gYTLIsH)N`g(1HY+u#+0%wasdH4r^S=UYY?tzAoaA2+9v;+a#QVc^$<`(2 z_Ne!Jo!2J13zW>3gsFAuZZ%BIXZe)G{@kSoSZ!jVY4JwK+-&VJ;ow&YeW}j98N=@# z#K}~u9q)1P!|`e}6rbL?s-~!bfM|J+a+J5|3l>kkTCAHV()pB(37uukjy(F29m>NJ z<5)ap$n&|ozqU2Lyp4o_{``c5UuRtGV{Pzz|NEc*Np6drhh(Uks>+?C0uSn^q(stH z%4}qhXYn44&y60ktn8C-+QF|`Bi>>K0-vNH%ypB)w(fnv+!IyQzN673)DKXQ7%w-$=4bvmo-C-#gs5s>Dt3<&JbDkSAgQQ z&8>ED?YWgnklw6Afnz2^{Ny>UYKOgFEN*;!yQ2|$>xbmjHdT@Q7KO4;-VNGISx`=0 zsSg*WpBZ(qhU&Lxin`#E8$@T|HrWQXT5Mi0c{pZymXl|LrVn1cRBdSYt%k3&1O8NtW5nD2kf*3a#6mT6$VT1Io9r_56ReM!|;&;4-Qh)i#NmPWgrOW5Lp zXD^FKfEe(_eEWAWfHQTf=KARUebF{X>>gaFVHpML;;P;Lx1E0XuK1)Le5iW}7aj`* z7NU3hm$mnxSM+MV^CzW{*9|?!-FA(Kw0`g=I~0vi@@B0yo)&cTwNZhIJOyj=9Zay* z)62Rbn~J2$<*PwW#ALdok8R*yMDzk8Chbb)*;ex~%xAldb{p4g(CKN=X-XknNDGq? zp4GMCr$%X`qkLwoA5VzpIjf8W!xFl=b4XrGnC6?@5_3hZ+ld2JaiFA!W61YC^0`!w zsYeid{d0+_wmQdP6f&)(8{BxLKuBjJH81vM0L)M4)}Arf19fQE_UMDuRSo^}ugk>0 zTYgpG?~9k~W8FM(GvYp?L%J-wkE3zs;a^50wGzs%JO#eGOa=N;;Tw`+EWP)?#s$Ie zM!db;ezRH2QH9S3Vb`tOAv}Yav3-09>?f0`3n{>(+*^q}S$65nxK1}tPm8!3q*JdvTQEJa8<5$j4>2+-heEIqi}Yg3sJ-ul$fu*vvMA9CdL9O z3x~V;g~{3N0s93}<9H&~DntCe;6!i}g!>AD1!}!na}ol6-P8N^BvbtEc)Jn$lQ;N> zWIh>LX#xKO?`$vIWX$ciU1XKdo1c+uU3tP)c(R^l9*%o(r6!@Gdk)nt@@hsno>(+E zTv+K}PK&;<1ChUqKonj8e*z6eUNt+Vv#|^s*zSK@CrT8v3ia@g3ywp~d9?8P11#$L|k|7jPPG1(=7jtD85WHZtI1!Es9Q>bm7ttc z_pwmTi^H44($mm^*HFQcZ>)oD| z34Z8r-^rCv4!4VJ_;-TtJ_|4BLgXB{jg)Kc8`DBsct~C)eBWjBJ&Ul6+Zv)1eDBM% z#szwIS!9D>fT-_XjV>;DX0r`a26kwZ@yhTl3hKgmvLFJ?j2i4D z3Go(k^ebmeS{+-;2~MV6CUrUU6-E8m*AC;GNT|FtXIL3Dp!wj7dJ%u=_V6_@>A$kC z;kw(F^NR#;S=*fwWx3Cr{i%i}@a*QR@jxep8kxh;B4cf`F6)QQ#^|qbSpBIy`my+R z0fbYQrnc@=6z@9uhl3Js*XZKvdY=mM-OKLAgSoV`3pPt@vOwb&82Ep7>*9IOvhRtt zTv9NE<@6xW!~XD=tj;l=fGOuPT}bqQ_x-Zp&yY-pm4i2uWN**1&osz**kxunFs!+o z4*=l?xX-IfG6sM4GKc#iF@U4g$|bq;k2D&7-lM^}=oHW6o469iNr>*v57R+8#ts6d zgvJI26sYMLoO+#AVkhtzofk+S0|tX-C~nU1POce^J0$wq*>6F~LYS@fr#Y*Jh~E4{ z_UQp;++%pD%U?*xGi;w1`Lg!K+o{Ki_B7B#ea{b0erVon5M&mbnUk~GFT1T?>JqW( z?M25^dpb+3HAR#kp(giRcC2aRUd{4cmfZk&+D8# z^!+M5fCXLw+pWpkLu}>aprh^;?SbuS%sH(9j82O9Cs({1vZ!(7azBjD9EF+3`IC5H zdOw!2#d^AUZ~yBSj}CXP+zJSVP^Mj>WxvGGZ`t@0TdCXkCSZO@EF;S2q2X^M?9iDg zJO$rzHzn&(VL}VDCD8~W$e`BMZ}cU5<5jf!L%Ya#OX9Hs+pxG)*c2_oHDxD#MBCtj!9>^Y zZ*kH#)h@WvX`j)0D3jH9`K5O4cGyRBQC^RqU&85?)5Hs*%v3^bU#NWKCYWR+=BS}e z-tRBhm*7GR&h9Kf9_%Qc^xHWPI%WB=)yS=oXk@g_M+0bv z;%WQvwhi+1^`$O?76_8_=Am2MU_|igb_ef1uL2qFrH#4L9df#H){vcImN=eymz$|{ zv|M8yH}lH@d02)rbs;+6Inkdwj*4>Q#{Upx3jTbydCCc_xJKLwC zjLDpI)G8fKKR4EoQQO{%9Nu2TVnMH_mY+uqstGb z!t!@OT?EVlG}xBXI?BU)CK>sc!(|`YFzjdMxm@pad#c^zTzlu4`h9#9}El5XkTmJS4T}RE&Zw2q64BhPBN}-Qgx+s-E>qRSG5}IKvS}cA#zbFj9$1x zT#IJmjp1LWkr8fKLSppfkDU%7-T^)~ZC-oEIjAYSj-0SvfQ<8)ngr8B*-oY1KxC zWxt(+INOgTnE^Vt>@Uz z>7uQ4XxgTKTc{yHZKfL_Zvz?UiK0#X#d_z=JOwh!A-Jc3KjZ-8C z&2*!ANnR~P7g7hz2rNjV?O(Er<2AfGcPfAiJ*AE1@iiWqC4*B`XK;7-e$KMFC!-|K z=AyaxhP=YT#1HG)y8A_TmQRnxLn2{J$6Pk{)Tgg;N#itEYTO=HPBpNc3Ork8b}G&k zZEP4{fk?507w(mZTP<6mk`5Q_gS3S#;_eq4pu%c`#9Z;P#c;qwJNgp3sej)AXJ!ps_V- z>V6Q#KXh2Rg0Fl@!<0UOnXL-0(A%Lb{>jLJMk8;}60~K;b=z)9DDdf@wreexoSf{P zt;KrRy!)}$ZW$QPHqnr`oL8+xm@OS)S9f8~!mT_p?34UI7(2%xO`T z(nc~(yA?%>G4fg)^^X%@WaGPgq>4V+*I$} zCv0Al1c=7DNs(N`&+^DRvZZ&vB(__it@ZGPs&UE!L-W-1Ik=YXSlh)laa-0L${!_? zdF6$ymj`2!WOXP`^R-B~C*zGfrX(?C?-vGz)b~&t4L4wT3gc$2Txvs$cqHnE5=t8D znyMizShOnGVP=bE5BuQ8v5d$tuk-oJtesG&f9+W+pOvy;A!yJ3Vu6X8@fOLb0mX@Z zYND&km>)O0PdB?E9tw@mYvQHxtfWkMy-2ryryD?qrlDug z5-yXgC@IIZ8JM!L;(U~=qUE4K<#*=Bs^`;5W)||>fB3NLV70T|AF`6EVgF-AcN0*_ z@Mm^C`(Cj(Kr6R@NlaD&cISKGH-!|m7dl0XpM#gvD{6?g2sH6wBIrj<=l1A%OlL2S zXIJ%J{pk5jy8h=F?TfiwL$0HCF?4DoR6ri$@_^aN_6U+3a~IT{;iybeWy@#oKTgx3 zzh|DW7SkJ7Du_D^#eOf8GZa^q*LEDNNuCeEwIgy$yviLW(w!(lNDwK%9=+6OX_GIcj+(F)ADmXC8W@LM3NHR9&IX0w*vgEWKda~|!KxobH#G1F(3ry6PxGZS zzyFuO_{W%3jLqMJxu^husyG0E@!zz|{|cf0Cw!C3AGXdLoQYr4`T;7{(}@y=d#aa9 zmFB!UxuhMQ3UU{+>}lf>@sLu{RLUapsVS;o?|fSTNkxX{q_M-Nfzu$l0Ks279dm#O zVR}`EKn2926kJs4wDZ0&H7fAEtt5`)>yG>SANUAi+Qkb(g|5YWjAOrF8K)_{Ffp98 z;rS0T=7SKpXTWLL@RMId#=+g=`aRnuy^S(4h_iHK0D7ae=rh!>2e+Pxo$oE~J?c`} zQ4PweDeNqkvMID?1-TT|F|O$c1NHG~5%}_Zb+j^E3j^r61>M=7a5H7x8NcgsPXws7 zO7%ddU8$6Xl>|COK;kAj+_d4iy6b1tlX4VX1DU5_uQ~C3!HG1 z#O!!Y6bG1FK$#ic|GrwWEKxh6IJ+#zmfc_|Z1plHF<5%^8-&Xgj9fnyUh^N3XvvK z7lTo)uV&(v4L{3J@Qn%DKHI2|J!Pk0?iXP|`8|FmVF4BTx#Cbt{kCq*3~SGUB0oEa zUu4F#aUs#%8_Nnqr)@PKea&enL$P%1dFWm?HZ0$B&mc#1)kEwy_}s0xD}CovVd2t3 zm`MuBMBl}5iP)VDPu7Q%ezr2uXM#tlIWWpVPD}A*p6X8B)7|qqd_GnTBF&26m_@k- zl>dfyp^-Z`2w4`ItlE5U1dfAxUsySg)9dDj!Kh1!Ro-J=;$jjn3m7DUU6$l>@N(b} z`SHwenn zQEZi2M#jj|%Ub?zCRvbt8!uc36up>KCnq3=pzmEHbII>e)9yd&gn@r{gd0B}RE{ZF z)GL6SiTH0Z-Uh9xD;jZA&Wn+Y+o{7QRLR#AT*Fv7%t+-2XEA?qWb&izdx-C|!CdD* z&I?Hn1sf6gYx*GK*_~XR%FQjEPq2nqT!6kqM01uJX-ZV(ZK{3q%IT3S`fS_ISIoaP#{ZvEuu#Yk&S&JAJ!k8;rfXg)oRMF&;RuDUal5?l>}PA@Avf4OKx}pF>aCYt-HxMd*>4u z*E_TZW=J2O2rjZ3k``Wcxby_%lIR$0)qFW&VRUP|z7jv4QYt&zG?^w$ z#Nx9pjIcXB*Gu_6@J`j*rS;Uzwi{5qDmc(cKrW=@qn@?x@uRtmg2t~vD*Z5XDXhbX zfIUVA_*)-sQ}RCMO@_meJ-d_S`NBZtY2>~RnYW0}CZjKL3@O|Q%LIl=>}aiZ>w*$O zp6FjID@6Sjif1N*dosynmZXVgE15^HVoj(j8AY0h(0y&&!OLP5pnjz};PH+rj07`| z9-#B0p(5-_%rrx^ElH&ng9n2Sv~Ws_bmLAnQ;%3KmD2eIb!G>17X8#Io=f2zR+!~L zoCX8m2y^oV0V-q`E3WIJ#!_8A=37_x4xkG@k2qSCG1$nXe9{)GyqGbS)VYux6)!^J z?7efN^Fi1C>>4-RgBUl>3b~8* zDY-dc5K*B=g#HfrlW&Ehb6mVx-?UukXDXqf9pqB4$*_jIW-1y!d~l3KujdQWs!r+e zl#^e&!v@aora}qY}j- z{UAHzWfc0r%+T+x) z&cfO7+aU*TKP3GA8uTn1x?Fs$RY5FToqr@>Z;y{ja3KNz6IxK1T4xic!>4+2h^orIlKob1a(nRr07NzxC1lq0OQGEUd z2yt>PnQ1p5sGFWthC-Z`R4Ap6CoPMZTg!?`Y*L(RDv`S?kT)(Zo$QG@;Xj&yW@34X z*}`;Rj1ltky8jM%k=;#*FDok?jS_#hk&qv)%uR84Bc+_qq+AMsW&`o)RFi!$Xm#Xs zlOki&mQ~b1;T=qdeu*X7bxx`0VZC7cX=7bN!W^`ppSwjW+B{~dJrnwbzAr^VJDu)H z&rtBbWCF~UZ)$Mv$0}^4OP3mBs$>?gAs9QNsf-&}8R&&)!!6nW2UBnfu*^3vZn0)D zxa5|FaQ_6jN#AIDS|_aNKC(zi#`p0(h9l^GjSePIl*t$D08i~|v{rJ!mTORHt<|RG zxJap5HElkCb`ByhZWQf>PLPEXIA_H~cAv!U_Kg1;hK|}wpH~_#L5%8j$c5tdmNzQ# zXuf1`GR}yqq#fB1j}B0oa-AY`Eha}R1No5BQ&g42*c=iS}=DXPP2J)81 zOy%;NbRv732knkm6^}58ciRS0vQ51&_&C*?gyO|mSzDR_LIQgR^wn@VP)%3M09S5f zg)@2usbdQ(j3X~h$`uSFMihV8BecE0jhITuyh`K3!@w>rwv0vqH~|Xa0YnGM+eZ<; z*`t&{;mdjBu@gS;oiWc2v`MEeP;Z@bH{Rnh_LWu-cy#a;CD>PqsfeGYH4UaSCrW7# z&BhpuPtxz7{o$G5#rM#;6TCzJ7+#32j3x3hd5Ek=OcBV(P3R{G)It3N^3J>-avg7^ahp^W`icwv=-xR%!YMW(AL{x2Tt{WVa!x@tGpup{W3I+>b@xERaU8SS{?Pwdd}79dSQ;14LY?V!X%4jz zq3>oZ(~@t!IRv{U|GU?`aMP5_=a59EJX(S-liDfUF(bejCd2!Qq|M9e&a8b zVG;#hw%4wOo=MoQf|4Pm`^CfTbSM!fou`{*UCbwW6NZ=7I#-KIFn;4~u2(3$xGYK= zRrr*wqwfl1y|f0ra#IZyDFoB%X2Kt0WfW8fdM95)rDCgqHn$ht*8o?r?$ENgx(Zt*-SsCG08G0KSXo?+Pp)_ zUZ%?Sd9=Ze#|UCsa&@hNjdzwqr-jC_nf4RhPZGV#zTR96tu)m<`sd_XOla!dhL}`y zGf7i@Qj=3Ax5+DgV{G!KX;08@+cS^C{=q_{R9`qtyIQbCfK91czIt6N;Kued`l~w@ z9HpDbYv&gmjZ8$Fi0)I?t3?>NFHMlWi%|)?uJI5&jkSz^oYFw6oGR`~j)mf3M&TR% z)x+z<&I&OoX=YKNsP&fA!F&&CM}qyz`WQym*zZuM(|eeQPqTvQRuA>)-oy**fpK2_ zCEn}dj?e9Qugkt4r|S03CspV85gg~gB<^?Qk=t~@RVQ`rK*j#RL~w|>GC-r@88bE-J> zbL?2RSqubUV?gqaHit5|{0Ltn>T z;b#`o=$l|-;Th`+MmJJbk4*x1D_>dt2RrI=T`&4g518%-^Csz}t?w6>r?pzFHeZLE ze-&J|*G6`mpuID3%zHTfC^MMpmNl{NVm(p^t?hXViyRJ6Mu-^)e>)CW{ED$Pb;<4z9Hx#~iY3Z4|!y~xx%nti% zR@>D!iACD&^GdRXOYVXuccOnlbtwKtM{li?{4>mX+}0O7RGl{cJ@8T5$oSu>-@y~Y zy5ye4x@hWIsxv&S(!X1kM;Az=Vi1sK#r^f2D{ADU$$)GxA09lDVwxu<_Zrg@$0OE? zB#hdOb;c?rJw{NopMXaa$hJ<^7W8L4-xE2KE#h=Ke70bk@Ubb35bl>saBR%1k1U57 zlAzQM&$m8*@8&6s#VSCUsB=w$CFWpa?;+&%@bh3W=<|AepWw9>7nfa*1mARf@7PKu z*65RJtN?LPHB!;HV4j>}s1M|#`=5yFW{Tycz=T+ZE%e)JuVXbolZCD189|+DD}z2N z79s!A0+NbLJ;@oFtMlm9A@1I>-puW@OVoe_KTwZOo5QdIvrMKjJ)d|g2a!n37*{oH z?vtzP(KFc4i#2sQs)e{LW?Y#jIeg0 ztWUon_pUWQG8a40b_j5!txA>q=75c4e>A};?lv~5Ad=i>E=_3T34SRaSPlc{BYPUb z`IyNuYY_et`nC!Mf(&K4({ysXGoapVoun1?l<3@R0+8%MMS zw_F!g9Zg&1^QcuGX%Xr2<|*zx4E&d@og2(U=J1rX)&tMGSrI1naA{%?dB)?<%z=h z^QYylyjXqTL86hsNxc=MGI);2B;w5VV1y`p%B%Yu(X0p~?;V}`=a35)90v?Z_mf3s z9$75PYTW7Df!DW`{rM@NA(7UmATL|QvS-O|k((Folnz6@dF9Hjvlhn-FP;HWUzv@? zOSBa_`mOXeY*qJl769&6$3}1xoqI6+)ZEXvM#;jVtP|R0kcR^7fY%ss{*M@O`N+$P zBVC`W>8(!4i$}Zb-0ChBd5!w1%gY@`r>W{w-&}ptGoO_$P=anRkGI{|0SBb}D(46y z5IrQ=uY4wuXe?O|S$mv|g%JeI6D_I7@)l3E@RFn12O6}6kdJe-KQIRvQj;ncfsFZh zpF)Xn(AZlYTU1Ytb0^t6{peUAd!2CY`p)TpE97*SpoE4U+pzv5Nr znO6GG&jXEMH=gLjRv1nSTRN!H=O10#;dYK$^sb;uwhH9UB* zsXeWosBzMr{ zm%OXFxhDZ-$MWa<-%2(A9aQuWxfAf8j{h!qntB-8I@p*x|2wbfpU9p6RX>GMu39$w zTL6yo_ZdY0O+Wn)gHEO<|7eT<%l-aW+^HP(9s6}gMBf>G$Gzf+nXM1Jj4p=@46m!;?AGICcMS4??l$sP& z-Mm3XC+R-bIN$Bh{CO!9&Ow(zd#Qt#;*!g?-bHK30Yei-dx58oUj^A|{g)AYuDG)M zUPf&b*{e>vZ7%~;a>5=jo9q11+eN)GP~_xo>d~80R5uS#B+(+%5?^1;`JIV{KB4)iH6nf zGBz}sxh%CfYdd%=y9dTPDYeRdM13aT*s4R@ZJH;rWp=;zJhB!iMl3X6xNUph_R9W>LR?fw*z4!a+NDr*wM`8TidSzW0Hxq|+HZdSHks&$ z^8h<@0rfO?kY?(@eY0=x%1`#=7)U(Iug3f=3o9B=g_4@>VX^) ze76%m%Lg78J&2iN&;<60r8|t;TaM-jMSh(m`98<%>&)3&Rf&DCmXL8BR+0fg5U{4J zrkE&sm0&|lZy(0|@4^WA2FC46V5%M6?1vT%B-XKAQ9T#6A!s?P`SrX%LLD5P^m;?* zWdig_Mbky3Zw0R)7}4{A#Yarh2%Q+S<{%6{@*k!8Eo8tri)Xn0 z&XL3rwCub8I#2ejwg;z10MC55lJs=R%IzEV!E-}}&>n@|ZDrsxb647ZppL=w8Q@b9 zo^I)S`yG@534+B=vkQ}L$Dbqn0l-rw^eqW#=ERvDBixuDTRQ-xtBe1p#}#kbHA@l; zP)mC~uG6gAo_{?5^lH-V7VzWed%{%;y98DJp;=Y91{Yj0cr&cuEh<;TX|`UgtwDC zbs?L{Nwaw!`N8i8^k0`NRiH(T>bOi5%d6&i? z-q9l*PCMa0AvjzcdJ<#1OIL^^s0|lsVXO$bf!T4GRwYNGUXfxUHD)j>40H|5S)_d8 zv!)E9x)L>LS!rq`f)xr+w9AgFOB16Tp8SZp8|X*RM?K=fs_4S?_+)+lQz8~!AWTDK zY<_&b5fThst*8n5D3V;dq$K)jK&c8!9Q=UBB^J2cAG@50O0J3bm4wQZzma|ff)j~i z_#w0=W^N3PV3f$l;l_ZLb8$HDkK+8qko6s{n;To6-d)BenXfsI6Odi?aSIPO52*`S zg9?3B^F5tyg8Te?1K&RS@^hYL52u^WkJva5V*Yj&$clC zM_W#&&Muz+tHr;$OaLU{ABCyyb8ZpwumHe3BLG0~FD#n6IsAunkC0*N{Nr-uNI3ftO#WAyg^RD%{3H5E3~w~5{A;Q+ zZegNg;r{uCnb#q1Gl=M&oG5XKF1lYo#@FfV>kK;$4)ddWyPMnVOXK?BVJcZX%*f!R zbnQ4y;!z9Jf6X4`dQz?QL;!Jh!#M5dv~w=#M>^dEGfnLCvwdMrLY5gXRphGN{g7{R z@W=90>e|=Ceuz67T_UBHhcB`hfhYbH#|^t6RZ#qlfFJ(Fb%SMY36~DAWOS06axXD{ zJ*OPHjhE*soyVyoD0bBXC2kKUsHJi;t>zoo23dIayI3Y9VGX5oFH8CUpIX?6uBRwU zgOcMQrzA&%03a8%WE=G2+W0PhKEFA(roBUEII>`O_AXy<-#a6N+%(t{{Q~g~XE)-KjlF4@4`sk(qc>ns1Ljdf$w%^+i5?bG@e&dk2tNW5nO4 zfxKFxP!#dc_VPOl`mm^!8)^zBX7f*qZC;(bheVN_%+~SwB6ocQtq55ycOVD=@o;!9 zCsNPmiEC8-^jJ4xLlDVSH+=kHvBX4HrF!atXao2^zkbDw66P9;V0*YPlqY+2zuaIq z*~BlpX-{VIu^V)>xJN9Sg2u>wJ$&riPjz*KFl};Wdo%U+z~wrOI*1QSqx>zag(Pl=O&oElQ6dly*e+7y; zyA7e2uze}Y& zR>lWoTg!GYbd7JflUqOHhAZb4g*6R-t)ngmgq&`4k8Z3>%&+T&Sa~zqWaoreU4kzP z+5%jGwOc6(k=ThUHK}7MR24AkJd~!{BYKpzB4;7sA%UiesJhy{M&P%C0t^-M5odOP z;@&}-S`?AIXaR^2#}=kW^=jBmAaS3NYA0JkI^bL37RNsv&VoVtz=ED%Y*92l>*nP@ zqhr;zY_J;oLOUWcH%@GpL>i~Ljiva0yDS_%&1Gi%Dw-Y*qZR$+SgS=@b%+8nCO+*O zrZBBZ7m$b`Xn}kvw8^%H1Nr-INOevPd3SDvaWlpsZa5fCdeNFQ)Rb$S z619GZTCY#&kV4U@noCE`5zCaxT#>m7dbHkY+%63__KedEY~}+untAZe_c;9$(MSmG z22E4PuVFZl^?>n6Zquun8na!iUyH`z>pl^$mT_r5EgiX4NqN^ZFdfhBMDdfsxJ7hL zZJoIP)}zwV);y5nk3T-4wI{iWpq}7?s4)Od-LrpmJ?wkelR8BrT|x>h^Y&h>X|MKN zAT|u!-nl9s+6_+`g=*<09c~1~NVpufpBGd-44)Bv+_B9zEFV0XJgCm2$Xy%ymy)FC zd7XOi;t18ak%<`oaF9@atLwfCQ~x)`!V1AQAS&}=qQLl`NtA6DGb|*ZpUjaqK87I6j|3453rQ;E}Z!o2pjb@zF!v$6bUa z7!j6`b=<$y$+Ch!H?tbQZj7>ro@j%*G}$+)a56%pBpT5Tlv;m*mSnFP$oxkE(X^JJ z_sFvQPDYzHm>yOdf==jdM-Zm6M0ax`aKyPpYK~o}G(5OlO+%7DvOB@WqKw_&74>BO zf(f$#x2PFOh>fbg=ed}sI1nA&O%ptY2Sjc}1q*C1nj(ymoVg_AxKuThbM z9dMM|w83PC*F1aU&)Laf+Q_<+D9g8gtEov6PSORl1r~#rZ8{XyukSD+cL0f(cZM|u z*rlU%9QRH)Mk(@0^9{N|Lmef#qW>ZBoH@egCmhVr>lC&|p`9i{RO&)CmSD`Hcwb>f z?|s}_HJ~kg`#Qpa*n@x&`(;$)pWLrUgq$-I2HxnpI_hB+9U4kt!a!{j$!Mvh88XbR zvm_^DmLCIiCD(2k{1_Qn$nyKgNd!W@(CK|AYbVDzOuw8RJrt+wz|tOKYS^ruGzkn8 zQ8aU^`CXYzCB!bfDQH0nJG)sCf|2I5=4np<{p;?;s+)>4v@$lq(u|Pxq!*40L8#Zd z2P0eN0yP4scS>)YMzSyP%xSh9A%bcA?Ws5?w{v*+RB0Dtgqg~{iz;jLO9OD-wB$f& za{wuw?N$4OG&<`CTNPmh!{A!51c%AfvardjIhItw{s87JyvyB|qeCHO4$PYmi;{MCV?A zN`$qV@>&3HNT9*P9CQpLe-lmU>eZCH36c_W*BTgk!QG? zQj-7!cjhitEKD{%;D+|2mGGvS8pmmRL(mv)8+Dg=koyey@$Nmi~pwPCglMC-jO?P z75SL6P|Lrd!wpc?M@$;7#<8X-jsY7wt=5%W1wEg!zL}TIdaMlvqAlf>5Z&Cjb&nVu zsYSe$Y5Clw2KMp%N{-BWU0VBfHpK9%Yxl=t#mp>AHj)EAZ)k8INi8eB{VBo?w6%t+ zcEp7d?LAc$-13Mixs5i81)*7MSx3PR>isqeF)N}g_^47_7|GDlZ^Oui;>`}4Z2U@#Dv~Wc;F{8w3-GmHVBx!d4Nu zC#{Q6j^KBo1aH!ijloM*cdse2YUruHXx;AJ)v)yOA!5Jr?9yh#m*J+S5hJ2qdxu`? zLKsCot{p-mF(}678`|qTERdm3Kd0e?E&(PcAxq#9n1)cGZ6YzzKmWMw6|zWaKLQo^ zu#HaAtT&VfCth|0gIpyIb$7!ooXfMf5DXq-Hd6cSjnLFd7DCU3ujY8N;U87x ziZgplCmeV27KD)Sw-Ti)|6!DRqR`lHE#OcWqWQ>F{~80Q2?x=W95u>o@jQRSwWnmR z@wBW)+G_Ev7)r6~^c!DNdnwMx+WbxUZ}F_egR=ye@vaL~(3dxNnkz8q#UR7n5EEwv z`WQFxiaTZbF5#nh6ndAH*oizSSq@v)gBxjjL4d@+6)!WU(uo z8~y(m7yl#Bp`I`a4E)=Hm%#%7Q2&cS=dS`u_n%M?|5uFsCo#_!&PMD8`_tB6)&r!` z)L+OAL6m&0SV9;e3-!e8of#7nH={XaHIZhX#hA8zr~6n~xrlbGo&qcqZhbX%)VU{V zO}%Y1^5R!3%J-PB_xE`Z|Hs`aeVgvjo>sZ9blIc(_xA|IJdP0b3Zsfa<*GB1`$C%7o5i%KYjOw}<%w z4dr?o;8+#GlT$)=LUNrkVy=oX=ncZB78U!zmEny<(xPCKq*~y(q_FtK`>hbYu~K`Q zDZc@Vsk*?i!@_1pWWdtis-jKvgxJZD*uzMMfsmqo^~S)dDf5RqB#SaYADUV`C!{hz zcWFUuf$&4&s{z_#NVUGS5X<9|ld@QrEH!`sZOP-xWqg(8(ua+$+`Yi7w1ARvI2JJn zUL9FlsSy;!dI*H7CjdklIKOj5^O9+ujN*!u7NLw2%xbUsT}`GC*S<*O`eOLlt-7c> z1mOKIw|4CQ;0J@DN^gy`+R+kn^Rksb4IEC@Giae9BFHAnSg{vyo+;k1nu4bKJiZB% zE8sDf@*wg=q|d-SIUhw$S$zDX`v?Rx%$Us51rLg_X2o_{X?Q#6qKJ`k8&Ty;xl}~5 zrngT3G0-)2fTeE&^3Qy25QpTixgY-k0(I-;3NvCn0Z#j z63pHd|F+Hf(@SZgCK*dYVOi$J*I zhuHv6e1nSiMALk#>@$iplmS>VTXKKHfw@*{N|L#OlZDaAko^O(5Sze?THExbV-5W( z0=364KFFqxEMv2S{U>0|Myc7~>~x?f)R9IG^6gmO0{$NF;yq1u`Lkc25rlh>wN4Z* z>FJ~T+dYDRVRzaDbAfp6x&?DgnOg*}0ks8@xzSDN+Ii2Y$nQ~N?s7i9e}3j-1iMv?Od{jNvRXZvyy$%QhV z7PTFybJuNI9J9O{I)hDIxF&CEVNEtf%nGFLB!8dgC+`&RUCE~lq-l=5mlh9a0piNkM4Pp{1M+0g|TrnI1&8du^0344~QH>rqCvV=%g&TT#FS$M4JnxiW;W z@8;>^P{$ii zyXV1tK;C+Jy@r4~m|JL$F0)y)$1?&+k0RK6I#61smi@T`L0#*U=CC$mLk>vqlPs8q zuvXA&7a;^)Z+TENL%4D!d--RyT?NoN3|Ia6cEcY$Sk35zOS>$79lB$6Sr=@}7^~`n zk5-9VICc)74JjQ|#0jZW2kyf-%uuR#7LKq z6<1td&Y~?4+6iO3J=YQ6DfMy*-SIxbXHA0EB4DK;z zbVk-ZaF!|3C6Z`1*hP4tSGa(9Qn!k5FVWjPyAKnUqQZIj&qdlCI*op@7zsos6JoxZ zmk&VVaG#DQCp!q7V zU0Ov4?Z9e^_Fy%*`-*t*=VxWH;hXx-5HxnH))QD*{pK* z*FI4cLE@xy2t-|ZJj*csS6_DYJh~k1a*Guu^S6DKc#IB_4vPMeZL)p4Ibq3~W<&UX z)nQBQmVTWm7*ogl(=>%^`_1&wUj&Av{`yNw98Yq_u!kG+tnetOsNG52huHgN1w!`L zq@jue9YUJoH)B6bgC6nXF7f=Ss~g&lN>Wt79l0vh7r+f>zc`^d7(j$1enn>FEY1}c z{R)B>dQm_7f$Mq>ZlJP1FQtFXxldaOZ>1HAci;xg*?-9N+nScwstUXq9lJw+9m2XU zZN!!=4WoDPR&(!(385;aLH}@aBZhnZhR~nSvX8ZSwEiP)ro@ zk5YsBF0Q_9Ck%50+B@oQnh&GP;oEIpNu{b9A1MJjJFpbDz6a#tQ|j#8H{{1CxqY27 zW7UX&4CJ6pTfPh$k9+10qv&^R#E8Ed^bMt?;54(UNI*E3sUxQsmU-+c;j7Mrk6zF6 z^R6ZdMVoIvF}AMeN+P`zF}rbuF}g13GZFZ@#Ohf}q)K-=16)%A#VH)zb*vPq!qa07QuAU8yW!ZBe zgZEmLUQGn2paI5@f46cL%fyD{9+_LEU~*ZFzUB%kXMzP%5;pdN&mnHXBDvdbO+>{4 zY@#qc3nDO!k4tVaNjyu2NnJ30`R*gj?n=>i+K=0i%QzD_)WgB|nr*qm=_`n}heP76 zE+#0)M%fRKEt6AEqjF}e+hDf=pC<#NVIsCYFqLg_{F2vEt8 zYVf(2vlX+`3g9LUvtsirqmvluc4~TMC$oq#|p3kYtGtn0|f| zNL+T-)!l5JXqjn$pM1pQZbKQRz%0?|NlG6|Y1}@#{9I#Tp6owd_;6;g+pskoRQ#n( zp$i|Qs547~s1`uypY8}{=@1Zjt%WN$Lawt#E^qIDV_d1Z<=|r!(s5%#3FP`etZPZ@ zn@3UJdGMv1_bv;I3y&|T+oM1)2)@~*A{D>3;i-goIx*MCLU6v~CSYa`+loY$ZIoZ# zXJvhMCcm`1&^jZ%%H4?kI~HK#;7=Si*j_K8!^ywImEL6&XF`3xSp{z2QY|1<__;qh z#@;A!*GX4rer>Jw6>Y3fx zwhg4+YGGRYrTquY0T${BiWIs%TcVFNn{B?h9-1gz2ZFKFupn->_mVm4QGQc=1Vd02 zy(;}qBJAN+j8qARRi5K3G$Bm}lDb{)KqwY`@hG&XF>bX3Y{vVxp0!bXM||(_%~VN! z2Jg;{*49Z zlj}{`2Xu}DoOc*py!E*@E{YuFVHWW_g6{Z$?E}j>3th=Iq7`O)tv0B4ojV+etr?0N zQLT+{Jsbt+WROEN>H9xrKmQTs-HzNVA7KCO)U*26>8$@;XYx-%yD7d;=MC}dp7)wn zC32Kg>N&^EgR2kmYrV{NjpxiF+s3BlYTEJbTRVtd%Q(c)f6I#>93VBU2rlQEa2@Dq}CnY3#QVfjJ#P2Sde8=9; zJ1@LvkzZFm+NKSd039~arXpAM=?XR2vUNDFQyjo+_SfgZ#mB?e#_6u*9jzyK>+!al zOqZqJ^x-9|k8@2Jn{7_ogiA_OLj{!p*~0Y|>)LhO%^@;Hikc*mY{SeZHTz-)amaSQ;rjaWJA zoi>F%Z(^by12qO`BqKhX3sN+O3-(%E)UXnh1VcMktQi!%>1kcx|KeT6Cl$yq2;vG%F<;IzRPmSA$>NVeYGLW z1*Be!qXAkJ_q{IS?MTZx1P;Y3vBK3mEUvu9%ClN@O6*->{}iLCDhjUrY?mfvS085= zfmi-?E(2|SF#zYC^e7c)Y+Srltxb3acXIcijbl5oh;pJ`qS1U*o+eGa$k3FfodgjpO~-y1eURjP z5dBhL4xKUQ^09!Vr{I>7yZ7-jz+POdfrI#Cp%@3UXcVJw;S zGuohv!${2@Cj6{-eZqIK7WL=};e%XPC!?nUSE=rN70wBs|%BE0{BcshXJTG zI9D&bUtMoBGXv;kZ=uK*Z+R7m@&ODZr)#s5U>V*QeSKlVcfnV9c~|12-1ca^xo1*; zYh$@eu2K5Z1nQs-iG--Yq=ELJi*y5^K9PF~7>;XEd}24jfVntG@q@dmM6HnR7YvTl z;+AO*{esv_I|eJEMIQRv=;J*i-lP_tFdAfCGcK|;pO z=RPE~Zx0z{nZ6+)rXhHQ*0NfN^sc!;4qkkk$rMEKFfhNc!x5ZmPb9YM#b{J?YrI46Lky<2d-81RA5NWrPKm5mUVJ|WE| zPw%GsuGgm4wsCWfJ#uRU8W}C~aIp2>>9c~~I0JP(v;~vjy21T@04fB$b+VWokZkWV zOIXqX6#B}|bSc*CLT_vch|J`Cd0vc%;jg;C+gp*Z53gh;@yS3k<#z1(Th z-o6=9p)Gs|ltGA_=~7nCv}tD->M(7_%^LJH*v2uVdDOX~dZGh?{G=TmjHzk$d85}G zG;k45XhO%aWq$k|#kGEAt3D5f9bxWCB_k<8s-}loHpM@CNU{pt3FyM%^t}1mm?`5= zv&QO?6i{}ol|^(=+^C%#zJPAWm1Pt=HAHS~4u$BN_s(0d!r@6jFDbNfZx925)d#~F zp6f1Gl4Z@p>%}!pV)@WfL8)v=nzoNP>>B&P> z7O9HZHBY{$w%dP1kc<{RDfK1qc-E^*wRAoJIAq%6GShj?auaSR!vjakRZTAx) z)t`>C$Co|y8-CJML?7yr8*8$Uu-i!qcXeUI)%9^wUZ+Ls!5kaLmLLOH@N={;AdNDQ zl|_Xx?|N>f>aeJ7+zOGxK!HZa)vbozf|nG00odmGS3FXuowtA;ds;3RKXylFopK-T z8NrF&fX1GM2_MEa>`MFiZk>9-EC=(a$G(MsgWWQ)Yej~FstE(CbC3}v$&w%o6}-$6 zN$@2xQh!pSCJD;weAUSsrEjom*5JLcStx+-5qP@*0yg1;l(#%X6n@ZK;DXB)E| z@slIW89z}~UEv^xq23u5zXB!w;>VQ}hwx8i*u-_>AzrO?N72f&>i$n>R~=T>_OuTm z-QA5eNJ&Vi(jC$*-HjkfH%O;|G)Q+CgtUNkN{7UeZukz@dw&;Hy!yejdCvLgefPwg zS$nZ(W^!&x^|e#?$Hb^c*Eky>9MCeI+`h@eR=249Mc*(h$y=gv+*ymRCwVj})}UDYRo6y6J`VC*0AfGG(! zwrIzcpA=ISWHnP~_Ih2F#I943X(q zs5p5j-^DbdRuqYhLZVyS%)NIYaO6hIeaEFf3qMVY$B5RLqqsB1k4s08AYIxlDxDCp z&4LKk-xLo;qY(0Hsz||SCF-Ot8Mx;qi#M%B&?~1)9L|`~v)saZy1Nd);<-rf!AMp# z0^G(bjzor1x zXOQ;29~fx&EDmlJSI=iqEde_?hOk^l?WCk`M}wUJquYw{oINniH_6Zsj&G7%L%hdwh@cE@;{+yx}D$HRwhgFRaSFD?xn)K_0+0`nrDr-#Qc4&hHFcspZ) zDW0IB7)@(YCo>1>(gXpU6&}9}JY<=WVtmgz!tXU?0!@BUW~#E$@bp;Iw8DOjjJ1|f zt?jLl#LD~3NX!Ad4GAqd{lEo-VLQKlZq9LXUZBBt3i_k^UH&%3_H3BW7K8V3d#wZ> zNC!%<%9DHZ;X=D*7Vr{D7o0xQVK#@64_RqWGK4dy^8~C6>S|E9jOEGt2XQj&vP1V? z5DWR`KJnR($2DW1ovy*}>MaC^kXZ65aUy?-;SzODA?hQF!-S@1i*h>06c=ymKaa zz#DZEz!g*cEt+mzK ziC=sWA50OmF9#`4W)60^loJd46}Fb?vmf%NEdR$wQ-T!TQJbX(x#g^fZreq&)UF-v zZZo_~G7oCxhxnHmD^s}(CHVo+m}7Do6b}@$q*#J_z)Sgzq9nr%%XV5{EI*JWZ1Nlq zF4%!%eBwj3T}x$hDlocOq)Y~lP{x7~zOU%s9~Je5A}QEgc<6)4KH?m!h-TGhJr^I3 zMPY%-3(e|~tb+Ie)y)FVBJ2wOH=J(AFhv;Y-PTl}DRdSR4uNkxpl1~Q++pwojz^Q} zyWljJ@1_{Fd|1*FE^^DPT!Y>2pzKa5%nQ!B6h9N>F+)m;EMd4LBZ~{tn-Ftf`650!&@zla>xB<~@4N9I?Uf6(=lu{Ol z3Ei0%@P(!|=6f(WnpJFfWhm|iFX~Ilx0AP+L8C_?Jda;JMF}d-p^P@_glbobf_(bFg*g~Ta#{~=Mb1VLP1wxRDz=L0E32QhD{4I_v}of*f#eUsI9MJfUlKX( zwemM2*iYK*^b)SbM@;(Tjvsiq459%AVT z|M_qh?QRSY0;Li6op8v71`%Ds9{R7R0;w~xZG_nm*6O7kSwA+Rd28b1s>0FPHrS{G zJ}DiGQ7S1vA`#}UZK;@hlZe8IJm!>uZUyWNL#He2@S;lPl4mU4hw_7SEn@=n) zXbK!E!8i_!C3(yTFFav?JVYgueG?-+l-;<1&)j9Z=UI`C?=V}4nPlb*Lg8$!vOibV zx-e-D4b*k(u3G5eB0uKEN zdtd*C`L{zRv~-*ApfT;7BFE*`&)g%&bs#20mmgDcFsI5T<4^A6z0*!rG?44I2!4_0 z5=l~>>HsI;G}X0n%CluR>}62yQ;k8i>UzGldF(zDvo|^THZA4t=bBGdeaN}ViEi%j zsdrABZ87G@^GVdRg{&vBo`xdLNBd!@Dd&$>2)>l57kS4m-q->jpy)IWHLk4iQsDI) zj^uHK)mM+mN?i~w+aeVv@kS7wJ{j`RmV4Ce1|w|7%(xF`%bf5ky^XE8ab3e__iZDmcC*j`gRa9hfl|du4_g* z^;Z<{QcZV5F(i>WXhz6=s;8?v36i9zyS`733I(yBI6>sdrZnZFJwN+NC`aNR&ZJ#vg5@eOWnA+mLhSRF!WD z8gdB5(9#%ND8?g+R>0moVW5_K`UP#r_dLB;LRfz57z=7wb;-(foHpgv1?Wev zfp#a@Hkub_`-4w(E{~7B$uqu4k~7C2RWEGudubmrzY6#eQeA7DdMbWk5Xu&ATR-4k zNEcO7ZBU_OyC|YmF`mP2o$7O`?C}Yh;w%|UV>(vVaN<~6hLR&prQ*ma#1pQFh##kfv2KWN=qfYVGMEL{;l!I5K zwR|eo1zSfVID4`dmtGN0ABa!-P6`>fy$x27mHcB{WiljAli29=k(GdRK^1h^pdLOH8-yX9Q@VHL# z*he7ArImCt4Kk-)HWQ=ib}YKD}pxZ&71rMLa0a*nr)r z80&5blr*MF)x}>z+zzk(xHGYpdr^n;R;ibSvCa^KQNIsOdW*dyIL9TVj9&yn-h}smwmK%so z`^U3#xgRehu{@N)92nxj3ehNJ+?tXquCfl9+{|tovBzo5ktIeeE0__?eUmDb0DF|9 zw6IZo2CLFXW~o}P#y#337Jup1o-iY*%=rGL#vbfqgkxsP5fFSgCt@m;PN$NeT5>^p zz*Sy*D%^IfY&lEN40qI?d&YCvhilLL<1)SsY!jBK_u+f~=+5nh<3%-uuVF1w?{OdB zjrJoi7=N@S`*0ReAbpp^Ch(HG91}l;{@&_tQ4*%wdRZ)EoG|cAOshtxIt%zoIo3eF zf#1mF1^FglCu**U&~#)9Okt-F=e{yMvG$2b8{?{Cn-yQrqPY6U=rNYyF|kw9b>D6% zaE-iI?Ti6ZrEptCCkPq3G=!J57XCWVLCvSR`-q_1wJV}U+v7Qyl_2cLdX!$)MHtBG z>fFohbfQXZlv{(?Jx?oB6`Uo^S6&I}Vb5Mrl0FJkSFPM0 zo>VZHA^1r#mmAtC=|aCqvuQVd1hyK zaIx1gI9f9E5<%?3&dungZgOaeE42*CQ}yVCBo~J$1f_blwAf;=zOJ9Ubc2Br-1Ka@H*Z zHz=p+;Wf-S&-2veFl~1#Um^^(WkulbnhkaqI63BYPQ*xmvODbP-3_%d=h*=}5&LLt zd+sMBgS>P+x=C`+R83@KB!fz(CflCrp)Om~w>U5*Nc03?>pw4Ch}Tyy(nZaTII`eg z`|!mWB@1IWyP-+r@JoC>ZG2nmxryKL+mJDXXdbQb|k|`k(Hsf-5->_%}}TGgn`7Y16@S7!QHHpyyf47 z%H7OJppsU*_;`I??V#*2Jv!EH0< zl&7M`7_RGrbN=Xo0i%hKPuuh5VQzaDf^j*;h&)FtbRX-diO(*b7x-@18UAfT{%OJBWWKCu z>>U7L7zqF%|23$IrJlim6%D>twX~jON4Y505p*G@#eHrDY0pg35%5lWQrA(T$Gq%4 z6O3r4MJ7wOxDsAThv#XyH5yI6m3Oaz{uk}E26q>p0d4slac?~Bg}6a*t&F6z;ZI5F zkEQWEg9U`gJ(p>?wdWyR!RZ!IXo6H$xT;WRZAZ+R$aMtZ3t?2^2udq8AuE(lmCO(F z?=IyA$JCAFLBG~Aos;0_@Fj+ob=i?aiK^PqV|b($Pu6&Lz{AjHj^ZJDG}vpMJbB9P z;!+lfwGF>#K_9O9ShtI%6QB-54N?}$B{j?qgzFAXeuh_;z4q(@8oaGk{B(>NgKNROVzUJkx+95G27 z;ALyh9?EMS(2UJAWH4V%i$cJ>JNc^d(LtC3PaK=DJxnCn+{EVsm|nWTqQw~7#lA^6 zdhyxAwsfupUs_^Fs?uiv3u&eR9*qwWeqVWLyJ^Jlpfv8yQ4AD6;so1q?oy~z5Id$G zoV_d%BVCNS+lG_gP0veFMKWe9(fwudoY`>1)s1~D0 zv78h&b|!IEqi>v55}Cg(iCLb2%8_fgf{dg;Krr1Ig~e+S*!2#rOB|Fc;SSHkJf|_1PSGkJcq7PrGm1vh?1%w-r z%iSGfJTRIHNOn*~cSD+UBQ&YEFdIshs2IG%o>aVOV2!GW+vu&2m*~plO$}6oLg}EC zt+j9+-br7`6TH+6I+?0>-}&fA5P4rPVOpQimG>x_kw1)~gvMn)fv!S}36kl~3O;Eyn4`avKvj!o&|tZ)UGa6uNoA4hTI<4j(!#NZp<| z#s0T);3_TZ5_)j;gYv{ZP@yx{4-wDM)ZT&7)XMaiIWeNw3{*$&3v>(SW$#y`%&nd! zQZPx6*9PZJs%lhQUu}<7!FcO|2`%9^Iga~A58UlJlIDAlO!{@t3sgVhIA5`X?QKW@ z!-QE2SeYQXS^JDqQB16|;V-kjlpmXMW&_DMxx`$U7D|H}6;nB9Wen@ha8bJ zJX%dTlynCTHXhRlee@AbIwrlFgS&*CZfsvC1Scz@_u=Iv!N7?i{w*SBUo6zK0BL6m z)N_CcfCJJM008<5$nw7W1S+9m_$$jWT-8=EF|sf+f&SWA8<^YM7#S!lK>{FtQceDi zkt?H(k>&3)K_GsCmI2vR1$2>IlPSyl8SL#$(t74b#-(Wkh1;|Ag+)f9L^d0cCIS} z{i(y1G^uW%fEJMA53VoN>$|QS-^bz%Ymr7{5L_Mz zo%V((-W1=X-%uZep^?*X$K`KP?n)Y@1r1*lWB`Dd9st0+!6!-iJ)e}gu&9ip=FN&HYNv&q6rcO;iNu=YdsK(t4)!CsHMI{x z%ej&7YQW$16j=8YRD07WRt$fSy>|HBsMs4kn?ng&aI*pc0L={wRnSzy8@9aX@ZC`D z8v}KJFP@B>6cr7ER$dS&dfW_Kv!D#{J>9hdhM+WWbT!2A_h=faxbFf%b(y-00MOp* zy5f)&f26rqnfcocjwQXYJkX$Led+IaCyIKvG8kQLR(@ZK4{Y#RR{?Q?=zC?YnEc3L z>}X}+U}|l}U~gn#XY>a&&~EK*tstAo69WKuZzxOD>PMQtmGw=Of5)o-o?UJZZNF|8 z6T6>K8QGZ{yD}PB=$TsDGyW;p&Dqe`xh$Q2!lh?nY6!|%e_81N;n+84ab9OL_xO?R znq&W-J6uJsn*(F6Q_zHbPjNHR|3?730tcmv|NUV9?F8Qf7*6{4;Q#Bb`0MESZ#ci% zs`2`ro8At7y>a8Og7CjIH=D{`r=iTcRfcOV=6;XmW-qksEW_Eiviy-fu4)ecXAIB> zv>Wy?&i$U{Tf47ct-zlrs(@6*Z6#$VTUb0_a-cl{0he{H~i zkK|_2{dJPf%G*h<9uuzxdQhtQ-DGmJ{Np;`VDm5ez8zEkw@_E>@8&W2brO`B?@4YP znuFl~V|jn?PXBDEzL~w~2l)S;d;j;HUqRnI^}c@Rr?)}hTn&HtoQ{8EHOzkgUORu^ z{+~JS%>(G`LfoJICBeVP(f_TjD?8sj_qk3)we&sFzo$UA85t6^a{~bALBA}h0KmiL Ht8f1YXPmhi literal 0 HcmV?d00001 diff --git a/dependencies/rpm-specs/gateway-rockspecs/source_rocks/lua-resty-url-0.3.5-1.src.rock b/dependencies/rpm-specs/gateway-rockspecs/source_rocks/lua-resty-url-0.3.5-1.src.rock new file mode 100644 index 0000000000000000000000000000000000000000..37ff0edf100f941f1512422b9348cb864218e38f GIT binary patch literal 11267 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 literal 0 HcmV?d00001 diff --git a/dependencies/rpm-specs/gateway-rockspecs/source_rocks/nginx-lua-prometheus-0.20181120-2.src.rock b/dependencies/rpm-specs/gateway-rockspecs/source_rocks/nginx-lua-prometheus-0.20181120-2.src.rock new file mode 100644 index 0000000000000000000000000000000000000000..da996f3eed866115793d9371b09e75873fe0e1d3 GIT binary patch literal 13805 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 literal 0 HcmV?d00001 diff --git a/dependencies/rpm-specs/gateway-rockspecs/source_rocks/penlight-1.13.1-1.src.rock b/dependencies/rpm-specs/gateway-rockspecs/source_rocks/penlight-1.13.1-1.src.rock new file mode 100644 index 0000000000000000000000000000000000000000..2224802361a2b10c538393200e9fa89303f8ca3f GIT binary patch literal 596808 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 z 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

X_-ztPTPwsr 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 z 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

6t(**JU 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%0ALo^AO;@cOBRr&KoEZlYW$_Ge+w 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 wHpSL_6baG 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%0D0>{HbAGuC+ZFo$n((TvG zwO5%ENrx8x?^Dw`sTd`v-v>hvHy>?nZXBNoq|BCrmP-f(2pFJInvt?nrA^=LxqSmUrffKFEICd zzLaQ&JzBpCTy40vB(M}~kyS!xqopbhPmbd@xHnI+LVc*y9gOj8N)t6&z0ab+cl9cD zy7V5S!M^|M(KcXEoRXlWZ2SJm2{NYID$F4b&xuH96u0WxoA(gq>PW48Q`LkK8Tv(h z#y^xxltOon@xFpc$Evsm)IX$>@eH`fBb}t-BP9M@d>Bf(;4a6>)3{DX-F@GrLGO*y zOG}x&ywuYfG^Hplf!7k`Qv3{?u)gKybkpB7=U7>H%h+-QB+y;^q0Klp5f5tf3l_wN z?VBInWT5WWH>#wnB&|mPQQ~LyZnHr+V8~=1CKbEXWv%gYk@LgxB$U?!?x;ph5c-%w z3cAfPi)3M2cJB_#Dk#^oeTH63DrenSXIqhd9X)zy!kGXC2ve=sahZma=p30fftQW$ zoF_MR%iLpP^iAvV_C6%=#~1D1rS;@gOlj@W4s9HKol6vSME5=;Sk_{W=2Y_fpHwO2 z#w0Fji)s2;&QY;oh?T`x3l`Y*ptu1Z#dL5+%g1){9ChP9oJGghao19(-?=}st0Zl- zl~%Hn=@ny3jUHkJCH=2#-8|8;uIq8(vzKN@evdA;V}$3KfC`)p6sATb2!2DLVqR-9IAwm@C+_IfKU>HVFLEwKLa^XY~VGX82Vio z&U$ArQf3wf(`?ck8p0y?wxHy4uyjgbd(;Bv;hJBfcaeG&94-K=;4R2WWZ4S(Kl--# zTuEtUt_rC2y69d#1HgrZ(IXx3^K;E$5T>TBDjnpf%T8hR;CDC<0B^W2851r4{#0xQ z8VL|7z8Y%PwK*q3L>@kf^`xi^?|?;(f*ovBX|p9G2*FF~de(qX$ z0I}b7hIuut5zokIm;O??kRxjFbyLXYA&E-Fomu0ry>zz#gVt5a-Cix zRum!rq5ke8^%-#L1ur4Zkjl*u`lS!;o%O!%l&Ex2BVwz2*C9a&x?t(uHzvj&(P@lm zI|oz?ga-pU3QXsgCgWPdG-;7F7`G8=xU0-fpC!|L&naQ@r0?+0nO08=xRvwTRKuXT zM*}g!`iTT$h7qs%CSl~B-6&g*Ni8#l0b;FZ?E}yr0}7-CM*Rd-M;V+;#sx z+$&)Pb&PPp4)?;`_)Zi#2(y5G?A2?~IVSZKp}c{Gi~VX1td9onD*vA0?s_eHVMP;vxT> zCqPBlFcvt#H6pb0$;UJouMyZ_FZS>wee>{U{X9>LdAG3!6D6;k;*wKnG5QNDeuTv) zX|oXsbF0X@T7PmNDx5r-@y9LM8A_Mrox=reWwZt%XxM2I5Yf-xb5*6w(bO`+L4HAx zU{-LYeC&a|y-cE&)km_rJxmSqn?g~j$k+Zf4cY-%^pUm({e9ME-JRlOr!#NZ)geDk z+5nonm%FzEYt)Ipz)WE-d8GCnu|MR!3qrH+!0dTu2Z0}q^Q`&4-8wrdDVe??9B#{TBd4WGdHA=Af%sT)vv9jD{Yw2 zT%r1GKm1>jz%(XK2~;w(KJjc<$2K5-bU{}N3O?w#6zAyOGBY)U>F9^FI4zwXAvlzKJdKbuQI{j!plTJCs+1=acK2gAaDtpZ(Kt>}wNAwPU3M`TkB z!~wLS`w}LLZGg;-(K(qsm;K%{G5qlda4BXg=o;G_FLrKC#raVHPf;#X>YUw@hyc;ZnHo?^s!dfcQG3Cog0&y=2n zn3nh%7o*!2g4a>at{f7o{R^(+nt@h^3tEJz3XGD%Ytd81l}*~ccII=7q%Lmd;MX4< zlbx}3VOhJdJg(2KiI|WKK>4QTglst#uG^}y1>gpNoN||0|aY;!m698kG zPTCe{*6z=~%wDfdcv8X5^W}he5@_&E@8?{geserR#pCt^-UW4;I2?KbH3kN(p8U(U zEDbdGsP3Etu#>r{?wmHWxGk{(s4a*&nu>bfYITSxw&pUQE(>e|7tuezct-plJ3t)Q zAufVZ@_&&4WB$s)Yd6VeEp>6yS%MSTChTCtEq6Ss*5|ao`4Z^Sj@g}Mcsui* z2LcUb%FMe3dK@DO3=Kq8xXnx`SW)|i4ErOdsXEaKM=j?Ww5;bMEtwKfJhgMdKdX$N zq6RgTBxpb>vO+L4L83Fzr{@C@A)jXN-6KS!Z^WXS@k z*b`1#ejcQ68`Hhr%&fYfKgpkOrWg82sBkzf` zJ0H!doZ46*uLd`E2hayrJw06)-cJD&otM}CjQL=1Tou+YS3(?UgXqrfI)Xc4mFbSCGWit04;c)H|Hj0 zc#P{@6sEB;j?W#Y6r9}>UY(iJHQou*ZuY8AEdoY!y5`b|-IQ$d)!9LxPp>(}V2O_g=y5V7qg?a^R0QA3FJK z2IzNZ+p+HVE}UEzAxLO3DxKx~()~q6$xN_Yn?z(ms3uCHi*Z7o`;Gsf!`pW#;Mk*o zx%XYr|DJs}wXin%Uz6LEWGUM%dYI5xPEfa|2p@kSz(xp9|H4o8gmZO&n!kzJ0tinx zq!jNAK^QLn{V>z3zpx^ID=FVBz=IXIxTb?-SGdkh&DO&C2=Z-fyuAFa>LsG*dl%`< zR|D@C!Pi?VDL?vdcSNDun4UYqctqy*PVP~G-)ya*bnb}XmXi3)#Oi51=C+EBGW~@E zuNSHx1DdzEIHP9v3SXm}(LX)A}0cXMrH4kNtElfPjxL-4 z6n(`B6k0N<1~pR&i_ax=uzaWC!wPYft3(n%Bdf)zVs_^bzl3<;Dwioer9@UfTX4M^ zi5+(ZMnN_(q7!Cwgf^EW#5dU;-_HIAj$s^112Ty6=TvcLv( z=jwP&eKnS-5V1FiI~vO}rU;Xq3(IhqW2{C^RBHz_7E;=BSQLG+Y`KFcuj{w_x7%Iq z55ZoeflC*uPTmzCM!Y5FBSh-w_228#d^z>G*ecb{@2wcNTV_MHMF3kW(h0$7H*?DD_#X9vkkA z!4T>)JF4swm4~*YUsh|io+oYVy#0YY(p3FheM0Xj*QJ+sUP?9b;v+Z<@u4e_yBakE zK06_(3el;Kaw|d|WlMpbz@lianGw~2#D}h;yW3)@z-Fjhcbh;af{4f`xU^e);jJVI z$OM!jmz(^|O$CZbR9cwuy9IDhv@j$B1yJ$$(IDZ5etji7%}cu0Y^Oj#DqY6qU}~$g ztv>x!$eEe4EI?OTw5=`Rw8>Imi=wOSv`uF9rbRZ)NrmNJup7BkoU$$Hs*$GCzfhJ3 zSY077|1g%Ery|xWN+P$sfGQM%|u(=*k0!l@7^?XqAj5;Yb+SOI#%Os;QRM5w9x z0DNYg1+YqkcP={Y6J_97W3Z=ixR=oDyL1~R!*UBXSE%AjEX9wSR`dtR7i--nQ*uo@ zVp7;jFgnwp3@Jub&L0_&vjroYwl;B7+Ta>}x<+DXGA1$ihotgC*0`HPWE?;2kHE98 z$+b*$uRD-8BX#OEx7K93yxPCNyjhL0x>?LTokFJJ;|>eCDvr4uItW z0e~+eklnXCe&l!y{)`n_$dk%iDNFrH0h57siIFN;`yWZlxH(=1NkIAY!a@nd=~!W! zMFl}T%s6CNmL)ESFvmR%EGJVljwP4AR0IiP}vG}b*h`b z$-&g5{@&8@8-c;d_e4zaAZwiuH0nk1Zq!fDp|0AF>hfk;`W?A>5X3gc0oy?wZ$3xT zKr(!$K*Vl>dk_xhMYE_H@&J&*Syy@MGcM1J775`ViVu)|i@cpi@T;ukMF-7EvP z>uZMk7?f=DI;V_ydOQuf^xdx4#77eyDjG7F3FO1h;}lF%YNVW|%oOwzy;2~YVhxyo z{_{{kf3iihH6R*bu>#+6ba$aj0~6Gh-Uw z!cgG`Ft`E&RMj_KTRen&fpE|MG@0JN0MPtM^Y5u0@yzfeQsXobFZ{|Qw=&r$q|`WP zQy*(Vl4!m8iPj3Aj8lzO=@tonVIKiJ-J!4Jn%TImF}o!3Pdqv@CcSNuJ*x0ts#;}} z-)%hvW!rIbWUW@Au8F|Z?-^yONCi{gS`z9Xw_qnj2dioNStqL>L&zYP8X5;CykY$i z_YQ&NhBNqMezP+OJ)KkCO`H)%2_AkD!c z$zD-!DiXN8yN)*Jjhb3oDJ+r|CzGp9=^EwKi!R|j2V=Xo?Z1>N=;K^`kc#64`>%mC-3l6Wrq4ckQIOk4=xPPw1 ztX0m`+wp}Cfwn?QLku^yX8alWC)8}qn)55{vKIY9-eH*X#G2_hcdx8n^mgGafNIZH z0jkssj}a7r@cb~T_xaj@zT5;BbO|`QySjR^digkevvYBDr+4%EI63-XD>YS0902~d z``v%D?xpeG{Zy%iot`!Y4JH){!K;3aga5o=ogLV}9Il@a?^i*?yMOKSKDm8@H?jQ@ zLkAlQ%=JDNBJMW}`vmvH55$94dhq<6z88VOl@D~c(Z~KU;U9m0{WKH%*RgK5AS$)bO!{Ah451bz{daM z?fEiz)ya112cQ3YCWMdkBh1bBwOjNEjn5g+O+gTl3!ePNvA1^~7xt&m4#Nq7KW-H8 zZGK$tb5yK;>AM#fY%fVaXAISNoZ!t5w6f7p+R{Y9F5p+g;FrDq)6I=#L?kPvxH2wEqZ^GO*b&2sQLrIjsA7DE{*_PeF;Io{6c_cqlXM3SowY|7p$DNuJIjqCX7@KvjrjI4kqFa zoD2hdj1^9HHYBoM>+WY#CU^2ABZl0vJP{} zCPehWVVjb(;C}uR_2{--Fpob;BH5eBdZb)fvPzj-|Ki0Hr5%pOGXWMdK)>vuYF}hy zJRKVlG+%wGs0)+vEoSHgRZaLBVz}boBlwP<0MrcHC7e++?}sq`41DpS?l#*9H)}+T2ZON^N@A+9RDwXl}JrntM*(RBNk*x**!#}%ET?s)buH@x#x2zu~{5ZaDlJQsP%rzi0ZV|ZA9(4gb#(QY~ry}w8+ zMW=$jY*Ad5ey%H1o>a!<79{{-&KNY&MZchao-};Azn^o^2-_Tk0k0zbZS0d7=Ra2j zhd4n z3g87*XDkR$KL==9zRcn8YC>Qo+$u+@v$RK-ERl71ATE+t*dcMIF0;Q4L02SM-lB|9d_>snFB>w;tID$CEa`k&W6Rl!KVj5A6U6Yqo zXmqxH;Ah9lMA6vEb|`b=EPv{fUo!yHWrrurX0-v`NsaK((H>VrC_DJpgZOYoIH>OX z2Rw0(9To&Jm%@aW2In8r@SGxTn5a6ddIiYV=&~#NSxHls$*5rwewbKIC2Dd6diGGt z3n&U5;BqScS1`Ll`Z7QV0Rw9dHRm7QHi`*p>P%0Obic0KRQ(tehh^jNX$PG#Hg2*7 zL!31dPt$HPS%*0};&64GQVr#5RYtl-+0=_M|F(<{>dQ_I4P~|(PsHo*i%Qz4zxk>! zb_H;bNn}e4c$0(+NFPd}G^fyG$SX)qxkIIs_x|4L{&TH$hWPo5M0|5Ta?D23{MA|sk#TW$;FgebUMg>%Nyv`& zQyfgEdluD59iLLY!lAHxbhMe{YCVXItg(kl-a>#8A$ng{n^20j5*PMiOm~o9n@+fq zpN#Rtxtg2)>l{KvKJ6$p4Y7)5dGbGX==3xTB6&FkQ>+NbSp6jIrhN?zJ(XH!QFBee z;=*Nw-*Hwjj(3A`fouHHl?CYSd9RGE)*PFc2XsB# zIg_P?yTXE#h3vI;-s269PX`-W9j8{KG}{iL$ELV)$56-EejmhdC0SP84>6DY%o)^aI+7)YhMSGhGX)M&;r6JW8`F1ZqLR&v+v)cDoa}T^|A{nHq!&K zP*iU?&nRiPUcOri0A_3(p%~sgjMD2;)H3#u)NefsdyYwU?^O)OPxkadhR_K%QFxU( zHDl|7>Q-J2ZM_#954#Y0V+lllX7no0Y65n&g_`MvOKvGlbXsr4WM{%Ntc?KMEWdDj z5mhNL@8_={ddPkqQSpk=Y3H%Usu;b88@EX>VvuN6RhSlR(0bCopF}M^ytm|{3ZTe_ z?sVLN7T!g^NXZ0xs#3LhJB!duDbk*t4N+Q4m+X>oPTK}1UDJF8syxa8g^yb2CmG6r;D6IjXoWYqYr_!$63V!?`CIj(*d@h>9T%4}!K@u5^f7M!SccZ zuFIlIIN^m-v5xY&b)(9v=0cUzum(6zTZ8|w4Ay7w2u9Q4)eRATwt`KI8D132Xc%s2 z8Jj)v@sWARDFb0TqlP4xrMWY|T7NM3H2q2rNRMrcj(-@}4T_2{hNiW<{aUs(`poxDp&xW;eN2qF^&e19R=T_bl=GNM@@i9>_;IUKphB8-9vuhyCm;A#GwFsB;gqQO`#Eeq z=UR|}K5J0f{j4f5V#0Kq1DQiXGw(1$gCK!1rBJ1y#|^dtK1Rb?sXKdZYt?v*7?^n- zj2RQux_KR4?7Ixl>+3oS$q+xv-?zE}jcGSo16bAV0hg+$)q?S~aQIObW_dcrFXIxV zlGf?EJ|+&Qh&{&Xj=foEw?=_9N?WQmkt;XYOoBn7F#B#>h0J%#A}|*!p!A@^4A|?; zFKYbJA+T386GgfY9KIrD>#CBY1Zm~Q<@Te046;BuW&p+G-oCWf^iq^I5qkh1GPYA2$iJR&3iaoadE_$Y-o;`Yfg|rR5}r|fneisPfX^E zF&qScaw&O4Yrh#vcWKqDd4O32g*xCX$jQuJT`0m?UUp!Bw7x*f-`d$FFANTB23K#L zrLzNz9*4_qW)x}UWf=!JC1W4-44(OuMcfW@$8qWfUDxvK3dJ<$XK;q0wO@uAXR#eM z-lJS1dNsd22|O`BKFr&>J~tQ#XU}jhjxV$+80s4hNx&L*4}S`w&5Tpx?0kAXI380S z11;UF==O|J+{%YS#ec$0Y709`wswODhh28vY9Yko_Jr$2uDw^g*{5H_u6^y-G2ahZ z%PiML!=47BR5TyM57B3bB8{>m^QKL1`mm%s%R*iXCsKi50S>TF9(V08LEPYOEM1MQ zsqQYv-{|MVNvYEtMj=fnE)#w`n^cIPVd9p0nv_m=ArxSNA+2%v94TJuNu?hzO4kM4 z4W?=^bBCn`O^6zFB+D(~J^1G})tXvCg-$5w_|jfOcCeRdEmyr4A)OA(3v7)NU|*OA z=pWzI9K0f&axKESd{mBQok8O28>HG`IabsP_+%HF)T#jP%OaNbS){q3ut0Z{=mh|$ z10~Ric&DH1>@jPOifV_b^_~Aby_ZtRRVV-WrM22M zouB;|R9|KJ*r99t^gW9WoECT|k**(Ayc;4s8mKfW*a763#^7`6t*WNZZV*=a{)~v7 zMh4W;pQXi3=>g@dXCZ1}tp&=k#+Nmb?*2x^$E(@nUS4C>y!(u`B5TETWHKv57IFEIq6$A;x4> zFd+J*nDV-bq%NLX@N=y)K48Uh&HL8O76g=OFzLbh%?U%NE2uxsi8(EvVFGOqeTB{% z*T^~8*d73$fjw0>wBs?V=LHXDBdqCdgL6011wU1JJ)t~ly7I%|cWMA5+bvhyq8(Ix zH(noB;R(mM*~@mj^))_PkFJ>A?trshd`W^oeryMiofz4g~8B@_q{F;CLznt?aJLH{0@~rRo%Natyt;fo&u6`?WBuC-%QK$~T{_3js@7?l<9Ze5t3Uw{UzSopD9`0k8d{i#EKePG#1( z9l1z-yA`Br30#;DUe5s5KJ+Vm$&IPn3!G5PPLk@X>(k+39zqNjzmE6S>Abu%7gbZnB{I zs<7OhRrkdJ&2<%u1qyNQiY>NnE864>_-+o%k$xHZgh`ruV_5i(?I``Tj^s=Upvdo# zCzsP?H{g{hpH(N-w9bS6gcZ1TBM*;@TMr_exrsK~aVz&68-JKLD3}GyfYYsX%at}X zV_Q+RmMs?znlxP2bWxkKhpP1>|ExKIJW~jGnO!QrmqHV~-ILWIKWc|o`7qdkV&*4o zr(@fNU6dQz)6yPKlKp$0U%)QdX*Vls8YZ#6c!4ppqXV9ffA8Vm@b3C3@KxE*{@Ul7 z*nOunS4Kq}g^ozbMnlO&#@1pz*y5seGbUn(A&HlVDPWo+&XY_rOE$_CLROvF9l!~y3T9XVT_aAoht!4UE%$fDcL!)?-{4s- zH*c+q-we8&!Y@(~m05Aryr89f=-=_lLW9TbZ~AH~qYyGstN$3Hs0HoZl#f6h6EV^m zx#&Lvc;fxE?MWZ+z3BKP%Y$v35-36eE=fP|uPqkC&gv-5BK(SdnTSdB+DjxrK&Z9L z>$G6Zlz~{V!sqk|(vAvHa0Z}akL{iK@EC4@XEqr_dHbe|l(~za4JWWmjsAH)3ZF?` zglUlm!1hg(h8m-I*N`1_NZN-xe?Rxg+0lLgdC4t<7v+!A=6T~`Qz<49et7G^VUYOO?sY`$ zqayOp(*#^zJG5vzJq`ks`;xX!HG#+~#@pbzRdn@hFmXD>$f%L_70Ft#5EeUr2|-7b zs~xY9YGrJF(nTl*}JN_wfPEn%7QBxr+`goS2E6>owdv%}JpSX*Ep#e2NiwBpTqYl~F5u-OfpUw%Z z6uVZd?s*ZVs*Wx5ma6Ax+nP)jU1}>8vISD zj|)k5aoCn?+c|n>RzKd-dO0(wf38Wm-iPaaeY$`b@VL~83F&)gR7y)P4o#gmLocr$by2b%eXiW9ylhltxyO;gpK~p^ z#6s|bp8f(CuZB9Mq(i&ZDUAS9>jYz0s*=_#>tvB3y#su*^026Vuo`6XUvT+L#hCfV zvv-8nct@L$@oLpIlFR^C|T@{6F9Q>O`u?Lwym9$6yae; zsp2^&U2{y@W>}}IIP>9q%e60#1W2|1yk0WDYSnn|%>h>^`Nv<^1i{1blG}XV^*b`1 z52Im@Ebmhs8%mv;bay`NLliWut=w1I>nV=cIpv^hz~fM}vJd9D;LoVjy1)d5x)eX1 zorQHUhqu&@z; zERw1Wt3+Z&DLZ=97{9}~f5R+69ZjdKgfMoWQ-=BU+OdvV4Xa} zJb%{XMQrm+N9dI)vFyF$klUOxnWqQVLT{RE#j4Kpm-OM522lrG5C?+PF+kl*4&DW% zgOURpjgl{UlEnBe`Ugv~4JZ-Nr52~%b&IoYR5=2gjz8_+Cz?b8wJ6T#;W%g1F2_e1 z$;a)5+=EmK$ld3IQ-ET5|J(r^H?Vy>{lO0bj7^d^;ZB zd;1zw^n1zm1Th?9UP7#gF*nHsE_~!Gpeof4CZ>wDmpHGatTF&$C4oV}KstdWLuZ~u zl?_73JVUNBSMX;trUFCgHWe2wP1YGaqKZefkW8NuKF2!086gb5tzAG-P0pE4qod+Cl*xp7_pHphmRXTw^j;`7-1NYl-WXG6&bF z-?zT7zecpIU!+I@n|g(duc&PF)NJ(WS)v@?+yiJC!NG&7?_SKSFGx~l?>Ep8Xf}iz z!wFtrphJAHC(Y)*;u&{FCsO~GAK@eDnKy);rfB@O-x&c*Y;@Lt0yv6aNcR+fnq7w_ zclTTAkv$R?joRqS7BP6SVp099h+@x}s^ z8)da=O+oAagp@a9M<*SmKq9<8phEaKqS0c;wR>G1wC#ge_{%ldh>p>8cg0<%7aOH$ zzU`s5J*b8hn+wyDF?IOitb{r#{x34|)~GBg{^ylcPUABNZ=>RtGS~u}wJCDKGWeYR zQ;BO6-zwWThQ6N*EHFt#*79C*wk&6D zE0lTj{YLj#540Oq{wU8VU!88?O%pX^k^?ovr^K_)$$lfSB5*C+HcqDo<7>lCJS5eG zfcV<6c)b*rrapGvij&aQQ=*I8Nn9W*$-R6-Na9V^W1C!yL+zM#-2r-ijq2M9cUdO( zv~(FYvF{)k$b@1@sl1tflfN3vEHc5sC^@u-_6TUQ9Ax zx2jdJ#zkT$G5A_nX~Y^rm936y_IFJ&J(*TE`Kf?&_*?u%LO}_%oP?zu{T#I z^{SzI#wF;k#jEYdPh^V*ghfOk3`OE?-1U8QOd1;>p@CyoPm`<-1grh9I7v-zPg_@M zpWJaQ3aWTf$mQS3!Ar$_e76`g^e@HaG<`Ny1l$o_5qu}{HL${@pxV_C3|!r0 zu-2sR9F8GX?k)B+CJ(nY87js)nJgsXwMi1@WuUe@N0XyQI2&{KisFGT22TEQ4VJ04es3b9u>pe8^u;ywF94ykX^@N} zo!R|8_8`^)n&io@Sz#^^ptq1wl1oV{tNIeGyh3*Khh(o<+h*v^8~db_2c2K^QQFGf zl)uvMg6PpzOh%Iw1#d5kgI)-+UiU&9tQf~GAlI%?J+B#YLs&Pd(Mg27jd5tl;V&S} ztG!Gls-!sE;);!R8pAb)$aJ=FfFHr$E1(!QO8U*oUm8gCTZysj@Si@w)KVq+LH$O< zIAst&{8zd2#(X6muNG83$y@&e@j@JnP(E$Dw5p|(AfxJ;#o#d*HNtAQfIYjDPlB3{ z=B_A{@3r1xX`Kz-_NgxjoQUTox*8XMPB3oegV3ji3w9*r_#Z?s7?3>d3e=|uCP=)!O`2HaIEIF~`KFoYB8t?*%MTN{ zDb9E{94pHP+U^ii$|DHy^;)bo!&=Y26Jhs924$D7ltA5WNeOTj&shFqwBP%o5PP|x zR<5KzCC7Z#+5d5*fk?G5Q!x z>tkRu1Ra2(d}oYHc|6SpeCr z`DSi8*sGCYP;%A8W}nwFmalBH4Nry@iFh7!aGk5Q`Xy#(txtbDCNk{wrY*B= z1K6k3Q0gXPP0ki0)-lRoFLw85$G3}{XY)QTL{>OGr>yo%3DvHW+Df5x; z8$D6LeIJk-=urMce-fP`iUK7;FEBHKks&&nlr>?)oa~hO{UClc$Gd(_E^50qnxt;S zok;oyVHRO9kT?Uib^q?-1(Qh3kkZY@yVZey4hN(Jp6Q*M4l`-p*^7qSDxEK0dZA{t zXkJ74d0)%mzRpjNLIe+m<+ClUZ<(2}vP1Fpq`|A2M&XkW{f-d55Wx@QO`XcBM(s-! zC4Q)A{)hPKdkB5F4X#I3 z^n?{MVm{@ZBT5YZea5&Tg=lU>m=XV^KDm0QkX&A~v*v(te@ev{+w~;zuSx+qsKpLj z1_#g)W5}iFZbObr{lN=o(Shp=chS-zEMd=)N?OpE%+t^y23_rHIPb=-e35D+P0g?@ z;Y&0*IeDJQFSim3n1QHwL;2U3G+*;e_!vlFRL5sc8Slap^!H;eGOg413$f}vDlh>=5{AlnjRt0%DUH3usU zmeX-i95xtLdvO$)1EVuzeD?ae+9Gku^7E|vi~u<{0{Cmqv17T4aj%kKK`atz2^-N< zyXwL?5ZSRbuvKKZ-|u-^C~^TSQGIn#uCbOWt}|ICr_uzea`pH z`6lXfvl89$i+$Z{7{@rSeWF^Za+$c>J7w97@mON#pjc0Ckd$L*ACrWeezUlX8#n)& z93i>lN-5GKj^-3NZ#3UAE>^13QDeGip-$2Bu-*p$Vk0Uz$jzJ>UmI7g&GA zIKiOlBLxMa{uCpd0UOcCZ9-mfbv&TuxDoD-2+_OKj! zX4162o5=#6M8tXjwS*IFIfQlqnWuvTAa^Hd?j0*1!2Ge5+@CwehKc_mI0@`W=^6(0 zp!@T;y>b`bKgnJyFU!Aj#XJ}YftJ=lyEFt?_JoIKK@}$otQ%Ipyk6WspY0F4;240* zwl(RQ7s&jEX@D@L%A2wyaYu)bxkkAWlYt;Xt}dXRe}W744NYUS;GC5iE{JWH+_u_` z!!|V|E*R{6wqB9wVAeWN<67x$d;o;~-n`zZj4PUB9KVRQ?<~5Ea4Xyv5)79SMdY@C zD@*5!LIvAL4<>m;bZAOHEP;`LB!MRer`iRkmh8ELYk=iN#2vtqH)tevNoz5OzNiD* zj%5=GXYb*ciFgn+rBGUYM?OfGlnJ*2CZ$X%VmD8~q+;^4U*I?vz5=-kKOBYMm#5>$ z_T~3vm*K zs6UejX|htY;--7KVS_ZU$-YO2J=y{NIeNm>$uDB)Cw}Zvm}lX?tvU zW`Mm0c|=}I`I3e!=ew^J9XC(RBLA4XF&@OON&*HNm@Pb=*mr*LaOQs*Q>R_1-pk zGxCPui~)na2&M_4f(zqdn~U456C8iuGh_1rH5<0S*%Qgs;al#^wYg0;RMYboW`$wR zu7_Ct6A4-0(TdwjsB4P(>1Df2jkFJ9E-Zq2~VX8ldQxWe0;}cmcbhm%tKi zPq9Do%B+5BAU9BFH;~5d9e$>elrwI3A5j~@xh3?mvIED6E0e??>~4WKn`=(F{sVDB z5Y=ejyq9NJXkzP3DCOWZvL_!BZeZDDoR^(ZiSaG$$_DaKHw($+Ewz#bgoucraK!vK zB&5s=LTumyg^`u@)`PiE)==)bY`OQsD*w(R&poTWp0oX(Y$=))cnzOl;BKd&AQ2lq zNs8T5=Cm!@>RQyCSIHOOwX_e(n}>sf-qQK+g@to|eP=j$X$&X+kXzuUmQy(&QO2*& zPR;aWOh&K4XSvA#F~9pxAnbaBvjQM_;~lf+y$L#?e%qIw`51IIgY z{1T3Y>bRZC%1-Jn+ica+&XjBDV}J~se&t%kY>abh1H9dm?Bz+7IPZ2tj%3-o{7tN( zH*KZw9MmAK7R@aulC>%L3g&Cbd{0T3lQ;i~iyRMlB(e>h%utJhk*tg-Mt7~pNnp%r z+Hd=CLo=B`&~~s)^*|I0Aiw28w937tp{0ehlD92;m(Wn`QIIuwWtmfUtn6HX>efOp zn_>pi3bgpl9Z ze4Lt-KLR<82ajO2{M|AT{{`s#+FPg{t<}#@P?iqTX#daM_MmfP%k>)3nRlF@22Drn z$SNFNE3@@PH$UY>-sL1=D#lT}%b%=5t~YqiB^+V*Xp_5ssk`nRCdc~&Y$x?I_R@;S zH`Zk+l6>`sLaELC_TIHJ{D8(RvB|lGU)9;p{*I2q5nSthr~UWHw2b@q%h^o*=CnN5 z?f}l)8*q>njnswmcheUAO>Ietu^wbA3G4w}+onsFf0)M(1~55CcY(u4 z4^m(48s8GxLCo#!F3U;y7eeoLb(mYT8w!BI^-LA6Javb*#jUbVI(1BzbWC=A$?o2E z2dg=g^O&1j*NWvKOV-04hz)$wqeKDLrU@joB$8ku^^_c( z24fQ&Js}=AXZ+sD5L&ol;oM!qaAXHXnL2mjsGGFE2MrPV9J^ts*%BgxOhyhH_y2UW)Z(ur-kZB4J+FzJ2--6HCGs1g| z_4Hsi;R)rp)RGt;CSz==h=M~(dD(>L`Zx`Q3~_;h9{Nr33t8ocPl8Sd+S7ghYygK> z0HststAZ<50qsFWyqA5yFPxjg`H;o)C*w=zPs&T?OTzi&T^}r8ESuAI85lyQNA*C_ z>=mnf8qGIy9C|0{75kR7rAM|53r#5Oy+Shwc9;_jN1kaG=Rv(4YIj@TC~9Mj>7~A= z`)`+A<2dK{XrE6OJtljM)Daq&O?jiX-8T^hF$pNWc!YUNgyz_~%oZ$j7o#T+HAnysdaZsC-Yi1?4 zO(0$E@)L#5#OcQUe_41lyWIcEKyum2v&6v}&O<1l7|u${&TO9Ss-2+u7J1X?&Yk{P zdV1I#&0x(%aR(tjkLbP>+1q}GGhTWmuSkSAO8 zV}LT*qJN2TUOIdgvGkj9YFK6zgvS@mrZ8JGb-84>VI>}V!d|(*?PY@Gi3HqJj~T1v ziNon3FXnXUP3N=VJeq)Z}b>>be2=KD63XDR)@`F$&-FTx z+;w@NcGxDQG1jM{Ifk@vt(Co*O1+##-IcMY&%}4;2(#<#U%r0D@FxJSLZH1QI$SZW zYXpwk+%$0;=orIjq8jKNo7tuB`}^7c_jM-y6^Ynm3Q-RtaCb=Q_~`XVm`HL6{s+g_ z-MZoao@Ram;Hn)0uxz!-tvr!*x<>1((2O$^2bNxMH@6RKo=*Q*G)%c?`Qhl>!hy4> z8dkn&V|unf`Y}KeYiCX%4nAwdV!5U zgD%! zWbLrWSI20OGmqzQL0keK5H%OD9p~T8)9%DEmdWK|^|5>LGlcTJFI!nRoYUkOK&Z3hPXUYjda$}z0H6hF6G$?$tG#q`phWS}uz}Ts)sNLrl0W`~yWTZW)sB(D7u2>|z~7qeH?BK+xoF zDl}k3TCa;>EQg6XCp}jj7mAhtxQ%Ra#fcXzAtbbam*Sggi+ND317Iam_)`>J(vH07 zrM7~p4y0#J|3HNT*;8BpvBCTe;FY{5p;CdtRSP`Rv4q;0%M->iJy46n$%wX|1{kr3 zYK{|D z=HBo1hH@g)zWMEE+7VE1@bGNHNuYyB9pNQBjB{*<)ydL(;EWVR8I*zQVuj0tbL6hr zMCncR2Ot5OpTdH9q|#FQOvtwcYh(Yfi9NazR;~7p5|`X_7zyD=km^56)K1-1Y+wBD z?W7NpgihH=VZ#pEI{vcgFuU}H1$YM&0}SmD#(9h?3_*Svj)d#3zmEb(4e(SB)G-Bn z6QcE84%g`T(?rnQ%S8ULjCZyZPOjf`FsLiyD`t;*ZIgo(srS8hg zv*Vq=X}B)cxS<29+?gD#z@&8MF0taZv65nr6S49PVhZoyQ@5GRFo0xsUj~(-;Yo~G zJj0;W@*U%O<*^Z+n{7YL(R0M%oaJkYWIM>a)-QC}r11zFk()P%$1^7>=eLS0)hWpd zhJ;DIx@6Y`g()(u;eCBSdE=g?=Xv$U)ZXBZBTo@bc(L)V1xFAdN5kTFu&c>2sH zTPcF<9&U0`gMTG6O>ycrH(&kot_fr#+?@|W$X1Amix z-sksIkY>~f^vfRD@LfhCC2i(mQ^vL}!?h=Oaj!LDjeZ6TqRE;=%bT8{TVnWq{ZCVfW z<5EJ?8~1_04Hw_^y>$=eJ)!FwIiH!^c&fLIjkViTDvot|DLX4x?|hRltM-)RI3HIh znOkqGZY1w;B5v|^!73Xt0g}vcG*WcRm6tyGyO0^O$OkVUy;IY_4WJVvalzsltt|GFYu_?K>yu5UCV|0eoTYErL&>B(&*{z{6nbu zq_*+JVa+!(CP6hvsnF5#`6Bl+AT}dmn|eWeR?D+h6wJZt;(hpycL049g4zM6{kAhIt0CS&nwJM2q6oZ-C_n9Fi~T#YOf=~T*f=kHT6F7xFcuA zJvOOx{$K0175&pK-akyQ9=ce%PXglO!)(c)*~mtrj;&#L#uPvBf43yd84%r$$?@v+^pnWXQ z3cchJm_f$T?}q$Sa8%OTS|1wSCoFqq&tIVhzbLKLk?67c&_@vSAOT^%V z;!p7FM|BDx*93pJi7nye*N8P3SfcjuH(iZumyeoeBj+P%k1+qXV1^Va&>p;!v0}SfMeb#F~JkcgQ zzcscq9Qh^wphdd|_l~na)MIa&FnrKYke|YT^L$3P?4WR<|Ga%fJ)Vc0^^oBA?!c3< zpF3}1y?3L5eDzi84jVIrIqLSd8++N#=tj|yGou@MV`R;sgic!k?!g0^)h;G2jgW;{ zA~n#-^#IjBM@`S|ctc@F`Mp&A-yR0C^)=L`@bMj~8>dm&cJfAReF^R-Co7gSm(6I! z+fkDn(D7gLwx4!Q^YFRWEjecPPn^=b#%6%&gvZT{ad3ax|F``R02{}o1P=h9)(rpv z>;E7xxELDQnEt=ug0d*aT-{d08(8yu4HmboN%_>SCFBIn8f>Y>R1>AWYvhZD4s zOr3YG)Ve4)@$&E6^?5&T!fCw8+#wytVs@>PM4R+z(4tG5o0%VvgB3@WXhk~}Rn1&9 zSBhvx=C@@sZ1SqTUhZyS{v!FQN&S9Z_&BGlsJv^$uTL-dty{Own)yG|nwv6yg=+u) z3kE)Z*XmW7Z~wJh1>>SZ*IwO^yprMD#?D<^OU|D;7GGJ{ykEO^?wm;-NQ1mS(9xr7 z(p9u&L`nU+R#TIP0fQSk7*!)An4x-IR_{q9W3_km~>T<#%b9_%eHj{6aI(o0GQfR>FNk1 zbHp7PsOT;W?bt$tCYh(HZeVPW(BJaXj0Kjp3RS<~DTyRgIK2GCO}Z9C75L@xPwC6o z%GjP6=($VLNWm^>r%+GJ4ynWor5r6&0>DHF^EpC{=^^{iQlQSQD(UE74MkNyZQH7F z#8xe;80FNreA-54B~3#=(ue16$dV$war=;<56C^FtP6eO6K4c70u|z;xWPJf0aQW-YF()>m1jeFTR3YA`2WU3kt5pe==1M{E9>rb#`oGOND%(hWL7ROgxa7x{ihz_X^={i%3adl$hqUJI zstVLfsUwmu=o1XXx{cTdX(-%3`{`4Ph6v-n4DcNaEf@h|>@2@6pi|@9xG@H{@WGb?otNwB$fn|(`tviV;@1U-g zrzIUy)*os0$5!NbfHIcYUTdHHAM%Q>V6)oDeNyD{d|mZc-D)lPBki%FtsEC65~HzF zrED_tqoBSGHP#45i%rmHqKkl>l1n+>Cc@?=D*dH002F|WXs_)Xb|7sF@ z33Zvosi9?>Pu&2$VXJ)_k^v^Ka=Jz+JDp%#GqJA><{Njxun=aYD%91!z|azW{s|HD zwV{gkLl8z~C?eaqJv=Tu8)cb1Z(+VZd;}5H2+~vO#g+6?N_lj$DcM?OLWP^oKB6uT z_;;}+tANRXPHj7eZKK3GstYZ#@<~FG^%)>V9%6_hKpPKG6UYR>V9-n*%^(H4=|V54 zI_n?=M8hy5%-U`SU`Mx|+i3HI8tGMmvB(MtGl2<^%N)Y2Z`@Zdz>;gKAjV{p5CIK` z)(-ay{Z;LXg{V(#(`*GlYynNjeqH-r;**o5lH zWa{j})|V|0oqJy(4rIS%6-U6+AW05B1Z~R}n_rNuVx%ROi~KE$oYeidgVD}yB$#E) zBQ;``UT_0o(q4eWkSQTz^qfin?X0gg9gz}2HVQOGhKAU`ky}>pU+uEG64eN1dqHG# z+JeYqW^ED{zhnC2l+=@x{vTSx&Oj21Crmh)QsO(RgY|6hP^p$_V~z=JgT<`UNP>a` z0NCnMi1xOnjrBs)+Mkm-rM${|V}ZO4wF;v`^1yq=tX^xoSo&MFP`yDmsF55BOr9F` z3nk4!BkL@Tc#L4hx2*hn&lG-KkC5RY`C4@Z_hTKUgN_)Yl z6voA(ujc7AaX=u|;u8%~^2sdK&Aa6B`N5jtC2%0Gd++kc1ql0h(2F0Ck_xQ+FS z{b=`_Rv(8=XP{#|3@ypH**;LHN)~y1{edVZ(Dsv(05z}_DoH^Q1k_l%$g1m$Y6^6h z+59B9={o*&ODI5P2*Z*8|~#$B*0THNLrh7>%mC9wl=i8HO)gmC#mAf4Fo$EF zhYbULpxc5%E30OT)?lGt7wD1E2P=Piva^T7Ka8JzLMvG@hC);rRT1l(QK@os;b-17TLwcRVXy96Xr>_ zS|=@Qy2~CAzys(I;1o0AuXor#ULRFoLSx)) z`oo$=9&0Tu`}116Gpw{0LQYFZO#9{B)SbqvZsI-t-$(iWpO5N$h_ev5+KmNcu9^+O z8!SZXEvCAP2!?0z>uyU|;!6bTY^6? z5#V?gW6xSt7-Pzx&2-*y87()d;2YHN5Vbfwi5NNRy3qS~^2;)iKT$BMy!&*QfPpdz zy<+(jNu1wtH_fx`ZDPy!5)hfF$Mz%66|p~Ymf4S-)!anx#2H2KqcSlt5AwymFcKRp zbgFN}=J?rx7lZtC$BW6$u6ExVC`0@xAWJoBD*VyFrj5CfpYX#x=l zaEZ3v5X%xZyL&L0%-naw`e6W+e$4YiOhQ5#;q^wY1_*)Cr`%P1f%@l`o6P?9?#MEm`(8ynAo*-OlSl!I>ARG&CHLi5I|eI^6AaNn`&l{~80&Va%^W z>Fx%aq|*~QIz8i>21Oxji9GS}(8CDy7es3`?*;4_Q?f=L-t(QD4|(FsdmzpH`Mpkq-5y}E&=p{ zEv4we&?YqWc-k#)0S!4OqSZ!t_Pgs}Z@u9TZ{Cm<*E#%`Th=qr(-pw*>$)PW=R<&v!(fkIPu*amp4>oaOQ1F~W&qxs#-M5;Jo}GBGVu!SD z!Z9DA!TLdJu~F{o-6BjWfzE5GT65$AOaZtb&@k_H{;oS|KmJ=fptZ0di8%(84S2G% zjA{&x)ARL#Via)y5WG3gQ)iA{2m6cUIezEQSW{*&hBag|L8WnU#$>}Sn(5D3<62#T z(plTP?v0qu@vl|pCGdT{UVr2~GIbpc#411qxDEE$Fu|**bb|&+O zMC4=REc645WtrpZSZk&VmeDxGK6jlZq)7ne@N_I^JKEYHKA8P&FidA6^iNWef%F8P zFUC+p-5)47oenMu?FRSi=Qil~Q)j?SeJaQs0asbrO4{h#qi~ANXD9S)2ZB^uL8R$` z4wcxzw@#_|DZT)*O|%&qlhlb_u*?9BbDhr2%I)y1`@~c!)^! zBC#ZBNR=XJ`@-(uIqc7Aw_P)9H;TwNa!nlh*EA6zHlX$G`&zGt5y{_sD`!3mGMc{e zuG*d_m_H{-y@{?N80#_CUZbgRF=3KxRlym-5MX@~0#9gN`eRoLf~d38#sL(7!V0z< zRd12kV-TI8Cq0rJK0F;8H49DxpRc%`3kmZ})}(Z}UqoX?!1ASL14GCXKpMaS1qSNf zKReMqw`q+PD!HV+v3~j0_J}sWP<~8pQN$KBTxp^HUlau-_t4j#u!T2~Lx-_ME9qJy zWE}xF?rzAh?1%i#&KaFx*DYnzFgBIDYIrDITwo#U8->3^4aFv|z#m{V^dY?M0DL>J z{()ER;)-Oz9)b?H!EOER%3x~+OV=th$wF+oE*3k-fjJ1JYg_oM7}(3U_>gJ zlaMNxdtoxQmCKknQb&Foysv3?>SNz-RIWIFndNwR zmc@)C0QyMN@FMr0KCx~kKjcFAk)qzD7AcdqU2C??5#MTJ$*`RxT{~jux2%UlZZmW1}XXcq``i`6n-PgeX!3CokYBi&RiJZqb&)Hhpl!%FY)qayk z-39t_bD>lE=AvE#3eIA>@EXfWuN=sS*@c(AV`YU~$Tk|pxlDWtl-0Z@JTPLokSUgL zQgpLt5AWUBcE5T?2?xV`xLJERHL%V|@94%8`d|RFqJX)f9*yozDc|ULFsr{Z3lFca zO~cs?z2C*Xbsc(5RJ||061-~!H|T0>-vcf4iu`Vfu3TVgn3VgWSjW7zuG@~nvGKbB z2CB9j)?FOfjvn91d?$|;97pDVuo|%81@N+o=X@voBe|jZJ~p!lOx14Mz|#A^Rbke2 zd-dvyt0i>{2DM(%H^fK5F=Jca-DQ`EIU)K~!9OYbz4@(%FOM(J&oxgW)+s_DcdC+~ ze-LhPTRaGiMn|8U;oDf5z{5mqGjc$u2gc$u5Q;1bkMw!(0I|BL@r?O}ZT(l)`tU;c zo#%kSalbm&=~_v+`#=g1wGUj1xToRkyoUm0hXff^8!d*(H+4*?I+)6=%LR;Jwd906 zSYYir?xwe)BgU9kTPN98h-y#Vu`RFOm=EcXaDoeV?=nVGl;{D|FE>7?bn^Ws4C3?j zbky&_lwj53(Q77oY#m1%|3>eq40H0dEo>JCzy!of0v7QnOsK_&~>b{cYa^XT;IbZnHTWow6&10;BmvL_SKk zul8H#UxY+L_lMIJHXJ@}O2NQ@8N|3yNmt$l1;oot4-H@Xa^$*dg;w5ZO^ulg6rY^j z;5(3C5d1uW76=~~X?wzBEH4>8zw+cVfFJzHNoOx&4A&Pw_jwDgTT@pv6LjjZ#shc< z7L>N(+y@p&U)Ocyn47z*E$J4ZtDbeV|B(toU1^OQdF@mrIqjdLF%U?{8$<6oTYy=C zEBXLH%~omaal?(-vv1I4>C@#iQzSLvInfeXBabFN5ga zKG;X%DN_cXTnskaV{a{i-YKJV-yK}-K8t-9eS}djaNS0`E^2HcqeQ^gZf2c_hpdaO z*CJ{hor7||6kpkxQr^2^%=I5Ejc1L^QS9)m13~ppM9S((2yf^qYXqa@f0yx z@VmOk>{lJyDOP7#+YFlnO1U~61FS4lWL=bQDM3{?+-Cw|f>l5C1pPn521m_l!gGa% zOz48%=}3n-4!Z&#F$?-NYtyV6sl-BDjB@Ke--c2mN56h{OyCdWC=y5V033 zo@0$LSr_-*s-WIDRsG=G6Oz6_r!g{?1jnXa{_2FzaXsejYavl`Y$XcWLQjKk8|WD#b+#U)h95SXa7#gS?oE2 z2d9U$xqM5G(b09Tk`!Ce{I&U+LiMDQmnUo%t>szZJt(eKQbhifIGnhsHN(Sm`Y2jN5C;%$ADq1DlOp2Wrodeu2{Twv~obJl^0H#*rP6aa5UU4y6QgN zH$vg8kR2LXylSi=NAlh-Gra1-D)$Qwuh7COCtDpNd<(O{6q0S)wsK3R##nRk6%+%z zD(tQa;%lElS)}>jv1J5D8!FmCCvV+^Z;(^F|D&+xfaB~Gp3UrP@k9}hTIpYB-2)b0 zl6ilMLI2hIbrlJ|*2(jUJeY@eP;9L@* zz?3jvTJU6hwLIS8%01zgeOgwPcl12JkJ@SHg$qb%8irlM>h_JuEurn%bw7gjhwJ>e zi+B*M=76=|Of;T1zrt9N%h9?N;F2fs>Ing#zycBz{#}rzy5>D!f4VI^Z{WaS=6d~> zkLt~T7l$pzVv4|2v+O%sL2Jpflg4wnT}DC%_qra99MrO&uw}E-bo)`hfB4t+Fw3Ga zRi*26)a8TO<@!31Z_}tv`4me)satG9lv0)6TzJS{xW>x2whL^3i`j1J zf*)6xpa@u^%P~T|B>_dXLNTIa$k&{Ou}=)%PGuxcZonvNGc=$@Popr<*_I}?adJ;n z$HtTuV%_78F}HOh?ZU7gvWN1BN^8lSVzjC{!6t8IU?*^vM&Cy@k>$B33W|(JV_E+6 zm_bve7j?=)k|~evpg`VRa6!Ii3fv0o*p+^x#)}CO=mm&M$LlpSyMB#(T~{DOZ=)U_ z0BMK0{EccMEbrZ4n8$x7ydga)g@5j@#i5^~1$U~J?tGzh@w zYe$jA&#c8BCkZ#Bxv$$HVX0HM*Gr_?j%A2a071&^#DUTAiRKN_XDf3cXw5JJ>vwV- zGykM))YliK#EMcRJaT8EL;?A6TBi%{e{tKN5T1t3|kRZW#1{`pU{uKI#F^tw7xSjFWCUXbTQ~xt zmrx~k3^pwGvoRP+PYdE3Qx`n9Qwmg4Lf*b8(S`ek#0*t{okO+ zDo9aI3KB*FBghr6TIURkF$QtP5_OSuKRV=Xz*TzOHjcBP>n?1v`~MuS`&a=o96t`}I*D8*UX83%b{m*z7w~ zOZ*Sx0bZ-T%7F`<&gnKt`?tnReTptfedDHW!c(QE&U4aXpX!E z6Nw7v7Kvp5(J>I)xACFTwOl?TjzI&>cy?T8n6QLLC-=AHtiulbfTMfIXSwLY?&JFH zgR1W!_nSMgbl}8_yB94SK>e%3&chTo@O#H6!rF@a+Q7Xgh~+s(f7_UTX9q!CA}4gC zx-~-Elea((C1-+cU35@OR>~0l19%se6e(zwBWUJyE7J-8nOMa*4_P)4lqe8y7{D|w z`Ur$`qloKY8zFGYU`{x^d0$GMB7^A)Z(0D`e_Uyjew8jiSE0Iy-k*O zW)ThZapT^T?JwOoYuM<7cf7HC_RIIq38hU%ylUUsefKhy)rg>I#_Ds8S9Tg$mM4T| z+~}e=Dh)ZOxFl6JFnb?B-K!)lXO#g#42EPl)+K3#b2z1Bl;WsFO6wJNwbbadbX`DV~P~|~EIlyKm_Fcvku_`wlUI*^@ z?Rl;iQy3fe6H{mbYoHs1e?igXZH-sA#q@_A5aQk4N1Sxm%Rb|IFTR~#G+X8S405lq z?!*6y#US2c1M2Yz!_1xnFMcGlzy9mKX{Jl>poI}P@G%Qf=eQUWmB(wl>ZI~H2scK`sLCDAtRawnAENiLTR`K^H7y-W%xd(3D6b<7V) z3Lj5i3>VF$ZIo-+Pyy7L?hcWa) z40{<9CbEk!$w)XCb%+E8tS}#!SC9Sbst>%o4&<<}_`AV!{kgGbIq~mx=Wz4rLtRF& z)$Q{vNqO4+AMpRyy)RK4UVjk*0GI^-Z)k;sp^L@;*Sph;{a^2n$dk9<=z)Nw87d|? zUnul=6HSBaK$pfr9TlXeCe}ES7e*|K{lUh*-){zHtO;kEJAJwo>5`1RyS%)7KZ~=I z6Oox>FN&v1Ni|vYRSS)X3W-sonbObV1XU^(4;N>k{^K)~Dv;kZQ=%prG9s;&X5^-C zFAcPOq*5rgNLuMLRn=W6|1U{S96!30)Z?jszK>f_FV#%)zZGf9KHDXcKU;@?A5Z7! z=0Mx%vWUdkQX*2Uoh4#elxIw|b|OT@HE7o;6sx5a)h}eUMOs8@qN-;g|DI5Pqt&Wu zVm;LcJXTRajVPiOeyC}aoN7gsO5K%An!+jpCZ(c^Y7o&6@}w6jGS0myq0Jj2M(9Pq z#45a1r*&wiq$b!E`=(4Fn34bp3klPxOQI_RS_sFH0e2MBQmq;34bcJ&a8)5Eeep)y zUy7O}XiJg$q@p#V?z15nMKgm68IQndrj;fe(GJ#~NTWs27-=>#J$k2x%H)_|xe)4` zL%m`N^oNF68)_E9ZEz5+KdWj0(3j?>Fdpz1`5k|2Il}qBWLcd(R9!)lAPz;@_b0T_ z+!uhQ=jXeM=hQ`0oWc2}cbkJC#n_R$UXty?OM(7?5z|3wGzh3N)7>G|#GMgrv?w$M znfoyb{EQW1!_8oasXoP%hpfEBkn#vi5SCfzNh^v}2vLC`yM1@W5X8M4NdJ2PNESn= zEhc?D7FvMdyLuiKy998BG*pI;BnIMZs+yj}wO+!wL$AMJZCce!q>3LACk7UxtPFrh z;WUK(EUhfp$nC16&|H($u!?LK5Hz)R^xP9FzHzW|b=(vK%AFtA_sa%tgigM(^nG-O z0062f;2TiYsQ_=0ha}3tVE!(MNzo8zC@^E^1sb0#-ma5Cr8veoKuAO~Mz)<5OEjs; z#)ABZ5fT>np7@mZ0GNaXHWbXTh37}atqf2c>^KDe+?fuLSH!J&0-`|{3=1lue#Wak zfVQF2)JqIBi?GOmq_h$>gG`0G{}Z4xlCT^2Ljz2c83A^S1ySgoTC^=?ts~Zsj$GG7 zERr|RLID20ru5fdrE+D-+L3JJTdSt_0mVIl(;73wEjce^G6Q1mi)eJ#Jl%9ALqTjK zCw(I5Z=H(Y3YbD_^$d|`Pc=ygXM!p@QZ|3y8aGI1W*B&ZrpxB#wRUOjaZ^{9i9EoT zzFT{4D*)?C@g}$pM1;ixC3av3{(VU;6mC=v%bQg035KZtX%Laj&rCmqr*^aY(5-cw69iCs5!m3CY)q}u$> z7Ei1=nv<-@^*1-|(ygQI@r%^mG9=J?guO2--#Wmrt;34{QV_WTfuuRI8*L~D<_dya zH!{EVs(fxTQQ2|qY!%JXLn8-)Pw18$`$f#GN{w9-r3&Dxg#g`b2$rJ;9ST1h1#V0c zb*}^8C!zr%0UTb#Ct+ciB!1&a6|M3<7$|!i*2O3X}Hb?p1%L=47v%zmSTaHvQ;zb;WY^%B5}DO&BS+0 zY;%xnTT2PV5BmSn{dDVaHan0FzHKWLm0j|Hoj?BNa3|6>&HpVj?9pQiMAZbfFzc~8 z+YJAA&1mOdwbVyteoJkcG*Wdydw~BV!TnL>5YOnXB7T@!7;KYo>xRT4p6_S~5OjA; z6=5NNG%#a@aX@StQq~XMT+Z(Yigrm?H%%}?bwpR8Sj&m43|`0$X$fBmv>24o)A!D6 z|23K({Z|CW)8aQ*%fU-C5&<31J#?kM8sOU@z;mYh<7*;YA#H{6xCtDAh)e@6jHS|( z-+<7S)^<^8Oy1_hctg{o!z6uyJI&>5$$-Y>+l_V%=#!R92d9+=Yr^f&D1m{yuCq}F zKE$|D3kBGlHDhe@rl5-4-SE_rgY;&m_yz{Db)^oaN(v0AOv4ern^}ML-TNbkUc7Dm zSuiGM_=u9{Q9RHPKsci$B%pbm%&%lhM-IR+c|RGrW`BhU8rXB~3-vV@8hY)*BzJKO z%a`!Njlh#Ig$ zgliu=M)Z+e%@o|zGOOQK&FZd`QvD@WvldBl*$k2OhSiRd2{GZ0MH-qvA-ZD1x@Da0 zUaIOJ7{Em@5AfkOS}lQOx&+Kw+NkFDwH=tW4&g6X%pt<$!O+S0+hO-{w}z1sfwuVH zFay}Mxd|J!+TGEUqvLx4nm4}FS~8IGdWD)+)>h46t}uRgH8&&n(JKRu|BzvM%mmLt zG2F%tt5l{O1wN>1!xFfSSNRYfvLp`w8nEG%RPxjpO z(VRna3VRc3)|erH(RGMOgT$07EX;Kv0s#P?Gfd}(N5Cy%w4p;>HQutOci~F&90XJq z?cuq)ix(#(oO843_FuE1ay^{qn%JC#sPn$ zBMxzD!*@*k?Nt-xCW9YvZm9s^HkmC9kTRe^xqS;~1Muz7!2qI-%8qE(Yo8t_&UeMC zRTpOR3sc2q!HliMyWP>AbkwuNB=~5=P{Vz9xNHld_nF`fUQPkd0$cG79c82Z4w-+YP8Ix0R0Wpo0gK z))Wo3CwW|Jkb`bLIQu2wksQ*Hz)PRuyCu?gANOg)~>P=<$?p-@>Ow3uF3t62e33ZgHqS zoDupc4<*I{zXL=HG+;q91e5nj_)rIh=|>3Wu`Fu=luJe@b?^HwIE7NR*T%slZR0rc zOeI9Ob|%+_2Y3h-(hR>CFM?E05=>7LdQKOHG+3QTMN&^%M}f6m@=0F2!~0c1{6gd& zn`4SRYyV=veL2hP?}4Wk#ZHSE_-F#HVANuMw7^#K+Rm2mZRqf3Np<%(6v&bha_2hq zjptL55jO9UG^RE~$vjfA`bjsI*k4vIsbT zu&01Rzf>Fvvnwlp+yK#j7LhsK+YEVh0;MEASOKZvT%VnC;up<~alNlJu8%xM0QP|z zfd6Wl@;};5Q+r;mDo=;6Eqf`Aw%1b8;-wh6IIKYbMvy~)?EqWE?-~sn*TMU$p@UZe zpbR8AyTx?bnQQEL04L4*vn8^|@p@f;?s9ppLl**vLW5qoNE;hKfk zYOwG=4aAP%+o({se?d1;4wVGe{hDO|twn)JEO6wB-s4XAhOTy6LAKSZ%0%dPfY#2s z3hrk}diSKIs(bPnpjp!jU}Qq_eL-oJ&E=+cNbVmCnflAfmStIuFUPGY3x4HHZ>G3} zxN|=4cw_~|GiEdFe^7~@7GKy{)ki4Sa$Ij}<940Ki96TA?4-Tgr}(eyjZ=u#d7B0i z?Hbd^%uTa(J9kCa#9tEO+Z32^z3$Tptue_-Z~BO`Dvb{?k276Ek^=cK-u5NY9rqrb?jvlZbSX<<#1a%{HNDG^vDmkR!o@9C!04NFMgM0$qpxr)q5=X;x+Xr(g2PrT$G7v zOH+1xPh*a|VocE>{MP82z=3dSYIO2i=j#T?i>^94;R75pAx?GLH{^<+-m5?vE`6)QeHIkA_xJcFfueqL zl#NvHGBS!txFdcoT~m)kY}-e)mu*H`EbTOf|EzXU|Hv6FRN(7;zFEDcdnU^u#xT^P zjdn?Qz6)!u>C_@l;Am{EgN8z=$_HSmKkKi@olBkH@DoqEZcL%g90ls*JxkX*D50p| z3=_WiG8^&Mx|hnO3ok}1sZssAPhfR=3ps}PTdR{Q<2<)?pKH7(PUD$Xf}MphMDu$) z1^6PB(s(?I#e3K?@)vdT>0FCKL$?XtlVxC*8hls@brBQTih{JIXcNAm1CwXm?Y}e7 z2B#6KSlXA}Bx(?D1{d5%GZv5Pqd2qTz$$n(AyxzZKXA_NsAu08%WO>o*?qN!B^bCv zNim$&+ATQ>?;(N93R>!Qb{Wz5#_wgal0Y1j(0P4QBl!*6O$5cVKgc+>^Gjor0b)B~_BW68a&2L}kUV1w?8BcV6l)l7j#WW1rr%$!MPrk(%og*fZ9BI>SFsd!*?S-2}(*_e7L&rDg}R#^7?$^#?4sa_4e1*imhx2qp;^&0xu>LA_y>d^OyOnpIfWc~ASx=Fi~vi}iAtLDw)ZjNQMc z()Z6QD{mYayO~@7MQs0r>15UMPB7DbCSgo2i>J8zc<}5V=JwN<%8%wC!0zq29M)Oeg}E zd|V)du+Pe%4Hkf@=dkLCf{qW3#$~LZ9^19?W|>wP;-g`UU~9d|uW^lVgL(RIJ!y?E zPDcJDiGN7q{>DvA46T=VhzaBX_?SlFF5%A#7*ZVvim`Z+O=Ha{IcJ3T_4~NhlnKmCEZ%%rqRcu?s1PAOBD*`KNj*oC1V5dF(0+I zOWc1bEq6zuEpyHys#P)h{1NbWq?0XzCy}zVq-4jUOaICY>}{PRqfp4!zeU%Q)wU0J z(zY)m4DUM2JdfvVf{13T z?X2~2asNe!r*mqfpe$pMTj?6>je#x7DOYe-uZgIdSbzxwt|kh=G4|1{yaJjpE=@wo zrE*ok8zdueUkt|u;?|e~aZoaUP?N0$+r+v6%^o8yd8gvfRaYmQ#*AU{J`UOCj~&1T z!a%9F#szS_@R8N_U;@BZ=9{F820vvI^8A<8pWg#>rJ?n(rL5L6Fa4<#PTqts$@u1_}%(+ISk4$tC2$rI)Sf?VdgAwbM^%36uKcs4X9$65p9+V$N3hau#=<1d)bbriNf!+t2WJkB zF;|`-yonD&4Ha&Rl@m}LS3saHJ4V#U+n>cl&Bm1sx32{XQQUwP){8nh z063Nev4u^v@CgnrT2OMl&cHY8ki!{M#0Mg+-u2hxzXkKKjKe3CDxMv}YY&-cf~w2|npJ=> zqz$v4TTU_zz+3p05wXJx|DT;8ws2fSyS#gE%v01*!im%@kKCajZ4r zrRX^V)`8E zfcRC5h7Y9mkm)P_N=3j;bT^9kaQP?cwX}oINX@ElcAhelq6N zu&X(N#b3^eq2AX!7@|(TyYvZjDAEBI&mXUr(6QDyxuxVb(RUqcgr^3X0`W)LOicIJ zBHaN$M}xphulij^Rk!=lQ`Sf{JK)?+U-lU(;k8DM_&&;(=qN3{$jh@?{TpXl4Q>zR z8aMF+cmwcR{5OY|;pO?W-@vu)P=tI9Kq|gty*k9^0%qwUHu{&7bw9yy5)|r5yEzz9aRHt?3qgA~n1cmY{blqqqf(S9CJ{xe<^f@_ z_r(CNRu@YNI|c#Sl@pG*lY9(;f8)=lS zl>T_VPa#?z@Ct)}4`tb-Hl(0Kx02F@aY-oyF(H!$<(n;bWTQuBgs9UYF3^p{Lav!} zpYq0@#>jK*NvQ=qYS)jFxZMO%+D5CbQrkK94VD?`)mW|S# z>hifXm)m#OODAQ1DQ+v^8Uj8`?Jne zhPl%u?BK*3Dlw@8tY@FY@w)A%pp4-zk==uifoy`ZgC-Xh=y;8C^}lYmUA zhYlGi<2Zj)a5ejs7;I*)Sfi2zuiErO!*fr#)N@GXx8+kN!fOMgx+q(mr8Yl@YO{5e zmqf`lZCcjyDB#iAo+o!ckOZ1%{S7$RN}s~xfmh~Xf+zZo*4IiLUK}H47jNEc_73DB zMtu#NNJ`ouDPdimII(Hku=@L{s|MMj^l5ZijtFX4riW*?@E9&Ghea0Zl}g6^2+HJ! z#}A)^gbDd5=w23Qy@6ZM>NyH!S~9(wfr*F(4kN1j_)43 zdDy#Q8V3JR1RNG1M1|74!UsHpskQURWizNBoPx$LSQzubN};^l{nH?}#>(bT50OdV z3IQyqK>&4^y*Y@!-vL^o0s4@h>Pw;B`@<^Px|%=E9ts_QxjVgldbJc%Yv9?xLbTx8 zW9YUe=3kdgnANT3<>hVYs0;GR8xCNHaQO12D;zS}Nq@3UkDLE~^Pf|eMkC&BfqaCp zv`Yyf?yy-u(EC$|6k1$cX}(~2pAdI?%fn)Si7Jy10$ZDGR<3C0MV!cHD73|@RXdBO zpYwHuHO9kRKAQrCl%uq(X6R{AB^SgKKDDR4!3j6nSY0Me!G{E==@PXq+Zo=~Nm31? z&+{Ti3;8~)b=Tjmjem0M&yW$;S5Dl4qFludkweT+;p= zUn&dpMp68-_2*880IGSbHZwOA`-vl%(LUa9Jc@5pcDL1~z-7MYnl#O(a=$w-_e89d zU~a4?w)*a2Gih4P7IJpO?Ps98&){KpOisDAgfG8hPsYAmf5UU^%XO~H@i+GA+hR8$ zW}{!Y%Yu%x9&*j&&4mXc8po(T z+N)ON-eH!JZF^l8@ypmc^yV|32=XWJ;W?x%AMq;y=Tg7HnMd69yCZTXrtH74XyPPx zl=@BNb=3=pC!f_|4q^i~ze^-1CEaTE!G}r{)KPFBP!z|9`{%T)IK_+ zG6PD76?Y-Bb(f>`4|zNHGV*km;Cd!S7qqP;!lL-(vMHhd`tpTwPybsgS&d8!nn}r$ zGCLz71P7+}GhI84od3qxz_>?^cco!QE%WnEoKwl}G4|YJHS1 z)>g9aoR(@L4HzDXB?q1I--Xtzkfs?zz1o$Iq55#dmZ9`w!DwYN+sdqyZ2-A(G*qc( zW{m@M)_MXbqIeLn>RA#WJ?m-1hg+Ski_=u&r+Y6b3~BsWJahOS^U~`4(&-$R44ACo z%@(Gk;t!cgbMng#GU5#_Yn{wwaDit!T@VfV8kAu}>KbV%HDfW1ab$-a-RiHn^z&2F z3VA@T*x_ra@EvE17kyMGwDdL3^!$(Xw=fz#b^n2HLT1(qUvys$Q3bxqqXlFrEbYXs z`B^gJk9aeofo~J*4gzkacT?MLMIQhCvvYcY?-8=d&X2)4y+(G`{v#r{Q#Nb)_^7?P z;rK5b=UU;{?8_`ao&0KGt%aPHhAHcKPbWvDcy=WNGA=ku_4Gya`lb4XU=HfMZpyH0ZxO z#f4&F!$C)7x!J89WJb6hfYdWc46v;g+<3Bb&K87XiSX@9)BD{-8#T~WE zWh}TGDLuhnU-qqFo)y>;&zxO1oR~Gr%d(6s<=$?tZ{@V82^0}oWO7}YrFP0(#FeoL z&?)e8c1+yTdjH@T0Kv-zC}jCgn3UwSIzy*J%5z?T5dg7rgNBJ&FkCn?>^89zvbp3> zxSE!irSsevUa)PqKH)J_`U_b@`B2i1ou^`l*Fo)O0w6qI-_vBS|9T4D(e1mf7+6Hm zFuzRit2eTEGCfjuEbkZLyMO`E4kKA{aK5ik`jEdfCiPs(mJXZ2u8+t)@sXX_X0sVh z>CcaVNcdY~-M+Bt6_Qm2OJo>raKN*5et*{*6+Oi-dkqeuDR-iFs>K%5HmoC zJwg*i$j#DuBne5%T&S5)s!lf3e4k22$r#;@-1p65DaJ=-R`WP2NnX&}LGEGmR98;x z)-6ZXjpArx-IHacu;~chA^o(R@0@Q=^_3Jnxk)P{U$riTHqc=-aUF&{#yZlaM3)wr ze`qg~laQCp^E&v_v%IyfM|jFYNgBefaXdt`ovKRKkm9(qzOQ_LbZT&uUt(jUhU1Ui z1@Pab-cY8$C&fM9k&|v!Nqy6_@^WH_;$xVE8k*szGYpzUx2fMVFv?-MKaAJbK0Ls1 z=|J-gYw)!j2JVfXAMP8FoI-xtHl~J1#KflTokI5GWeV9L_@~4gr$AaooPdj(L{R3_ z#E5ekl#349E?RSFeYFxv$^9a=hlNiC92vd^J?JN}KkCFF2;p!V1o&>25hTIoz*3&d zr91~ReeEK6`nyKnWOW1oV6{F~Tu$#wtnS7`WARgSzV3K=eLs>BKct*&^$nbYcpUge zMtW5IPY5iFWM@H;>dw~DG}W*;Kh=opD}Ss@Jz2hAADaPFoau-Iuj+Ze&@KiAQCZx5 zjzgD0EuJ8i;K1lk%~ZnL|D3jM+k~)hHBUFKlUL^r`+j9C$7B$WG$bBVR31wQmiPky zXX;epQ$PFglRDLM|M%2M%G}ZEf0mdyEgjccntxKK+EGXa>LE1?2G`;6AIYZY^Ha?F zW#iT=VtSN7Vq7r1Fay}>$fJkvJ2xT_7{RFh+LVcbCYXQVy$^84^zq(thyFZ^BlpIl z!h!^1ekE+xeZecvS7c51TU$zS%3g^}oUXSsQ8Ut!ss`L&kYbyNBZ+>~h6j;u|0!=M!#=C%7}Iw+rjorcyh3OtVJ#3JqH}2k#*);-0R!Cr9GvEH=&l#xG5fj z*79Vm5}>gBUGreGgJ|;gE1AY~XyO$|O(h0&UZ(qM8VQQIOE#3$rc8AOfZnWR+Ols_ zGI?VjkQ`DtcoI}FHgIb>^+=Ufh=H87;p#($5zU9QQZmWjk|82!*UR|lt%J^kw|&XI zbuwdz>fqHPJJ8a1c@m9i74TXh)qba|W<(jSdhR?O5G4 za6I~e81Jje%F^^yx7F8Q^dWW9MyhzM+dsN&ZJPeNK2e2XjIF@@ExpWo1@6kt1n3Q$ydKPO^@LMdvB9k=+zdh=g=4XM`L_J@ zI!7ZlL$vi4*r&z7-RUpRamxx`%Pg19yI^-&7etUGj62SA0@lhfx1E97_i^|Spldy+In?l5WQzQK3J&# zsO`1HCz6`VAy-W;G@TwS(;w@xB>h&STEda{}~=FxA?uJI&q4S^m0Tg}M?ZH2V!@rZCmYGlF*_UFd98B^OwNukr;BY6iFFv+*z8FYQq)K=j zq!6kJO&hlQ*GZFxIR?~%Pm+)ahY_8#3&{@t^s8B+bm?BLftjC};PlJ1%pEnUvtO_4 zj4txH7k1#M+2sWk*^rreQ!rFB1EVPqfCMgN@RTA5)hj1%g)RzQtQQ5xmnV$Te&R3N zjhI6BAO2bZp5kUIqoiIfeK&yvF0i*a)1?5XI{ytWky^bDaYpM{C`bi3l*(2=hZ9d_ zSiwa`1pJ0-M)3)lR9bdB_Wz zf`7AMKfzEdGVWN59*%AS&mNG0HqZz?!+?w6Y*L}sF^wk$Y%b)IJZazC*hMuIR1uI* zh9X~OZ|-nstNZ{23qW}J(HfEifsJGIX!s9C14KSSzGH*@A;eu0X&*_*kXdfu(?4pU zgsGd|;!ECuNkkmEKxsFfb;ZHCINrG8v_+iZi0+kcP>7$QkSAwdL@R5}qG$u9w96o& zr#1Ea{<3K>0vq#?yVVpYzo)oaa$UBf+6sf?9hPAkK&hs;ZVs>{|DJ5^O7gCk z4Xj@WB0*VBrShu;&d@o>>oL85Mhe*9Q_w9^N$E4AN_Voeb8Pa`w!J!<;7^WL~lAN+if&(RE^KBq@*RYR%qjq9s2;8 zetC$e`F#zy9q1e)J|L=|1yrhT?7LPZr8XMW(}_&7Nu@rZjZAyJ2#x-UC{7vcv^?u6 zyiY)1qeipuKsgVKt*2i;yWk(s;_vauO1N5i8sNc9C3>>iP#(mWr&5h|ZKBKUJ%qw` z(y!y%lEcR!tb2?6?IujpP2SQ=*`=`+ehoa_1(kt?dGOk%c5pZV69$}7+zxOP)tf`Z zfHBx#=oyVbfP?d9jC67bDF}*jvMw9wUp9MUmdraalR4Lw`~0Mk4yWSu0M1|8zCIaU zkG)J*vi?}3Y`6Mx9Cyt@ppthfl8JyYQ-&CqCFq2#HIOYTDk;(ko$JzP)4G_xO$|9t zl&DF)S=J(7#!Nily6;})oBPMTxE8-uFY16Uj&fZkQss-0flvossAD1BdVKcJM zY=AY(PS6}*Owl=Xcfwmf(3m=HfbpMZwe5Fq$Xd0`)6zT_)bS;LHbAfxzaOm8A+tub zz!&g?^w0(#jB)ZXh622RdCLeWqM;R0JtXUBZ$bX679WurzdD`VGkie^w#AGlf;`At zr`p>Yi(kI+KnFyk!AIh*pJyZhiyl2PklrGv%bM_TEk?6h#*4=0H2uga`2X27t4(Gnin8_y3xH!5XZ(lbZ0Z>Q8_bNKu{Wx6rdSn7nKwa2=Dr(I~Q;hYF3_s7 z=;l4K*me8_t(*Xz7th#hv=V;$ea#pw?i9*dNIZMnCCE|cuJ^l^bE3y}ba@U42Y8u@^jKwEI+FaAcF0H36G7y!8MEiI31WaqlRxcA)nnHrw;Xi&ktAjlL zc`5t_N8a{y9TX!h>rief4!z9jfj{`1ZiV1Fpu*RdLh1cJ_W3ECGMVQe!STF6L}BxP zi<}qdUrf0cAuK7#qf_1`hq*|hCmyi#2;jwt(EskAT^6x(okJ76iFvty4QeE10vmEvmriof=RLFqYexui^!u2AfTZf4o0O9e0;~~ zV7uTnQy+B38F*mgN`-S;eVZs^;}q6lx6<#KVuT%0@X$xqqt|asUEH3FZ?pP`iP19i zG@*W>;9q-NI@GcF>oFq|wCkwsD%TOr@oi_DXqR*)TcDr%fTyi;Z=eYk|ADv2@G^^; zZs5Za3b(2IIg{S&+Z?QnPs3Op^a!%;0vzq!qN^Cf$M0KOvh{ulKD^=^$b@G}Pp#^J zOcID3y2KWMo09`M64khH`i~fOP^py|#p;X~gbYE;?|87|+ge(--xPqIiSfDs=oqkw zyfSK^HL{_L#?oXw!tw*M@K#}zeZ@^3mcvA*!Y`(Cg%W}m$22lSLO$SHP;d++J~-w5 zb)U3DXNdVw_6j>8nV`K`kgDDf7+A`ZU%9aXHC;+yB{kCAeRJYcJ>Hu%_6=$M#>Kqv z>$$z-S1M0El-s^MAH2;Zqqm~9B&RhZ=miF)=E-kis^TdENO`Xpa8jihJR@j^yE(;z zI=R`lqM0POvbd)lv`sm_bg()|MZM=dnY4H2v0kdFl0V{ki%pN5rj%y3g*nKW#$uIn zKmE>Hq30G=Be*=klNWIn#3oTskp4&qra%lo_P@l;4TS$Tmbck3AD1ZsHr;a~Fx6O? zw+B;}@zNiv5OgeM(;E13G&QkXbB-N+u$zv#7vFCOK_Df=$$bs87=;Tv zAs%g-p4;{g8PBt5{ceAu(u%1=FnYr@v|P@70la^0_u(y-hQGe!`R{-y*Hiz z6lwou*g4U_B??fp7mjG!A|~RQrC%yY5`;p({T`y9x(nqIY%$0xHX}iOD#tWuB(7 z<`y~mnhQ!lQyyLRv;rAAweDe)Ne9jurg{!S8+2MtUbM9wnARVDZ~df#uUi+{4$MTV zkma67SDE}A$~l4xva{q_>9+3tn04Lrg5-#?v(4fP!qC`lm(R2uL~8zbc$+^s<6|F7 z7W)>DsWvYj!N4e7*tbk?z{hmoOVzxT1^wC5!rXsz_7`>pmref$SuL>;uoyyOXrlFO z5h+Y`+|Coq_f=xg=L5G?+snvy0;De6*6-<7Q!S_XALnLlq#1t-h2_KQZW?v4CLb-+)I_0)1vOh(;s^qQZyxl1J{Mxv zPY~#v_ppLrC!pZ9;k;hDtae>1LqGxW7q~u`L9Q|L+}dzGzHVH5e+zQ+x5A%E*I4yi zL(};xT(B|>jS{ZiEr!Evdn(`>3(VUaCAdiCIz0(3xmOYTbBjgVaAjCDI2Wv3B6pN ziJ~!!H~Ra=plkV%{>Y-ETxo9G>Aju7ki^oD=|fuxDGd?UB1!2LSLu+yKm?GMUsKEZ zd+rO_y3Y6DOpf|JA8^yTuR`Nje&9>|cYOXY?i+15)8ijn51_i@5v6(SuWqNMh!pKN z<7`}L^{UiLle&W$HXQq?C(UgsPB*q%arT_}hgo7Ax|3$@)E}dv*Ow=&of?tC5n6T!MeudOgG}QnYJl9KG3Gt!7h$j~72b zt<_uBb3FyaIxRiD|JaSzcNSa6uk*ow7xj)YM9ouHbAv=GG$UnPri60()xpQI&Xhpt zsXGCQSbS63uDB%NuKIw$ifHvM-EO-{MUm*&kEz}}M=?HUC^P<}e2W1|@>h6oDSRRC z1@YltG^61E!%9~Hw&RhaKHiHc_poXcnXbNX{|MJX&r{@IX0N@YKpx1r^)P~*W&Cuu z2#N&;4dP{0IDzc;<;OC`wNGcfwX+=z6iWcv@YRgu5 zb<*o{ZntCCGKGUaOFw7Nw009cB0Edx`#hl}__EnRj>g_OM;9Yws{F(^+CYTEgDgGM z4B-e{d&0T2kU--AJ&-ggqw{DoYysI!HIzLIi%!B~+= zITI@K1%9-i$c1D27BKs}YWk=Kwmiu4bkB#CIkL;Y;H5L5@iSJkNm^iv`SR8SByb}J z)nEn&(DF_SiOF(ePc(O8=P@4fQJ$}_ujxoBjCeHlh_$l2#&^xq?JH4~k5G2WC&dDW zSMY-bo2X4j;wJGbkV_m1eG$}p3%InQMz8>>jz=sN#g=xRZripm?ZAwd)#}!bJMZh& z!CeB{16r3di~X`wR?UXP_h)>hmlrhN?sJq-*@b~W*+=kUFP?0O##q=uN$0wi}q_y{+ zT-lfvmKM&CPT2~TbpOH-MMz6}HSFeWTNONLOYv@z zcr{;0S_Wd^fQz>3wRt2+DVtYIlohb)d$L)^A1^8=(wb!hLtXx6z*c4f!d5k⁢@I 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 hmz3ymh8twJf79DGoU$0F>eGD&z;WD>Dh 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 VfPxbh)d2kCd;rSFg|Jpp{U2FNMZ^FA literal 0 HcmV?d00001 diff --git a/dependencies/rpm-specs/gateway-rockspecs/source_rocks/router-2.1-0.src.rock b/dependencies/rpm-specs/gateway-rockspecs/source_rocks/router-2.1-0.src.rock new file mode 100644 index 0000000000000000000000000000000000000000..0ac2aae7c2c96d9c1e4016ed6cf8551a54a3757b GIT binary patch literal 6770 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 Date: Fri, 29 Nov 2024 12:44:57 +0200 Subject: [PATCH 8/9] removes unnecessary changelog entries Signed-off-by: Yorgos Saslis --- .../gateway-rockspecs-native.spec | 95 ------------- .../gateway-rockspecs/gateway-rockspecs.spec | 128 ------------------ .../openresty-pcre/openresty-pcre.spec | 32 ----- .../openresty-zlib/openresty-zlib.spec | 53 -------- .../rpm-specs/openresty/openresty.spec | 120 ---------------- .../opentracing-cpp/opentracing-cpp.spec | 38 ------ 6 files changed, 466 deletions(-) diff --git a/dependencies/rpm-specs/gateway-rockspecs-native/gateway-rockspecs-native.spec b/dependencies/rpm-specs/gateway-rockspecs-native/gateway-rockspecs-native.spec index fd92ce9f6..a6e603050 100644 --- a/dependencies/rpm-specs/gateway-rockspecs-native/gateway-rockspecs-native.spec +++ b/dependencies/rpm-specs/gateway-rockspecs-native/gateway-rockspecs-native.spec @@ -59,101 +59,6 @@ rm -rf %{buildroot} %license licenses.xml %changelog -* Fri Dec 02 2022 CPaaS User - 1.0.0-23 -- Bump release - -* Mon Oct 03 2022 CPaaS User - 1.0.0-22 -- Bump release - -* Wed Feb 23 2022 CPaaS User - 1.0.0-21 -- Bump release - -* Wed Feb 23 2022 CPaaS User - 1.0.0-20 -- Bump release - -* Wed Feb 23 2022 CPaaS User - 1.0.0-19 -- Bump release - -* Wed Feb 09 2022 CPaaS User - 1.0.0-18 -- Bump release - -* Wed Feb 09 2022 CPaaS User - 1.0.0-17 -- Bump release - -* Wed Feb 09 2022 CPaaS User - 1.0.0-16 -- Bump release - -* Wed Feb 09 2022 CPaaS User - 1.0.0-15 -- Bump release - -* Wed Jan 26 2022 CPaaS User - 1.0.0-14 -- Bump release - -* Wed Jan 26 2022 CPaaS User - 1.0.0-13 -- Bump release - -* Mon Jan 24 2022 CPaaS User - 1.0.0-12.16 -- Bump release - -* Thu Jan 13 2022 CPaaS User - 1.0.0-12.15 -- Bump release - -* Wed Jan 12 2022 CPaaS User - 1.0.0-12.14 -- Bump release - -* Wed Jan 12 2022 CPaaS User - 1.0.0-12.13 -- Bump release - -* Wed Jan 12 2022 CPaaS User - 1.0.0-12.12 -- Bump release - -* Mon Jul 05 2021 CPaaS User - 1.0.0-12.11 -- Bump release - -* Mon Jul 05 2021 CPaaS User - 1.0.0-12.10 -- Bump release - -* Mon Jul 05 2021 CPaaS User - 1.0.0-12.9 -- Bump release - -* Mon Jul 05 2021 CPaaS User - 1.0.0-12.8 -- Bump release - -* Fri Jul 02 2021 CPaaS User - 1.0.0-12.7 -- Bump release - -* Fri Jul 02 2021 CPaaS User - 1.0.0-12.6 -- Bump release - -* Thu Jul 01 2021 CPaaS User - 1.0.0-12.5 -- Bump release - -* Thu Jul 01 2021 CPaaS User - 1.0.0-12.4 -- Bump release - -* Thu Jul 01 2021 CPaaS User - 1.0.0-12.3 -- Bump release - -* Thu May 06 2021 CPaaS User - 1.0.0-11.2 -- Bump release - -* Thu May 06 2021 CPaaS User - 1.0.0-11.1 -- Bump release - -* Mon Jan 20 2020 cpaas-ops - 1.0.0-8 -Built by CPaaS - -* Mon Jan 20 2020 cpaas-ops - 1.0.0-7 -Built by CPaaS - -* Mon Jan 20 2020 cpaas-ops - 1.0.0-6 -Built by CPaaS - -* Wed Jan 15 2020 cpaas-ops - 1.0.0-5 -Built by CPaaS - -* Wed Jan 15 2020 cpaas-ops - 1.0.0-4 -Built by CPaaS * Wed Jan 15 2020 Yorgos Saslis - 1.1.0-0 - Use 5.1 path and Luajit from openresty to build it diff --git a/dependencies/rpm-specs/gateway-rockspecs/gateway-rockspecs.spec b/dependencies/rpm-specs/gateway-rockspecs/gateway-rockspecs.spec index 51cf44070..c1b440122 100644 --- a/dependencies/rpm-specs/gateway-rockspecs/gateway-rockspecs.spec +++ b/dependencies/rpm-specs/gateway-rockspecs/gateway-rockspecs.spec @@ -78,159 +78,31 @@ rm -rf %{buildroot} %license licenses.xml %changelog -* Fri Dec 02 2022 CPaaS User - 2.10.0-2 -- Bump release * Fri Dec 02 2022 Yorgos Saslis - 2.10.0-1 - Minor version bump to clarify lua-liquid dependency bump that already happened in 2.9.6-12 -* Mon Oct 03 2022 CPaaS User - 2.9.6-14 -- Bump release - -* Mon Oct 03 2022 CPaaS User - 2.9.6-13 -- Bump release - * Fri Jul 15 2022 Eguzki Astiz Lezaun - 2.9.6-12 - Updated lua-liquid dependency -* Thu May 05 2022 CPaaS User - 2.9.6-11 -- Bump release - -* Wed Feb 23 2022 CPaaS User - 2.9.6-10 -- Bump release - -* Wed Feb 23 2022 CPaaS User - 2.9.6-9 -- Bump release - -* Tue Feb 22 2022 CPaaS User - 2.9.6-8 -- Bump release - -* Wed Feb 09 2022 CPaaS User - 2.9.6-7 -- Bump release - -* Wed Feb 09 2022 CPaaS User - 2.9.6-6 -- Bump release - -* Wed Feb 09 2022 CPaaS User - 2.9.6-5 -- Bump release - -* Wed Feb 09 2022 CPaaS User - 2.9.6-4 -- Bump release - -* Wed Jan 26 2022 CPaaS User - 2.9.6-3 -- Bump release - -* Wed Jan 26 2022 CPaaS User - 2.9.6-2 -- Bump release - -* Mon Jan 24 2022 CPaaS User - 2.9.6-0.7 -- Bump release - -* Fri Jan 21 2022 CPaaS User - 2.9.6-0.6 -- Bump release - * Thu Jan 20 2022 CPaaS User - 2.9.6-0.1 - Date filter support on liquid -* Thu Jan 13 2022 CPaaS User - 2.9.5-0.5 -- Bump release - -* Wed Jan 12 2022 CPaaS User - 2.9.5-0.4 -- Bump release - -* Wed Jan 12 2022 CPaaS User - 2.9.5-0.3 -- Bump release - -* Wed Jan 12 2022 CPaaS User - 2.9.5-0.2 -- Bump release - * Mon Sep 20 2021 Eloy Coto - 2.9.5-0.1 - Updated luafilesystem-ffi -* Mon Jul 05 2021 CPaaS User - 2.9.4-0.19 -- Bump release - -* Mon Jul 05 2021 CPaaS User - 2.9.4-0.18 -- Bump release - -* Mon Jul 05 2021 CPaaS User - 2.9.4-0.17 -- Bump release - -* Mon Jul 05 2021 CPaaS User - 2.9.4-0.16 -- Bump release - -* Mon Jul 05 2021 CPaaS User - 2.9.4-0.15 -- Bump release - -* Fri Jul 02 2021 CPaaS User - 2.9.4-0.14 -- Bump release - -* Thu Jul 01 2021 CPaaS User - 2.9.4-0.13 -- Bump release - -* Thu Jul 01 2021 CPaaS User - 2.9.4-0.12 -- Bump release - - * Thu Jul 01 2021 Eloy Coto - 2.9.4-0.11 - Added lua-rover and net-url and fix ENV variables -* Wed Jun 30 2021 CPaaS User - 2.9.4-0.10 -- Bump release - -* Wed Jun 30 2021 CPaaS User - 2.9.4-0.9 -- Bump release - -* Wed Jun 30 2021 CPaaS User - 2.9.4-0.8 -- Bump release - -* Wed Jun 30 2021 CPaaS User - 2.9.4-0.7 -- Bump release - -* Wed Jun 30 2021 CPaaS User - 2.9.4-0.6 -- Bump release - -* Wed Jun 30 2021 CPaaS User - 2.9.4-0.5 -- Bump release - -* Wed Jun 30 2021 CPaaS User - 2.9.4-0.4 -- Bump release - -* Tue Jun 29 2021 CPaaS User - 2.9.4-0.3 -- Bump release - * Thu Jun 17 2021 Eloy Coto - 2.9.3-0.2 - Updated lua-liquid dependency -* Thu May 06 2021 CPaaS User - 2.9.2-0.2 -- Bump release - -* Thu May 06 2021 CPaaS User - 2.9.2-0.1 -- Bump release - - * Fri Jun 26 2020 Eloy Coto - 2.9.2-0 - Update lua-liquid dependency -* Tue Jan 21 2020 cpaas-ops - 2.8.1-8 -Built by CPaaS - -* Mon Jan 20 2020 cpaas-ops - 2.8.1-8 -Built by CPaaS - * Mon Jan 20 2020 Eloy Coto - 2.8.1-0 - Update lua-liquid dependency -* Wed Jan 15 2020 cpaas-ops - 2.8.0-7 -Built by CPaaS - -* Wed Jan 15 2020 cpaas-ops - 2.8.0-6 -Built by CPaaS - -* Wed Jan 15 2020 cpaas-ops - 2.8.0-5 -Built by CPaaS - - * Sat Jan 11 2020 Eloy Coto - Update dependencies for APIcast AMP 2.8 diff --git a/dependencies/rpm-specs/openresty-pcre/openresty-pcre.spec b/dependencies/rpm-specs/openresty-pcre/openresty-pcre.spec index fc21ee88e..d3f7344a8 100644 --- a/dependencies/rpm-specs/openresty-pcre/openresty-pcre.spec +++ b/dependencies/rpm-specs/openresty-pcre/openresty-pcre.spec @@ -91,38 +91,6 @@ rm -rf %{buildroot} %changelog -* Fri May 06 2022 CPaaS User - 8.44-26 -- Bump release - -* Mon Feb 28 2022 CPaaS User - 8.44-25 -- Bump release - -* Mon Feb 28 2022 CPaaS User - 8.44-24 -- Bump release - -* Thu Feb 24 2022 CPaaS User - 8.44-23 -- Bump release - -* Wed Jan 12 2022 CPaaS User - 8.44-13 -- Bump release - -* Wed Jan 12 2022 CPaaS User - 8.44-12 -- Bump release - -* Mon Jul 05 2021 CPaaS User - 8.44-10 -- Bump release - -* Mon Jul 05 2021 CPaaS User - 8.44-9 -- Bump release - -* Thu Jul 01 2021 CPaaS User - 8.44-8 -- Bump release - -* Thu Jul 01 2021 CPaaS User - 8.44-7 -- Bump release - -* Thu Jul 01 2021 CPaaS User - 8.44-6 -- Bump release * Mon May 14 2018 Yichun Zhang (agentzh) 8.42-1 - upgraded openresty-pcre to 8.42. diff --git a/dependencies/rpm-specs/openresty-zlib/openresty-zlib.spec b/dependencies/rpm-specs/openresty-zlib/openresty-zlib.spec index 58e5ddcc5..41a31e20b 100644 --- a/dependencies/rpm-specs/openresty-zlib/openresty-zlib.spec +++ b/dependencies/rpm-specs/openresty-zlib/openresty-zlib.spec @@ -76,59 +76,6 @@ rm -rf %{buildroot} %changelog -* Fri May 06 2022 CPaaS User - 1.2.11-21 -- Bump release - -* Mon Feb 28 2022 CPaaS User - 1.2.11-20 -- Bump release - -* Mon Feb 28 2022 CPaaS User - 1.2.11-19 -- Bump release - -* Thu Feb 24 2022 CPaaS User - 1.2.11-18 -- Bump release - -* Wed Jan 12 2022 CPaaS User - 1.2.11-12.9 -- Bump release - -* Wed Jan 12 2022 CPaaS User - 1.2.11-12.8 -- Bump release - -* Mon Jul 05 2021 CPaaS User - 1.2.11-12.7 -- Bump release - -* Mon Jul 05 2021 CPaaS User - 1.2.11-12.6 -- Bump release - -* Thu Jul 01 2021 CPaaS User - 1.2.11-12.5 -- Bump release - -* Thu Jul 01 2021 CPaaS User - 1.2.11-12.4 -- Bump release - -* Thu May 06 2021 CPaaS User - 1.2.11-11.3 -- Bump release - -* Thu May 06 2021 CPaaS User - 1.2.11-11.2 -- Bump release - -* Thu May 06 2021 CPaaS User - 1.2.11-11.1 -- Bump release - -* Mon Jan 20 2020 cpaas-ops - 1.2.11-7 -Built by CPaaS - -* Mon Jan 20 2020 cpaas-ops - 1.2.11-6 -Built by CPaaS - -* Wed Jan 15 2020 cpaas-ops - 1.2.11-5 -Built by CPaaS - -* Wed Jan 15 2020 cpaas-ops - 1.2.11-4 -Built by CPaaS - -* Wed Jan 15 2020 cpaas-ops - 1.2.11-3 -Built by CPaaS * Fri Jul 14 2017 Yichun Zhang 1.2.11-3 - bugfix: we did not enable debuginfo in the shared library files. diff --git a/dependencies/rpm-specs/openresty/openresty.spec b/dependencies/rpm-specs/openresty/openresty.spec index 0f62fdff4..3b9f84c5b 100644 --- a/dependencies/rpm-specs/openresty/openresty.spec +++ b/dependencies/rpm-specs/openresty/openresty.spec @@ -413,132 +413,12 @@ rm -rf %{buildroot} * Mon Jan 30 2023 Eguzki Astiz Lezaun - 1.19.3-21 - Opentelemetry RPM -* Mon Oct 03 2022 CPaaS User - 1.19.3-18 -- Bump release - -* Wed Feb 23 2022 CPaaS User - 1.19.3-17 -- Bump release - -* Wed Feb 23 2022 CPaaS User - 1.19.3-16 -- Bump release - -* Wed Feb 23 2022 CPaaS User - 1.19.3-15 -- Bump release - -* Wed Feb 09 2022 CPaaS User - 1.19.3-14 -- Bump release - -* Wed Feb 09 2022 CPaaS User - 1.19.3-13 -- Bump release - -* Wed Feb 09 2022 CPaaS User - 1.19.3-12 -- Bump release - -* Wed Feb 09 2022 CPaaS User - 1.19.3-11 -- Bump release - -* Wed Jan 26 2022 CPaaS User - 1.19.3-10 -- Bump release - -* Tue Jan 25 2022 CPaaS User - 1.19.3-9 -- Bump release - -* Mon Jan 24 2022 CPaaS User - 1.19.3-6.27 -- Bump release - -* Fri Jan 21 2022 CPaaS User - 1.19.3-6.26 -- Bump release - -* Thu Jan 13 2022 CPaaS User - 1.19.3-6.25 -- Bump release - -* Thu Jan 13 2022 CPaaS User - 1.19.3-6.22 -- Bump release - -* Thu Jan 13 2022 CPaaS User - 1.19.3-6.21 -- Bump release - * Mon Aug 02 2021 Eloy Coto - 1.19.3-5.20 - Bump APIcast module -* Mon Jul 05 2021 CPaaS User - 1.19.3-4.20 -- Bump release - -* Mon Jul 05 2021 CPaaS User - 1.19.3-4.19 -- Bump release - -* Mon Jul 05 2021 CPaaS User - 1.19.3-4.18 -- Bump release - -* Fri Jul 02 2021 CPaaS User - 1.19.3-4.17 -- Bump release - -* Fri Jul 02 2021 CPaaS User - 1.19.3-4.16 -- Bump release - -* Thu Jul 01 2021 CPaaS User - 1.19.3-4.15 -- Bump release - -* Thu Jul 01 2021 CPaaS User - 1.19.3-4.14 -- Bump release - -* Thu Jul 01 2021 CPaaS User - 1.19.3-4.13 -- Bump release - -* Thu Jul 01 2021 CPaaS User - 1.19.3-4.12 -- Bump release - -* Wed Jun 30 2021 CPaaS User - 1.19.3-3.11 -- Bump release - -* Wed Jun 30 2021 CPaaS User - 1.19.3-3.10 -- Bump release - -* Wed Jun 30 2021 CPaaS User - 1.19.3-3.9 -- Bump release - -* Wed Jun 30 2021 CPaaS User - 1.19.3-3.8 -- Bump release - -* Wed Jun 30 2021 CPaaS User - 1.19.3-3.7 -- Bump release - -* Wed Jun 30 2021 CPaaS User - 1.19.3-3.6 -- Bump release - -* Wed Jun 30 2021 CPaaS User - 1.19.3-3.5 -- Bump release - -* Tue Jun 29 2021 CPaaS User - 1.19.3-3.4 -- Bump release - -* Thu May 06 2021 CPaaS User - 1.17.6-1.3 -- Bump release - -* Thu May 06 2021 CPaaS User - 1.17.6-1.2 -- Bump release - -* Thu May 06 2021 CPaaS User - 1.17.6-1.1 -- Bump release - * Thu Apr 15 2021 Eloy Coto 1.17.6.1 - Updated Luajit version -* Mon Jan 20 2020 cpaas-ops - 1.17.4-6 -Built by CPaaS - -* Mon Jan 20 2020 cpaas-ops - 1.17.4-5 -Built by CPaaS - -* Mon Jan 20 2020 cpaas-ops - 1.17.4-4 -Built by CPaaS - -* Wed Jan 15 2020 cpaas-ops - 1.17.4-3 -Built by CPaaS - -* Wed Jan 15 2020 cpaas-ops - 1.17.4-2 -Built by CPaaS - * Thu Jan 9 2020 Eloy Coto 1.17.4.1 - custom Openresty build. * Thu May 16 2019 Yichun Zhang (agentzh) 1.15.8.1-1 diff --git a/dependencies/rpm-specs/opentracing-cpp/opentracing-cpp.spec b/dependencies/rpm-specs/opentracing-cpp/opentracing-cpp.spec index 2c28a7c35..08b637e6d 100644 --- a/dependencies/rpm-specs/opentracing-cpp/opentracing-cpp.spec +++ b/dependencies/rpm-specs/opentracing-cpp/opentracing-cpp.spec @@ -138,44 +138,6 @@ make %{?_smp_mflags} %doc README.md COPYING %changelog -* Fri May 06 2022 CPaaS User - 1.3.0-31 -- Bump release - -* Mon Feb 28 2022 CPaaS User - 1.3.0-30 -- Bump release - -* Mon Feb 28 2022 CPaaS User - 1.3.0-29 -- Bump release - -* Thu Feb 24 2022 CPaaS User - 1.3.0-28 -- Bump release - -* Wed Jan 12 2022 CPaaS User - 1.3.0-22.8 -- Bump release - -* Wed Jan 12 2022 CPaaS User - 1.3.0-22.7 -- Bump release - -* Mon Jul 05 2021 CPaaS User - 1.3.0-22.6 -- Bump release - -* Mon Jul 05 2021 CPaaS User - 1.3.0-22.5 -- Bump release - -* Mon Jan 20 2020 cpaas-ops - 1.3.0-17 -Built by CPaaS - -* Mon Jan 20 2020 cpaas-ops - 1.3.0-16 -Built by CPaaS - -* Wed Jan 15 2020 cpaas-ops - 1.3.0-15 -Built by CPaaS - -* Wed Jan 15 2020 cpaas-ops - 1.3.0-14 -Built by CPaaS - -* Wed Jan 15 2020 cpaas-ops - 1.3.0-13 -Built by CPaaS * Wed Oct 17 2018 Fernando Nasser - 1.3.0 - Build 1.3.0 From 636b2a200a98855f21233caad59326f907503a71 Mon Sep 17 00:00:00 2001 From: Yorgos Saslis Date: Mon, 2 Dec 2024 19:43:59 +0200 Subject: [PATCH 9/9] Prefers public registry --- Containerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Containerfile b/Containerfile index a4243b27d..351b5a33f 100644 --- a/Containerfile +++ b/Containerfile @@ -1,4 +1,4 @@ -FROM registry.redhat.io/ubi8/ubi:8.10-1132.1731461736 AS rpm-builder +FROM registry.access.redhat.com/ubi8/ubi:8.10-1132.1731461736 AS rpm-builder # Install rpm-build and dependencies, move sources and spec file to their respective directories, build the RPMs and install them RUN yum install -y rpm-build cmake3 gcc-c++ yum-utils @@ -243,7 +243,7 @@ RUN yum-builddep --assumeyes SPECS/gateway-rockspecs.spec RUN rpmbuild -ba SPECS/gateway-rockspecs.spec -FROM registry.redhat.io/ubi8/ubi:8.10-1132.1731461736 AS apicast +FROM registry.access.redhat.com/ubi8/ubi:8.10-1132.1731461736 AS apicast LABEL summary="3scale's API gateway (APIcast) is an OpenResty application which consists of two parts: Nginx configuration and Lua files." \ description="APIcast is not a standalone API gateway therefore it needs connection to the 3scale API management platform. The container includes OpenResty and uses LuaRocks to install dependencies (rocks are installed in the application folder)." \